
\K]c           @@ s  d  Z  d d l m Z m Z d d l m Z d d l Z d d l Z d d l m	 Z	 d d l
 Z d d l m Z d d l m Z d d l m Z d d	 l m Z m Z d d
 l m Z m Z d d l m Z d d l m Z d   Z d   Z d   Z d e f d     YZ d   Z  d e f d     YZ! d e f d     YZ" d   Z# d   Z$ d   Z% d   Z& d e f d     YZ' d e f d     YZ( d e f d      YZ) d! e f d"     YZ* d S(#   sA   
Implements custom ufunc dispatch mechanism for non-CPU devices.
i    (   t   print_functiont   absolute_import(   t   OrderedDictN(   t   reduce(   t   exec_(   t   longint(   t   IS_PY3(   t   _BaseUFuncBuildert   parse_identity(   t   sigutilst   types(   t	   signature(   t   parse_signaturec         C@ sL   |  | k r |  S|  d k r  | S| d k r0 |  St  d j |  |    d S(   s=   
    Raises
    ------
    ValueError if broadcast fails
    i   s   failed to broadcast {0} and {1}N(   t
   ValueErrort   format(   t   at   b(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   _broadcast_axis   s    c         C@ s   t  t |  | g  \ }  } x& t |   t |  k  rC d |  }  q Wx& t |   t |  k rl d | } qG Wt d   t |  |  D  S(   s=   
    Raises
    ------
    ValueError if broadcast fails
    i   c         s@ s$   |  ] \ } } t  | |  Vq d  S(   N(   R   (   t   .0R   R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pys	   <genexpr>4   s    (   i   (   i   (   t   mapt   tuplet   lent   zip(   t   shape1t   shape2(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   _pairwise_broadcast&   s    c          G@ s   |  s t   |  d } |  d } y6 x/ t | d d D] \ } } t | |  } q6 WWn& t k
 r~ t d j |    n X| Sd S(   s=   
    Raises
    ------
    ValueError if broadcast fails
    i    i   t   starts!   failed to broadcast argument #{0}N(   t   AssertionErrort	   enumerateR   R   R   (   t	   shapelistt   resultt   otherst   it   each(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   _multi_broadcast7   s    

t   UFuncMechanismc           B@ s   e  Z d  Z d Z e Z d   Z d   Z d   Z	 d   Z
 d   Z d   Z d   Z d   Z d	   Z d
   Z d   Z d   Z e d    Z d   Z d   Z d   Z d   Z RS(   s0   
    Prepare ufunc arguments for vectorize.
    c         C@ sW   | |  _  | |  _ t |  j  } d g | |  _ g  |  _ d |  _ d g | |  _ d S(   sF   Never used directly by user. Invoke by UFuncMechanism.call().
        N(   t   typemapt   argsR   t   Nonet   argtypest	   scalarposR   t   arrays(   t   selfR$   R%   t   nargs(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   __init__Q   s    				c         C@ s   x t  |  j  D] \ } } t | t j  r> | |  j | <q |  j |  rf |  j |  |  j | <q t | t t	 t
 t t j f  r |  j j |  q t d | d t |  f   q Wd S(   s1   
        Get all arguments in array form
        s#   argument #%d has invalid type of %si   N(   R   R%   t
   isinstancet   npt   ndarrayR)   t   is_device_arrayt   as_device_arrayt   intR   t   floatt   complext   numberR(   t   appendt	   TypeErrort   type(   R*   R    t   arg(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   _fill_arrays\   s    !c         C@ sC   x< t  |  j  D]+ \ } } | d k	 r | j |  j | <q q Wd S(   s   
        Get dtypes
        N(   R   R)   R&   t   dtypeR'   (   R*   R    t   ary(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   _fill_argtypesl   s    c         C@ sT  g  } |  j  r x |  j D] } g  } xg t t | |  j   D]M \ } \ } } | d k rx t j |  j |  j	 } n  | j
 | | k  q> Wt |  r | j
 |  q q Wn  | sg  } xL |  j D]> } t d   t | |  j  D  } | r | j
 |  q q Wn  | s"t d   n  t |  d k rCt d   n  | d |  _ d S(   s<   Resolve signature.
        May have ambiguous case.
        c         s@ s-   |  ]# \ } } | d  k p$ | | k Vq d  S(   N(   R&   (   R   t   formalt   actual(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pys	   <genexpr>   s   s   No matching version.  GPU ufunc requires array arguments to have the exact types.  This behaves like regular ufunc with casting='no'.i   sq   Failed to resolve ufunc due to ambiguous signature. Too many untyped scalars. Use numpy dtype object to type tag.i    N(   R(   R$   R   R   R'   R&   R.   t   asarrayR%   R;   R6   t   allR7   R   (   R*   t   matchest	   formaltyst	   match_mapR    R>   R?   t   all_matches(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   _resolve_signaturet   s.    		c         C@ sH   x> |  j  D]3 } t j |  j | g d |  j | |  j | <q
 W|  j S(   sP   Return the actual arguments
        Casts scalar arguments to np.array.
        R;   (   R(   R.   t   arrayR%   R'   R)   (   R*   R    (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   _get_actual_args   s    1c         C@ sP  g  | D] } | j  ^ q } t |   } x!t |  D]\ } } | j  | k rS q5 |  j |  r{ |  j | |  | | <q5 g  t t |   D]2 } | | j k s | j  | | | k r | ^ q } t |  t | j   }	 d g |	 t | j	  }
 x | D] } d |
 | <q Wt
 j j j | d | d |
 } |  j |  | | <q5 W| S(   s)   Perform numpy ufunc broadcasting
        i    t   shapet   strides(   RI   R"   R   R0   t   broadcast_devicet   rangeR   t   ndimt   listRJ   R.   t   libt   stride_trickst
   as_stridedt   force_array_layout(   R*   t   arysR   R   RI   R    R<   t   axt
   ax_differst
   missingdimRJ   t   strided(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt
   _broadcast   s&    #	c         C@ s7   |  j    |  j   |  j   |  j   } |  j |  S(   s[   Prepare and return the arguments for the ufunc.
        Does not call to_device().
        (   R:   R=   RF   RH   RX   (   R*   RS   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   get_arguments   s
    


c         C@ s   |  j  |  j S(   s)   Returns (result_dtype, function)
        (   R$   R'   (   R*   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   get_function   s    c         C@ s   t  S(   sB   Is the `obj` a device array?
        Override in subclass
        (   t   False(   R*   t   obj(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR0      s    c         C@ s   | S(   s   Convert the `obj` to a device array
        Override in subclass

        Default implementation is an identity function
        (    (   R*   R\   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR1      s    c         C@ s   t  d   d S(   sT   Handles ondevice broadcasting

        Override in subclass to add support.
        s'   broadcasting on device is not supportedN(   t   NotImplementedError(   R*   R<   RI   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyRK      s    c         C@ s   | S(   sS   Ensures array layout met device requirement.

        Override in sublcass
        (    (   R*   R<   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyRR      s    c         @ s  | j  d |  j   | j  d d  } | rJ t j d d j |   n  |  | |      j   }   j   \ } } | d j } | d k	 r   j	 |  r   j
 |  } n     f d   } | d j d k r g  | D] }	 | |	  ^ q } n  g  }
 t } xU | D]M }	   j	 |	  r6|
 j |	  t } q  j |	 d  } |
 j |  qW| d j } | d k r  j | | d  } |
 j | g    j | | d  |
  | r| j |  S| j   j |  Sn   j	 |  rJ| j d k r| |  } n  | } |
 j | g    j | | d  |
  | j |  S| j | k s_t  | j | k stt    j | | d  } |
 j | g    j | | d  |
  | j | d  j |  Sd S(	   s1   Perform the entire ufunc call mechanism.
        t   streamt   outs   unrecognized keywords: %ss   , i    c         @ su     j  r t  n  y |  j   SWnN t k
 rp   j |   sE   qq   j |    j   }   j |   Sn Xd  S(   N(   t   SUPPORT_DEVICE_SLICINGR]   t   ravelR0   t   to_hostt	   to_device(   R   t   hostary(   t   crR^   (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   attempt_ravel
  s    		i   N(   t   popt   DEFAULT_STREAMR&   t   warningst   warnt   joinRY   RZ   RI   R0   R1   RM   R[   R6   t   TrueRc   t   device_arrayt   extendt   launcht   reshapet   copy_to_hostR   R;   (   t   clsR$   R%   t   kwsR_   t   restyt   funct   outshapeRf   R   t   devaryst
   any_devicet   dev_aRI   t   devout(    (   Re   R^   s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   call   sT    "	c         C@ s
   t   d S(   sB   Implement to device transfer
        Override in subclass
        N(   R]   (   R*   Rd   R^   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyRc   N  s    c         C@ s
   t   d S(   s@   Implement to host transfer
        Override in subclass
        N(   R]   (   R*   t   devaryR^   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyRb   T  s    c         C@ s
   t   d S(   sB   Implements device allocation
        Override in subclass
        N(   R]   (   R*   RI   R;   R^   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyRm   Z  s    c         C@ s
   t   d S(   sK   Implements device function invocation
        Override in subclass
        N(   R]   (   R*   Ru   t   countR^   R%   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyRo   `  s    N(   t   __name__t
   __module__t   __doc__R&   Rh   R[   R`   R,   R:   R=   RF   RH   RX   RY   RZ   R0   R1   RK   RR   t   classmethodR{   Rc   Rb   Rm   Ro   (    (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR#   J   s(   				+			!	
					Z			c         C@ s   t  j t |    S(   N(   R.   R;   t   str(   t   ty(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   to_dtypeg  s    t   DeviceVectorizec           B@ sh   e  Z d e i  d   Z e d    Z d d d d  Z d   Z d   Z	 d   Z
 d   Z d   Z RS(	   c         C@ sJ   | r t  d   n  | s" t  | |  _ t |  |  _ t   |  _ d  S(   Ns   caching is not supported(   R7   R   t   py_funcR   t   identityR   t	   kernelmap(   R*   Ru   R   t   cachet   targetoptions(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR,   l  s    	c         C@ s   |  j  S(   N(   R   (   R*   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   pyfuncu  s    c         C@ sg  | d  k	 rX t j d t  | d  k s. t  | d  k rI t |  } qX | |   } n  ~ ~ t j |  \ } } t | |  } |  j	 j
 } |  j |  j | |  } |  j |  \ }	 } |  j |	  }
 t t j g  | D] } | ^ q | g  } t | |
  |
 d | } |  j | |  } t d   | j D  } t |  } | | f |  j t |  <d  S(   Ns'   Keyword argument argtypes is deprecateds   __vectorized_%sc         s@ s   |  ] } t  |  Vq d  S(   N(   R   (   R   t   t(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pys	   <genexpr>  s    (   R&   Ri   Rj   t   DeprecationWarningR   R   R	   t   normalize_signatureR   R   R~   t   _get_kernel_sourcet   _kernel_templatet   _compile_coret   _get_globalsR
   t   voidR   t   _compile_kernelR%   R   R   (   R*   t   sigR'   t   restypeR%   t   return_typet   devfnsigt   funcnamet   kernelsourcet   corefnt   glblR   t   stagert   kernelt	   argdtypest   resdtype(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   addy  s.    	.c         C@ s
   t   d  S(   N(   R]   (   R*   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   build_ufunc  s    c      	   C@ sp   g  t  t | j   D] } d | ^ q } t d | d d j |  d d j d   | D   } | j |   S(   Ns   a%dt   nameR%   s   , t   argitemsc         s@ s   |  ] } d  | Vq d S(   s   %s[__tid__]N(    (   R   R    (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pys	   <genexpr>  s    (   RL   R   R%   t   dictRk   R   (   R*   t   templateR   R   R    R%   t   fmts(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s
    ,c         C@ s
   t   d  S(   N(   R]   (   R*   R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s    c         C@ s
   t   d  S(   N(   R]   (   R*   R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s    c         C@ s
   t   d  S(   N(   R]   (   R*   t   fnobjR   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s    N(   R~   R   R&   R[   R,   t   propertyR   R   R   R   R   R   R   (    (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR   k  s   	 				t   DeviceGUFuncVectorizec           B@ sM   e  Z d e i  d   Z e d    Z d d d d  Z d   Z d   Z	 RS(   c   	      C@ s   | r t  d   n  | j d t  s6 t  d   n  | r d j g  | j   D] } t |  ^ qO  } d } t  | j |    n  | |  _ t |  |  _	 | |  _
 t |  j
  \ |  _ |  _ t |  j  d k s t d   t   |  _ d  S(   Ns   caching is not supportedt   nopythons   nopython flag must be Trues   , s3   The following target options are not supported: {0}i   s   only support 1 output(   R7   Rg   Rl   Rk   t   keyst   reprR   R   R   R   R   R   t   inputsigt	   outputsigR   R   R   R   (	   R*   Ru   R   R   R   R   t   kt   optst   fmt(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR,     s    .		!c         C@ s   |  j  S(   N(   R   (   R*   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s    c         C@ s  | d  k	 rX t j d t  | d  k s. t  | d  k rI t |  } qX | |   } n  ~ ~ g  |  j D] } t |  ^ qh } g  |  j D] } t |  ^ q } t	 j
 |  \ } } |  j j }	 t |  j | | |	 |  }
 |  j |  } t |
 |  | d j d |	  } t t | | |   } |  j | d t |  } t d   | D  } | d | f |  j t | d   <d  S(   Ns'   Keyword argument argtypes is deprecateds   __gufunc_{name}R   R   c         s@ s'   |  ] } t  j t | j   Vq d  S(   N(   R.   R;   R   (   R   R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pys	   <genexpr>  s    i(   R&   Ri   Rj   R   R   R   R   R   R   R	   R   R   R~   t   expand_gufunc_templateR   R   R   R   RN   t   _determine_gufunc_outer_typesR   R   (   R*   R   R'   R   t   xt   indimst   outdimsR%   R   R   t   srct   glblsR   t   outertysR   t   dtypes(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s,    	""c         C@ s
   t   d  S(   N(   R]   (   R*   R   R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s    c         C@ s
   t   d  S(   N(   R]   (   R*   R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s    N(
   R~   R   R&   R[   R,   R   R   R   R   R   (    (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s
    	c         c@ s   x t  |  |  D]n \ } } t | t j  rF | j d | d  Vq | d k ra t d   n  t j d | d d d d  Vq Wd  S(   NRM   i   i    s,   gufunc signature mismatch: ndim>0 for scalarR;   t   layoutt   A(   R   R-   R
   t   Arrayt   copyR   (   t   argtyst   dimst   att   nd(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s    c      
   C@ s8  | | } g  t  t |   D] } d j |  ^ q } d j d j g  | D] } d j |  ^ qK   }	 g  t | | |  D]! \ }
 } } t |
 | |  ^ q } g  t | t |  | | t |   D]! \ }
 } } t |
 | |  ^ q } | | } |  j d | d d j |  d |	 d d j |   } | S(	   s"   Expand gufunc source template
    s   arg{0}s   min({0})s   , s   {0}.shape[0]R   R%   t
   checkedargR   (   RL   R   R   Rk   R   t   _gen_src_for_indexing(   R   R   R   R   R'   t   argdimsR    t   argnamesR   R   t   areft   adimst   atypet   inputst   outputsR   R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s    
.%78
c         C@ s   d j  d |  d t | |   S(   Ns   {aref}[{sliced}]R   t   sliced(   R   t   _gen_src_index(   R   R   R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR   
  s    c         C@ sX   |  d k r' d j  d g d g |   St | t j  rP | j d |  k rP d Sd Sd  S(   Ni    t   ,t   __tid__t   :i   s   __tid__:(__tid__ + 1)(   Rk   R-   R
   R   RM   (   R   R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s
    %t   GUFuncEnginec           B@ s/   e  Z d  Z e d    Z d   Z d   Z RS(   sZ   Determine how to broadcast and execute a gufunc
    base on input shape and signature
    c         C@ s   |  t  |    S(   N(   R   (   Rr   R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   from_signature   s    c         C@ s:   | |  _  | |  _ t |  j   |  _ t |  j  |  _ d  S(   N(   t   sint   soutR   t   nint   nout(   R*   R   R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR,   $  s    		c         C@ s  t  |  |  j k r$ t d   n  i  } g  } g  } x9t t | |  j   D]\ } \ } } | d 7} t  |  } t  |  | k  r d }	 t |	 | f   n  | r | | }
 | |  } n d }
 | } x t t |
 |   D]j \ } \ } } | t  |  7} | | k rF| | | k rFd }	 t |	 | | f   qFn  | | | <q W| j |  | j |
  qO Wg  } xL |  j D]A } g  } x | D] } | j | |  qW| j t	 |   qWg  | D] } t
 t j | d  ^ q} t j |  } | | } t g |  j } xk t |  D]] \ } } | | k r%| d k sU| d k rbt | | <qd }	 t |	 | d f   q%q%Wt |  | | | |  S(	   Ns    invalid number of input argumenti   s%   arg #%d: insufficient inner dimensions$   arg #%d: shape[%d] mismatch arguments!   arg #%d: outer dimension mismatch(    (   i   (    (   R   R   R7   R   R   R   R   R6   R   R   R   t   operatort   mulR.   t   argmaxR[   Rl   t   GUFuncSchedule(   R*   t   ishapest	   symbolmapt   outer_shapest   inner_shapest   argnRI   t   symbolst
   inner_ndimR   t   inner_shapet   outer_shapet   axist   dimt   symt   oshapest   outsigt   oshapet   st   sizest	   largest_it   loopdimst   pinnedR    t   d(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   schedule,  sT    +
((
(   R~   R   R   R   R   R,   R   (    (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s   	R   c           B@ s   e  Z d    Z d   Z RS(   c         C@ si   | |  _  | |  _ | |  _ | |  _ t t j | d  |  _ | |  _ g  | D] } | | ^ qL |  _	 d  S(   Ni   (
   t   parentR   R   R   R   R   R   t   loopnR   t   output_shapes(   R*   R   R   R   R   R   R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR,   g  s    					c         C@ sM   d d  l  } d } g  | D] } | t |  |  f ^ q } | j t |   S(   Ni    R   R   R   R   R   (   R   R   R   R   R   (   t   pprintt   getattrt   pformatR   (   R*   R   t   attrsR   t   values(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   __str__t  s    ((   R~   R   R,   R   (    (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR   f  s   	t   GenerializedUFuncc           B@ sP   e  Z d    Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 RS(   c         C@ s=   | |  _  | |  _ d |  _ |  j j d k s9 t d   d  S(   Ni   i   i   s   only support single outputi   @(   R   t   enginet   max_blocksizeR   R   (   R*   R   R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR,   }  s    			c   
      O@ s   |  j  |  j j |  j j | |  } | j   |  j | j | j  \ } } } } | j |  | j	 | |  | j
   |  j | | j | j  \ } }	 | j | | j | |	 g  | j   S(   N(   t   _call_stepsR   R   R   t   prepare_inputst	   _schedulet   norm_inputst   outputt   adjust_input_typest   allocate_outputst   prepare_kernel_parametersRX   t   kernel_parameterst   kernel_returnvaluet   launch_kernelR   t   post_process_result(
   R*   R%   Rs   t	   callstepst   indtypesR   t   outdtypeR   t	   newparamst	   newretval(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   __call__  s    

	c   	      C@ s   g  | D] } | j  ^ q } |  j j |  } t d   | D  } y |  j | \ } } Wn3 t k
 r |  j |  } |  j | \ } } n X| d  k	 r | j d | j  k r t	 d   n  | | | | f S(   Nc         s@ s   |  ] } | j  Vq d  S(   N(   R;   (   R   R    (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pys	   <genexpr>  s    i    s   output shape mismatch(
   RI   R   R   R   R   t   KeyErrort   _search_matching_signatureR&   R   R   (	   R*   R   R_   R   t   input_shapesR   t   idtypesR  R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR     s    "c         C@ sM   xF |  j  j   D]) } t d   t | |  D  r | Sq Wt d   d S(   s   
        Given the input types in `idtypes`, return a compatible sequence of
        types that is defined in `kernelmap`.

        Note: Ordering is guaranteed by `kernelmap` being a OrderedDict
        c         s@ s'   |  ] \ } } t  j | |  Vq d  S(   N(   R.   t   can_cast(   R   R?   t   desired(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pys	   <genexpr>  s   s   no matching signatureN(   R   R   RA   R   R7   (   R*   R  R   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR    s
    	c   
      C@ s   | j  d k s t d   | j s* d n | j  } g  } xt t | | j  D]` \ } } | r | j d k r |  j | |  } | j |  qL | j |  j | | |   qL W| j	 | | j
 d  }	 | |	 f S(   Ni    s   zero looping dimensioni   (   R   R   R   R   R   t   sizet   _broadcast_scalar_inputR6   t   _broadcast_arrayRp   R   (
   R*   R   t   paramst   retvalt   odimR  t   pt   csR|   R  (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyRX     s     c         C@ s   | f | } | j  | k r  | St | j   t |  k  rt | t | j   | j  k sd t d   |  j | |  S| j |   Sd  S(   Ns+   cannot add dim and reshape at the same time(   RI   R   R   t   _broadcast_add_axisRp   (   R*   R<   t   newdimt   innerdimt   newshape(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR    s     	c         C@ s   t  d   d  S(   Ns   cannot add new axis(   R]   (   R*   R<   R!  (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR    s    c         C@ s
   t   d  S(   N(   R]   (   R*   R<   RI   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR    s    (
   R~   R   R,   R  R   R  RX   R  R  R  (    (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR   |  s   							t   GUFuncCallStepsc           B@ s   e  Z d  d d d d d d d g Z d   Z d	   Z d
   Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z d   Z d   Z RS(   R%   t   kwargsR  R  R  R  t   _is_device_arrayt   _need_device_conversionc   
      C@ s{  | d k r t  d   n  | |  _ | |  _ t } |  j j d  |  _ |  j d  k	 r |  j |  j  } | r |  j |  j  |  _ q n  g  |  j D] } |  j |  ^ q |  _	 t
 |  j	  o | |  _ g  } xX t |  j |  j	  D]A \ } } | r| j |  j |   q | j t j |   q W| |  |  _ | | }	 |	 rw|  j d  k	 rht  d   qw|	 \ |  _ n  d  S(   Ni   s    multiple output is not supportedR_   s>   cannot specify 'out' as both a positional and keyword argument(   R   R%   R#  R[   t   getR  R&   R0   R1   R$  t   anyR%  R   R6   R.   R@   R  (
   R*   R   R   R%   R#  t   user_output_is_deviceR   R   t   isdevt   unused_inputs(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR,     s0    		(
"
c         C@ s   x t  t | |  j   D]m \ } \ } } | | j k r t | d  sm d j t |   } t |   n  | j |  |  j | <q q Wd S(   s   
        Attempt to cast the inputs to the required types if necessary
        and if they are not device array.

        Side effect: Only affects the element of `norm_inputs` that requires
        a type cast.
        t   astypesN   compatible signature is possible by casting but {0} does not support .astype()N(	   R   R   R  R;   t   hasattrR   R8   R7   R+  (   R*   R  R    t   ityt   valt   msg(    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR  
  s    +c         C@ sP   |  j  s |  j d  k r: |  j d | j d d |  } n	 |  j } | |  _ d  S(   NRI   i    R;   (   R%  R  R&   Rm   R   R  (   R*   R   R  R  (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR    s
    	c         @ s   g  } xO t    j   j  D]8 \ } } | r> | j |  q | j   j |   q Wt   f d   | D  sz t  |   _ d  S(   Nc         3@ s   |  ] }   j  |  Vq d  S(   N(   R0   (   R   R   (   R*   (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pys	   <genexpr>+  s    (   R   R  R$  R6   Rc   RA   R   R  (   R*   R  t   inpR)  (    (   R*   s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR  $  s    ""c         C@ sL   |  j  r$ |  j |  j |  j  } n$ |  j d  k r? |  j } n	 |  j } | S(   N(   R%  Rb   R  R  R&   (   R*   R_   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR	  .  s    		c         C@ s   d  S(   N(    (   R*   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR   7  s    c         C@ s
   t   d  S(   N(   R]   (   R*   R   t   nelemR%   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR  :  s    c         C@ s
   t   d  S(   N(   R]   (   R*   R\   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR0   =  s    c         C@ s   | S(   N(    (   R*   R\   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR1   @  s    c         C@ s
   t   d  S(   N(   R]   (   R*   Rd   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyRc   C  s    c         C@ s
   t   d  S(   N(   R]   (   R*   RI   R;   (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyRm   F  s    (   R~   R   t	   __slots__R,   R  R  R  R	  R   R  R0   R1   Rc   Rm   (    (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyR"    s&   		!				
							(+   R   t
   __future__R    R   t   collectionsR   R   Ri   t	   functoolsR   t   numpyR.   t	   numba.sixR   t   numba.utilsR   R   t   numba.npyufunc.ufuncbuilderR   R   t   numbaR	   R
   t   numba.typingR   t   numba.npyufunc.sigparseR   R   R   R"   t   objectR#   R   R   R   R   R   R   R   R   R   R   R"  (    (    (    s9   lib/python2.7/site-packages/numba/npyufunc/deviceufunc.pyt   <module>   s:   			 	B@	
			Ka