o
    tBhA1                     @   s   d Z ddlZddlZddlmZ dZdZdZdZdefd	efd
efdefgZ	ddgZ
g dZdZdZdZdd Zdd Zdd Zdd ZedkrMe  dS dS )a  
python generate_sparsetools.py

Generate manual wrappers for C++ sparsetools code.

Type codes used:

    'i':  integer scalar
    'I':  integer array
    'T':  data array
    'B':  boolean array
    'V':  std::vector<integer>*
    'W':  std::vector<data>*
    '*':  indicates that the next argument is an output argument
    'v':  void
    'l':  64-bit integer scalar

See sparsetools.cxx for more details.

    N)newera  
bsr_diagonal        v iiiiiIIT*T
bsr_tocsr           v iiiiIIT*I*I*T
bsr_scale_rows      v iiiiII*TT
bsr_scale_columns   v iiiiII*TT
bsr_sort_indices    v iiii*I*I*T
bsr_transpose       v iiiiIIT*I*I*T
bsr_matmat          v iiiiiiIITIIT*I*I*T
bsr_matvec          v iiiiIITT*T
bsr_matvecs         v iiiiiIITT*T
bsr_elmul_bsr       v iiiiIITIIT*I*I*T
bsr_eldiv_bsr       v iiiiIITIIT*I*I*T
bsr_plus_bsr        v iiiiIITIIT*I*I*T
bsr_minus_bsr       v iiiiIITIIT*I*I*T
bsr_maximum_bsr     v iiiiIITIIT*I*I*T
bsr_minimum_bsr     v iiiiIITIIT*I*I*T
bsr_ne_bsr          v iiiiIITIIT*I*I*B
bsr_lt_bsr          v iiiiIITIIT*I*I*B
bsr_gt_bsr          v iiiiIITIIT*I*I*B
bsr_le_bsr          v iiiiIITIIT*I*I*B
bsr_ge_bsr          v iiiiIITIIT*I*I*B
aZ  
csc_diagonal        v iiiIIT*T
csc_tocsr           v iiIIT*I*I*T
csc_matmat_maxnnz   l iiIIII
csc_matmat          v iiIITIIT*I*I*T
csc_matvec          v iiIITT*T
csc_matvecs         v iiiIITT*T
csc_elmul_csc       v iiIITIIT*I*I*T
csc_eldiv_csc       v iiIITIIT*I*I*T
csc_plus_csc        v iiIITIIT*I*I*T
csc_minus_csc       v iiIITIIT*I*I*T
csc_maximum_csc     v iiIITIIT*I*I*T
csc_minimum_csc     v iiIITIIT*I*I*T
csc_ne_csc          v iiIITIIT*I*I*B
csc_lt_csc          v iiIITIIT*I*I*B
csc_gt_csc          v iiIITIIT*I*I*B
csc_le_csc          v iiIITIIT*I*I*B
csc_ge_csc          v iiIITIIT*I*I*B
a  
csr_matmat_maxnnz   l iiIIII
csr_matmat          v iiIITIIT*I*I*T
csr_diagonal        v iiiIIT*T
csr_tocsc           v iiIIT*I*I*T
csr_tobsr           v iiiiIIT*I*I*T
csr_todense         v iiIIT*T
csr_matvec          v iiIITT*T
csr_matvecs         v iiiIITT*T
csr_elmul_csr       v iiIITIIT*I*I*T
csr_eldiv_csr       v iiIITIIT*I*I*T
csr_plus_csr        v iiIITIIT*I*I*T
csr_minus_csr       v iiIITIIT*I*I*T
csr_maximum_csr     v iiIITIIT*I*I*T
csr_minimum_csr     v iiIITIIT*I*I*T
csr_ne_csr          v iiIITIIT*I*I*B
csr_lt_csr          v iiIITIIT*I*I*B
csr_gt_csr          v iiIITIIT*I*I*B
csr_le_csr          v iiIITIIT*I*I*B
csr_ge_csr          v iiIITIIT*I*I*B
csr_scale_rows      v iiII*TT
csr_scale_columns   v iiII*TT
csr_sort_indices    v iI*I*T
csr_eliminate_zeros v ii*I*I*T
csr_sum_duplicates  v ii*I*I*T
get_csr_submatrix   v iiIITiiii*V*V*W
csr_row_index       v iIIIT*I*T
csr_row_slice       v iiiIIT*I*T
csr_column_index1   v iIiiII*I*I
csr_column_index2   v IIiIT*I*T
csr_sample_values   v iiIITiII*T
csr_count_blocks    i iiiiII
csr_sample_offsets  i iiIIiII*I
csr_hstack          v iiIIIT*I*I*T
expandptr           v iI*I
test_throw_error    i
csr_has_sorted_indices    i iII
csr_has_canonical_format  i iII
z
coo_tocsr           v iiiIIT*I*I*T
coo_todense         v iilIIT*Ti
coo_matvec          v lIITT*T
dia_matvec          v iiiiITT*T
cs_graph_components i iII*I
bsrcsrcscother)	NPY_INT32	npy_int32)	NPY_INT64	npy_int64))NPY_BOOLnpy_bool_wrapper)NPY_BYTEnpy_byte)	NPY_UBYTE	npy_ubyte)	NPY_SHORT	npy_short)
NPY_USHORT
npy_ushort)NPY_INTnpy_int)NPY_UINTnpy_uint)NPY_LONGnpy_long)	NPY_ULONG	npy_ulong)NPY_LONGLONGnpy_longlong)NPY_ULONGLONGnpy_ulonglong)	NPY_FLOAT	npy_float)
NPY_DOUBLE
npy_double)NPY_LONGDOUBLEnpy_longdouble)
NPY_CFLOATnpy_cfloat_wrapper)NPY_CDOUBLEnpy_cdouble_wrapper)NPY_CLONGDOUBLEnpy_clongdouble_wrapperzf
static PY_LONG_LONG %(name)s_thunk(int I_typenum, int T_typenum, void **a)
{
    %(thunk_content)s
}
z
NPY_VISIBILITY_HIDDEN PyObject *
%(name)s_method(PyObject *self, PyObject *args)
{
    return call_thunk('%(ret_spec)s', "%(arg_spec)s", %(name)s_thunk, args);
}
z]
static int get_thunk_case(int I_typenum, int T_typenum)
{
    %(content)s;
    return -1;
}
c            	   	   C   s   g } g }d}d}t D ]C\}}d}||t||d 7 }|||d|df |d7 }tD ]\}}d}||t||d 7 }| |||||f |d7 }q*|d	7 }q
|| tt|d
 fS )a  
    Get a list containing cartesian product of data types, plus a getter routine.

    Returns
    -------
    i_types : list [(j, I_typenum, None, I_type, None), ...]
         Pairing of index type numbers and the corresponding C++ types,
         and an unique index `j`. This is for routines that are parameterized
         only by I but not by T.
    it_types : list [(j, I_typenum, T_typenum, I_type, T_type), ...]
         Same as `i_types`, but for routines parameterized both by T and I.
    getter_code : str
         C++ code for a function that takes I_typenum, T_typenum and returns
         the unique index corresponding to the lists, or -1 if no match was
         found.

    r   z    if (0) {}zb
        else if (I_typenum == %(I_typenum)s) {
            if (T_typenum == -1) { return %(j)s; })	I_typenumjN   zC
            else if (T_typenum == %(T_typenum)s) { return %(j)s; })	T_typenumr.   z

        })content)I_TYPESdictappendT_TYPESGET_THUNK_CASE_TEMPLATE)	it_typesi_typesr.   getter_coder-   I_typepiecer0   T_type r=   y/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/scipy/sparse/_generate_sparsetools.pyget_thunk_type_set   s    

