
    i                       S SK r S SKrS SKJrJrJrJrJr  S SKJ	r	J
r
JrJrJrJrJrJrJrJrJrJrJrJrJr  S SKJr  S SKJrJr  S SKrS SKJr  S SK r Sr!S r"\ RF                  /r$0 r%/ SQr&S	S
/r'/ SQr(/ SQr)/ SQr*\'\(-   \)-   \*-   SS/-   r+\S 5       r,S r-\S 5       r. " S S\/5      r0 " S S\05      r1 " S S\15      r2 " S S\/5      r3 " S S\/5      r4\5" \Rl                  Rn                  Rq                  5       5      \Rr                  /-   r:\Rv                  Rn                  Rq                  5       r<\Rz                  Rn                  Rq                  5       r>\R~                   V s/ s H  o R                  PM     sn rAgs  sn f )    N)typesirconfigcgutilserrors)mk_unique_varfind_topo_orderdprint_func_irget_global_func_typguardrequireget_definitionfind_callnamefind_build_sequence
find_constis_namedtuple_classbuild_definitionsfind_potential_aliasesget_canonical_aliasGuardException)compute_cfg_from_blocks)npydecl	signature)	intrinsic)emptyzerosonesfullrandrandn)ranfrandom_samplesamplerandomstandard_normal)	chisquareweibullpower	geometricexponentialpoissonrayleigh)normaluniformbetabinomialfgamma	lognormallaplacerandint
triangularc                   ^^ [        [        U[        R                  R                  5      5        [        [        U[        R                  R                  5      5        UR
                  (       a  [        R                  O[        R                  mUR
                  (       a  [        R                  O[        R                  mUU4S jn[        TX5      U4$ )a  
Calculate index value "idx" relative to a size "size" value as
(idx % size), where "size" is known to be positive.
Note that we use the mod(%) operation here instead of
(idx < 0 ? idx + size : idx) because we may have situations
where idx > size due to the way indices are calculated
during slice/range analysis.

Both idx and size have to be Integer types.
size should be from the array size vars that array_analysis
adds and the bitwidth should match the platform maximum.
c                   > U R                  T5      nU R                  T5      nTR                  (       a  UR                  US   U5      nOUR                  US   U5      nTR                  (       a  UR                  US   U5      nOUR                  US   U5      nUR	                  U5      n[
        R                  R                  US5      n	UR                  SXi5      n
UR                  SXg5      nUR                  SXh5      nUR                  XU5      nUR                  XUR                  Xg5      5      nUR                  XU5      nU$ )Nr      <z>=z<=)get_data_typesignedsextzextnegllvmliter   Constanticmp_signedselectadd)contextbuildersigargsll_idx_unified_tyll_unified_tyidxsizeneg_sizezeroidx_negativepos_oversizeneg_oversizepos_resneg_resmodidx_unified
unified_tys                   W/var/www/html/trading/venv/lib/python3.13/site-packages/numba/parfors/array_analysis.pycodegenwrap_index.<locals>.codegenf   s"   #11+>--j9,,tAw(9:C,,tAw(9:C<<Q7D<<Q7D;;t${{##M15 **3:**4;**4?..S9..W[[5KLnn\G<
    )	r   
isinstancer   scalarsIntegerr=   intpuintpr   )	typingctxrL   rM   rY   rV   rW   s       @@rX   
wrap_indexrb   Q   s|     JsEMM1123JtU]]2234  ${{J #

%**K0 Z+W44r[   c                 6    U S:  a  X* ::  a  gX-   $ X:  a  U$ U $ Nr    )rL   rM   s     rX   wrap_index_literalrf      s*    
Qw%<:;KJr[   c                 h   [        U5      S:  a  [        R                  " U5      4n[        US   5      S:  d   e[        S US   SS  5       5      (       d   e[	        US   S   [        R
                  5      (       d  [        R                  " S5      eS n[        [        R                  /UQ76 U4$ )z
A function that asserts the inputs are of equivalent size,
and throws runtime error when they are not. The input is
a vararg that contains an error message, followed by a set
of objects of either array, tuple or integer.
r:   r   c              3      #    U  HM  n[        U[        R                  [        R                  [        R                  [        R
                  45      v   MO     g 7fN)r\   r   ArrayCompatible	BaseTuple	SliceTyper^   ).0as     rX   	<genexpr>assert_equiv.<locals>.<genexpr>   sJ       A 	1!!OOOOMM	
 	 	 s   AANz&first argument must be a StringLiteralc           	        ^ ^^	^
 [        U5      S:X  d   e[        R                  " TUS   5      nUR                  S   nUR                  S   S   R                  m	UU 4S jm
UU U	U
4S jn[        S[        U5      S-
  5       H  nU" XG   XW   XGS-      XWS-      5        M     T R                  T[        R                  S 5      nU$ )Nr:   r   c                 (  > [        U[        R                  5      (       a:  TR                  U5      " TTU 5      n[        R
                  " TUR                  5      $ [        U[        R                  5      (       a  [        R
                  " TU 5      $ U /$ ri   )r\   r   rj   
make_arrayr   unpack_tupleshaperk   )rn   atyaryrG   rF   s      rX   unpack_shapes4assert_equiv.<locals>.codegen.<locals>.unpack_shapes   sq    #u4455((-gwB++GSYY??C11++GQ77s
r[   c                   > T" X5      nT" X#5      n[        U5      [        U5      :X  d   e[        XE5       Hl  u  pgTR                  SXg5      nTR                  U5       u  pU	    S S S 5        U
   TR                  R                  T[        T45        S S S 5        S S S 5        Mn     g ! , (       d  f       NH= f! , (       d  f       N,= f! , (       d  f       M  = f)Nz==)lenzipicmp_unsignedif_else	call_convreturn_user_excAssertionError)rn   rv   bbtyashapesbshapesmnm_eq_nthenorelserG   rF   msgrx   s              rX   pairwise/assert_equiv.<locals>.codegen.<locals>.pairwise   s    #A+G#A+Gw<3w<///g/ ..tQ:__V, ))99#^cV   -, 0  -,s<   C
$B(&
C
0#B9C
(
B62C
9
CC


C	)	r{   r   rt   rI   literal_valuerangeget_constant_genericr   NoneType)rF   rG   rH   rI   tuptup_typer   irr   rx   s   ``       @@rX   rY   assert_equiv.<locals>.codegen   s    4yA~~""7DG488A;hhqk!n**		 	 q#h-!+,ASVX[#!e*h1uoF -((%..$Gr[   )
r{   r   StarArgTupleallr\   StringLiteralr   TypingErrorr   none)ra   valrY   s      rX   assert_equivr      s     3x!| !!#&(s1v;??  Q     c!fQi!4!455  !IJJ D UZZ&#&//r[   c                   j    \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rS rS rS rS rS rS rSrg)EquivSet   zHEquivSet keeps track of equivalence relations between
a set of objects.
Nc                 P    U(       a  UO0 U l         U(       a  UO0 U l        X0l        g)zTCreate a new EquivSet object. Optional keyword arguments are for
internal use only.
N)
obj_to_ind
ind_to_objnext_ind)selfr   r   r   s       rX   __init__EquivSet.__init__   s!     )3*(2* !r[   c                     [        5       $ )z)Return an empty EquivSet object.
        )r   r   s    rX   r   EquivSet.empty   s     zr[   c                     [        [        R                  " U R                  5      [        R                  " U R                  5      U R
                  S9$ )Return a new copy.
        )r   r   next_id)r   copydeepcopyr   r   r   r   s    rX   cloneEquivSet.clone   s8     }}T__5}}T__5MM
 	
r[   c                 8    SR                  U R                  5      $ )NzEquivSet({}))formatr   r   s    rX   __repr__EquivSet.__repr__   s    $$T__55r[   c                      U R                   0 :H  $ )z=Return true if the set is empty, or false otherwise.
        )r   r   s    rX   is_emptyEquivSet.is_empty   s     "$$r[   c                 :    U R                   R                  US5      $ )z[Return the internal index (greater or equal to 0) of the given
object, or -1 if not found.
r   )r   get)r   xs     rX   _get_indEquivSet._get_ind   s     ""1b))r[   c                     XR                   ;   a  U R                   U   nU$ U R                  nU =R                  S-  sl        U$ )ziReturn the internal index (greater or equal to 0) of the given
object, or create a new one if not found.
r:   )r   r   )r   r   r   s      rX   _get_or_add_indEquivSet._get_or_add_ind   sA     "A  AMMQMr[   c                   ^  [        U5      S:  d   e[        U 4S jU 5       5      n[        U5      n[        R                  S:  a  [        SX5        UT R                  ;  a  / T R                  U'   [        X!5       H  u  pEXC:X  aD  UT R                  U   ;  a/  T R                  U   R                  U5        UT R                  U'   ML  MN  UT R                  ;   aR  T R                  U    H0  nUT R                  U'   T R                  U   R                  U5        M2     T R                  U	 M  UT R                  U'   T R                  U   R                  U5        M     g)zHBase method that inserts a set of equivalent objects by modifying
self.
r:   c              3   F   >#    U  H  nTR                  U5      v   M     g 7fri   )r   rm   r   r   s     rX   ro   #EquivSet._insert.<locals>.<genexpr>  s     ;dT))!,,d   !   z_insert:N)
r{   tupleminr   DEBUG_ARRAY_OPTprintr   r|   appendr   )r   objsindsindr   objr   s   `      rX   _insertEquivSet._insert
  s+    4y1}};d;;$i!!Q&*d)t&#%DOOC $oFAxts33OOC(//4+.DOOC( 4 '!__Q/-0*,33A6 0 * ,/DOOC(OOC(//4 &r[   c                    ^ U Vs/ s H  o R                  U5      PM     nn[        U5      mTS:w  a  [        U4S jU 5       5      $ [        U Vs/ s H
  o"US   :H  PM     sn5      $ s  snf s  snf )zVTry to derive if given objects are equivalent, return true
if so, or false otherwise.
r   c              3   ,   >#    U  H	  oT:H  v   M     g 7fri   re   )rm   r   r   s     rX   ro   $EquivSet.is_equiv.<locals>.<genexpr>1  s     .ACxs   r   )r   maxr   )r   r   r   r   r   s       @rX   is_equivEquivSet.is_equiv*  sk     +//$Qa $/$i"9....d3dT!Wd344 0
 4s   A)A.c                     U R                  U5      nUS:  a1  U R                  U   nU H  n[        U[        5      (       d  M  Us  $    g)zfCheck if obj is equivalent to some int constant, and return
the constant if found, or None otherwise.
r   N)r   r   r\   int)r   r   r   r   r   s        rX   get_equiv_constEquivSet.get_equiv_const5  sH     mmC !8??3'Da%%H  r[   c                 t    U R                  U5      nUS:  a  [        U R                  U   5      $ [        5       $ ).Return the set of equivalent objects.
        r   )r   setr   )r   r   r   s      rX   get_equiv_setEquivSet.get_equiv_setA  s4     mmC !8ts+,,ur[   c                 $    U R                  U5      $ )zInsert a set of equivalent objects by modifying self. This
method can be overloaded to transform object type before insertion.
)r   )r   r   s     rX   insert_equivEquivSet.insert_equivI  s     ||D!!r[   c                   ^  T R                  5       nT R                  Ul        UR                  R                  5        H  n[	        U 4S jU 5       5      n0 n[        XC5       H,  u  pgXe;   a  XV   R                  U5        M  US:  d  M'  U/XV'   M.     UR                  5        H%  n[        U5      S:  d  M  UR                  U5        M'     M     U$ )zReturn the intersection of self and the given equiv_set,
without modifying either of them. The result will also keep
old equivalence indices unchanged.
c              3   F   >#    U  H  nTR                  U5      v   M     g 7fri   r   r   s     rX   ro   %EquivSet.intersect.<locals>.<genexpr>X  s     84aq))4r   r   r:   )	r   r   r   valuesr   r|   r   r{   r   )	r   	equiv_setnew_setr   r   r   r   r   vs	   `        rX   	intersectEquivSet.intersectO  s    
 **,==((//1D8488DJD?M((+!V%&CJM	 (  &&(q6A:OOA& ) 2 r[   )r   r   r   )NNr   )__name__
__module____qualname____firstlineno____doc__r   r   r   r   r   r   r   r   r   r   r   r   r   __static_attributes__re   r[   rX   r   r      sI    !

6%
*	5@	5
"r[   r   c                      ^  \ rS rSrSr      SU 4S jjrS rS rS rS r	U 4S jr
U 4S	 jrS
 rU 4S jrU 4S jrU 4S jrS rS rS rS rU 4S jrS rS rSrU =r$ )ShapeEquivSetih  aP  Just like EquivSet, except that it accepts only numba IR variables
and constants as objects, guided by their types. Arrays are considered
equivalent as long as their shapes are equivalent. Scalars are
equivalent only when they are equal in value. Tuples are equivalent
when they are of the same size, and their elements are equivalent.
c                    > Xl         U(       a  UO0 U l        U(       a  UO0 U l        U(       a  UO0 U l        [        [
        U ]  XEU5        g)zCreate a new ShapeEquivSet object, where typemap is a dictionary
that maps variable names to their types, and it will not be modified.
Optional keyword arguments are for internal use only.
N)typemapdefs
ind_to_varind_to_constsuperr   r   )	r   r   r   r   r   r   r   r   	__class__s	           rX   r   ShapeEquivSet.__init__q  sA      !Db	 )3*,8LbmT+JGLr[   c                 .    [        U R                  0 5      $ )z'Return an empty ShapeEquivSet.
        )r   r   r   s    rX   r   ShapeEquivSet.empty  s     T\\2..r[   c                 t   [        U R                  [        R                  " U R                  5      [        R                  " U R                  5      [        R
                  " U R                  5      [        R
                  " U R                  5      U R                  [        R
                  " U R                  5      S9$ )r   )r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   ind_toconstr   s    rX   r   ShapeEquivSet.clone  sq     LL499%yy1}}T__5}}T__5MMt'7'78
 	
r[   c                 d    SR                  U R                  U R                  U R                  5      $ )Nz1ShapeEquivSet({}, ind_to_var={}, ind_to_const={}))r   r   r   r   r   s    rX   r   ShapeEquivSet.__repr__  s*    BIIOOT__d.?.?
 	
r[   c                   ^ ^^ [        U[        R                  5      (       d  [        U[        5      (       a  [        U[        5      (       a  UOUR                  mTT R
                  ;  a  T4$ T R
                  T   n[        U[        R                  [        R                  45      (       a]  [        U[        R                  5      (       a  UR                  O
[        U5      nUS:X  a  T4$ [        U4S j[        U5       5       5      $ T4$ [        U[        R                  5      (       a8  [        UR                  [        5      (       a  UR                  $ UR                  4$ [        U[        5      (       a  U 4S jm[        U4S jU 5       5      $ [        U[        5      (       a  U4$ [         R"                  S:  a  [%        S['        U5       S35        g)	zReturn a set of names for the given obj, where array and tuples
are broken down to their individual shapes or elements. This is
safe because both Numba array shapes and Python tuples are immutable.
r   c              3   H   >#    U  H  nS R                  TU5      v   M     g7f)z{}#{}N)r   )rm   r   names     rX   ro   +ShapeEquivSet._get_names.<locals>.<genexpr>  s      N+Qa!8!8+s   "c                 R   > TR                  U 5      n[        U5      S:w  a  US   $ U$ rd   )
_get_namesr{   )r   namesr   s     rX   	get_names+ShapeEquivSet._get_names.<locals>.get_names  s*    *u:? 8Or[   c              3   4   >#    U  H  nT" U5      v   M     g 7fri   re   )rm   r   r  s     rX   ro   r    s     3s!1ss   r:   zIgnoring untracked object type z in ShapeEquivSetre   )r\   r   Varstrr  r   r   rk   rj   ndimr{   r   r   Constvaluer   r   r   r   type)r   r   typr  r  r  s   `   @@rX   r
  ShapeEquivSet._get_names  sf   
 c266""jc&:&:$S#..3CHHD4<<'w,,t$C#1F1FGHH%c5+@+@AA  X  19 7N  N%+ NNNwRXX&&#))U++yy 		|#U## 3s333S!!6M!!Q&1$s)<MNPr[   c                 2  >^ [        U5      S:  d   eU Vs/ s H  o R                  U5      PM     nnU Vs/ s H  o"S:w  d  M
  UPM     nn[        U5      S::  a  gU Vs/ s H  n[        U5      PM     nnUS   m[        U4S jU 5       5      (       d/  [        R                  S:  a  [        SR                  U5      5        g[        T5       H/  nU Vs/ s H  owU   PM	     nn[        [        U ]*  " U6 (       a  M/    g   gs  snf s  snf s  snf s  snf )zGOverload EquivSet.is_equiv to handle Numba IR variables and
constants.
r:   re   Fr   c              3   .   >#    U  H
  nTU:H  v   M     g 7fri   re   rm   r   r  s     rX   ro   )ShapeEquivSet.is_equiv.<locals>.<genexpr>  s     ,e419e   z#is_equiv: Dimension mismatch for {}T)r{   r
  r   r   r   r   r   r   r   r   r   )
r   r   r   	obj_namesr  ndimsr   obj_namer  r   s
           @rX   r   ShapeEquivSet.is_equiv  s     4y1}}156A__Q'	6 )5	1"WQ		5y>Q)23U3Qx,e,,,%%*;BB4HItA1:;Xa[E;6>>   75 4 <s   D	D
D
!DDc                 r   > U R                  U5      n[        U5      S:w  a  g[        [        U ]  US   5      $ )zdIf the given object is equivalent to a constant scalar,
return the scalar value, or None otherwise.
r:   Nr   )r
  r{   r   r   r   r   r   r  r   s      rX   r   ShapeEquivSet.get_equiv_const  s7     $u:?]D9%(CCr[   c                     U R                  U5      n[        U5      S:w  a  gU R                  US   5      nU R                  R	                  U/ 5      nU/ :w  a  US   $ S$ )zdIf the given object is equivalent to some defined variable,
return the variable, or None otherwise.
r:   Nr   )r
  r{   r   r   r   )r   r   r  r   vss        rX   get_equiv_varShapeEquivSet.get_equiv_var  s]     $u:?mmE!H%__  b)br!u*d*r[   c                 r   > U R                  U5      n[        U5      S:w  a  g[        [        U ]  US   5      $ )r   r:   Nr   )r
  r{   r   r   r   r!  s      rX   r   ShapeEquivSet.get_equiv_set  s7     $u:?]D7aAAr[   c                   > / nU H2  nX0R                   ;   d  M  UR                  U R                   U   5        M4     / nSn[        5       n[        U5       H  nXpR                  ;   aT  U R                  U    HA  nUR
                  U;  d  M  UR                  U5        UR                  UR
                  5        MC     XpR                  ;   d  Mw  Ub   eU R                  U   nM     [        [        U ]+  U5        U R                   US      n	[        U5       H!  nXpR                  ;   d  M  U R                  U	 M#     X@R                  U	'   Ub  XPR                  U	'   gg)zCOverload EquivSet._insert to manage ind_to_var dictionary.
        Nr   )r   r   r   sortedr   r  rE   r   r   r   r   )r   r   r   r   varlistconstvalr  r   r   new_indr   s             rX   r   ShapeEquivSet._insert   s0    Coo%DOOC01  AOO#+AFFeOq)		!&&) , %%%''',,Q/  	mT*40//$q'*TAOO#OOA&  $+ )1g&  r[   c                 V  >^ [        U5      S:  d   eU Vs/ s H  o R                  U5      PM     nnU Vs/ s H  o"S:w  d  M
  UPM     nn[        U5      S::  a  g[        U Vs/ s H  n[        U5      PM     sn/ 5      nU Vs/ s H  n[        U5      PM     nnUS   m[	        U4S jU 5       5      (       d   SR                  U5      5       e/ n/ nU H  n[        U[        5      (       d  U4nU H  n	[        U	[        R                  5      (       aN  U	R                  U;  a>  U	R                  U R                  ;   a  UR                  SU	5        OUR                  U	5        [        U	[        R                  5      (       d  M  U	R                  U;  d  M  UR                  U	R                  5        M     M     U H  nUR                  n
X;   d  M  XR                   ;  d  M'  U
/U R"                  U R$                  '   U R$                  U R                   U
'   U/U R&                  U R$                  '   U =R$                  S-  sl        M     U H{  nX;   d  M
  XR                   ;  d  M  U/U R"                  U R$                  '   U R$                  U R                   U'   XR(                  U R$                  '   U =R$                  S-  sl        M}     Sn[+        T5       H3  nU Vs/ s H  oU   PM	     nn[,        [.        U ]b  " U6 nU=(       d    UnM5     U$ s  snf s  snf s  snf s  snf s  snf )zOverload EquivSet.insert_equiv to handle Numba IR variables and
constants. Input objs are either variable or constant, and at least
one of them must be variable.
r:   re   Nr   c              3   .   >#    U  H
  nTU:H  v   M     g 7fri   re   r  s     rX   ro   -ShapeEquivSet.insert_equiv.<locals>.<genexpr>)  s      
$!DAIur  zDimension mismatch for {}F)r{   r
  sumlistr   r   r\   r   r   r  r  r   insertr   r  r  r   r   r   r   r   r   r   r   r   )r   r   r   r  r  r  r+  	constlistr   varr  constsome_changer   r  ie_resr  r   s                   @rX   r   ShapeEquivSet.insert_equiv  s   
 4y1}}156A__Q'	6 )5	1"WQ		5y>Qi0iT!Wi0"5!*+AQ+Qx 
$
 
 
 	4&--d3	4 
 	Cc5))fc266**CHH4Gxx499,q#.s+c288,,cii96L$$SYY/   C88D}doo&=26.(,%25."  E~u'?27.)-&38!!$--0"  tA1:;Xa[E;=$<eDF%/K 
 c 75 1+P <s"   L	LL&LL! L&c                 (    U R                  U5      SL$ )zEReturn true if the shape of the given variable is available.
        N)	get_shaper   r  s     rX   	has_shapeShapeEquivSet.has_shapeU  s     ~~d#4//r[   c                 .    [        U R                  U5      $ )zdReturn a tuple of variables that corresponds to the shape
of the given array, or None if not found.
)r   
_get_shaper=  s     rX   r<  ShapeEquivSet.get_shapeZ  s     T__d++r[   c                 ^   U R                  U5      n[        US:g  5        / nU H|  n[        X@R                  ;   5        U R                  U   nU/ :w  a  UR                  US   5        ME  [        X@R                  ;   5        U R                  U   nUR                  U5        M~     [        U5      $ )ztReturn a tuple of variables that corresponds to the shape
of the given array, or raise GuardException if not found.
re   r   )get_shape_classesr   r   r   r   r   )r   r  r   ru   r   r$  s         rX   rA  ShapeEquivSet._get_shape`  s     %%d+
AA()#BRxRU#.../&&q)R   U|r[   c                   ^  [        U[        R                  5      (       a  UR                  nUT R                  ;   a  T R                  U   OSn[        U[
        R                  [
        R                  [
        R                  45      (       d  / $ [        U[
        R                  5      (       a  UR                  S:X  a  / $ T R                  U5      n[        U 4S jU 5       5      nU$ )zInstead of the shape tuple, return tuple of int, where
each int is the corresponding class index of the size object.
Unknown shapes are given class index -1. Return empty tuple
if the input name is a scalar variable.
Nr   c              3   F   >#    U  H  nTR                  U5      v   M     g 7fri   r   )rm   r  r   s     rX   ro   2ShapeEquivSet.get_shape_classes.<locals>.<genexpr>  s     ;UTT]]4((Ur   )r\   r   r  r  r   r   rk   rl   rj   r  r
  r   )r   r  r  r  r   s   `    rX   rD  ShapeEquivSet.get_shape_classesr  s     dBFF##99D$(DLL$8dll4 ds%2G2G   Ic50011chh!mI%;U;;r[   c                 L  > [         [        U ]  U5      n0 nUR                  R	                  5        H  u  pE[        U5      S:  d   eUS   nX`R                  ;   d   eXaR                  ;   d   eU R                  U   nUR                  U   nXpR                  ;   d   eXR                  ;   d   e/ n	UR                  U    V
s/ s H  oR                  PM     nn
U R                  U    H&  n
U
R                  U;   d  M  U	R                  U
5        M(     XU'   M     X2l        U$ s  sn
f )z<Overload the intersect method to handle ind_to_var.
        r   )
r   r   r   r   itemsr{   r   r   r  r   )r   r   newsetr   r   r   r   jkr+  r   r  r   s               rX   r   ShapeEquivSet.intersect  s    }d5i@
((..0GAt9q= =q'C//))).....$A$$S)A''',,,,,G%.%9%9!%<=%<VV%<E=__Q'66U?NN1% ( $qM 1 ' >s   D!c                    [        U[        R                  5      (       a  UR                  nXR                  ;   Ga~  U R                  U==   S-  ss'   [        U R                  U5      5      nU GHE  nX@R                  ;   d  M  UR                  U5        U R                  U   nU R                  U	 U R                  U   R                  U5        U R                  U   / :X  a  U R                  U	 XPR                  ;   d   eU R                  U    Vs/ s H  ofR                  PM     nnX;   d  M  UR                  U5      nU R                  U   U	 U R                  U   / :X  d  M  U R                  U	 XPR                  ;   d  GM  U R                  U    H  n	U R                  U		 M     U R                  U	 GMH     gSU R                  U'   gs  snf )aU  Increment the internal count of how many times a variable is being
defined. Most variables in Numba IR are SSA, i.e., defined only once,
but not all of them. When a variable is being re-defined, it must
be removed from the equivalence relation and added to the redefined
set but only if that redefinition is not known to have the same
equivalence classes. Those variables redefined are removed from all
the blocks' equivalence sets later.

Arrays passed to define() use their whole name but these do not
appear in the equivalence sets since they are stored there per
dimension. Calling _get_names() here converts array names to
dimensional names.

This function would previously invalidate if there were any multiple
definitions of a variable.  However, we realized that this behavior
is overly restrictive.  You need only invalidate on multiple
definitions if they are not known to be equivalent. So, the
equivalence insertion functions now return True if some change was
made (meaning the definition was not equivalent) and False
otherwise. If no change was made, then define() need not be
called. For no change to have been made, the variable must
already be present. If the new definition of the var has the
case where lhs and rhs are in the same equivalence class then
again, no change will be made and define() need not be called
or the variable invalidated.
r:   N)r\   r   r  r  r   r3  r
  r   rE   r   remover   index)
r   r  	redefinedname_resone_namer   r   r  rM  r   s
             rX   defineShapeEquivSet.define  s~   6 dBFF##99D99IIdOq ODOOD12H$ .MM  1A1OOA&--h7q)R/ OOA.///-1__Q-?@-?VV-?E@}!KK- OOA.q1??1-3 $ 2 OO3+/??1+=C(,(< ,>$(OOA$61 %4  DIIdO As   G
c                 h    UR                  5        H  u  p4US:  d  M  U R                  X25        M      g)zUnion with the given defs dictionary. This is meant to handle
branch join-point, where a variable may have been defined in more
than one branches.
r   N)rK  rV  )r   r   rS  rN  r   s        rX   
union_defsShapeEquivSet.union_defs  s)    
 JJLDA1uA) !r[   )r   r   r   r   )NNNNr   N)r   r   r   r   r   r   r   r   r   r
  r   r   r%  r   r   r   r>  r<  rA  rD  r   rV  rY  r   __classcell__r   s   @rX   r   r   h  s     M8/



)V*D	+B287r0
,$,.: x* *r[   r   c                      ^  \ rS rSrSr        SU 4S jjrS rS rS rS r	SU 4S jjr
SU 4S	 jjrU 4S
 jrS rU 4S jrSrU =r$ )SymbolicEquivSeti  a  Just like ShapeEquivSet, except that it also reasons about variable
equivalence symbolically by using their arithmetic definitions.
The goal is to automatically derive the equivalence of array ranges
(slicing). For instance, a[1:m] and a[0:m-1] shall be considered
size-equivalence.
c
                    > U(       a  UO0 U l         U(       a  UO0 U l        U(       a  UO0 U l        0 U l        0 U l        [
        [        U ]  XXgX5        g)zCreate a new SymbolicEquivSet object, where typemap is a dictionary
that maps variable names to their types, and it will not be modified.
Optional keyword arguments are for internal use only.
N)def_byref_by
ext_shapesrel_mapwrap_mapr   r^  r   )r   r   r`  ra  rb  r   r   r   r   r   r   s             rX   r   SymbolicEquivSet.__init__  sS    & !'fB
 !'fB )3*
  .::	
r[   c                 ,    [        U R                  5      $ )z*Return an empty SymbolicEquivSet.
        )r^  r   r   s    rX   r   SymbolicEquivSet.empty  s      --r[   c                     SR                  U R                  U R                  U R                  U R                  U R
                  5      $ )NzHSymbolicEquivSet({}, ind_to_var={}, def_by={}, ref_by={}, ext_shapes={}))r   r   r   r`  ra  rb  r   s    rX   r   SymbolicEquivSet.__repr__   s9    ((.)		
r[   c                    [        U R                  [        R                  " U R                  5      [        R                  " U R                  5      [        R                  " U R
                  5      [        R                  " U R                  5      [        R                  " U R                  5      [        R                  " U R                  5      [        R                  " U R                  5      U R                  S9	$ )r   )r`  ra  rb  r   r   r   r   r   )r^  r   r   r`  ra  rb  r   r   r   r   r   r   r   s    rX   r   SymbolicEquivSet.clone,  s      LL99T[[)99T[[)yy1499%yy1}}T__5}}T__5MM

 
	
r[   c                 .    [        U R                  U5      $ )zZRetrieve a definition pair for the given variable,
or return None if it is not available.
)r   _get_or_set_relr=  s     rX   get_relSymbolicEquivSet.get_rel;  s     T))400r[   c                 P  >^ ^^ [        U[        R                  5      (       a  UR                  n[	        T R
                  R                  US5      S:H  5        UT R                  ;   a  T R                  U   $ [	        USL5        S mUU4S jm[        X!5      nUS4n[        U[        R                  5      (       GaR  UR                  S:X  a  [        X#T R                  S9u  pVUS:X  a  US	:X  a  [        U 4S
 jUR                   5       5      nSU;   a  gT R                  R                  U/ 5      nUR!                  U5        [#        U5      S:  a  T R%                  U5        UT R                  U'   OUR                  S:X  a  T R'                  UR(                  U5      n	T R'                  UR*                  U5      n
U	b  U
c  gUR,                  [.        R0                  :X  a	  T" X5      nOqUR,                  [.        R2                  :X  a  T" X5      nOJ[        U[        R4                  5      (       a+  [        UR6                  [8        5      (       a  UR6                  n[	        USL5        UT R                  U'   [        U[8        5      (       d(  [        U[        5      (       Ga   US   U:w  d	  US   S:w  a  [        U[        5      (       a  Uu  pUT R:                  ;  a  / T R:                  U'   T R:                  U   R!                  X* 45        T R=                  U5      nUS:  a  T R>                  U   n/ nU HF  nUT R:                  ;   d  M  UT R:                  U    VVs/ s H  u  nnUU* :X  d  M  UPM     snn-  nMH     [#        U5      S:  a  [@        [B        T ]K  U5        U$ s  snnf )zRetrieve a definition pair for the given variable,
and if it is not already available, try to look it up
in the given func_ir, and remember it for future use.
r   r:   Nc                     [        U [        5      n[        U[        5      nU(       a  U(       a  X-   $ Uu  pEX@U-   4$ U u  pEU(       a  XAU-   4$ g ri   r\   r   )r   y
x_is_const
y_is_constr6  offsets         rX   plus.SymbolicEquivSet._get_or_set_rel.<locals>.plusN  sU    '3/
'3/
! u() #Z00$%MS! #Z00#r[   c                    > [        U[        5      (       a	  T" X* 5      $ [        U [        5      (       a0  [        U[        5      (       a  U S   US   :X  a  T" U S   US   5      $ g Nr   r:   )r\   r   r   )r   rs  minusrw  s     rX   r{  /SymbolicEquivSet._get_or_set_rel.<locals>.minus^  s]    a%%2;&q%(("1e,,!! 1qt,,r[   callr   rb   znumba.parfors.array_analysisc              3   p   >#    U  H+  nTR                   R                  UR                  S 5      v   M-     g7f)r   N)r   r   r  r   s     rX   ro   3SymbolicEquivSet._get_or_set_rel.<locals>.<genexpr>u  s,      &ENDOO//;;Ys   36r   binop)"r\   r   r  r  r   r   r   r`  r   Expropr   r   r   rI   rb  r   r{   r   rm  lhsrhsfnoperatorrE   subr  r  r   ra  r   r   r   r^  )r   r  func_irexprr  fnamemod_namerR  r  r  r  r6  rv  r   r   r   r   r   r{  rw  r   s   `                 @@rX   rm   SymbolicEquivSet._get_or_set_relA  s   
 dBFF##99D		dA&!+,4;;;;t$$G4'($ 
  "'0D1IE$((77f$&3t||'OE -$(FF % &EIYY& ! ;#' $ 3 3E2 >T*u:> LL/16.WW'..txxAC..txxAC {ck#HLL0 $SHLL0 %cD"((++
4::s0K0K

E%& %DKK%%%5%((1X%qQ eU++$)MS4;;.+-C(KK$++T7O<--,Cax#s3 "#'C"dkk1 %26++c2B*"2BA'(VG| %&2B*" !" $( u:>!"2DA%HL*"s   N"
.N"
c                   > [        U[        R                  5      (       a  UR                  nOUn[        [
        U ]  XR5        U(       Ga  U R                  R                  US5      S:X  a  [        U[        R                  5      (       a  [        U R                  XS5      n[        U[        5      (       a  U R                  XV/5        [        U[        R                  5      (       a|  U R                  U5      nXpR                   ;  a  U/U R                   U'   XpR"                  U'   XpR$                  ;   a  U R$                  U   R'                  U5        gU/U R$                  U'   gggg)a6  Besides incrementing the definition count of the given variable
name, it will also retrieve and simplify its definition from func_ir,
and remember the result for later equivalence comparison. Supported
operations are:
  1. arithmetic plus and minus with constants
  2. wrap_index (relative to some given size)
r   r:   TN)r\   r   r  r  r   r^  rV  r   r   r   Numberr   rm  r   r   r   r   r   r   r   )	r   r6  rS  r  r  r  r  r   r   s	           rX   rV  SymbolicEquivSet.define  s    c266""88DD,T=		dA&!+3--$..>E%%%d]+#rvv&&**40.,06DOOC(,/OOD)//)OOC(//4  -05DOOC( . , r[   c                   > [        5       n[        5       nU HV  nU R                  U5      nUS:X  a  UR                  U5        M-  XR;  d  M4  UR                  U5        UR                  U5        MX     [        U5      S::  a  g[	        U5      n[
        [        U ]  U5        U R                  U R                  US   5         n0 nS nU H  nX@R                  ;   a  U R                  U   n[        U[        5      (       a^  Uu  pU" Xj* 5      R                  U	5        XR                  ;   a3  U R                  U	    H   u  pU" XjU-   * 5      R                  U5        M"     X@R                  ;   d  M  U R                  U    H  u  pU" Xj5      R                  U	5        M     M     UR                  5        H  nU R                  U5        M     g)zOverload _insert method to handle ind changes between relative
objects.  Returns True if some change is made, false otherwise.
r   r:   Fr   c                 (    X;   a  X   nU$ / nX U'   U$ ri   re   )drN  r   s      rX   
get_or_set,SymbolicEquivSet._insert.<locals>.get_or_set  s(    vD H !Hr[   T)r   r   rE   r{   r3  r   r^  r   r   r`  r\   r   r   ra  r   )r   r   indsetuniqsr   r   offset_dictr  r  r  rv  r   r   r  r   s                 rX   r   SymbolicEquivSet._insert  s    C--$Cby		#m		#

3  u:?U-e4t}}U1X67 	 Ckk!C(eU++%*NT{G4;;DA{{*&*kk$&7FQ&{qjMBII!L '8kk!&*kk#&6NT{3::4@ '7  !'')ELL *r[   c                     [        U[        R                  [        R                  45      (       d   eX R                  U'   g)z-remember shapes of SetItem IR nodes.
        N)r\   r   StaticSetItemSetItemrb  )r   r   ru   s      rX   set_shape_setitem"SymbolicEquivSet.set_shape_setitem  s2     # 0 0"**=>>>>$r[   c                   > [        U[        R                  [        R                  45      (       a&  [	        XR
                  ;   5        U R
                  U   $ [        U[        R                  5      (       d   eU R                  UR                     n[        U[        R                  5      (       a  U4$ [        [        U ]7  U5      $ )zGOverload _get_shape to retrieve the shape of SetItem IR nodes.
        )r\   r   r  r  r   rb  r  r   r  r   rl   r   r^  rA  )r   r   r  r   s      rX   rA  SymbolicEquivSet._get_shape  s     cB,,bjj9::C??*+??3''c266****,,sxx(C#u//v-t?DDr[   )r`  rb  ra  rc  rd  )NNNNNNNr   ri   NN)r   r   r   r   r   r   r   r   r   rn  rm  rV  r   r  rA  r   r[  r\  s   @rX   r^  r^    s`     +
Z.



1kZB,\%E Er[   r^  c                       \ rS rSrSrS rSrg)WrapIndexMetai  an  
Array analysis should be able to analyze all the function
calls that it adds to the IR.  That way, array analysis can
be run as often as needed and you should get the same
equivalencies.  One modification to the IR that array analysis
makes is the insertion of wrap_index calls.  Thus, repeated
array analysis passes should be able to analyze these wrap_index
calls.  The difficulty of these calls is that the equivalence
class of the left-hand side of the assignment is not present in
the arguments to wrap_index in the right-hand side.  Instead,
the equivalence class of the wrap_index output is a combination
of the wrap_index args.  The important thing to
note is that if the equivalence classes of the slice size
and the dimension's size are the same for two wrap index
calls then we can be assured of the answer being the same.
So, we maintain the wrap_map dict that maps from a tuple
of equivalence class ids for the slice and dimension size
to some new equivalence class id for the output size.
However, when we are analyzing the first such wrap_index
call we don't have a variable there to associate to the
size since we're in the process of analyzing the instruction
that creates that mapping.  So, instead we return an object
of this special class and analyze_inst will establish the
connection between a tuple of the parts of this object
below and the left-hand side variable.
c                     Xl         X l        g ri   )
slice_sizedim_size)r   r  r  s      rX   r   WrapIndexMeta.__init__/  s    $ r[   )r  r  N)r   r   r   r   r   r   r   re   r[   rX   r  r    s    6!r[   r  c                   p   \ rS rSrSr S rS rS rSdS jrS r	S	 r
S
 rS rS r " S S\5      rS rS rS rS rS r SeS jrS rS rS rS rS rS rS rS rS rS rS r S  r!S! r"S" r#S# r$S$ r%S% r&S& r'S' r(S( r)S) r*S* r+S+ r,S, r-S- r.S. r/S/ r0S0 r1S1 r2S2 r3S3 r4S4 r5S5 r6S6 r7S7 r8S8 r9S9 r:S: r;S; r<S< r=S= r>S> r?S? r@S@ rASA rBSB rCSC rDSD rESE rFSF rGSG rHSH rISI rJSJ rKSK rLSL rMSM rNSN rOSO rPSP rQSQ rRSR rSSS rTST rUSU rVSV rWSW rXSX rYSY rZSZ r[S[ r\S\ r]SfS] jr^SfS^ jr_S_ r`S` raSa rbSb rcScrdg)gArrayAnalysisi4  r   c                 z    Xl         X l        X0l        X@l        0 U l        0 U l        0 U l        0 U l        0 U l        g ri   )	rF   r  r   	calltypes
equiv_setsarray_attr_callsobject_attrsprependspruned_predecessors)r   rF   r  r   r  s        rX   r   ArrayAnalysis.__init__>  s>    "  "#% r[   c                      U R                   U   $ )zAReturn the equiv_set object of an block given its label.
        )r  )r   block_labels     rX   r   ArrayAnalysis.get_equiv_setO  s     {++r[   c                     [        5       nU H6  nU R                   H#  nU R                  U   nUR                  X25        M%     M8     g)zTake a set of variables in redefineds and go through all
the currently existing equivalence sets (created in topo order)
and remove that variable from all of them since it is multiply
defined within the function.
N)r   r  rV  )r   
redefinedsunusedr   eslabeless         rX   remove_redefinedsArrayAnalysis.remove_redefinedsT  s=     A??__W-		!$ + r[   Nc                 F   Uc  U R                   R                  n[        U R                   R                  5      U R                   l        Uc  [	        U R
                  5      nOUn[        UU R                   R                  U R
                  U R                   5      u  U l        U l	        [        R                  n[        =R                  S-  sl        [        R                  S:  a  [        SU5        [        U R                   SU5        [        R                  S:  aC  [        S[!        U R
                  R#                  5       5      5        [        SU R$                  5        ['        U5      n[)        XS9nU R+                  XaXS5        [        R                  S:  aS  U R-                  5         [        S[!        U R
                  R#                  5       5      5        [        S	U R$                  5        [        U R                   S
U5        [        R                  S:  a  [        SU5        gg)zqrun array shape analysis on the given IR blocks, resulting in
modified IR and finalized EquivSet for each block.
Nr:   zStarting ArrayAnalysis:zbefore array analysiszArrayAnalysis variable types: zArrayAnalysis call types: )cfgz#ArrayAnalysis post variable types: zArrayAnalysis post call types: zafter array analysiszEnding ArrayAnalysis:)r  blocksr   _definitionsr^  r   r   	arg_names	alias_maparg_aliasesr  aa_countr   r   r   r
   r*  rK  r  r   r	   _run_on_blocksdump)r   r  r   init_equiv_setaa_count_saver  
topo_orders          rX   runArrayAnalysis.run`  s    >\\((F$5dll6I6I$J!-dll;N&N+ALL""LLLL	,
(( &..!#!!Q&+];t||%<fE!!Q&0&9K9K9M2N .?%f-$V5
JD!!Q&IIK5t||))+, 3T^^Dt||%;VD!!Q&)=9 'r[   c                     U HW  n[         R                  S:  a  [        SU5        X%   nUR                  nU R	                  X6XWU5      nU R                  Xh5        MY     g )Nr   zProcessing block:)r   r   r   scope_determine_transform_combine_to_new_block)	r   r  r  r  r  labelblockr  pending_transformss	            rX   r  ArrayAnalysis._run_on_blocks  s]    E%%*)51MEKKE!%!:!:E." &&uA  r[   c                     / nU HK  u  pEnU H  nUR                  U5        M     UR                  U5        U H  nUR                  U5        M     MM     X1l        g)zGCombine the new instructions from previous pass into a new block
body.
N)r   body)r   r  r  new_bodyinstprepostinstrs           rX   r  #ArrayAnalysis._combine_to_new_block  sV     1ODt& OOD!& 	  2 
r[   c           	         SnUR                  U5      nX0R                  ;   a  U R                  U   nO/ n[        R                  S:  a  [	        SU5        U GH"  u  p[        R                  S:  a  [	        SX5        X;   a  M-  XR
                  ;   d  M>  U R
                  U	   R                  5       n[        R                  S:  a  [	        SU5        X4U R                  ;   aG  U R                  X4   nU H1  n[        5       nU R                  X4XU5        U R                  U5        M3     Uc  UnM  UR                  U5      n[        5       nUR                  UR                  U5        U R                  U5        GM%     Uc  UnX`R
                  U'   / nUR                   HW  n[        5       nU R                  X4XmU5      u  nn[        U5      S:  a  U R                  U5        UR!                  UUU45        MY     U$ )zGDetermine the transformation for each instruction in the block
        Nr   zpreds:zp, q:zp in equiv_setsr   )predecessorsr  r   r   r   r  r   r  r   _analyze_instr  r   rY  r   r  r{   r   )r   r  r  r  r  r  r   predsprunedpqfrom_setinstrsr  rS  r  r  r  s                     rX   r  "ArrayAnalysis._determine_transform  s    	  ',,,--e4FF !!Q&(E"FQ%%*gq${OO#??1-335))Q.+X6:.!]]A:6F &$'E	**!() ..y9 !' $ (I ) 3 3H =I #I((	B **95; @ &I!*  JJDI**iyIC
 9~!&&y1%%tS$&78  "!r[   c                 0    [        SU R                  5        g)z@dump per-block equivalence sets for debugging purposes.
        zArray Analysis: N)r   r  r   s    rX   r  ArrayAnalysis.dump  s     	 $//2r[   c                     X0R                   UR                  '   U/U R                  R                  UR                  '   [	        5       nUR                  X%U R                  U5        g ri   )r   r  r  r  r   rV  )r   r   r6  r  r  r  s         rX   _defineArrayAnalysis._define  sI    !$SXX/4g!!#((+U
$,,<r[   c                       \ rS rSrS rSrg)ArrayAnalysis.AnalyzeResulti  c                     Xl         g ri   kwargs)r   r  s     rX   r   $ArrayAnalysis.AnalyzeResult.__init__  s     Kr[   r  N)r   r   r   r   r   r   re   r[   rX   AnalyzeResultr    s    	!r[   r  c           
        ^ ^^^^^&^' / n/ n[         R                  S:  a  [        ST5        [        T[        R
                  5      (       Ga  TR                  nT R                  UR                     n	S n
[        U	[        R                  5      (       a  U	R                  S:X  a  Sn
GO[        TR                  [        R                  5      (       a  T R                  TTTR                  U5      nU(       a  [        [        U[         R"                  5      5        SUR$                  ;   a  UR$                  S   n
SUR$                  ;   a  UR'                  UR$                  S   5        SUR$                  ;   a  UR'                  UR$                  S   5        SUR$                  ;   a  UR$                  S   Tl        GO[        TR                  [        R(                  [        R*                  45      (       a  TR                  n
GO[        TR                  [        R,                  5      (       a`  TR                  R                  n[        U[.        5      (       a  [1        S	 U 5       5      (       a  Un
GO*[        U[2        5      (       a  U4n
GO[        TR                  [        R4                  5      (       a  [        U	[        R6                  R8                  5      (       a6  [        U	R:                  [        R<                  5      (       a  TR                  n
O[        U	[        R6                  R>                  5      (       a_  [1        U	R                   Vs/ s H-  n[        U[        R<                  [        R@                  45      PM/     sn5      (       a  TR                  n
[        U
[        R*                  5      (       aq  [        U
R                  [.        5      (       a,  U
RB                  m'[/        U'4S
 jU
R                   5       5      n
O[        U
R                  [2        5      (       a  U
4n
OS n
O[        U
[        R(                  5      (       a:  [        T R                  U
R                     [        R<                  5      (       a  U
4n
O|[        U
[D        5      (       ag   TRG                  XT RH                  U	5        TRK                  UR                  5      nUS:w  a%  UTRL                  U
RN                  U
RP                  4'   Xg4$ [        U	[        R                  5      (       a  U
ba  [        U
[        R(                  5      (       aB  [        T R                  U
R                     [        R6                  RR                  5      (       a  GOrU
bJ  [        U
[.        5      (       d5  [        U
[        R(                  5      (       a3  TRU                  U
5      (       d  T RW                  TXR                  X5      n
GO[        U	[        R8                  5      (       aN  U
(       aF  [        U	R:                  [        R<                  5      (       a  T RW                  TU[Y        U	5      X5      n
O[        U	[        R6                  R>                  5      (       ap  [1        U	R                   Vs/ s H-  n[        U[        R<                  [        R@                  45      PM/     sn5      (       a  T RW                  TU[Y        U	5      X5      n
 SnU
b  TR[                  X5      nU(       a  TRG                  XT RH                  U	5        Xg4$ [        T[        R\                  [        R^                  45      (       Ga3  [        T[        R^                  5      (       a  TR`                  OTRb                  n[e        T Rf                  TTTR                  U5      nU(       d  / / 4$ US   b;  [        T[        R\                  [        R^                  45      (       d   eUS   Tl0        US   nUR$                  S   nSUR$                  ;   a  UR$                  S   nTRi                  TR                  5      nUS:X  a  TRk                  TU5        U/ 4$ UGb  T R                  TR                  R                     n[        [        U[        R                  5      5        UR                  nUU/nTR                  R                  TR                  R                  /nT Rm                  TTTRB                  UU5      n[        SUR$                  ;   5        [        SUR$                  ;   5        UR$                  S   n
UR$                  S   n[Y        U
5      nUU:  d   eTRk                  TU
5        UU-   / 4$ U/ 4$ [        T[        Rn                  5      (       GaK  U&UUUUU 4S jnTRp                  m&[e        [r        T RH                  T&5      nU(       Gd7  TRu                  T&5      n/ nU H  n[        U[v        5      (       aq  UT R                  ;   aa  [e        [r        T RH                  USS9n[        U[        R(                  5      (       a  UR                  nU(       a  URy                  U5        M  M  URy                  U5        M     [{        [}        S U5      5      n [{        U5      R                  U 5      n![Y        U!5      S:X  a  [        U!5      S   nO6[Y        U 5      S:X  a'  [e        [r        T RH                  [        U 5      S   5      n[        U[        R                  5      (       a  UR                  S:X  a  U" U5        Xg4$ [        U[        R                  5      (       a  UR                  S:X  a  [e        [r        T RH                  UR                  5      n"U"b  U"R                  [        L a{  [Y        UR                  5      S:X  ab  [e        [r        T RH                  UR                  S   5      n#U#b7  [        U#[        R                  5      (       a  U#R                  S:X  a  U" U#5        Xg4$ [        U[        R*                  5      (       a  UR                  n[        U[2        5      (       d  [        U[        5      (       a`  U(       a  TR                  OTR                  n$U$T R                  ;   a!  T R                  U$   Ry                  T5        Xg4$ T/T R                  U$'   Xg4$ [        T5      [        ;   a)  [        [        T5         n%U%" TTT R                  T 5      u  pgXg4$ s  snf s  snf )Nr   zanalyze_inst:r   re   ru   r  r  r  c              3   B   #    U  H  n[        U[        5      v   M     g 7fri   rr  )rm   r   s     rX   ro   .ArrayAnalysis._analyze_inst.<locals>.<genexpr>  s     CFq
1c 2 2Fs   c              3   R   >#    U  H  n[         R                  " UT5      v   M     g 7fri   )r   r  )rm   r   locs     rX   ro   r  2  s     !HKq"((1c"2"2Ks   $'r   Tr:   c                   > S nU R                   [        R                  :X  a  TR                  nTR                  nSnO8U R                   [        R
                  :X  a  TR                  nTR                  nSnTR                  U R                  R                     nTR                  U R                  R                     nUGbD  [        U[        R                  5      (       a  [        U[        R                  5      (       d>  [        U[        R                  5      (       a  [        U[        R                  5      (       a  TR                  nU R                  U R                  4nTR                  TUT
U5      nUR!                  ["        R$                  " ["        R&                  " WU5      T	U5      5        UTR(                  TU4'   ["        R$                  " ["        R&                  " SU-
  U5      T	U5      /TR(                  TW4'   g g g g )Nr:   r   )r  r  eqtruebrfalsebrner   r  r  r  r\   r   r^   rk   r  _make_assert_equivr   r   Assignr  r  )cond_defbrotherbrcond_vallhs_typrhs_typr  rI   assertscond_varr   r  r  r  r   s            rX   handle_call_binop6ArrayAnalysis._analyze_inst.<locals>.handle_call_binop  s   ;;(++-B"llG H[[HKK/B"kkG H,,x||'8'89,,x||'8'89>"7EMM::&w>> #7EOO<<&w@@ ((C$LL(,,7D"55sItG NN		"((8S"98SI 29DMM5"+.		"((1x<"=xM7DMM5'"23 A = "r[   )lhs_onlyc                 "    [        U [        5      $ ri   )r\   r  )r   s    rX   <lambda>-ArrayAnalysis._analyze_inst.<locals>.<lambda>  s    z!S/Ar[   r  r}  )Jr   r   r   r\   r   r  targetr   r  r   rj   r  r  r  _analyze_exprr   r  r  r  extendr  r  Globalr   r   r   Arg
containersUniTupledtyper^   TupleIntegerLiteralr  r  rV  r  r   rd  r  r  rk   r>  _gen_shape_callr{   r   r  r  rR  	index_varr   _index_to_shaper<  r  _broadcast_assert_shapesBranchcondr   r   r  r   r   filter
differencer3  r  funcboolrI   r  r  r  r  array_analysis_extensions)(r   r  r  r   r  rS  r  r  r  r  ru   resultgvaluer   lhs_indneeds_definerR  target_shapevalue_shape
target_typtarget_ndimshapesr  broadcast_resultr  r   r  r  equivsr   r  var_defdefvars	defconsts	glbl_bool	condition	pruned_brr2   r  r  s(   `````                                 @@rX   r  ArrayAnalysis._analyze_inst  s=
   !!Q&/4(dBII&&++C,,sxx(CE#u4455#((a-DJJ00++E9djj#NJv}/J/JKL&--/ &g 6-

6==#78.FMM&$9:-%+]]5%9
DJJ(:;;

DJJ		22)) vu--CFCCC"E,,#IEDJJ//sE$4$4$=$=>>"399emm<< JJEsE$4$4$:$:;;!$,!*A ("]]E,@,@AC!*,  
 !JJE%**ekk511))C!!HEKK!HHES11"HE EE266**zUZZ(%--0 0 E=11   sC#,,SXX6b=   &&))5>>: y #u4455%"5"&&11"UZZ0%2B2B2L2L  M!%//"5"&&11 ) 3 3E : : !00!3%E C00Z		5==AA 00!3C%E 3 0 0 6 677 YY(& $A(<(<=?&(  
 ,,sCHe  L (55cA  sCH yG r//<==(rzz::

  $$eYUF 2vay$!$)9)92::(FGGGG#AY
AYF!==1L%mmE*#--djj9Kb ++D,?Bw(!\\$++*:*:;

:u/D/DEF(oo&4))4::??;#'#@#@9dhh$  #3#:#::;!1!8!889(//8*11%8J"a'''++D%8W}b((Bwbii((! !F yyH^T\\8DH"00:"D!$,,1E"'*DLL$# &grvv66&-llG" KK0 # D) # f%A4HII009	y>Q&#Iq1H\Q&$&d7mA6F H (BGG,,1G!(+8 y7 Hbgg..8;;&3H!.$,,N	(Y__-D8==)Q.$).$,,*2--*:%<	%1&y"'':: ) 7-i8" y h11'~~Hh,,
8T0J0J08dkkI D$<$<<00;BB5I y @Eg00; y $Z44)$t*5A$	4<<>ICy{,|(s   4t=4uc                     SR                  UR                  5      n [        X5      n[	        XaX#U5      $ ! [         a     g f = f)Nz_analyze_op_{})r   r  getattrAttributeErrorr   )r   r  r   r  r  r  r  s          rX   r  ArrayAnalysis._analyze_expr  sJ     ''0	%B R	55  		s   5 
AAc                    UR                   S:X  aS  U R                  UR                  R                  5      (       a)  U R	                  XUR
                  UR                  /0 5      $ UR                   S:X  a.  UR                  UR                  5      n[        R                  US9$ UR                   S;   aG  U R                  UR                  R                  5      (       a  [        R                  UR                  S9$ U R                  UR                  5      (       a  [        UR                  R                  U R                  5      nXcR                   4U R                  ;   a+  [        R                  U R                  XcR                   4   S9$ U R                  UR                     n/ nU R                  X$UR                  S U5      nXPR                  XcR                   4'   [        R                  XXS9$ g )NTru   ru   )realimag)ru   r  )attr_isarrayr  r   _analyze_op_call_numpy_transposer  r<  r  r  r   r  r  r   r  r  )	r   r  r   r  r  ru   canonical_valuer  r  s	            rX   _analyze_op_getattr!ArrayAnalysis._analyze_op_getattr  s   99djjoo > >88$((TZZL"  YY'!''

3E ..U.;;YY**t}}TZZ__/M/M !..TZZ.@@]]388$$1

O  +t/@/@@$22++_ii,HI 3   ll388,,,CHHdD CH!!?II">?$222JJr[   c                 <    [         R                  UR                  S9$ Nr8  )r  r  r  r   r  r   r  r  s        rX   _analyze_op_castArrayAnalysis._analyze_op_cast/  s    ***<<r[   c                 (   UR                   nU R                  UR                     n[        U[        R
                  5      (       aN  [        [        U5      UR                  :H  5        [        UR                  U5      5        [        R                  US9$ g rB  )r  r   r  r\   r   rk   r   r{   countr>  r  r  )r   r  r   r  r  r6  r  s          rX   _analyze_op_exhaust_iter&ArrayAnalysis._analyze_op_exhaust_iter2  sm    jjll388$c5??++CH

*+I'',- ..S.99r[   c                    [         R                  " U[        U5      U5      n[         R                  " X5      n[        R
                  " U5      n	UR                  [         R                  " UUUS95        U R                  UUU	U5        Xy4$ )Nr  r  r  )	r   r  r   r  r   r  r   r  r  )
r   arg_valr  r  stmtsr   r  static_literal_slice_part_varstatic_literal_slice_part_valstatic_literal_slice_part_typs
             rX   gen_literal_slice_part$ArrayAnalysis.gen_literal_slice_part;  s     )+umD6I3(O%(*(>%(-(<(<W(E%II34	
 	)))		
 -KKr[   c           	      4    U R                  X!-
  UUUUSS9tpxU$ )Nstatic_slice_size)r  )rQ  )	r   lhs_relrhs_relr  r  rM  r   the_var_s	            rX   gen_static_slice_size#ArrayAnalysis.gen_static_slice_sizeX  s7     11$ 2 
 r[   c
                    [        U[        5      (       a   e[        R                  " U[	        S5      U5      n
[        R
                  R                  [        R                  XqUS9n[        R                  n[        XU5      U R                  U'   UR                  [        R                  " XUS95        U R                  XX5        X4$ )Nexplicit_negr  rK  )r\   r   r   r  r   r  r  r  rE   r   r_   r   r  r   r  r  )r   argarg_relarg_typsize_typr  r  dsizerM  r   explicit_neg_varexplicit_neg_valexplicit_neg_typs                rX   gen_explicit_negArrayAnalysis.gen_explicit_nege  s     h,,,,66%~)FL77==us=K !::+4,
'( 	II,3O	
 	)9	
  11r[   c                 
   Sn[        U[        5      (       Gad  US:X  a  SnGOZ[        U[        5      (       a  Sn[        X45      nX:w  a  [        R                  S:  a  [        S5        SnU R                  XXU5      u  nnUS:X  d  US:X  d   eUS:X  a  UUR                  S   4Ul        OUR                  S   U4Ul        UR                  U   nUnUR                  U5      nOUS:  a  Sn[        R                  S:  a  [        S5        U R                  UUUUUU	UU
U5	      u  nnUS:X  a  UUR                  S   4Ul        OUR                  S   U4Ul        UR                  U   nUnUR                  U5      nUUUUUU4$ )NFr   Tr   z.Replacing slice to hard-code known slice size.r:   z,Replacing slice due to known negative index.)
r\   r   rf   r   r   r   rQ  rI   rn  rf  )r   r  r  rU  	dsize_relreplacement_sliceslice_indexneed_replacementr  r  rM  r   ra  rb  knownwilliteral_varliteral_typrc  re  s                       rX   update_replacement_slice&ArrayAnalysis.update_replacement_slice  s   $ gs## !|Is++(< >--2NO'+$/3/J/J%	0,K '!+{a/???"a''-22152). .2215'2).
 ,00=C)G'//4G1#' ))Q.HI595J5J
62 "2 !#()..q1.%* *..q1(.%*
 (,,[9*#++C0
 	
r[   c                   ^ ^^^^-^.^/ UR                   m-[        T R                  U5      n[        T R                  UT R                  S9u  px[        US:H  =(       a    US;   5        [        [        UR                  5      S:H  5        UR                  S   n	UR                  S   n
T R                  TR                     nT R                  U	R                     nT R                  U
R                     n[        R                  S:  a#  [        SU ST S	U S
U	 SU
 SU SU SU 35        [        R                  " U5      nSn[        U[        R                   5      (       a  ["        R$                  " T['        S5      T-5      n["        R(                  " ST-5      nUR+                  ["        R,                  " UUT-S95        T R/                  TU[        R0                  " S5      U5        Un	[        R0                  " S5      nXR                  S   4Ul        Sn[        R                  S:  a  [        S5        [        U[        R                   5      (       a;  Tn
UnUR                  S   U
4Ul        Sn[        R                  S:  a  [        S5        TR3                  U	5      nTR3                  U
5      nTR3                  T5      n[        R                  S:  a  [        SUSUSU5        T R5                  U	UUUUSUT-TUTUT5      u  n	nnnnnT R5                  U
UUUUSUT-TUTUT5      u  n
nnnnn[        R                  S:  a  [        SU5        [        SU5        U(       d  SnO["        R$                  " T['        S5      T-5      n[        R6                  [        R6                  4nT R                  UR8                  R                     R;                  T R<                  U0 5      nUT R>                  U'   UR+                  ["        R,                  " UUT-S95        T R                  UR                     T R                  UR                  '   [        R                  S:  a  [        SSUSU5        U(       a>  U(       a7  [        R                  S:  a  [        S5        T RA                  UUT-TUT5      U4$ US:X  a<  [        U[B        5      (       a'  TRE                  TUS   5      (       a  US   S:X  a  TS4$ [        R6                  nUn["        R$                  " T['        S5      T-5      n["        RF                  RI                  [J        RL                  XT-S9n[O        UX5      T R>                  U'   T R/                  TUUU5        TR3                  U5      n[        R                  S:  a  [        SU[Q        U5      5        ["        R$                  " T['        S 5      T-5      m/["        RR                  " S![T        T-S9n[W        [T        5      n T R<                  RY                  U UU40 5      m.T R/                  TT/U U5        UUU-UU U.U/4S" jn!U!" XU5      u  n"n#n$U!" XU5      u  n%n&n'UR+                  ["        R,                  " UUT-S95        UR+                  ["        R,                  " UT/T-S95        U$b%  UR+                  ["        R,                  " U$U"T-S95        U'b%  UR+                  ["        R,                  " U'U%T-S95        ["        R$                  " T['        S#5      T-5      n(["        RF                  RI                  [J        RL                  U%U"T-S9n)[O        UU&U#5      T R>                  U)'   T R/                  TU(UU)5        UR+                  ["        R,                  " U)U(T-S95        [        U[B        5      (       a  [        R                  S:  a  [        S$TRZ                  5        Sn*TRZ                  R]                  5        H5  u  n+n,U+S   US   :X  d  M  TRE                  U+S   US   5      (       d  M3  U,n*  O   U*bN  [        R                  S:  a  [        S%U*5        TR_                  UU*S   5        TR_                  U(U*S   5        U(U4$ UU(4TRZ                  U'   U(U4$ )&a  Reason about the size of a slice represented by the "index"
variable, and return a variable that has this size data, or
raise GuardException if it cannot reason about it.

The computation takes care of negative values used in the slice
with respect to the given dimensional size ("dsize").

Extra statements required to produce the result are appended
to parent function's stmts list.
r~  slicebuiltinsr   r   r:   zslice_size index=z dsize=z index_def=z lhs=z rhs=z
 size_typ=z	 lhs_typ=z	 rhs_typ=FrO   rK  Tz$Replacing slice because lhs is None.rU  rV  ri  z
lhs_known:z
rhs_known:Nrj  zafter rewriting negativesz'lhs and rhs known so return static sizer  r]  size_relwraprb   c                   > U(       d{  [         R                  " T	[        S5      T5      n[        R                  n[         R
                  R                  TU T/0 T5      nT
R                  TX4U5        TT
R                  U'   X4U4$ XS 4$ )Nr6  )	r   r  r   r   r_   r  r}  r  r  )r   val_typrm  r6  var_typ	new_valuerb  r   r  r  r   rH   wrap_vars         rX   gen_wrap_if_not_known7ArrayAnalysis.slice_size.<locals>.gen_wrap_if_not_known  sx    ffUM%$8#>**GGLLC<SI	 Yi@,/y)i00d++r[   post_wrap_slice_sizezsize_rel is tuplezestablishing equivalence to)0r  r   r  r   r   r   r{   rI   r  r   r   r   r   r   r\   r   r   r   r  r   r  r   r  r  r  rn  rq  r_   r  get_call_typerF   r  rY  r   r   r  r  r  r  r   r  r  rb   r   resolve_function_typerc  rK  r   )0r   rR  rb  r   r  rM  	index_defr  r  r  r  ra  r  r  rj  rl  zero_varrO   rU  rV  ri  	lhs_known	rhs_knownreplacement_slice_varnew_arg_typsrs_calltype	slice_typorig_slice_typsize_varsize_valrv  wrap_deffntyr}  var1var1_typvalue1var2var2_typvalue2post_wrap_size_varpost_wrap_size_valrel_map_entryrme	rme_tupler  rH   r|  s0   ` ```                                        @@@rX   r  ArrayAnalysis.slice_size  s    ii"4<<7	'LL)T\\
 	 =X*%=>INN#q()nnQnnQ<<

+,,sxx(,,sxx(!!Q&%eWGE7 ;(kse5 >&Zy	7)M N !MM)4  gu~~..vve]6%:C@H88As#DLLhCHILLHe.B.B1.EtLC**1-G&)+A+A!+D%E"#%%*<= gu~~..CG&7&<&<Q&?%E"#%%*<=##C(##C(%%e,	!!Q&7IwY ))
	
. ))
	
  !!Q&,	*,	*  $(! %'FF}%893%! "JJ

3L,,y~~':':;IIlBK 1<DNN,-LL		+0 8<||EJJ7ODLL.334!!Q&+ %%*?@**Wc5% &	  qL7E**""5'!*55
a$;JJ	"66%|!<cB77==sS=A#,Y#Ix Y)X>$$X.!!Q&*hX766%v!6<99\:3?":.ll00>8,b
 	Y$9	, 	, "7sY!Oh!6sY!OhRYYXhCHIRYYXhCHILL#FGLL#FGVV=!78#
  WW]]8<<+/+//2 + 4 .7x.
)* 	)96H	
 	II(1C	
 h&&%%*)9+<+<= M"+"3"3"9"9";Yq6Xa[(Y-?-?FHQK. . %.M #< ( ))Q.7G&&xq1AB&&'9=;KL "#888 089K.L	!!(+!#888r[   c                   ^ ^^^ T R                   UR                     n[        [        U[        R
                  5      5        T R                   UR                     nTR                  U5      nTR                  U5      n[        U[        R                  5      (       a  U4n	U4n
O^[        [        U[        R                  5      5        [        T R                  U5      u  p[        US:H  5        [        U 4S jU
 5       5      n	[        [        U5      [        U	5      s=:H  =(       a    [        U5      :H  Os  5        / mUUU U4S jn/ n/ nSn[        U	UUU
5       HO  u  nnnnU" UUU5      u  nnUR                  U5        Ub  SnUR                  U5        M>  UR                  U5        MQ     U(       a  [        U5      S:  a  [        R                   " T[#        S5      US	   R$                  5      n[        R&                  R)                  XS	   R$                  5      nTR                  [        R*                  " UUUS	   R$                  S
95        UT R                   UR                  '   OUS	   nOSn[        U5      n[        [-        S U 5       5      (       + 5        [        S U 5       5      nU[.        R1                  UTS94$ )aT  For indexing like var[index] (either write or read), see if
the index corresponds to a range/slice shape.
Returns a 2-tuple where the first item is either None or a ir.Var
to be used to replace the index variable in the outer getitem or
setitem instruction.  The second item is also a tuple returning
the shape and prepending instructions.
build_tuplec              3   V   >#    U  H  nTR                   UR                     v   M      g 7fri   )r   r  r   s     rX   ro   0ArrayAnalysis._index_to_shape.<locals>.<genexpr>  s     ?3aT\\!&&13s   &)c                    > [        U [        R                  5      (       a  TR                  XTTT5      $ [        U [        R                  5      (       a  g[        S5        g )Nr  F)r\   r   rl   r  r  r   )r  rR  rb  r   r  r   rM  s      rX   to_shape/ArrayAnalysis._index_to_shape.<locals>.to_shape  sF    #u//uYuMMC..! r[   FNTr:   replacement_build_tupler   rK  c              3   (   #    U  H  oS L v   M
     g 7fri   re   rm   r   s     rX   ro   r  ?  s     15aT	5s   c              3   .   #    U  H  oc  M  Uv   M     g 7fri   re   r  s     rX   ro   r  @  s     8Aaas   	ru   r  )r   r  r   r\   r   rj   rA  rl   rk   r   r  r   r{   r|   r   r   r  r   r  r  r  r  r   r  r  )r   r  r   r6  ind_varr  ind_typ	ind_shape	var_shapeseq_typsseqr  r  
shape_listindex_var_listreplace_indexrM   rb  orig_ind
shape_partindex_var_partreplacement_build_tuple_varnew_build_tupleru   rM  s   ```                     @rX   r  ArrayAnalysis._index_to_shape  su    ll388$
3 5 567,,w||,((1	((-	gu//zH*CJw89)$,,@GCB-'(?3??HI#h-AA3y>AB	 	 
,/090903-5(S$x
 *2#tU)C&Jj)
 ) $%%n5%%h/!-5( >"Q&.0ff!";<aL$$/+ #%''"5"5"aL$4$4# II-:%aL,, BI8==>.<Q.?+*.'j!C151112888+++%U+CE 	Er[   c                 z    U R                  XUR                  UR                  5      nUS   b
  US   Ul        US   $ rz  )r  r  rR  )r   r  r   r  r  r   s         rX   _analyze_op_getitem!ArrayAnalysis._analyze_op_getitemD  s=    %%e

DJJO!9 DJayr[   c                 v   UR                   nU R                  UR                     n[        U[        R
                  5      (       d<  U R                  XUR                   UR                  5      nUS   b
  US   Ul        US   $ UR                  U5      n[        UR                  [        5      (       a@  [        UR                  [        U5      :  5        [        R                  XR                     S9$ [        UR                  [        5      (       a  [        R                  XR                     S9$ [        S5        g )Nr   r:   r8  F)r  r   r  r\   r   rk   r  r  rA  rR  r   r   r{   r  r  rt  )	r   r  r   r  r  r6  r  r   ru   s	            rX   _analyze_op_static_getitem(ArrayAnalysis._analyze_op_static_getitemJ  s    jjll388$#u//))$**dnnF ay$!'!9$$S)djj#&&DJJU+, ..U::5F.GG

E** ..U::5F.GGr[   c                    [        UR                  [        ;   5        U R                  UR                  R
                  5      (       d  UR                  [        R                  :X  a  [        R                  UR                  S9$ g rB  )
r   r  UNARY_MAP_OPr<  r  r  r  rE   r  r  rC  s        rX   _analyze_op_unaryArrayAnalysis._analyze_op_unary\  sV    <'( ==))TWW-D ..TZZ.@@r[   c                     [        UR                  [        ;   5        U R                  XUR                  UR
                  UR                  /UR                  5      $ ri   )r   r  BINARY_MAP_OP_analyze_broadcastr  r  r  rC  s        rX   _analyze_op_binopArrayAnalysis._analyze_op_binopd  sD    =()&&dhh488(<dgg
 	
r[   c                     [        UR                  [        ;   5        U R                  XUR                  UR
                  UR                  /UR                  5      $ ri   )r   r  INPLACE_BINARY_MAP_OPr  r  r  r  rC  s        rX   _analyze_op_inplace_binop'ArrayAnalysis._analyze_op_inplace_binopj  sE    001&&dhh488(<dgg
 	
r[   c                 Z    U R                  XUR                  UR                  5       S 5      $ ri   )r  r  	list_varsrC  s        rX   _analyze_op_arrayexpr#ArrayAnalysis._analyze_op_arrayexprp  s)    &&dhh(8$
 	
r[   c           	         UR                    H  n[        U[        R                  5      (       d  M$  [        U R                  UR
                     [        R                  5      (       d  M\  U R                  UR
                     R                  S:  d  M    g    / nUR                    H4  n[        [        U R                  U5      nUb  UR                  U5        M4    Ox   [        U Vs/ s H#  n[        R                  " XSR                  5      PM%     sn5      n[         R#                  U[        R                  " [        U5      UR                  5      S9$ [         R#                  [        UR                   5      S9$ s  snf )Nr:   ru   r  r8  )rK  r\   r   r  r   r  r   rj   r  r   r   r  r   r   r  r  r  r  )	r   r  r   r  r  r   constsr6  outs	            rX   _analyze_op_build_tuple%ArrayAnalysis._analyze_op_build_tupleu  s   
 A1bff%%t||AFF3U5J5JKKLL(--1  ::Cj$,,4A}a   ?1!XX.?@C ..HHU6]DHH5 /  
 **tzz1B*CC @s   %*E8c           
         SSK Jn  UR                  n[        U R                  U5      n[        U[        R                  [        R                  45      (       a@  [        UR                  5      (       a&  [        R                  [        UR                  5      S9$ [        U[        R                  [        R                  45      (       ad  [        UR                  U5      (       aI  UR                  nU R                  UUUR                  UR                   U[#        UR$                  5      5      $ ['        U R                  X0R(                  S9u  pSn[        U
[        R*                  5      (       aK  [        U R(                  U
R,                     [.        R0                  5      (       a  U
/UR                  -   nSn
SnOUR                  nSR3                  X5      R5                  S	S
5      n	U	[6        ;   a  U R9                  XUR                   US 5      $  [;        X	5      n[?        UUUUR                   U[#        UR$                  5      S9nU(       a
  USS  Ul        U$ ! [<         a     g f = f)Nr   )StencilFuncr8  r~  FnumpyTz_analyze_op_call_{}_{}.rX  )r  r   r  rI   kwsr:   ) numba.stencils.stencilr  r  r   r  r\   r   r  FreeVarr   r  r  r  r   rI   _analyze_stencilr  dictr  r   r   r  r  r   rj   r   replaceUFUNC_MAP_OPr  r3  r4  r   )r   r  r   r  r  r  callee
callee_defrI   r  r  added_mod_namer  r   s                 rX   _analyze_op_callArrayAnalysis._analyze_op_call  s   6#DLL&9
BJJ/
 
!*"2"233 ..U4995E.FFj299bjj"9::zk@
 @
 99D((  TXX  (LL$
 h''JLL')>)>-
 -
 :		)DH!N99D(//@HH
 L **5+/88T4A AT) #HHNF  H	M! " s   I 
I#"I#c                    [        [        U5      S:H  5        US   nU R                  UR                     n[        [	        U[
        R                  5      5        UR                  U5      n[        R                  US   US   S9$ )Nr:   r   r  )
r   r{   r   r  r\   r   rj   rA  r  r  )	r   r  r   r  rI   r  r6  r  ru   s	            rX   _analyze_op_call_builtins_len+ArrayAnalysis._analyze_op_call_builtins_len  sp    D	Q1gll388$
3 5 567$$S)**quQx*HHr[   c                 (    UR                   " USS  6   g Nr:   )r   r   r  r   r  rI   r  s         rX   :_analyze_op_call_numba_parfors_array_analysis_assert_equivHArrayAnalysis._analyze_op_call_numba_parfors_array_analysis_assert_equiv  s     	QR)r[   c                    [        [        U5      S:H  5        US   R                  nUS   R                  nUR                  U5      nUR                  U5      n	X4UR                  ;   a[  UR                  X4   n
[        XR
                  ;   5        UR
                  U
   n[        U/ :g  5        [        R                  US   4S9$ [        R                  [        X5      S9$ )zCAnalyze wrap_index calls added by a previous run of
Array Analysis
r   r   r:   r8  )	r   r{   r  r   rd  r   r  r  r  )r   r  r   r  rI   r  r  r  slice_eqdim_eqwrap_indr$  s               rX   8_analyze_op_call_numba_parfors_array_analysis_wrap_indexFArrayAnalysis._analyze_op_call_numba_parfors_array_analysis_wrap_index  s     	D	Q!W\\
7<<,,Z8**84 !3!33 ))8*<=HH 4 445%%h/BB"H ..beX.>>
 !..#H5 /  r[   c                     S n[        U5      S:  a  US   nOSU;   a  US   nU(       a  [        R                  US9$ [        R                  " SUS9e)Nr   ru   r8  z'Must specify a shape for array creationr]  )r{   r  r  r   UnsupportedRewriteError)r   r  r   r  rI   r  	shape_vars          rX   _analyze_numpy_create_array)ArrayAnalysis._analyze_numpy_create_array  s[    	t9q=QI^GI ..Y.??,,5
 	
r[   c                 (    U R                  XX4U5      $ ri   r  r  s         rX   _analyze_op_call_numpy_empty*ArrayAnalysis._analyze_op_call_numpy_empty	      //c
 	
r[   c                 (    U R                  XX4U5      $ ri   r  r  s         rX   7_analyze_op_call_numba_np_unsafe_ndarray_empty_inferredEArrayAnalysis._analyze_op_call_numba_np_unsafe_ndarray_empty_inferred	  s     //c
 	
r[   c                 (    U R                  XX4U5      $ ri   r  r  s         rX   _analyze_op_call_numpy_zeros*ArrayAnalysis._analyze_op_call_numpy_zeros	  r  r[   c                 (    U R                  XX4U5      $ ri   r  r  s         rX   _analyze_op_call_numpy_ones)ArrayAnalysis._analyze_op_call_numpy_ones	  r  r[   c                     [        U5      S:  a  US   nO!SU;   a  US   nO[        R                  " SUS9eSU;   a  US   nOUn[        R	                  Xg4S9$ )Nr   Nz,Expect one argument (or 'N') to eye functionr]  Mr8  )r{   r   r  r  r  )r   r  r   r  rI   r  r  r  s           rX   _analyze_op_call_numpy_eye(ArrayAnalysis._analyze_op_call_numpy_eye"	  sl    t9q=QACZCA00>  #:CAA**!*88r[   c                 V    [        U5      S:  d   eUS   n[        R                  Xf4S9$ Nr   r8  r{   r  r  )r   r  r   r  rI   r  r  s          rX   _analyze_op_call_numpy_identity-ArrayAnalysis._analyze_op_call_numpy_identity2	  s3     4y1}}G**!*88r[   c                 4   [        U5      S:  d   eUS   n[        U[        R                  5      (       d   eU R                  UR
                     n[        U[        R                  5      (       a  UR                  S:X  ab  SU;   a  US   nUR                  US5      (       d  g UR                  U5      u  pUR                  X5      (       a  [        R                  U	4S9$  g UR                  S:X  a'  UR                  U5      u  n	[        R                  X4S9$ g )Nr   r   rN  r8  r:   )r{   r\   r   r  r   r  r   rj   r  r   rA  r  r  )r   r  r   r  rI   r  rn   atyprN  r   r   s              rX   _analyze_op_call_numpy_diag)ArrayAnalysis._analyze_op_call_numpy_diag9	  s    4y1}}G!RVV$$$$||AFF#dE1122yyA~#:CA$--a33#"--a0%%a++(66aT6BB ,
  a ++A.$22!2@@r[   c                 V   [        U5      S:  d   eUS   nU R                  UR                     n[        U[        R
                  5      (       a  [        R                  SS9$ [        U[        R                  5      (       a)  UR                  U5      (       a  [        R                  US9$ g )Nr   )r:   r8  )
r{   r   r  r\   r   r^   r  r  rj   r>  )r   r  r   rI   r  r6  r  s          rX   _analyze_numpy_array_like'ArrayAnalysis._analyze_numpy_array_likeN	  s    4y1}}1gll388$c5==)) ..T.::U2233	8K8K9
 9
 !..S.99r[   c                 \   [        U5      S:X  d   eUS   nU R                  UR                     n[        U[        R
                  5      (       d   eUR                  S:X  aL  UR                  U5      (       a6  UR                  S:X  a  [        R                  XfS9$ [        R                  US9$ g )Nr:   r   Cr  r8  )r{   r   r  r\   r   rj   r  r>  layoutr  r  )r   r  r   r  rI   r  r6  r  s           rX   _analyze_op_call_numpy_ravel*ArrayAnalysis._analyze_op_call_numpy_ravelZ	  s    4yA~~1gll388$#u44555588q=Y0055zzS  %222FF$222==r[   c                 &    U R                  XXE5      $ ri   r  r  s         rX   _analyze_op_call_numpy_copy)ArrayAnalysis._analyze_op_call_numpy_copyj	  s    --eJJr[   c                 &    U R                  XXE5      $ ri   r  r  s         rX   !_analyze_op_call_numpy_empty_like/ArrayAnalysis._analyze_op_call_numpy_empty_likem	       --eJJr[   c                 &    U R                  XXE5      $ ri   r  r  s         rX   !_analyze_op_call_numpy_zeros_like/ArrayAnalysis._analyze_op_call_numpy_zeros_liker	  r!  r[   c                 &    U R                  XXE5      $ ri   r  r  s         rX    _analyze_op_call_numpy_ones_like.ArrayAnalysis._analyze_op_call_numpy_ones_likew	  r!  r[   c                 &    U R                  XXE5      $ ri   r  r  s         rX    _analyze_op_call_numpy_full_like.ArrayAnalysis._analyze_op_call_numpy_full_like|	  r!  r[   c                 &    U R                  XXE5      $ ri   r  r  s         rX   %_analyze_op_call_numpy_asfortranarray3ArrayAnalysis._analyze_op_call_numpy_asfortranarray	  r!  r[   c                    [        U5      nUS:  d   eUS:X  aQ  U R                  US   R                     n[        U[        R
                  5      (       a  [        R                  US   S9$ / nSn	[        S[        U5      5       H}  n
XJ   n[        [        U R                  U5      n[        U[        R                  5      (       d  MC  UR                  S:  d  MU  U	S:X  a  U
n	M_  Sn[        R                   " XR"                  S9e   U	S:  Ga  US   R"                  n[        R$                  " U['        S5      U5      n[        R(                  U R                  UR                  '   [        R*                  " [        R,                  R/                  US   S	U5      X5      nUR1                  U5        [        S[        U5      5       H  n
X:X  a  M
  [        R$                  " U['        S5      U5      n[        R(                  U R                  UR                  '   [        R,                  R3                  [4        R6                  XU
   U5      n[        R*                  " UUU5      n[9        [        R(                  [        R(                  [        R(                  5      U R:                  U'   UR1                  U5        UnM     XU	'   [        R                  [=        USS  5      US
9$ )Nr:   r   r8  r   r   z7The reshape API may only include one negative argument.r]  calc_size_varrM   r  )r{   r   r  r\   r   rk   r  r  r   r   r   r  r   r  r  r   r  r  r  r   r_   r  r  r3  r   r  r  floordivr   r  r   )r   r  r   r  rI   r  r   r  rM  neg_one_index	arg_indexreshape_argreshape_arg_defr   r/  init_calc_vardiv_calc_size_var	new_binopdiv_calcs                      rX   _analyze_op_call_numpy_reshape,ArrayAnalysis._analyze_op_call_numpy_reshape	  sT   I1uu6,,tAw||,C#u//$22a2AA q#d),I/K#NDLL+NO/28844"((1,$*(1 ,$<<__  - A q'++CFF5-*H#NM/4zzDLL++,IIQ5}M LL' #1c$i0	-$&FF=93%! 8=zz.334 GGMM%%}9os	 99Y0A3G,5JJ

EJJ-y) X& 1% 1* #0**tABxe*LLr[   c                 >   US   nU R                   UR                     n[        U[        R                  5      (       d   S5       eUR                  U5      n[        U5      S:X  a%  [        R                  [        [        U5      5      S9$ USS   V	s/ s H  n	[        [        U R                  U	5      PM      n
n	[        U
S   [        5      (       a  [        U
S   5      n
S U
;   a  g U
 Vs/ s H  oU   PM	     nn[        R                  [        U5      S9$ s  sn	f s  snf )Nr   zInvalid np.transpose argumentr:   r8  )r   r  r\   r   rj   rA  r{   r  r  r   reversedr   r   r  r3  )r   r  r   r  rI   r  in_arrr  ru   rn   axesr   rets                rX   r=  .ArrayAnalysis._analyze_op_call_numpy_transpose	  s    all6;;'&&
 
 	+*	+ 
 $$V,t9> ..U8E?5K.LL<@HEHqj$,,2HEd1gu%%Q=D4<!%&AQx&**s*<< F
 's   %D)Dc                 Z    [        U5      S:  a  [        R                  [        U5      S9$ g r
  )r{   r  r  r   r  s         rX   "_analyze_op_call_numpy_random_rand0ArrayAnalysis._analyze_op_call_numpy_random_rand	  s*     t9q= ..U4[.AAr[   c                 (    U R                  XX4U5      $ ri   )rB  r  s         rX   #_analyze_op_call_numpy_random_randn1ArrayAnalysis._analyze_op_call_numpy_random_randn	  s     66c
 	
r[   c                     SU;   a  [         R                  US   S9$ [        U5      U:  a  [         R                  XA   S9$ g )NrM   r8  )r  r  r{   )r   posr  r   rI   r  s         rX   "_analyze_op_numpy_random_with_size0ArrayAnalysis._analyze_op_numpy_random_with_size	  sG     S= ..S[.AAt9s? ..TY.??r[   c                 (    U R                  SXXE5      $ rd   rI  r  s         rX   "_analyze_op_call_numpy_random_ranf0ArrayAnalysis._analyze_op_call_numpy_random_ranf	       66u
 	
r[   c                 (    U R                  SXXE5      $ rd   rL  r  s         rX   +_analyze_op_call_numpy_random_random_sample9ArrayAnalysis._analyze_op_call_numpy_random_random_sample
  rO  r[   c                 (    U R                  SXXE5      $ rd   rL  r  s         rX   $_analyze_op_call_numpy_random_sample2ArrayAnalysis._analyze_op_call_numpy_random_sample
  rO  r[   c                 (    U R                  SXXE5      $ rd   rL  r  s         rX   $_analyze_op_call_numpy_random_random2ArrayAnalysis._analyze_op_call_numpy_random_random
  rO  r[   c                 (    U R                  SXXE5      $ rd   rL  r  s         rX   -_analyze_op_call_numpy_random_standard_normal;ArrayAnalysis._analyze_op_call_numpy_random_standard_normal
  rO  r[   c                 (    U R                  SXXE5      $ r  rL  r  s         rX   '_analyze_op_call_numpy_random_chisquare5ArrayAnalysis._analyze_op_call_numpy_random_chisquare
  rO  r[   c                 (    U R                  SXXE5      $ r  rL  r  s         rX   %_analyze_op_call_numpy_random_weibull3ArrayAnalysis._analyze_op_call_numpy_random_weibull$
  rO  r[   c                 (    U R                  SXXE5      $ r  rL  r  s         rX   #_analyze_op_call_numpy_random_power1ArrayAnalysis._analyze_op_call_numpy_random_power+
  rO  r[   c                 (    U R                  SXXE5      $ r  rL  r  s         rX   '_analyze_op_call_numpy_random_geometric5ArrayAnalysis._analyze_op_call_numpy_random_geometric2
  rO  r[   c                 (    U R                  SXXE5      $ r  rL  r  s         rX   )_analyze_op_call_numpy_random_exponential7ArrayAnalysis._analyze_op_call_numpy_random_exponential9
  rO  r[   c                 (    U R                  SXXE5      $ r  rL  r  s         rX   %_analyze_op_call_numpy_random_poisson3ArrayAnalysis._analyze_op_call_numpy_random_poisson@
  rO  r[   c                 (    U R                  SXXE5      $ r  rL  r  s         rX   &_analyze_op_call_numpy_random_rayleigh4ArrayAnalysis._analyze_op_call_numpy_random_rayleighG
  rO  r[   c                 (    U R                  SXXE5      $ Nr   rL  r  s         rX   $_analyze_op_call_numpy_random_normal2ArrayAnalysis._analyze_op_call_numpy_random_normalN
  rO  r[   c                 (    U R                  SXXE5      $ rr  rL  r  s         rX   %_analyze_op_call_numpy_random_uniform3ArrayAnalysis._analyze_op_call_numpy_random_uniformU
  rO  r[   c                 (    U R                  SXXE5      $ rr  rL  r  s         rX   "_analyze_op_call_numpy_random_beta0ArrayAnalysis._analyze_op_call_numpy_random_beta\
  rO  r[   c                 (    U R                  SXXE5      $ rr  rL  r  s         rX   &_analyze_op_call_numpy_random_binomial4ArrayAnalysis._analyze_op_call_numpy_random_binomialc
  rO  r[   c                 (    U R                  SXXE5      $ rr  rL  r  s         rX   _analyze_op_call_numpy_random_f-ArrayAnalysis._analyze_op_call_numpy_random_fj
  rO  r[   c                 (    U R                  SXXE5      $ rr  rL  r  s         rX   #_analyze_op_call_numpy_random_gamma1ArrayAnalysis._analyze_op_call_numpy_random_gammaq
  rO  r[   c                 (    U R                  SXXE5      $ rr  rL  r  s         rX   '_analyze_op_call_numpy_random_lognormal5ArrayAnalysis._analyze_op_call_numpy_random_lognormalx
  rO  r[   c                 (    U R                  SXXE5      $ rr  rL  r  s         rX   %_analyze_op_call_numpy_random_laplace3ArrayAnalysis._analyze_op_call_numpy_random_laplace
  rO  r[   c                 (    U R                  SXXE5      $ rr  rL  r  s         rX   %_analyze_op_call_numpy_random_randint3ArrayAnalysis._analyze_op_call_numpy_random_randint
  rO  r[   c                 (    U R                  SXXE5      $ )N   rL  r  s         rX   (_analyze_op_call_numpy_random_triangular6ArrayAnalysis._analyze_op_call_numpy_random_triangular
  rO  r[   c           	      f   [        U5      S:  d   eUS   R                  n[        U R                  US   5      u  pg[        U5      n[	        US:  5        Sn	SU;   a8  [        US   [        5      (       a  US   n	OB[        U R                  US   5      n	O([        U5      S:  a  [        U R                  US   5      n	[	        [        U	[        5      5        [	        US:H  5        U V
s/ s H  oR                  U
5      PM     nn
U	S:  a  [        US   5      U	-   n	[	        SU	s=:*  =(       a    [        US   5      :  Os  5        / n/ nUS:X  a  US   nUR                  US   5      nUR                  S5        [        [        U5      5       HF  nX:X  a*  UR                  X   5      nU(       a  U(       a  UU-  OS nM2  U R                  X+S   5      nMH     UR                  W5        O[        [        US   5      5       Hy  nX:X  a%  U R                  X+ Vs/ s H  oU   PM	     sn5      nO;U Vs/ s H  oU   PM	     nnUR                  U R                  XUU5      5        US   nUR                  U5        M{     [        R!                  [#        U5      [%        U/ 5      S9$ s  sn
f s  snf s  snf Nr   axisr:   r  r  )r{   r  r   r  r   r\   r   r   rA  r   popr   	_sum_sizer   _call_assert_equivr  r  r   r2  )r   r  r   r  rI   r  r  r  r   r  r   r(  r  	new_shaperu   r   r   rM   sizess                      rX   "_analyze_op_call_numpy_concatenate0ArrayAnalysis._analyze_op_call_numpy_concatenate
  sr    4y1}}1gkk%dllDG<HAS=#f+s++6{!$,,F<Y]dllDG4D
4%&m#$3673a&&q)37!8vay>D(DT**Cq	N*+	61IE))&)4AIIaL3u:&9!11%(;A%&11q54D>>)AY?D ' T"3vay>*9>>!&#A&!H&#AD 4::6%1X6E:NN//IuM !8D  & + **	"GR  + 
 	
? 8, $B ;s   (J$J)1J.c                 6   [        U5      S:  d   eUS   R                  n[        U R                  US   5      u  pg[        U5      n[	        US:  5        Sn	SU;   a8  [        US   [        5      (       a  US   n	OB[        U R                  US   5      n	O([        U5      S:  a  [        U R                  US   5      n	[	        [        U	[        5      5        [	        US:H  5        U V
s/ s H  oR                  U
5      PM     nn
U R                  XX&5      nUS   nU	S:  a  [        U5      U	-   S-   n	[	        SU	s=:*  =(       a    [        U5      :*  Os  5        [        USU	 5      U/-   [        XS  5      -   n[        R                  [        U5      US9$ s  sn
f r  )r{   r  r   r  r   r\   r   r   rA  r  r3  r  r  r   )r   r  r   r  rI   r  r  r  r   r  r   r(  r  ru   r  s                  rX   _analyze_op_call_numpy_stack*ArrayAnalysis._analyze_op_call_numpy_stack
  sn   4y1}}1gkk%dllDG<HAS=#f+s++6{!$,,F<Y]dllDG4D
4%&m#$3673a&&q)37))%iEq	!8u:$q(DT''SZ'(q'1#-U5\0BB	**y1Aw*OO 8s   (Fc                    [        U5      S:X  d   e[        U R                  US   5      u  pg[        U5      n[        US:  5        U R                  US   R
                     n	[        [        U	[        R                  5      5        U	R                  S:  a  U R                  XX4U5      $ SUS'   U R                  XX4U5      $ Nr:   r   r   r  )r{   r   r  r   r   r  r\   r   rj   r  r  r  
r   r  r   r  rI   r  r  r  r   r  s
             rX   _analyze_op_call_numpy_vstack+ArrayAnalysis._analyze_op_call_numpy_vstack
  s    4yA~~%dllDG<HAll3q6;;'
3 5 56788a<44#S  CK::#S r[   c                 f   [        U5      S:X  d   e[        U R                  US   5      u  pg[        U5      n[        US:  5        U R                  US   R
                     n	[        [        U	[        R                  5      5        U	R                  S:  a  SUS'   OSUS'   U R                  XX4U5      $ r  )r{   r   r  r   r   r  r\   r   rj   r  r  r  s
             rX   _analyze_op_call_numpy_hstack+ArrayAnalysis._analyze_op_call_numpy_hstack
  s    4yA~~%dllDG<HAll3q6;;'
3 5 56788a<CKCK66c
 	
r[   c                 X   [        U5      S:X  d   e[        U R                  US   5      u  pg[        U5      n[        US:  5        U R                  US   R
                     n	[        [        U	[        R                  5      5        U	R                  S:X  aW  SUS'   U R                  XX4U5      n
[        U
5        [        S/[        U
R                  S   5      -   5      U
R                  S'   U
$ U	R                  S:X  a  SUS'   U R                  XX4U5      $ SUS'   U R                  XX4U5      $ )Nr:   r   r  ru   r   )r{   r   r  r   r   r  r\   r   rj   r  r  r   r3  r  r  )r   r  r   r  rI   r  r  r  r   r  r   s              rX   _analyze_op_call_numpy_dstack+ArrayAnalysis._analyze_op_call_numpy_dstack  s   4yA~~%dllDG<HAll3q6;;'
3 5 56788q=CK66#SF FO%*A3fmmG6L1M+M%NFMM'"MXX]CK44#S  CK::#S r[   c                     g ri   re   r  s         rX   _analyze_op_call_numpy_cumsum+ArrayAnalysis._analyze_op_call_numpy_cumsum      r[   c                     g ri   re   r  s         rX   _analyze_op_call_numpy_cumprod,ArrayAnalysis._analyze_op_call_numpy_cumprod"  r  r[   c                 r    [        U5      nSnUS:  a  US   nOSU;   a  US   n[        R                  U4S9$ )N2   r   numr8  r  )r   r  r   r  rI   r  r   r  s           rX   _analyze_op_call_numpy_linspace-ArrayAnalysis._analyze_op_call_numpy_linspace&  sH     Iq5q'Cc\e*C**#*88r[   c           
      
   [        U5      nUS:  d   eUS   R                  n[        [        U Vs/ s H  opR	                  UR
                  5      PM     sn5      5        U Vs/ s H  opR                  UR
                     PM     nnU V	s/ s H  oR                  PM     n
n	[        [        S U
 5       5      5        U
S   S:X  a
  U
S   S:X  a  g U Vs/ s H  orR                  U5      PM     nnU
S   S:X  aL  U R                  XX+S   S   US   S   /5      n[        R                  [        US   SS US   SS  -   5      US9$ U
S   S:X  aC  U R                  XX+S   S   US   S   /5      n[        R                  [        US   SS 5      US9$ U
S   S:X  aK  U
S   S:X  aB  U R                  XX+S   S   US   S   /5      n[        R                  US   S   US   S   4US9$ U
S   S:  a   g s  snf s  snf s  sn	f s  snf )Nr   r   c              3   *   #    U  H	  oS :  v   M     g7f)r   Nre   r  s     rX   ro   ;ArrayAnalysis._analyze_op_call_numpy_dot.<locals>.<genexpr>8  s     (4aE4s   r:   r   r  )r{   r  r   r   r<  r  r   r  rA  r  r  r  r   )r   r  r   r  rI   r  r   r   typstydimsr(  r  s                rX   _analyze_op_call_numpy_dot(ArrayAnalysis._analyze_op_call_numpy_dot1  s:   IAvv1gkkD9Dq]]166*D9:;.23dQVV$d3"&'$B$'(4(()7a<DGqL3784a&&q)487a<--Iq	!fQim'DG !..F1IaOfQin<= /   7a<--Iq	"vay|'DG !..F1IaO, /   7a<DGqL--Iq	!fQil'CG !..ay|VAYq\2 /   7Q;C :3' 9s   $G1$"G6G;H c                 \   UR                   R                  SS5      nUR                  R                  n[	        U[
        5      (       a  U4n/ n	[        U5      S:  a  [        U5      [        U5      :X  d   e[        X5       HW  u  pU R                  UR                     n[	        U[        R                  5      (       d  M?  X;  d  MF  U	R                  U5        MY     [        U	5      n[        US:  5        U R                  XX)5      nUR                  U	S   5      n[         R#                  XS9$ )Nstandard_indexingre   r   r  )optionsr   	kernel_irr  r\   r  r{   r|   r   r  r   rj   r   r   r  r<  r  r  )r   r  r   stencil_funcr  rI   r  std_idx_arrskernel_arg_namesrel_idx_arrsr^  r6  r  r   r  ru   s                   rX   r  ArrayAnalysis._analyze_stencilX  s    $++//0CRH'11;;lC(((?L4y1}Tc2B.C!CCC,3HC,,sxx(C#u4455###C( 4 A))%iN##LO4***DDr[   c                 z    [        [        U5      S:  5        [        R                  UR	                  US   5      S9$ )Nr:   r   r8  )r   r{   r  r  rA  r  s         rX   !_analyze_op_call_numpy_linalg_inv/ArrayAnalysis._analyze_op_call_numpy_linalg_invm  s7     	D	Q**1E1Ed1g1N*OOr[   c           
        ^  [        [        U 4S jU5      5      n[        U5      S:X  a  UR                  S:X  a  T R                  US   R
                     nT R                  US   R
                     nUR                  S:X  a%  [        R                  UR                  US   5      S9$ UR                  S:X  a%  [        R                  UR                  US   5      S9$  U V	s/ s H  oR                  U	5      PM     n
n	SU
;   a  g[        U
S5      n[        R                  US9$ [        [        U 4S	 jU5      5      n[        [        U5      S:  5        U V	s/ s H  oR
                  PM     nn	U V	s/ s H&  n	T R                  U	R
                     R                  PM(     nn	[        U5      n[        US:  5         U V	s/ s H  oR                  U	5      PM     n
n	/ nSU
;   a}  / n[!        U
5       Hj  u  nnUcP  UU   nT R                  UR
                     nT R#                  UUUR                  SU5      nUR%                  U5        MY  UR%                  U5        Ml     Un
T R'                  XX:U5      nU(       a4  SUR(                  ;   a  UR(                  S   nO/ nUU-   UR(                  S'   U$ s  sn	f ! [         a     gf = fs  sn	f s  sn	f s  sn	f ! [         a*    [        R                  US   T R                  XX,5      S
9s $ f = f)zInfer shape equivalence of arguments based on Numpy broadcast rules
and return shape of output
https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
c                 :   > TR                  U R                  5      $ ri   )_istupler  rn   r   s    rX   r	  2ArrayAnalysis._analyze_broadcast.<locals>.<lambda>x      T]]166%:r[   r   rE   r   r:   r8  Nre   c                 :   > TR                  U R                  5      $ ri   )r<  r  r  s    rX   r	  r    r  r[   r  r  )r3  r  r{   r   r   r  rG  r  r  r<  r2  r   r   r  r   r  	enumerater  r   r  r  )r   r  r   r  rI   r  tupstup0typtup1typr   r(  concat_shapesarrsr  r  max_dimr  
new_shapesr   sr6  r  ru   r   prev_pres   `                        rX   r   ArrayAnalysis._analyze_broadcasts  s   
 F:DABt9>bkkU2 ll47<<0Gll47<<0G}}!$22#--d1g6 3   }}!$22#--d1g6 3  	:>?$Q--a0$?6> #FB$22' 3   F:DABD	A!%&A&3784aQVV$))48d)!	6:;d))!,dF; 6> J!&)19q'C,,sxx0C 00!3$E %%e,%%a( *  F..c5
  %!==/#&>FMM% i @ "  '8 < 	 ..1g++E	H /  	sZ   J5 !J0;J5 J5 K2-K
;K ?KK 0J5 5
KKK 1LLc                    / n/ n[        U Vs/ s H  n[        U5      PM     sn5      n	Sn
[        U	5       H  n/ n/ n[        XT5       Hg  u  pU[        U5      :  d  M  U[        U5      S-
  U-
     nUR	                  U5      nUS:X  a  Un
ME  UR                  U5        UR                  U5        Mi     U/ :X  a'  U
c   eUR                  U
5        UR                  S5        UR                  U R                  XX,US95        UR                  US   5        M     [        R                  [        [        U5      5      [        U/ 5      S9$ s  snf )ztProduce assert_equiv for sizes in each dimension, taking into
account of dimension coercion and constant size of 1.
Nr:   1r  r   r  )r   r{   r   r|   r   r   r  r  r  r   r<  r2  )r   r  r   r  r(  r  r  r  ru   r  const_size_oner   r  
size_namesr  rM   
const_sizes                    rX   r  &ArrayAnalysis._broadcast_assert_shapes  sP    	v6ves5zv67wAEJ"51s5z> Ua!!34D!*!:!:4!@J!Q)-T*"))$/  2 {%111^,!!#&NN''	
 ( 
 U1X&+  , **+,GR  + 
 	
1 7s   E	c                 d    U R                  XX4US9n[        U5      S:  a  UR                  " U6   U$ )Nr  r:   )r  r{   r   )r   r  r  r   rI   r  instss          rX   r   ArrayAnalysis._call_assert_equiv  s>    ''	u ( 
 t9q=""D)r[   c           
      z   [         R                  S:  a  [        SXE5        Uc  U Vs/ s H  ofR                  PM     nn/ n/ n[	        XT5       H  u  p[         R                  S:  a  [        SX5        Sn
U HL  n[         R                  S:  a  [        SXR                  Xk5      5        UR                  Xk5      (       d  MJ  Sn
  O   U
(       a  M  UR                  U5        UR                  U	5        M     [        U5      S:  a!  [         R                  S:  a  [        S5        / $ SR                  S	R                  U5      U5      n[        R                  " X5      n[        R                  " U5      n[        R                  " U[        S
5      U5      nXR                   UR                  '   [#        U/U Vs/ s H  o`R                   UR                     PM     sn-   5      n[        R$                  R'                  U5      n[        R                  " U[        S5      U5      n[        R(                  " S[*        US9n[-        [*        5      nU R.                  R1                  UU40 5      nU R3                  UUUU5        [        R                  " U[        S5      U5      n[        R4                  R7                  UU/U-   0 US9nU R3                  UU[        R8                  U5        UU R:                  U'   [        R<                  " XUS9[        R<                  " UUUS9[        R<                  " UUUS9/$ s  snf s  snf )Nr   zmake_assert_equiv:zname, x:Fzis equiv to?Tz@Will not insert assert_equiv as args are known to be equivalent.zSizes of {} do not match on {}z, r   assertr   r]  r?  rK  )r   r   r   r  r|   r   r   r{   r   joinr   r  r   r   r  r   r   r   r   
from_typesr  r   r   rF   r  r  r  r}  r   r  r  )r   r  r  r   _argsr  r   rI   r  r  seenrs  r   msg_valmsg_typmsg_varargtypstup_typ
assert_var
assert_defr  rH   r6  r  s                           rX   r   ArrayAnalysis._make_assert_equiv  s   !!Q&&5=%*+UVVUE+	5(GD%%*j$*D))Q..!-?-?-EF%%a++D  4A  & ) t9q=%%*" I.55IIi #
 ((3$%%c*&&e 4c:%,W\\"	4$H4a\\!&&%94$HHI $$//8 VVE=#:C@
YY~|E
"<0ll00z2FY
D*= ffUM%0#6Z'T)923GYUZZ7 #u IIG=IIJzsCIIE#37
 	
g ,B %Is   L37"L8
c           
      h   [        U[        R                  5      (       a  UR                  U5      n[        U[        R                  5      (       a  UnS nS nO[        U[        R                  5      (       a  UnS nS nO[        R
                  R                  USUR                  5      n[        R                  " UR                  [        SR                  UR                  5      5      UR                  5      n[        R                  R                  [        R                  U5      n/ n	Sn
U(       a  [!        U5      nX;:  a  XKU-
  S  n[#        U5       GH  nSnU(       Ga  XL   (       Gau  [        XL   [        R                  5      (       aR  U R$                  XL   R                     n[        U[        R&                  [        R(                  45      (       a  XL   nSnGO[        XL   [*        5      (       a$  [        R,                  " XL   UR                  5      nOXL   n[        U[        R,                  5      (       d   e[        R                  " UR                  [        SR                  UR                  U5      5      UR                  5      nUR/                  [        R0                  " UXR                  5      5        U R3                  X[        R                  U5        SnU(       d  [        R                  " UR                  [        SR                  UR                  U5      5      UR                  5      n[        R
                  R5                  XlS UR                  5      nSn
S U R6                  U'   UR/                  [        R0                  " UXR                  5      5        U R3                  X[        R                  U5        U	R/                  W5        GM     U
(       aK  U(       aD  UR9                  S[        R0                  " XvUR                  5      5        U R3                  XWU5        [;        U	5      $ )Nru   z{}_shapeFTz	{}_size{}r   )r\   r   r  r<  r  r  r3  r  r  r   r   r  r   r  r  r_   r{   r   r   r  rl   r   r  r   r  r  static_getitemr  r4  r   )r   r   r6  r  ru   r  attr_varshape_attr_callshape_attr_typ	size_varsuse_attr_varnshapesr   skipr  r  r  getitems                     rX   r  ArrayAnalysis._gen_shape_call(  s   eRVV$$''.E eRVV$$H"OErvv&&H"OE ggooc7CGGDOvv		=):):388)DEswwH #--66uzz5IN	%jG12uADeh//,,ux}}5C!#eoo'FGG#(8#!%(C00#%88EHcgg#>#(8%h9999!vv		%k&8&81&EF H
 KK		(Hgg FGLLejj(KD66II!+"4"4SXXq"ABGG
 ''00dCGGL#*.w'BIIgxABY%**gFX&E F OKK299_HILLnoNYr[   c                     U R                   U   n[        U[        R                  R                  5      =(       a    UR
                  S:  $ rd   )r   r\   r   npytypesArrayr  r   varnamer  s      rX   r<  ArrayAnalysis._isarrayl  s4    ll7##u~~334EAEr[   c                 T    U R                   U   n[        U[        R                  5      $ ri   )r   r\   r   rk   r  s      rX   r  ArrayAnalysis._istuplep  s!    ll7##u//r[   c                 P    SnU H  nUR                  U5      nUc    gX5-  nM     U$ )zjReturn the sum of the given list of sizes if they are all equivalent
to some constant, or None otherwise.
r   N)r   )r   r   r  r  rM   r   s         rX   r  ArrayAnalysis._sum_sizet  s9     D))$/Ay  r[   )r  r  r  r  rF   r  r  r  r  r  r   r  )static_literal_slice_partri   )er   r   r   r   r  r   r   r  r  r  r  r  r  r  objectr  r  r  r?  rD  rH  rQ  rY  rf  rq  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,  r9  r=  rB  rE  rI  rM  rQ  rT  rW  rZ  r]  r`  rc  rf  ri  rl  ro  rs  rv  ry  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   r[   rX   r  r  4  s   H&",

%0:d	BB"H3
=! !HT6@=  )L:2>[
zG9RXEt$



D:=~I>







9 9*
 KK
K
K
K
K
HMT=&






















4
lP4"
4	9%NE*PJX!
F<
|B HF0r[   r  )Br  r  
numba.corer   r   r   r   r   numba.core.ir_utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   numba.core.analysisr   numba.core.typingr   r   r   numba.core.extendingr   rA   UNKNOWN_CLASSCONST_CLASSufunc	MAP_TYPESr  array_creationrandom_int_argsrandom_1arg_sizerandom_2arg_sizelastrandom_3arg_sizelastrandom_callsrb   rf   r   r
  r   r   r^  r  r  r3  NumpyRulesUnaryArrayOperator_op_mapkeysrH  r  NumpyRulesArrayOperatorr  NumpyRulesInplaceArrayOperatorr  supported_ufuncsr   r  )r2   s   0rX   <module>r      s     9 9    " 8 0  * [[M	  47#  	    ,	   ,5 ,5^
 =0 =0@Vv Vrz*H z*zkE} kE\	!F !BK!F K!\B G88@@EEGHLLL  //77<<>>>FFKKM $+$<$<=$<q

$<==s   $E=