ó
Ê½÷Xc           @   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
 d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL g Z d2 Z d3 Z d4 Z d5 „  Z d6 „  Z d7 „  Z d8 „  Z e d9 k re ƒ  n  d S(M   sZ  
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

See sparsetools.cxx for more details.

iÿÿÿÿN(   t   newers¾  
bsr_diagonal        v iiiiIIT*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_pass2    v iiiiiIITIIT*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
s[  
csc_diagonal        v iiIIT*T
csc_tocsr           v iiIIT*I*I*T
csc_matmat_pass1    v iiIIII*I
csc_matmat_pass2    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
s  
csr_matmat_pass1    v iiIIII*I
csr_matmat_pass2    v iiIITIIT*I*I*T
csr_diagonal        v iiIIT*T
csr_tocsc           v iiIIT*I*I*T
csr_tobsr           v iiiiIIT*I*I*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_sample_values   v iiIITiII*T
csr_count_blocks    i iiiiII
csr_sample_offsets  i iiIIiII*I
expandptr           v iI*I
test_throw_error    i
csr_has_sorted_indices    i iII
csr_has_canonical_format  i iII
sž   
coo_tocsr           v iiiIIT*I*I*T
coo_todense         v iiiIIT*Ti
coo_matvec          v iIITT*T
dia_matvec          v iiiiITT*T
cs_graph_components i iII*I
t   bsrt   csrt   csct   othert	   NPY_INT32t	   npy_int32t	   NPY_INT64t	   npy_int64t   NPY_BOOLt   npy_bool_wrappert   NPY_BYTEt   npy_bytet	   NPY_UBYTEt	   npy_ubytet	   NPY_SHORTt	   npy_shortt
   NPY_USHORTt
   npy_ushortt   NPY_INTt   npy_intt   NPY_UINTt   npy_uintt   NPY_LONGt   npy_longt	   NPY_ULONGt	   npy_ulongt   NPY_LONGLONGt   npy_longlongt   NPY_ULONGLONGt   npy_ulonglongt	   NPY_FLOATt	   npy_floatt
   NPY_DOUBLEt
   npy_doublet   NPY_LONGDOUBLEt   npy_longdoublet
   NPY_CFLOATt   npy_cfloat_wrappert   NPY_CDOUBLEt   npy_cdouble_wrappert   NPY_CLONGDOUBLEt   npy_clongdouble_wrappersd   
static Py_ssize_t %(name)s_thunk(int I_typenum, int T_typenum, void **a)
{
    %(thunk_content)s
}
s£   
NPY_VISIBILITY_HIDDEN PyObject *
%(name)s_method(PyObject *self, PyObject *args)
{
    return call_thunk('%(ret_spec)s', "%(arg_spec)s", %(name)s_thunk, args);
}
s]   
static int get_thunk_case(int I_typenum, int T_typenum)
{
    %(content)s;
    return -1;
}
c    	   	   C   sü   g  }  g  } d } d } xÇ t  D]¿ \ } } d } | | t d | d | ƒ 7} | j | | d | d f ƒ | d 7} x] t D]U \ } } d } | | t d | d | ƒ 7} |  j | | | | | f ƒ | d 7} q{ W| d	 7} q W| |  t t d
 | ƒ f S(   s¶  
    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.

    i    s       if (0) {}sb   
        else if (I_typenum == %(I_typenum)s) {
            if (T_typenum == -1) { return %(j)s; }t	   I_typenumt   ji   sC   
            else if (T_typenum == %(T_typenum)s) { return %(j)s; }t	   T_typenums
   
        }t   contentN(   t   I_TYPESt   dictt   appendt   Nonet   T_TYPESt   GET_THUNK_CASE_TEMPLATE(	   t   it_typest   i_typesR,   t   getter_codeR+   t   I_typet   pieceR-   t   T_type(    (    s@   /tmp/pip-build-7oUkmx/scipy/scipy/sparse/generate_sparsetools.pyt   get_thunk_type_set¼   s"    
c            sS  | d } | d ‰  ‡  f d †  } d } xÛ | D]Ó \ } } } }	 }
 | |	 |
 ƒ } |
 d k rp d |	 f } n d |	 |
 f } d ˆ  k r™ | d 7} n  d	 } | d
 k r¸ | d 7} n
 | d 7} | | t d | d |	 d |
 d | d | d | d |  d | ƒ 7} q0 W| d 7} t t d |  d | ƒ } t t d |  d | d ˆ  ƒ } | | f S(   s3  
    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`

    i    i   c            s”  g  } t  } d } xrˆ  D]j} | r+ d n d } t  } | d k rO t } q n*| d k ry | j d | |  | f ƒ n | d k r£ | j d | |  | f ƒ nÖ | d	 k rÍ | j d | | | f ƒ n¬ | d
 k rð | j d | f ƒ n‰ | d k r+| rt d ƒ ‚ n  | j d |  | f ƒ nN | d k rf| rLt d ƒ ‚ n  | j d | | f ƒ n t d | f ƒ ‚ | d 7} q Wd j | ƒ S(   sE   
        Generate argument list for calling the C++ function
        i    t    s   const t   *t   is   *(%s*)a[%d]t   Is
   (%s*)a[%d]t   Tt   Bs   (npy_bool_wrapper*)a[%d]t   Vs"   'V' argument must be an output args   (std::vector<%s>*)a[%d]t   Ws"   'W' argument must be an output args   Invalid spec character %ri   s   , (   t   Falset   TrueR1   t
   ValueErrort   join(   R8   R:   t   argst   next_is_writeableR,   t   tt   const(   t   arg_spec(    s@   /tmp/pip-build-7oUkmx/scipy/scipy/sparse/generate_sparsetools.pyt   get_arglistþ   s8    s>   int j = get_thunk_case(I_typenum, T_typenum);
    switch (j) {s   %ss   %s,%sRA   s   ,npy_bool_wrappers   
        case %(j)s:t   vsM   
            (void)%(name)s<%(dispatch)s>(%(arglist)s);
            return 0;s8   
            return %(name)s<%(dispatch)s>(%(arglist)s);R,   R8   R:   R+   R-   t   arglistt   namet   dispatchsb   
    default:
        throw std::runtime_error("internal error: invalid argument typenums");
    }t   thunk_contentt   ret_specRL   N(   R2   R0   t   THUNK_TEMPLATEt   METHOD_TEMPLATE(   RP   RH   t   typesRS   RM   RR   R,   R+   R-   R8   R:   RO   RQ   R9   t
   thunk_codet   method_code(    (   RL   s@   /tmp/pip-build-7oUkmx/scipy/scipy/sparse/generate_sparsetools.pyt   parse_routineì   s:    

%


c       	   C   sl  t  j d t j ƒ  ƒ }  |  j d d d d d d t ƒ|  j ƒ  \ } } g  } t ƒ  \ } } } xt D]	\ } } g  }	 g  }
 x(| j	 ƒ  D]} | j ƒ  } | s | j
 d ƒ r» q n  y | j d  d	 ƒ \ } } Wn$ t k
 rý t d
 | f ƒ ‚ n Xd j | j ƒ  ƒ } d | k s+d | k rFt | | | ƒ \ } } n t | | | ƒ \ } } | | k r€t d | f ƒ ‚ n  | j | ƒ |	 j | ƒ |
 j | ƒ q Wt j j t j j t ƒ d | d ƒ } t t | ƒ së| j red | f GHt | d ƒ Z } t | ƒ | j | ƒ x |	 D] } | j | ƒ q'Wx |
 D] } | j | ƒ qEWWd  QXqh d | f GHqh Wd } x | D] } | d | f 7} q‚Wd } x% | D] } | d t d | ƒ 7} qªW| d 7} t j j t j j t ƒ d d ƒ } t t | ƒ s| j r\d | f GHt | d ƒ + } t | ƒ | j | ƒ | j | ƒ Wd  QXn d | f GHd  S(   Nt   usages
   --no-forcet   actiont   store_falset   destt   forcet   defaultt   #i   s   Malformed line: %rR<   RJ   R@   s   Duplicate routine %rt   sparsetoolss   _impl.hs$   [generate_sparsetools] generating %rt   ws,   [generate_sparsetools] %r already up-to-datesC   NPY_VISIBILITY_HIDDEN PyObject *%s_method(PyObject *, PyObject *);
s4   
static struct PyMethodDef sparsetools_methods[] = {sH   
        {"%(name)s", (PyCFunction)%(name)s_method, METH_VARARGS, NULL},RP   s%   
        {NULL, NULL, 0, NULL}
    };s   sparsetools_impl.h(   t   optparset   OptionParsert   __doc__t   stript
   add_optionRE   t
   parse_argsR;   t   COMPILATION_UNITSt
   splitlinest
   startswitht   splitR2   RF   RG   RY   R1   t   ost   patht   dirnamet   __file__R    R^   t   opent   write_autogen_blurbt   writeR0   (   t   pt   optionsRH   t   namesR6   R5   R7   t	   unit_namet   routinest   thunkst   methodst   lineRP   t   thunkt   methodt   dstt   ft   method_defst   method_struct(    (    s@   /tmp/pip-build-7oUkmx/scipy/scipy/sparse/generate_sparsetools.pyt   mainK  st    
	
c         C   s   |  j  d ƒ d  S(   Nsh   /* This file is autogenerated by generate_sparsetools.py
 * Do not edit manually or check into VCS.
 */
(   Rs   (   t   stream(    (    s@   /tmp/pip-build-7oUkmx/scipy/scipy/sparse/generate_sparsetools.pyRr   ž  s    t   __main__(   R   R   (   R   R   (   R	   R
   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R   (   R   R    (   R!   R"   (   R#   R$   (   R%   R&   (   R'   R(   (   R)   R*   (   Re   Rc   Rm   t   distutils.dep_utilR    t   BSR_ROUTINESt   CSC_ROUTINESt   CSR_ROUTINESt   OTHER_ROUTINESRi   R/   R3   RT   RU   R4   R;   RY   R‚   Rr   t   __name__(    (    (    s@   /tmp/pip-build-7oUkmx/scipy/scipy/sparse/generate_sparsetools.pyt   <module>   sN   #							0	_	S	