r?   c                    s   |d }|dd   fdd}d}|D ]*\}}}}	}
||	|
}d}|dkr+|d	7 }n|d
7 }||t ||	|
|||| d 7 }q|d7 }tt | |d }tt | | d }||fS )a3  
    Generate thunk and method code for a given routine.

    Parameters
    ----------
    name : str
        Name of the C++ routine
    args : str
        Argument list specification (in format explained above)
    types : list
        List of types to instantiate, as returned `get_thunk_type_set`

    r   r/   Nc                    s:  g }d}d} D ]}|rdnd}d}|dkrd}q|dkr)| d||  |f  nj|d	kr9| d
||  |f  nZ|dkrI| d
|| |f  nJ|dkrV| d|f  n=|dkrj|r`td| d| |f  n)|dkr~|rttd| d||f  n|dkr| d||f  ntd|f |d7 }qd|S )zE
        Generate argument list for calling the C++ function
        Fr    zconst *Tiz*(%s*)a[%d]Iz
(%s*)a[%d]TBz(npy_bool_wrapper*)a[%d]Vz"'V' argument must be an output argz(std::vector<%s>*)a[%d]Wz"'W' argument must be an output arglz*(%snpy_int64*)a[%d]zInvalid spec character %rr/   z, )r4   
ValueErrorjoin)r:   r<   argsnext_is_writeabler.   tconstarg_specr=   r>   get_arglist  s<   

z"parse_routine.<locals>.get_arglistz>int j = get_thunk_case(I_typenum, T_typenum);
    switch (j) {z
        case %(j)s:vz?
            (void)%(name)s(%(arglist)s);
            return 0;z*
            return %(name)s(%(arglist)s);)r.   r:   r<   r-   r0   arglistnamezb
    default:
        throw std::runtime_error("internal error: invalid argument typenums");
    })rT   thunk_content)rT   ret_specrP   )r3   THUNK_TEMPLATEMETHOD_TEMPLATE)rT   rK   typesrV   rQ   rU   r.   r-   r0   r:   r<   rS   r;   
thunk_codemethod_coder=   rO   r>   parse_routine   s.   &

r\   c                  C   s  t jtpd d} | jddddd |  \}}g }t \}}}tD ]\}}g }	g }
| D ]g}| }|r<|	dr=q/z
|
d d	\}}W n ty[ } ztd
|f |d }~ww d|
 }d|v skd|v rtt|||\}}nt|||\}}||v rtd|f || |	| |
| q/tjtjtd|d }tt|s|jrtd|f  t|d%}t| || |	D ]}|| q|
D ]}|| qW d    n1 sw   Y  q#td|f  q#d}|D ]	}|d|f 7 }qd}|D ]}|dt|d 7 }q|d7 }tjtjtdd}tt|s(|jrVtd|f  t|d}t| || || W d    d S 1 sOw   Y  d S td|f  d S )Nr@   )usagez
--no-forcestore_falseforceT)actiondestdefault#r/   zMalformed line: %rrM   rD   zDuplicate routine %rsparsetoolsz_impl.hz$[generate_sparsetools] generating %rwz,[generate_sparsetools] %r already up-to-datezCNPY_VISIBILITY_HIDDEN PyObject *%s_method(PyObject *, PyObject *);
z4
static struct PyMethodDef sparsetools_methods[] = {zH
        {"%(name)s", (PyCFunction)%(name)s_method, METH_VARARGS, NULL},)rT   z%
        {NULL, NULL, 0, NULL}
    };zsparsetools_impl.h)optparseOptionParser__doc__strip
add_option
parse_argsr?   COMPILATION_UNITS
splitlines
startswithsplitrI   rJ   r\   r4   ospathdirname__file__r   r_   printopenwrite_autogen_blurbwriter3   )poptionsrK   namesr8   r7   r9   	unit_nameroutinesthunksmethodslinerT   ethunkmethoddstfmethod_defsmethod_structr=   r=   r>   mainO  s   




$r   c                 C   s   |  d d S )Nzh/* This file is autogenerated by generate_sparsetools.py
 * Do not edit manually or check into VCS.
 */
)rw   )streamr=   r=   r>   rv     s   rv   __main__)rh   rf   rp   distutils.dep_utilr   BSR_ROUTINESCSC_ROUTINESCSR_ROUTINESOTHER_ROUTINESrl   r2   r5   rW   rX   r6   r?   r\   r   rv   __name__r=   r=   r=   r>   <module>   s6    	)
0ZS
