
    shgp                    	   S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
Jr  SSKJrJrJr  SSKJr  SSKrSSKJr  SSKrSSKJr  SSKJr  SSK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&  SS
KJ'r'J(r(  SSK)J*r*J+r+  SSK,J-r-J.r.  SSK/J0r0J1r1  SSK2J3r3  SSK4J5r5J6r6  SSK7J8r8J9r9J:r:J;r;J<r<J=r=J>r>J?r?J@r@JArAJBrBJCrCJDrDJErEJFrFJGrGJHrHJIrIJJrJJKrKJLrLJMrMJNrNJOrOJPrPJQrQJRrRJSrSJTrTJUrUJVrVJWrWJXrXJYrYJZrZJ[r[J\r\J]r]J^r^J_r_J`r`JaraJbrb  SSKcJdrdJereJfrfJgrg  SSKhJiri  SSKjJkrkJlrl  SSKmJnrn  SSKoJprpJqrqJrrrJsrsJtrtJuru  SSK4Jvrv  SSKrSSKwrwSSKwrxSSKyJzrz  SSK{rSSK|J}r}  Sr~\R                  " \~SS9rS rSrS r\v" \5      S 5       r " S S \5      rS! rS" rS# rS$ rS% rS& rS' rS( rS) rS* rS+ rS, rS- rSS..S/ jrS0 rS1 S2 \\\\\\\\\\\\S3.rS4 rS5\0r\5S6 5       r\5S7 5       r\5S8 5       r\5S9 5       r\" S:S;S</5      r\" S=\5      \" S>\5      \" S?\5      \" S@\5      \" S?\5      \" S@\5      SA.r " SB SC\5      r " SD SE\GR@                  \GRB                  5      rSF r\\zGRH                  \'    " SG SH\5      r " SI SJ\5      rSK r " SL SM5      r " SN SO5      rSP r " SQ SR5      rSSS jrST r " SU SV5      r " SW SX5      r " SY SZ5      rS[ r " S\ S]\5      r " S^ S_\5      r " S` Sa\5      rSb rSc rSd rSe rSf rSg rSh rSi rSj rSk rSl rSm rSn rSo rSp rSq rSr r\" Ss/ StQSuSv9r   SSw jrSx rSy rSz rS{ rS| rS} rS~ r\\&GR                  \'   SS jr\\!GR                  \'   S r\\!GR                  \'   S r\\"GR                  \'   SS jr SS jrS rS rS rS r\" S/ SQ5      rS rS rS r   SS jrS rS rS rS r\\&GR                  \'   S rS rS r\\&GR                  \'   S rSS jrSS jrS r\\&GR                  \'   S r\\&GR                  \'   SS jrS rS rS rSS jr\\&GR                  \'   SS jr\\&GR                  \'   SS jr\\&GR                  \'   S r\\&GR                  \'   S r\\&GR                  \'   S r\\$GR                   \'   SS jGrG\\&GR                  \'   \S 5       Gr\0" \5       " S S\15      5       GrS Grg)a  
This module transforms data-parallel operations such as Numpy calls into
'Parfor' nodes, which are nested loops that can be parallelized.
It also implements optimizations such as loop fusion, and extends the rest of
compiler analysis and optimizations to support Parfors.
This is similar to ParallelAccelerator package in Julia:
https://github.com/IntelLabs/ParallelAccelerator.jl
'Parallelizing Julia with a Non-invasive DSL', T. Anderson et al., ECOOP'17.
    N)reduce)defaultdictOrderedDict
namedtuple)contextmanager)make_dataclass)ir)impl_ret_untracked)typestypingutilserrorsr	   analysispostprocrewrites	typeinferconfigir_utils)prangepndindex)datetime_minimumdatetime_maximum)as_dtypenumpy_version)infer_globalAbstractTemplate)StencilPass)register_jitablelower_builtin)+mk_unique_var
next_labelmk_allocget_np_ufunc_typmk_range_blockmk_loop_headerget_name_var_tablereplace_varsreplace_vars_inner
visit_varsvisit_vars_innerremove_deadcopy_propagateget_block_copiesapply_copy_propagatedprint_func_irfind_topo_orderget_stmt_writesrename_labelsget_call_tablesimplifysimplify_CFGhas_no_side_effectcanonicalize_array_mathadd_offset_to_labelsfind_callnamefind_build_sequenceguardrequireGuardExceptioncompile_to_numba_irget_definitionbuild_definitionsreplace_arg_nodesreplace_returns
is_getitem
is_setitemis_get_setitemindex_var_of_get_setitemset_index_var_of_get_setitemfind_potential_aliasesreplace_var_namestransfer_scope)compute_use_defscompute_live_mapcompute_dead_mapscompute_cfg_from_blocks)CFGraph)npydecl	signature)Function)random_int_argsrandom_1arg_sizerandom_2arg_sizelastrandom_3arg_sizelastrandom_callsassert_equiv)overload)array_analysis)stencilparforP   F)widthdrop_whitespacec                     U R                  5        H1  n[        R                  U5       Vs/ s H  n[        U5      PM       nM3     g s  snf N)
splitlines_txtwrapperwrapprint)xlys      h/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/numba/parfors/parfor.pyprint_wrappedri   j   s8    \\^&++A./.aq./ /s   Ac                      g r`    rk       rh   init_prangerm   s   s    
rl   c                      S n U $ )Nc                      g r`   rk   rk   rl   rh   no_op#init_prange_overload.<locals>.no_opx   s    rl   rk   )rp   s    rh   init_prange_overloadrr   v   s    Lrl   c                       \ rS rSrS rSrg)internal_prange|   c                     [        U6 $ r`   )range)clsargss     rh   __new__internal_prange.__new__~   s    d|rl   rk   N)__name__
__module____qualname____firstlineno__rz   __static_attributes__rk   rl   rh   rt   rt   |   s    rl   rt   c                     UR                   S:X  a  S nU$ UR                   S:X  aD  [        UR                  [        R                  [        R
                  45      (       a  S nU$ S n U$ S nU$ )Nr   c                     U S   $ Nrk   rk   in_arrs    rh   min_1 min_parallel_impl.<locals>.min_1       ":rl      c                 r   [         R                  R                  R                  5         [	        [        U 5      5        [         R                  R                  R                  U R                  5      n[         R                  R                  R                  [        U 5      5       H  n[        XU   5      nM     U$ r`   )numbaparforsparforrm   min_checkerlencpythonbuiltinsget_type_max_valuedtypert   r   r   valis      rh   r   r      y    $$002CK(mm,,??M--==c&kJA*3q	:C K
rl   c                 r   [         R                  R                  R                  5         [	        [        U 5      5        [         R                  R                  R                  U R                  5      n[         R                  R                  R                  [        U 5      5       H  n[        XU   5      nM     U$ r`   )r   r   r   rm   r   r   r   r   r   r   rt   minr   s      rh   r   r      y    $$002CK(mm,,??M--==c&kJAc!9-C K
rl   c                 N   [         R                  R                  R                  5         [	        [        U 5      5        [         R                  R                  R                  U R                  5      n[         R                  " U R                  5       H  n[        XU   5      nM     U$ r`   )r   r   r   rm   r   r   r   r   r   r   r   shaper   r   s      rh   r   r      l    MM  ,,.F$--((;;FLLIC^^FLL1#ay) 2Jrl   ndim
isinstancer   r   
NPDatetimeNPTimedelta)return_typeargr   s      rh   min_parallel_implr      sn     xx1}	8 L5 
Qcii%"2"2E4E4E!FGG. L L	 Lrl   c                     UR                   S:X  a  S nU$ UR                   S:X  aD  [        UR                  [        R                  [        R
                  45      (       a  S nU$ S n U$ S nU$ )Nr   c                     U S   $ r   rk   r   s    rh   max_1 max_parallel_impl.<locals>.max_1   r   rl   r   c                 r   [         R                  R                  R                  5         [	        [        U 5      5        [         R                  R                  R                  U R                  5      n[         R                  R                  R                  [        U 5      5       H  n[        XU   5      nM     U$ r`   )r   r   r   rm   max_checkerr   r   r   get_type_min_valuer   rt   r   r   s      rh   r   r      r   rl   c                 r   [         R                  R                  R                  5         [	        [        U 5      5        [         R                  R                  R                  U R                  5      n[         R                  R                  R                  [        U 5      5       H  n[        XU   5      nM     U$ r`   )r   r   r   rm   r   r   r   r   r   r   rt   maxr   s      rh   r   r      r   rl   c                 N   [         R                  R                  R                  5         [	        [        U 5      5        [         R                  R                  R                  U R                  5      n[         R                  " U R                  5       H  n[        XU   5      nM     U$ r`   )r   r   r   rm   r   r   r   r   r   r   r   r   r   r   s      rh   r   r      r   rl   r   )r   r   r   s      rh   max_parallel_implr      sl    
xx1}	8 L5 
Qcii%"2"2E4E4E!FGG. L L	 Lrl   c                 $   [         R                  R                  R                  5         [	        [        U 5      5        U R                  5       n[         R                  R                  R                  UR                  5      n[        R                  R                  SU5      n[         R                  R                  R                  [        U5      5       H0  n[        R                  R                  XAU   5      n[        X55      nM2     UR                  $ Nr   )r   r   r   rm   argmin_checkerr   ravelr   r   r   r   r   
IndexValuert   r   indexr   Ainit_valivalr   	curr_ivals         rh   argmin_parallel_implr          	MM$$&3v;A}}%%88AH??%%a2D]]!!11#a&9OO..qA$7	4# : ::rl   c                 $   [         R                  R                  R                  5         [	        [        U 5      5        U R                  5       n[         R                  R                  R                  UR                  5      n[        R                  R                  SU5      n[         R                  R                  R                  [        U5      5       H0  n[        R                  R                  XAU   5      n[        X55      nM2     UR                  $ r   )r   r   r   rm   argmax_checkerr   r   r   r   r   r   r   r   rt   r   r   r   s         rh   argmax_parallel_implr      r   rl   c                    [         R                  R                  R                  5         U R                  S   nUR                  S   nSn[         R                  R                  R                  U5       H  nX@U   X   -  -  nM     U$ r   )r   r   r   rm   r   rt   )abrf   msr   s         rh   dotvv_parallel_implr      so    	MM$$&	
A	
A 	
A]]!!11!4	qTAD[ 5Hrl   c                 J   [         R                  R                  R                  5         U R                  nUR                  u  p4[
        R                  " X@R                  5      n[         R                  R                  R                  U5       H  nXPU   XS S 24   -  -  nM     U$ r`   )	r   r   r   rm   r   npzerosr   rt   )r   r   rf   r   ncr   s          rh   dotvm_parallel_implr      s|    	MM$$&	A77DA 	GGA ]]!!11!4	qTAdG^ 5Hrl   c                 t   [         R                  R                  R                  5         U R                  u  p#UR                  n[
        R                  " X R                  5      n[         R                  R                  R                  U5       H(  nSn[        U5       H  nXpXh4   X   -  -  nM     XuU'   M*     U$ r   )
r   r   r   rm   r   r   emptyr   rt   rw   )	r   r   r   r   rf   r   r   r   js	            rh   dotmv_parallel_implr      s    	MM$$&77DA	A 	GGA]]!!11!4qA1414A !	 5
 Hrl   c                 L   [        U[        R                  R                  5      (       a{  [        U[        R                  R                  5      (       aQ  UR                  UR                  s=:X  a  S:X  a   [
        $   UR                  S:X  a  UR                  S:X  a  [        $ g g g g )Nr      )r   r   npytypesArrayr   r   r   )r   atypbtyps      rh   dot_parallel_implr     s~    4--..4--..99		&Q&&& '
 YY!^		Q&& !/^ 	/ 	/rl   c                 ~   ^ U " S5      mUR                   S:X  a  S nU$ UR                   S:X  a  U4S jnU$ U4S jnU$ )Nr   c                     U S   $ r   rk   r   s    rh   sum_1 sum_parallel_impl.<locals>.sum_1  r   rl   r   c                    > [         R                  R                  R                  5         Tn[         R                  R                  R	                  [        U 5      5       H
  nXU   -  nM     U$ r`   r   r   r   rm   rt   r   r   r   r   zeros      rh   r   r     sS    MM  ,,.C]]))99#f+Fay  GJrl   c                    > [         R                  R                  R                  5         Tn[         R                  " U R
                  5       H
  nXU   -  nM     U$ r`   r   r   r   rm   r   r   r   s      rh   r   r     sF    MM  ,,.C^^FLL1ay  2Jrl   r   )r   r   r   r   s      @rh   sum_parallel_implr     sH    q>D
xx1}	  L 
Q	 L	 Lrl   c                 ~   ^ U " S5      mUR                   S:X  a  S nU$ UR                   S:X  a  U4S jnU$ U4S jnU$ )Nr   r   c                     U S   $ r   rk   r   s    rh   prod_1"prod_parallel_impl.<locals>.prod_1*  r   rl   c                    > [         R                  R                  R                  5         Tn[         R                  R                  R	                  [        U 5      5       H
  nXU   -  nM     U$ r`   r   r   r   r   ones      rh   r   r   -  sS    MM  ,,.C]]))99#f+Fay  GJrl   c                    > [         R                  R                  R                  5         Tn[         R                  " U R
                  5       H
  nXU   -  nM     U$ r`   r   r   s      rh   r   r   4  sF    MM  ,,.C^^FLL1ay  2Jrl   r   )r   r   r   r   s      @rh   prod_parallel_implr   &  sH    
a.C
xx1}	  M 
Q	 M	 Mrl   c                 ~   ^ U " S5      mUR                   S:X  a  S nU$ UR                   S:X  a  U4S jnU$ U4S jnU$ )Nr   c                     U S   $ r   rk   r   s    rh   mean_1"mean_parallel_impl.<locals>.mean_1B  r   rl   r   c                    > [         R                  R                  R                  5         Tn[         R                  R                  R	                  [        U 5      5       H
  nXU   -  nM     U[        U 5      -  $ r`   r   r   s      rh   r   r   E  s\    MM  ,,.C]]))99#f+Fay  Gs6{?"rl   c                    > [         R                  R                  R                  5         Tn[         R                  " U R
                  5       H
  nXU   -  nM     XR                  -  $ r`   )r   r   r   rm   r   r   sizer   s      rh   r   r   L  sM    MM  ,,.C^^FLL1ay  2{{?"rl   r   )r   r   r   r   s      @rh   mean_parallel_implr   =  sH    q>D
xx1}	  M 
Q	# M	# Mrl   c                 `    UR                   S:X  a  S nU$ UR                   S:X  a  S nU$ S nU$ )Nr   c                     gr   rk   r   s    rh   var_1 var_parallel_impl.<locals>.var_1V  s    rl   r   c                 r   U R                  5       n[        R                  R                  R	                  5         Sn[        R                  R                  R                  [        U 5      5       H:  nX   U-
  nU[        R                  " U[        R                  " U5      -  5      -  nM<     U[        U 5      -  $ r   )
meanr   r   r   rm   rt   r   r   realconjr   r   ssdr   r   s        rh   r   r   Y  s    AMM  ,,.C]]))99#f+Fi!mrwwsRWWS\122 G V$$rl   c                 N   U R                  5       n[        R                  R                  R	                  5         Sn[        R
                  " U R                  5       H:  nX   U-
  nU[        R                  " U[        R                  " U5      -  5      -  nM<     X R                  -  $ r   )r   r   r   r   rm   r   r   r   r   r   r   r   s        rh   r   r   d  sy    AMM  ,,.C^^FLL1i!mrwwsRWWS\122 2 $$rl   r   )r   r   r   s      rh   var_parallel_implr   T  s>    
xx1}	0 L- 
Q		%* L		% Lrl   c                     S nU$ )Nc                 (    U R                  5       S-  $ )Ng      ?)varr   s    rh   std_1 std_parallel_impl.<locals>.std_1q  s    zz|s""rl   rk   )r   r   r  s      rh   std_parallel_implr  p  s    #Lrl   )r   c                z  ^
 [        U R                  5      m
U
4S jnS nU
4S jnS nU
4S jnS n[        S U 5       5      (       a  S n	OS	 n	[        U5      S
:X  a  Uc  U$ U$ [        U5      S:X  a  Uc  U$ U$ [        U5      S:X  a  Uc  U$ U$ [        U5      S:X  a  U	$ [	        SR                  U5      5      e)Nc                 6   > [         R                  " SU ST5      $ Nr   r   r   arange)stopinferred_dtypes    rh   arange_1&arange_parallel_impl.<locals>.arange_1x  s    yyD!^44rl   c                 4    [         R                  " SU SU5      $ r	  r
  )r  r   s     rh   arange_1_dtype,arange_parallel_impl.<locals>.arange_1_dtype{  s    yyD!U++rl   c                 4   > [         R                  " XST5      $ Nr   r
  )startr  r  s     rh   arange_2&arange_parallel_impl.<locals>.arange_2~  s    yya88rl   c                 2    [         R                  " XSU5      $ r  r
  )r  r  r   s      rh   arange_2_dtype,arange_parallel_impl.<locals>.arange_2_dtype  s    yya//rl   c                 4   > [         R                  " XUT5      $ r`   r
  )r  r  stepr  s      rh   arange_3&arange_parallel_impl.<locals>.arange_3  s    yydN;;rl   c                 0    [         R                  " XX#5      $ r`   r
  )r  r  r  r   s       rh   arange_3_dtype,arange_parallel_impl.<locals>.arange_3_dtype  s    yyd22rl   c              3   V   #    U  H  n[        U[        R                  5      v   M!     g 7fr`   )r   r   Complex).0r   s     rh   	<genexpr>'arange_parallel_impl.<locals>.<genexpr>  s     
6A:a''s   ')c                    [         R                  R                  R                  5         X-
  U-  n[        R
                  " UR                  5      n[        R
                  " UR                  5      n[        [        [        Xe5      S5      5      n[        R                  " Xs5      n[         R                  R                  R                  U5       H  n	X	U-  -   X'   M     U$ r   )r   r   r   rm   mathceilr   imagintr   r   r   r   rt   )
r  r  r  r   nitems_cnitems_rnitems_initemsarrr   s
             rh   arange_4&arange_parallel_impl.<locals>.arange_4  s    MM  ,,.,Hyy/Hyy/HS4a89F((6)C]]))99&AT) BJrl   c                 X   [         R                  R                  R                  5         [        R
                  " X-
  U-  5      n[        [        US5      5      n[        R                  " XS5      nU n[         R                  R                  R                  U5       H  nXU-  -   Xh'   M     U$ r   )r   r   r   rm   r(  r)  r+  r   r   r   rt   )	r  r  r  r   r-  r/  r0  r   r   s	            rh   r1  r2    s    MM  ,,.yy$,$!67HXq)*F((6)CC]]))99&AT) BJrl   r   r         zparallel arange with types {})r   r   anyr   
ValueErrorformat)r   r   ry   r  r  r  r  r  r   r1  r  s             @rh   arange_parallel_implr9  u  s    k//0N5,90<3 
6
666			 4yA~ =x<n<	Ta!Mx=~=	Ta!Mx=~=	Ta8??EFFrl   c                    ^ [        U R                  5      mS nU4S jn[        U5      S:X  a  U$ [        U5      S:X  a  U$ [        SR	                  U5      5      e)Nc                 0    [         R                  " XS5      $ )N2   )r   linspace)r  r  s     rh   
linspace_2*linspace_parallel_impl.<locals>.linspace_2  s    {{5++rl   c                   > [         R                  R                  R                  5         [        R
                  " UT5      nUS-
  nX-
  nXS'   [         R                  R                  R                  U5       H  nXXd-  -  -   X6'   M     U$ )Nr   r   )r   r   r   rm   r   r   rt   )r  r  numr0  divdeltar   r   s          rh   
linspace_3*linspace_parallel_impl.<locals>.linspace_3  su    ((*hhsE"AgA%%55c:Aag..CF ;
rl   r   r4  zparallel linspace with types {})r   r   r   r7  r8  )r   ry   r>  rD  r   s       @rh   linspace_parallel_implrF    sX    [&&'E, 4yA~	Ta:AA$GHHrl   c                     [         $ r`   )r   rr   s     rh   <lambda>rJ        %9rl   c                     [         $ r`   )r   rH  s     rh   rJ  rJ    rK  rl   )argminnumpyargmaxrO  r   rO  r   rO  aminrO  amaxrO  )sumrO  )prodrO  )r   rO  )r  rO  )stdrO  )dotrO  )r  rO  )r=  rO  c                 6    UR                   S:X  a  S nU$ S nU$ )zParallel implementation of ndarray.fill.  The array on
which to operate is retrieved from get_call_name and
is passed along with the value to fill.
r   c                     [         R                  R                  R                  5         [         R                  R                  R	                  [        U 5      5       H  nXU'   M	     g r`   r   r   s      rh   fill_1"fill_parallel_impl.<locals>.fill_1  sF    MM  ,,.]]))99#f+Fq	 Grl   c                     [         R                  R                  R                  5         [         R                  " U R
                  5       H  nXU'   M	     g r`   r   r   s      rh   r^  r_    s9    MM  ,,.^^FLL1q	 2rl   r   )r   r0  r   r^  s       rh   fill_parallel_implra    s'    
 xx1}	 M	
 Mrl   fillc                 &    U S:X  a  [        S5      eg )Nr   zDzero-size array to reduction operation maximum which has no identityr7  arr_sizes    rh   r   r          1} < > 	> rl   c                 &    U S:X  a  [        S5      eg )Nr   zDzero-size array to reduction operation minimum which has no identityrd  re  s    rh   r   r     rg  rl   c                 &    U S:X  a  [        S5      eg )Nr   z*attempt to get argmin of an empty sequencerd  re  s    rh   r   r         1}EFF rl   c                 &    U S:X  a  [        S5      eg )Nr   z*attempt to get argmax of an empty sequencerd  re  s    rh   r   r     rj  rl   checker_implnamefuncr   r   r   r   )rM  rP  rR  rS  rT  rV  c                   *    \ rS rSrSrS rS rS rSrg)LoopNesti  zThe LoopNest class holds information of a single loop including
the index variable (of a non-negative integer value), and the
range variable, e.g. range(r) is 0 to r-1 with step size 1.
c                 4    Xl         X l        X0l        X@l        g r`   )index_variabler  r  r  )selfrr  r  r  r  s        rh   __init__LoopNest.__init__  s    ,
		rl   c                 z    SR                  U R                  U R                  U R                  U R                  5      $ )Nz3LoopNest(index_variable = {}, range = ({}, {}, {})))r8  rr  r  r  r  rs  s    rh   __repr__LoopNest.__repr__  s-    Et**DJJ		499M	Orl   c                    / nUR                  U R                  5        [        U R                  [        R
                  5      (       a  UR                  U R                  5        [        U R                  [        R
                  5      (       a  UR                  U R                  5        [        U R                  [        R
                  5      (       a  UR                  U R                  5        U$ r`   )appendrr  r   r  r	   Varr  r  )rs  all_usess     rh   	list_varsLoopNest.list_vars  s    xt**+
TZZ
(
(??4::&
TYY
'
'??499%
TYY
'
'??499%rl   )rr  r  r  r  N)	r|   r}   r~   r   __doc__rt  rx  r~  r   rk   rl   rh   rp  rp    s    
O	rl   rp  c                   l   ^  \ rS rSrSrS\" 5       S.U 4S jjrS rS rS r	SS	 jr
SS
 jrS rSrU =r$ )Parfori)  r   F)no_sequential_loweringracesc	                  > [         [        U ]  SUS9  [        U 5      R                  U l        [        U 5      =R                  S-  sl        Xl        X l        X0l        XPl	        S U l
        X`l        [        U5      S:  d   eU/U l        Xl        Xl        Xl        / U l        0 U l        S U l        [(        R*                  (       a(  Sn[-        UR/                  U R
                  Xt5      5        g g )Nr   )oplocr   z9Parallel for-loop #{} is produced from pattern '{}' at {})superr  rt  type
id_counterid
loop_nests
init_block	loop_body	index_varparams	equiv_setr   patternsflagsr  r  redvarsreddictlowererr   DEBUG_ARRAY_OPT_STATSrd   r8  )rs  r  r  r  r  r  r  patternr  r  r  fmt	__class__s               rh   rt  Parfor.__init__-  s     	fd$ 	% 	

 t*''T
" %$""" 7|a 	
 '=#

 ''OC#**''7) * (rl   c                     S[        U R                  5      -   [        U R                  5      -   [        U R                  5      -   [        U R
                  5      -   $ )Nzid=)strr  reprr  r  r  rw  s    rh   rx  Parfor.__repr___  sG    s477|#d4??&;; !#'#78 	8rl   c                 X    U R                    Vs/ s H  oR                  PM     sn$ s  snf r`   )r  rr  )rs  re   s     rh   get_loop_nest_varsParfor.get_loop_nest_varsc  s"    *.//:/Q  /:::s   'c                 B   / nU R                   R                  5        H*  u  p#UR                   H  nXR                  5       -  nM     M,     U R                   H  nXR                  5       -  nM     U R
                  R                   H  nXR                  5       -  nM     U$ )zclist variables used (read/written) in this parfor by
traversing the body and combining block uses.
)r  itemsbodyr~  r  r  )rs  r}  rf   r   stmtloops         rh   r~  Parfor.list_varsf  s     NN((*DANN,,  + OOD((H $ OO((D((H ) rl   c                     Ub&  U R                   R                  nX R                   l        U R                   R                  U5      nUb  WU R                   l        U$ )zfget the shape classes for a given variable.
If a typemap is specified then use it for type resolution
)r  typemapget_shape_classes)rs  r  r  save_typemapress        rh   r  Parfor.get_shape_classesw  sN     >>11L%,NN"nn..s3%1DNN"
rl   c                    U=(       d    [         R                  n[        SR                  U R                  5      R                  SS5      US9  [        SU R                  US9  [        SU R                  US9  [        SU R                  US9  U R                   H  n[        X!S9  M     [        SUS9  U R                  R                  U5        [        U R                  R                  5       5       H%  u  p4[        S	U< S
3US9  UR                  U5        M'     [        SR                  U R                  5      R                  SS5      US9  g )Nzbegin parfor {}   -)filezindex_var = z	params = zraces = zinit block:zlabel :zend parfor {})sysstdoutrd   r8  r  centerr  r  r  r  r  dumpsortedr  r  )rs  r  loopnestoffsetblocks        rh   r  Parfor.dump  s    !szz ''088SAMndnn48k4;;T2j$**40H(& (m$'T"#DNN$8$8$:;MF)5JJt < 	%%dgg.66r3?dKrl   c                    U R                   c  Sn[        U5      eU R                    H  nUR                  U5      nUc  Sn[        U5      e[        U[        R
                  5      (       d  ME  UR                  [        R                  :  d  Me  Sn[        R                  " UX4R                  [        R                  4-  U R                  5      e   g)z/
Check that Parfors params are of valid types.
Nz?Cannot run parameter validation on a Parfor with params not setzDCannot validate parameter %s, there is no type information availablea  Use of a tuple (%s) of length %d in a parallel region exceeds the maximum supported tuple size.  Since Generalized Universal Functions back parallel regions and those do not support tuples, tuples passed to parallel regions are unpacked if their size is below a certain threshold, currently configured to be %d. This threshold can be modified using the Numba environment variable NUMBA_PARFOR_MAX_TUPLE_SIZE.)r  r7  getr   r   	BaseTuplecountr   PARFOR_MAX_TUPLE_SIZEr   UnsupportedParforsErrorr  )rs  r  msgptys        rh   validate_paramsParfor.validate_params  s     ;;CS/!AQBz/ o%"eoo..88f:::OC !88 ((F,H,HI:J"hh( (! rl   )r  r  r  r  r  r  r  r  r  r  r  r  r  r  r`   )r|   r}   r~   r   r  setrt  rx  r  r~  r  r  r  r   __classcell__)r  s   @rh   r  r  )  sA    J $)%0* 0*d8;"$L( (rl   r  c                     UR                   n[        U 5      nUR                  R                  SS5      nUR                  " XQ5        [        X5        UR                  S   U l        U(       a  XcR                  S'   / / 4$ )z/Recursive array analysis for parfor nodes.
    r   N)func_irwrap_parfor_blocks
equiv_setsr  rununwrap_parfor_blocksr  )r   r  r  rZ   r  parfor_blocksbackup_equivsets          rh   _analyze_parforr    sv     $$G&v.M %//33At<O}0/%003F'6!!!$r6Mrl   c                       \ rS rSrSrS rS r\S 5       r\R                  S 5       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S rS rSS jrS rS rSrg)ParforDiagnosticsi  z}Holds parfor diagnostic info, this is accumulated throughout the
PreParforPass and ParforPass, also in the closure inlining!
c                     S U l         [        5       U l        SU l        [	        [
        5      U l        [	        [
        5      U l        / U l        0 U l	        SU l
        g )N__numba_parfor_gufuncF)rn  dictreplaced_fnsinternal_namer   listfusion_infonested_fusion_infofusion_reports
hoist_info	has_setuprw  s    rh   rt  ParforDiagnostics.__init__  sK    	 F4&t,"-d"3 rl   c                 ^   Xl         U R                   R                  R                  U l        U R                   R                  U l        X l        U R                  U R                  ;   a  SU l        O#SU R                  < SU R
                  < 3U l        U R                  5       U l
        SU l        g )NzInternal parallel functionz	Function , T)r  func_idfunc_qualnamerm  r  linefusion_enabledr  purposeget_parforsinitial_parforsr  )rs  r  r  s      rh   setupParforDiagnostics.setup  s    LL((66	LL$$	,*7DL + 15		499EDL  $//1rl   c                     U R                   $ r`   
_has_setuprw  s    rh   r  ParforDiagnostics.has_setup  s    rl   c                     Xl         g r`   r  )rs  states     rh   r  r    s    rl   Nc                 4    [        U R                  5       5      $ r`   )r   r  rs  blockss     rh   count_parforsParforDiagnostics.count_parfors  s    4##%&&rl   c                 R    [        U5      nU R                  X25        [        U5        g r`   )r  _get_parforsr  )rs  r   parfors_listr  s       rh   _get_nested_parfors%ParforDiagnostics._get_nested_parfors  s"    #F+&/V$rl   c                     UR                  5        HQ  u  p4UR                   H<  n[        U[        5      (       d  M  UR	                  U5        U R                  XR5        M>     MS     g r`   )r  r  r   r  r{  r  )rs  r  r  labelblkr  s         rh   r  ParforDiagnostics._get_parfors  sK     ,,.JEdF++ ''-,,T@ ! )rl   c                 V    / nU R                  U R                  R                  U5        U$ r`   )r  r  r  )rs  r  s     rh   r  ParforDiagnostics.get_parfors  s'    $,,--|<rl   c                    / nU R                   R                  5        H  u  p#UR                  S/ 5      nU H  n[        UR                  [
        R                  5      (       d  M.  UR                  R                  S:X  d  MJ  [        [        U R                  UR                  5      nUc  Mt  US:X  d  M|  UR                  U5        M     M     U$ )Nhoistedcall)r   rO  )r  r  r  r   valuer	   Exprr  r;   r9   r  r{  )rs  allocspf_iddatar  instr  s          rh   hoisted_allocations%ParforDiagnostics.hoisted_allocations  s    ??002KE88Ir*Ddjj"''22zz}}.$]DLL$**M+8J0J"MM$/  3 rl   c                    [         R                  " U5      nU0 :X  a  / [        5       4$ [        5       nUR                  5        H  nU H  nUR	                  U5        M     M     [        UR                  5       5      nXc-
  nUc
  [        5       n[        5       n[        [        [        UR                  5       5      R                  U5      5      S-   5       H:  nUR                  U5      n	U	b  XU'   M  U	/ :X  a  UR	                  U5        M6  / X%'   M<     / n
[        UR                  5       5       H  nU
R                  X%   5        M     X4$ )zN
compute adjacency list of the fused loops
and find the roots in of the lists
r   )copydeepcopyr  valuesaddkeysrw   r   unionr  r  r{  )rs  _ar   vtxvre   potential_rootsroots	not_rootsr   rf   s              rh   compute_graph_info$ParforDiagnostics.compute_graph_info  s   
 MM"7su9eA
  
 affh-%=EE E	s3qvvx=..s34q89A%%(C!a  : !AHHQTN " xrl   c                 0   ^ U4S jmT" XUSS5      u  pEXE4$ )z
Computes the number of fused and serialized loops
based on a fusion adjacency list `fadj` and a nested
parfors adjacency list `nadj` for the root, `root`
c                    > X    H4  nUS-  nX   / :X  a  U[        X   5      -  nM"  T" XXSU5      u  pgX6-  nUnM6     X44$ r  )r   )	fadjnadjrootnfusednserialknfns
count_roots	           rh   r&  /ParforDiagnostics.get_stats.<locals>.count_root=  sW    Z17b=c$'l*F'AwGFBLF G   ?"rl   r   rk   )rs  r  r  r   r!  r"  r&  s         @rh   	get_statsParforDiagnostics.get_stats7  s$    		# %Tq!<rl   c                     / nUR                  X   5        X    H-  nX   / :w  d  M  UR                  U R                  X5      5        M/     U$ )zN
returns a list of nodes reachable in an adjacency list from a
specified root
)extendreachable_nodes)rs  adjr   fusersr#  s        rh   r,  !ParforDiagnostics.reachable_nodesJ  sJ    
 ci Av|d223:;  rl   c                    X!   S   nUR                   S   n[        SUR                  R                  S-
  5      nU R                  R                  R
                  nU R                  U R                  5      u  pxU R                  U R                  5      u  pXy/n[        U[        5      (       Ga  US   S:X  Ga  US   S   nUR
                  U:X  a  [        SUR                  S-
  5      $ / nU HX  nU(       d  M  X    H#  nUR                  U R                  X5      5        M%     U(       d  M@  [        S[        U5      S-
  5      s  $    UR                  R                  5        HW  nUR                    HD  nUR                  R
                  U:X  d  M  [        SUR                  R                  S-
  5      s  s  $    MY     U R                  R"                  R                  5        H  n UR                   R%                  U5      n['        US-
  SS5       HM  nUR                   U   n[        U[(        5      (       a  M)  [        SUR                  R                  S-
  5      n  M~     M     U$ ! [*         a     M  f = f)z@
pd_id - the parfors id
parfors_simple - the simple parfors map
r   r   internalr   )r  r   r  r  r  filenamer  r  r  r   tupler{  sort_pf_by_liner   r  r  r  r  r   rw   r  r7  )rs  r  parfors_simplepfr  r  r3  r  nrootsr  frootsgraphsreported_loctmpr-  r#  r  r  idxr   s                       rh   r5  !ParforDiagnostics.sort_pf_by_lineV  s    "1%++a.1bffkkAo&<<##,,..t/F/FG..t/?/?@ gu%%qzZ'&qz!}((H4q,"3"3a"788 C%3%(Z #

4+?+?+R S &0"s'*1c#hl'; ;  &  "||224$'HHD#xx00H<'*1dhhmma.?'@ @ %-  5  $||2299;!"%((.."4C%*37Ar%:'*xx{'1$'?'?+.q$((--!2C+DD$)	 &;  <   * ! !s   %AI'9$I'I''
I54I5c           	         [        5       n[        U R                  S S9 H  nUR                  S   nUR                  S   nUR                  n[        U[        5      (       ag  US   S:X  a^  US   S:X  a;  SR                  [        [        US   S   5      5      5      nUS   S   nU< S	S
< 3nOUS   S:X  a  SnOUS   S:X  a  SnO eSnU(       a  [        XR                  Xd4-  5        X6U4X#R                  '   M     U$ )Nc                 .    U R                   R                  $ r`   )r  r  re   s    rh   rJ  6ParforDiagnostics.get_parfors_simple.<locals>.<lambda>  s    QUUZZrl   keyr   r   r   r1  .r    z(internal parallel version)userzuser defined pranger   zinternal pndindexz5Parallel for-loop #%s: is produced from %s:
    %s
 
)r  r  r  r  r  r   r4  joinreversedr  ri   r  )	rs  print_loop_searchr6  r7  	r_patternr  r  replfnr  s	            rh   get_parfors_simple$ParforDiagnostics.get_parfors_simple  s    --3GHB AIkk!nG&&C'5))1:)qzZ/!$(4
13F*G!H%ajm/57T$U	 v-$9	 z1$7	 qLC cUUC$;;<%'i$8N55!- I. rl   c                 v   U R                  U R                  5      u  p#U R                  U R                  5      u  pE[        U5      [        U5      :  a  [        U5      nUnO[        U5      nUn[	        [        U5      U5       H  nUR                  / 5        M     [        5       n	U(       a$  U H  n
XJ   / :w  d  M  U	R                  U
5        M      X9-  n0 nU H  nU R                  X5      nSX4X'   M     0 nU	 H  nU R                  X5      nSX4X'   M     UR                  5       nUR                  U5        U$ )Nfusenest)r  r  r  r   rw   r{  r  r  r5  r  update)rs  r6  r  r9  r  _nrootslimr<  re   r8  rI  	all_rootsfroots_linesr  nroots_lines	all_liness                   rh   get_all_linesParforDiagnostics.get_all_lines  s1    ..t/?/?@//0G0GHt9s4y d)CCd)CCs3x%AJJrN &
 7b=JJqM  O	 A'':D!'L  A'':D!'L  !%%'	&rl   c           	         U R                   R                  R                  nU R                  5       nU R                   R                  R
                  n [        R                  " U5      R                  5       nU(       Ga!  U(       Ga  [        U Vs/ s H  n[        U5      PM     sn5      n[        [        5      n	UR                  5        HI  u  pX   S   R                  U:X  d  M  U R                  X5      nX   R!                  [#        U
5      5        MK     [        S/U	R%                  5        Vs/ s H  n[        U5      PM     sn-   5      nUSU[        [#        U5      5      S-   -  -   -   n/ nUR!                  S5        UR!                  SU-  5        UR!                  US-  S-   5        Sn[        SU R                   R                  R&                  S-
  5      n[)        UU5       H  u  nnU	R+                  US 5      nUb  S	S
R-                  U5      -   nOSnUR/                  S5      n[        U5      nU(       a  UR1                  US-  UU5      nOUR1                  US-  UU5      nUR!                  UUUS  -   5        M     [3        SR-                  U5      5        g [3        S5        g ! [         a    S n GNDf = fs  snf s  snf )Nr   r   
zParallel loop listing for %sr  z	|loop #IDz{0:{1}}| {2}r   #r   rF  zNo source available)r  r  r3  r  r  rn  inspect	getsourcera   OSErrorr   r   r   r  r  r5  r{  r  r  r  	enumerater  rH  stripr8  rd   )rs  r6  purpose_strr3  r  	func_namelinesre   	src_widthmap_line_to_pfr#  r  
match_linemax_pf_per_liner]   newlinesr  lstartnor  pf_idspfstrstrippedsrclenrf   s                            rh   source_listing ParforDiagnostics.source_listing  sg   <<##,,""$LL((--		%%i0;;=E ^U3USVU34I(.N&,,. "$Q'00H<!%!5!5a!HJ".55c!f= / "1#9N9N9P(Q9PAQ9P(Q"QRO_CJ!8K%L!LMEHOOD!OO:[HIOOECK+56 CDLL,,11A56F%eV4D'++B5%$))F"33EE::d+X

53;u=A

53;u=A1VW: 56 5 $))H%&'(I  	E	 4 )Rs   $J+ J>0K
+J;:J;c                 ,  ^ ^^ Sm[        T5      mT R                  T R                  5      u  p#T R                  T R                  5      u  pE[        U5      [        U5      :  a  [        U5      nUnO[        U5      nUn[	        [        U5      U5       H  nUR                  / 5        M     UU U4S jn	UU U4S jn
Sn/ n[        UR                  5       5       H9  u  pUu  nnnUS:X  a  UU;  a  U
" SUUSU5      nM%  M'  US:X  a  U	" X$UX5      nM9   e   g )N+--c                    >^^ UUUUU4S jmX   / :w  a(  [        SU-  5        T" XUS5        [        S5        US-   nU$ )Nc           	        > [        TU-  S-  T< U< SS< 3-   5        X    H  nX   / :X  a  / nUR                  TUS-   -  S-  T< U< SS< 3-   5        X   / :w  aG  UT
;  aA  TR                  X5      nU H*  nUR                  TUS-   -  S-  T< U< SS< 3-   5        M,     T
R                  U5        [        SR                  U5      5        M  T	" XXCS-   5        M     g )NrF  
(parallel)r   r\  )ri   r{  r,  rH  )fadj_nadj_nrootdepthr#  r  fusedr   facprint_greportedrs  swords           rh   r  HParforDiagnostics.print_unoptimised.<locals>.print_nest.<locals>.print_g  s    cEkC/ue\2ZZ[Ax2~ 

3%!)#4s#:%QRT`=a#ab 8r>ax.?$($8$8$BE%* #

3%!)+<s+BRWYZ\hEi+i j &+ *%diin5a; &rl   Parallel region %s:r   r\  r   ri   rd   )	ry  rz  therootr  	region_idr  r~  rs  r  s	      ` @rh   
print_nest7ParforDiagnostics.print_unoptimised.<locals>.print_nest  sI    < < ~#3i?@gq1d%M	rl   c                 b  > / n[        SU-  5        UR                  TU-  S-  T
< U< SS< 3-   5        X!   / :w  aG  [        T	R                  X!5      5      nU H'  nUR                  TU-  S-  T
< U< SS< 3-   5        M)     US-   n[        SR	                  U5      5        [        S5        U$ )Nr  rF  rx  r   r\  )ri   r{  r  r,  rH  rd   )r  r  r-  r|  r  r  r}  r#  r~  rs  r  s           rh   
print_fuse7ParforDiagnostics.print_unoptimised.<locals>.print_fuse,  s    C/);<JJsU{S(ul+SSTzRt33C?@AJJsU{S0q,3WWX !AI$))C.)$Krl   r   rP  frQ  )r   r  r  r  rw   r{  r  r  )rs  rf  r  r9  r  rS  rT  r<  re   r  r  r  r  r  infoopt_tyr  r-  r~  r  s   `                 @@rh   print_unoptimised#ParforDiagnostics.print_unoptimised  s   %j..t/?/?@//0G0GHt9s4y d)CCd)CCs3x%AJJrN &	.	 	 /JD!%FE3( *3sAy II )6!&t5(N	q 0rl   c           	      @  ^ ^^^ Sm[        T5      mT R                  T R                  5      u  p#T R                  T R                  5      u  pE[        U5      [        U5      :  a  [        U5      nUnO[        U5      nUn[	        [        U5      U5       H  nUR                  / 5        M     [        5       mUU UU4S jn	UU UU4S jn
Sn/ n[        UR                  5       5       H9  u  pUu  nnnUS:X  a  UU;  a  U
" SUUSU5      nM%  M'  US:X  a  U	" X$UX5      nM9   e   T(       ak  [        TR                  5       5       HM  u  nnSnUS	   nUS
   nUS   nUS:w  a  US-  n[        UUUUUU4-  5        M7  US-  n[        UUUU4-  5        MO     g [        S5        g )Nru  c                    >^^^ UUUUUUU	4S jmX   / :w  aF  [        ST-  5        [        T	< U< SS< 35        USSS.TT'   T" XUS5        [        S5        TS-   mT$ )	Nc           
        > X    H  nTU-  S-  T< U< SS< 3-   nX   / :X  a  / nX   / :w  aS  UT;  aM  [        TR                  X5      5      nUS-  nUSR                  U Vs/ s H  n[        U5      PM     sn5      -  nUS-  nTR	                  U5        [        U5        TT
   S==   [        U5      -  ss'   O[        US-   5        T	" XXCS-   5        TT
   S==   S-  ss'   M     g s  snf )	NrF  z(serial, fused with loop(s): r  )r}  r   
serialized)r  r,  rH  r  r{  ri   r   )ry  rz  r{  r|  r#  r  r}  re   r~  r  r  r  rs  summaryr  s           rh   r  FParforDiagnostics.print_optimised.<locals>.print_nest.<locals>.print_g[  s    A++5!Y.OOCx2~ " 8r>ax.?$*4+?+?+I$JE#;;C499e-Dec!fe-D#EECs
 *%c*	*73s5zA3%cCi0a;I&|494 & .Es   %C-r  rF  rx  r   r   r}  r  r   r\  r  )
ry  rz  r  r  r  r  r~  rs  r  r  s
      ``@rh   r  5ParforDiagnostics.print_optimised.<locals>.print_nestZ  sj    : :$ ~#3i?@5'<HI.5QR%S	"gq1d%M	rl   c           	      j  > [        SU-  5        TU-  S-  T< U< SS< 3-   n/ nX!   / :w  aM  [        T	R                  X!5      5      nUS-  nUSR                  U Vs/ s H  n[	        U5      PM     sn5      -  nU[        U5      SS.T
U'   US-  n[        U5        [        S	5        US
-   nU$ s  snf )Nr  rF  z	(parallelr  r  r   r  r  r\  r   )ri   r  r,  rH  r  r   rd   )r  r  r-  r|  r  r  r}  re   r~  rs  r  r  s           rh   r  5ParforDiagnostics.print_optimised.<locals>.print_fusev  s    /);<+#5%&MMCEzRt33C?@//tyy%!8%Q#a&%!899*/#e*TU!VGI3JC#$K!AI "9s   B0
r   rP  r  rQ  z5
 
Parallel region %s (loop #%s) had %s loop(s) fusedr   r}  r  zE and %s loop(s) serialized as part of the larger parallel loop (#%s).rE  z&Parallel structure is already optimal.)
r   r  r  r  rw   r{  r  r  r  ri   )rs  rf  r  r9  r  rS  rT  r<  re   r  r  r  r  r  r  r  r  r-  r#  r  r  r   r}  r  r~  r  r  s   `                       @@@rh   print_optimised!ParforDiagnostics.print_optimisedF  s    %j..t/?/?@//0G0GHt9s4y d)CCd)CCs3x%AJJrN & &	 	8	 	" 	 /JD!%FE3( *3sAy II )6!&t5(N	q 0 w}}/1$y'
|_
? + ,C "#D%T(J"JK3JC!#D%(8"89 0 BCrl   c                 ~   Sn[        S5        U R                  R                  5        GH-  u  p#UR                  S/ 5      nU GH  n[	        UR
                  [        R                  5      (       d  M/   UR
                  R                  nUS:X  a  SnUR                  n[        XxU4-  5         [        R                  R                  UR                  5      n	["        R$                  " U	5      n
U
(       aN  UR&                  (       a=  [        SXR&                  S:  a  SOUR&                  S	-
     R)                  5       -   5        [        S
5        SnGM  GM     GM0     U(       d  [        S5        g g ! [         a,    [        R                  R!                  UR                  5      n	 Nf = f! [*        [,        4 a     GMy  f = f)NFzAllocation hoisting:r  r   zThe memory allocation derived from the instruction at %s is hoisted out of the parallel loop labelled #%s (it will be performed before the loop is executed and reused inside the loop):z   Allocation:: r   r   r   z0    - numpy.empty() is used for the allocation.
TzNo allocation hoisting found)rd   r  r  r  r   r  r	   r  attrr  ri   ospathrelpathr3  r7  abspath	linecachegetlinesr  rc  KeyErrorAttributeError)rs  foundr  r	  r  r
  r  r  r  r  rf  s              rh   allocation_hoist"ParforDiagnostics.allocation_hoist  sd   $%??002KE88Ir*Ddjj"''22#zz7?$;C
 #'((C)#e*<=E')wws||'D %.$6$6t$<E$ -.@5hhYZl`c`h`hkl`lCmCsCsCu.u v)*]^$(E! +	  32 89  $. E')wws||'DE %n5 s7   29F',)E.A8F'.3F$!F'#F$$F''F<;F<c                 j   [        S5        [        S5        SnU R                  (       a  U R                  R                  5        H  u  p#UR                  SS 5      nUR                  SS 5      nU(       d  U(       d  [        SU-  5        MG  [        SU-  5        U(       a+  [        S5        U Vs/ s H  n[        S	U-  5      PM       nS
nU(       d  M  [        S5        U VVs/ s H  u  pv[        SU< SU< 35      PM       nnS
nM     U(       d  [	        S5        [	        S5        g s  snf s  snnf )Nr^  zInstruction hoisting:Fr  not_hoistedzloop #%s has nothing to hoist.z	loop #%s:z  Has the following hoisted:    %sTz   Failed to hoist the following:z    z: zNo instruction hoisting foundzP--------------------------------------------------------------------------------)rd   r  r  r  ri   )rs  hoist_info_printedr  r	  r  r  rg   re   s           rh   instruction_hoist#ParforDiagnostics.instruction_hoist  s    b	%&"??#446((9d3"hh}d;{:UBCkE)*8929:'QU8a<(':)-&;<=>IJkdaU1a01kJ)-&  7  "9:h ; Ks   /D*$D/c                   ^ ^! T R                   (       d  [        S5      eT R                  R                  R                  nT R                  R
                  nT R                  U;   a  SnSnOSU< SU< S3nSnSnSnSnSn	Sn
SnSnSnSnSnUS	;   a  S
nS
nO[        S5      eUS;   a  S
nUS;   a  S
nUS:X  a  S
n	S
n
US:X  a  S
nS
nS
nUS:X  a  U(       d  g [        S5        [        [        S-  5        [        SU-  R                  [        S5      5        [        [        S-  5        [        S5        U(       a  [        SR                  [        S5      5        T R                  U5      nT R                  5       nU(       a   [        SU-  5        [        S[        -  5        T R                  R
                  R                  n [        R                  R!                  U5      nU(       a  T R%                  UU5        Sm!T R'                  5       nU Vs/ s H  nUR(                  PM     nn[+        U5      nU(       d  U	(       aW  [,        (       d-  [        SR                  [        S5      5        Sn[        U5        OSn[        U5        [        [        S-  5        US:  Ga  U U!4S jnU(       a;  T R.                   H+  nUu  nnn[        SU< SU< S35        [        S U-  5        M-     T R0                  0 :w  a&  U	(       a  [        S!5        U" T R0                  S"S#5        U	(       ar  T R2                  (       a  S$nOS%n[        S&R5                  UUSR7                  U Vs/ s H  nS'U-  PM
     sn5      5      5        [        [        S-  5        [        S5        U
(       ao  T R8                  0 :w  a_  [        S(R                  [        S5      5        [        S)5        S*nS+nU" T R8                  UU5        [        [        S-  5        [        S5        T R;                  U5      n U(       aB  [=        S,R                  [        S5      5        T R?                  U 5        [=        [        S-  5        U(       aB  [=        S-R                  [        S5      5        T RA                  U 5        [=        [        S-  5        [        S5        [        [        S-  5        [        S5        U(       d  U(       a  [        S.R                  S/S5      5        U(       a  T RC                  5         U(       a  T RE                  5         g g [        S0R5                  X#5      5        g ! [         a#    [        R                  R#                  U5      n GNf = fs  snf s  snf )1Nzself.setup has not been calledzInternal parallel functions r1  z
 Function r  rF  rG  F)r   r   r4  r5  Tz1Report level unknown, should be one of 1, 2, 3, 4)r   r4  r5  )r4  r5  r4  r5  z
 =z% Parallel Accelerator Optimizing: %s r^  zLooking for parallel loopsr  z
Found %s parallel loops.ru  z Fusing loops zPAttempting fusion of parallel loops (combines loops with similar properties)...
z+Performing sequential lowering of loops...
r2  c                 r   >^^^^ [        T5      mUUUUU4S jnTR                  U 5      u  mnU" TU5        g )Nc                    >^ UUUU4S jmU H-  n[        T< U< ST< 35        T" TUS5        [        S5        M/     g )Nc                    > X    H7  n[        TU-  S-  T< U< ST< 3-   5        X   / :w  d  M+  T" XUS-   5        M9     g )NrF  r   ri   )r-  r   r|  r#  r~  node_msgr  r  s       rh   r  YParforDiagnostics.dump.<locals>.dump_graph_indented.<locals>.print_graph.<locals>.print_gC  sE    !$A)#+*;5RSU]>^*^_"v| '	 : "+rl   rF  r   r^  r  )	r-  r  rI  r  r~  rf   r  root_msgr  s	      @rh   print_graphHParforDiagnostics.dump.<locals>.dump_graph_indented.<locals>.print_graphB  s<    ; ;
 #%5!X&FG1a(%b) #rl   )r   r  )	r   r  r  r  r  r~  rf   rs  r  s	    ``  @@rh   dump_graph_indented3ParforDiagnostics.dump.<locals>.dump_graph_indented@  s6    %j	* 	*  22155Au%rl   z  Trying to fuse loops #z and #r  r  z
 
Fused loop summary:
z&has the following loops fused into it:z(fused)z4Following the attempted fusion of parallel for-loopsWith fusion disabledzL
{} there are {} parallel for-loop(s) (originating from loops labelled: {}).z#%sz Optimising loop nests zNAttempting loop nest rewrites (optimising for the largest parallel loops)...
 zis a parallel loopz--> rewritten as a serial loopz Before Optimisation z After Optimisation zLoop invariant code motionr\   z+Function %s, %s, has no parallel for-loops.)#r  RuntimeErrorr  r  r  r  r  r7  ri   
_termwidthr  rM  r  r3  r  r  r  r  rr  r  r  r   sequential_parfor_loweringr  r  r  r8  rH  r  rY  rd   r  r  r  r  )"rs  levelrm  r  rd  r  rJ  print_source_listingprint_fusion_searchprint_fusion_summaryprint_loopnest_rewriteprint_pre_optimisedprint_post_optimisedprint_allocation_hoistprint_instruction_hoistprint_internalr6  r  r3  r  r   re   
parfor_ids	n_parforsr  r  reportl1l2after_fusionr  r  rX  r  s"   `                                @rh   r  ParforDiagnostics.dump  s   ~~?@@||##11||%8K G & 26t<KG!$#$!&#$!&"' L #' #' PQQI"&F?%)"A:#' %)"A:"&&*#!Nj ej3&'>LTTU_adefj3&'b 6==j#NO001BC""$6>?#
*+ <<##,,	- 77??8,D  < ""$$+,GqaddG
,
O	 "6--.55j#FG8c"Dc"j3./r>& #"11F"(KBC!2r"RS!(S.1 2
 2%'!">?'(8(8:bdmn#&&#YL#9Lnvv$iz;Zz!EAIz;Z1[] ^j3./b! &**b0!#<"D"DZQT"UV!"st3H?H'(?(?8T!*s"23!"% **>:I"-44ZDE&&y1j3&'#,33JsCD$$Y/j3&'"*s*+%  &)@:AA"cJK%%%'&&&( ' GNNtZ[Q  	- 77??8,D		- -d <[s    U
 U:U?
)U76U7c                 :    SnU[        U R                  5      -  nU$ )NzParforDiagnostics:
)r  r  rs  rI  s     rh   __str__ParforDiagnostics.__str__  s!    #	T$##$$rl   c                 
    SnU$ )Nr  rk   r  s     rh   rx  ParforDiagnostics.__repr__  s     rl   )r  rn  r  r  r  r  r  r  r  r  r  rm  r  r  r  r`   )r   )r|   r}   r~   r   r  rt  r  propertyr  setterr  r  r  r  r  r  r(  r,  r5  rM  rY  rr  r  r  r  r  r  r  rx  r   rk   rl   rh   r  r    s          '%
A

&P&
8t:*X*)X?B^D@:> 2n\`
rl   r  c                   2    \ rS rSrSr0 S4S jrS rS rSrg)PreParforPassi  zoPreprocessing for the Parfor pass. It mostly inlines parallel
implementations of numpy functions if available.
Nc	                     Xl         X l        X0l        X@l        XPl        X`l        Xpl        Uc  [        nXl        SSS.U l	        g )Nr   )replaced_funcreplaced_dtype)
r  r  	calltypes	typingctx	targetctxoptionsswappedswap_functions_mapreplace_functions_mapstats)	rs  r  r  r  r  r  r  r  r  s	            rh   rt  PreParforPass.__init__  sF    """ ($6!%:"

rl   c                 L   [        U R                  U R                  U R                  U R                  5        U R
                  R                  (       a%  U R                  U R                  R                  5        [        U R                  R                  5      U R                  l        g)z(Run pre-parfor processing pass.
        N)
r7   r  r  r  r  r  rO  _replace_parallel_functionsr  r5   rw  s    rh   r  PreParforPass.run  sf     	 dll $	@<<,,T\\-@-@A*4<<+>+>?rl   c           	      
  ^ ^^^^^^^ T R                   mSSKJm  [        UR	                  5       5      mT(       Ga9  TR                  5       u  nm[        TR                  5       GH  u  mn[        U[        R                  5      (       d  M(  UR                  nT R                  UR                     mUR                  m[        T[        R                  5      (       aI  TR                   S:X  a9  UUUUUU UU4S jn[#        U5      (       a  T R$                  S==   S-  ss'     GOGM  [        T[        R                  5      (       d  M  TR                   S:X  d  M  TR&                  S:X  d  GM  T R                  TR                  R                     n[        U[(        R*                  R,                  5      (       d  GMV  UR.                  nTR0                  nUR2                  n	[        R4                  " U[7        S	5      U	5      n
[(        R8                  R;                  [<        5      T R                  U
R                  '   [        R>                  " S
[<        U	5      n[        R                  " XU	5      n[A        U5      nUS:X  a  Sn[        R4                  " U[7        S5      U	5      n[(        RB                  " U5      T R                  UR                  '   [        R                  " [        RD                  " X5      X5      n[        R4                  " U[7        S5      U	5      n[G        [<        R.                  5      n[H        RJ                  R(                  RM                  U5      nURO                  T RP                  T R                  UR                     40 5        [(        RR                  RM                  U5      T R                  UR                  '   [        R                  RU                  U
SU	5      n[        R                  " UUU	5      n[        R4                  " U[7        S5      U	5      n[(        R*                  RW                  U5      T R                  UR                  '   [        R                  RY                  UU/SU	5      n[        R                  " UUU	5      n[[        T R                  UR                     T R                  UR                     5      T R\                  U'   UUl        TR                  R_                  SU5        TR                  R_                  SU5        TR                  R_                  SU5        TR                  R_                  SU5        T R$                  S==   S-  ss'     O   T(       a  GM8  gg)z
Replace functions with their parallel implementation in
replace_functions_map if available.
The implementation code is inlined to enable more optimization.
r   )inline_closure_callr  c                    > [        TR                  TR                  5      n [        TR                  T5      nTR                  R                  US 5      nUc  [        U5      S:X  a  [        US   [        R                  5      (       a~  [        TR                  US   R                     [        R                  R                  5      (       a;  [        R                  US   S 5      nUb  TR                   R#                  SUS   5        [%        US L5        ['        U4S jTR                    5       5      nTR(                   VVs0 s H  u  pEUTR                  UR                     _M!     nnn U" T/UQ70 UD6n[%        US L5        [*        R,                  " U5      R.                  " U0 UD6R                   n[0        R0                  " TR                  R2                  R                  R4                  5      n[6        US'   [8        US'   [:        US'   [<        R                  US 5      n	U	b  U	R                  XR                  '   T" TR                  UTTUTR>                  TR@                  UTR                  TRB                  T5      u  p[E        U
SS	9nU HQ  nURG                  5        H:  u  pNUS   S
:X  d  M  XRH                  U TRJ                  T   RL                  /TU'     MO     MS     gs  snnf !   S n GN|= f)Nr   r   r   c              3   V   >#    U  H  nTR                   UR                     v   M      g 7fr`   )r  rm  )r$  re   rs  s     rh   r%  RPreParforPass._replace_parallel_functions.<locals>.replace_func.<locals>.<genexpr>  s     (Qy!aff)=ys   &)r   r   r(  F)topological_orderingrt   T)'r?   r  rn  r9   r  r  r   r   r	   r|  r  rm  r   r   r   replace_functions_ndarrayry   insertr<   r4  kwsr   pysignaturebindr  r  __globals__r   rO  r(  replace_functions_checkers_mapr  r  r  r3   r  r|   r  r  )func_defcallname	repl_functypsr#  re   kws_typsnew_funcgcheck
new_blocks_
call_tabler  r  r  exprr   r  lhs_typrs  r  	work_lists                  rh   replace_func?PreParforPass._replace_parallel_functions.<locals>.replace_func  s   '5dllDII'NH'4T\\4'HH(,(B(B(F(FxQU(VI ) 1 #H 2 *8A; ? ? *4<<8H8H+I+0>>+?+?!A !A,E,I,I(ST+W[,\	#,#8$(II$4$4Q$D#IT$9:#((Qtyy(Q#QDLPHH'UHDA4<<+?(?HH'U0,5g,Q,Q,Q $HD$89#(#4#4X#>#C#CT#VX#V#[#[D $		$,,*>*>*C*C*O*O PA).AgJ&+AdG(,AfI %C$F$FxGK%ME$005

**,?a,11hPTP^P^,0$,,PY-[MJ *8
Y^)_J )3,0JJLDA'(t/@'@6>@R@RT\^c^h^hij^k^o^o5p
(- -9 )3
 $(? (V0+/s   &K&+K, ,K3r  r   getattrr   	$np_g_varr   boolbool_z$np_typ_varz$dtype_attr_varz
$dtype_varrk   r  N)0r  numba.core.inline_closurecallr  r  r  poprb  r  r   r	   Assigntargetr  rm  r  r  r  r;   r  r  r   r   r   r   scoper  r|  r    miscModulerO  Globalr  StringLiteralConstfind_templater   corerR   get_call_typer  	functionsr
  DTyper  rQ   r  r  )rs  r  r  instrlhsr  typr   r  r  g_np_varg_npg_np_assign	dtype_strtyp_vartyp_var_assigndtype_attr_vartemptfuncdtype_attr_getattrdtype_attr_assign	dtype_vardtype_getattrdtype_assignr  r  r   r  r  r  r  s   `                       @@@@@@@rh   r  )PreParforPass._replace_parallel_functions  s    ,,E(	$==?LE5%ejj15eRYY//,,C"ll3884G ;;D!$00TWW5F0( 0(b !.. JJ71<7! / %T2773398L))w. #ll4::??;%c5>>+?+?@@ %(IIE$)KKE"'))C')vve];5OQT'UH:?**:K:KE:RDLL7#%99T5##>D*,))DC*HK ),E
I(F2,3	&(ff %}]'CS'JG9>9L9L ):+DLL6-/YY " 8'.HN .0VVE=IZ;[]`-aN#0#=D$)JJ$4$4$=$=d$CE!//gllA[@]_ab@E@X@XY]@^DLL)<)<=137TW1X.02		:Ln^a0b- )+umL6QSV(WI;@>>;O;OPU;VDLL8,.GGLL'TVX[,\M+-99]Is+SL<E $Y^^ <dll7<<>X=ZDNN=9 +4EK!JJ--a>!JJ--a1BC!JJ--a@!JJ--a= JJ'78A=8!m 2 irl   )	r  r  r  r  r  r  r  r  r  )	r|   r}   r~   r   r  rt  r  r  r   rk   rl   rh   r  r    s     #%D
$@A"rl   r  c                     [         R                  R                  R                  R                  R
                   H  nUR                  U :X  d  M  Us  $    g r`   )r   r  r   	templatesbuiltin_registryr  rD  )r  fts     rh   r  r  ;  s9    jj))::DD66R<I Erl   c                   .    \ rS rSrSr\" 5       4S jrSrg)ParforPassStatesiA  zCThis class encapsulates all internal states of the ParforPass.
    c                    Xl         X l        X0l        XPl        X`l        X@l        Xpl        Xl        U
R                  U l	        U
R                  U l
        U
R                  U l        [        R                  " U R                  U R                   U R                  U R                  5      U l        [        R                  R!                  [#        UR$                  R'                  5       5      5        Xl        Xl        SU	;  a  0 U	S'   g g )Nr   )r  r  r  r  r  r   r  diagnosticsr  swapped_fnsr  r  rZ   ArrayAnalysisr   _the_max_labelrR  r   r  r  r  metadata)rs  r  r  r  r   r  r  r  r  r:  r6  s              rh   rt  ParforPassStates.__init__E  s     """&&&33&22"-"@"@,::NNDLL$,,
 	&&s7>>+>+>+@'AB
 H$"$HY %rl   )rZ   r  r6  r  r  r  r:  r  r  r   r7  r  r  r  N)r|   r}   r~   r   r  r  rt  r   rk   rl   rh   r4  r4  A  s    
 /0%rl   r4  c                   0    \ rS rSrSrS rS rS rS rSr	g)	ConvertInplaceBinopi_  0Parfor subpass to convert setitem on Arrays
    c                     Xl         / U l        gz6
Parameters
----------
pass_states : ParforPassStates
Npass_states	rewrittenrs  rB  s     rh   rt  ConvertInplaceBinop.__init__b       'rl   c           
      
   U R                   n[        U5      nU GH  nX   n/ nUR                  R                  U5      nUR                   GH  n[        U[        R                  5      (       GaK  UR                  n	UR                  n
[        U
[        R                  5      (       Ga  U
R                  S:X  Ga  U
R                  nU
R                  nU
R                  nUR                  UR                      nUR                  UR                      n[        U["        R$                  R&                  5      (       a  [        U["        R$                  R&                  5      (       aZ  U R)                  UXR*                  X5      nU R,                  R/                  [1        UUSS95        U[        R                  " XU5      /n[        U[2        5      (       a  UR5                  U5        GM  UR/                  U5        GM     Xel        GM     g )Ninplace_binopoldnewreason)rB  r0   rZ   get_equiv_setr  r   r	   r  r  r  r  r  r  r  rhsr  rm  r   r   r   _inplace_binop_to_parforimmutable_fnrC  r{  r  r  r+  )rs  r  rB  
topo_orderr  r  new_bodyr  r  r  r  r  r  r  
target_typ	value_typ	new_instrs                    rh   r  ConvertInplaceBinop.runk  s   &&$V,
  EMEH#22@@GIeRYY//,,C ;;D!$00TWW5O"hh!% $%0%8%8%E
$/$7$7

$C	%j%..2F2FGG))U^^5I5IJJ,0,I,I)(+->->-O	 $ 5 5$(U	0?%A!" *3BIIf34O(PeT**OOE*OOE*1 $2 "J;  rl   c           
      l   U R                   nUR                  nUR                  UR                     nUR                  n	[
        R                  " Xr5      n
UR                  UR                     nUR                  U5      n[        UR                  XU5      u  p[        5       n[
        R                  " Xr5      n[        UR                  X}U5      u  nn[
        R                  " U[        S5      U5      nUR                  UR                  UR                  '   [
        R                  R                  UUU5      n[        UR                  UU5      UR                   U'   UR"                  R%                  [
        R&                  " UUU5      5        [
        R                  " U[        S5      U5      nXR                  UR                  '   [
        R                  R                  UUU5      n[        XU5      UR                   U'   UR"                  R%                  [
        R&                  " UUU5      5        [
        R                  " U[        S5      U5      nXR                  UR                  '   [
        R                  R)                  UUUU5      nUR"                  R%                  [
        R&                  " UUU5      5        U R                   R*                  R-                  XR                  5      n[        UUU5      UR                   U'   [
        R.                  " UUUU5      n[        [0        R2                  UUU	5      UR                   U'   UR"                  R%                  U5        [5        X0 UUUSUR6                  5      nUU0Ul        [:        R<                  S:  a  [?        S5        URA                  5         U$ )generate parfor from setitem node with a boolean or slice array indices.
The value can be either a scalar or an array variable, and if a boolean index
is used for the latter case, the same index must be used for the value too.

$value_varz$target_var$expr_out_var)rH  r^  r   zparfor from inplace_binop)!rB  r  r  rm  r   r	   Block	get_shape_mk_parfor_loopsr!   _make_index_varr|  r    r  getitemrQ   r  r  r{  r  binopr  unify_pairsSetItemr   noner  r  r  r   DEBUG_ARRAY_OPTrd   r  )rs  r  r  r  r  r  rB  r  arr_typel_typr  rT  	size_vars
index_vars	loopnests
body_label
body_blockr  index_var_typ	value_vargetitem_call
target_varexpr_out_var
binop_exprunified_typesetitem_noder   s                              rh   rO  ,ConvertInplaceBinop._inplace_binop_to_parfor  s   
 &&%%fkk2XXe)
''

3	''/	 !11D1DiX[ \
  \
XXe)
#2##U
$D 	= FF5-"=sC	.7ooINN+wwui=.7OOY/7l+ryyy#FG VVE=#?E
/5JOO,wwvy#>.7]/,l+ryyz3GH vve]?%CSI17L--. WW]]2z9cB
ryy\3GH''11==fooV,5,-6j) zz&)\3G.7JJ/8l+|,	r3	9-{/@/@B&
3!!Q&-.KKMrl   c                     [         R                  nU R                  R                  R	                  U[        U5      0 5      $ r`   operatorr_  rB  r  resolve_function_typer4  rs  ry   fntys      rh   _type_getitem!ConvertInplaceBinop._type_getitem  3    ))??eDkSUVVrl   rA  N)
r|   r}   r~   r   r  rt  r  rO  r{  r   rk   rl   rh   r=  r=  _  s    #"J>@Wrl   r=  c                 p    [        U [        R                  5      (       a  U R                  $ U R                  $ r`   )r   r	   rb  r   r  rA  s    rh   get_index_varr    s%     BJJ//177@Q[[@rl   c                   4    \ rS rSrSrS rS rS	S jrS rSr	g)
ConvertSetItemPassi  r>  c                     Xl         / U l        gr@  rA  rD  s     rh   rt  ConvertSetItemPass.__init__  rF  rl   c                    U R                   n[        U5      nU GH  nX   n/ nUR                  R                  U5      nUR                   GH  n[        U[        R                  [        R                  45      (       GaO  UR                  n	UR                  n
[        U5      nUR                  nUR                  U
R                     nUR                  UR                     nUR                  UR                     n[        U[        R                   R"                  5      (       Ga  [        U[        R                   R"                  5      (       Ga  [        UR$                  [        R&                  5      (       Ga[  UR(                  UR(                  :X  Ga@  [        U[        R*                  5      (       a;  U R-                  UXX5      nU R.                  R1                  [3        UUSS95        UnGO[        U[        R                   R"                  5      (       a  [5        [6        UR8                  UR                  5      n[        U[        R:                  5      (       ax  UR<                  S:X  ah  UR>                  R                  UR                  :X  aD  U R-                  UXUUR                  5      nU R.                  R1                  [3        UUSS95        UnOURA                  U5      n[        U[        RB                  5      (       a*  [E        [G        [I        S UR                  5      5      5      nO.[        U[        RJ                  RL                  5      (       a  SnOSnUbq  [        U[        R                   R"                  5      (       a  UUR(                  :X  a8  U R-                  UXXUS9nU R.                  R1                  [3        UUS	S95        UnUR1                  U5        GM     Xel        GM     g )
Nmasked_assign_broadcast_scalarrI  r_  masked_assign_arrayc                 J    [        U [        R                  R                  5      $ r`   )r   r   r  	SliceTyperA  s    rh   rJ  (ConvertSetItemPass.run.<locals>.<lambda>  s    jEJJ<P<P.Qrl   r   r   )r   slice)'rB  r0   rZ   rM  r  r   r	   StaticSetItemrb  r  r  r  r  r  rm  r   r   r   r   Booleanr   Number_setitem_to_parforrC  r{  r  r;   r?   r  r  r  r   r\  r  r   r  filterr  r  )rs  r  rB  rQ  r  r  rR  r  r  r  r  r   r  rS  	index_typrT  rU  val_defr   sliced_dimss                       rh   r  ConvertSetItemPass.run  s   && %V,
  EMEH#22@@GIeb&6&6

%CDD))C"\\F)%0E!KKE!,!4!4V[[!AJ + 3 3EJJ ?I + 3 3EJJ ?I!*enn.B.BCC&y%..2F2FGG&yFF&OOy~~=))U\\BB,0,C,CI(+U-C	 $ 5 5$(U	/O%Q!" )2!+Iu~~7K7K!L!L*/@S@S05

+<$.w$@$@$+JJ)$;$+MM$6$6%**$D040G0G	,/1OI$(NN$9$9(,I4I)K%& -6E %.$7$7$>E))U__EE /2$v$Q$-OO85 36 /7 ",Iuzz7K7K!L!L /0./
 !& 1%/	5>>;O;O%P%P!,	!>,0,C,CI(+U -D -P	 $ 5 5(,I4;)=!" )2&I $J "JS  rl   Nc           
      
   U R                   nUR                  nUR                  UR                     n	U	R                  n
UR                  UR                     n[
        R                  " X5      nU(       Ga  [        U[        R                  5      (       d!  [        U[        R                  5      (       d   eUn[
        R                  " U[        S5      U5      n[
        R                  R                  X4U5      n[        R                   R#                  X5      R$                  nUUR                  UR                  '   U R'                  X45      UR(                  U'   UR+                  [
        R,                  " XU5      5        UnO>[        U[        R.                  5      (       d   eUR1                  U5      nUR                  n/ n/ nU Hy  n[
        R                  " U[        S5      U5      nUR+                  U5        [        R2                  UR                  UR                  '   UR+                  [5        USUS5      5        M{     [7        5       n[
        R                  " X5      n[9        UR                  UUU5      u  nn[;        UU0 UUUSUR<                  5      nU(       a  UU0Ul        UnSnO[7        5       n[
        R                  " X5      n[7        5       n[
        R                  " X5      nUUUUUU0Ul        [
        R                  " U[        S5      U5      nWUR                  UR                  '   [
        R                  R                  UUU5      nUR@                  RC                  [
        R,                  " UUU5      [
        RD                  " UUUU5      /5        UR                  UR                     n [        U [        RF                  RH                  5      (       a  [
        R                  " U[        S5      U5      n!U R                  UR                  U!R                  '   [
        R                  R                  UUU5      n[K        U R                  U U5      UR(                  U'   UR@                  R+                  [
        R,                  " UU!U5      5        OUn![
        RL                  " UUU!U5      n"[K        [        RN                  UR                  UR                     UU
5      UR(                  U"'   UR@                  R+                  U"5        U(       a0  UR@                  R+                  [
        RP                  " UU5      5        [R        RT                  S:  a  [W        S	5        URY                  5         U$ )
rX  z$subarrparfor_indexr   r   )setitemr^  Nz	$mask_varrY  zparfor from setitem)-rB  r  r  rm  r   r	   r[  r   r   r  r  r|  r    r  r_  r   	arraydeclget_array_index_typeresultr{  r  r{  r  ArrayCompatibler\  uintprp  r!   r^  r  r  r  r  r+  Branchr   r   rQ   rb  rc  Jumpr   rd  rd   r  )#rs  r  r  r  r   r  r   rB  r  re  rf  r  r  rg  
subarr_varrn  
subarr_typbool_typri  rh  size_varr  rj  rk  rl  r   
true_block	end_label
true_label	end_blockmask_varmask_valrT  rm  rs  s#                                      rh   r  %ConvertSetItemPass._setitem_to_parfor7  sK   
 &&%%fkk2''

3	XXe)
 i99i99; : I}Y'?EJ77??6#>L))>>SZZJ3=K
0262D2DgEY2ZK!!,/bii#FGF i)>)>??@?!++F3I H 	
!HumN&CSIIi(27++K	/XiHa@A	 "  \
XXe)
#2##UJ
$D 	=	:r3	9'):):< *J7F#JI $J%-J"I,I *J *J )I "F vve];%?EH19K.wwui=HOO""yy8S1yy:y#>$ 
  ''

3	i!5!566umL&A3GI2;//K	/77??5)SAL2;M3;K!!,/OO""299\9c#JKIzz&)YD.7JJ++FKK8-/Ql+|,OO""2779c#:;!!Q&'(KKMrl   c                     [         R                  nU R                  R                  R	                  U[        U5      0 5      $ r`   rv  ry  s      rh   r{   ConvertSetItemPass._type_getitem  r}  rl   rA  r`   )
r|   r}   r~   r   r  rt  r  r  r{  r   rk   rl   rh   r  r    s     P"d\|Wrl   r  c                 v   [        U5      nUR                  nUS:  d  U(       a  [        R                  " U[	        S5      U5      n[
        R                  R                  [
        R                  U5      XR                  '   [        R                  R                  [        U5      U5      n[        R                  " XU5      n	UR                  R                  U	5        U[
        R                  R                  [
        R                  U5      4$ US:X  a  US   [
        R                  4$ [         R"                  " SUS9e)a  When generating a SetItem call to an array in a parfor, the general
strategy is to generate a tuple if the array is more than 1 dimension.
If it is 1 dimensional then you can use a simple variable.  This routine
is also used when converting pndindex to parfor but pndindex requires a
tuple even if the iteration space is 1 dimensional.  The pndindex use of
this function will use force_tuple to make the output index a tuple even
if it is one dimensional.
r   z$parfor_index_tuple_varr   z,Parfor does not handle arrays of dimension 0r  )r   r  r	   r|  r    r   
containersUniTupler  rm  r  build_tupler  r  r  r{  r   UnsupportedRewriteError)
r  r  rh  rk  force_tuplendimsr  	tuple_var
tuple_calltuple_assigns
             rh   r^  r^    s     
OE
..CqyKFF5-%#'(+-	"'"2"2";";KK# WW((j)93?
yy<|,%**33EKKGGG	!!}ekk)),,:
 	
rl   c           	          / n/ nU Hn  n[         R                  " U[        S5      U5      nUR                  U5        [        R
                  XR                  '   UR                  [        USUS5      5        Mp     XT4$ )F
Create loop index variables and build LoopNest objects for a parfor.
r  r   r   )r	   r|  r    r{  r   r  rm  rp  )r  rg  r  r  ri  rh  r  r  s           rh   r]  r]    sq     IJFF5-"?E	)$"'++)Q!<=	 
   rl   c                   H    \ 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)ConvertNumpyPassi  zQ
Convert supported Numpy functions, as well as arrayexpr nodes, to
parfor nodes.
c                     Xl         / U l        g r`   rA  rD  s     rh   rt  ConvertNumpyPass.__init__      &rl   c           
      z   U R                   n[        U5      n/ nU GH  nX   n/ nUR                  R                  U5      nUR                   GH_  n	[        U	[        R                  5      (       Ga*  U	R                  n
U	R                  nU R                   R                  UR                     nU R                  U5      (       a  [        U R                  U
5      (       a<  U R                  XU
5      nUb&  U R                   R#                  [%        U	USS95        Un	Og[        U
[        R&                  5      (       aH  U
R(                  S:X  a8  U R+                  XX5      nU R                   R#                  [%        U	USS95        Un	UR#                  UR                  5        UR#                  U	5        GMb     Xvl        GM     g )Nnumpy_allocatorrI  	arrayexpr)rB  r0   rZ   rM  r  r   r	   r  r  r  r  rm  _is_C_or_F_orderr;   _is_supported_npycall_numpy_to_parforrC  r{  r  r  r  _arrayexpr_to_parfor)rs  r  rB  rQ  
avail_varsr  r  rR  r  r  r  r  r  rU  s                 rh   r  ConvertNumpyPass.run  s{   &&$V,
 
EMEH#22@@GIeRYY// ;;D,,C"..66sxx@G,,W55 !;!;TBB(,(=(=id(SI(4 $ 5 5d(-(1+<7" !#
 )2'bgg66477k;Q(,(A(A ))BI NN11$$)$-'23 
 %.E%%chh/&3 $4 "J=  rl   c                    [        U[        R                  R                  5      (       a%  UR                  S:H  =(       a    UR
                  S:  $ U[        L ai  U R                  R                  U   n[        U[        R                  R                  5      =(       a%    UR                  S:H  =(       a    UR
                  S:  $ g)NCr   F	r   r   r   r   layoutr   r  rB  r  rs  arr_namer  s      rh   _is_C_orderConvertNumpyPass._is_C_order  s    h 4 455??c)?hmma.??_""**84CsENN$8$89 !JJ#%!HHqL" rl   c                    [        U[        R                  R                  5      (       a;  UR                  S:H  =(       d    UR                  S:H  =(       a    UR
                  S:  $ U[        L a  U R                  R                  U   n[        U[        R                  R                  5      =(       a;    UR                  S:H  =(       d    UR                  S:H  =(       a    UR
                  S:  $ g)Nr  Fr   Fr  r  s      rh   r  !ConvertNumpyPass._is_C_or_F_order  s    h 4 455OOs*Dhoo.D[(--Z[J[[_""**84CsENN$8$89 !ZZ3&;#***;!HHqL" rl   c                 J   U R                   nUR                  nUR                  nUR                  nUR                  UR
                     n	U	R                  n
UR                  U5      n[        UR                  XU5      u  p[        R                  " Xg5      n[        UR                  UR                  UR                  U[        U5      XUUR                  UR
                     5	      Ul        [!        5       n[        R                  " Xg5      n[        R"                  " U[%        S5      U5      nXR                  UR
                  '   ['        UR                  XlU5      u  nnUR                  R)                  [+        UR,                  UR                  UR                  UR                  UUUUUUU5      5        SR/                  [1        UR                  5      5      4n[3        X0 UUUUS   UR4                  5      n[        R6                  " UUUU5      n[9        [:        R<                  UR                  UR
                     UU
5      UR                  U'   UR                  R?                  U5        UU0Ul         [B        RD                  S:  a  [G        S5        URI                  5         U$ )zUgenerate parfor from arrayexpr node, which is essentially a
map with recursive tree.
rZ  zarray expression {}r   r   zparfor from arrayexpr)%rB  r  r  r  r  rm  r   r\  r]  r	   r[  r"   r  r  r4  r  r!   r|  r    r^  r+  _arrayexpr_tree_to_irr  r8  repr_arrayexprr  r  rb  rQ   r   rc  r{  r  r   rd  rd   r  )rs  r  r  r  r  rB  r  r  r  re  rf  rg  rh  ri  r  rj  rk  rp  r  rl  patr   rs  s                          rh   r  %ConvertNumpyPass._arrayexpr_to_parfor	  sE    &&		gg~~%%chh/ '',	 01D1DiX[ \
 XXe)
"!!!6!6)fS)	+

  \
XXe)
vve]?%CSI17L--.#2J$@ 	= 	!##%%##%%	 %++N9>>,JKM	r3	9cRSfVaVgVghzz#y,D.7JJ++CHH5}f/Nl+|,&
3!!Q&)*KKMrl   c                     [        U R                  R                  U5      u  p#[        U[        5      (       a  UR                  S5      (       d  gUS;   a  gUS:X  a  U[        ;   a  gg)z<check if we support parfor translation for
this Numpy call.
rO  Fr   onesTnumpy.random)r9   rB  r  r   r  
startswithrW   )rs  r  	call_namemod_names       rh   r  &ConvertNumpyPass._is_supported_npycallC  s`     ,D,<,<,D,DdK	8S))h.A.A'.J.J))~%)|*Crl   c                 
   [        U R                  R                  U5      u  pEUR                  n[	        UR
                  5      nUS;   d  US:X  a  U R                  XX&Xs5      $ [        R                  " SU 3UR                  S9e)Nr  r  zparfor translation failed for r  )
r9   rB  r  ry   r  r  _numpy_map_to_parforr   r  r  )rs  r  r  r  r  r  ry   r  s           rh   r  !ConvertNumpyPass._numpy_to_parforQ  s{    +D,<,<,D,DdK	yy488n))X-G,,Y3cXX,,,TF3
 	
rl   c                    U R                   nUR                  nUR                  n	UR                  UR                     n
U
R
                  nUR                  U5      nUc   [        R                  S:  a  [        S5        g[        UR                  XU	5      u  p[        R                  " X5      n[        UR                  UR                  UR                  U[!        U5      XU	UR                  UR                     5	      Ul        [%        5       n[        R                  " X5      n[        R&                  " U[)        S5      U	5      nXR                  UR                  '   [+        UR                  XU5      u  nnUS:X  a  [        R,                  " U" S5      U	5      nOUS:X  a  [        R,                  " U" S5      U	5      nOU[.        ;   a  [1        X&5        [3        XgR                  5      u  nnUR                  R5                  U5        UR                  UR6                  R                     R9                  [:        R<                  " 5       UU5      UR                  U'   UnO[?        SRA                  U5      5      e[        RB                  " UUU	5      nUR"                  RE                  U5        [        RF                  " UUUU	5      n[I        [J        RL                  UR                  UR                     UU5      UR                  U'   UR"                  RE                  U5        [O        X0 U	UUS	RA                  U5      S
4URP                  5      nUU0Ul)        [        R                  S:  a  [        S5        URU                  5         U$ )z8generate parfor from Numpy calls that are maps.
        Nr   z3Could not convert numpy map to parfor, unknown sizerZ  r   r   r  z,Map of numpy.{} to parfor is not implemented{} functionzNumPy mappingzgenerated parfor for numpy map:)+rB  r  r  r  rm  r   r\  r   rd  rd   r]  r	   r[  r"   r  r  r4  r  r!   r|  r    r^  r  rW   _remove_size_arg_get_call_arg_typesr  rn  r  r   ContextNotImplementedErrorr8  r  r{  rb  rQ   r   rc  r  r  r  r  )rs  r  r  r  ry   r  r  rB  r  r  re  rf  rg  rh  ri  r  rj  rk  rp  r  rl  r  new_arg_typsnew_kw_typesvalue_assignrs  r   s                              rh   r  %ConvertNumpyPass._numpy_map_to_parfor\  s    &&		gg%%chh/ '',	%%*KL 01D1DiX[ \
 XXe)
"!!!6!6)fS)	+

  \
XXe)
vve]?%CSI17L--.#2J$@ 	= HHVAY,E& HHVAY,E,&Y-)<))*+&L,!!%%d+*5*=*=diinn*M*[*[ ,+>K!!$'E%>EEiPR R yyc:|,zz#y,D.7JJ++CHH5}f/Nl+|,	r3	9&--i9?K#))+ '
3!!Q&34KKMrl   rA  N)r|   r}   r~   r   r  rt  r  r  r  r  r  r  r  r   rk   rl   rh   r  r    s2    $"L		8t	
Brl   r  c                   0    \ rS rSrSrS rS rS rS rSr	g)	ConvertReducePassi  z2
Find reduce() calls and convert them to parfors.
c                     Xl         / U l        g r`   rA  rD  s     rh   rt  ConvertReducePass.__init__  r  rl   c           
      T   U R                   n[        U5      nU GH
  nX   n/ nUR                  R                  U5      nUR                   H  nS n	[        U[        R                  5      (       a  UR                  n
UR                  nUR                  n[        [        UR                  U5      nUS:X  d  US:X  a"  [        U R                  X{UR                  U
5      n	U	(       a&  U R                   R#                  [%        U	USS95        U	nUR#                  U5        M     Xel        GM     g )N)r   r   )r   
_functoolsr   )rK  rJ  rL  )rB  r0   rZ   rM  r  r   r	   r  r  r  r  r;   r9   r  _reduce_to_parforry   rC  r{  r  )rs  r  rB  rQ  r  r  rR  r  r  r   r  r  r  r  s                 rh   r  ConvertReducePass.run  s	   &&$V,
EMEH#22@@GIeRYY//))C,,C ;;D$]K4G4GNH $::#'??!&t'='=y'+yy#"7--d & %#+/ 
 !'&' $( "J1  2 	rl   c                 .  ^ U R                   nUR                  nUS   nUS   n[        UR                  UR                  5      n	Sn
Sn[        [        UR                  UR                  U	5      nU(       a  Uu  ppUS   nUR                  Uc  UOU
5      nUc  g[        UR                  XU5      u  mnTnU(       a  [        S5      eUn[        R                  " Xd5      nUR                  R                  [        R                   " UUU5      5        [#        5       nU R%                  UXdTUU5      u  nnU(       a  [        S5      eU
b  ['        UR)                  5       5      n[+        UR)                  5       5      n[        R                  " Xd5      nUUU'   [        R,                  " U[/        S5      U5      nWUR                  UR                  '   [        R0                  R3                  U
UU5      nUR                  R5                  [        R                   " UUU5      [        R6                  " UUUU5      /5        [9        UUUUUUSR;                  U5      S4UR<                  5      n[>        R@                  S:  a  [C        S	5        URE                  5         U$ )
za
Convert a reduce call to a parfor.
The call arguments should be (call_name, array, init_value).
r   r   Nr   unreachablez	$mask_valr  	reductionzparfor from reduction)#rB  r  r?   r  rm  r;   
_find_maskr  r\  r]  AssertionErrorr4  r	   r[  r  r{  r  r!   _mk_reduction_bodyr   r  r   r|  r    r  r_  r+  r  r  r8  r  r   rd  rd   r  )rs  r  r  ry   r  rB  r  r  r   arr_defr  mask_indicesmask_query_resultmask_typr   rg  ri  
mask_indexacc_varr  rj  r  r  r  false_labelrk  maskr  r   rh  s                                @rh   r  #ConvertReducePass._reduce_to_parfor  sU   
 &&		G	a !4!4fkkB "*k.A.A;CVCVX_`7H4Fh7'',2FHU	 01D1DiX[ \
I
 // XXe)
ryy7C@A  \
#66y %J I	9 // Y^^-.Jinn./K%-J$.Ij!66%{!;SAD-5K		*wwxC@HOO""yy4-yyz;<$ 
 	:y#y!M$8$8$C$/$12=2C2CE !!Q&)*KKMrl   c           	         SSK Jn  U R                  n[        UR                  U5      n	U" UR                  U	5      n
UR
                  UR                     nUR                  n[        R                  " X#5      n[        UR
                  X$U5      u  p[        R                  " U[        S5      U5      nXR
                  UR                  '   [        R                  R                  X^U5      n[        XU5      UR                   U'   UR#                  [        R$                  " UUU5      5        ['        U
UR                  R(                  R*                  R,                  UR.                  UR0                  X4UR
                  UR                   5      nUR2                  n[5        5       n[        R                  " X#5      nUUU'   [7        UR2                  R9                  5       5      nUR2                  U   nUR:                  R=                  UR:                  5        UR:                  Ul        [?        UUU/5        [A        UUU5        UU4$ )zJ
Produce the body blocks for a reduction function indicated by call_name.
r   )check_reduce_funcz$val)!r  r  rB  r?   r  r  rm  r   r	   r[  r^  r|  r    r  r_  rQ   r  r{  r  r>   r  rn  r  r  r  r  r!   r   r  r  r+  rA   rB   )rs  r  r  r  rh  r   r  r  rB  reduce_funcfcodere  in_typrk  r  index_var_typetmp_varrn  reduce_f_irr  r  r  first_reduce_labelfirst_reduce_blocks                           rh   r  $ConvertReducePass._mk_reduction_body	  s   
 	D&&$[%8%8)D!+"5"5{C%%fkk2XXe)
$3J%@!	 &&f 5s;,2GLL)wwv#>.7^/-l+"))L'3?@)%(3(;(;(C(C(H(H(T(T(3(=(=(3(=(=)/(8(3(;(;(3(=(=?  &&	L	HHU(	(	) !3!3!8!8!:;(//0BC1667",//,w.@A	7I6)##rl   rA  N)
r|   r}   r~   r   r  rt  r  r  r  r   rk   rl   rh   r  r    s    >AF)$rl   r  c                   H    \ 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)ConvertLoopPassi7	  z*Build Parfor nodes from prange loops.
    c                     Xl         / U l        g r`   rA  rD  s     rh   rt  ConvertLoopPass.__init__:	  r  rl   c                   ^@^A^B^C^D^E^F^G U R                   mG[        U5      u  p#[        U5      n[        U5      n[	        XAUR
                  UR                  5      mBUR                  5       nUR                  5        Vs/ s H  ovU   [        Xg   R                  5      4PM      nn/ n	[        US S9 G
Hy  u  mCn
[        TCR                  5      S:w  d  [        TCR                  5      S:w  Ga  [        R                  (       d  TCR                   H  nX   R                   H  n[!        U["        R$                  5      (       d  M$  [!        UR&                  ["        R(                  5      (       d  MO  UR&                  R*                  S:X  d  Mk  U R-                  UR&                  R.                  R0                  U5      (       d  M  Sn[2        R4                  " [6        R8                  " XR:                  5      5        M     M     GMO  [=        TCR                  5      S   nX   R                   GH  n[!        U["        R$                  5      (       d  M%  [!        UR&                  ["        R(                  5      (       d  MP  UR&                  R*                  S:X  d  Ml  U R-                  UR&                  R.                  R0                  U5      (       d  M  TCR                   Vs/ s H  nX;   d  M
  UTCR>                  :w  d  M  UPM      nnUR&                  R@                  nU RC                  UR&                  R.                  R0                  U5      u  nnUTCR>                     R                  S S nS mE[E        U5       H  u  nn[!        U["        R$                  5      (       d  M'  [!        UR&                  ["        R(                  5      (       d  MR  UR&                  R*                  S:X  d  Mn  URF                  R0                  mEUn  O   TEc   eUS W UUS-   S  -   n[I        SUTCR>                     0TGRJ                  5      u  nnUS   n[M        UE4S	 jU 5       5      mFTFRO                  TE5        X   RP                  nUR:                  nTGRR                  RU                  TCR>                  5      n["        RV                  " UU5      nU RY                  X   UU5      Ul
        U Vs0 s H  oX   _M	     snmD[[        5       n["        RV                  " UU5      TDU'   [M        5       nU H!  nUR]                  UR                  U   5      nM#     [M        5       nTCR                   H  nUR]                  TBU   5      nM     UR_                  U5      n U R_                  U  V!s1 s H=  n![!        TGRJ                  U!   [`        Rb                  Rd                  5      (       a  M;  U!iM?     sn!5      n U HY  nTDU   R                  S   n"[!        U"["        Rf                  5      (       d  M6  U"RF                  TCR>                  :X  d  MR  UU"l#        M[     UDUF4S
 jm@S n#S n$U@UBUCUG4S jn%Sn&US:X  Ga  URi                  US   5      (       d   e[k        U%US   5      n'U'(       a  U'u  n(n#n)n$OUS   n([!        U(["        Rl                  5      (       d   eTGRJ                  U(R0                     n*[!        U*[`        Rn                  5      (       a[  ["        Rl                  " U[q        S5      U5      n+[`        Rr                  TGRJ                  U+R0                  '   [u        U+SU(S5      /nU+/mAO1URw                  U$c  U(OU#5      n,[y        TGRJ                  U,UU5      u  mAn[        U5      S:  d   eTAn-U$(       a  [{        UA4S jU$ 5       5      mATD[}        TDR                  5       5         n.["        RV                  " UU5      n/[        TGRJ                  UTAU/SS9u  n+n0U/R                  U.R                  -   n1U1U.l
        U$(       a  U-S   n2OU+n2U#b  [        S5      eGOSn9Sn:US   n;[        U5      S:X  a
  US   n9US   n;[        U5      S:X  a  US   n9US   n; TGR                  R                  US   5      n:[!        U:["        R                  5      (       d  [6        R                  " SUR:                  S9eU:R&                  n:U:S:w  a  [6        R                  " SUR:                  S9e["        Rl                  " U[q        S5      U5      n+[!        U9[        5      (       a  U9S:  a  [`        Rr                  n0O[`        R                  n0Sn&[u        U+U9U;U:5      /nU0TGRJ                  U+R0                  '   [}        TDR                  5       5      n<UTDU<   R                  -   TDU<   l
        TF V=s0 s H  n=U=U+_M     n>n=[        TDU>5        U&(       a  U R                  TDTFU+5        [        UUTDUU$(       a  W2OU+USUU4TGR                  U S9	n?U?/UTCR>                     l
        UTCR>                     R                  R                  U5        UTCR>                     R                  R                  ["        Rf                  " [=        TCR                  5      S   U5      5        U R                  R                  [        TCU?SS95        U H&  nUTCR>                  :w  d  M  UR                  U5        M(     [        R                  S:  d  GM  [        S5        U?R                  5         G	M     G
M|     g s  snf s  snf s  snf s  sn!f ! [         a     [6        R                  " SUR:                  S9ef = fs  sn=f )Nc                     U S   $ r  rk   )tups    rh   rJ  %ConvertLoopPass.run.<locals>.<lambda>I	  s    3q6rl   rC  r   r  z
prange or pndindex loop will not be executed in parallel due to there being more than one entry to or exit from the loop (e.g., an assertion).r   r2  
pair_firstc              3   <   >#    U  H  u  pUT:X  d  M  Uv   M     g 7fr`   rk   )r$  tr  
loop_indexs      rh   r%  &ConvertLoopPass.run.<locals>.<genexpr>	  s     )OqJ!!s   	c                    > [         R                   " T5      n TR                  5        H  nUR                  [        R                  5       Ho  n[        UR                  [        R                  5      (       d  M.  UR                  R                  U ;   d  MJ  U R                  UR                  R                  5        Mq     M     / n/ nTR                  5        H  nUR                   H  n[        S UR                  5        5       5      nXP-  (       d  M.  UR                  U 5      (       a  MF  [        [        U[        R                  5      5        UR                  n[        [        U[        R                   5      =(       a    UR"                  S;   5        UR%                  UR                  R                  5        UR%                  U5        M     M     X44$ )zhfind expressions that involve getitem using the
index variable. Return both the arrays and expressions.
c              3   8   #    U  H  oR                   v   M     g 7fr`   rm  r$  re   s     rh   r%  CConvertLoopPass.run.<locals>.find_indexed_arrays.<locals>.<genexpr>	  s     (J9IA9I   r_  static_getitem)r  r  
find_instsr	   r  r   r  r|  rm  r  r  r  r  r~  issubsetr<   r  r  r{  )	indicesr  r
  arrsexprslvr  r  loop_index_varss	          rh   find_indexed_arrays0ConvertLoopPass.run.<locals>.find_indexed_arrays	  sG    #'))O"<%.%5%5%7E(-(8(8(C$.tzz266$B$B$(JJOOw$>$+KK0@0@$A )D &8
  " "%.%5%5%7E(-

%((J9I(J%J#%<<'){{7';';(0$+JtRYY,G$H+/::D$+JtRWW,E -P'+ww2O'O%Q$(KK

$@$)LL$6 )3 &8  ${*rl   c                   > [        TR                  U 5      n[        U=(       aF    [        U[        R
                  5      =(       a%    UR                  S:H  =(       a    UR                  S:H  5        UR                  n[        R                  " TR                   Vs/ s H  nTU   PM
     sn6 nT
" 5       u  pV[        UR                  /[        U5      :H  5        [        UR                  U;  5        [        TR                  UR                  5      n[        TR                  TR                  U5      n[!        S5      es  snf )zSFind the case where size_var is defined by A[M].shape,
where M is a boolean array.
r
  r   r  )r?   r  r<   r   r	   r  r  r  r  r  r  exitsrm  r  r  r  r  )r  size_defarr_varrf   	live_vars
index_arrsindex_exprsr  r  r  r)  live_mapr  rB  s             rh   find_mask_from_size0ConvertLoopPass.run.<locals>.find_mask_from_size	  s     $2+2E2Ex#P !VZ"''-J !V (y 8!V=E]]g=UW"*..$'IITZZ/PZZ/P$Q	2E2G/
$z2B BCI =>"01D1Dhnn"U!+K,?,?ATATV]!^ -];; 0Qs   D<Tr   r  c              3   @   >#    U  H  nU(       a  UOTS    v   M     g7f)r   Nrk   )r$  re   rh  s     rh   r%  r  
  s$      /F8D1 56q:a=/H8Ds   )r  r  r   r4  z,Only known step size is supported for pranger  z/Only constant step size is supported for prangez4Only constant step size of 1 is supported for prangeFr   )r  r  )old_looprK  rL  zparfor from loop)XrB  r3   rN   rK   rL   usemapdefmaploopsr  r   r  r  entriesr,  r   DISABLE_PERFORMANCE_WARNINGSr   r	   r  r  r  r  _is_parallel_looprn  rm  warningswarnr   NumbaPerformanceWarningr  r  headerry   _get_loop_kindrb  r  r-   r  r  r  r  rZ   rM  r[  _get_prange_init_blockr!   r  intersectionr   r  r  r  	has_shaper;   r|  Integerr    r  rp  r\  r]  r4  r   r^  r  r8   r   r_  r+  r  r  r?   r  r  r  r+  intpr'   _replace_loop_access_indicesr  r  r{  rC  r  r  rd  rd   r  )Hrs  r  r  r  cfgusedefsr9  r#  sized_loopsmoved_blocksr   entryr
  r  rf   body_labelsry   	loop_kindloop_replacingheader_bodyhbir  li_indexcpsr  r  r  r  r  bodydefsbl
exit_livesr  re   	last_instr  r  r3  unsigned_indexr  r   r  
in_arr_typr  rg  
orig_indexfirst_body_blockrk  rl  r  orig_index_varrj  labelsr  r  r   r  r  r  r  first_body_labelr  index_var_mapr   r)  rh  r2  r  r  r  r(  rB  sH                                                                   @@@@@@@@rh   r  ConvertLoopPass.run>	  s	   &&&v.
%f-"6*#CP		?Dzz|L|!a#ehmm"45|Lk/ABGD!4<< A%TZZA)=::!%$*M$6$6D !+4 ; ;$.tzz277$C$C$(JJMMV$;$($:$:$(JJOO$8$8*%F %F'4
 !)$*$B$B(+XX%7!8 %7 ".$ &q)E**tRYY//&tzz277;; JJMMV3 224::??3G3GTT 04yy #Gy!$%K %&454D %&yK #G::??D040C0CDJJOODXDXDN1P-I~ #)"5":":3B"?K!%J%.{%;	T&tRYY77$.tzz277$C$C$(JJMM\$A)-)9)9J'*H! &< &121 #.ix"8;xPQz{;S"SK .q&2E.F.9.A.ACFCa&C&))O)O&OO#''
3"M//E((C + : : H H UI!#%!5J&*&A&A&-<F'NJO7B C{!FI{ CI *I+-88E3+?Ii(  #uH)#+>>'..2D#E *!$J"jj%/%5%5hrl%C
 )$11*=E "..5 0\5a%/0C0CA0F

HYHY%Z 125 0\ ]E )$-aL$5$5b$9	&y"''::%,,;/8I,	 )+4  $H#'L& &6 &*N !J.(2247;;<; "'':DG!D!GMDFHh%)!WF)&"&&99:9%0%8%8%E
%j%--@@(*umN6SUX(YIBG++K//	?%-iFA%F$GE*3J(1(;(;-9-A =CGO)QI0@ + 3 3Ys1-J  #5zA~.~%/
' */ /F8D/F *FJ+4S9I5J+K(%'XXeS%9
3B'//
J(,40	=  *1A1F1FF04(-'-7]N-6N $/"0"?? 0( !" #'7t9>$(GE'+AwHt9>$(GE'+AwH"'2':':'I'I$q''R $.dBHH#=#=&,&D&D$U(,'" !" $(::D#qy&,&D&D$Z(,'" !" %'FF5-2OQT$U	 &eS11eqj,1KKM,1JJM-2N!))UHd!K L>K++INN; ,/y~~/?+@(;FScIdIiIi;i	"238;J$K?aQ	\?M$K M:% 99%	C#E:y#6BN	$-%-y.$I$/$5$5U	DF 17xF4;;',
 4;;',,33K@4;;',,33BGGD<LQ<OQT4UVNN))$!%"%+  )+"JJqM ) --201m +1 C ML#GN !D&0\` $, "&,&D&D$R(,'" !""D %Ls<   ;%l.	l3"l34l3l8	:l=l=*m5m/*m,c                     X;  a  gX!   n[        U5      S:  =(       a_    US   S:H  =(       dP    US   [        :H  =(       d=    US   S:H  =(       d.    US   [        :H  =(       d    US   S:H  =(       d    US   [        :H  $ )NFr   r   rt   r   )r   r   rt   r   rs  func_varr  r  s       rh   r<  !ConvertLoopPass._is_parallel_loopy
  s    %#4y1} A$q'X"5 #@aF9J #@7//#@377o3M#@7j(#@,0Gx,?	Arl   c                 .   U R                   nX;   d   eX!   n[        U5      S:  d   eSnUS   S:X  d  US   [        :X  a)   SUR                  U   S   UR                  U   S   44nU$ US   S:X  d  US   [
        :X  a  SnU$ ! [         a    Sn U$ f = f)	z(see if prange is user prange or internalr   )rG  r^  rt   r1  r2  )r1  )r^  r^  r   )r   r^  )rB  r   rt   r7  r  r   )rs  rc  r  rB  r  kinds         rh   rA  ConvertLoopPass._get_loop_kind
  s    &&%%%#4y1}}7''47o+E,!K$;$;H$Ea$H+JaJabjJklnJo#pp  !W
"d1g&9!D  , , ,s   &B BBc                    SnSn/ n[        UR                  5       GHB  u  px[        U[        R                  5      (       az  [        UR
                  [        R                  5      (       aQ  UR
                  R                  S:X  a7  U R                  UR
                  R                  R                  U5      (       a  Un[        U[        R                  5      (       d  M  [        UR
                  [        R                  5      (       d  M  UR
                  R                  S:X  d  GM  U R                  UR
                  R                  R                  U5      (       d  GM@  UnGME     US:w  a  US:w  a  U V	s1 s H  oR                  iM     n
n	/ n[        [        US-   U5      5       Hl  nUR                  U   nUR                  5        V	s1 s H  oR                  iM     nn	X-  (       a  X-  n
UR                  U5        M[  UR                  U5        Mn     UR!                  5         UR!                  5         UR                  SU U-   UR                  US-   S -   Ul        U$ s  sn	f s  sn	f )z~
If there is init_prange, find the code between init_prange and prange
calls. Remove the code from entry_block and return it.
r2  r  r   N)rb  r  r   r	   r  r  r  r  _is_prange_initrn  rm  r<  rI  rw   r~  r{  reverse)rs  entry_blockr  prange_argsinit_call_indprange_call_ind	init_bodyr   r
  r  arg_related_varssaved_nodes	inst_varss                rh   rB  &ConvertLoopPass._get_prange_init_block
  s   
 	 !1!12GA4++
4::rww0O0O

/,,TZZ__-A-A:NN !4++
4::rww0O0O

/..tzz/C/CZPP"# 3 B?b#8 1<<1<KeM!O_EF"''*-1^^-=>-=VV-=	>#/$1$&&t,$$T* G ! + 0 0- @%!&(3(8(89J9K(L!MK !  = ?s   3I I%c                 v    X;  a  gX!   n[        U5      S:  =(       a    US   S:H  =(       d    US   [        :H  $ )NFr   rm   )r   rm   rb  s       rh   ri  ConvertLoopPass._is_prange_init
  s=    %#4y1}U$q']":"Td1g>TUrl   c           	      `  ^ UR                  UR                  5        [        U5         [        U5      nSSS5        WS   n[	        5       nU GHG  nX   nUR
                   GH.  n	[        U	[        R                  5      (       GaL  [        U	R                  [        R                  5      (       Ga"  Xu:X  a  U	R                  R                  U;   ae  U	R                  R                  U;  aK  UR                  U	R                  R                  5        UR                  U	R                  R                  5        OUR                  mU4S jn
U
" U	R                  R                  5      [        X5      ;   ac  U
" U	R                  R                  5      U
" U	R                  R                  5      :w  a)  [        R                  " SU	R                  R                   S9e[#        U	5      (       az  [%        U	5      nUc  GM  ['        [(        U R*                  R,                  USS9nUR                  U;   d  Ub  UR                  U;   a  [/        X5        ['        U R0                  XU5        [        U	[2        5      (       d  GM  U R5                  U	R6                  X#5        GM1     GMJ     X&-  ng! , (       d  f       GNq= f)z
Replace array access indices in a loop body with a new index.
index_set has all the variables that are equivalent to loop index.
Nr   c                 x   > SSK Jn   TR                  U 5      R                  $ ! UR                   a    U s $ f = f)Nr   )r   )
numba.corer   	get_exactunversioned_nameNotDefinedError)rm  r   r  s     rh   unver;ConvertLoopPass._replace_loop_access_indices.<locals>.unver
  s:    9,',t'<'M'M M#)#9#9 ,'+,s   $ 99z Overwrite of parallel loop indexr  T)lhs_only)r  rm  dummy_return_in_loop_bodyr0   r  r  r   r	   r  r  r|  r  r  mapr   r  r  rE   rF   r;   r?   rB  r  rG   _replace_multi_dim_indr  rG  r  )rs  r  	index_set	new_indexr]  first_labeladded_indicesrf   r  r  r|  r   ind_defr  s                @rh   rG  ,ConvertLoopPass._replace_loop_access_indices
  s     	inn%&y1$Y/F 2 Qi
 ALE

tRYY//&tzz266:: (TZZ__	-I $ 0 0	 A!dkk&6&67%))$++*:*:; !&, !!1!12c%6KKPUVZVaVaVfVfPgkpquq{q{  rA  rA  lB  QB"("@"@ B$(KKOO#  "$''4T:E} #ND4D4D4L4L$)D:G

i/ ' 3$+LLI$=4TE $55wENP dF++55dnni[[ # d 	"	y 21s   J
J-c                    U R                   n[        USL5        [        [        UR                  UR                     [
        R                  [
        R                  45      5        [        UR                  U5      n[        [        U[        R                  5      =(       a    UR                  S:H  5        UR                   Vs/ s H  nUR                  U;   a  UOUPM     snUl        gs  snf )zY
replace individual indices in multi-dimensional access variable, which
is a build_tuple
Nr  )rB  r<   r   r  rm  r   Tupler  r?   r  r	   r  r  r  )rs  ind_varr  r  rB  ind_def_noder  s          rh   r  &ConvertLoopPass._replace_multi_dim_ind	  s    
 &&t#$
;..w||<enn-/ 	0%k&9&97C
<1 5 OO}4	6 (4'9'9;'9! ,-66Y+>iAE'9; ;s   C(rA  N)r|   r}   r~   r   r  rt  r  r<  rA  rB  ri  rG  r  r   rk   rl   rh   r  r  7	  s6    y&v	A(%NVDL;rl   r  c                    [        [        U[        R                  5      =(       a    UR                  S:H  5        UR
                  nUR                  nXR                     nXR                     nUR                  n[        [        U[        R                  R                  5      5        [        U[        R                  R                  5      (       aG  [        UR                  [        R                  5      (       a  XvR                  :X  a  X4UR                  S4$ [        U[        R                  5      (       Ga  [        X5      u  p[        U	S:H  =(       a    [!        U5      U:H  5        Sn
/ nSnU GH0  nXR                     n[        U[        R                  R                  5      (       aJ  [        UR                  [        R                  5      (       a!  UnUR                  nUR#                  S5        M  [        U[        R                  R                  5      (       aJ  [        UR                  [        R$                  5      (       a!  UnUR                  nUR#                  S5        M  [        U[        R$                  5      (       d  GM  U
S-  n
UR#                  U5        GM3     [        U=(       a    XS-
  :H  5        X<WU4$ [&        e)check if an array is of B[...M...], where M is a
boolean array, and other indices (if available) are ints.
If found, return B, M, M's type, and a tuple representing mask indices.
Otherwise, raise GuardException.
r_  Nr  r   r   )r<   r   r	   r  r  r  r   rm  r   r   r   r   r   r  r  r:   r   r{  rE  r=   )r  r  r  r  r   rT  r  r   seqr  count_constsr  r  indr  s                  rh   r  r    s    Jw(DWZZ9-DEMMEMME

#I

#I>>DJy%.."6"6789enn22339??EMM22Y__d22	Iu	/	/ &g5m#8CD(89C)I9enn&:&:;;9??EMM::$??##D)Y(<(<==9??EMM::$??##D)Iu}}55!##C(# & 	5\AX56,66
rl   c                   0    \ rS rSrSrS rS rS rS rSr	g)	
ParforPassiK  zParforPass class is responsible for converting NumPy
calls in Numba intermediate representation to Parfors, which
will lower into either sequential or parallel loops during lowering
stage.
c                     U R                   R                  U R                  R                  5        [        R
                  R                  [        R                  " U R                  R                  5      5        g r`   )rZ   r  r  r  r   r9  rR  find_max_labelrw  s    rh   _pre_runParforPass._pre_runS  sL     3 34&&##DLL$7$78	:rl   c           	         U R                  5         U R                  R                  (       ag  [        U R                  U R
                  U R                  U R                  U R                  U R                  U R                  5      nUR                  5         U R                  R                  (       a.  [        U 5      R                  U R                  R                  5        U R                  R                  (       a.  [!        U 5      R                  U R                  R                  5        U R                  R"                  (       a.  [%        U 5      R                  U R                  R                  5        U R                  R&                  (       a.  [)        U 5      R                  U R                  R                  5        U R                  R*                  (       a.  [-        U 5      R                  U R                  R                  5        U R.                  R1                  U R                  U R                  R2                  5        [5        U R                  S5        g)z_run parfor conversion pass: replace Numpy calls
with Parfors when possible and optimize the IR.zafter parfor passN)r  r  stencilr   r  r  r  rZ   r  r  r  r  r  r  r  rO  r  r  r  r   r  rH  r=  r6  r  fusionr/   )rs  stencil_passs     rh   r  ParforPass.runZ  sh    	<<&t||T\\'+~~t7J7J'+~~t~~'+zz3L <<t$(()<)<=<<T"&&t||':':;<<!!d#''(;(;<<<D!%%dll&9&9:<<%%%))$,,*=*=> 	t||T\\-@-@At||%89rl   c                 D    [        U R                  U R                  U5      $ )r  )r  r  r  )rs  r  s     rh   r  ParforPass._find_masku  s     $,,g>>rl   c                 0    [        U R                  XU5      $ )r  )r]  r  )rs  rg  r  r  s       rh   r]  ParforPass._mk_parfor_loops}  s      iDDrl   rk   N)
r|   r}   r~   r   r  r  r  r  r]  r   rk   rl   rh   r  r  K  s    ::6?Erl   r  c                   *    \ rS rSrSrS rS rS rSrg)ParforFusionPassi  z=ParforFusionPass class is responsible for fusing parfors
    c                 n   [        U R                  R                  5      n[        U R                  U R                  U R
                  U R                  S   5        [        U R                  U R                  U R
                  U R                  S   5        U R                  R                  (       Ga  US:  Ga  [        U R                  R                  5      U R                  l
        [        5       U R                  l        U R                  R                  U R                  R                  5        [        U R                  R                  U R                  R                  U R                   5      u  p#U H<  n[#        U R                  UUR$                  U R
                  5      u  Ul        Ul        M>     [+        U R                  U R                  R                  U R                  SS9  [-        U R                  S5        U R/                  U R                  U R                  R                  U R                  U R                  5        [-        U R                  S5        [+        U R                  U R                  R                  U R                  5        [-        U R                  S5        U R/                  U R                  U R                  R                  U R                  U R                  5        [-        U R                  S5        [        U R                  U R                  U R
                  U R                  S   5        g	g	g	)
zrun parfor fusion passr   r   F)up_directionzafter maximize fusion downzafter first fusezafter maximize fusion upzafter fusionN)simplify_parfor_body_CFGr  r  r4   r  r  r:  r  r  r@   _definitionsr  rZ   r  r  get_parfor_paramsr  get_parfor_reductionsr  r  r  maximize_fusionr/   fuse_parfors)rs  r  r  r   r  s        rh   r  ParforFusionPass.run  s8   
 -T\\-@-@A	t||T^^T]]9=UV 	t||T^^T]]9=UV<<9>(9$,,:M:M(NDLL%-1VD*##DLL$7$78 +4<<+>+>+/<<+>+>+/+B+BDJA '<T\\=>=>XX=A^^(M$	19  DLL$,,*=*=t||INP4<<)EFd11"ll11"ll"ll, 4<<);<DLL$,,*=*=t||L4<<)CDd11"ll11"ll"ll, 4<<8T\\4<<yAYZM $2rl   c           	         UR                  5        GH  u  pVUR                  " U5      nSnU(       d  M#  Sn/ n	Sn
U
[        UR                  5      S-
  :  Gat  UR                  U
   nUR                  U
S-      n[	        U[
        5      (       a  [	        U[
        5      (       a  UR                  " U5      nX{l        X|l        [        X{UU R                  S   X45      u  pU R                  R                  R                  U5        Ubj  SnU R                  R                  UR                     R                  UR                  /5        U	R                  U5        U R                  XX45        U
S-  n
GM5  U	R                  U5        [	        U[
        5      (       a  U R                  XX45        U
S-  n
U
[        UR                  5      S-
  :  a  GMt  U	R                  UR                  S   5        Xl        U(       a  GM  GM     g )NTFr   r   r   r   r2  )r  rM  r   r  r   r  r  try_fuser:  r6  r  r{  r  r  r+  fuse_recursive_parfor)rs  rZ   r  r  r  r  r  r  fusion_happenedrR  r   r  	next_stmt
fused_nodefuse_reports                  rh   r  ParforFusionPass.fuse_parfors  s   "LLNLE&44U;I"O!/"'#ejj/A-- ::a=D %

1q5 1I!$//Jy&4Q4Q %3$@$@$G	)2.7+2:9I MM)4g3H/
 ((77>>{K%1.2O ,,88AHH),,X$OOJ7 66zg_FA$OOD)!$//224GUFA/ #ejj/A--0 

2/%
; "/ +B 	rl   c                 f   [        U5      n[        U R                  XPR                  5        [	        U R                  SU5        [
        R                  " U R                  U R                  U R                  U R                  5      nUR                  XR5        U R                  XeX45        [        U5        g )Nz$after recursive maximize fusion down)r  r  r  r  r/   rZ   r8  r  r  r  r  r  )rs  r   r  r  r  r  arr_analysiss          rh   r  &ParforFusionPass.fuse_recursive_parfor  s    #F+fll;t||%KVT%33DNNDLL04dnnN+,AV$rl   rk   N)	r|   r}   r~   r   r  r  r  r  r   rk   rl   rh   r  r    s    3[j"H%rl   r  c                       \ rS rSrSrS rSrg)ParforPreLoweringPassi  zSParforPreLoweringPass class is responsible for preparing parfors for lowering.
    c           
      
   [        U R                  R                  0 0 U R                  5        [	        U R                  S5        [        U R                  U R                  U R                  U R                  S   5        [	        U R                  S5        [        R                  S:  aC  [        S[        U R                  R                  5       5      5        [        SU R                  5        [        R                  S:  Gaw  U R                  R                  R                  5        GHN  u  p/ nUR                  nUR                   GH#  nUR                  U5        [!        U["        R$                  5      (       d  M6  UR&                  nUR(                  nUR*                  nU R                  UR,                     n	[        SUR,                  U	[/        U	5      5        U	[0        R2                  ;   d!  [!        U	[0        R4                  5      (       d  M  ["        R6                  " U[9        S	5      U5      n
[0        R:                  " UR,                  5      U R                  U
R,                  '   ["        R<                  " UR,                  U5      n["        R$                  " XU5      nUR                  U5        ["        R>                  " U
/S
U5      n[A        [0        RB                  U R                  U
R,                     5      U R                  U'   UR                  U5        ["        R>                  " U/S
U5      n[A        [0        RB                  U	5      U R                  U'   UR                  U5        GM&     X2l        GMQ     U R                  RD                  (       a5  [G        U R                  RH                  U RJ                  U R                  5        [L        (       aB  [O        U RP                  U R                  U R                  U R                  U R                  5        g
[S        U R                  R                  U RT                  RV                  U RX                  5      u  nnU H<  n[[        U R                  UUR\                  U R                  5      u  Ul/        Ul0        M>     U H  nURc                  U R                  5        M      [        Rd                  (       a  U R                  Rf                  Rh                  n[k        U5      nUS:  a=  U RT                  RV                  (       a  SOSn[        SRm                  UUUU5      5        g
[        SRm                  U5      5        g
g
)zrun parfor prelowering passzafter push call varsr   zafter optimizationr   zvariable types: zcall types: r4  zAdding print for assignment to str_varNr   After fusionr  z0{}, function {} has {} parallel for-loop(s) #{}.zFunction {} has no Parfor.)7push_call_varsr  r  r  r/   r4   r  r:  r   rd  rd   r  r  r  r  r{  r   r	   r  r  r  r  rm  r  r   number_domainLiteralr|  r    r  r  PrintrQ   rc  is_generatorfix_generator_typesgenerator_infor   r  lower_parfor_sequentialr  r  r  r  r  r  r  r  r  r  r  r  r  r   r8  )rs  block_labelr  	new_blockr  r  r  r  rN  r  r  	lhs_const
str_assign	str_printir_printr  r   r  rm  r  r  s                        rh   r  ParforPreLoweringPass.run  s   
 	t||**BDLLAt||%;<t||T^^T]]9=UVt||%9:!!Q&$fT\\-?-?-A&BC.$..1!!Q&'+||':':'@'@'B#	!JJD$$T*!$		22"hh"kk"jj"&,,sxx"8?7TXY`Tab"e&9&99ZQVQ^Q^=_=_&(ffUM)4Lc&RG9>9L9LSXX9VDLL6(*3(?I)+9s)KJ%,,Z8(*'D#(FI8A%**dll[b[g[gNh8iDNN95%,,Y7')xxtS'AH7@W7UDNN84%,,X6' '( '
/ (C2 <<$$ ; ;T=M=M $.%%#dllDNNDMM[ #4DLL4G4G48LL4G4G484K4K#MJ
 '<T\\=>=>XX=A^^(M$	19  !!$,,/  ++||++99
O	q=6:ll6I6IN)? ! :;A6'y*<FG 6==dCD ,rl   rk   N)r|   r}   r~   r   r  r  r   rk   rl   rh   r  r    s    KErl   r  c                 f   [        UR                  5      nUR                  SS5        [        UR	                  5       5      Ul        U [
        [        -   ;   a  / Ul        U [        ;   a3  [        UR                  5      S:X  a  UR                  R                  5         U [        ;   a3  [        UR                  5      S:X  a  UR                  R                  5         U S:X  a  [        UR                  5      S:X  a  UR                  R                  5         [        UR                  5      S:X  aO  UR                  R                  5       nUR                  R                  5         UR                  R                  U5        U S:X  a3  [        UR                  5      S:X  a  UR                  R                  5         g)	z%remove size argument from args or kwsr   r^  r4  r   randintr5  
triangularN)r  r  r  r4  r  rT   rS   ry   rV   r   rU   r{  )r  r  r  dt_args       rh   r  r  @  s!    txx.CGGFBSYY[!DH $66 	((tyy>QIIMMO((tyy>QIIMMOItyy>QIIMMOtyy>QYY]]_FIIMMOIIV$L tyy>QIIMMO
rl   c                     / nU R                    H   nUR                  XR                     5        M"     0 nU R                   H  u  pSXR                     XE'   M     [	        U5      U4$ r`   )ry   r{  rm  r  r4  )r  r  r  r   r  rm  s         rh   r  r  h  sb    LyyGHH-.  LXX	$XX.  ,,rl   c                 
  ^ TUR                      nUR                  nUR                  n/ n[        U[        5      (       Ga  Uu  nn/ nU H\  n[
        R                  " U[        S5      U5      nUTUR                   '   U[        U UTUUUUUUU	U
5      -  nUR                  U5        M^     U[        R                  ;   Ga  TUS   R                      n[        U5      S:X  a{  TUS   R                      nUR                  UUU40 5      n[
        R                  R                  UUS   US   U5      nU[         R"                  :X  a  [%        US   US   UT5      u  nnO8UR                  UU40 5      n[
        R                  R'                  UUS   U5      nUUU'   UR(                  nUR                  [
        R*                  " UXm5      5        [,        R.                   GH#  n[        UU5      (       d  M  [1        TXUS9n[
        R                  " U[        U5      U5      nTU   TUR                   '   [2        R4                  " U R7                  U5      5      n[        U[
        R                  5      (       a  UR8                  S:X  a  UR:                  S:X  a  [
        R                  " U[        S5      U5      n[<        R>                  RA                  [B        5      TUR                   '   [
        RD                  " S	[B        U5      n[
        R*                  " UUU5      n[
        R                  RG                  USU5      nUR                  U5        [
        R                  RI                  UUS
U5      nTUR                      RK                  U[	        U4S jU 5       5      0 5      nUUU'   UR(                  nUR                  [
        R*                  " UUU5      5        UR                  [
        R*                  " UXm5      5        GM&     GO[        U[
        R                  5      (       az  TUR                      n [        U [<        RL                  5      (       a!  U RN                  n[Q        UUUU	UUUTUU5
      nOU nUnUR                  [
        R*                  " UXm5      5        Os[        U[
        RR                  5      (       aT  [T        RV                  " 5       RY                  URZ                  5      nUR                  [
        R*                  " XvU5      5        [        U5      S:X  a$  [\        R^                  " SUS S3UR                  S9eTRa                  UR                   S5        UTUR                   '   U$ )zgenerate IR from array_expr's expr tree recursively. Assign output to
expr_out_var and returns the whole IR as a list of Assign nodes.
z$arg_out_varr   r   r   r  r
  sqrtz$math_g_varr(  rk   c              3   B   >#    U  H  nTUR                      v   M     g 7fr`   r  )r$  r   r  s     rh   r%  (_arrayexpr_tree_to_ir.<locals>.<genexpr>  s     $GhWQVV_hs   z.Don't know how to translate array expression 'rI  'N)1rm  r  r  r   r4  r	   r|  r    r  r{  rP   supported_array_operatorsr   rx  r  r`  rw  truediv_gen_np_divideunaryr   r  rZ   	MAP_TYPES_find_func_varr  r  r?   r  r  r   r  r  r(  r  r
  r  r  r   r   _gen_arrayexpr_getitemr  r   r  resolve_value_typer  r   r  r  )!r  r  r  r  r  r  rp  r  parfor_index_tuple_varall_parfor_indicesr  rf  r  r  out_irr  arr_expr_argsarg_varsr   arg_out_varel_typ1el_typ2func_typir_exprTfunc_var_namerc  func_var_def
g_math_varg_mathg_math_assigncall_typvar_typs!     `                              rh   r  r  t  s    \&&'FE


CF$ M C&&n(EsKK(.GK$$%+G,5,3,5,5,6,7,/,B,>,6
8 
8F OOK( ! 222hqk../G8}!!(1+"2"23$::2@G@IJLN''--HQK!cJ)))(6 Xa[&')C%Hg %::2z2N''--HQK=!)Ig))FMM"))G\?@))A"a   !/wC P66%})EsK)0)?&#}}W-C-CM-RSlBGG44I9UZfZkZkouZu"$&&m0Lc"RZ05

0A0A$0GWZ__- iic:V%'YYvz3%G]$&GGOOJ$L\]]=1'',,x2sC"8==1??u$Gh$GGM%-	'"!--biihDEbiiCD1 *2 
D"&&	!	!$))$gu{{++]]F,&"
G FGbii;<	D"((	#	#!44TZZ@biiC89
6{a,,<T!HAF
 	
 KK!!4(!'GLMrl   c                 (   U R                   nU R                  n[        R                  " U[	        S5      U5      n[
        R                  R                  [        5      X6R                  '   [        R                  " S[        U5      n[        R                  " XvU5      n[        R                  R                  USU5      n	[        R                  " U[	        S5      U5      n
[        [        R                  5      nXU
R                  '   [        R                  " XU5      n[        R                  R!                  XU/SU5      nUR#                  [$        R&                  " 5       X0R                     X1R                     /0 5      nUR)                  X/5        X4$ )zgenerate np.divide() instead of / for array_expr to get numpy error model
like inf for division by zero (test_division_by_zero).
r  r   dividez	$div_attrrk   )r  r  r	   r|  r    r   r  r  rO  rm  r  r  r  r
  r#   r  r  r  r   r  r+  )arg1arg2r  r  r  r  r   r!  r"  div_attr_callattr_varfunc_var_typattr_assigndiv_callr  s                  rh   r  r    s%    JJE
((Cvve];7=H"ZZ..u5GMM99T5#&D))DC0KGGOOHh<Mvve];7=H#ELL1L)HMM))MS9Kww||HTlB<H))799-wyy/ABBHH
MM;,-rl   c
           	         UR                   n
UnXqR                     nXqR                     R                  n[        U5      nU R	                  U5      =(       d    / nU Vs/ s H  nU R                  U5      PM     nnUS:X  Ga@  [        R                  " UR                  [        S5      U
5      n[        R                  R                  UR                  SSS9nUUUR                  '   [        R                  " S[         R"                  UU/XgU5      nUR$                  R'                  U5        Un[        R(                  " SUR                   5      n[        R                  " UR                  [        S5      U
5      n[        R*                  UUR                  '   [        R,                  " UUU
5      nU	R/                  U5        UnGOUS:X  a  US   nGO[1        U Vs/ s H  nUS	LPM	     sn5      (       Ga  X-
  n[        R                  " UR                  [        S
5      U
5      n[        R2                  R5                  [        R*                  U5      UUR                  '   [        R(                  " SUR                   5      n[        R                  " UR                  [        S5      U
5      n[        R*                  UUR                  '   [        R,                  " UUU
5      nU	R/                  U5        / n[7        [9        U5      5       H=  nUU   nUU   nUS:X  a  UR/                  U5        M&  UR/                  UUU-      5        M?     [;        [7        U5      5      n[        R<                  R?                  UU
5      n[        R,                  " UUU
5      nU	R/                  U5        Un[        R<                  RA                  XU
5      n [C        XGUR                     X{R                     5      UU '   U $ s  snf s  snf )a  if there is implicit dimension broadcast, generate proper access variable
for getitem. For example, if indices are (i1,i2,i3) but shape is (c1,0,c3),
generate a tuple with (i1,0,i3) for access.  Another example: for (i1,i2,i3)
and (c1,c2) generate (i2,i3).
r   z$ravelr   r  )r   r   r  r   z$const_ind_0r2  Nz$parfor_index_tuple_var_bcast)"r  rm  r   r   r\  get_equiv_constr	   r|  r  r    r   r   r   r   r   gen_np_callrO  r   r  r+  r  r  r  r{  r6  r  r  rI  rw   r  r  r  r_  rQ   )!r  r  r  r  rf  r  r  r  r  r  r  r  r  r  num_indicesrg  re   size_consts	ravel_var	ravel_typstmts
const_node	const_varconst_assign
ind_offsetr  rh  r   r  
size_constr  r  r  s!                                    rh   r  r    s"     ''C&Ixx GHH""E()K##C(.BI9BCA9,,Q/KCzFF399mH&=sC	NN((w}}1S(Q	"+	$$Wekk9seYajku%XXa)
FF399mN&CSI	"'++	yyY<l#		!&r*		[1[atm[1	2	2 (
FF399m+'-.13	"'"2"2";";EKK"O	 XXa)
FF399mN&CSI	"'++	yyY<l#
%,'A |H$QJQ!!),!!"4Z!^"DE ( (:./
WW((S9
yyY<l#	ggoocc2G"6388+<#*>>#:<IgNi D, 2s   O/O4c                     U H2  nX   n[        U[        5      (       d  M  UR                  U:X  d  M0  Us  $    [        R                  " SUS9e)zAfind variable in typemap which represents the function func.
    zufunc call variable not foundr  )r   rR   
typing_keyr   r  )r  rn  r  r  r  r  s         rh   r  r  K  sH     Ja""q||t';H	 
 
(
()Hc
RRrl   c                    [         R                  R                  [         R                  " UR                  5      5        Sn0 n[        [        UR                  R                  5       5      5      R                  nUR                  R                  5        H  u  p[        XXbX5US9u  pXU'   M     Xal        U(       a  [        UR                  5      Ul        [        US5        [        XX4S   5        [        US5        g )NFr  z after parfor sequential loweringr   z after parfor sequential simplify)r   r9  rR  r  r  nextiterr  r  r  _lower_parfor_sequential_blockr2   r/   r4   )
r  r  r  r  r:  parfor_foundr  r  r  r  s
             rh   r  r  V  s    ""8#:#:7>>#JKLJgnn++-./55E ' 4 4 6$B
Y%! #(; !7  N&w~~67>?Wy9*=>7>?rl   c                 v   [        UR                  5      nUS:w  Ga  SnUR                  U   nUR                  R                  n	[        R
                  " Xi5      n
UR                  S U U
l        UR                  US-   S  Ul        [        5       nU
R                  R                  [        R                  " X5      5        [        UR                  U5      X+'   XU '   [        5       n [        UR                  5      n[        U5       GH7  nUR                  U   n[        5       n[        5       n[        UUR                  UR                  UR                   UUU	5      nUUR                  S   l        UR                  S   R"                  nUX.'   [%        UUUXi5      nUR&                  UR                  S   l        UX/'   US:X  aN  UR                  R                  R                  [        R                  " X5      5        U UR                  S   l        O*XW   R                  S   l        UUR                  S   l        UnGM:     [-        UR.                  R1                  5       5      nUR.                  U   R                  R                  [        R                  " WU	5      5        [3        UR.                  R1                  5       5      nUWR                  S   l        UR.                  R5                  5        H%  u  nn[7        UUX#XEUS9u  nn[        UU5      UU'   M'     [        UR                  5      nUS:w  a  GM  X4$ )Nr2  Tr   r   r  )_find_first_parforr  r  r  r	   r[  r!   r{  r  rJ   r   r  rw   r$   r  r  r  r  r%   rr  falsebrtruebrr   r  r  r   r  r  )r  r  r  r  r  r  r  r   r
  r  
prev_block
init_labelr  r  range_labelheader_labelrange_blockphi_varheader_blockprev_header_labelbody_last_labelbody_first_labelrf   r   s                           rh   r  r  j  s    	5::&A
r'zz!}oo!!XXe)
**Ra.
ZZA'
\
rwwz78!/!G
",; lDOO$uAq)H$,K%<L(K +7KR '!&&r*11G&1J#)'7I*/6L+3+B+BLb!('3J$Av$$++BGGK,EF0;!!"%-@K,-2226=0A!!"%- ,7 < dnn1134',,33GGL#&	( t~~2245'7"$nn**,FQ<1j9OA| +1e4JqM	 -
 uzz*u r'v $$rl   c                     [        U 5       H1  u  p[        U[        5      (       d  M  UR                  (       a  M/  Us  $    gNr2  )rb  r   r  r  r  r   r
  s      rh   r  r    s4    t_	dF##D,G,G,GH % rl   c                 L   [        5       n/ n[        5       n[        U 5      u  pg[        U 5      nU H  n	X	   n
[        U
R                  5       H  u  p[
        R                  " U
R                  U
R                  5      nU
R                  SU Ul        [        SU05      R                  S   nX^-  n[        XX5      n[        U
R                  XR                  5      u  Ul        Ul        UR                  UR                  5        UR!                  U5        M     XWU	   -  nM     X44$ )zwfind variables used in body of parfors from outside and save them.
computed as live variables at entry of first block.
Nr   )r  rK   r0   _find_parforsr  r	   r[  r  r  r8  get_parfor_params_inner#_combine_params_races_for_ssa_namesr  r  r  r  r{  )r  options_fusionr  r  r   pre_defsr  all_defsrQ  r  r  r   r   dummy_blockbefore_defsr  s                   rh   r  r    s    JGuH"6*KA (J&uzz2IA((5;;		:K$zz"1~K*A{+;<CCAFK#H,.F +NV\\+'FM6< NN699%NN6" 3 	UO## $ rl   c                    ^ ^^ U 4S jm[        U5      n[        [        TU5      5      nU H1  m[        UU4S jU 5       5      (       a  UR	                  T5        M1    O   X-  U4$ )zReturns `(params|races1, races1)`, where `races1` contains all variables
in `races` are NOT referring to the same unversioned (SSA) variables in
`params`.
c                 t   >  TR                  U 5      R                  $ ! [        R                   a    U s $ f = fr`   )ry  rz  r	   r{  )r#  r  s    rh   	unversion6_combine_params_races_for_ssa_names.<locals>.unversion  s7    	??1%666!! 	H	s    77c              3   :   >#    U  H  nT" T5      U:H  v   M     g 7fr`   rk   )r$  pvrvr*  s     rh   r%  6_combine_params_races_for_ssa_names.<locals>.<genexpr>  s     :\ry}"\s   )r  r  r  r6  discard)r  r  r  races1unver_paramsr.  r*  s   `    @@rh   r"  r"    s]    
 ZFIv./L:\:::NN2	  ?F""rl   c                    [        U 5      n[        U5      n[        U5      n[        XTUR                  UR
                  5      n[        XBU5      u  p[        U5      n
U
S:  a\  [        R                  (       a0  U(       a  SOSn[        SR                  XR                  X5      5        [        U5      X0R                  '   [        U 5        [        UR!                  5       5      nUS   nUS   nUR
                  U   U-  nX~   U-  nU$ )Nr   r  r  z2{}, parallel for-loop {} has nested Parfor(s) #{}.r   )r  rN   rK   rL   r7  r8  r  r   r   r  rd   r8  r  r  r  r  r  )r   r$  r#  r  r  rH  rI  r2  r  r  r  r  keylistr  first_non_init_blockr'  r  s                    rh   r!  r!    s    'F
!&
)Cv&GW^^W^^LH%fkJMJJI1}''.<N!7  ()/ii*@A "&j!1II X]]_%GJ"1:..,x7K+k9FMrl   c              #   l   #    [        U 5       H!  u  p[        U[        5      (       d  M  X4v   M#     g 7fr`   )rb  r   r  r  s      rh   r   r     s)     T?dF##'M #s   $4
4c                 4   [        [        XR                  5      n[        U[        R
                  5      (       aU  UR                  S:X  aE  UR                   Vs/ s H  oDR                  PM     snU Vs/ s H  oDR                  PM     sn:X  a  ggs  snf s  snf )Nr  TF)r;   r?   rm  r   r	   r  r  r  )r  r   nest_indices	index_defre   s        rh   _is_indirect_indexr:    sj    ngzz:I)RWW%%),,-*G%OO,OqFFO,0NA0NN -0Ns   B3Bc           
      X   U  GH#  nUR                    GH  n[        U[        R                  [        R                  45      (       a  [        U5      n[        U[        R                  5      (       aI  UR                  U:X  d  [        UUU5      (       a'  UR                  UR                  R                  5        M  UR                  UR                  R                  5        M  [        U[        R                  5      (       a  [        UR                  [        R                  5      (       a  UR                  R                  S;   a  UR                  R                  n	UR                  R                  R                  n
[        U	[        R                  5      (       a6  U	R                  U:X  d  [        UU	U5      (       a  UR                  U
5        GM  UR                  U
5        GM  [        U[         5      (       d  GM  [#        UR$                  R'                  5       UUUUU5        GM     GM&     g )Nr   )r  r   r	   r  rb  r  r|  rm  r:  r  r  r  r  r  r  r   r  ,get_array_indexed_with_parfor_index_internalr  r  )r  r   ret_indexedret_not_indexedr8  r  r  r  setarray_indexgetarray_indexgetarray_names              rh   r<  r<    s    HHD$!1!12:: >??!.t!4~rvv66#((E1' '%' '  OODKK$4$45#''(8(89T299--TZZ11**--#@@!%!1!1 $

 0 0 5 5~rvv66#((E1' '%' '  OOM2#''6D&))<NN))+# 7  rl   c                 P    [        5       n[        5       n[        U UUUUU5        XE4$ r`   )r  r<  )r  r   r8  r  r=  r>  s         rh   #get_array_indexed_with_parfor_indexrC  G  s7     %KeO0 ''rl   c                    [        U R                  R                  5       5      n/ nU R                  R                  5        H  nUR                   H  n[        U[        R                  [        R                  45      (       d  M4  [        U5      R                  U R                  R                  :X  d  Mc  UR                  UR                  R                  5        M     M     [        [        U5      [        U5      -  5      n[!        U5      $ )z`get arrays that are written to inside the parfor and need to be passed
as parameters to gufunc.
)r   r  r  r  r  r   r	   r  rb  r  rm  r  r{  r  r  r  r  )r   parfor_params
last_labeloutputsr  r  s         rh   get_parfor_outputsrH  W  s     V%%**,-JG&&(HHD4""2"2BJJ!?@@d#((F,<,<,A,AAt{{//0  ) 3w<#m"445G'?rl   _RedVarInfor   reduce_nodesredopT)frozenc	                    Uc  0 nUc  / nUc  [        [        5      nUc  [        [        5      nUc  0 n[        U5      n	[        U	5      n
U
SS n
[	        U5        [        U
5       GH  n[        UR                  U   R                  5       GH  n[        U[        R                  5      (       Gac  UR                  R                  U;   d  UR                  R                  U;   Ga.  UR                  nUR                  nUR                  U;   a  UOXR                     n/ n[        U[        R                  5      (       a  UR                  /nOS[        U[        R                  5      (       a4  UR                  R!                  5        Vs/ s H  nUR                  PM     nnXo   R#                  U5        U H  nXU'   M	     [$        R&                  " U5      nUR                  U;   a  X<R                     UUR                  '   X   R)                  U5        [        U[*        5      (       d  GM  [-        XX#XESXx5	        GM     GM     UR/                  5        H  u  nnUR                  nUU;   d  M  UU;  d  M"  UU   R1                  5         [3        UUU   U 5      nUc  MJ  UR)                  U5        [5        UU5        [7        [8        U5      nUb  Uu  nnOSnSn[;        UUUS9UU'   M     XT4$ s  snf )zzfind variables that are updated using their previous values and an array
item accessed with parfor index, e.g. s = s+A[i]
Nr   rJ  )r   r  r  r0   r  rI  r  r  r   r	   r  r  rm  r  r|  r  r~  r+  r  r  r{  r  r  r  rj  get_reduce_nodes%check_conflicting_reduction_operatorsr;   get_reduction_initrI  )r  r   rE  r  
reductionsreduce_varnames
param_usesparam_nodesvar_to_paramr  rQ  r  r  r  rN  	cur_param	used_varsr  stmt_cpparam
param_namerK  gri_outr   rL  s                            rh   r  r  p  s    
  &
!$''F (JABJ *%V--e499:D4++))]:))\9kkjj#&88}#<C,xxBX		c266**!$
IRWW--151E1E1G H1GA1GI H%,,Y7"A&/O # ---::*/8/DIgmm,&--g6$''%g]{R- ; &4 ',,.y ZZ
"z'H&&(+E;u3EwOL '&&z25e\J 2LA&&-OHe#H E)4%!-*
:&/ /: &&W !Is   K,c                    SnU H  n[        U[        R                  5      (       d  M$  [        UR                  [        R                  5      (       d  MO  UR                  R
                  S:X  d  Mk  Uc  UR                  R                  nM  X#R                  R                  :w  d  M  SU R                  -  n[        R                  " XCR                  5      e   g)zIn prange, a user could theoretically specify conflicting
reduction operators.  For example, in one spot it is += and
another spot *=.  Here, we raise an exception if multiple
different reduction operators are used in one prange.
NrH  zCReduction variable %s has multiple conflicting reduction operators.)r   r	   r  r  r  r  fnrz  r   r  r  )rZ  nodesfirst_red_funcnoder  s        rh   rP  rP    s     NtRYY''tzz277++JJMM?*%!%!ZZ]]22494J4JKC 88hhGG rl   c                    [        [        U 5      S:  5        [        [        S U 5      5      S   R                  n[        [        U[        R                  5      =(       a    UR                  S;   5        UR                  nUR                  S:X  a  U[        R                  :X  a  [        R                  nOnU[        R                  :X  a  [        R                  nOIU[        R                  :X  a  [        R                   nO$U[        R"                  :X  a  [        R$                  nU[        R                  :X  d  U[        R                  :X  a  SU4$ U[        R                   :X  d  U[        R$                  :X  a  SU4$ g)zR
Get initial value for known reductions.
Currently, only += and *= are supported.
r   c                 J    [        U R                  [        R                  5      $ r`   )r   r  r	   r  rA  s    rh   rJ  $get_reduction_init.<locals>.<lambda>  s    Z%Arl   r2  )rH  r`  r`  r   NN)r<   r   r  r  r  r   r	   r  r  r^  rw  r  iaddsubisubmulimulr  itruediv)r_  acc_expracc_expr_fns      rh   rQ  rQ    s
   
 CJ!O FA5IJ2NTTHJx)Whkk=W.WX++K{{g(,,&"--KHLL("--KHLL("--KH,,,"++Khmm#{hmm'C+~

&
**
*+~rl   c                 ^   U R                   S:X  d  U R                   S:X  a  U R                  [        R                  :X  d  U R                  [        R                  :X  a!  [
        R                  " SU R                  5      e[        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  /nU R                  U;   $ U R                   S:X  a  [!        ["        X5      nUS;   a  gg)NrH  r`  zParallel floordiv reductions are not supported. If all divisors are integers then a floordiv reduction can in some cases be parallelized as a multiply reduction followed by a floordiv of the resulting product.r  ))r   r   )r   r   )r   numba.np.npdatetime_helpers)r   ro  TF)r  r^  rw  	ifloordivfloordivr   NumbaValueErrorr  rf  rh  rj  rk  r  rg  ri  r  r;   r9   )re   r  suppsr  s       rh   supported_reductionrt    s    tt!$$'/448%%%1B1B)B(( +7 :;	@ @
 ""!!# ttu}ttv~3 
 
 rl   c           	        ^^^ Sn0 mSUU4S jjmU4S jmU R                   nU R                  n[        U5       GH  u  pgUR                  nUR                  n	U	TUR                   '   [        U	[        R                  5      (       a  U	R                   T;   a  T" U	5      n	[        U	[        R                  5      (       d  M  [        U4S jU	R                  5        5       5      n
XJ;   d  M  US-   [        U5      :  a  [        XS-      [        R                  5      (       a  XS-      R                  R                  U:w  ax  Sn[        XS-   S 5       H?  u  p[        U[        R                  5      (       d  M&  UR                  U:X  d  M8  Xl-   S-   n  O   Ub   USUS-    XUS-    -   XS-   U -   XS-   S -   nUS-   [        U5      :  aC  [        XS-      [        R                  5      (       a  XS-      R                  R                  U:X  d   UR                  U:w  a  [        SU< S35      e[        X5      (       d  [        SU-   S	-   5      e[        U	5       Vs/ s H  nUR                   T" US5      4PM     nnU VVs/ s H  u  nnUR                   U:w  d  M  UPM     nnn[        U5      S:X  d   eU VVs/ s H  u  nnUUR                   :w  d  M  UU4PM     nnn[!        U5      n[        R                  " UR"                  US
-   UR$                  5      UUS   '   ['        U	U5        XS n  U$    U$ s  snf s  snnf s  snnf )z
Get nodes that combine the reduction variable with a sentinel variable.
Recognizes the first node that combines the reduction variable with another
variable.
NTc                    > TR                  U R                  S5      n[        U[        R                  5      (       a  Uc  UnOX#:X  a  gT" X2S9$ U(       d  Uc  U $ U$ )zULookup definition of ``var``.
Returns ``None`` if variable definition forms a cycle.
N)r  )r  rm  r   r	   r|  )r  varonlyr  lookedup_varcyclic_lookupdefss       rh   ry  'get_reduce_nodes.<locals>.cyclic_lookup  sZ     xx$/lBFF++}$& ;;"l&:3MMrl   c                  4   > T" U 0 UD6nUc  [        S5      eU$ )zJSimilar to cyclic_lookup but raise AssertionError if a cycle is
detected.
zunexpected cycle in lookup())r  )ry   kwargsr  ry  s      rh   noncyclic_lookup*get_reduce_nodes.<locals>.noncyclic_lookup$  s*     T,V,; !?@@
rl   c              3   J   >#    U  H  nT" US 5      R                   v   M     g7fTNr  )r$  r  r~  s     rh   r%  #get_reduce_nodes.<locals>.<genexpr>6  s%      4#2a +1d388#2s    #r   zUse of reduction variable z? other than in a supported reduction function is not permitted.z& in an unsupported reduction function.z#initr   r  )rm  rz  rb  r  r  r   r	   r|  r  r  r~  r   r  r7  rt  get_expr_argsr  r  r  r(   )reduction_noder_  r  rK  rm  rz  r   r  r  rN  in_varsfoundjr   jstmtre   ry   rg   non_red_argsreplace_dictry  rz  r~  s                      @@@rh   rO  rO    s:    LDN N D%66U#kkjjSXXc266""sxx4'7$Cc277## 4#&==?4 4G& ECJ&$Uq5\299==q5\((99=MM!F$-eEFm$< &eRYY77EKK3<N &'UQYF! %= ) "'vA!&fqj!9":!&1uV!4"5 "'z{!3"4
 1s5z)jsRYY.O.O!A#J-->>BRR004DD$45E4H I% %  +388$&BEU&U&N'O Q Q "/s!36!3A !1!T!:;!3  615Iv14I<(A---.2CdFQa166k!QdC#Dz02syy$w,PSPWPW0X\!_-"35$RyS $R 6ICs   L6?L;L;9MMc                     U R                   S;   a  U R                  U R                  /$ U R                   S:X  a  U R                   Vs/ s H  oPM     sn$ [	        SR                  U 5      5      es  snf )z%
Get arguments of an expression node
)r`  rH  r  zget arguments for expression {})r  r  rN  ry   r  r8  )r  r  s     rh   r  r  z  se     ww,,$((##ww&99%9a9%%
?FFtL
MM &s   A/c                    U R                    H  nUS   S:X  d  M  US   S   n[        [        U5      5       H6  n[        XE   [        R
                  5      (       d  M&  [        XE   X5      XE'   M8     US   S   n[        [        U5      5       H6  n[        Xe   [        R
                  5      (       d  M&  [        Xe   X5      Xe'   M8     M     g )Nr   r  r   )r  rw   r   r   r	   r|  r*   )r   callbackcbdatar  left_lengthsr   right_lengthss          rh   visit_parfor_pattern_varsr    s    ??1:""1:a=L3|,-lorvv66&6|<D'NLO . $AJqMM3}-.m.77'78H<D(NM$ / #rl   c                    [         R                  S:  a/  [        SU 5        [        S[        UR	                  5       5      5        U R
                   H  n[        UR                  X5      Ul        [        UR                  [        R                  5      (       a  [        UR                  X5      Ul	        [        UR                  [        R                  5      (       a  [        UR                  X5      Ul        [        UR                  [        R                  5      (       d  M  [        UR                  X5      Ul        M     [        SU R                  0X5        [!        XU5        [        U R"                  X5        g )Nr   zvisiting parfor vars for:zcbdata: r2  )r   rd  rd   r  r  r  r*   rr  r   r  r	   r|  r  r  r)   r  r  r  )r   r  r  rf   s       rh   visit_vars_parforr    s    ")62j&01+A,<,<hOaggrvv&&&qwwAAGaffbff%%%affh?AFaffbff%%%affh?AF  F%%&9f7v2
rl   c                    Uc
  [        5       nUc
  [        5       n[        U 5      n[        U5      u  pE[        U5      n[	        UR                  5       5      n[        U 5        UR                  5       nUR                  5       U   n	UR                  5       R                  5        H  n
XR                  -  n	M     U HI  nX;   a+  UR                  XK   U-
  5        UR                  X[   5        M3  UR                  XK   U-
  5        MK     U R                   Vs1 s HD  n[        UR                  [         R"                  5      (       d  M.  UR                  R$                  iMF     nnUU R                   Vs1 s HD  n[        UR&                  [         R"                  5      (       d  M.  UR&                  R$                  iMF     sn-  nUU R                   Vs1 s HD  n[        UR(                  [         R"                  5      (       d  M.  UR(                  R$                  iMF     sn-  nUR                  X-
  5        U[+        U 5      -  n[,        R.                  " XS9$ s  snf s  snf s  snf )zrlist variables written in this parfor by recursively
calling compute_use_defs() on body and combining block defs.
)r7  r8  )r  r  rK   rN   r   r  r  rQ  
dominatorsr9  r  r  rR  r  r   r  r	   r|  rm  r  r  get_parfor_pattern_varsr   _use_defs_result)r   use_setdef_setr  usesrz  rH  rF  rQ  definitely_executedr  r  rf   	loop_varss                 rh   parfor_defsr    s    %%'F!&)JD
!&
)CV[[]#J  !J..*:6		""$yy( %'
 NN4;01NN4;'NN4;01  %///:GGRVV4/   #...*FFBFF3. I #...*FFBFF3. I NN9&'&v..G$$GDDs$   -II1-I"I-IIc                     U[        U R                  5      -  n[        U 5      nU[        R                  " U5      -  n[        U 5        g)zl
Reduction variables for parfors and the reduction variables within
nested parfors must be stack allocated.
N)r  r  r  r   must_use_allocar  )r   
alloca_setr  s      rh   _parfor_use_allocar    s>    
 #fnn%%J'F(**622J rl   c                 n   [        U 5      n[        U5      n[        U5      n[        X2UR                  UR
                  5      n[        X2XTR
                  5      nU R                   Vs1 s HD  n[        UR                  [        R                  5      (       d  M.  UR                  R                  iMF     nnUU R                   Vs1 s HD  n[        UR                  [        R                  5      (       d  M.  UR                  R                  iMF     sn-  nUU R                   Vs1 s HD  n[        UR                  [        R                  5      (       d  M.  UR                  R                  iMF     sn-  nXR                   Vs1 s H  owR                  R                  iM     sn-  n[!        5       n	UR#                  5        H  n
UR$                  U
==   U-  ss'   UR$                  U
==   U-  ss'   XR$                  U
   -  n	UR&                  U
==   U-  ss'   UR&                  U
==   U-  ss'   XR&                  U
   -  n	M      " S S[(        5      n[*        R,                  " U" U5      5      nUR/                  UR$                  UR&                  5        [1        U 5        X-  $ s  snf s  snf s  snf s  snf )zvinsert dels in parfor. input: dead variable set right after parfor.
returns the variables for which del was inserted.
c                       \ rS rSrS rSrg)'parfor_insert_dels.<locals>.DummyFuncIRi  c                     Xl         g r`   r  r  s     rh   rt  0parfor_insert_dels.<locals>.DummyFuncIR.__init__  s     Krl   r  N)r|   r}   r~   r   rt  r   rk   rl   rh   DummyFuncIRr    s    	!rl   r  )r  rN   rK   rL   r7  r8  rM   r  r   r  r	   r|  rm  r  r  rr  r  r  r1  escapingobjectr   PostProcessor_patch_var_delsr  )r   curr_dead_setr  rH  rI  r2  dead_maprf   r  dead_setr  r  	post_procs                rh   parfor_insert_delsr    sC     'F
!&
)Cv&GW^^W^^LH hGH %///:GGRVV4/   #...*FFBFF3. I #...*FFBFF3. I 1B1BC1BA""''1BCCI uH% M1 % I- %%e,,% M1 % I- %%e,, !f ! &&{6':;Ih//1B1BC A Ds*   '-J#J#-J(4J("-J-J- J2c           	          [        U5      u  pE[        UU R                  UU 5      u  pgUR                  5        H'  nSn	U	(       d  M  [	        U UUUUU5      n	U	(       a  M  M)     g)za
Reorder statements to maximize parfor fusion. Push all parfors up or down
so they are adjacent.
TN)r3   rH   	arg_namesr  maximize_fusion_inner)
r  r  r  r  r  r  	alias_maparg_aliasesr  order_changeds
             rh   r  r  !  sn    
 #6*MJ3!'!(!2!2!(!(	I m1 ' % * ) + ,M m !rl   c                 b   SnSnU[        UR                  5      S-
  :  a  UR                  U   nUR                  US-      n	U(       a  [        XU X#U5      O[        XXX45      n
U
(       a!  XR                  U'   XR                  US-   '   SnUS-  nU[        UR                  5      S-
  :  a  M  U$ )NFr   r   r   T)r   r  _can_reorder_stmts)r  r  r  r  r  r  r  r   r  r  can_reorders              rh   r  r  9  s    M	A c%**o!
!zz!}JJqsO	 ( *$7*4N-?	Y.E 	 %JJqM"JJqsO M	Q c%**o!
! rl   c                     [        5       nU  HB  nXA;   a  UR                  X   5      nXB;   a  UR                  U5      nUR                  U5        MD     U$ r`   )r  r  r  )the_setr  r  retr   s        rh   expand_aliasesr  M  sN    
%C>))IL)C))K(C
  Jrl   c                    [        U [        5      (       GaA  [        U[        5      (       Gd+  [        U[        R                  5      (       Gd  [        U[        R                  5      (       aC  [        UR                  [        5       U5      (       d  [        [        X!R                  5      (       a  [        U R                  5        Vs1 s H  ofR                  iM     snXE5      n[        [        U 5      XE5      n[        UR                  5        Vs1 s H  ofR                  iM     snXE5      n	[        [        U5      XE5      n
[        X-  X-  -  5      S:X  a  ggs  snf s  snf )zk
Check dependencies to determine if a parfor can be reordered in the IR block
with a non-parfor statement.
r   TF)r   r  r	   r  r  r6   r  r  r;   is_assert_equivr  r~  rm  get_parfor_writesr1   r   )r  r  r  r  r  r  r  stmt_accessesstmt_writesnext_accessesnext_writess              rh   r  r  W  s    	4  9f--9bhh//Iryy11!)//35*EE_g??&8H'I8H18H'I'0?$%6t%<%.=&	8K8K8M'N8M18M'N'0?$_Y%?%.=+.0 1456 (J (Os   EEc                 &    [        X5      u  p#US:H  $ )NrX   )r9   )r  r  re  r  s       rh   r  r  t  s    '6I&&rl   c                    [        U [        5      (       d   e[        5       nU R                  R	                  5       nU R
                  US'   UR                  5        Ha  nUR                   HN  nUR                  [        U5      5        [        U[        5      (       d  M4  UR                  [        U5      5        MP     Mc     U$ r  )r   r  r  r  r  r  r  r  rR  r1   r  )r   writesr  r  r  s        rh   r  r  y  s    ff%%%%UF""$F""F2JJJDMM/$/0$''/56  !
 Mrl   FusionReport)firstsecondmessagec           
      	  ^ ^^^ [        SUSU5        SnUR                  UR                  :w  a2  [        S5        Sn[        UR                  UR                  U5      nSU4$ [	        UR
                  5      [	        UR
                  5      :w  a~  [        S5        SnSnXR                  [	        UR
                  5      4-  n	XR                  [	        UR
                  5      4-  n
[        UR                  UR                  XyU
4-  5      nSU4$ [	        UR
                  5      nU 4S	 jnU4S
 jn[        U5       GHB  nUR
                  U   nUR
                  U   nU" UR                  UR                  5      (       aF  U" UR                  UR                  5      (       a$  U" UR                  UR                  5      (       a  M  [        SU5        SnUSU" UR                  5      < SU" UR                  5      < SU" UR                  5      < S3-  nUSU" UR                  5      < SU" UR                  5      < SU" UR                  5      < S3-  n[        UR                  UR                  X~-  5      nSU4s  $    [        UR                  5      Ul        [        XT5      u  nnnnU(       d  [        X$TUUU5      S   nOSnU(       d  U(       aJ  [        S5        Sn[        UR                  UR                  XqR                  UR                  4-  5      nSU4$ [        UR                  5      n[!        5       nUR"                  R%                  5        H  nUU-  nM
     U['        U5      -  nU[!        UR(                  5      -  n[        UR                  5      n[        SUR*                  05      R,                  S   nUR,                  R%                  5        H  nUU-  nM
     UR/                  U5      n[	        U5      S:w  a  [1        UR                  R%                  5       UR2                  R4                  UR7                  5       U5      u  nmUU4S jU 5       n[9        U5      (       aJ  [        S5        Sn[        UR                  UR                  XqR                  UR                  4-  5      nSU4$ [;        X5      $ )zItry to fuse parfors and return a fused parfor, otherwise return None
    ztry_fuse: trying to fuse 
r\  Nz$try_fuse: parfors different lowerersz!- fusion failed: lowerer mismatchz/try_fuse: parfors number of dimensions mismatchz4- fusion failed: number of loops mismatched, %s, %s.z(parallel loop #%s has a nest of %s loopsc                 <   > X:H  =(       d    TR                  X5      $ r`   )is_equiv)re   rg   r  s     rh   r  try_fuse.<locals>.is_equiv  s    v1++A11rl   c                    > [        U [        R                  5      (       d  U $ U R                  n ST;   a  U TS   ;   a
  TS   U    nU$ U $ )z.get original variable name by user if possiblevar_rename_map)r   r	   r|  rm  )r  user_varnamer:  s     rh   get_user_varname"try_fuse.<locals>.get_user_varname  sR    !RVV$$HFFx'A:J1K,K#$45a8Lrl   z/try_fuse: parfor dimension correlation mismatchz7- fusion failed: loop dimension mismatched in axis %s. zslice(r  z) != r  r   Tz1try_fuse: parfor cross iteration dependency foundzK- fusion failed: cross iteration dependency found between loops #%s and #%sc              3      >#    U  H3  n[        TU   [        R                  5      (       + =(       d    UT;   v   M5     g 7fr`   )r   r   r  )r$  re   p2arraynotindexedr  s     rh   r%  try_fuse.<locals>.<genexpr>  s6     skrfg*WQZ1F1FGGa1PaKaakrs   ;>z)try_fuse: parfor2 depends on parfor1 bodyzT- fusion failed: parallel loop %s has a dependency on the body of parallel loop %s. )dprintr  r  r  r   r  rw   r  r  r  r@   r  r  has_cross_iter_deprK   r  r  r8  r  r  r  r  r7  rC  rC  r  rm  r  r6  fuse_parfors_inner) r  parfor1parfor2r:  r  r  r  r  r  r  r  r  r  r  r   nest1nest2p1_cross_depp1_ipp1_ia	p1_non_iap2_cross_depp1_body_usedefsp1_body_defsrz  
p2_usedefsp2_usesr  overlapr  
unsafe_varr  s    `  ` `                         @rh   r  r    s    ('4A F '//)561gjj'**c:V| 7#g&8&8"99@AD8JJG$6$6 788JJG$6$6 788gjj'**cHnEV|""#E2 5\""1%""1%ekk22UZZ00UZZ00DaHKC.>u{{.K ,.>uzz.JL LC*:5;;*G ,.>uzz.JL LC!'**gjj#'BF<  -W^^<G,>wQX,Y)L%	)'GUES\]^_`|BC,gjj'** #zz7::&> >@V|
 'w'8'89O5L&&--/ 0%g..L C((L!'"3"34J7#5#567>>qAG!!((*4 + ''0G
7|qB$$&""&&(	  tkrs
z??>?1C!'**gjj$'::wzz*B$BDF<g//rl   c                    U R                   R                  R                  UR                   R                  5        [        UR                  R                  5       5      nUR                  U   R                  n[        U R                  R                  5       5      n[        U R                  R                  5       5      nU R                  U   R                  R                  U5        U R                  R                  UR                  5        U R                  R                  U5        [        U R                  5      nUR                  R                  U R                  0n[        U5       H?  nU R                  U   R                  XqR                  U   R                  R                  '   MA     [        U R                  U5        [!        XS9n	[#        U	5      n	[%        X	5        ['        S UR)                  5        5       5      n
[+        U R                  U
5        U R,                  R                  UR,                  5        [.        R0                  (       a/  [3        SR5                  UR6                  U R6                  5      5        SnUR5                  UR6                  U R6                  5      n[9        U R6                  UR6                  U5      nX4$ )N)entry_labelc              3   8   #    U  H  oR                   v   M     g 7fr`   r  r  s     rh   r%  %fuse_parfors_inner.<locals>.<genexpr>  s     6"5Q&&"5r  z1Parallel for-loop #{} is fused into for-loop #{}.zE- fusion succeeded: parallel for-loop #{} is fused into for-loop #{}.)r  r  r+  r   r  r  r   rR  r  r   r  r  rm  rw   rr  r'   r  r2   r  r  r  remove_duplicate_definitionsr  r   r  rd   r8  r  r  )r  r  parfor2_first_labelparfor2_first_blockparfor1_first_labelparfor1_last_labelr  
index_dictr   r  namesetr  r  s                rh   r  r    s3    ""7#5#5#:#:; g//4467!++,?@EEg//4467W..3356()..556IJ W../-. ""#E##(('*;*;<J5\@G@R@RA~ 	%%a(77<<=  ""J/  IF6"F)6*"3"3"566G !2!2G<G,,-##AHHjj'**& 	' RC
**WZZ
,C'**gjj#6F?rl   c                 J   U R                  5        H  u  p#UR                  n/ n[        5       nU Hf  n[        U[        R
                  5      (       a3  UR                  R                  nX;   a  X;   a  MD  UR                  U5        UR                  U5        Mh     XSl        M     g)zkRemove duplicated definition for variables in the given nameset, which
is often a result of parfor fusion.
N)
r  r  r  r   r	   r  r  rm  r  r{  )	r  r  r  r  r  rR  definedr
  rm  s	            rh   r  r  !  s     zz%D$		**{{''? KK%OOD!  
 ' rl   c                   ^^^^ U R                    Vs1 s H  ofR                  R                  iM     snm[        5       nUc  0 nUc
  [        5       nUc
  [        5       nS mUUUU4S jnU R                  R                  5        GH2  n	U	R                   GH  n
[        U
[        R                  [        R                  45      (       a{  [        TU
R                  R                     [        R                  R                  5      (       a9  U" U
R                  U
R                  R                  UUUU5      (       a	  SX4U4s  s  $ M  [        U
[        R                   5      (       d  M  [        U
R"                  [        R$                  5      (       aE  U
R"                  R                  T;   a(  TR'                  U
R                  R                  5        GM:  GM=  [        U
R"                  [        R(                  5      (       d  GMi  U
R"                  R*                  nUS;   a  [        TU
R"                  R"                  R                     [        R                  R                  5      (       aM  U" U
R"                  R                  U
R"                  R"                  R                  UUUU5      (       a	  SX4U4s  s  $ GM  US:X  aq  [-        U
R"                  R/                  5        Vs/ s H4  n[        TUR                     [        R                  R                  5      PM6     sn5      (       a	  SX4U4s  s  $ U
R"                  R/                  5        Vs/ s H  oR                  PM     nnTR1                  U5      (       a  UR1                  U5      (       a  GM  UR'                  U
R                  R                  5        GM      GM5     SX4U4$ s  snf s  snf s  snf )Nc                     [        U [        5      (       a  [        U 5      n SU ;  a  X;   a  gUR                  U5        gX;   a  gUR                  U5        [	        U 5      nXR;  a  XU'   gX%   U :g  $ )a
  Returns True if there is a reason to prevent fusion based
on the rules described above.
new_position will be a list or tuple of booleans that
says whether the index in that spot is a parfor index
or not.  array_accessed is the array on which the access
is occurring.TF)r   r  r4  r  r   )new_positionarray_accessedindex_positionsindexed_arraysnon_indexed_arraysnpsizes         rh   add_check_position.has_cross_iter_dep.<locals>.add_check_positionk  s     lD)) .L |# / #&&~6
 />*\"( '3F# &,66rl   c                 2  > [        U [        R                  5      (       a  [        TU R                     [        R
                  5      (       a  [        [        TU 5      nUbs  Uu  px[        U V	s/ s H(  n	U	R                  T;   =(       d    U	R                  U;  PM*     sn	5      (       a*  U V	s/ s H  oR                  T;   PM     n
n	T" U
UUUU5      $ ggU R                  T;   a  T" SUUUU5      $ U R                  U;   a  gT" SUUUU5      $ gs  sn	f s  sn	f )zLooks at the indices of a getitem or setitem to see if there
is a reason that they would prevent fusion.
Returns True if fusion should be prohibited, False otherwise.
TTF)r   r	   r|  rm  r   r  r;   r:   allr   InternalError)
stmt_indexr  r  r  r  derived_from_indicesfbs_resind_seqr  re   new_index_positionsr  r  r$  r  s              rh   check_index'has_cross_iter_dep.<locals>.check_index  sV    j"&&))'*//2EOODD 3WjI&!(JG DKMDKq VVw. ;&::;DKM N N KR.R'Qvv/@'+.R  22E2@2A2@2D	 F F  $   ??g- .g.<.=.<.@	B B
  __(<<  
 .h.<.=.<.@	B B WM /Ss   ./D-DTr   r  F)r  rr  rm  r  r  r  r  r   r	   rb  r  r  r   r   r   r   r  r  r|  r  r  r  r6  r~  
isdisjoint)r   r  r  r  r  r  rf   r  r  r   r  r  re   rhs_varsr  r$  s    ``           @@rh   r  r  5  s   ( /5.?.?@.?$$.?@G
 5, ! U07dDJ DJN $$&FFD$R-=-= >??gdkk&6&679M9MNN"4::#';;#3#3#2#1#5#79 9  $_FXXXD")),, djj"&&11zz'1DKK$4$45  2  

BGG44B::%gdjj.>.>.C.C&DennFZFZ[[*4::+;+;+/::+;+;+@+@+:+9+=+? A  A (,_N`'` ` v  %)ZZ%9%9%;!=%; ",GAFFOU^^=Q=Q!R%;!= > >#'J\#\\ 15

0D0D0FG0F10FHG $..x880;;HEE,001A1ABk  'p /3EEEg AH!=
  Hs   O ;OO
c                  >    [         R                  S:  a	  [        U 6   g g r  )r   rd  rd   )r   s    rh   r  r    s    "q	 #rl   c                    [        5       nU R                   He  nUS   S:X  d  M  US   S   nUS   S   nX4-    H?  n[        U[        R                  5      (       d  M$  UR                  UR                  5        MA     Mg     U$ )z9get the variables used in parfor pattern information
    r   r  r   )r  r  r   r	   r|  r  rm  )r   outr  r  r  r  s         rh   r  r  #  ss     %C??1:""1:a=L#AJqMM!/a((GGAFFO 0	 # Jrl   c                 2
   [        U R                  5         [        U R                  5      nSSS5        WS   n0 n	[        U R                  U   R                  U R
                  UU	U5        [        U	R                  5       5      n
U GH  nX:X  a  M  U R                  U   R                   H  n[        U[        R                  5      (       a}  [        UR                  [        R                  5      (       aT  UR                  R                  S:X  a:  UR                  R                  R                  U R
                  R                  :X  a  M  [        S UR!                  5        5       5      nX-  nU H  nU	R#                  US5        M     M     GM	     U HL  nX:X  a  M
  U R                  U   nU	R%                  5       n[        UR                  U R
                  UUU5        MN     U R                  R%                  5       n['        UR                  5       5      n[)        UX&5      u  nn[        R*                  " U[        R,                  " SS5      5      nUU   R                  R/                  U5        [1        U5      n[3        U5      n[5        UUUR6                  UR8                  5      n[        UR                  5       5      nUR;                  5        GHz  u  nn/ nUR<                  R!                  5        Vs1 s H  nUR                  iM     nnUR?                  U5       H  u  nn UUU   -  nM     [A        UR                  5       H  nUU-  n!U! H  nUUU   -  nM     [        U[        RB                  [        RD                  45      (       ac  [G        U5      R                  U R
                  R                  :X  a6  URH                  R                  U;  a  URH                  R                  U;  a  M  UUR!                  5        Vs1 s H  nUR                  iM     sn-  nUR/                  U5        M     URK                  5         UUl        GM}     UR#                  UR                  5        UU   R                  R#                  5          [M        XX4XV5        [O        U RP                  R                  5      S:H  n"U R                  RS                  5        H  nU"[O        UR                  5      S:H  -  n"M      U"(       a  gU $ ! , (       d  f       GN= fs  snf s  snf )z6remove dead code inside parfor including get/sets
    Nr   r_  c              3   8   #    U  H  oR                   v   M     g 7fr`   r  )r$  r  s     rh   r%  %remove_dead_parfor.<locals>.<genexpr>O  s     <+;a66+;r  parfors_dummyr2  )*r  r  r0   _update_parfor_get_setitemsr  r  r  r  r   r	   r  r  r  r  r   rm  r~  r  r  r   _add_liveness_return_blockr  Locr{  rN   rK   rL   r7  r8  r  
terminator
successorsrI  r  rb  r  r  rj  remove_dead_parfor_recursiver   r  r  )#r   liveslives_n_aliasesr  r  r  r  r]  r  first_block_saved_values
saved_arrsrf   r  varnamesrm_arrsr   r  saved_valuesr  rF  return_labelr  jumprH  rI  r2  	alias_setr  rR  r  in_livesout_blk_dataalias_livesis_emptys#                                      rh   remove_dead_parforr+  1  s*    
#6#3#3	4 !1!12 
5 )K!%**) 	
 -2245J$$Q',,D4++
4::rww0O0O

2

((--1A1A1F1FF<4>>+;<<H+G(,,Q5  -     #/446#EJJ0@0@)(4o	G  ""$FV[[]#J8ZL)77<!<=D
:""4(
!&
)Cv&GVW^^W^^LHINN$%Iu$)$4$4$>$>$@A$@qAFF$@A!nnU3NGU))H 4UZZ(D"Y.K IaL( !4""2"2BJJ!?@@d#((F,<,<,A,AA  0  3)9:)9A)9::HOOD! ) 	
' '* KK	
:! !{wA 6$$))*a/H!!((*C

Oq(( +MA 
5	4r B ;s   S=5TT
=
Tc                 F   U  GH  n[        U[        R                  [        R                  45      (       a  [	        U5      R
                  UR
                  :X  a}  UR                  R
                  U;  ac  UR                  UR                  R
                  / 5       H  nUR                  US5        M     UR                  X5R                  R
                  '   M  [        U[        R                  5      (       a  [        UR                  [        R                  5      (       a  UR                  nUR                  S:X  a{  [        UR                  [        R                  5      (       aR  UR                  R
                  UR
                  :X  a.  UR                  UR                  R
                  U5      Ul	        GM  UR                  5        HT  nUR                  UR
                  S5        UR                  UR
                  / 5       H  nUR                  US5        M     MV     GM     g)zK
replace getitems of a previously set array in a block of parfor loop body
Nr_  )r   r	   r  rb  r  rm  r  r  r  r  r  r  r  r   r|  r~  )	
block_bodyr  r  r"  r  r  wrN  r  s	            rh   r  r    ss   
 tb..

;<<$$$	6KKE)]]4;;#3#3R8  D) 9 .2ZZL))*dBII&&:djj"''+J+J**Cvv"z#))RVV'D'D99>>Y^^3!-!1!1#))..#!FDJ !AQVVT*]]1662.  D) / ") 4 rl   c           	         U R                   R                  5       n[        UR                  5       5      nUS:  d   e[	        UR                  5       5      n [        XaU5      u  pXh   R                  n[        R                  " U[        S5      [        R                  " SS5      5      n[        R                  X\R                  '   [        R                  " XU	[        R                  " SS5      5      nXh   R                  R!                  U5        U R"                  US'   US   R                  R!                  [        R$                  " U[        R                  " SS5      5      5        ['        XbXEX25        UR)                  U
R                  5        US   R                  R)                  5         Xh   R                  R)                  5         g)zIcreate a dummy function from parfor and call remove dead recursively
    r   z$branchcondr  r2  N)r  r  r   r  r   r  r  r	   r|  r    r  r   booleanrm  r  r  r{  r  r  r+   r  )r   r  r  r  r  r  r  r[  rF  r#  r  r  
branchcondbranchs                 rh   r  r    s]    ""$F6;;=)aV[[]#J
 9PL $$E}];RVVOUW=XYJ$}}GOOYYz\266/[]C^_F
""6* !!F1I
1INN"''"2BFF?B4OPQ WyNKK	
1INN
!
rl   c                    [        U R                  5       5      nUS-   nX   R                  nX   R                  n[        R
                  " Xe5      X'   [        R                  " U[        S5      U5      n[        R                  R                  [        R                  S5      X'R                  '   U Vs/ s H  n[        R                  " XhU5      PM     n	n[        R                  R                  X5      n
X   R                  R!                  [        R"                  " XU5      5        X   R                  R!                  [        R$                  " Xu5      5        XG4$ s  snf )Nr   z
$tuple_varr   )r   r  r  r  r	   r[  r|  r    r   r  r  r  rm  r  r  r  r{  r  Return)r  r  r  rF  r#  r  r  r  r  r/  r  s              rh   r  r    s
   V[[]#J>L


 
 C$$E88E/F umL93?I#..77QGNN0561#&I6$$Y4J
$$RYYzc%JK
$$RYYy%>?""	 7s   2!Ec                 `    [        U 5      n[        R                  " XaX#XE5        [        U 5        g r`   )r  r   rH   r  )r   ry   r  r  r  r  r  s          rh   find_potential_aliases_parforr6    s-    'F##g	@ 
rl   c           
      d   SnU R                  5        GH  nUR                   GH  n[        U[        5      (       d  M  US-  nUnUR                  [        UR                  R                  5       5         nUR                  n[        R                  " SS5      n[        R                  " U[        S5      U5      nUR                  R                  [        R                  " [        R                  " SU5      X5      5        UR                  R                  [        R                  " X5      5        [!        UR                  5      Ul        UR                  [        UR                  R                  5       5         nUR                  R#                  5         [%        UR                  5        GM     GM     U$ )z%simplify CFG of body loops in parforsr   r   r  r2  $const)r  r  r   r  r  r   r  r  r	   r  r|  r    r{  r  r  r4  r5   r  r  )	r  r  r  r  r   
last_blockr  r  consts	            rh   r  r    s8   IJJD$''Q	 $--c&2B2B2G2G2I.JK
"((ff_b1umH&=sC&&ryy!S1A5'NO&&ryy'<=#/0@0@#A #--c&2B2B2G2G2I.JK
##%()9)9:!  !$ rl   c                 0   U R                   R                  5       nUc  [        UR                  5       5      nUS:  d   eU R                  US'   US   R
                  R                  [        R                  " XS   R                  5      5        UR                  5        Hu  n[        UR
                  5      S:X  d   UR
                  S   R                  (       a  M<  UR
                  R                  [        R                  " XR                  5      5        Mw     U$ )z5wrap parfor blocks for analysis/optimization like CFGr   r2  )r  r  r   r  r  r  r{  r	   r  r  r  r   is_terminator)r   r  r  r  s       rh   r  r    s    ""$F&++-(?? !!F1I
1INN"''+ay}}=>uzz?a

2(D(D(DJJbggk99=> ! Mrl   c                 x   Ub0  [        UR                  5       5      nUR                  U5        Xl        [        U R                  R                  5       5      n[	        U R
                  R                  S   [        R                  5      (       d   eU R
                  R                  R                  5         U R                  R                  5        Hj  n[	        UR                  S   [        R                  5      (       d  M1  UR                  S   R                  U:X  d  MP  UR                  R                  5         Ml     g)zV
unwrap parfor blocks after analysis/optimization.
Allows changes to the parfor loop.
Nr2  )r   r  r  r  r   r  r  r	   r  r  r  )r   r  init_block_labelr^  r  s        rh   r  r  *  s    
 v{{}-

#$! 6++0023f'',,R0"''::::   !!((*uzz"~rww//JJrN!!%55JJNN	 +
 rl   c                    [        U 5      n[        X!5      u  p4[        X!5      u  pV[        U 5        US   nU R                  R                  5        H&  nXuU    V	V
s1 s H  u  pU	iM	     sn
n	-  nXvU   -  nM(     [        U R                  R                  5       5      nXK   US   -  n[        R                  S:  a  [        SUSU5        X4$ s  sn
n	f )z&find copies generated/killed by parforr   r   zcopy propagate parfor gens:kill_set)
r  r,   r-   r  r  r  r   r   rd  rd   )r   r  r  in_copies_parforout_copies_parforin_gen_copiesin_extra_killr@  r  rf   rI  rF  genss                rh   get_copies_parforrF  F  s    'F*8*I'#3F#D M  QH!!&&(#78#741Q#788%(( )
 V%%**,-J(=+;;D"+T:xH> 9s   C
c                    [        U R                  5       H.  u  pgUS   S:X  d  M  S[        US   U5      4U R                  U'   M0     U R                   HT  n[        UR                  U5      Ul        [        UR
                  U5      Ul        [        UR                  U5      Ul        MV     [        U 5      n	/ n
UR                  5        HC  u  pU
R                  [        R                  " XU   [        R                  " SS5      5      5        ME     XS   R                  -   U	S   l        [        X5      u  p[        XX#XE5        [!        U 5        U	S   R                  [#        U
5      S U	S   l        g)z*apply copy propagate recursively in parforr   r  r   dummyr2  N)rb  r  r(   r  r  r  r  r  r  r{  r	   r  r  r  r,   r.   r  r   )r   var_dictname_var_tabler  r  save_copiesr   r  rf   r  assign_listlhs_namerN  rA  rB  s                  rh   apply_copies_parforrN  b  s@     0
1:""+"71:x8":FOOA 1 $QWWh7#AFFH5#AFFH5 
  'FK!)299S*B%'VVGR%8: 	; * !!9>>1F1IN*8*I'>"1 AY^^C$4$56F1IN
rl   c                   ^^^ U R                  5        GH:  n/ n[        5       m0 nUR                   H  nUUU4S jn	U(       dt  [        U[        5      (       a_  UR
                  R                   H  n
U	" U
5        M     UR                  R                  5       n[        UTTUSS9  UR                  U5        M  U	" U5        UR                  5        H  nU[        UR                  TTTU5      -  nM!     UR                  U5        M     Xel        [        U5      S:  d  GM  UR                  5        H  u  pX=   X<'   M     SU0n[        X5        GM=     g)zpush call variables to right before their call site.
assuming one global/getattr is created for each call site and control flow
doesn't change it.
c                 *  > [        U [        R                  5      (       a  U R                  nU R                  n[        U[        R
                  5      (       a+  U TUR                  '   TR                  UR                  5        g [        U[        R                  5      (       aq  UR                  S:X  a`  UR                  R                  T;   d  UR                  R                  T;   a+  U TUR                  '   TR                  UR                  5        g g g g g )Nr
  )
r   r	   r  r  r  r  rm  r  r  r  )r  rN  r  
block_defssaved_getattrssaved_globalss      rh   process_assign&push_call_vars.<locals>.process_assign  s    dBII..**C++C"3		2226chh/"sxx0#C11cff	6IIINNm;#&99>>^#C7;N3884&NN3884 $D 7J1 /rl   T)nestedr   N)r  r  r  r   r  r  r  r  r  r{  r~  _get_saved_call_nodesrm  r   r  rI   )r  rS  rR  r  rV  r  rR  rename_dictr  rT  r   pblocksr  r#  temp_blocksrQ  s    ``            @rh   r  r    s2   
  U
 JJD5 jv66--A"1% ...--/w~wW[\%t$^^%1!&&-2@*k[ [ & OOD!5 6 
{a#))+$Z
 , e*Kk7] !` rl   c                    / nX;  ai  X;   d  X;   a_  S nX;   a  U" X   SXSU5        Sn O4X;   a/  U" X    SXSU5        X    R                   R                   R                  n X;  a  X;   a  MX  X;   a  M_  UR                  5         U$ )aG  Implement the copying of globals or getattrs for the purposes noted in
push_call_vars.  We make a new var and assign to it a copy of the
global or getattr.  We remember this new assignment node and add an
entry in the renaming dictionary so that for this block the original
var name is replaced by the new var name we created.
c                    [        U [        R                  5      (       d   e[        R                  " U R                  R
                  [        U5      U R                  R                  5      n[        R                  " [        R                  " U R                  5      UU R                  5      nUR                  U5        UR                  U R                  R                  5        UR                  R                  X@R                  R                  '   g r`   )r   r	   r  r|  r  r  r    r  r  r  r  r{  r  rm  )objvar_baser_  rQ  rX  renamed_varrenamed_assigns          rh   rename_global_or_getattr7_get_saved_call_nodes.<locals>.rename_global_or_getattr  s    c299--.-&&!1!1!.x!8!$1K  YYt}}SYY'?'2'*ww0N LL(NN3::??++9+@+@+E+EK

(rl   z$push_global_to_block_PA_DONEz$push_getattr_to_block)r  rm  rj  )fnamerS  rR  rQ  rX  r_  ra  s          rh   rW  rW    s     E"(>+0+B
	F !$]%9;R%*EE$$^%:<T%*E")//55::E+ "(>+0+B* 
MMOLrl   c           
         [        U [        5      (       a  U S   n[        U[        5      (       d   [        US5      (       a  UR                  nOSnU S   n[        U5      S:X  a  SR                  U[        US   5      5      $ SU-   S-   nSR                  UR                  U Vs/ s H  n[        U5      PM     sn5      5      $ [        U [        R                  R                  R                  5      (       a)  U R                  nUR                  S5      (       a  S	U-  $ U$ [        U [        R                  R                  R                  5      (       a  [!        U R"                  5      $ gs  snf )
zMExtract operators from arrayexpr to represent it abstractly as a string.
    r   r|   r  r   z({}({}))rF  z({})$z'%s' (temporary variable))r   r4  r  hasattrr|   r   r8  r  rH  r   r  r	   r|  rm  r  r  r  r  )r  oprry   re   rm  s        rh   r  r    s!    )U##l#s##sJ''ll|t9>$$S.a*ABB)c/C==t*Mt!N1,=t*M!NOO	Iuzz}}00	1	1~~??30477K	Iuzz}}22	3	3IOO$$ +Ns   $E)c                 t    / nU R                    H  nUR                  X$   5        M     [        U5      Ul        g)zpostproc updates generator_info with live variables after transformations
but generator variables have types in return_type that are updated here.
N)
state_varsr{  r4  state_types)r  r   r  new_state_typesr  s        rh   r  r    s9     O&&wz* '#O4K
rl   c                 d    Uc  0 nUc  0 n[        U 5      n[        X1U5      u  p[        U 5        X4$ r`   )r  r3   r  )r   r  reverse_call_tabler  s       rh   get_parfor_call_tablero    sG    
!'F%3F4F&H"J ))rl   c                 h    Uc  0 n[        U 5      n[        R                  " X!5      n[        U 5        U$ r`   )r  r   get_tuple_tabler  )r   tuple_tabler  s      rh   get_parfor_tuple_tablers    s5    'F**6?K rl   c                 x    Uc
  [        5       n[        U 5      n[        R                  " X!5      n[	        U 5        U$ r`   )r  r  r   get_array_accessesr  )r   accessesr  s      rh   get_parfor_array_accessesrw    s6    5'F**6<H Orl   c                 v    [        U 5      n[        X!5      nX!   US'   UR                  U5        [        X5        g r   )r  r8   r  r  )r   r  r  s      rh   parfor_add_offset_to_labelsry  ,  s8    'F!&1FF1I
JJv(
rl   c                 ^    [        U 5      n[        R                  " U5      n[        U 5        U$ r`   )r  r   r  r  )r   r  	max_labels      rh   parfor_find_max_labelr|  8  s*    'F''/I rl   c                     UR                   n[        U 5      nU R                   Vs/ s H  oDR                  PM     nn[	        UR                  5       5      nX6   R                  nU Vs/ s H.  n[        R                  " [        R                  " SUSS9X5      PM0     n	nX6   R                  n
XU   R                  -   X6   l
        X1l         UR                  5         X!l         XU   l
        [        U 5        g s  snf s  snf )Nr   F)r  use_literal_type)r  r  r  rr  r   r  r  r	   r  r  r  build_constraintr  )r   typeinferersave_blocksr  rf   rh  first_blockr  r  index_assignssave_first_block_bodys              rh   parfor_typeinferr  A  s    $$K'F,2,=,=>,=q"",=J> fkkm$K


!
!C^hi^hYZRYYrxxsUKQT^hMi"/44,k/B/G/GGF  "$4;  ? js   C6(5C;c                     Uc  [        [        5      n[        U R                  U5        [        SU R                  0U5        U$ )z)get variable definition table for parforsr   )r   r  r@   r  r  )r   definitionss     rh   build_parfor_definitionsr  V  s?    !$' f&&4q&++,k:rl   c           	   #     #    [        U R                  5       5      nX   R                  n[        R                  " U[        S5      [        R                  " SS5      5      nX   R                  R                  [        R                  " U[        R                  " SS5      5      5        Sv   X   R                  R                  5         g7f)zLadds dummy return to last block of parfor loop body for CFG computation
    r8  r  r2  N)r   r  r  r	   r|  r    r  r  r{  r4  r  )r  rF  r  r:  s       rh   r  r  c  s     
 Y^^%&J!''EFF5-1266/23NOE%%
		%457	""$s   CCc                       \ rS rSrS rSrg)ReduceInferiq  c                     U(       a   e[        U5      S:w  a  [        R                  " S5      e[        US   [        R
                  5      (       d   e[        US   R                  /UQ76 $ )Nr4  zlen(args) != 3r   )r   r   NumbaAssertionErrorr   r   r   rQ   r   )rs  ry   r  s      rh   genericReduceInfer.generics  sY    wt9>,,-=>>$q'5;;////a...rl   rk   N)r|   r}   r~   r   r  r   rk   rl   rh   r  r  q  s    /rl   r  c                  ^    [         R                  (       a  Sn [        R                  " U 5      eg)zKCheck if the platform supports parallel=True and raise if it does not.
    zDThe 'parallel' target is not currently supported on 32 bit hardware.N)r   	IS_32BITSr   r  )r  s    rh   ensure_parallel_supportr  {  s*     ,,S11 rl   r  )NNNNNre  r  )NNNr`   (  r  r   pytypesr  r(  r  textwrapr  r_  r  	functoolsr   collectionsr   r   r   
contextlibr   rw  dataclassesr   r=  llvmliter	   lirnumba.core.imputilsr
   numba.core.irr   rx  r   r   r   r   r   r   r   r   r   r   r   numba.np.npdatetime_helpersr   r   numba.np.numpy_supportr   r   numba.core.typing.templatesr   r   numba.stencils.stencilparforr   numba.core.extendingr   r   numba.core.ir_utilsr    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   numba.core.analysisrK   rL   rM   rN   numba.core.controlflowrO   numba.core.typingrP   rQ   numba.core.types.functionsrR   numba.parfors.array_analysisrS   rT   rU   rV   rW   rX   rY   rO  r   numba.parforsrZ   numba.cpython.builtinsnumba.stencilsr[   r  TextWrapperrb   ri   r  rm   rr   r  rt   r   r   r   r   r   r   r   r   r   r   r   r   r  r9  rF  r  ra  r  r   r   r   r   rl  r  rp  r  Stmtr  r  array_analysis_extensionsr  r  r  r4  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<  rC  rH  rI  r  rP  rQ  rt  rO  r  r  r  visit_vars_extensionsr  ir_extension_usedefsr  ir_extension_use_allocar  ir_extension_insert_delsr  r  r  r  r  r  r  r  r  r  r  r  r  r+  r  remove_dead_extensionsr  r  r6  alias_analysis_extensionsr  r  r  rF  copy_propagate_extensionsrN  apply_copy_propagate_extensionsr  rW  r  r  ro  call_table_extensionsrs  tuple_table_extensionsrw  array_accesses_extensionsry  add_offset_to_labels_extensionsr|  find_max_label_extensionsr  typeinfer_extensionsr  build_defs_extensionsr  r  r  rk   rl   rh   <module>r     sD     	      < < %  &   2  r r r r " J : F 4 @, , , , , , , , , , , ,\H H * 0 /> > *    (  ( 
""UK0 # 
 
+ 
f  D@			"
',..8
 48 4GlI0 :9''(('))'''-1 "(   > >
 > >
 G G G G .66*:; ''7H&'7H#M;?#M;?$]K@$]K@" v :I(RWWbgg I(X  4C ( ( 0N Nba"F a"F% %<sW sWlA~W ~WB
:!Z ZzS$ S$l`; `;F.b6E! 6Erf%' f%RPE, PEf%P	-nb2JZS@(D%N F#04(V( $ ) QU;?P'dH&68l\NN& *;  v &1Eh )4  f %
! ,>     (+ \ -? ! !& )2 59(:'

 .*HIl0^(V0 gFTdLB +=   '(T#( .K " "6 *0 82 .? " "6 *> 4G ( ( 05pB8	* *?  v & +A   ' .G " "6 * 4O ( ( 0 .C " "6 *!& *:	  v &	 *B  v &% % f/" / /2rl   