Ë
    üÇ:jõp ã                   óÌ	  — d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddlmZmZmZ ddlmZ ddlZddlmZ ddlZddlmZ ddlmZ ddlZdd	lmZmZmZm Z mZm!Z!m"Z"m#Z#m$Z$m%Z%m&Z& dd
lm'Z'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZb ddlcmdZdmeZemfZfmgZg ddlhmiZi ddljmkZkmlZl ddlmmnZn ddlompZpmqZqmrZrmsZsmtZtmuZu ddl4mvZv ddlZddlwZwddlwZxddlymzZz ddl{Zddl|m}Z} dZ~ ejþ                  e~d¬«      Z€d„ Z�dZ‚d„ Zƒ eveƒ«      d„ «       Z„ G d„ d e…«      Z†d!„ Z‡d"„ Zˆd#„ Z‰d$„ ZŠd%„ Z‹d&„ ZŒd'„ Z�d(„ ZŽd)„ Z�d*„ Z�d+„ Z‘d,„ Z’d-„ Z“dd.œd/„Z”d0„ Z•d1„ d2„ e‡eˆe‡eˆe�e�e‘e’e“eŽe”e•d3œZ–d4„ Z—d5e—iZ˜e5d6„ «       Z™e5d7„ «       Zše5d8„ «       Z›e5d9„ «       Zœ ed:d;d<g«      Z� e�d=e›«       e�d>eœ«       e�d?eš«       e�d@e™«       e�d?eš«       e�d@e™«      dAœZž G dB„ dCe…«      ZŸ G dD„ dEe�j@                  e�jB                  «      Z¢dF„ Z£e£ez�jH                  e¢<    G dG„ dHe…«      Z¥ G dI„ dJe…«      Z¦dK„ Z§ G dL„ dM«      Z¨ G dN„ dO«      Z©dP„ Zª G dQ„ dR«      Z«d©dS„Z¬dT„ Z­ G dU„ dV«      Z® G dW„ dX«      Z¯ G dY„ dZ«      Z°d[„ Z± G d\„ d]e¨«      Z² G d^„ d_e¨«      Z³ G d`„ dae¨«      Z´db„ Zµdc„ Z¶dd„ Z·de„ Z¸df„ Z¹dg„ Zºdh„ Z»di„ Z¼dj„ Z½dk„ Z¾dl„ Z¿dm„ ZÀdn„ ZÁdo„ ZÂdp„ ZÃdq„ ZÄdr„ ZÅ edsg dt¢du¬v«      ZÆ	 	 	 dªdw„ZÇdx„ ZÈdy„ ZÉdz„ ZÊd{„ ZËd|„ ZÌd}„ ZÍd~„ ZÎeÎe&�jž                  e¢<   d«d„ZÐeÐe!�j¢                  e¢<   d€„ ZÒeÒe!�j¦                  e¢<   d�„ ZÔeÔe"�jª                  e¢<   d¬d‚„ZÖ	 d¬dƒ„Z×d„„ ZØd…„ ZÙd†„ ZÚd‡„ ZÛ edˆg d‰¢«      ZÜdŠ„ ZÝd‹„ ZÞdŒ„ Zß	 	 	 d­d�„ZàdŽ„ Zád�„ Zâd�„ Zãd‘„ Zäeãe&�jÊ                  e¢<   d’„ Zæd“„ Zçd”„ Zèeèe&�jÒ                  e¢<   d•„ Zêd®d–„Zëd®d—„Zìd˜„ Zíeíe&�jÜ                  e¢<   d™„ Zïeïe&�jà                  e¢<   d©dš„Zñd›„ Zòdœ„ Zód�„ Zôd«dž„Zõeõe&�jì                  e¢<   d®dŸ„Z÷e÷e&�jð                  e¢<   d®d „Zùeùe&�jô                  e¢<   d¡„ Zûeûe&�jø                  e¢<   d¢„ Zýeýe&�jü                  e¢<   d£„ Zÿeÿe$�j                   e¢<   d®d¤„�Z�ee&�j                  e¢<   ed¥„ «       �Z e0e«       G d¦„ d§e1«      «       �Zd¨„ �Zy)¯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)ÚstencilparforéP   F)ÚwidthÚdrop_whitespacec                 ó�   — | j                  «       D ].  }t        j                  |«      D �cg c]  }t        |«      ‘Œ c} Œ0 y c c}w ©N)Ú
splitlinesÚ_txtwrapperÚwrapÚprint)ÚxÚlÚys      úi/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/numba/parfors/parfor.pyÚprint_wrappedri   j   s7   € Ø�\‰\‹^ò 0ˆÜ&×+Ñ+¨AÓ.Ö/�aŒˆq�Ô/ñ0ùÚ/s   «Ac                   ó   — y r`   © rk   ó    rh   Úinit_prangerm   s   s   € Ø
rl   c                  ó   — d„ } | S )Nc                   ó   — y r`   rk   rk   rl   rh   Úno_opz#init_prange_overload.<locals>.no_opx   s   € Ørl   rk   )rp   s    rh   Úinit_prange_overloadrq   v   s   € òà€Lrl   c                   ó   — e Zd Zd„ Zy)Úinternal_prangec                 ó   — t        |Ž S r`   )Úrange)ÚclsÚargss     rh   Ú__new__zinternal_prange.__new__~   s   € Ü�dˆ|Ðrl   N)Ú__name__Ú
__module__Ú__qualname__rx   rk   rl   rh   rs   rs   |   s   „ órl   rs   c                 óÎ   — |j                   dk(  rd„ }|S |j                   dk(  r>t        |j                  t        j                  t        j
                  f«      rd„ }|S d„ }|S d„ }|S )Nr   c                 ó   — | d   S ©Nrk   rk   ©Úin_arrs    rh   Úmin_1z min_parallel_impl.<locals>.min_1†   ó   € Ø˜"‘:Ðrl   é   c                 óp  — t         j                  j                  j                  «        t	        t        | «      «       t         j                  j                  j                  | j                  «      }t         j                  j                  j                  t        | «      «      D ]  }t        || |   «      }Œ |S r`   )ÚnumbaÚparforsÚparforrm   Úmin_checkerÚlenÚcpythonÚbuiltinsÚget_type_max_valueÚdtypers   r   ©r€   ÚvalÚis      rh   r�   z min_parallel_impl.<locals>.min_1‹   ó   € Ü—‘×$Ñ$×0Ñ0Ô2ÜœC ›KÔ(Ü—m‘m×,Ñ,×?Ñ?ÀÇÁÓM�ÜŸ™×-Ñ-×=Ñ=¼cÀ&»kÓJò ;�AÜ*¨3°°q±	Ó:‘Cð;à�
rl   c                 óp  — t         j                  j                  j                  «        t	        t        | «      «       t         j                  j                  j                  | j                  «      }t         j                  j                  j                  t        | «      «      D ]  }t        || |   «      }Œ |S r`   )r…   r†   r‡   rm   rˆ   r‰   rŠ   r‹   rŒ   r�   rs   ÚminrŽ   s      rh   r�   z min_parallel_impl.<locals>.min_1“   ó   € Ü—‘×$Ñ$×0Ñ0Ô2ÜœC ›KÔ(Ü—m‘m×,Ñ,×?Ñ?ÀÇÁÓM�ÜŸ™×-Ñ-×=Ñ=¼cÀ&»kÓJò .�AÜ˜c 6¨!¡9Ó-‘Cð.à�
rl   c                 óJ  — t         j                  j                  j                  «        t	        t        | «      «       t         j                  j                  j                  | j                  «      }t        j                  | j                  «      D ]  }t        || |   «      }Œ |S r`   )r…   r†   r‡   rm   rˆ   r‰   rŠ   r‹   rŒ   r�   r   Úshaper“   rŽ   s      rh   r�   z min_parallel_impl.<locals>.min_1›   ós   € Ü�M‰M× Ñ ×,Ñ,Ô.Üœ˜F›Ô$Ü—-‘-×(Ñ(×;Ñ;¸F¿L¹LÓIˆCÜ—^‘^ F§L¡LÓ1ò *�Ü˜#˜v a™yÓ)‘ð*àˆJrl   ©ÚndimÚ
isinstancer�   r   Ú
NPDatetimeÚNPTimedelta)Úreturn_typeÚargr�   s      rh   Úmin_parallel_implrŸ   ‚   sk   € ð ‡x�x�1‚}ò	ð8 €Lð5 
�‰�QŠÜ�c—i‘i¤%×"2Ñ"2´E×4EÑ4EÐ!FÔGòð. €Lòð €Lò	ð €Lrl   c                 óÎ   — |j                   dk(  rd„ }|S |j                   dk(  r>t        |j                  t        j                  t        j
                  f«      rd„ }|S d„ }|S d„ }|S )Nr   c                 ó   — | d   S r~   rk   r   s    rh   Úmax_1z max_parallel_impl.<locals>.max_1¦   r‚   rl   rƒ   c                 óp  — t         j                  j                  j                  «        t	        t        | «      «       t         j                  j                  j                  | j                  «      }t         j                  j                  j                  t        | «      «      D ]  }t        || |   «      }Œ |S r`   )r…   r†   r‡   rm   Úmax_checkerr‰   rŠ   r‹   Úget_type_min_valuer�   rs   r   rŽ   s      rh   r¢   z max_parallel_impl.<locals>.max_1«   r‘   rl   c                 óp  — t         j                  j                  j                  «        t	        t        | «      «       t         j                  j                  j                  | j                  «      }t         j                  j                  j                  t        | «      «      D ]  }t        || |   «      }Œ |S r`   )r…   r†   r‡   rm   r¤   r‰   rŠ   r‹   r¥   r�   rs   ÚmaxrŽ   s      rh   r¢   z max_parallel_impl.<locals>.max_1³   r”   rl   c                 óJ  — t         j                  j                  j                  «        t	        t        | «      «       t         j                  j                  j                  | j                  «      }t        j                  | j                  «      D ]  }t        || |   «      }Œ |S r`   )r…   r†   r‡   rm   r¤   r‰   rŠ   r‹   r¥   r�   r   r–   r§   rŽ   s      rh   r¢   z max_parallel_impl.<locals>.max_1»   r—   rl   r˜   )r�   rž   r¢   s      rh   Úmax_parallel_implr©   ¤   si   € Ø
‡x�x�1‚}ò	ð8 €Lð5 
�‰�QŠÜ�c—i‘i¤%×"2Ñ"2´E×4EÑ4EÐ!FÔGòð. €Lòð €Lò	ð €Lrl   c                 ó$  — t         j                  j                  j                  «        t	        t        | «      «       | j                  «       }t         j                  j                  j                  |j                  «      }t        j                  j                  d|«      }t         j                  j                  j                  t        |«      «      D ]1  }t        j                  j                  |||   «      }t        ||«      }Œ3 |j                  S ©Nr   )r…   r†   r‡   rm   Úargmin_checkerr‰   ÚravelrŠ   r‹   rŒ   r�   r   Ú
IndexValuers   r“   Úindex©r€   ÚAÚinit_valÚivalr�   Ú	curr_ivals         rh   Úargmin_parallel_implrµ   Ä   ó½   € Ü	‡M�M×Ñ×$Ñ$Ô&Ü”3�v“;ÔØ�‰‹€AÜ�}‰}×%Ñ%×8Ñ8¸¿¹ÓA€HÜ�?‰?×%Ñ% a¨Ó2€DÜ�]‰]×!Ñ!×1Ñ1´#°a³&Ó9ò $ˆÜ—O‘O×.Ñ.¨q°!°A±$Ó7ˆ	Ü�4˜Ó#‰ð$ð �:‰:Ðrl   c                 ó$  — t         j                  j                  j                  «        t	        t        | «      «       | j                  «       }t         j                  j                  j                  |j                  «      }t        j                  j                  d|«      }t         j                  j                  j                  t        |«      «      D ]1  }t        j                  j                  |||   «      }t        ||«      }Œ3 |j                  S r«   )r…   r†   r‡   rm   Úargmax_checkerr‰   r­   rŠ   r‹   r¥   r�   r   r®   rs   r§   r¯   r°   s         rh   Úargmax_parallel_implr¹   Ï   r¶   rl   c                 ó  — t         j                  j                  j                  «        | j                  d   }|j                  d   }d}t         j                  j                  j                  |«      D ]  }|| |   ||   z  z  }Œ |S r«   )r…   r†   r‡   rm   r–   rs   )ÚaÚbrf   ÚmÚsr�   s         rh   Údotvv_parallel_implr¿   Ú   sx   € Ü	‡M�M×Ñ×$Ñ$Ô&Ø	�‰�‰
€AØ	�‰�‰
€Að 	
€AÜ�]‰]×!Ñ!×1Ñ1°!Ó4ò ˆØ	ˆQˆq‰T�A�a‘D‰[Ñ‰ðà€Hrl   c                 óL  — t         j                  j                  j                  «        | j                  }|j                  \  }}t        j                  || j                  «      }t         j                  j                  j                  |«      D ]  }|| |   ||d d …f   z  z  }Œ |S r`   )	r…   r†   r‡   rm   r–   ÚnpÚzerosr�   rs   )r»   r¼   rf   r½   ÚnÚcr�   s          rh   Údotvm_parallel_implrÅ   å   s‰   € Ü	‡M�M×Ñ×$Ñ$Ô&Ø	�‰€AØ�7‰7�D€A€qô 	�‰��A—G‘GÓ€Aô �]‰]×!Ñ!×1Ñ1°!Ó4ò ˆØ	ˆQˆq‰T�A�aš�d‘G‰^Ñ‰ðà€Hrl   c                 óv  — t         j                  j                  j                  «        | j                  \  }}|j                  }t        j                  || j                  «      }t         j                  j                  j                  |«      D ])  }d}t        |«      D ]  }|| ||f   ||   z  z  }Œ |||<   Œ+ |S r«   )
r…   r†   r‡   rm   r–   rÁ   Úemptyr�   rs   ru   )	r»   r¼   r½   rÃ   rf   rÄ   r�   r¾   Újs	            rh   Údotmv_parallel_implrÉ   ö   sª   € Ü	‡M�M×Ñ×$Ñ$Ô&Ø�7‰7�D€A€qØ	�‰€Aô 	�‰��A—G‘GÓ€AÜ�]‰]×!Ñ!×1Ñ1°!Ó4ò ˆØˆÜ�q“ò 	 ˆAØ��1�a�4‘˜1˜Q™4‘Ñ‰Að	 àˆˆ!Šð	ð
 €Hrl   c                 ó.  — t        |t        j                  j                  «      rqt        |t        j                  j                  «      rL|j                  |j                  cxk(  r
dk(  rt
        S  |j                  dk(  r|j                  dk(  rt        S y y y y )Nrƒ   é   )rš   r   ÚnpytypesÚArrayr™   r¿   rÉ   )r�   ÚatypÚbtyps      rh   Údot_parallel_implrÐ     sx   € ä�4œŸ™×-Ñ-Ô.Ü�4œŸ™×-Ñ-Ô.Ø�9‰9˜Ÿ	™	Ô& QÒ&Ü&Ð&ð 'ð
 �Y‰Y˜!Š^ §	¡	¨Q¢Ü&Ð&ð !/ˆ^ð 	/ð 	/rl   c                 óv   ‡—  | d«      Š|j                   dk(  rd„ }|S |j                   dk(  rˆfd„}|S ˆfd„}|S )Nr   c                 ó   — | d   S r~   rk   r   s    rh   Úsum_1z sum_parallel_impl.<locals>.sum_1  r‚   rl   rƒ   c                 óÚ   •— t         j                  j                  j                  «        ‰}t         j                  j                  j	                  t        | «      «      D ]
  }|| |   z  }Œ |S r`   ©r…   r†   r‡   rm   rs   r‰   ©r€   r�   r�   Úzeros      €rh   rÓ   z sum_parallel_impl.<locals>.sum_1  sY   ø€ Ü�M‰M× Ñ ×,Ñ,Ô.ØˆCÜ—]‘]×)Ñ)×9Ñ9¼#¸f»+ÓFò !�Ø�v˜a‘yÑ ‘ð!àˆJrl   c                 ó´   •— t         j                  j                  j                  «        ‰}t        j                  | j
                  «      D ]
  }|| |   z  }Œ |S r`   ©r…   r†   r‡   rm   r   r–   rÖ   s      €rh   rÓ   z sum_parallel_impl.<locals>.sum_1  sM   ø€ Ü�M‰M× Ñ ×,Ñ,Ô.ØˆCÜ—^‘^ F§L¡LÓ1ò !�Ø�v˜a‘yÑ ‘ð!àˆJrl   ©r™   )r�   rž   rÓ   r×   s      @rh   Úsum_parallel_implrÛ     sH   ø€ Ù�q‹>€Dà
‡x�x�1‚}ò	ð  €Lð 
�‰�QŠô	ð €Lô	ð €Lrl   c                 óv   ‡—  | d«      Š|j                   dk(  rd„ }|S |j                   dk(  rˆfd„}|S ˆfd„}|S )Nrƒ   r   c                 ó   — | d   S r~   rk   r   s    rh   Úprod_1z"prod_parallel_impl.<locals>.prod_1*  r‚   rl   c                 óÚ   •— t         j                  j                  j                  «        ‰}t         j                  j                  j	                  t        | «      «      D ]
  }|| |   z  }Œ |S r`   rÕ   ©r€   r�   r�   Úones      €rh   rÞ   z"prod_parallel_impl.<locals>.prod_1-  sY   ø€ Ü�M‰M× Ñ ×,Ñ,Ô.ØˆCÜ—]‘]×)Ñ)×9Ñ9¼#¸f»+ÓFò !�Ø�v˜a‘yÑ ‘ð!àˆJrl   c                 ó´   •— t         j                  j                  j                  «        ‰}t        j                  | j
                  «      D ]
  }|| |   z  }Œ |S r`   rÙ   rà   s      €rh   rÞ   z"prod_parallel_impl.<locals>.prod_14  sM   ø€ Ü�M‰M× Ñ ×,Ñ,Ô.ØˆCÜ—^‘^ F§L¡LÓ1ò !�Ø�v˜a‘yÑ ‘ð!àˆJrl   rÚ   )r�   rž   rÞ   rá   s      @rh   Úprod_parallel_implrã   &  sH   ø€ Ù
�a‹.€Cà
‡x�x�1‚}ò	ð  €Mð 
�‰�QŠô	ð €Mô	ð €Mrl   c                 óv   ‡—  | d«      Š|j                   dk(  rd„ }|S |j                   dk(  rˆfd„}|S ˆfd„}|S )Nr   c                 ó   — | d   S r~   rk   r   s    rh   Úmean_1z"mean_parallel_impl.<locals>.mean_1B  r‚   rl   rƒ   c                 óò   •— t         j                  j                  j                  «        ‰}t         j                  j                  j	                  t        | «      «      D ]
  }|| |   z  }Œ |t        | «      z  S r`   rÕ   rÖ   s      €rh   ræ   z"mean_parallel_impl.<locals>.mean_1E  sb   ø€ Ü�M‰M× Ñ ×,Ñ,Ô.ØˆCÜ—]‘]×)Ñ)×9Ñ9¼#¸f»+ÓFò !�Ø�v˜a‘yÑ ‘ð!à”s˜6“{‘?Ð"rl   c                 óÎ   •— t         j                  j                  j                  «        ‰}t        j                  | j
                  «      D ]
  }|| |   z  }Œ || j                  z  S r`   )r…   r†   r‡   rm   r   r–   ÚsizerÖ   s      €rh   ræ   z"mean_parallel_impl.<locals>.mean_1L  sV   ø€ Ü�M‰M× Ñ ×,Ñ,Ô.ØˆCÜ—^‘^ F§L¡LÓ1ò !�Ø�v˜a‘yÑ ‘ð!à�v—{‘{‘?Ð"rl   rÚ   )r�   rž   ræ   r×   s      @rh   Úmean_parallel_implrê   =  sH   ø€ á�q‹>€Dà
‡x�x�1‚}ò	ð  €Mð 
�‰�QŠô	#ð €Mô	#ð €Mrl   c                 ó\   — |j                   dk(  rd„ }|S |j                   dk(  rd„ }|S d„ }|S )Nr   c                  ó   — yr«   rk   r   s    rh   Úvar_1z var_parallel_impl.<locals>.var_1V  s   € Ørl   rƒ   c                 ól  — | j                  «       }t        j                  j                  j	                  «        d}t        j                  j                  j                  t        | «      «      D ]8  }| |   |z
  }|t        j                  |t        j                  |«      z  «      z  }Œ: |t        | «      z  S r«   )
Úmeanr…   r†   r‡   rm   rs   r‰   rÁ   ÚrealÚconj©r€   r½   Ússdr�   r�   s        rh   rí   z var_parallel_impl.<locals>.var_1Y  sŽ   € à—‘“ˆAä�M‰M× Ñ ×,Ñ,Ô.ØˆCÜ—]‘]×)Ñ)×9Ñ9¼#¸f»+ÓFò 3�Ø˜Q‘i !‘m�Ø”r—w‘w˜s¤R§W¡W¨S£\Ñ1Ó2Ñ2‘ð3ð œ˜V›Ñ$Ð$rl   c                 óH  — | j                  «       }t        j                  j                  j	                  «        d}t        j
                  | j                  «      D ]8  }| |   |z
  }|t        j                  |t        j                  |«      z  «      z  }Œ: || j                  z  S r«   )rï   r…   r†   r‡   rm   r   r–   rÁ   rð   rñ   ré   rò   s        rh   rí   z var_parallel_impl.<locals>.var_1d  s‚   € à—‘“ˆAä�M‰M× Ñ ×,Ñ,Ô.ØˆCÜ—^‘^ F§L¡LÓ1ò 3�Ø˜Q‘i !‘m�Ø”r—w‘w˜s¤R§W¡W¨S£\Ñ1Ó2Ñ2‘ð3ð ˜Ÿ™Ñ$Ð$rl   rÚ   )r�   rž   rí   s      rh   Úvar_parallel_implrõ   T  s>   € Ø
‡x�x�1‚}ò	ð0 €Lð- 
�‰�QŠò		%ð* €Lò		%ð €Lrl   c                 ó   — d„ }|S )Nc                 ó(   — | j                  «       dz  S )Ng      à?)Úvarr   s    rh   Ústd_1z std_parallel_impl.<locals>.std_1q  s   € Ø�z‰z‹|˜sÑ"Ð"rl   rk   )r�   rž   rù   s      rh   Ústd_parallel_implrú   p  s   € ò#à€Lrl   )r�   c                ó\  ‡
— t        | j                  «      Š
ˆ
fd„}d„ }ˆ
fd„}d„ }ˆ
fd„}d„ }t        d„ |D «       «      rd„ }	nd	„ }	t        |«      d
k(  r|€|S |S t        |«      dk(  r|€|S |S t        |«      dk(  r|€|S |S t        |«      dk(  r|	S t	        dj                  |«      «      ‚)Nc                 ó4   •— t        j                  d| d‰«      S ©Nr   rƒ   ©rÁ   Úarange)ÚstopÚinferred_dtypes    €rh   Úarange_1z&arange_parallel_impl.<locals>.arange_1x  s   ø€ Ü�y‰y˜˜D ! ^Ó4Ð4rl   c                 ó2   — t        j                  d| d|«      S rý   rþ   )r   r�   s     rh   Úarange_1_dtypez,arange_parallel_impl.<locals>.arange_1_dtype{  s   € Ü�y‰y˜˜D ! UÓ+Ð+rl   c                 ó4   •— t        j                  | |d‰«      S ©Nrƒ   rþ   )Ústartr   r  s     €rh   Úarange_2z&arange_parallel_impl.<locals>.arange_2~  s   ø€ Ü�y‰y˜  a¨Ó8Ð8rl   c                 ó2   — t        j                  | |d|«      S r  rþ   )r  r   r�   s      rh   Úarange_2_dtypez,arange_parallel_impl.<locals>.arange_2_dtype�  s   € Ü�y‰y˜  a¨Ó/Ð/rl   c                 ó4   •— t        j                  | ||‰«      S r`   rþ   )r  r   Ústepr  s      €rh   Úarange_3z&arange_parallel_impl.<locals>.arange_3„  s   ø€ Ü�y‰y˜  d¨NÓ;Ð;rl   c                 ó2   — t        j                  | |||«      S r`   rþ   )r  r   r  r�   s       rh   Úarange_3_dtypez,arange_parallel_impl.<locals>.arange_3_dtype‡  s   € Ü�y‰y˜  d¨EÓ2Ð2rl   c              3   óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wr`   )rš   r   ÚComplex)Ú.0r»   s     rh   ú	<genexpr>z'arange_parallel_impl.<locals>.<genexpr>Š  s   è ø€ Ò
6¨AŒ:�aœŸ™×'Ñ
6ùs   ‚$&c                 ó¾  — t         j                  j                  j                  «        || z
  |z  }t	        j
                  |j                  «      }t	        j
                  |j                  «      }t        t        t        ||«      d«      «      }t        j                  ||«      }t         j                  j                  j                  |«      D ]  }	| |	|z  z   ||	<   Œ |S r«   )r…   r†   r‡   rm   ÚmathÚceilrð   ÚimagÚintr§   r“   rÁ   rÇ   rs   )
r  r   r  r�   Únitems_cÚnitems_rÚnitems_iÚnitemsÚarrr�   s
             rh   Úarange_4z&arange_parallel_impl.<locals>.arange_4‹  s­   € Ü�M‰M× Ñ ×,Ñ,Ô.Ø˜u™¨Ñ,ˆHÜ—y‘y §¡Ó/ˆHÜ—y‘y §¡Ó/ˆHÜœœS ¨8Ó4°aÓ8Ó9ˆFÜ—(‘(˜6 5Ó)ˆCÜ—]‘]×)Ñ)×9Ñ9¸&ÓAò *�Ø  T¡Ñ)��A’ð*àˆJrl   c                 óX  — t         j                  j                  j                  «        t	        j
                  || z
  |z  «      }t        t        |d«      «      }t        j                  ||«      }| }t         j                  j                  j                  |«      D ]  }| ||z  z   ||<   Œ |S r«   )r…   r†   r‡   rm   r  r  r  r§   rÁ   rÇ   rs   )	r  r   r  r�   r  r  r  r�   r�   s	            rh   r  z&arange_parallel_impl.<locals>.arange_4–  s�   € Ü�M‰M× Ñ ×,Ñ,Ô.Ü—y‘y $¨¡,°$Ñ!6Ó7ˆHÜœ˜X qÓ)Ó*ˆFÜ—(‘(˜6 5Ó)ˆCØˆCÜ—]‘]×)Ñ)×9Ñ9¸&ÓAò *�Ø  T¡Ñ)��A’ð*àˆJrl   rƒ   rË   é   é   zparallel arange with types {})r   r�   Úanyr‰   Ú
ValueErrorÚformat)r�   r�   rw   r  r  r  r
  r  r  r  r  s             @rh   Úarange_parallel_implr%  u  sÂ   ø€ Ü˜k×/Ñ/Ó0€Nô5ò,ô9ò0ô<ò3ô Ñ
6°Ô
6Ô6ó		ò	ô ˆ4ƒy�A‚~Ø ˜=ˆxÐ<¨nÐ<Ü	ˆT‹�aŠØ!˜MˆxÐ=¨~Ð=Ü	ˆT‹�aŠØ!˜MˆxÐ=¨~Ð=Ü	ˆT‹�aŠØˆäÐ8×?Ñ?ÀÓEÓFÐFrl   c                 ó²   ‡— t        | j                  «      Šd„ }ˆfd„}t        |«      dk(  r|S t        |«      dk(  r|S t        dj	                  |«      «      ‚)Nc                 ó0   — t        j                  | |d«      S )Né2   )rÁ   Úlinspace)r  r   s     rh   Ú
linspace_2z*linspace_parallel_impl.<locals>.linspace_2®  s   € Ü�{‰{˜5 $¨Ó+Ð+rl   c                 ó  •— t         j                  j                  j                  «        t	        j
                  |‰«      }|dz
  }|| z
  }| |d<   t         j                  j                  j                  |«      D ]  }| |||z  z  z   ||<   Œ |S )Nrƒ   r   )r…   r†   r‡   rm   rÁ   rÇ   rs   )r  r   Únumr  ÚdivÚdeltar�   r�   s          €rh   Ú
linspace_3z*linspace_parallel_impl.<locals>.linspace_3±  s„   ø€ Ü�‰×Ñ×(Ñ(Ô*Ü�h‰h�s˜EÓ"ˆØ�A‰gˆØ�u‘ˆØˆˆA‰Ü—‘×%Ñ%×5Ñ5°cÓ:ò 	/ˆAØ˜U a¨#¡gÑ.Ñ.ˆC�ŠFð	/àˆ
rl   rË   r   zparallel linspace with types {})r   r�   r‰   r#  r$  )r�   rw   r*  r/  r�   s       @rh   Úlinspace_parallel_implr0  «  sX   ø€ Ü�[×&Ñ&Ó'€Eò,ôô ˆ4ƒy�A‚~ØÐÜ	ˆT‹�aŠØÐäÐ:×AÑAÀ$ÓGÓHÐHrl   c                 ó   — t         S r`   )rµ   ©Úrr»   s     rh   ú<lambda>r4  Ã  ó   € Ô%9€ rl   c                 ó   — t         S r`   )r¹   r2  s     rh   r4  r4  Ä  r5  rl   )©ÚargminÚnumpy©Úargmaxr9  ©r“   r9  ©r§   r9  ©Úaminr9  ©Úamaxr9  )Úsumr9  )Úprodr9  )rï   r9  )rø   r9  )Ústdr9  )Údotr9  )rÿ   r9  )r)  r9  c                 ó4   — |j                   dk(  rd„ }|S d„ }|S )z¦Parallel 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                 óÌ   — t         j                  j                  j                  «        t         j                  j                  j	                  t        | «      «      D ]  }|| |<   Œ	 y r`   rÕ   rŽ   s      rh   Úfill_1z"fill_parallel_impl.<locals>.fill_1Ù  sL   € Ü�M‰M× Ñ ×,Ñ,Ô.Ü—]‘]×)Ñ)×9Ñ9¼#¸f»+ÓFò  �Ø��q’	ð àrl   c                 ó¦   — t         j                  j                  j                  «        t        j                  | j
                  «      D ]  }|| |<   Œ	 y r`   rÙ   rŽ   s      rh   rH  z"fill_parallel_impl.<locals>.fill_1ß  s@   € Ü�M‰M× Ñ ×,Ñ,Ô.Ü—^‘^ F§L¡LÓ1ò  �Ø��q’	ð àrl   rÚ   )r�   r  r�   rH  s       rh   Úfill_parallel_implrJ  Ó  s'   € ð
 ‡x�x�1‚}ò	ð €Mò	ð
 €Mrl   Úfillc                 ó$   — | dk(  rt        d«      ‚y )Nr   zDzero-size array to reduction operation maximum which has no identity©r#  ©Úarr_sizes    rh   r¤   r¤   ê  ó    € à�1‚}Üð <ó >ð 	>ð rl   c                 ó$   — | dk(  rt        d«      ‚y )Nr   zDzero-size array to reduction operation minimum which has no identityrM  rN  s    rh   rˆ   rˆ   ð  rP  rl   c                 ó$   — | dk(  rt        d«      ‚y )Nr   z*attempt to get argmin of an empty sequencerM  rN  s    rh   r¬   r¬   ö  ó   € à�1‚}ÜÐEÓFÐFð rl   c                 ó$   — | dk(  rt        d«      ‚y )Nr   z*attempt to get argmax of an empty sequencerM  rN  s    rh   r¸   r¸   û  rS  rl   Úchecker_implÚnameÚfuncr¬   r¸   rˆ   r¤   )r7  r:  r<  r=  r>  r@  c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚLoopNestzÆThe 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                 ó<   — || _         || _        || _        || _        y r`   )Úindex_variabler  r   r  )Úselfr[  r  r   r  s        rh   Ú__init__zLoopNest.__init__  s   € Ø,ˆÔØˆŒ
ØˆŒ	Øˆ�	rl   c                 óz   — dj                  | j                  | j                  | j                  | j                  «      S )Nz3LoopNest(index_variable = {}, range = ({}, {}, {})))r$  r[  r  r   r  ©r\  s    rh   Ú__repr__zLoopNest.__repr__  s-   € ØEß‘�t×*Ñ*¨D¯J©J¸¿	¹	À4Ç9Á9ÓMð	Orl   c                 óº  — g }|j                  | j                  «       t        | j                  t        j
                  «      r|j                  | j                  «       t        | j                  t        j
                  «      r|j                  | j                  «       t        | j                  t        j
                  «      r|j                  | j                  «       |S r`   )Úappendr[  rš   r  r	   ÚVarr   r  )r\  Úall_usess     rh   Ú	list_varszLoopNest.list_vars  s„   € Ø€xØ‡��t×*Ñ*Ô+Ü
�T—Z‘Z¤§¡Ô
(Ø�?‰?˜4Ÿ:™:Ô&Ü
�T—Y‘Y¤§¡Ô
'Ø�?‰?˜4Ÿ9™9Ô%Ü
�T—Y‘Y¤§¡Ô
'Ø�?‰?˜4Ÿ9™9Ô%Ø€rl   N)ry   rz   r{   Ú__doc__r]  r`  re  rk   rl   rh   rY  rY    s   „ ñò
òOó	rl   rY  c                   óR   ‡ — e Zd ZdZdddœˆ fd„
Zd„ Zd„ Zd„ Zdd	„Zdd
„Z	d„ Z
ˆ xZS )ÚParforr   FN)Úno_sequential_loweringÚracesc	                ó  •— |
€
t        «       }
t        t        | �  d|¬«       t	        | «      j
                  | _        t	        | «      xj
                  dz  c_        || _        || _        || _	        || _
        d | _        || _        t        |«      dkD  sJ ‚|g| _        || _        |	| _        |
| _        g | _        i | _        d | _        t*        j,                  r)d}t/        |j1                  | j                  ||«      «       y y )Nr‡   )ÚopÚlocrƒ   z9Parallel for-loop #{} is produced from pattern '{}' at {})ÚsetÚsuperrh  r]  ÚtypeÚ
id_counterÚidÚ
loop_nestsÚ
init_blockÚ	loop_bodyÚ	index_varÚparamsÚ	equiv_setr‰   ÚpatternsÚflagsri  rj  ÚredvarsÚreddictÚlowererr   ÚDEBUG_ARRAY_OPT_STATSrd   r$  )r\  rs  rt  ru  rm  rv  rx  Úpatternrz  ri  rj  ÚfmtÚ	__class__s               €rh   r]  zParfor.__init__-  sü   ø€ ð ˆ=Ü“EˆEÜŒf�dÑ$ØØð 	%ô 	
ô
 �t“*×'Ñ'ˆŒÜˆT‹
×Ò Ñ"Õð %ˆŒØ$ˆŒØ"ˆŒØ"ˆŒØˆŒØ"ˆŒô �7‹|˜aÒÐÐØ ˜	ˆŒØˆŒ
ð '=ˆÔ#ØˆŒ
ØˆŒØˆŒð
 ˆŒÜ×'Ò'ØOˆCÜ�#—*‘*Ø—'‘'˜7 Có)õ *ð (rl   c                 ó¶   — dt        | j                  «      z   t        | j                  «      z   t        | j                  «      z   t        | j
                  «      z   S )Nzid=)Ústrrr  Úreprrs  ru  rv  r_  s    rh   r`  zParfor.__repr__a  sG   € Ø”s˜4Ÿ7™7“|Ñ#¤d¨4¯?©?Ó&;Ñ;Ü�—‘Ó ñ!Ü#'¨¯©Ó#7ñ8ð 	8rl   c                 óT   — | j                   D �cg c]  }|j                  ‘Œ c}S c c}w r`   )rs  r[  )r\  re   s     rh   Úget_loop_nest_varszParfor.get_loop_nest_varse  s    € Ø*.¯/©/Ö: Q�× Ó Ò:Ð:ùÒ:s   �%c                 ó:  — g }| j                   j                  «       D ])  \  }}|j                  D ]  }||j                  «       z  }Œ Œ+ | j                  D ]  }||j                  «       z  }Œ | j
                  j                  D ]  }||j                  «       z  }Œ |S )zslist variables used (read/written) in this parfor by
        traversing the body and combining block uses.
        )ru  ÚitemsÚbodyre  rs  rt  )r\  rd  rf   r¼   ÚstmtÚloops         rh   re  zParfor.list_varsh  s¦   € ð ˆØ—N‘N×(Ñ(Ó*ò 	-‰DˆAˆqØŸ™ò -�Ø˜DŸN™NÓ,Ñ,‘ñ-ð	-ð —O‘Oò 	)ˆDØ˜Ÿ™Ó(Ñ(‰Hð	)ð —O‘O×(Ñ(ò 	)ˆDØ˜Ÿ™Ó(Ñ(‰Hð	)ð ˆrl   c                 ó´   — |�'| j                   j                  }|| j                   _        | j                   j                  |«      }|�| j                   _        |S )zvget the shape classes for a given variable.
        If a typemap is specified then use it for type resolution
        )rx  ÚtypemapÚget_shape_classes)r\  rø   r�  Úsave_typemapÚress        rh   rŽ  zParfor.get_shape_classesy  sP   € ð ÐØŸ>™>×1Ñ1ˆLØ%,ˆD�N‰NÔ"Ø�n‰n×.Ñ.¨sÓ3ˆØÐØ%1ˆD�N‰NÔ"Øˆ
rl   c                 óº  — |xs t         j                  }t        dj                  | j                  «      j                  dd«      |¬«       t        d| j                  |¬«       t        d| j                  |¬«       t        d| j                  |¬«       | j                  D ]  }t        ||¬«       Œ t        d|¬«       | j                  j                  |«       t        | j                  j                  «       «      D ]'  \  }}t        d	|›d
�|¬«       |j                  |«       Œ) t        dj                  | j                  «      j                  dd«      |¬«       y )Nzbegin parfor {}é   ú-)Úfilezindex_var = z	params = zraces = zinit block:zlabel ú:zend parfor {})ÚsysÚstdoutrd   r$  rr  Úcenterrv  rw  rj  rs  rt  ÚdumpÚsortedru  rˆ  )r\  r”  ÚloopnestÚoffsetÚblocks        rh   r™  zParfor.dump‹  s  € ØÒ!”s—z‘zˆÜÐ ×'Ñ'¨¯©Ó0×8Ñ8¸¸SÓAÈÕMÜˆn˜dŸn™n°4Õ8Üˆk˜4Ÿ;™;¨TÕ2Üˆj˜$Ÿ*™*¨4Õ0ØŸ™ò 	'ˆHÜ�( Ö&ð	'äˆm $Õ'Ø�‰×Ñ˜TÔ"Ü# D§N¡N×$8Ñ$8Ó$:Ó;ò 	‰MˆF�EÝ¢Ð)°Õ5Ø�J‰J�tÕð	ô 	ˆ×%Ñ% d§g¡gÓ.×6Ñ6°r¸3Ó?ÀdÖKrl   c                 óˆ  — | j                   €d}t        |«      ‚| j                   D ]š  }|j                  |«      }|€d}t        |«      ‚t        |t        j
                  «      sŒ>|j                  t        j                  kD  sŒ\d}t        j                  |||j                  t        j                  fz  | j                  «      ‚ y)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.)rw  r#  Úgetrš   r   Ú	BaseTupleÚcountr   ÚPARFOR_MAX_TUPLE_SIZEr   ÚUnsupportedParforsErrorrm  )r\  r�  ÚmsgÚpÚtys        rh   Úvalidate_paramszParfor.validate_paramsš  sµ   € ð �;‰;ÐðˆCä˜S“/Ð!Ø—‘ò 	(ˆAØ—‘˜Q“ˆBØˆzð/�ä  “oÐ%Ü˜"œeŸo™oÕ.Ø—8‘8œf×:Ñ:Ó:ðO�Cô !×8Ñ8¸Ø  "§(¡(¬F×,HÑ,HÐIñ:Jà"Ÿh™hó(ð (ñ!	(rl   r`   )ry   rz   r{   rq  r]  r`  r†  re  rŽ  r™  r§  Ú__classcell__)r�  s   @rh   rh  rh  )  s5   ø„ à€Jð $)Øö2*òh8ò;òó"ó$Lö(rl   rh  c                 óø   — |j                   }t        | «      }|j                  j                  dd«      } |j                  ||«       t        | |«       |j                  d   | _        |r||j                  d<   g g fS )z/Recursive array analysis for parfor nodes.
    r   N)Úfunc_irÚwrap_parfor_blocksÚ
equiv_setsrŸ  ÚrunÚunwrap_parfor_blocksrx  )r‡   rx  r�  rZ   rª  Úparfor_blocksÚbackup_equivsets          rh   Ú_analyze_parforr±  ·  s~   € ð ×$Ñ$€GÜ& vÓ.€Mð %×/Ñ/×3Ñ3°A°tÓ<€OØ€N×Ñ�} iÔ0Ü˜ Ô/Ø%×0Ñ0°Ñ3€FÔáØ'6ˆ×!Ñ! !Ñ$Øˆrˆ6€Mrl   c                   óÆ   — e Zd ZdZd„ Zd„ Zed„ «       Zej                  d„ «       Zdd„Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zy)ÚParforDiagnosticsz…Holds parfor diagnostic info, this is accumulated throughout the
    PreParforPass and ParforPass, also in the closure inlining!
    c                 ó¸   — d | _         t        «       | _        d| _        t	        t
        «      | _        t	        t
        «      | _        g | _        i | _	        d| _
        y )NÚ__numba_parfor_gufuncF)rW  ÚdictÚreplaced_fnsÚinternal_namer   ÚlistÚfusion_infoÚnested_fusion_infoÚfusion_reportsÚ
hoist_infoÚ	has_setupr_  s    rh   r]  zParforDiagnostics.__init__Í  sK   € àˆŒ	ä ›FˆÔà4ˆÔÜ&¤tÓ,ˆÔÜ"-¬dÓ"3ˆÔØ ˆÔØˆŒØˆ�rl   c                 óZ  — || _         | j                   j                  j                  | _        | j                   j                  | _        || _        | j                  | j                  v rd| _        n!d| j                  ›d| j
                  ›�| _        | j                  «       | _
        d| _        y )NzInternal parallel functionz	Function ú, T)rª  Úfunc_idÚfunc_qualnamerV  rm  ÚlineÚfusion_enabledr¸  ÚpurposeÚget_parforsÚinitial_parforsr¾  )r\  rª  rÄ  s      rh   ÚsetupzParforDiagnostics.setupÚ  s‡   € ØˆŒØ—L‘L×(Ñ(×6Ñ6ˆŒ	Ø—L‘L×$Ñ$ˆŒ	Ø,ˆÔØ×Ñ §¡Ñ*Ø7ˆD�Lð +ð 15·	³	¸4¿9º9ÐEˆDŒLð  $×/Ñ/Ó1ˆÔØˆ�rl   c                 ó   — | j                   S r`   ©Ú
_has_setupr_  s    rh   r¾  zParforDiagnostics.has_setupé  s   € à�‰Ðrl   c                 ó   — || _         y r`   rÊ  )r\  Ústates     rh   r¾  zParforDiagnostics.has_setupí  s	   € àˆ�rl   Nc                 ó4   — t        | j                  «       «      S r`   )r‰   rÆ  ©r\  Úblockss     rh   Úcount_parforszParforDiagnostics.count_parforsñ  s   € Ü�4×#Ñ#Ó%Ó&Ð&rl   c                 óT   — t        |«      }| j                  ||«       t        |«       y r`   )r«  Ú_get_parforsr®  )r\  r‡   Úparfors_listrÐ  s       rh   Ú_get_nested_parforsz%ParforDiagnostics._get_nested_parforsô  s$   € Ü# FÓ+ˆØ×Ñ˜& ,Ô/Ü˜VÕ$rl   c                 ó¾   — |j                  «       D ]J  \  }}|j                  D ]6  }t        |t        «      sŒ|j	                  |«       | j                  ||«       Œ8 ŒL y r`   )rˆ  r‰  rš   rh  rb  rÕ  )r\  rÐ  rÔ  ÚlabelÚblkrŠ  s         rh   rÓ  zParforDiagnostics._get_parforsù  sZ   € Ø Ÿ,™,›.ò 	A‰JˆE�3ØŸ™ò A�Ü˜d¤FÕ+Ø ×'Ñ'¨Ô-Ø×,Ñ,¨T°<Õ@ñAñ	Arl   c                 óV   — g }| j                  | j                  j                  |«       |S r`   )rÓ  rª  rÐ  )r\  rÔ  s     rh   rÆ  zParforDiagnostics.get_parfors   s'   € ØˆØ×Ñ˜$Ÿ,™,×-Ñ-¨|Ô<ØÐrl   c                 ó|  — g }| j                   j                  «       D ]œ  \  }}|j                  dg «      }|D ]€  }t        |j                  t
        j                  «      sŒ(|j                  j                  dk(  sŒBt        t        | j                  |j                  «      }|€Œj|dk(  sŒp|j                  |«       Œ‚ Œž |S )NÚhoistedÚcall)rÇ   r9  )r½  rˆ  rŸ  rš   Úvaluer	   ÚExprrl  r;   r9   rª  rb  )r\  ÚallocsÚpf_idÚdatarŠ  ÚinstrÜ  s          rh   Úhoisted_allocationsz%ParforDiagnostics.hoisted_allocations  sŸ   € ØˆØŸ?™?×0Ñ0Ó2ò 	0‰KˆE�4Ø—8‘8˜I rÓ*ˆDØò 0�Ü˜dŸj™j¬"¯'©'Õ2Ø—z‘z—}‘}¨Ó.Ü$¤]°D·L±LÀ$Ç*Á*ÓM˜ØÑ+°Ð8JÓ0JØ"ŸM™M¨$Õ/ñ0ð	0ð ˆrl   c                 ó‚  — t        j                  |«      }|i k(  rg t        «       fS t        «       }|j                  «       D ]  }|D ]  }|j	                  |«       Œ Œ t        |j                  «       «      }||z
  }|€
t        «       }t        «       }t        t        t        |j                  «       «      j                  |«      «      dz   «      D ]7  }|j                  |«      }	|	�|	||<   Œ|	g k(  r|j	                  |«       Œ3g ||<   Œ9 g }
t        |j                  «       «      D ]  }|
j                  ||   «       Œ |
|fS )zf
        compute adjacency list of the fused loops
        and find the roots in of the lists
        rƒ   )ÚcopyÚdeepcopyrn  ÚvaluesÚaddÚkeysru   r§   ÚunionrŸ  rš  rb  )r\  Ú_ar»   ÚvtxÚvre   Úpotential_rootsÚrootsÚ	not_rootsr�   rf   s              rh   Úcompute_graph_infoz$ParforDiagnostics.compute_graph_info  s0  € ô
 �M‰M˜"ÓˆØ�Š7Ø”s“u�9Ðä‹eˆØ—‘“ò 	ˆAØò �Ø—‘˜•
ñð	ô
 ˜aŸf™f›h›-ˆØ #Ñ%ˆØˆ=Ü“EˆEô “Eˆ	Ü”sœ3˜qŸv™v›x›=×.Ñ.¨sÓ3Ó4°qÑ8Ó9ò 	ˆAØ—%‘%˜“(ˆCØˆØ��!’Ø˜’Ø—‘˜aÕ à��!’ð	ð ˆÜ˜Ÿ™›Ó!ò 	ˆAØ�H‰H�Q�q‘T�Nð	ð �%ˆxˆrl   c                 ó4   ‡— ˆfd„Š ‰|||dd«      \  }}||fS )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                 óŠ   •— ||   D ]7  }|dz  }||   g k(  r|t        | |   «      z  }Œ" ‰| ||||«      \  }}||z  }|}Œ9 ||fS r  )r‰   )	ÚfadjÚnadjÚrootÚnfusedÚnserialÚkÚnfÚnsÚ
count_roots	           €rh   rü  z/ParforDiagnostics.get_stats.<locals>.count_root?  sl   ø€ Ø˜$‘Zò !�Ø˜1‘�Ø˜‘7˜b’=Øœc $ q¡'›lÑ*‘Fá'¨¨d°A°v¸wÓG‘F�B˜Ø˜b‘L�FØ ‘Gð!ð ˜7�?Ð"rl   r   rk   )r\  rô  rõ  rö  r÷  rø  rü  s         @rh   Ú	get_statszParforDiagnostics.get_stats9  s*   ø€ ô		#ñ % T¨4°°q¸!Ó<‰ˆ�Ø�wˆÐrl   c                 óš   — g }|j                  ||   «       ||   D ],  }||   g k7  sŒ|j                  | j                  ||«      «       Œ. |S )zf
        returns a list of nodes reachable in an adjacency list from a
        specified root
        )ÚextendÚreachable_nodes)r\  Úadjrö  Úfusersrù  s        rh   r   z!ParforDiagnostics.reachable_nodesL  sW   € ð
 ˆØ�‰�c˜$‘iÔ Ø�T‘ò 	<ˆAØ�1‰v˜‹|Ø—‘˜d×2Ñ2°3¸Ó:Õ;ð	<ð ˆrl   c                 ó®  — ||   d   }|j                   d   }t        d|j                  j                  dz
  «      }| j                  j                  j
                  }| j                  | j                  «      \  }}| j                  | j                  «      \  }	}
||	g}t        |t        «      �rš|d   dk(  �r‘|d   d   }|j
                  |k(  rt        d|j                  dz
  «      S g }|D ]L  }|sŒ||   D ]#  }|j                  | j                  ||«      «       Œ% |sŒ4t        dt        |«      dz
  «      c S  |j                  j                  «       D ]S  }|j                   D ]B  }|j                  j
                  |k(  sŒt        d|j                  j                  dz
  «      c c S  ŒU | j                  j"                  j                  «       D ]w  }	 |j                   j%                  |«      }t'        |dz
  dd«      D ]F  }|j                   |   }t        |t(        «      rŒ#t        d|j                  j                  dz
  «      } n Œy |S # t*        $ r Y Œ‡w xY w)zX
        pd_id - the parfors id
        parfors_simple - the simple parfors map
        r   rƒ   ÚinternalrË   éÿÿÿÿ)ry  r§   rm  rÃ  rª  Úfilenamerñ  r»  rº  rš   Útuplerb  Úsort_pf_by_liner“   ru  rç  r‰  rÐ  r¯   ru   rh  r#  )r\  rà  Úparfors_simpleÚpfr  rÃ  r  rõ  Únrootsrô  ÚfrootsÚgraphsÚreported_locÚtmpr  rù  rØ  rŠ  Úidxr�   s                       rh   r  z!ParforDiagnostics.sort_pf_by_lineX  s;  € ð ˜EÑ" 1Ñ%ˆØ—+‘+˜a‘.ˆÜ�1�b—f‘f—k‘k A‘oÓ&ˆØ—<‘<×#Ñ#×,Ñ,ˆØ×.Ñ.¨t×/FÑ/FÓG‰ˆˆfØ×.Ñ.¨t×/?Ñ/?Ó@‰ˆˆfØ˜�ˆô �gœuÕ%Ø�q‰z˜ZÓ'Ø& q™z¨!™}�Ø×(Ñ(¨HÒ4Ü˜q ,×"3Ñ"3°aÑ"7Ó8Ð8ð �CØ%ò <˜ÚØ%(¨¡Zò T Ø #§
¡
¨4×+?Ñ+?ÀÀ>Ó+RÕ SðTâ"Ü'*¨1¬c°#«h¸©lÓ';Ò ;ð<ð  "Ÿ|™|×2Ñ2Ó4ò A˜Ø$'§H¡Hò A˜DØ#Ÿx™x×0Ñ0°HÓ<Ü'*¨1¨d¯h©h¯m©m¸aÑ.?Ó'@Ô @ñAðAð  $Ÿ|™|×2Ñ2×9Ñ9Ó;ò 	!˜ð!Ø"%§(¡(§.¡.°Ó"4˜CÜ%*¨3°©7°A°rÓ%:ò * Ø'*§x¡x°¡{ Ü'1°$¼Õ'?Ü+.¨q°$·(±(·-±-À!Ñ2CÓ+D DÙ$)ð	*øð	!ð ˆøô  *ò !Ù ð!ús   ÇAIÈ&IÉ	IÉIc           	      óì  — t        «       }t        | j                  d„ ¬«      D ]Î  }|j                  d   }|j                  d   }|j                  }t        |t        «      ra|d   dk(  rY|d   dk(  r9dj                  t        t        |d   d   «      «      «      }|d   d   }|›d	d
›�}n|d   dk(  rd}n|d   dk(  rd}nJ ‚d}|rt        ||j                  ||fz  «       |||f||j                  <   ŒÐ |S )Nc                 ó.   — | j                   j                  S r`   )rm  rÃ  ©re   s    rh   r4  z6ParforDiagnostics.get_parfors_simple.<locals>.<lambda>–  s   € ¸Q¿U¹U¿Z¹Z€ rl   ©Úkeyr   r   rƒ   r  ú.rË   ú z(internal parallel version)Úuserzuser defined pranger   zinternal pndindexz5Parallel for-loop #%s: is produced from %s:
    %s
 
)r¶  rš  rÇ  ry  rm  rš   r  ÚjoinÚreversedr¹  ri   rr  )	r\  Úprint_loop_searchr	  r
  Ú	r_patternr  rm  Úreplfnr€  s	            rh   Úget_parfors_simplez$ParforDiagnostics.get_parfors_simple’  s  € Ü›ˆô ˜×-Ñ-Ñ3GÔHò 	9ˆBð Ÿ™ A™ˆIØ—k‘k !‘nˆGØ—&‘&ˆCÜ˜'¤5Ô)Ø˜1‘: Ò)Ø˜q‘z ZÒ/Ø!$§¡¬(´4¸À¹
À1¹Ó3FÓ*GÓ!H˜Ø% a™j¨™m˜Ú/5Ñ7TÐ$U™	Ø  ™ vÒ-Ø$9™	Ø  ™ zÒ1Ø$7™	à ˜qØLˆCÙ Ü˜c R§U¡U¨C°Ð$;Ñ;Ô<Ø%'¨¨iÐ$8ˆN˜2Ÿ5™5Ò!ð-	9ð. Ðrl   c                 ój  — | j                  | j                  «      \  }}| j                  | j                  «      \  }}t        |«      t        |«      kD  rt        |«      }|}nt        |«      }|}t	        t        |«      |«      D ]  }|j                  g «       Œ t        «       }	|r!|D ]  }
||
   g k7  sŒ|	j                  |
«       Œ ||	z  }i }|D ]  }| j                  ||«      }d||f||<   Œ i }|	D ]  }| j                  ||«      }d||f||<   Œ |j                  «       }|j                  |«       |S )NÚfuseÚnest)rñ  rº  r»  r‰   ru   rb  rn  rè  r  rå  Úupdate)r\  r	  rô  r  rõ  Ú_nrootsÚlimr  re   r  r3  Ú	all_rootsÚfroots_linesrÃ  Únroots_linesÚ	all_liness                   rh   Úget_all_lineszParforDiagnostics.get_all_lines¯  sY  € ð ×.Ñ.¨t×/?Ñ/?Ó@‰ˆˆfØ×/Ñ/°×0GÑ0GÓH‰ˆˆgäˆt‹9”s˜4“yÒ Ü�d“)ˆCØ‰Cä�d“)ˆCØˆCÜ”s˜3“x Ó%ò 	ˆAØ�J‰J�r�Nð	ô
 “ˆÙØò "�Ø˜‘7˜b“=Ø—J‘J˜q•Mð"ð ˜V‘Oˆ	ð ˆØò 	1ˆAØ×'Ñ'¨¨>Ó:ˆDØ!'¨¨D ˆL˜Òð	1ð ˆØò 	1ˆAØ×'Ñ'¨¨>Ó:ˆDØ!'¨¨D ˆL˜Òð	1ð !×%Ñ%Ó'ˆ	Ø×Ñ˜Ô&ØÐrl   c           	      ó\  — | j                   j                  j                  }| j                  «       }| j                   j                  j
                  }	 t        j                  |«      j                  «       }|�r|�rt        |D �cg c]  }t        |«      ‘Œ c}«      }t        t        «      }	|j                  «       D ]J  \  }
}||
   d   j                  |k(  sŒ| j                  |
|«      }|	|   j!                  t#        |
«      «       ŒL t        dg|	j%                  «       D �cg c]  }t        |«      ‘Œ c}z   «      }|d|t        t#        |«      «      dz   z  z   z   }g }|j!                  d«       |j!                  d|z  «       |j!                  |dz  dz   «       d}t        d| j                   j                  j&                  dz
  «      }t)        ||«      D ]’  \  }}|	j+                  |d «      }|�d	d
j-                  |«      z   }nd}|j/                  d«      }t        |«      }|r|j1                  |dz  ||«      }n|j1                  |dz  ||«      }|j!                  |||d  z   «       Œ” t3        dj-                  |«      «       y t3        d«       y # t        $ r d }Y �Œ+w xY wc c}w c c}w )Nrƒ   rË   ú
zParallel loop listing for %sr“  z	|loop #IDz{0:{1}}| {2}r   ú#rÀ  Ú r  zNo source available)rª  rm  r  rÑ  rÁ  rW  ÚinspectÚ	getsourcera   ÚOSErrorr§   r‰   r   r¹  rˆ  r  rb  rƒ  rç  rÃ  Ú	enumeraterŸ  r  Ústripr$  rd   )r\  r	  Úpurpose_strr  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_listingz ParforDiagnostics.source_listingÛ  so  € Ø—<‘<×#Ñ#×,Ñ,ˆØ×"Ñ"Ó$ˆØ—L‘L×(Ñ(×-Ñ-ˆ	ð	Ü×%Ñ% iÓ0×;Ñ;Ó=ˆEò ’^Ü¨UÖ3¨œS �VÒ3Ó4ˆIÜ(¬Ó.ˆNØ&×,Ñ,Ó.ò >‘��1ð " !Ñ$ QÑ'×0Ñ0°HÓ<Ø!%×!5Ñ!5°a¸Ó!H�JØ" :Ñ.×5Ñ5´c¸!³fÕ=ð>ô " 1 #¸×9NÑ9NÓ9PÖ(Q°A¬¨Q­Ò(QÑ"QÓRˆOØ  _¼¼CÀ»J»È!Ñ8KÑ%LÑ!LÑMˆEØˆHØ�O‰O˜DÔ!Ø�O‰OÐ:¸[ÑHÔIØ�O‰O˜E C™K¨+Ñ5Ô6Ø ˆCä˜˜DŸL™L×,Ñ,×1Ñ1°AÑ5Ó6ˆFÜ% e¨VÓ4ò 7‘��DØ'×+Ñ+¨B°Ó5�ØÐ%Ø $§)¡)¨FÓ"3Ñ3‘Eà�EØŸ:™: dÓ+�Ü˜X›�ÙØŸ
™
 5¨3¡;°°uÓ=‘AàŸ
™
 5¨3¡;°°uÓ=�AØ—‘ ¨1¨V¨W¨:Ñ 5Õ6ð7ô �$—)‘)˜HÓ%Õ&äÐ'Õ(øôI ò 	Ø‹Eð	üò 4ùò )Rs   Á#J ÂJ$Ä"J)
ÊJ!Ê J!c                 ó  ‡ ‡‡— dŠt        ‰«      Š‰ j                  ‰ j                  «      \  }}‰ j                  ‰ j                  «      \  }}t        |«      t        |«      kD  rt        |«      }|}nt        |«      }|}t	        t        |«      |«      D ]  }|j                  g «       Œ ˆˆ ˆfd„}	ˆˆ ˆfd„}
d}g }t        |j                  «       «      D ]5  \  }}|\  }}}|dk(  r||vsŒ |
d||d|«      }Œ#|dk(  r |	|||||«      }Œ5J ‚ y )Nú+--c                 ó€   •‡‡— ˆˆˆˆˆfd„Š||   g k7  r)t        d|z  «        ‰| ||d«       t        d«       |dz   }|S )Nc           	      ó²  •— t        ‰|z  dz  ‰›|›dd›�z   «       ||   D ]³  }||   g k(  r›g }|j                  ‰|dz   z  dz  ‰›|›dd›�z   «       | |   g k7  rA|‰
vr=‰j                  | |«      }|D ]&  }|j                  ‰|dz   z  dz  ‰›|›dd›�z   «       Œ( ‰
j                  |«       t        dj                  |«      «       Œ¦ ‰	| |||dz   «       Œµ y )Nr  ú
(parallel)rƒ   r+  )ri   rb  r   r  )Úfadj_Únadj_ÚnrootÚdepthrù  r¤  Úfusedr�   ÚfacÚprint_gÚreportedr\  Úswords           €€€€€rh   rM  zHParforDiagnostics.print_unoptimised.<locals>.print_nest.<locals>.print_g  s÷   ø€ Ü˜c E™k¨CÑ/¹uÂeÉ\Ð2ZÑZÔ[Ø˜u™ò <�AØ˜Q‘x 2’~Ø ˜ØŸ
™
 3¨%°!©)Ñ#4°sÑ#:É%ÒQRÑT`Ð=aÑ#aÔbØ  ™8 rš>¨a°xÑ.?Ø$(×$8Ñ$8¸ÀÓ$B˜EØ%*ò k Ø #§
¡
¨3°%¸!±)Ñ+<¸sÑ+BÑRWÒYZÑ\hÐEiÑ+iÕ jðkà Ÿ™¨Ô*Ü% d§i¡i°£nÕ5á  u¨a°¸±Õ;ñ<rl   úParallel region %s:r   r+  rƒ   ©ri   rd   )	rG  rH  ÚtherootrN  Ú	region_idrM  rL  r\  rO  s	      ` @€€€rh   Ú
print_nestz7ParforDiagnostics.print_unoptimised.<locals>.print_nest  sM   ú€ ÷<ð <ð �W‰~ Ò#ÜÐ3°iÑ?Ô@Ù˜˜u g¨qÔ1Ü�d”Ø%¨™M�	ØÐrl   c                 óT  •— g }t        d|z  «       |j                  ‰|z  dz  ‰
›|›dd›�z   «       ||   g k7  rCt        ‰	j                  ||«      «      }|D ]#  }|j                  ‰|z  dz  ‰
›|›dd›�z   «       Œ% |dz   }t        dj	                  |«      «       t        d«       |S )NrP  r  rF  rƒ   r+  )ri   rb  rš  r   r  rd   )r¦  rà  r  rJ  rS  r¤  rK  rù  rL  r\  rO  s           €€€rh   Ú
print_fusez7ParforDiagnostics.print_unoptimised.<locals>.print_fuse.  s²   ø€ ØˆCÜÐ/°)Ñ;Ô<Ø�J‰J�s˜U‘{ SÑ(¹ºuÁlÐ+SÑSÔTØ�5‰z˜RÒÜ˜t×3Ñ3°C¸Ó?Ó@�Øò Y�AØ—J‘J˜s U™{¨SÑ0ÁÂqÉ,Ð3WÑWÕXðYà! A™ˆIÜ˜$Ÿ)™) C›.Ô)Ü�$ŒKØÐrl   r   r   Úfr!  )r‰   rñ  rº  r»  ru   rb  rš  rˆ  )r\  r5  rô  r  rõ  r#  r$  r  re   rT  rV  rS  rN  rÃ  ÚinfoÚopt_tyrà  r  rL  rO  s   `                 @@rh   Úprint_unoptimisedz#ParforDiagnostics.print_unoptimised  s  ú€ àˆÜ�%‹jˆØ×.Ñ.¨t×/?Ñ/?Ó@‰ˆˆfØ×/Ñ/°×0GÑ0GÓH‰ˆˆgäˆt‹9”s˜4“yÒ Ü�d“)ˆCØ‰Cä�d“)ˆCØˆCÜ”s˜3“x Ó%ò 	ˆAØ�J‰J�r�Nð	ö	ö.	ð ˆ	ØˆÜ  §¡£Ó/ò 	‰JˆD�$Ø!%ÑˆF�E˜3Ø˜ÒØ Ò(Ù *¨3°°s¸A¸yÓ I‘IØ˜6Ò!Ù& t¨T°5¸(ÀIÓN‘	à�qñ	rl   c           	      ó  ‡ ‡‡‡— dŠt        ‰«      Š‰ j                  ‰ j                  «      \  }}‰ j                  ‰ j                  «      \  }}t        |«      t        |«      kD  rt        |«      }|}nt        |«      }|}t	        t        |«      |«      D ]  }|j                  g «       Œ t        «       Šˆˆ ˆˆfd„}	ˆˆ ˆˆfd„}
d}g }t        |j                  «       «      D ]5  \  }}|\  }}}|dk(  r||vsŒ |
d||d|«      }Œ#|dk(  r |	|||||«      }Œ5J ‚ ‰rgt        ‰j                  «       «      D ]J  \  }}d}|d	   }|d
   }|d   }|dk7  r|dz  }t        ||||||fz  «       Œ5|dz  }t        ||||fz  «       ŒL y t        d«       y )NrC  c                 ó¼   •‡‡‡— ˆˆˆˆˆˆˆ	fd„Š||   g k7  rDt        d‰z  «       t        ‰	›|›dd›�«       |dddœ‰‰<    ‰| ||d«       t        d«       ‰dz   Š‰S )	Nc           
      óØ  •— ||   D ]Ü  }‰|z  dz  ‰›|›dd›�z   }||   g k(  r”g }| |   g k7  rO|‰vrKt        ‰j                  | |«      «      }|dz  }|dj                  |D �cg c]  }t        |«      ‘Œ c}«      z  }|dz  }‰j	                  |«       t        |«       ‰‰
   dxx   t        |«      z  cc<   nt        |dz   «        ‰	| |||dz   «       ‰‰
   dxx   dz  cc<   ŒÞ y c c}w )	Nr  z(serialú, fused with loop(s): rÀ  ú)rK  rƒ   Ú
serialized)rš  r   r  rƒ  rb  ri   r‰   )rG  rH  rI  rJ  rù  r¤  rK  re   rL  rM  rS  rN  r\  ÚsummaryrO  s           €€€€€€€rh   rM  zFParforDiagnostics.print_optimised.<locals>.print_nest.<locals>.print_g]  s  ø€ Ø˜u™ò :�AØ ™+¨Ñ+¹5Â!ÁYÐ.OÑO�CØ˜Q‘x 2’~Ø "˜Ø  ™8 rš>¨a°xÑ.?Ü$*¨4×+?Ñ+?ÀÀqÓ+IÓ$J˜EØÐ#;Ñ;˜CØ 4§9¡9¸eÖ-D¸¬c°!­fÒ-DÓ#EÑE˜CØ˜s™
˜Ø Ÿ™¨Ô*Ü% cÔ*Ø 	Ñ*¨7Ó3´s¸5³zÑAÔ3ä% c¨C¡iÔ0Ù  u¨a°¸±Ô;Ø˜IÑ& |Ó4¸Ñ9Ô4ñ:ùò .Es   Á"C'rP  r  rF  r   ©rö  rK  r`  rƒ   r+  rQ  )
rG  rH  rR  rN  rS  rM  rL  r\  ra  rO  s
      ``@€€€€rh   rT  z5ParforDiagnostics.print_optimised.<locals>.print_nest\  sn   û€ ÷:ò :ð$ �W‰~ Ò#ÜÐ3°iÑ?Ô@Ü©5²'¹<ÐHÔIØ.5ÀÐQRÑ%S�˜	Ñ"Ù˜˜u g¨qÔ1Ü�d”Ø%¨™M�	ØÐrl   c           	      ó`  •— t        d|z  «       ‰|z  dz  ‰›|›dd›�z   }g }||   g k7  rKt        ‰	j                  ||«      «      }|dz  }|dj                  |D �cg c]  }t	        |«      ‘Œ c}«      z  }|t        |«      ddœ‰
|<   |dz  }t        |«       t        d	«       |d
z   }|S c c}w )NrP  r  z	(parallelr^  rÀ  r   rb  r_  r+  rƒ   )ri   rš  r   r  rƒ  r‰   rd   )r¦  rà  r  rJ  rS  r¤  rK  re   rL  r\  ra  rO  s           €€€€rh   rV  z5ParforDiagnostics.print_optimised.<locals>.print_fusex  sÂ   ø€ ÜÐ/°)Ñ;Ô<Ø˜‘+ Ñ#±5º%ÁÐ&MÑMˆCØˆEØ�5‰z˜RÒÜ˜t×3Ñ3°C¸Ó?Ó@�ØÐ/Ñ/�Ø�t—y‘y°%Ö!8¨Q¤# a¥&Ò!8Ó9Ñ9�à*/¼#¸e»*ÐTUÑ!VˆG�IÑØ�3‰JˆCÜ˜#ÔÜ�$ŒKØ! A™ˆIØÐùò "9s   ÁB+
r   r   rW  r!  z5
 
Parallel region %s (loop #%s) had %s loop(s) fusedrö  rK  r`  zE and %s loop(s) serialized as part of the larger parallel loop (#%s).r  z&Parallel structure is already optimal.)
r‰   rñ  rº  r»  ru   rb  r¶  rš  rˆ  ri   )r\  r5  rô  r  rõ  r#  r$  r  re   rT  rV  rS  rN  rÃ  rX  rY  rà  r  rù  rí  r¤  rö  rK  r`  rL  ra  rO  s   `                       @@@rh   Úprint_optimisedz!ParforDiagnostics.print_optimisedH  s¿  û€ ð ˆÜ�%‹jˆØ×.Ñ.¨t×/?Ñ/?Ó@‰ˆˆfØ×/Ñ/°×0GÑ0GÓH‰ˆˆgäˆt‹9”s˜4“yÒ Ü�d“)ˆCØ‰Cä�d“)ˆCØˆCÜ”s˜3“x Ó%ò 	ˆAØ�J‰J�r�Nð	ô “&ˆ÷	÷8	ð" ˆ	ØˆÜ  §¡£Ó/ò 	‰JˆD�$Ø!%ÑˆF�E˜3Ø˜ÒØ Ò(Ù *¨3°°s¸A¸yÓ I‘IØ˜6Ò!Ù& t¨T°5¸(ÀIÓN‘	à�qð	ñ Ü˜wŸ}™}›Ó/ò :‘��1ð$�à˜‘y�Ø˜'™
�Ø˜|™_�
Ø ’?Øð +ñ ,�Cô " #¨¨D°%¸ÀTÐ(JÑ"JÕKà˜3‘J�CÜ! #¨¨D°%Ð(8Ñ"8Õ9ñ:ô ÐBÕCrl   c                 ó<  — d}t        d«       | j                  j                  «       D �]  \  }}|j                  dg «      }|D ]ø  }t	        |j
                  t        j                  «      sŒ(	 |j
                  j                  }|dk(  rµd}|j                  }t        |||fz  «       	 t        j                  j                  |j                  «      }	t#        j$                  |	«      }
|
rI|j&                  r=t        d|
|j&                  dk  rdn|j&                  d	z
     j)                  «       z   «       t        d
«       d}Œú �Œ |st        d«       y y # t        $ r, t        j                  j!                  |j                  «      }	Y Œµw xY w# t*        t,        f$ r Y �ŒWw xY w)NFzAllocation hoisting:rÛ  rÇ   z¸The 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Þ  Úattrrm  ri   ÚosÚpathÚrelpathr  r#  ÚabspathÚ	linecacheÚgetlinesrÃ  r2  ÚKeyErrorÚAttributeError)r\  Úfoundrà  rá  rŠ  râ  rf  r¤  rm  rh  r5  s              rh   Úallocation_hoistz"ParforDiagnostics.allocation_hoist¨  sm  € ØˆÜÐ$Ô%ØŸ?™?×0Ñ0Ó2ó 	‰KˆE�4Ø—8‘8˜I rÓ*ˆDØò �Ü˜dŸj™j¬"¯'©'Õ2ðØ#Ÿz™zŸ™˜Ø 7š?ð$;˜Cð
 #'§(¡(˜CÜ)¨#°°e°Ñ*<Ô=ðEÜ')§w¡w§¡°s·|±|Ó'D ô %.×$6Ñ$6°tÓ$<˜EÙ$¨¯ªÜ -Ð.@À5ÈcÏhÉhÐYZÊlÉÐ`c×`hÑ`hÐklÑ`lÑCm×CsÑCsÓCuÑ.uÔ vÜ)Ð*]Ô^Ø$(˜Eøò)ð	ñ2 ÜÐ8Õ9ð øô $.ò EÜ')§w¡w§¡°s·|±|Ó'D¢ðEûô %¤nÐ5ò Úðús7   Á,9FÂ&)EÃA-FÅ2FÆFÆFÆFÆFÆFc                 ó  — t        d«       t        d«       d}| j                  rÆ| j                  j                  «       D ]©  \  }}|j                  dd «      }|j                  dd «      }|s|st        d|z  «       Œ=t        d|z  «       |r)t        d«       |D �cg c]  }t        d	|z  «      ‘Œ c} d
}|sŒyt        d«       |D ��cg c]  \  }}t        d|›d|›�«      ‘Œ c}} d
}Œ« |st	        d«       t	        d«       y c c}w c c}}w )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   )r\  Úhoist_info_printedrà  rá  rÛ  rr  rg   re   s           rh   Úinstruction_hoistz#ParforDiagnostics.instruction_hoistÇ  sú   € ÜˆbŒ	ÜÐ%Ô&Ø"ÐØ�?Š?Ø#Ÿ™×4Ñ4Ó6ò .‘��tØŸ(™( 9¨dÓ3�Ø"Ÿh™h }°dÓ;�Ù¡{ÜÐ:¸UÑBÔCØä�k EÑ)Ô*ÙÜÐ8Ô9Ø29Ö:¨Q”U˜8 a™<Õ(Ó:Ø)-Ð&ÚÜÐ<Ô=Ø>I×J±d°a¸•Uª1©aÐ0Õ1ÔJØ)-Ñ&ð.ñ  "ÜÐ9Ô:Ü�hÕùò ;ùó Ks   ÂDÃD	c                 ó
  ‡ ‡!— ‰ j                   st        d«      ‚‰ j                  j                  j                  }‰ j                  j
                  }‰ j                  |v rd}d}nd|›d|›d�}d}d}d}d}d}	d}
d}d}d}d}d}|d	v rd
}d
}nt        d«      ‚|dv rd
}|dv rd
}|dk(  rd
}	d
}
|dk(  rd
}d
}d
}|dk(  r|sy t        d«       t        t        dz  «       t        d|z  j                  t        d«      «       t        t        dz  «       t        d«       |rt        dj                  t        d«      «       ‰ j                  |«      }‰ j                  «       }|r t        d|z  «       t        dt        z  «       ‰ j                  j
                  j                  }	 t        j                  j!                  |«      }|r‰ j%                  ||«       dŠ!‰ j'                  «       }|D �cg c]  }|j(                  ‘Œ }}t+        |«      }|s|	rRt,        s-t        dj                  t        d«      «       d}t        |«       nd}t        |«       t        t        dz  «       |dkD  �rQˆ ˆ!fd„}|r7‰ j.                  D ](  }|\  }}}t        d|›d|›d�«       t        d |z  «       Œ* ‰ j0                  i k7  r!|	rt        d!«        |‰ j0                  d"d#«       |	rj‰ j2                  rd$}nd%}t        d&j5                  ||dj7                  |D �cg c]  }d'|z  ‘Œ	 c}«      «      «       t        t        dz  «       t        d«       |
rn‰ j8                  i k7  r_t        d(j                  t        d«      «       t        d)«       d*}d+} |‰ j8                  ||«       t        t        dz  «       t        d«       ‰ j;                  |«      } |rBt=        d,j                  t        d«      «       ‰ j?                  | «       t=        t        dz  «       |rBt=        d-j                  t        d«      «       ‰ jA                  | «       t=        t        dz  «       t        d«       t        t        dz  «       t        d«       |s|rt        d.j                  d/d«      «       |r‰ jC                  «        |r‰ jE                  «        y y t        d0j5                  ||«      «       y # t        $ r# t        j                  j#                  |«      }Y �Œ>w xY wc c}w c c}w )1Nzself.setup has not been calledzInternal parallel functions r  z
 Function rÀ  r  r  F)rƒ   rË   r   r!  Tz1Report level unknown, should be one of 1, 2, 3, 4)rË   r   r!  )r   r!  r   r!  z
 ú=z% Parallel Accelerator Optimizing: %s r-  zLooking for parallel loopsr“  z
Found %s parallel loops.rC  z Fusing loops zPAttempting fusion of parallel loops (combines loops with similar properties)...
z+Performing sequential lowering of loops...
r  c                 óp   •‡‡‡‡— t        ‰«      Šˆˆˆˆˆfd„}‰j                  | «      \  Š} |‰|«       y )Nc                 ót   •‡— ˆˆˆˆfd„Š|D ])  }t        ‰›|›d‰›�«        ‰‰|d«       t        d«       Œ+ y )Nc                 ó|   •— | |   D ]3  }t        ‰|z  dz  ‰›|›d‰›�z   «       | |   g k7  sŒ' ‰| ||dz   «       Œ5 y )Nr  rƒ   ©ri   )r  rö  rJ  rù  rL  Únode_msgrM  rO  s       €€€€rh   rM  zYParforDiagnostics.dump.<locals>.dump_graph_indented.<locals>.print_graph.<locals>.print_gE  sP   ø€ Ø!$ T¡ò ;˜AÜ)¨#°©+¸Ñ*;É5ÒRSÑU]Ð>^Ñ*^Ô_Ø" 1™v¨›|Ù '¨¨Q°¸±	Õ :ñ;rl   r  rƒ   r-  r{  )	r  rï  r3  rM  rL  rf   r|  Úroot_msgrO  s	      @€€€€€rh   Úprint_graphzHParforDiagnostics.dump.<locals>.dump_graph_indented.<locals>.print_graphD  s<   ù€ ÷;ð
 #ò *˜Ü%±5º!¹XÐ&FÔGÙ  1 aÔ(Ü% bÕ)ñ*rl   )r‰   rñ  )	r»   r}  r|  r~  rï  rL  rf   r\  rO  s	    ``  @@€€rh   Údump_graph_indentedz3ParforDiagnostics.dump.<locals>.dump_graph_indentedB  s6   ü€ Ü˜%“j�÷	*ð 	*ð  ×2Ñ2°1Ó5‘��5Ù˜A˜uÕ%rl   z  Trying to fuse loops #z and #r•  rs  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Â  rm  r¸  r#  ri   Ú
_termwidthr˜  r  rÑ  r  rg  rh  ri  rj  rA  rÆ  rr  r‰   Úsequential_parfor_loweringr¼  rº  rÄ  r$  r  r»  r)  rd   rZ  rd  rp  ru  )"r\  ÚlevelrV  rÃ  r3  rÅ  r  Ú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_internalr	  r¡  r  rh  r†   re   Ú
parfor_idsÚ	n_parforsr¤  r  ÚreportÚl1Úl2Úafter_fusionr}  r|  r(  rO  s"   `                                @rh   r™  zParforDiagnostics.dumpà  sÝ  ù€ Ø�~Š~ÜÐ?Ó@Ð@Ø�|‰|×#Ñ#×1Ñ1ˆØ�|‰|×ÑˆØ×Ñ Ñ%Ø8ˆKØ ‰Gð &ò 26²tÐ<ˆKØˆGà!ÐØ$ÐØ#ÐØ$ÐØ!&ÐØ#ÐØ$ÐØ!&ÐØ"'ÐØˆð �LÑ Ø#'Ð Ø#'Ñ äÐPÓQÐQà�IÑØ"&Ðà�F‰?Ø%)Ð"à�AŠ:Ø#'Ð Ø%)Ð"à�AŠ:Ø"&ÐØ&*Ð#Ø!ˆNà�jÒ ©Øä�eÔÜ”j 3Ñ&Ô'ÜÐ>ÀÑL×TÑTÔU_ÐadÓeÔfÜ”j 3Ñ&Ô'Ü�bÔñ ÜÐ6×=Ñ=¼jÈ#ÓNÔOØ×0Ñ0Ð1BÓCˆà×"Ñ"Ó$ˆÙÜÐ6¸Ñ>Ô?Ü˜#¤
Ñ*Ô+ð —<‘<×#Ñ#×,Ñ,ˆð	-ô —7‘7—?‘? 8Ó,ˆDñ  Ø×Ñ °Ô<ð ˆØ×"Ñ"Ó$ˆØ$+Ö,˜q�a—d“dÐ,ˆ
Ð,Ü˜
“Oˆ	ñ Ñ"6Ý-ÜÐ.×5Ñ5´jÀ#ÓFÔGð8�ä˜cÕ"àD�Ü˜cÔ"Üœj¨3Ñ.Ô/à�r‹>õ&ñ #Ø"×1Ñ1ò 2�FØ"(‘K�B˜˜CÝ!Ê2ÊrÐ"RÔSÜ! (¨S¡.Õ1ð2ð
 ×Ñ 2Ò%Ù'Ü!Ð">Ô?á'¨×(8Ñ(8Ð:bÐdmÔná#Ø×&Ò&Ø#Y‘Là#9�LäÐn×vÑvØ$ i°·±ÈzÖ;ZÈ!¸EÀA»IÒ;ZÓ1[ó]ô ^äœj¨3Ñ.Ô/Ü˜bÔ!ñ &Ø×*Ñ*¨bÒ0Ü!Ð#<×"DÑ"DÄZÐQTÓ"UÔVÜ!Ð"sÔtØ3�HØ?�HÙ'¨×(?Ñ(?ÀÈ8ÔTÜ!¤*¨sÑ"2Ô3Ü! "Ô%ð ×*Ñ*¨>Ó:ˆIá"ÜÐ-×4Ñ4´ZÀÓDÔEØ×&Ñ& yÔ1Ü”j 3Ñ&Ô'á#ÜÐ,×3Ñ3´J¸sÓCÔDØ×$Ñ$ YÔ/Ü”j 3Ñ&Ô'Ü˜"ÔÜœ* sÑ*Ô+Ü˜%Ô ñ &Ñ)@ÜÐ:×AÑAÀ"ÀcÓJÔKá%Ø×%Ñ%Ô'á&Ø×&Ñ&Õ(ð 'ô ÐG×NÑNÈtÐUYÓZÕ[øôQ ò 	-ô —7‘7—?‘? 8Ó,‹Dð		-üò -ùòd <[s   ÆS Ç(T ÌTÓ(S=Ó<S=c                 ó:   — d}|t        | j                  «      z  }|S )NzParforDiagnostics:
)r„  r·  ©r\  r3  s     rh   Ú__str__zParforDiagnostics.__str__�  s!   € Ø#ˆØ	ŒT�$×#Ñ#Ó$Ñ$ˆØˆrl   c                 ó
   — d}|S )Nr³  rk   r•  s     rh   r`  zParforDiagnostics.__repr__•  s   € Ø ˆØˆrl   r`   )rƒ   )ry   rz   r{   rf  r]  rÈ  Úpropertyr¾  ÚsetterrÑ  rÕ  rÓ  rÆ  rã  rñ  rý  r   r  r  r)  rA  rZ  rd  rp  ru  r™  r–  r`  rk   rl   rh   r³  r³  É  sª   „ ñòòð ñó ðð ×Ññ ó ð ó'ò%ò
Aòò

ò&òPò&
ò8òtò:*òX*)òX?òB^Dò@:ò> ó2n\ò`ó
rl   r³  c                   ó&   — e Zd ZdZ	 dd„Zd„ Zd„ Zy)ÚPreParforPasszwPreprocessing for the Parfor pass. It mostly inlines parallel
    implementations of numpy functions if available.
    Nc	                 ó    — |€i }|| _         || _        || _        || _        || _        || _        || _        |€t        }|| _        dddœ| _	        y )Nr   )Úreplaced_funcÚreplaced_dtype)
rª  r�  Ú	calltypesÚ	typingctxÚ	targetctxÚoptionsÚswappedÚswap_functions_mapÚreplace_functions_mapÚstats)	r\  rª  r�  rŸ  r   r¡  r¢  r£  r¥  s	            rh   r]  zPreParforPass.__init__ž  s`   € àˆ?ØˆGØˆŒØˆŒØ"ˆŒØ"ˆŒØ"ˆŒØˆŒàˆŒØ Ð(Ü$6Ð!Ø%:ˆÔ"àØñ
ˆ�
rl   c                 óB  — t        | j                  | j                  | j                  | j                  «       | j
                  j                  r%| j                  | j                  j                  «       t        | j                  j                  «      | j                  _        y)z(Run pre-parfor processing pass.
        N)
r7   rª  r�  rŸ  r   r¢  r9  Ú_replace_parallel_functionsrÐ  r5   r_  s    rh   r­  zPreParforPass.run²  sf   € ô 	  §¡¨d¯l©lØ $§¡°·±ô	@à�<‰<×ÒØ×,Ñ,¨T¯\©\×-@Ñ-@ÔAÜ*¨4¯<©<×+>Ñ+>Ó?ˆ�‰Õrl   c           	      óz
  ‡ ‡‡‡‡‡‡‡— ‰ j                   ŠddlmŠ t        |j	                  «       «      Š‰�r‰j                  «       \  }Št        ‰j                  «      D �]Ô  \  Š}t        |t        j                  «      sŒ"|j                  }‰ j                  |j                     Š|j                  Št        ‰t        j                  «      rA‰j                   dk(  r2ˆˆˆˆˆˆ ˆˆfd„}t#        |«      sŒ”‰ j$                  dxx   dz  cc<    �n*t        ‰t        j                  «      sŒÉ‰j                   dk(  sŒÙ‰j&                  dk(  sŒé‰ j                  ‰j                  j                     }t        |t(        j*                  j,                  «      s�Œ2|j.                  }‰j0                  }|j2                  }	t        j4                  |t7        d	«      |	«      }
t(        j8                  j;                  t<        «      ‰ j                  |
j                  <   t        j>                  d
t<        |	«      }t        j                  ||
|	«      }tA        |«      }|dk(  rd}t        j4                  |t7        d«      |	«      }t)        jB                  |«      ‰ j                  |j                  <   t        j                  t        jD                  ||	«      ||	«      }t        j4                  |t7        d«      |	«      }tG        t<        j.                  «      }tH        jJ                  j(                  jM                  |«      }|jO                  ‰ jP                  ‰ j                  |j                     fi «       t(        jR                  jM                  |«      ‰ j                  |j                  <   t        j                  jU                  |
d|	«      }t        j                  |||	«      }t        j4                  |t7        d«      |	«      }t(        j*                  jW                  |«      ‰ j                  |j                  <   t        j                  jY                  ||gd|	«      }t        j                  |||	«      }t[        ‰ j                  |j                     ‰ j                  |j                     «      ‰ j\                  |<   ||_        ‰j                  j_                  d|«       ‰j                  j_                  d|«       ‰j                  j_                  d|«       ‰j                  j_                  d|«       ‰ j$                  dxx   dz  cc<    n ‰r�Œyy)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        ‰j                  ‰j                  «      } t        ‰j                  ‰«      }‰j                  j                  |d «      }|€£t        |«      dk(  r•t        |d   t        j                  «      rxt        ‰j                  |d   j                     t        j                  j                  «      r:t        j                  |d   d «      }|�‰j                   j#                  d|d   «       t%        |d u«       t'        ˆfd„‰j                   D «       «      }‰j(                  D ��ci c]  \  }}|‰j                  |j                     “Œ! }}}	  |‰g|¢­i |¤Ž}t%        |d u«        t-        j.                  |«      j0                  |i |¤Žj                   }t3        j2                  ‰j                  j4                  j                  j6                  «      }t8        |d<   t:        |d<   t<        |d<   t>        j                  |d «      }	|	�|	j                  ||	j                  <    ‰‰j                  |‰‰|‰j@                  ‰jB                  |‰j                  ‰jD                  ‰«      \  }
}tG        |
d¬	«      }|D ]N  }|jI                  «       D ]9  \  }}|d   d
k(  sŒ||jJ                  | ‰jL                  ‰   jN                  g‰|<    ŒN ŒP yc c}}w # t*        $ r d }Y �Œ�w xY w)NrË   rƒ   r   c              3   óP   •K  — | ]  }‰j                   |j                     –— Œ y ­wr`   )r�  rV  )r  re   r\  s     €rh   r  zRPreParforPass._replace_parallel_functions.<locals>.replace_func.<locals>.<genexpr>Þ  s   øè ø€ Ò(QÀ!¨¯©°a·f±fÕ)=Ñ(Qùs   ƒ#&r…   rÁ   r  F)Útopological_orderingrs   T)(r?   rª  rW  r9   r¥  rŸ  r‰   rš   r	   rc  r�  rV  r   rÌ   rÍ   Úreplace_functions_ndarrayrw   Úinsertr<   r  ÚkwsÚ	Exceptionr   ÚpysignatureÚbindrå  rÁ  Ú__globals__r…   r9  r  Úreplace_functions_checkers_mapr   r¡  rŸ  r3   rˆ  ry   r‰  rm  )Úfunc_defÚcallnameÚ	repl_funcÚtypsrù  re   Úkws_typsÚnew_funcÚgÚcheckÚ
new_blocksÚ_Ú
call_tablerÜ  rí  r�  Úexprr�   rª  Úlhs_typr\  r£  Ú	work_lists                  €€€€€€€€rh   Úreplace_funcz?PreParforPass._replace_parallel_functions.<locals>.replace_funcÎ  s§  ø€ Ü'5°d·l±lÀDÇIÁIÓ'N˜HÜ'4°T·\±\À4Ó'H˜HØ(,×(BÑ(B×(FÑ(FÀxÐQUÓ(V˜Ià )Ð 1Ü # H£°Ò 2Ü *¨8°A©;¼¿¹Ô ?Ü *¨4¯<©<¸À¹×8HÑ8HÑ+IÜ+0¯>©>×+?Ñ+?ô!Aä,E×,IÑ,IÈ(ÐSTÉ+ÐW[Ó,\ 	Ø#,Ð#8à$(§I¡I×$4Ñ$4°Q¸À¹Ô$Dä# I°TÐ$9Ô:Ü#(Ó(QÀtÇyÁyÔ(QÓ#Q˜DØLPÏHÉH×'UÁDÀAÀq¨¨4¯<©<¸¿¹Ñ+?Ñ(?Ð'U˜HÑ'Uð0Ù,5°gÐ,QÀÒ,QÈÑ,Q ô $ H°DÐ$8Ô9à#C¤5×#4Ñ#4°XÓ#>×#CÑ#CÀTÐ#VÈXÑ#V×#[Ñ#[˜Dä $§	¡	¨$¯,©,×*>Ñ*>×*CÑ*C×*OÑ*OÓ P˜AÜ).˜A˜g™JÜ&+˜A˜d™GÜ(,˜A˜f™Iô %C×$FÑ$FÀxØGKó%M˜Eà$Ð0Ø05·
±
  %§*¡*¡á,?ÀÇÁÈaØ,1°1°hÀÇÁÐPT×P^ÑP^Ø,0°$·,±,ÀÇÁÐPYó-[™M˜J¨ô *8¸
ÐY^Ô)_˜Jð )3ò . Ø,0¯J©J«Lò !.¡D A qØ'(¨¡tÐ/@Ó'@Ø6>À	×@RÑ@RÐT\Ð^c×^hÑ^hÐijÑ^k×^oÑ^oÐ5p¨°©
Ù(-ñ!.ð.ð
 $(ùó? (Vøô $-ò 0Ø+/£ð0ús   Ä3$KÅK ËK)Ë(K)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ˆ  Úpopr1  r‰  rš   r	   ÚAssignÚtargetr�  rV  rÝ  rÞ  rl  r;   r¦  rf  r   rÌ   rÍ   r�   Úscoperm  rc  r    ÚmiscÚModuler9  ÚGlobalrƒ  ÚStringLiteralÚConstÚfind_templater…   ÚcorerR   Úget_call_typer   Ú	functionsrÅ  ÚDTyperÜ  rQ   rŸ  r¯  )r\  rÐ  r×  ÚinstrÚlhsrÄ  Útypr�   rÍ  rm  Ú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¨  z)PreParforPass._replace_parallel_functions¼  s×  ÿ€ ð —,‘,ˆÝEÜ˜Ÿ™›Ó(ˆ	ÚØ$Ÿ=™=›?‰LˆE�5Ü% e§j¡jÓ1ó v"‘��5Ü˜e¤R§Y¡YÕ/ØŸ,™,�CØ"Ÿl™l¨3¯8©8Ñ4�GØ Ÿ;™;�DÜ! $¬¯©Ô0°T·W±WÀÒ5F÷0(ó 0(ôb ! Õ.Ø ŸJ™J Ó7¸1Ñ<Ó7Ú!Ü$ T¬2¯7©7Õ3¸¿¹À9Ó8LØŸ)™) wÓ.ð #Ÿl™l¨4¯:©:¯?©?Ñ;˜Ü% c¬5¯>©>×+?Ñ+?Ö@ð %(§I¡I˜EØ$)§K¡K˜EØ"'§)¡)˜CÜ')§v¡v¨e´]À;Ó5OÐQTÓ'U˜HÜ:?¿*¹*×:KÑ:KÌEÓ:R˜DŸL™L¨¯©Ñ7Ü#%§9¡9¨T´5¸#Ó#>˜DÜ*,¯)©)°D¸(ÀCÓ*H˜Kô ),¨E«
˜IØ(¨FÒ2Ø,3 	Ü&(§f¡fØ %¤}°]Ó'CÀSó'J˜Gä9>×9LÑ9LØ )ó:+˜DŸL™L¨¯©Ñ6ä-/¯Y©YÜ "§¡¨°CÓ 8¸'À3ó.H˜Nô .0¯V©V°E¼=ÐIZÓ;[Ð]`Ó-a˜NÜ#0´·±Ó#=˜DÜ$)§J¡J×$4Ñ$4×$=Ñ$=¸dÓ$C˜EØ!×/Ñ/°·±ÀÇÁÈgÏlÉlÑA[Ð@]Ð_aÔbÜ@EÇÁ×@XÑ@XÐY]Ó@^˜DŸL™L¨×)<Ñ)<Ñ=Ü13·±·±ÀÈ7ÐTWÓ1XÐ.Ü02·	±	Ð:LÈnÐ^aÓ0bÐ-ô )+¯©¨u´mÀLÓ6QÐSVÓ(W˜IÜ;@¿>¹>×;OÑ;OÐPUÓ;V˜DŸL™L¨¯©Ñ8Ü,.¯G©G¯L©L¸È'ÈÐTVÐX[Ó,\˜MÜ+-¯9©9°]ÀIÈsÓ+S˜LÜ<EØ $§¡¨Y¯^©^Ñ <¸d¿l¹lÈ7Ï<É<Ñ>Xó=Z˜DŸN™N¨=Ñ9ð +4˜EœKà!ŸJ™J×-Ñ-¨a°Ô>Ø!ŸJ™J×-Ñ-¨aÐ1BÔCØ!ŸJ™J×-Ñ-¨a°Ô@Ø!ŸJ™J×-Ñ-¨a°Ô=Ø ŸJ™JÐ'7Ó8¸AÑ=Ó8Ù!ðmv"õ rl   ©NN)ry   rz   r{   rf  r]  r­  r¨  rk   rl   rh   r›  r›  š  s   „ ñð ?Có
ò(@óA"rl   r›  c                 ó¤   — t         j                  j                  j                  j                  j
                  D ]  }|j                  | k(  sŒ|c S  y r`   )r…   rÔ  r   Ú	templatesÚbuiltin_registryrÖ  r  )rl  Úfts     rh   rÓ  rÓ  ?  s=   € Ü�j‰j×Ñ×)Ñ)×:Ñ:×DÑDò ˆØ�6‰6�R‹<ØŠIñrl   c                   ó$   — e Zd ZdZ e«       fd„Zy)ÚParforPassStateszCThis class encapsulates all internal states of the ParforPass.
    c                 ó  — || _         || _        || _        || _        || _        || _        || _        |
| _        |
j                  | _	        |
j                  | _
        |
j                  | _        t        j                  | j                  | j                   | j                  | j                  «      | _        t        j                  j!                  t#        |j$                  j'                  «       «      «       || _        |	| _        d|	vri |	d<   y y )Nr†   )rª  r�  rŸ  r   r¡  r�   r¢  Údiagnosticsr·  Úswapped_fnsrº  r»  rZ   ÚArrayAnalysisr   Ú_the_max_labelr"  r§   rÐ  ré  rz  Úmetadata)r\  rª  r�  rŸ  r�   r   r¡  r¢  rz  rõ  rñ  s              rh   r]  zParforPassStates.__init__I  sá   € ð ˆŒØˆŒØ"ˆŒØ"ˆŒØ"ˆŒØ&ˆÔØˆŒØ&ˆÔØ&×3Ñ3ˆÔØ&×2Ñ2ˆÔØ"-×"@Ñ"@ˆÔä,×:Ñ:Ø�N‰N˜DŸL™L¨$¯,©,¸¿¹ó
ˆÔô 	×Ñ×&Ñ&¤s¨7¯>©>×+>Ñ+>Ó+@Ó'AÔBØˆŒ
Ø ˆŒØ˜HÑ$Ø"$ˆH�YÒð %rl   N)ry   rz   r{   rf  r³  r]  rk   rl   rh   rï  rï  E  s   „ ññ
 /Ó0ô%rl   rï  c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚConvertInplaceBinopú0Parfor subpass to convert setitem on Arrays
    c                 ó    — || _         g | _        y©zV
        Parameters
        ----------
        pass_states : ParforPassStates
        N©Úpass_statesÚ	rewritten©r\  rü  s     rh   r]  zConvertInplaceBinop.__init__f  ó   € ð 'ˆÔØˆ�rl   c           	      óØ  — | j                   }t        |«      }|D �]Í  }||   }g }|j                  j                  |«      }|j                  D �]‘  }t        |t        j                  «      �r?|j                  }	|j                  }
t        |
t        j                  «      �r|
j                  dk(  rý|
j                  }|
j                  }|
j                  }|j                  |j                      }|j                  |j                      }t        |t"        j$                  j&                  «      rƒt        |t"        j$                  j&                  «      r_| j)                  |||
j*                  ||«      }| j,                  j/                  t1        ||d¬«      «       |t        j                  ||	|«      g}t        |t2        «      r|j5                  |«       �Œ�|j/                  |«       �Œ” ||_        �ŒÐ y )NÚinplace_binop©ÚoldÚnewÚreason)rü  r0   rZ   Úget_equiv_setr‰  rš   r	   rË  rÌ  rÝ  rÞ  rl  rm  rÙ  Úrhsr�  rV  r   rÌ   rÍ   Ú_inplace_binop_to_parforÚimmutable_fnrý  rb  r¶  r¹  rÿ  )r\  rÐ  rü  Ú
topo_orderr×  r�  Únew_bodyrx  rØ  rÙ  rÁ  rm  rÌ  rÝ  Ú
target_typÚ	value_typÚ	new_instrs                    rh   r­  zConvertInplaceBinop.runo  s‹  € Ø×&Ñ&ˆä$ VÓ,ˆ
ð  ó 	"ˆEØ˜5‘MˆEØˆHØ#×2Ñ2×@Ñ@ÀÓGˆIØŸ™ó +�Ü˜e¤R§Y¡YÕ/ØŸ,™,�CØ Ÿ;™;�DÜ! $¬¯©Õ0°T·W±WÀÒ5OØ"Ÿh™h˜Ø!%§¡˜Ø $§¡˜Ø%0×%8Ñ%8¸¿¹Ñ%E˜
Ø$/×$7Ñ$7¸¿
¹
Ñ$C˜	ä% j´%·.±.×2FÑ2FÔGä)¨)´U·^±^×5IÑ5IÔJØ,0×,IÑ,IÈ)Ø(+¨T×->Ñ->ÀÈó-O 	à $§¡× 5Ñ 5Ü$(¨U¸	Ø0?ô%Aô!"ð *3´B·I±I¸fÀcÈ3Ó4OÐ(P Ü˜e¤TÔ*Ø—O‘O EÖ*à—O‘O EÖ*ð1+ð2 "ˆEŽJñ;	"rl   c           
      ól  — | j                   }|j                  }|j                  |j                     }|j                  }	t        j                  ||«      }
|j                  |j                     }|j                  |«      }t        |j                  |||«      \  }}t        «       }t        j                  ||«      }t        |j                  |||«      \  }}t        j                  |t        d«      |«      }|j                  |j                  |j                  <   t
        j                  j                  |||«      }t        |j                  ||«      |j                   |<   |j"                  j%                  t        j&                  |||«      «       t        j                  |t        d«      |«      }|	|j                  |j                  <   t
        j                  j                  |||«      }t        |	||«      |j                   |<   |j"                  j%                  t        j&                  |||«      «       t        j                  |t        d«      |«      }|	|j                  |j                  <   t
        j                  j)                  ||||«      }|j"                  j%                  t        j&                  |||«      «       | j                   j*                  j-                  |	|j                  «      }t        |||«      |j                   |<   t        j.                  ||||«      }t        t0        j2                  |||	«      |j                   |<   |j"                  j%                  |«       t5        ||
i |||d|j6                  «      }||i|_        t:        j<                  dk\  rt?        d«       |jA                  «        |S )úû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)r  r-  rƒ   zparfor from inplace_binop)!rü  rÍ  r�  rV  r�   r	   ÚBlockÚ	get_shapeÚ_mk_parfor_loopsr!   Ú_make_index_varrc  r    rÞ  ÚgetitemrQ   rŸ  r‰  rb  rË  Úbinopr   Úunify_pairsÚSetItemr   Únonerh  rz  ru  r   ÚDEBUG_ARRAY_OPTrd   r™  )r\  rx  rm  rl  rÌ  rÝ  rü  rÍ  Úarr_typÚel_typrt  r  Ú	size_varsÚ
index_varsÚ	loopnestsÚ
body_labelÚ
body_blockrv  Úindex_var_typÚ	value_varÚgetitem_callÚ
target_varÚexpr_out_varÚ
binop_exprÚunified_typeÚsetitem_noder‡   s                              rh   r  z,ConvertInplaceBinop._inplace_binop_to_parfor”  s  € ð
 ×&Ñ&ˆØ—‘ˆØ×%Ñ% f§k¡kÑ2ˆØ—‘ˆÜ—X‘X˜e SÓ)ˆ
Ø×'Ñ'¨¯
©
Ñ3ˆ	à×'Ñ'¨Ó/ˆ	ô !1°×1DÑ1DÀiÐQVÐX[Ó \Ñˆ
�Iô  “\ˆ
Ü—X‘X˜e SÓ)ˆ
Ü#2Ø×#Ñ# U¨J¸
ó$DÑ ˆ	�=ô —F‘F˜5¤-°Ó"=¸sÓCˆ	Ø.7¯o©oˆ×Ñ˜IŸN™NÑ+Ü—w‘w—‘ u¨i¸Ó=ˆÜ.7Ø�O‰O˜Y¨ó/7ˆ×Ñ˜lÑ+à�‰×ÑœrŸy™y¨°yÀ#ÓFÔGô —V‘V˜E¤=°Ó#?ÀÓEˆ
Ø/5ˆ×Ñ˜JŸO™OÑ,Ü—w‘w—‘ v¨y¸#Ó>ˆÜ.7Ø�G˜]ó/,ˆ×Ñ˜lÑ+à�‰×ÑœrŸy™y¨°zÀ3ÓGÔHô —v‘v˜e¤]°?Ó%CÀSÓIˆØ17ˆ×Ñ˜L×-Ñ-Ñ.ô —W‘W—]‘] 2 z°9¸cÓBˆ
Ø�‰×ÑœrŸy™y¨°\À3ÓGÔHØ×'Ñ'×1Ñ1×=Ñ=¸fÀiÇoÁoÓVˆÜ,5Ø˜,¨ó-6ˆ×Ñ˜jÑ)ô —z‘z &¨)°\À3ÓGˆÜ.7Ü�J‰J˜ °ó/8ˆ×Ñ˜lÑ+à�‰×Ñ˜|Ô,ä˜	 :¨r°3¸	À9Ø-¨{×/@Ñ/@óBˆà&¨
Ð3ˆÔÜ×!Ñ! QÒ&ÜÐ-Ô.Ø�K‰KŒMØˆrl   c                 ó‚   — t         j                  }| j                  j                  j	                  |t        |«      i «      S r`   ©Úoperatorr  rü  r   Úresolve_function_typer  ©r\  rw   Úfntys      rh   Ú_type_getitemz!ConvertInplaceBinop._type_getitemÔ  ó3   € Ü×ÑˆØ×Ñ×)Ñ)×?Ñ?ÀÄeÈDÃkÐSUÓVÐVrl   N)ry   rz   r{   rf  r]  r­  r  r2  rk   rl   rh   r÷  r÷  c  s   „ ñòò#"òJ>ó@Wrl   r÷  c                 óf   — t        | t        j                  «      r| j                  S | j                  S r`   )rš   r	   r  r¯   rv  r  s    rh   Úget_index_varr5  Ù  s"   € Ü  ¤B§J¡JÔ/ˆ1�7‰7Ð@°Q·[±[Ð@rl   c                   ó*   — e Zd ZdZd„ Zd„ Zdd„Zd„ Zy)ÚConvertSetItemPassrø  c                 ó    — || _         g | _        yrú  rû  rþ  s     rh   r]  zConvertSetItemPass.__init__à  rÿ  rl   c           
      ó˜  — | j                   }t        |«      }|D �]­  }||   }g }|j                  j                  |«      }|j                  D �]q  }t        |t        j                  t        j                  f«      �r2|j                  }	|j                  }
t        |«      }|j                  }|j                  |
j                     }|j                  |j                     }|j                  |j                     }t        |t        j                   j"                  «      �r“t        |t        j                   j"                  «      �r{t        |j$                  t        j&                  «      �rV|j(                  |j(                  k(  �r<t        |t        j*                  «      r@| j-                  ||	|
||«      }| j.                  j1                  t3        ||d¬«      «       |}�nÕt        |t        j                   j"                  «      �r°t5        t6        |j8                  |j                  «      }t        |t        j:                  «      �rp|j<                  dk(  �r`|j>                  j                  |j                  k(  �r<| j-                  ||	|
||j                  «      }| j.                  j1                  t3        ||d¬«      «       |}nó|jA                  |«      }t        |t        jB                  «      r*tE        tG        tI        d„ |j                  «      «      «      }n)t        |t        jJ                  jL                  «      rd}nd}|�st        |t        j                   j"                  «      r||j(                  k(  r@| j-                  ||	|
|||¬«      }| j.                  j1                  t3        ||d	¬«      «       |}|j1                  |«       �Œt ||_        �Œ° y )
NÚmasked_assign_broadcast_scalarr  r  Úmasked_assign_arrayc                 óJ   — t        | t        j                  j                  «      S r`   )rš   r   rÎ  Ú	SliceTyper  s    rh   r4  z(ConvertSetItemPass.run.<locals>.<lambda>"  s   € ¬j¸¼E¿J¹J×<PÑ<PÓ.Q€ rl   rƒ   r   )r–   Úslice)'rü  r0   rZ   r  r‰  rš   r	   ÚStaticSetItemr  rm  rÌ  r5  rÝ  r�  rV  r   rÌ   rÍ   r�   ÚBooleanr™   ÚNumberÚ_setitem_to_parforrý  rb  r¶  r;   r?   rª  rÞ  rl  r¯   r  r   r‰   r¹  ÚfilterrÎ  r=  )r\  rÐ  rü  r
  r×  r�  r  rx  rØ  rm  rÌ  r¯   rÝ  r  Ú	index_typr  r  Úval_defr–   Úsliced_dimss                       rh   r­  zConvertSetItemPass.runé  s  € Ø×&Ñ&ˆô % VÓ,ˆ
ð  ó I	"ˆEØ˜5‘MˆEØˆHØ#×2Ñ2×@Ñ@ÀÓGˆIØŸ™ó D'�Ü˜e¤b×&6Ñ&6¼¿
¹
Ð%CÕDØŸ)™)�CØ"Ÿ\™\�FÜ)¨%Ó0�EØ!ŸK™K�EØ!,×!4Ñ!4°V·[±[Ñ!A�JØ +× 3Ñ 3°E·J±JÑ ?�IØ +× 3Ñ 3°E·J±JÑ ?�Iä! *¬e¯n©n×.BÑ.BÕCÜ& y´%·.±.×2FÑ2FÕGÜ& y§¡¼¿¹ÕFØ&ŸO™O¨y¯~©~Ó=ä)¨)´U·\±\ÔBØ,0×,CÑ,CÀIØ(+¨V°U¸Eó-C 	à $§¡× 5Ñ 5Ü$(¨U¸	Ø/Oô%Qô!"ð )2¢ä!+¨I´u·~±~×7KÑ7KÕ!LÜ*/´À×@SÑ@SØ05·
±
ó+< ä$.¨w¼¿¹Õ$@Ø$+§J¡J°)Ó$;Ø$+§M¡M×$6Ñ$6¸%¿*¹*Ó$DØ04×0GÑ0GÈ	Ø,/°¸ÀÇÁó1O Ià$(§N¡N×$9Ñ$9Ü(,°¸IØ4Iô)Kô%&ð -6¡Eð %.×$7Ñ$7¸Ó$>˜Eä)¨)´U·_±_ÔEô /2´$´vÙ$QØ$-§O¡Oó85ó 36ó /7¡ô ",¨I´u·z±z×7KÑ7KÔ!Lð /0¡à./ ð
 !&Ð 1Ü%/°	¼5¿>¹>×;OÑ;OÔ%PØ!,°	·±Ò!>Ø,0×,CÑ,CÀIØ(+¨V°U¸EÈð -Dó -P 	à $§¡× 5Ñ 5Ü(,°¸IØ4;ô)=ô!"ð )2 Ø—‘ Ö&ðID'ðJ "ˆEŽJñSI	"rl   Nc           
      ó 
  — | j                   }|j                  }|j                  |j                     }	|	j                  }
|j                  |j                     }t        j                  ||«      }|�rt        |t        j                  «      st        |t        j                  «      sJ ‚|}t        j                  |t        d«      |«      }t
        j                  j                  |||«      }t        j                   j#                  |	|«      j$                  }||j                  |j                  <   | j'                  |	|f«      |j(                  |<   |j+                  t        j,                  |||«      «       |}n9t        |t        j.                  «      sJ ‚|j1                  |«      }|j                  }g }g }|D ]w  }t        j                  |t        d«      |«      }|j+                  |«       t        j2                  |j                  |j                  <   |j+                  t5        |d|d«      «       Œy t7        «       }t        j                  ||«      }t9        |j                  |||«      \  }}t;        ||i |||d|j<                  «      }|r||i|_        |}d}nït7        «       }t        j                  ||«      }t7        «       }t        j                  ||«      }||||||i|_        t        j                  |t        d«      |«      }|j                  |j                  <   t
        j                  j                  |||«      }|j@                  jC                  t        j,                  |||«      t        jD                  ||||«      g«       |j                  |j                     } t        | t        jF                  jH                  «      r¹t        j                  |t        d«      |«      }!| j                  |j                  |!j                  <   t
        j                  j                  |||«      }tK        | j                  | |«      |j(                  |<   |j@                  j+                  t        j,                  ||!|«      «       n|}!t        jL                  |||!|«      }"tK        t        jN                  |j                  |j                     ||
«      |j(                  |"<   |j@                  j+                  |"«       |r/|j@                  j+                  t        jP                  ||«      «       tR        jT                  dk\  rtW        d	«       |jY                  «        |S )
r  z$subarrÚparfor_indexr   rƒ   )Úsetitemr-  Nz	$mask_varr  zparfor from setitem)-rü  rÍ  r�  rV  r�   r	   r  rš   r   r   r=  rc  r    rÞ  r  r   Ú	arraydeclÚget_array_index_typeÚresultr2  rŸ  rb  rË  ÚArrayCompatibler  ÚuintprY  r!   r  rh  rz  ru  r‰  rÿ  ÚBranchrÌ   rÍ   rQ   r  r  ÚJumpr   r  rd   r™  )#r\  rx  rm  rÌ  r¯   rÝ  r–   rü  rÍ  r  r  rD  rt  r  Ú
subarr_varr&  Ú
subarr_typÚbool_typr!  r   Úsize_varrv  r"  r#  r$  r‡   Ú
true_blockÚ	end_labelÚ
true_labelÚ	end_blockÚmask_varÚmask_valr  r%  r+  s#                                      rh   rB  z%ConvertSetItemPass._setitem_to_parfor;  sV  € ð
 ×&Ñ&ˆØ—‘ˆØ×%Ñ% f§k¡kÑ2ˆØ—‘ˆØ×'Ñ'¨¯
©
Ñ3ˆ	Ü—X‘X˜e SÓ)ˆ
âô ˜i¬¯©Ô9Ü˜i¬¯©Ô9ð;ð :ð ˆIäŸ™ ¤}°YÓ'?ÀÓEˆJÜŸ7™7Ÿ?™?¨6°5¸#Ó>ˆLÜ×)Ñ)×>Ñ>ÀÈÓS×ZÑZˆJØ3=ˆK×Ñ 
§¡Ñ0Ø26×2DÑ2DÀgÈyÐEYÓ2ZˆK×!Ñ! ,Ñ/Ø×ÑœbŸi™i¨°jÀ#ÓFÔGØ‰Fô ˜i¬×)>Ñ)>Ô?Ð@Ð?Ø!×+Ñ+¨FÓ3ˆIØ —‘ˆHð ˆ	Øˆ
Ø!ò 	BˆHÜŸ™˜u¤m°NÓ&CÀSÓIˆIØ×Ñ˜iÔ(Ü27·+±+ˆK×Ñ 	§¡Ñ/Ø×ÑœX i°°H¸aÓ@ÕAð		Bô  “\ˆ
Ü—X‘X˜e SÓ)ˆ
Ü#2Ø×#Ñ# U¨J¸
ó$DÑ ˆ	�=ä˜	 :¨r°3¸	À9Ø'¨×):Ñ):ó<ˆáà *¨JÐ7ˆFÔØ#ˆJØ‰Iô $›ˆJÜŸ™ %¨Ó-ˆJÜ"›ˆIÜŸ™ ¨Ó,ˆIØ *¨JØ *¨JØ )¨Ið "ˆFÔô —v‘v˜e¤]°;Ó%?ÀÓEˆHØ19ˆK×Ñ §¡Ñ.Ü—w‘w—‘ u¨i¸Ó=ˆHØ�O‰O×"Ñ"Ü�y‰y˜ 8¨SÓ1Ü�y‰y˜ :¨y¸#Ó>ð$ô ð
  ×'Ñ'¨¯
©
Ñ3ˆ	Ü�i¤§¡×!5Ñ!5Ô6ÜŸ™˜u¤m°LÓ&AÀ3ÓGˆIØ2;·/±/ˆK×Ñ 	§¡Ñ/ÜŸ7™7Ÿ?™?¨5°)¸SÓAˆLÜ2;Ø—‘ ¨Mó3;ˆK×!Ñ! ,Ñ/à�O‰O×"Ñ"¤2§9¡9¨\¸9ÀcÓ#JÕKàˆIÜ—z‘z &¨)°YÀÓDˆÜ.7Ü�J‰J˜×+Ñ+¨F¯K©KÑ8¸-Èó/Qˆ×Ñ˜lÑ+à�‰×Ñ˜|Ô,ÙØ�O‰O×"Ñ"¤2§7¡7¨9°cÓ#:Ô;ä×!Ñ! QÒ&ÜÐ'Ô(Ø�K‰KŒMØˆrl   c                 ó‚   — t         j                  }| j                  j                  j	                  |t        |«      i «      S r`   r-  r0  s      rh   r2  z ConvertSetItemPass._type_getitem™  r3  rl   r`   )ry   rz   r{   rf  r]  r­  rB  r2  rk   rl   rh   r7  r7  Ý  s    „ ñòòP"ód\ó|Wrl   r7  c                 ól  — t        |«      }|j                  }|dkD  s|ræt        j                  |t	        d«      |«      }t
        j                  j                  t
        j                  |«      | |j                  <   t        j                  j                  t        |«      |«      }t        j                  |||«      }	|j                  j                  |	«       |t
        j                  j                  t
        j                  |«      fS |dk(  r|d   t
        j                  fS t!        j"                  d|¬«      ‚)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©rm  )r‰   rm  r	   rc  r    r   Ú
containersÚUniTuplerN  rV  rÞ  Úbuild_tupler¹  rË  r‰  rb  r   ÚUnsupportedRewriteError)
r�  rÍ  r   r#  Úforce_tupleÚndimsrm  Ú	tuple_varÚ
tuple_callÚtuple_assigns
             rh   r  r  ž  sø   € ô �
‹O€EØ
�.‰.€CØˆq‚y‘KÜ—F‘F˜5¤-Ø%ó#'Ø(+ó-ˆ	ä"'×"2Ñ"2×";Ñ";Ü�K‰K˜ó# ˆ�	—‘Ñä—W‘W×(Ñ(¬¨jÓ)9¸3Ó?ˆ
Ü—y‘y ¨Y¸Ó<ˆØ�‰×Ñ˜|Ô,Øœ%×*Ñ*×3Ñ3´E·K±KÀÓGÐGÐGØ	�!ŠØ˜!‰}œeŸk™kÐ)Ð)ä×,Ñ,Ø:Øô
ð 	
rl   c           	      óö   — g }g }|D ]m  }t        j                  |t        d«      |«      }|j                  |«       t        j
                  | |j                  <   |j                  t        |d|d«      «       Œo ||fS )zN
    Create loop index variables and build LoopNest objects for a parfor.
    rH  r   rƒ   )r	   rc  r    rb  r   rN  rV  rY  )r�  r  rÍ  rm  r!  r   rT  rv  s           rh   r  r  »  sz   € ð €IØ€JØò >ˆÜ—F‘F˜5¤-°Ó"?ÀÓEˆ	Ø×Ñ˜)Ô$Ü"'§+¡+ˆ�	—‘ÑØ×Ñœ )¨Q°¸!Ó<Õ=ð	>ð
 �yÐ Ð rl   c                   ó@   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)ÚConvertNumpyPassz]
    Convert supported Numpy functions, as well as arrayexpr nodes, to
    parfor nodes.
    c                 ó    — || _         g | _        y r`   rû  rþ  s     rh   r]  zConvertNumpyPass.__init__Í  ó   € Ø&ˆÔØˆ�rl   c           	      ó\  — | j                   }t        |«      }g }|D �]�  }||   }g }|j                  j                  |«      }|j                  D �]Q  }	t        |	t        j                  «      �r"|	j                  }
|	j                  }| j                   j                  |j                     }| j                  |«      r»t        | j                  |
«      r?| j                  |||
«      }|��| j                   j#                  t%        |	|d¬«      «       |}	nft        |
t        j&                  «      rL|
j(                  dk(  r=| j+                  |||
|«      }| j                   j#                  t%        |	|d¬«      «       |}	|j#                  |j                  «       |j#                  |	«       �ŒT ||_        �Œ� y )NÚnumpy_allocatorr  Ú	arrayexpr)rü  r0   rZ   r  r‰  rš   r	   rË  rÝ  rÌ  r�  rV  Ú_is_C_or_F_orderr;   Ú_is_supported_npycallÚ_numpy_to_parforrý  rb  r¶  rÞ  rl  Ú_arrayexpr_to_parfor)r\  rÐ  rü  r
  Ú
avail_varsr×  r�  r  rx  rØ  rÁ  rÙ  rÂ  r  s                 rh   r­  zConvertNumpyPass.runÑ  s‚  € Ø×&Ñ&ˆÜ$ VÓ,ˆ
ð ˆ
Øó 	"ˆEØ˜5‘MˆEØˆHØ#×2Ñ2×@Ñ@ÀÓGˆIØŸ™ó '�Ü˜e¤R§Y¡YÕ/Ø Ÿ;™;�DØŸ,™,�CØ"×.Ñ.×6Ñ6°s·x±xÑ@�GØ×,Ñ,¨WÔ5Ü  ×!;Ñ!;¸TÔBØ(,×(=Ñ(=¸iÈÈdÓ(S˜IØ(Ð4Ø $§¡× 5Ñ 5´dØ(-Ø(1Ø+<ô7"ô !#ð
 )2¡Ü'¨¬b¯g©gÔ6¸4¿7¹7ÀkÒ;QØ(,×(AÑ(AØ )¨3°°jó)B˜Ià ŸN™N×1Ñ1´$Ø$)Ø$-Ø'2ô3ô ð
 %.˜EØ×%Ñ% c§h¡hÔ/Ø—‘ Ö&ð3'ð4 "ˆEŽJñ=	"rl   c                 óZ  — t        |t        j                  j                  «      r |j                  dk(  xr |j
                  dkD  S |t        u r_| j                  j                  |   }t        |t        j                  j                  «      xr  |j                  dk(  xr |j
                  dkD  S y)NÚCr   F©	rš   r   rÌ   rÍ   Úlayoutr™   rƒ  rü  r�  ©r\  Úarr_namerÚ  s      rh   Ú_is_C_orderzConvertNumpyPass._is_C_order÷  s�   € Ü�h¤§¡× 4Ñ 4Ô5Ø—?‘? cÑ)Ò?¨h¯m©m¸aÑ.?Ð?Øœ‰_Ø×"Ñ"×*Ñ*¨8Ñ4ˆCÜ˜s¤E§N¡N×$8Ñ$8Ó9ò !Ø—J‘J #Ñ%ò!à—H‘H˜q‘Lð"ð rl   c                 óž  — t        |t        j                  j                  «      r1|j                  dk(  xs |j                  dk(  xr |j
                  dkD  S |t        u rp| j                  j                  |   }t        |t        j                  j                  «      xr1 |j                  dk(  xs |j                  dk(  xr |j
                  dkD  S y)Nru  ÚFr   Frv  rx  s      rh   ro  z!ConvertNumpyPass._is_C_or_F_order  s¬   € Ü�h¤§¡× 4Ñ 4Ô5Ø—O‘O sÑ*ÒD¨h¯o©oÀÑ.DÒ[È(Ï-É-ÐZ[ÑJ[Ð[Øœ‰_Ø×"Ñ"×*Ñ*¨8Ñ4ˆCÜ˜s¤E§N¡N×$8Ñ$8Ó9ò !Ø—Z‘Z 3Ñ&Ò;¨#¯*©*¸Ñ*;ò!à—H‘H˜q‘Lð"ð rl   c                 óP  — | j                   }|j                  }|j                  }|j                  }|j                  |j
                     }	|	j                  }
|j                  |«      }t        |j                  |||«      \  }}t        j                  ||«      }t        |j                  |j                  |j                  |t        |«      |
|||j                  |j
                     «	      |_        t!        «       }t        j                  ||«      }t        j"                  |t%        d«      |«      }|
|j                  |j
                  <   t'        |j                  |||«      \  }}|j                  j)                  t+        |j,                  |j                  |j                  |j                  |||||||«      «       dj/                  t1        |j                  «      «      f}t3        ||i ||||d   |j4                  «      }t        j6                  ||||«      }t9        t:        j<                  |j                  |j
                     ||
«      |j                  |<   |j                  j?                  |«       ||i|_         tB        jD                  dk\  rtG        d«       |jI                  «        |S )zegenerate parfor from arrayexpr node, which is essentially a
        map with recursive tree.
        r  zarray expression {}r   rƒ   zparfor from arrayexpr)%rü  rÍ  rm  rÁ  r�  rV  r�   r  r  r	   r  r"   r   rŸ  r  r‰  r!   rc  r    r  rÿ  Ú_arrayexpr_tree_to_irrª  r$  Úrepr_arrayexprrh  rz  r  rQ   r   r  rb  ru  r   r  rd   r™  )r\  rx  rÙ  rn  rs  rü  rÍ  rm  rÁ  r  r  r  r   r!  rt  r"  r#  r(  rv  r$  Úpatr‡   r+  s                          rh   rr  z%ConvertNumpyPass._arrayexpr_to_parfor  sV  € ð ×&Ñ&ˆØ—	‘	ˆØ�g‰gˆØ�~‰~ˆØ×%Ñ% c§h¡hÑ/ˆØ—‘ˆð ×'Ñ'¨Ó,ˆ	Ü 0°×1DÑ1DÀiÐQVÐX[Ó \Ñˆ
�Iô —X‘X˜e SÓ)ˆ
Ü"Ø×!Ñ!Ø×Ñ ×!6Ñ!6¸Ü�)Ó˜f e¨SØ×Ñ §¡Ñ)ó	+ˆ
Œô
  “\ˆ
Ü—X‘X˜e SÓ)ˆ
Ü—v‘v˜e¤]°?Ó%CÀSÓIˆØ17ˆ×Ñ˜L×-Ñ-Ñ.ä#2Ø×Ñ ¨
°Jó$@Ñ ˆ	�=ð 	�‰×ÑÜ!Ø×#Ñ#Ø×%Ñ%Ø×#Ñ#Ø×%Ñ%ØØØØØØØóô	ð %×+Ñ+¬N¸9¿>¹>Ó,JÓKÐMˆä˜	 :¨r°3¸	À9ÈcÐRSÉfÐVa×VgÑVgÓhˆä—z‘z # y°,ÀÓDˆÜ.7Ü�J‰J˜×+Ñ+¨C¯H©HÑ5°}Àfó/Nˆ×Ñ˜lÑ+à�‰×Ñ˜|Ô,Ø&¨
Ð3ˆÔÜ×!Ñ! QÒ&ÜÐ)Ô*Ø�K‰KŒMØˆrl   c                 ó´   — t        | j                  j                  |«      \  }}t        |t        «      r|j                  d«      sy|dv ry|dk(  r	|t        v ryy)zLcheck if we support parfor translation for
        this Numpy call.
        r9  F©rÂ   ÚonesTúnumpy.random)r9   rü  rª  rš   rƒ  Ú
startswithrW   )r\  rÁ  Ú	call_nameÚmod_names       rh   rp  z&ConvertNumpyPass._is_supported_npycallG  s\   € ô ,¨D×,<Ñ,<×,DÑ,DÀdÓKÑˆ	�8Ü˜8¤SÔ)¨h×.AÑ.AÀ'Ô.JØØÐ)Ñ)ØØ�~Ò%¨)´|Ñ*CØàrl   c                 ó  — t        | j                  j                  |«      \  }}|j                  }t	        |j
                  «      }|dv s|dk(  r| j                  ||||||«      S t        j                  d|› �|j                  ¬«      ‚)Nr‚  r„  zparfor translation failed for r]  )
r9   rü  rª  rw   r¶  r°  Ú_numpy_map_to_parforr   ra  rm  )r\  rx  rÙ  rÁ  r†  r‡  rw   r°  s           rh   rq  z!ConvertNumpyPass._numpy_to_parforU  s„   € Ü+¨D×,<Ñ,<×,DÑ,DÀdÓKÑˆ	�8Ø�y‰yˆÜ�4—8‘8‹nˆØÐ)Ñ)¨X¸Ò-GØ×,Ñ,¨Y¸	À3ÈÈcÐSWÓXÐXä×,Ñ,Ø,¨T¨FÐ3¸¿¹ô
ð 	
rl   c                 óü  — | j                   }|j                  }|j                  }	|j                  |j                     }
|
j
                  }|j                  |«      }|€t        j                  dk\  rt        d«       yt        |j                  |||	«      \  }}t        j                  ||	«      }t        |j                  |j                  |j                  |t!        |«      |||	|j                  |j                     «	      |_        t%        «       }t        j                  ||	«      }t        j&                  |t)        d«      |	«      }||j                  |j                  <   t+        |j                  |||«      \  }}|dk(  rt        j,                   |d«      |	«      }nÚ|dk(  rt        j,                   |d«      |	«      }n¸|t.        v r–t1        ||«       t3        ||j                  «      \  }}|j                  j5                  |«       |j                  |j6                  j                     j9                  t;        j<                  «       ||«      |j                  |<   |}nt?        djA                  |«      «      ‚t        jB                  |||	«      }|j"                  jE                  |«       t        jF                  ||||	«      }tI        tJ        jL                  |j                  |j                     ||«      |j                  |<   |j"                  jE                  |«       tO        ||i |	||d	jA                  |«      d
f|jP                  «      }||i|_)        t        j                  dk\  rt        d«       |jU                  «        |S )z8generate parfor from Numpy calls that are maps.
        Nrƒ   z3Could not convert numpy map to parfor, unknown sizer  rÂ   r   rƒ  z,Map of numpy.{} to parfor is not implementedú{} functionzNumPy mappingzgenerated parfor for numpy map:)+rü  rÍ  rm  r�  rV  r�   r  r   r  rd   r  r	   r  r"   r   rŸ  r  r‰  r!   rc  r    r  rÒ  rW   Ú_remove_size_argÚ_get_call_arg_typesrÊ  rW  rÕ  r   ÚContextÚNotImplementedErrorr$  rË  rb  r  rQ   r   r  rh  rz  ru  r™  )r\  rx  r†  rÙ  rw   r°  rÁ  rü  rÍ  rm  r  r  r  r   r!  rt  r"  r#  r(  rv  r$  rÝ  Únew_arg_typsÚnew_kw_typesÚvalue_assignr+  r‡   s                              rh   r‰  z%ConvertNumpyPass._numpy_map_to_parfor`  s  € ð ×&Ñ&ˆØ—	‘	ˆØ�g‰gˆØ×%Ñ% c§h¡hÑ/ˆØ—‘ˆð ×'Ñ'¨Ó,ˆ	ØÐÜ×%Ñ%¨Ò*ÜÐKÔLØä 0°×1DÑ1DÀiÐQVÐX[Ó \Ñˆ
�Iô —X‘X˜e SÓ)ˆ
Ü"Ø×!Ñ!Ø×Ñ ×!6Ñ!6¸Ü�)Ó˜f e¨SØ×Ñ §¡Ñ)ó	+ˆ
Œô
  “\ˆ
Ü—X‘X˜e SÓ)ˆ
Ü—v‘v˜e¤]°?Ó%CÀSÓIˆØ17ˆ×Ñ˜L×-Ñ-Ñ.ä#2Ø×Ñ ¨
°Jó$@Ñ ˆ	�=ð ˜ÒÜ—H‘H™V A›Y¨Ó,‰EØ˜&Ò Ü—H‘H™V A›Y¨Ó,‰EØœ,Ñ&ä˜Y¨Ô-ä)<Ø�k×)Ñ)ó*+Ñ&ˆL˜,à×!Ñ!×%Ñ% dÔ+Ø*5×*=Ñ*=¸d¿i¹i¿n¹nÑ*M×*[Ñ*[Ü—‘Ó  ,°ó+>ˆK×!Ñ! $Ñ'à‰Eä%Ø>×EÑEÀiÓPóRð Rô —y‘y ¨°cÓ:ˆØ�‰×Ñ˜|Ô,ä—z‘z # y°,ÀÓDˆÜ.7Ü�J‰J˜×+Ñ+¨C¯H©HÑ5°}Àfó/Nˆ×Ñ˜lÑ+à�‰×Ñ˜|Ô,ä˜	 :¨r°3¸	À9Ø&×-Ñ-¨iÓ9¸?ÐKØ#×)Ñ)ó+ˆð '¨
Ð3ˆÔÜ×!Ñ! QÒ&ÜÐ3Ô4Ø�K‰KŒMØˆrl   N)ry   rz   r{   rf  r]  r­  rz  ro  rr  rp  rq  r‰  rk   rl   rh   ri  ri  È  s2   „ ñòò$"òL	ò	ò8òtò	
óBrl   ri  c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚConvertReducePassz:
    Find reduce() calls and convert them to parfors.
    c                 ó    — || _         g | _        y r`   rû  rþ  s     rh   r]  zConvertReducePass.__init__©  rk  rl   c           	      ó@  — | j                   }t        |«      }|D �]  }||   }g }|j                  j                  |«      }|j                  D ]Æ  }d }	t        |t        j                  «      r—|j                  }
|j                  }|j                  }t        t        |j                  |«      }|dk(  s|dk(  r#t        | j                  |||j                  |
«      }	|	r)| j                   j#                  t%        |	|d¬«      «       |	}|j#                  |«       ŒÈ ||_        �Œ y )N)r   r‹   )r   Ú
_functoolsr   )r  r  r  )rü  r0   rZ   r  r‰  rš   r	   rË  rm  rÌ  rÝ  r;   r9   rª  Ú_reduce_to_parforrw   rý  rb  r¶  )r\  rÐ  rü  r
  r×  r�  r  rx  rØ  r‡   rm  rÙ  rÁ  r·  s                 rh   r­  zConvertReducePass.run­  s  € Ø×&Ñ&ˆä$ VÓ,ˆ
Øó 	"ˆEØ˜5‘MˆEØˆHØ#×2Ñ2×@Ñ@ÀÓGˆIØŸ™ò '�Ø�Ü˜e¤R§Y¡YÔ/ØŸ)™)�CØŸ,™,�CØ Ÿ;™;�DÜ$¤]°K×4GÑ4GÈÓN�HØ Ð$:Ò:Ø#Ð'?Ò?ä!& t×'=Ñ'=¸yÈ#Ø'+§y¡y°#ó"7˜áØŸ™×-Ñ-¬dØ &Ø %Ø#+ô/ô ð
 !'˜Ø—‘ Õ&ð''ð( "ˆEŽJð1	"ð2 	rl   c                 ó  ‡— | j                   }|j                  }|d   }|d   }t        |j                  |j                  «      }	d}
d}t        t        |j                  |j                  |	«      }|r|\  }}
}}|d   }|j                  |€|n|
«      }|€yt        |j                  |||«      \  Š}‰}|rt        d«      ‚|}t        j                  ||«      }|j                  j                  t        j                   |||«      «       t#        «       }| j%                  |||‰||«      \  }}|rt        d«      ‚|
�ït'        |j)                  «       «      }t+        |j)                  «       «      }t        j                  ||«      }|||<   t        j,                  |t/        d«      |«      }|j                  |j                  <   t        j0                  j3                  |
||«      }|j                  j5                  t        j                   |||«      t        j6                  ||||«      g«       t9        ||||||dj;                  |«      df|j<                  «      }t>        j@                  dk\  rtC        d	«       |jE                  «        |S )
zy
        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)#rü  rÍ  r?   rª  rV  r;   Ú
_find_maskr�  r  r  ÚAssertionErrorr  r	   r  r‰  rb  rË  r!   Ú_mk_reduction_bodyr“   ré  r§   rc  r    rÞ  r  rÿ  rO  rh  r$  rz  r   r  rd   r™  )r\  rx  rÙ  rw   rm  rü  rÍ  r†  r€   Úarr_defrY  Úmask_indicesÚmask_query_resultÚmask_typr²   r  r!  Ú
mask_indexÚacc_varrt  r"  rv  ru  rW  Úfalse_labelr#  ÚmaskrZ  r‡   r   s                                @rh   r˜  z#ConvertReducePass._reduce_to_parforÌ  sb  ø€ ð
 ×&Ñ&ˆà—	‘	ˆØ˜‘Gˆ	Ø�a‘ˆÜ  ×!4Ñ!4°f·k±kÓBˆàˆØˆô "¤*¨k×.AÑ.AÀ;×CVÑCVÐX_Ó`ÐÙØ7HÑ4ˆF�H˜h¨à˜‘7ˆØ×'Ñ'°,Ð2F©ÈHÓUˆ	ØÐØä 0°×1DÑ1DÀiÐQVÐX[Ó \Ñˆ
�IØˆ
Ùä  Ó/Ð/àˆô —X‘X˜e SÓ)ˆ
Ø�‰×ÑœrŸy™y¨°7¸CÓ@ÔAô  “\ˆ
Ø#×6Ñ6°yØ % s¨J¸Àó IÑˆ	�9áä  Ó/Ð/ð ÐÜ˜YŸ^™^Ó-Ó.ˆJÜ˜iŸn™nÓ.Ó/ˆKÜŸ™ %¨Ó-ˆJØ$.ˆI�jÑ!Ü—6‘6˜%¤¨{Ó!;¸SÓAˆDØ-5ˆK×Ñ §	¡	Ñ*Ü—w‘w—‘ x°¸CÓ@ˆHØ�O‰O×"Ñ"Ü�y‰y˜ 4¨Ó-Ü�y‰y˜˜z¨;¸Ó<ð$ô ô
 ˜	 :¨y¸#¸yØ! M×$8Ñ$8¸Ó$CØ$/ð$1Ø2=×2CÑ2CóEˆô ×!Ñ! QÒ&ÜÐ)Ô*Ø�K‰KŒMØˆrl   c           	      óŽ  — ddl m} | j                  }t        |j                  |«      }	 ||j                  |	«      }
|j
                  |j                     }|j                  }t        j                  ||«      }t        |j
                  |||«      \  }}t        j                  |t        d«      |«      }||j
                  |j                  <   t        j                  j                  |||«      }t        |||«      |j                   |<   |j#                  t        j$                  |||«      «       t'        |
|j                  j(                  j*                  j,                  |j.                  |j0                  ||f|j
                  |j                   «      }|j2                  }t5        «       }t        j                  ||«      }|||<   t7        |j2                  j9                  «       «      }|j2                  |   }|j:                  j=                  |j:                  «       |j:                  |_        t?        |||g«       tA        |||«       ||fS )zZ
        Produce the body blocks for a reduction function indicated by call_name.
        r   )Úcheck_reduce_funcz$val)!rÉ  r¨  rü  r?   rª  r�  rV  r�   r	   r  r  rc  r    rÞ  r  rQ   rŸ  rb  rË  r>   rÁ  rW  r´  r   r¡  rÐ  r!   r“   ré  r‰  rÿ  rA   rB   )r\  r†  rÍ  rm  r   r€   r¤  r¨  rü  Úreduce_funcÚfcoder  Úin_typr#  rv  Úindex_var_typeÚtmp_varr&  Úreduce_f_irru  rV  rX  Úfirst_reduce_labelÚfirst_reduce_blocks                           rh   rž  z$ConvertReducePass._mk_reduction_body	  s÷  € õ
 	Dà×&Ñ&ˆÜ$ [×%8Ñ%8¸)ÓDˆÙ! +×"5Ñ"5°{ÓCˆà×%Ñ% f§k¡kÑ2ˆØ—‘ˆÜ—X‘X˜e SÓ)ˆ
Ü$3Ø×Ñ ¨
°Jó%@Ñ!ˆ	�>ô —&‘&˜¤¨fÓ 5°sÓ;ˆØ,2ˆ×Ñ˜GŸL™LÑ)Ü—w‘w—‘ v¨y¸#Ó>ˆÜ.7Ø�G˜^ó/-ˆ×Ñ˜lÑ+à×Ñœ"Ÿ)™) L°'¸3Ó?Ô@ä)¨%Ø(3×(;Ñ(;×(CÑ(C×(HÑ(H×(TÑ(TØ(3×(=Ñ(=Ø(3×(=Ñ(=Ø)/°Ð(8Ø(3×(;Ñ(;Ø(3×(=Ñ(=ó?ˆð  ×&Ñ&ˆ	Ü“Lˆ	Ü—H‘H˜U CÓ(ˆ	Ø(ˆ	�)ÑÜ  ×!3Ñ!3×!8Ñ!8Ó!:Ó;ÐØ(×/Ñ/Ð0BÑCÐØ�‰×ÑÐ1×6Ñ6Ô7Ø",§/¡/ÐÔÜÐ,¨w¸Ð.@ÔAÜ˜	 7¨IÔ6Ø˜)Ð#Ð#rl   N)ry   rz   r{   rf  r]  r­  r˜  rž  rk   rl   rh   r”  r”  ¥  s   „ ñòòò>AóF)$rl   r”  c                   ó@   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)ÚConvertLoopPassz*Build Parfor nodes from prange loops.
    c                 ó    — || _         g | _        y r`   rû  rþ  s     rh   r]  zConvertLoopPass.__init__>	  rk  rl   c                 ó   ‡@‡A‡B‡C‡D‡E‡F‡G— | j                   ŠGt        |«      \  }}t        |«      }t        |«      }t	        |||j
                  |j                  «      ŠB|j                  «       }|j                  «       D �cg c]  }||   t        ||   j                  «      f‘Œ! }}g }	t        |d„ ¬«      D �	]Ñ  \  ŠC}
t        ‰Cj                  «      dk7  st        ‰Cj                  «      dk7  r÷t        j                  så‰Cj                  D ]Ö  }||   j                  D ]Â  }t!        |t"        j$                  «      sŒt!        |j&                  t"        j(                  «      sŒC|j&                  j*                  dk(  sŒ]| j-                  |j&                  j.                  j0                  |«      sŒŽd}t3        j4                  t7        j8                  ||j:                  «      «       ŒÄ ŒØ �Œ.t=        ‰Cj                  «      d   }||   j                  D �]y  }t!        |t"        j$                  «      sŒt!        |j&                  t"        j(                  «      sŒD|j&                  j*                  dk(  sŒ^| j-                  |j&                  j.                  j0                  |«      sŒ�‰Cj                  D �cg c]  }||v r|‰Cj>                  k7  r|‘Œ }}|j&                  j@                  }| jC                  |j&                  j.                  j0                  |«      \  }}|‰Cj>                     j                  d d }d ŠEtE        |«      D ]x  \  }}t!        |t"        j$                  «      sŒ!t!        |j&                  t"        j(                  «      sŒF|j&                  j*                  dk(  sŒ`|jF                  j0                  ŠE|} n ‰E€J ‚|d  ||dz   d  z   }tI        d|‰Cj>                     i‰GjJ                  «      \  }}|d   }tM        ˆEfd	„|D «       «      ŠF‰FjO                  ‰E«       ||   jP                  }|j:                  }‰GjR                  jU                  ‰Cj>                  «      }t#        jV                  ||«      }| jY                  ||   ||«      |_
        |D �ci c]  }|||   “Œ
 c}ŠDt[        «       }t#        jV                  ||«      ‰D|<   tM        «       }|D ]   }|j]                  |j                  |   «      }Œ" tM        «       }‰Cj                  D ]  }|j]                  ‰B|   «      }Œ |j_                  |«      } | j_                  | D �!ch c]5  }!t!        ‰GjJ                  |!   t`        jb                  jd                  «      s|!’Œ7 c}!«      } |D ]P  }‰D|   j                  d   }"t!        |"t"        jf                  «      sŒ0|"jF                  ‰Cj>                  k(  sŒJ||"_#        ŒR ˆDˆFfd
„Š@d }#d }$ˆ@ˆBˆCˆGfd„}%d}&|dk(  �r¼|ji                  |d   «      sJ ‚tk        |%|d   «      }'|'r|'\  }(}#})}$n|d   }(t!        |(t"        jl                  «      sJ ‚‰GjJ                  |(j0                     }*t!        |*t`        jn                  «      rZt#        jl                  |tq        d«      |«      }+t`        jr                  ‰GjJ                  |+j0                  <   tu        |+d|(d«      g}|+gŠAn0|jw                  |$€|(n|#«      },ty        ‰GjJ                  |,||«      \  ŠA}t        |«      dkD  sJ ‚‰A}-|$rt{        ˆAfd„|$D «       «      ŠA‰Dt}        ‰Dj                  «       «         }.t#        jV                  ||«      }/t        ‰GjJ                  |‰A|/d¬«      \  }+}0|/j                  |.j                  z   }1|1|._
        |$r|-d   }2n|+}2|#��ƒt�        d«      ‚d}9d}:|d   };t        |«      dk(  r
|d   }9|d   };t        |«      dk(  r–|d   }9|d   };	 ‰GjŒ                  j�                  |d   «      }:t!        |:t"        j”                  «      s!t7        j’                  d|j:                  ¬«      ‚|:j&                  }:|:dk7  r!t7        j’                  d|j:                  ¬«      ‚t#        jl                  |tq        d«      |«      }+t!        |9t–        «      r|9dk\  rt`        jr                  }0nt`        j˜                  }0d}&tu        |+|9|;|:«      g}|0‰GjJ                  |+j0                  <   t}        ‰Dj                  «       «      }<|‰D|<   j                  z   ‰D|<   _
        ‰FD �=ci c]  }=|=|+“Œ }>}=t›        ‰D|>«       |&r| j�                  ‰D‰F|+«       tŸ        ||‰D||$r2n|+|d||f‰Gj                   | ¬«	      }?|?g|‰Cj>                     _
        |‰Cj>                     j                  j‰                  |«       |‰Cj>                     j                  j£                  t#        jf                  t=        ‰Cj                  «      d   |«      «       | j¤                  j£                  t§        ‰C|?d¬«      «       |D ]#  }|‰Cj>                  k7  sŒ|j©                  |«       Œ% t        jª                  dk\  s�Œ_t­        d«       |?j¯                  «        �Œ| �	ŒÔ y c c}w c c}w c c}w c c}!w # t�        $ r" t7        j’                  d|j:                  ¬«      ‚w xY wc c}=w )Nc                 ó   — | d   S r  rk   )Útups    rh   r4  z%ConvertLoopPass.run.<locals>.<lambda>M	  s
   € ¸3¸q¹6€ rl   r  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   r  Ú
pair_firstc              3   ó4   •K  — | ]  \  }}|‰k(  sŒ|–— Œ y ­wr`   rk   )r  Útrí  Ú
loop_indexs      €rh   r  z&ConvertLoopPass.run.<locals>.<genexpr>Ž	  s   øè ø€ Ò)O±°°1¸qÀJ»¬!Ñ)Oùs   ƒ‘c                  ób  •— t        j                   ‰«      } ‰j                  «       D ]‰  }|j                  t        j                  «      D ]e  }t        |j                  t        j                  «      sŒ(|j                  j                  | v sŒA| j                  |j                  j                  «       Œg Œ‹ g }g }‰j                  «       D ]ã  }|j                  D ]Ò  }t        d„ |j                  «       D «       «      }|| z  sŒ)|j                  | «      rŒ;t        t        |t        j                  «      «       |j                  }t        t        |t        j                   «      xr |j"                  dv «       |j%                  |j                  j                  «       |j%                  |«       ŒÔ Œå ||fS )z˜find expressions that involve getitem using the
                        index variable. Return both the arrays and expressions.
                        c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr`   ©rV  ©r  re   s     rh   r  zCConvertLoopPass.run.<locals>.find_indexed_arrays.<locals>.<genexpr>Â	  s   è ø€ Ò(J°A¨¯­Ñ(Jùó   ‚©r  Ústatic_getitem)rå  rç  Ú
find_instsr	   rË  rš   rÝ  rc  rV  rè  rÌ  r‰  rn  re  Úissubsetr<   rÞ  rl  rb  )	Úindicesr�  râ  ÚarrsÚexprsÚlvrÁ  ru  Úloop_index_varss	          €€rh   Úfind_indexed_arraysz0ConvertLoopPass.run.<locals>.find_indexed_arrays´	  sZ  ø€ ô #'§)¡)¨OÓ"<˜Ø%.×%5Ñ%5Ó%7ò B˜EØ(-×(8Ñ(8¼¿¹Ó(Cò B Ü$.¨t¯z©z¼2¿6¹6Õ$BØ$(§J¡J§O¡O°wÒ$>Ø$+§K¡K°·±×0@Ñ0@Õ$AñBðBð
  "˜Ø "˜Ø%.×%5Ñ%5Ó%7ò 7˜EØ(-¯
©
ò 
7 Ü%(Ñ(J¸¿¹Ó9IÔ(JÓ%J Ø#%¨£<Ø')§{¡{°7Ô';Ø(0Ü$+¬J°t¼R¿Y¹YÓ,GÔ$HØ+/¯:©: DÜ$+¬J°t¼R¿W¹WÓ,Eò -PØ'+§w¡wÐ2OÐ'Oô%Qà$(§K¡K°·
±
·±Ô$@Ø$)§L¡L°Õ$6ñ
7ð7ð  $ U˜{Ð*rl   c                 ó\  •— t        ‰j                  | «      }t        |xr< t        |t        j
                  «      xr  |j                  dk(  xr |j                  dk(  «       |j                  }t        j                  ‰j                  D �cg c]  }‰|   ‘Œ	 c}Ž } ‰
«       \  }}t        |j                  gt        |«      k(  «       t        |j                  |v«       t        ‰j                  |j                  «      }t        ‰j                  ‰j                  |«      }t!        d«      ‚c c}w )zƒFind 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Þ  rl  rf  rÝ  rn  rê  ÚexitsrV  r¹  rœ  r�  r�  )rT  Úsize_defÚarr_varrf   Ú	live_varsÚ
index_arrsÚindex_exprsrŸ  rL  rÁ  rÉ  Úlive_mapr‹  rü  s             €€€€rh   Úfind_mask_from_sizez0ConvertLoopPass.run.<locals>.find_mask_from_sizeÐ	  sý   ø€ ô $2°+×2EÑ2EÀxÓ#P˜Ü ò !V¬Z¸Ä"Ç'Á'Ó-Jò !VØ (§¡¨yÑ 8ò!VØ=E¿]¹]ÈgÑ=UôWà"*§.¡.˜Ü$'§I¡IÀTÇZÁZÖ/PÀ°¸³Ò/PÐ$Q˜	Ù2EÓ2GÑ/˜
 KÜ §¡ ´$°zÓ2BÑ BÔCä §¡°IÐ =Ô>ä"0°×1DÑ1DÀhÇnÁnÓ"U˜Ü!+¨K×,?Ñ,?À×ATÑATÐV]Ó!^˜ô -¨]Ó;Ð;ùò 0Qs   Â
D)Tr   rH  c              3   ó0   •K  — | ]  }|r|n‰d    –— Œ y­w)r   Nrk   )r  re   r   s     €rh   r  z&ConvertLoopPass.run.<locals>.<genexpr>

  s&   øè ø€ ò /FØ34ñ 56©q¸:Àa¹=Ó/Hñ /Fùs   ƒ)rb  rš  rË   r   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   )rj  r‹  )Úold_loopr  r  zparfor from loop)Xrü  r3   rN   rK   rL   ÚusemapÚdefmapÚloopsré  r‰   r‰  rš  ÚentriesrË  r   ÚDISABLE_PERFORMANCE_WARNINGSrš   r	   rË  rÝ  rÞ  rl  Ú_is_parallel_looprW  rV  ÚwarningsÚwarnr   ÚNumbaPerformanceWarningrm  r¹  Úheaderrw   Ú_get_loop_kindr1  rÌ  r-   r�  rn  rè  rÍ  rZ   r  r  Ú_get_prange_init_blockr!   rê  Úintersectionr   rÎ  rÏ  rP  Ú	has_shaper;   rc  ÚIntegerr    rN  rY  r  r  r  r“   r  r�  r8   r§   r  rÿ  rO  rª  r?   rm  ra  rÒ  r  Úintpr'   Ú_replace_loop_access_indicesrh  rz  rb  rý  r¶  rÊ  r  rd   r™  )Hr\  rÐ  rÀ  r¿  ÚcfgÚusedefsr×  rù  Úsized_loopsÚmoved_blocksr¾   Úentryrâ  r¤  rf   Úbody_labelsrw   Ú	loop_kindÚloop_replacingÚheader_bodyÚhbirŠ  Úli_indexÚcpsrÍ  rm  rx  rt  rV  ÚbodydefsÚblÚ
exit_livesrj  re   Ú	last_instrY  r   rÒ  Úunsigned_indexrL  r€   r¢  Ú
in_arr_typrv  r  Ú
orig_indexÚfirst_body_blockr#  r$  r‰  Úorig_index_varr"  ÚlabelsrW  r¥  r¦  rZ  r  r  rT  Úfirst_body_labelrí  Úindex_var_mapr‡   rÉ  r   rÑ  r‹  ru  rº  rÈ  rü  sH                                                                   @@@@@@@@rh   r­  zConvertLoopPass.runB	  sè	  ÿ€ Ø×&Ñ&ˆä& vÓ.‰ˆ
�AÜ% fÓ-ˆÜ" 6Ó*ˆÜ# C¨°·±ÀÇÁÓPˆØ—	‘	“ˆØ?D¿z¹z»|ÖL¸!˜˜a™¤# e¨A¡h§m¡mÓ"4Ò5ÐLˆÐLØˆä˜kÑ/AÔBó n	&‰GˆD�!Ü�4—<‘<Ó  AÒ%¬¨T¯Z©Z«¸AÒ)=Ü×:Ò:Ø!%§¡ò 8˜Ø$*¨5¡M×$6Ñ$6ò 8˜Dô !+¨4´·±Õ ;Ü$.¨t¯z©z¼2¿7¹7Õ$CØ$(§J¡J§M¡M°VÓ$;Ø$(×$:Ñ$:Ø$(§J¡J§O¡O×$8Ñ$8¸*õ%Fð'4 ô
 !)§¡Ü$*×$BÑ$BØ(+¨T¯X©Xó%7õ!8ñ8ð8ñ$ ä˜Ÿ™Ó& qÑ)ˆEØ˜u™×*Ñ*ó V&�ä˜t¤R§Y¡YÕ/Ü& t§z¡z´2·7±7Õ;Ø ŸJ™JŸM™M¨VÓ3Ø ×2Ñ2°4·:±:·?±?×3GÑ3GÈÕTð 04¯y©yö #G¨!Ø$%¨¡K°A¸¿¹Ò4Dò %&ð #G�Kð #GàŸ:™:Ÿ?™?�DØ04×0CÑ0CÀDÇJÁJÇOÁO×DXÑDXØDNó1PÑ-�I˜~ð #)¨¯©Ñ"5×":Ñ":¸3¸BÐ"?�Kà!%�JÜ%.¨{Ó%;ò "™	˜˜TÜ& t¬R¯Y©YÕ7Ü$.¨t¯z©z¼2¿7¹7Õ$CØ$(§J¡J§M¡M°\Ó$AØ)-¯©×)9Ñ)9˜JØ'*˜HÙ!ð"ð &Ð1Ð2Ð1ð #.¨i¨xÐ"8¸;ÀxÐPQÁzÀ{Ð;SÑ"S�Kô .¨q°&¸¿¹Ñ2EÐ.FØ.9×.AÑ.AóC‘F�C˜à˜a™&�CÜ&)Ó)O¸Ô)OÓ&O�OØ#×'Ñ'¨
Ô3à" 5™M×/Ñ/�EØŸ(™(�CØ +× :Ñ :× HÑ HÈÏÉÓ U�IÜ!#§¡¨%°Ó!5�JØ&*×&AÑ&AÀ&ÈÁ-Ø<FÈó'N�J”Oà7BÖ C°!  F¨1¡I¡Ò C�Iä *£�IÜ+-¯8©8°E¸3Ó+?�I˜iÑ(ô  #›u�HØ)ò F˜Ø#+§>¡>°'·.±.ÀÑ2DÓ#E™ðFä!$£�JØ"Ÿj™jò D˜Ø%/×%5Ñ%5°h¸r±lÓ%C™
ðDà$×1Ñ1°*Ó=�Eð "×.Ñ.¸5ö 0\°aÜ%/°×0CÑ0CÀAÑ0FÌÏ
É
×HYÑHYÔ%Zò 12ò 0\ó ]�Eð )ò 9˜Ø$-¨a¡L×$5Ñ$5°bÑ$9˜	Ü& y´"·'±'Õ:Ø%×,Ñ,°·±Ó;Ø/8˜IÕ,ð	9õ+ð4  $�HØ#'�L÷&ð6 &*�Nð ! JÓ.Ø(×2Ñ2°4¸±7Ô;Ð<Ð;ô "'Ð':¸DÀ¹GÓ!D˜Ù!ØGMÑD˜F H¨h¹à%)¨!¡W˜FÜ)¨&´"·&±&Ô9Ð:Ð9Ø%0×%8Ñ%8¸¿¹Ñ%E˜
Ü% j´%·-±-Ô@Ü(*¯©¨u´mÀNÓ6SÐUXÓ(Y˜IÜBGÇ+Á+˜K×/Ñ/°	·±Ñ?Ü%-¨i¸¸FÀAÓ%FÐ$G˜EØ*3¨™Jà(1×(;Ñ(;Ø-9Ð-Añ =CØGOó)Q˜Iä0@Ø +× 3Ñ 3°YÀÀsó1Ñ-˜J¨ô  # 5›z¨Aš~Ð.˜~Ø%/˜
Ù'ô */ó /FØ8Dô/Fó *F˜Jà+4´S¸¿¹Ó9IÓ5JÑ+KÐ(Ü%'§X¡X¨e°SÓ%9˜
Ü3BØ'×/Ñ/°¸
ÀJØ(,ô4Ñ0˜	 =ð  *Ÿ™Ð1A×1FÑ1FÑF˜Ø04Ð(Ô-Ù'Ø-7¸©]™Nà-6˜Nð $Ñ/ä"0°Ó"?Ð?ð$ !"˜Ø ˜Ø#'¨¡7˜Ü˜t›9¨š>Ø$(¨¡G˜EØ'+¨A¡w˜HÜ˜t›9¨š>Ø$(¨¡G˜EØ'+¨A¡w˜Hð"Ø'2×':Ñ':×'IÑ'IÈ$ÈqÉ'Ó'R ô $.¨d´B·H±HÔ#=Ü&,×&DÑ&DØ$UØ(,¯©ô'"ð !"ð $(§:¡:˜DØ# qšyÜ&,×&DÑ&DØ$ZØ(,¯©ô'"ð !"ô %'§F¡F¨5´-ÀÓ2OÐQTÓ$U˜	ô & e¬SÔ1°e¸q²jÜ,1¯K©K™Mä,1¯J©J˜MØ-2˜NÜ!)¨)°U¸HÀdÓ!KÐ L˜Ø>K˜×+Ñ+¨I¯N©NÑ;ô ,/¨y¯~©~Ó/?Ó+@Ð(Ø;FÈÐScÑId×IiÑIiÑ;i˜	Ð"2Ñ3Ô8à;JÖ$K°a Q¨	¡\Ð$K�MÐ$KÜ  ¨MÔ:Ù%ð ×9Ñ9Ø% ¸	ôCä# E¨:°yÀ#Ù6B¡NÈ	Ø$-Ø%-¨y¸.Ð$IØ$/×$5Ñ$5¸Uô	D�Fð 17¨x�F˜4Ÿ;™;Ñ'Ô,ð
 ˜4Ÿ;™;Ñ'×,Ñ,×3Ñ3°KÔ@Ø˜4Ÿ;™;Ñ'×,Ñ,×3Ñ3´B·G±G¼DÀÇÁÓ<LÈQÑ<OÐQTÓ4UÔVØ—N‘N×)Ñ)¬$Ø!%Ø"Ø%ô+ô ð )ò *˜Ø §¡Ó+Ø"ŸJ™J q�Mð*ô ×-Ñ-°Ô2ÜÐ0Ô1ØŸ™žòmV&ñ1n	&ùò MùòL#GùòN !Dùò&0\øô` $,ò "Ü&,×&DÑ&DØ$RØ(,¯©ô'"ð !"ð"üòD %Ls*   Á=$j	Ê%jÒ	jÔ::jß jä"
kê+kc                 óÂ   — ||vry||   }t        |«      dkD  xrF |d   dk(  xs< |d   t        k(  xs. |d   dk(  xs$ |d   t        k(  xs |d   dk(  xs |d   t        k(  S )NFr   r   rs   r   )r‰   r   rs   r   ©r\  Úfunc_varrÀ  rÜ  s       rh   rÚ  z!ConvertLoopPass._is_parallel_loop}
  s“   € à˜:Ñ%ØØ˜(Ñ#ˆÜ�4‹y˜1‰}ò A $ q¡'¨XÑ"5ò #@¸¸a¹ÄFÑ9Jò #@Ø˜‘7Ð/Ñ/ò#@Ø37¸±7¼oÑ3Mò#@à˜‘7˜jÑ(ò#@à,0°©G´xÑ,?ð	Arl   c                 ó"  — | j                   }||v sJ ‚||   }t        |«      dkD  sJ ‚d}|d   dk(  s|d   t        k(  r)	 d|j                  |   d   |j                  |   d   ff}|S |d   dk(  s|d   t
        k(  rd}|S # t        $ r d}Y |S w xY w)	z(see if prange is user prange or internalr   )r  r-  rs   r  r  )r  )r-  r-  r   )r   r-  )rü  r‰   rs   rò  rm  r   )r\  r   rÀ  rü  rÜ  Úkinds         rh   rß  zConvertLoopPass._get_loop_kind†
  sÑ   € à×&Ñ&ˆà˜:Ñ%Ð%Ð%Ø˜(Ñ#ˆÜ�4‹y˜1Š}Ðˆ}ØˆØ�‰7Ð'Ò'¨4°©7´oÒ+Eð,Ø! K×$;Ñ$;¸HÑ$EÀaÑ$HÈ+×JaÑJaÐbjÑJkÐlnÑJoÐ#pÐp�ð ˆð �!‰W˜
Ò" d¨1¡g´Ò&9Ø!ˆDØˆøô ò ,ð ,‘ð ˆð,ús   ¿&A? Á?BÂBc                 óp  — d}d}g }t        |j                  «      D �]  \  }}t        |t        j                  «      rot        |j
                  t        j                  «      rK|j
                  j                  dk(  r2| j                  |j
                  j                  j                  |«      r|}t        |t        j                  «      sŒ«t        |j
                  t        j                  «      sŒÐ|j
                  j                  dk(  sŒê| j                  |j
                  j                  j                  |«      s�Œ|}�Œ  |dk7  rê|dk7  rå|D �	ch c]  }	|	j                  ’Œ }
}	g }t        t        |dz   |«      «      D ]e  }|j                  |   }|j                  «       D �	ch c]  }	|	j                  ’Œ }}	|
|z  r|
|z  }
|j                  |«       ŒU|j                  |«       Œg |j!                  «        |j!                  «        |j                  d| |z   |j                  |dz   d z   |_        |S c c}	w c c}	w )z–
        If there is init_prange, find the code between init_prange and prange
        calls. Remove the code from entry_block and return it.
        r  rÜ  rƒ   N)r1  r‰  rš   r	   rË  rÝ  rÞ  rl  Ú_is_prange_initrW  rV  rÚ  r  ru   re  rb  Úreverse)r\  Úentry_blockrÀ  Úprange_argsÚinit_call_indÚprange_call_indÚ	init_bodyr�   râ  rí  Úarg_related_varsÚsaved_nodesÚ	inst_varss                rh   rà  z&ConvertLoopPass._get_prange_init_blockš
  sæ  € ð
 ˆØˆØˆ	Ü  ×!1Ñ!1Ó2ó 		$‰GˆAˆtä˜4¤§¡Ô+´
¸4¿:¹:ÄrÇwÁwÔ0OØŸ
™
Ÿ™¨Ò/Ø×,Ñ,¨T¯Z©Z¯_©_×-AÑ-AÀ:ÔNØ !�Ü˜4¤§¡Õ+´
¸4¿:¹:ÄrÇwÁwÕ0OØŸ
™
Ÿ™¨Ó/Ø×.Ñ.¨t¯z©z¯©×/CÑ/CÀZÖPØ"#’ð		$ð ˜BÒ ?°bÒ#8ð 1<Ö<¨1 §£Ð<ÐÐ<ØˆKÜœe M°!¡O°_ÓEÓFò +�Ø"×'Ñ'¨Ñ*�Ø-1¯^©^Ó-=Ö>¨˜QŸV›VÐ>�	Ð>Ø# iÒ/Ø$¨	Ñ1Ð$Ø×&Ñ& tÕ,à×$Ñ$ TÕ*ð+ð ×ÑÔØ×ÑÔ!Ø +× 0Ñ 0°°-Ð @Ø%ñ!&Ø(3×(8Ñ(8¸ÈÑ9JÐ9KÐ(Lñ!MˆKÔð Ðùò!  =ùò ?s   ÅH.ÆH3c                 ób   — ||vry||   }t        |«      dkD  xr |d   dk(  xs |d   t        k(  S )NFr   rm   )r‰   rm   rÿ  s       rh   r  zConvertLoopPass._is_prange_initÁ
  sA   € Ø˜:Ñ%ØØ˜(Ñ#ˆÜ�4‹y˜1‰}ÒU $ q¡'¨]Ñ":Ò"T¸dÀ1¹gÌÑ>TÐUrl   c                 ó  ‡— |j                  |j                  «       t        |«      5  t        |«      }ddd«       d   }t	        «       }|D �]*  }||   }|j
                  D �]  }	t        |	t        j                  «      �rBt        |	j                  t        j                  «      �r||k(  r{|	j                  j                  |v rc|	j                  j                  |vrK|j                  |	j                  j                  «       |j                  |	j                  j                  «       n�|j                  Šˆfd„}
 |
|	j                  j                  «      t        |
|«      v rd |
|	j                  j                  «       |
|	j                  j                  «      k7  r+t        j                  d|	j                  j                   ¬«      ‚t#        |	«      rxt%        |	«      }|€�Œ{t'        t(        | j*                  j,                  |d¬«      }|j                  |v s|�|j                  |v rt/        |	|«       t'        | j0                  |||«       t        |	t2        «      s�Œö| j5                  |	j6                  ||«       �Œ �Œ- ||z  }y# 1 sw Y   �ŒOxY w)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                 óv   •— ddl m} 	 ‰j                  | «      j                  S # |j                  $ r | cY S w xY w)Nr   )r   )Ú
numba.corer   Ú	get_exactÚunversioned_nameÚNotDefinedError)rV  r   rÍ  s     €rh   Úunverz;ConvertLoopPass._replace_loop_access_indices.<locals>.unverç
  s:   ø€ Ý9ð,Ø',§¡°tÓ'<×'MÑ'MÐ MøØ#)×#9Ñ#9ò ,Ø'+¢ð,ús   ‰$ ¤8·8z Overwrite of parallel loop indexr]  T)Úlhs_only)rè  rV  Údummy_return_in_loop_bodyr0   rn  r‰  rš   r	   rË  rÝ  rc  rÌ  rÍ  Úmapr   ra  rm  rE   rF   r;   r?   rü  rª  rG   Ú_replace_multi_dim_indrh  rå  ru  )r\  ru  Ú	index_setÚ	new_indexrû  Úfirst_labelÚadded_indicesrf   r�  rŠ  r  r¯   Úind_defrÍ  s                @rh   rå  z,ConvertLoopPass._replace_loop_access_indicesÇ
  s8  ø€ ð 	�‰�i—n‘nÔ%ä& yÓ1ñ 	0Ü$ YÓ/ˆF÷	0ð ˜Q‘iˆÜ›ˆð
 ó /	\ˆAØ˜a‘LˆEØŸ
™
ó -\�Ü˜t¤R§Y¡YÕ/Ü& t§z¡z´2·6±6Õ:ð ˜[Ò(¨T¯Z©Z¯_©_À	Ñ-IØ $§¡× 0Ñ 0¸	Ñ AØ!Ÿ™ d§k¡k×&6Ñ&6Ô7Ø%×)Ñ)¨$¯+©+×*:Ñ*:Õ;ð !&§¡˜ô,ñ ! §¡×!1Ñ!1Ó2´c¸%ÀÓ6KÑKÑPUÐVZ×VaÑVa×VfÑVfÓPgÑkpÐqu×q{Ñq{÷  rAñ  rAó  lBò  QBÜ"(×"@Ñ"@Ø BØ$(§K¡K§O¡Oô#ð ô " $Ô'Ü4°TÓ:�Eà�}Ù Ü#¤N°D×4DÑ4D×4LÑ4LØ$)°Dô:�GàŸ
™
 iÑ/Ø 'Ð 3Ø$+§L¡L°IÑ$=Ü4°T¸9ÔEô ˜$×5Ñ5°wÀ	ØENôPô ˜d¤FÖ+Ø×5Ñ5°d·n±nÀiÐQZÖ[ò[-\ð/	\ðd 	�]Ñ"ˆ	Ø÷y	0ñ 	0ús   ¨JÊJc                 óÆ  — | j                   }t        |du«       t        t        |j                  |j                     t
        j                  t
        j                  f«      «       t        |j                  |«      }t        t        |t        j                  «      xr |j                  dk(  «       |j                  D �cg c]  }|j                  |v r|n|‘Œ c}|_        yc c}w )zq
        replace individual indices in multi-dimensional access variable, which
        is a build_tuple
        Nr`  )rü  r<   rš   r�  rV  r   ÚTupler_  r?   rª  r	   rÞ  rl  rˆ  )r\  Úind_varr  r  rü  Úind_def_noderí  s          rh   r  z&ConvertLoopPass._replace_multi_dim_ind  s¼   € ð
 ×&Ñ&ˆÜ�˜tÐ#Ô$ä”
˜;×.Ñ.¨w¯|©|Ñ<Ü—‘œeŸn™nÐ-ó/ô 	0ä% k×&9Ñ&9¸7ÓCˆÜ”
˜<¬¯©Ó1ò 5Ø —O‘O }Ñ4ô	6ð (4×'9Ñ'9ö;Ø"#ð ,-¯6©6°YÑ+>™iÀAÑEò ;ˆÕùò ;s   Â<CN)ry   rz   r{   rf  r]  r­  rÚ  rß  rà  r  rå  r  rk   rl   rh   r²  r²  ;	  s6   „ ñòòy&òv	Aòò(%òNVòDóL;rl   r²  c                 ó&  — t        t        |t        j                  «      xr |j                  dk(  «       |j
                  }|j                  }| |j                     }| |j                     }|j                  }t        t        |t        j                  j                  «      «       t        |t        j                  j                  «      rCt        |j                  t        j                  «      r||j                  k(  r|||j                  dfS t        |t        j                  «      �rgt        ||«      \  }}	t        |	dk(  xr t!        |«      |k(  «       d}
g }d}|D �]  }| |j                     }t        |t        j                  j                  «      rDt        |j                  t        j                  «      r |}|j                  }|j#                  d«       Œ{t        |t        j                  j                  «      rDt        |j                  t        j$                  «      r |}|j                  }|j#                  d«       Œãt        |t        j$                  «      sŒþ|
dz  }
|j#                  |«       �Œ t        |xr |
|dz
  k(  «       |||fS t&        ‚)zä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Þ  rl  rÝ  r¯   rV  r™   r   rÌ   rÍ   r�   r@  r   r:   r‰   rb  rã  r=   )r�  rª  rŸ  rÝ  r¯   r  rD  r™   Úseqrl  Úcount_constsr   rY  Úindr¢  s                  rh   rœ  rœ    sø  € ô ŒJ�w¤§¡Ó(ÒD¨W¯Z©Z¸9Ñ-DÔEØ�M‰M€EØ�M‰M€EØ˜Ÿ
™
Ñ#€IØ˜Ÿ
™
Ñ#€IØ�>‰>€DÜŒJ�y¤%§.¡.×"6Ñ"6Ó7Ô8Ü�9œeŸn™n×2Ñ2Ô3Ü�9—?‘?¤E§M¡MÔ2Ø�	—‘ÒØ�e˜YŸ_™_¨dÐ2Ð2Ü	�IœuŸ™Õ	/ô & g¨uÓ5‰ˆˆRÜ��mÑ#Ò8¬¨C«°DÑ(8Ô9ØˆØˆØˆØó 	)ˆCØ §¡Ñ)ˆIä˜9¤e§n¡n×&:Ñ&:Ô;Ü˜9Ÿ?™?¬E¯M©MÔ:Ø�Ø$Ÿ?™?�Ø×#Ñ# DÕ)ä˜Y¬¯©×(<Ñ(<Ô=Ü˜9Ÿ?™?¬E¯M©MÔ:Ø�Ø$Ÿ?™?�Ø×#Ñ# DÕ)ä˜I¤u§}¡}Õ5Ø Ñ!�Ø×#Ñ# CÖ(ð#	)ô& 	�Ò5˜\¨T°A©XÑ5Ô6Ø�h ¨,Ð6Ð6Ü
Ðrl   c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)Ú
ParforPasszÍParforPass 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                 óî   — | j                   j                  | j                  j                  «       t        j
                  j                  t	        j                  | j                  j                  «      «       y r`   )rZ   r­  rª  rÐ  r   rô  r"  Úfind_max_labelr_  s    rh   Ú_pre_runzParforPass._pre_runW  sL   € à×Ñ×Ñ §¡× 3Ñ 3Ô4ä×Ñ×&Ñ&Ü×#Ñ# D§L¡L×$7Ñ$7Ó8õ	:rl   c           	      óf  — | j                  «        | j                  j                  rgt        | j                  | j
                  | j                  | j                  | j                  | j                  | j                  «      }|j                  «        | j                  j                  r.t        | «      j                  | j                  j                  «       | j                  j                  r.t!        | «      j                  | j                  j                  «       | j                  j"                  r.t%        | «      j                  | j                  j                  «       | j                  j&                  r.t)        | «      j                  | j                  j                  «       | j                  j*                  r.t-        | «      j                  | j                  j                  «       | j.                  j1                  | j                  | j                  j2                  «       t5        | j                  d«       y)zgrun 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¡  rz  r­  rI  r7  rÐ  r9  ri  r›  r”  r   r²  r  r÷  rñ  rÈ  Úfusionr/   )r\  Ústencil_passs     rh   r­  zParforPass.run^  sh  € ð 	�‰Œà�<‰<×ÒÜ& t§|¡|°T·\±\Ø'+§~¡~°t×7JÑ7JØ'+§~¡~°t·~±~Ø'+§z¡zó3ˆLð ×ÑÔØ�<‰<×ÒÜ˜tÓ$×(Ñ(¨¯©×)<Ñ)<Ô=Ø�<‰<×ÒÜ˜TÓ"×&Ñ& t§|¡|×':Ñ':Ô;Ø�<‰<×!Ò!Ü˜dÓ#×'Ñ'¨¯©×(;Ñ(;Ô<Ø�<‰<×ÒÜ˜DÓ!×%Ñ% d§l¡l×&9Ñ&9Ô:Ø�<‰<×%Ò%Ü Ó%×)Ñ)¨$¯,©,×*=Ñ*=Ô>ð 	×Ñ×Ñ˜tŸ|™|¨T¯\©\×-@Ñ-@ÔAä�t—|‘|Ð%8Õ9rl   c                 óD   — t        | j                  | j                  |«      S )zô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œ  r�  rª  )r\  rŸ  s     rh   rœ  zParforPass._find_masky  s   € ô ˜$Ÿ,™,¨¯©°gÓ>Ð>rl   c                 ó2   — t        | j                  |||«      S )zV
        Create loop index variables and build LoopNest objects for a parfor.
        )r  r�  )r\  r  rÍ  rm  s       rh   r  zParforPass._mk_parfor_loops�  s   € ô   §¡¨i¸ÀÓDÐDrl   N)ry   rz   r{   rf  r+  r­  rœ  r  rk   rl   rh   r(  r(  O  s   „ ñò:ò:ò6?óErl   r(  c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚParforFusionPassz=ParforFusionPass class is responsible for fusing parfors
    c                 óf  — t        | j                  j                  «      }t        | j                  | j                  | j
                  | j                  d   «       t        | j                  | j                  | j
                  | j                  d   «       | j                  j                  �r‰|dk\  �r‚t        | j                  j                  «      | j                  _
        t        «       | j                  _        | j                  j                  | j                  j                  «       t        | j                  j                  | j                  j                  | j                   «      \  }}|D ];  }t#        | j                  ||j$                  | j
                  «      \  |_        |_        Œ= t+        | j                  | j                  j                  | j                  d¬«       t-        | j                  d«       | j/                  | j                  | j                  j                  | j                  | j                  «       t-        | j                  d«       t+        | j                  | j                  j                  | j                  «       t-        | j                  d«       | j/                  | j                  | j                  j                  | j                  | j                  «       t-        | j                  d«       t        | j                  | j                  | j
                  | j                  d   «       y	y	y	)
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_reductionsrw  r{  r|  Úmaximize_fusionr/   Úfuse_parfors)r\  r�  r¿  r†   r¥  s        rh   r­  zParforFusionPass.run�  s>  € ô
 -¨T¯\©\×-@Ñ-@ÓAˆ	ä�—‘˜tŸ|™|¨T¯^©^¸T¿]¹]È9Ñ=UÔVô 	�—‘˜tŸ|™|¨T¯^©^¸T¿]¹]È9Ñ=UÔVà�<‰<×Ó 9°£>Ü(9¸$¿,¹,×:MÑ:MÓ(NˆD�L‰LÔ%Ü-1«VˆD×ÑÔ*Ø×Ñ×#Ñ# D§L¡L×$7Ñ$7Ô8ô +¨4¯<©<×+>Ñ+>Ø+/¯<©<×+>Ñ+>Ø+/×+BÑ+BóD‰JˆAˆwð ò M�Ü'<¸T¿\¹\Ø=>Ø=>¿X¹XØ=A¿^¹^ó(MÑ$�”	˜1�9ðMô ˜DŸL™L¨$¯,©,×*=Ñ*=¸t¿|¹|ØINõPä˜4Ÿ<™<Ð)EÔFØ×Ñ˜d×1Ñ1Ø"Ÿl™l×1Ñ1Ø"Ÿl™lØ"Ÿl™lô,ô ˜4Ÿ<™<Ð);Ô<ä˜DŸL™L¨$¯,©,×*=Ñ*=¸t¿|¹|ÔLÜ˜4Ÿ<™<Ð)CÔDà×Ñ˜d×1Ñ1Ø"Ÿl™l×1Ñ1Ø"Ÿl™lØ"Ÿl™lô,ô ˜4Ÿ<™<¨Ô8ä�T—\‘\ 4§<¡<°·±ÀÇÁÈyÑAYÕZðM $2Ðrl   c           	      óÐ  — |j                  «       D �]Ò  \  }} |j                  |«      }d}|sŒd}g }	d}
|
t        |j                  «      dz
  k  �rj|j                  |
   }|j                  |
dz      }t	        |t
        «      rât	        |t
        «      rÒ |j                  |«      }||_        ||_        t        |||| j                  d   ||«      \  }}| j                  j                  j                  |«       |�kd}| j                  j                  |j                     j                  |j                  g«       |	j                  |«       | j                  ||||«       |
dz  }
�Œ/|	j                  |«       t	        |t
        «      r| j                  ||||«       |
dz  }
|
t        |j                  «      dz
  k  r�Œj|	j                  |j                  d   «       |	|_        |r�Œµ�ŒÕ y )NTFr   rƒ   r†   rË   r  )rˆ  r  r‰   r‰  rš   rh  rx  Útry_fuserõ  rñ  r¼  rb  rº  rr  rÿ  Úfuse_recursive_parfor)r\  rZ   rÐ  rª  r�  r×  r�  rx  Úfusion_happenedr  r�   rŠ  Ú	next_stmtÚ
fused_nodeÚfuse_reports                  rh   r;  zParforFusionPass.fuse_parforsÂ  sÄ  € Ø"ŸL™L›Nó  	&‰LˆE�5Ø4˜×4Ñ4°UÓ;ˆIØ"ˆOÚ!Ø"'�Ø�Ø�Øœ#˜eŸj™j›/¨AÑ-Ó-Ø Ÿ:™: a™=�DØ %§
¡
¨1¨q©5Ñ 1�IÜ! $¬Ô/´J¸yÌ&Ô4Qð %A N×$@Ñ$@ÀÓ$G˜	Ø)2˜œØ.7˜	Ô+Ü2:¸9ÀdÈIØ ŸM™M¨)Ñ4°g¸wó3HÑ/˜
 Kð ×(Ñ(×7Ñ7×>Ñ>¸{ÔKØ%Ð1Ø.2˜OØ ×,Ñ,×8Ñ8¸¿¹ÑA×HÑHÈ)Ï,É,ÈÔXØ$ŸO™O¨JÔ7Ø ×6Ñ6°zÀ9ÈgÐW^Ô_Ø ™F˜AÙ$Ø—O‘O DÔ)Ü! $¬Ô/Ø×2Ñ2°4¸ÀGÈWÔUØ˜‘F�Að/ œ#˜eŸj™j›/¨AÑ-Ô-ð0 —‘ §
¡
¨2¡Ô/Ø%�”
õ; "ð 	&ðB 	rl   c                 ól  — t        |«      }t        | j                  || j                  «       t	        | j                  d|«       t        j                  | j                  | j                  | j                  | j                  «      }|j                  ||«       | j                  ||||«       t        |«       y )Nz$after recursive maximize fusion down)r«  r:  rª  r�  r/   rZ   ró  r   rŸ  r­  r;  r®  )r\  r‡   rx  rª  r�  rÐ  Úarr_analysiss          rh   r>  z&ParforFusionPass.fuse_recursive_parforæ  s‡   € Ü# FÓ+ˆÜ˜Ÿ™ f¨d¯l©lÔ;Ü�t—|‘|Ð%KÈVÔTÜ%×3Ñ3°D·N±NÀDÇLÁLØ04·±¸d¿n¹nóNˆà×Ñ˜ Ô+Ø×Ñ˜,¨°¸ÔAÜ˜VÕ$rl   N)ry   rz   r{   rf  r­  r;  r>  rk   rl   rh   r3  r3  ˆ  s   „ ñò3[òj"óH%rl   r3  c                   ó   — e Zd ZdZd„ Zy)ÚParforPreLoweringPasszSParforPreLoweringPass class is responsible for preparing parfors for lowering.
    c           
      óR
  — t        | j                  j                  i i | j                  «       t	        | j                  d«       t        | j                  | j                  | j                  | j                  d   «       t	        | j                  d«       t        j                  dk\  rCt        dt        | j                  j                  «       «      «       t        d| j                  «       t        j                  dk\  �rb| j                  j                  j                  «       D �]:  \  }}g }|j                  }|j                  D �]  }|j                  |«       t!        |t"        j$                  «      sŒ0|j&                  }|j(                  }|j*                  }| j                  |j,                     }	t        d|j,                  |	t/        |	«      «       |	t0        j2                  v st!        |	t0        j4                  «      sŒ»t#        j6                  |t9        d	«      |«      }
t1        j:                  |j,                  «      | j                  |
j,                  <   t#        j<                  |j,                  |«      }t#        j$                  ||
|«      }|j                  |«       t#        j>                  |
gd
|«      }tA        t0        jB                  | j                  |
j,                     «      | j                  |<   |j                  |«       t#        j>                  |gd
|«      }tA        t0        jB                  |	«      | j                  |<   |j                  |«       �Œ ||_        �Œ= | j                  jD                  r5tG        | j                  jH                  | jJ                  | j                  «       tL        rBtO        | jP                  | j                  | j                  | j                  | j                  «       y
tS        | j                  j                  | jT                  jV                  | jX                  «      \  }}|D ];  }t[        | j                  ||j\                  | j                  «      \  |_/        |_0        Œ= |D ]  }|jc                  | j                  «       Œ t        jd                  rƒ| j                  jf                  jh                  }tk        |«      }|dkD  r8| jT                  jV                  rdnd}t        djm                  ||||«      «       y
t        djm                  |«      «       y
y
)zrun parfor prelowering passzafter push call varsr†   zafter optimizationrƒ   zvariable types: zcall types: r   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   r  rd   rš  rˆ  rÍ  r‰  rb  rš   r	   rË  rm  rÌ  rÝ  rV  rp  r   Únumber_domainÚLiteralrc  r    rÑ  rÒ  ÚPrintrQ   r  Úis_generatorÚfix_generator_typesÚgenerator_infor�   rƒ  Úlower_parfor_sequentialr   r8  r¢  r.  r»  r9  rw  r{  r|  r§  r~  rÁ  rÂ  r‰   r$  )r\  Úblock_labelr�  Ú	new_blockrÍ  rŠ  rm  rÙ  r  rÂ  rH  Ú	lhs_constÚ
str_assignÚ	str_printÚir_printrŽ  r†   r¥  rV  r�  r“  s                        rh   r­  zParforPreLoweringPass.runö  sâ  € ô
 	�t—|‘|×*Ñ*¨B°°D·L±LÔAÜ�t—|‘|Ð%;Ô<ä�—‘˜tŸ|™|¨T¯^©^¸T¿]¹]È9Ñ=UÔVÜ�t—|‘|Ð%9Ô:Ü×!Ñ! QÒ&ÜÐ$¤f¨T¯\©\×-?Ñ-?Ó-AÓ&BÔCÜ�. $§.¡.Ô1ä×!Ñ! QÓ&Ø'+§|¡|×':Ñ':×'@Ñ'@Ó'Bó 'Ñ#�˜UØ�	ØŸ™�Ø!ŸJ™Jó 7�DØ×$Ñ$ TÔ*Ü! $¬¯	©	Õ2Ø"Ÿh™h˜Ø"Ÿk™k˜Ø"Ÿj™j˜Ø"&§,¡,¨s¯x©xÑ"8˜ÜÐ?ÀÇÁÈ7ÔTXÐY`ÓTaÔbØ"¤e×&9Ñ&9Ñ9¼ZÈÔQV×Q^ÑQ^Õ=_Ü&(§f¡f¨U´MÀ)Ó4LÈcÓ&R˜GÜ9>×9LÑ9LÈSÏXÉXÓ9V˜DŸL™L¨¯©Ñ6Ü(*¯©°·±¸3Ó(?˜IÜ)+¯©°9¸gÀsÓ)K˜JØ%×,Ñ,¨ZÔ8Ü(*¯©°'°¸DÀ#Ó(F˜IÜ8AÄ%Ç*Á*ÈdÏlÉlÐ[b×[gÑ[gÑNhÓ8i˜DŸN™N¨9Ñ5Ø%×,Ñ,¨YÔ7Ü')§x¡x°°°t¸SÓ'A˜HÜ7@ÄÇÁÈWÓ7U˜DŸN™N¨8Ñ4Ø%×,Ñ,¨XÖ6ð'7ð( '�–
ð/'ð2 �<‰<×$Ò$Ü §¡× ;Ñ ;¸T×=MÑ=MØ $§¡ô.å%Ü#Ø—‘ §¡¨d¯l©l¸D¿N¹NÈDÏMÉMõ[ô #4°D·L±L×4GÑ4GØ48·L±L×4GÑ4GØ48×4KÑ4Kó#MÑˆJ˜ð
 ò M�Ü'<¸T¿\¹\Ø=>Ø=>¿X¹XØ=A¿^¹^ó(MÑ$�”	˜1�9ðMð ò 0�Ø×!Ñ! $§,¡,Õ/ð0ô ×+Ò+Ø—|‘|×+Ñ+×9Ñ9�Ü 
›O�	Ø˜q’=Ø6:·l±l×6IÒ6I¡NØ)?ð !äð :ß;A¹6Ø'¨¨y¸*ó<FõGô Ð6×=Ñ=¸dÓCÕDð ,rl   N)ry   rz   r{   rf  r­  rk   rl   rh   rF  rF  ñ  s   „ ñóKErl   rF  c                 óL  — t        |j                  «      }|j                  dd«       t        |j	                  «       «      |_        | t
        t        z   v rg |_        | t        v r2t        |j                  «      dk(  r|j                  j                  «        | t        v r2t        |j                  «      dk(  r|j                  j                  «        | dk(  r™t        |j                  «      dk(  r|j                  j                  «        t        |j                  «      dk(  rO|j                  j                  «       }|j                  j                  «        |j                  j                  |«       | dk(  r2t        |j                  «      dk(  r|j                  j                  «        y)	z%remove size argument from args or kwsré   r-  r   rË   Úrandintr!  Ú
triangularN)r¶  r°  rÊ  r  rˆ  rT   rS   rw   rV   r‰   rU   rb  )r†  rÁ  r°  Údt_args       rh   rŒ  rŒ  D  s!  € ô ˆt�x‰x‹.€CØ‡G�GˆF�BÔÜ�S—Y‘Y“[Ó!€D„Hð Ô$¤Ñ6Ñ6ð ˆŒ	àÔ(Ñ(äˆt�y‰y‹>˜QÒØ�I‰I�M‰MŒOàÔ(Ñ(äˆt�y‰y‹>˜QÒØ�I‰I�M‰MŒOà�IÒäˆt�y‰y‹>˜QÒØ�I‰I�M‰MŒOÜˆt�y‰y‹>˜QÒØ—Y‘Y—]‘]“_ˆFØ�I‰I�M‰MŒOØ�I‰I×Ñ˜VÔ$à�LÒ äˆt�y‰y‹>˜QÒØ�I‰I�M‰MŒOà
rl   c                 óÎ   — g }| j                   D ]   }|j                  ||j                     «       Œ" i }| j                  D ]  \  }}||j                     ||<   Œ t	        |«      |fS r`   )rw   rb  rV  r°  r  )rÁ  r�  r�  rž   r‘  rV  s         rh   r�  r�  l  st   € Ø€LØ�y‰yò /ˆØ×Ñ˜G C§H¡HÑ-Õ.ð/ð €LØ—X‘Xò /‰	ˆˆcØ$ S§X¡XÑ.ˆ�TÒð/ô �Ó Ð,Ð,rl   c                 ó†
  ‡— ‰|j                      }|j                  }|j                  }g }t        |t        «      �rª|\  }}g }|D ]Z  }t        j                  |t        d«      |«      }|‰|j                   <   |t        | |‰|||||||	|
«      z  }|j                  |«       Œ\ |t        j                  v �r
‰|d   j                      }t        |«      dk(  r{‰|d   j                      }|j                  |||fi «      }t
        j                  j                  ||d   |d   |«      }|t         j"                  k(  rQt%        |d   |d   |‰|«      \  }}n8|j                  ||fi «      }t
        j                  j'                  ||d   |«      }|||<   |j(                  }|j                  t        j*                  |||«      «       t,        j.                  D �]  }t        ||«      sŒt1        ‰||
|¬«      }t        j                  |t        |«      |«      }‰|   ‰|j                   <   t3        j4                  | j7                  |«      «      }t        |t
        j                  «      rÒ|j8                  dk(  rÃ|j:                  dk(  r´t        j                  |t        d«      |«      }t<        j>                  jA                  tB        «      ‰|j                   <   t        jD                  d	tB        |«      }t        j*                  |||«      }t
        j                  jG                  |d|«      }|j                  |«       t
        j                  jI                  ||d
|«      }‰|j                      jK                  |t	        ˆfd„|D «       «      i «      }|||<   |j(                  }|j                  t        j*                  |||«      «       |j                  t        j*                  |||«      «       �Œ nüt        |t
        j                  «      ru‰|j                      } t        | t<        jL                  «      r!| jN                  }tQ        ||||	|||‰||«
      }n| }|}|j                  t        j*                  |||«      «       nmt        |t
        jR                  «      rStU        jV                  «       jY                  |jZ                  «      }|j                  t        j*                  |||«      «       t        |«      dk(  r&t]        j^                  d|d›d�|j                  ¬«      ‚‰ja                  |j                   d«       |‰|j                   <   |S )z�generate 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   ó<   •K  — | ]  }‰|j                      –— Œ y ­wr`   r½  )r  r»   r�  s     €rh   r  z(_arrayexpr_tree_to_ir.<locals>.<genexpr>Á  s   øè ø€ Ò$G¸ W¨Q¯V©V¥_Ñ$Gùs   ƒz.Don't know how to translate array expression 'r3  ú'N)1rV  rÍ  rm  rš   r  r	   rc  r    r~  rb  rP   Úsupported_array_operatorsr‰   r/  rÞ  r  r.  ÚtruedivÚ_gen_np_divideÚunaryr�   rË  rZ   Ú	MAP_TYPESÚ_find_func_varrå  ræ  r?   rl  rf  r   rÎ  rÏ  r  rÐ  rÅ  rÜ  rÕ  rÍ   r�   Ú_gen_arrayexpr_getitemrÒ  r   rŽ  Úresolve_value_typerÝ  r   ra  rÊ  )!rª  r   r�  rŸ  rx  rt  r(  rÁ  Úparfor_index_tuple_varÚall_parfor_indicesrs  r  rÍ  rm  Úout_irrl  Úarr_expr_argsÚarg_varsrž   Úarg_out_varÚel_typ1Úel_typ2Úfunc_typÚir_exprÚTÚfunc_var_namer   Úfunc_var_defÚ
g_math_varÚg_mathÚg_math_assignÚcall_typÚvar_typs!     `                              rh   r~  r~  x  sœ  ø€ ð �\×&Ñ&Ñ'€FØ×Ñ€EØ
×
Ñ
€CØ€Fä�$œÕØ ÑˆˆMØˆØ ò 	)ˆCÜŸ&™& ¬°nÓ(EÀsÓKˆKØ(.ˆG�K×$Ñ$Ñ%ØÔ+¨GØ,5Ø,3Ø,5Ø,5Ø,6Ø,7Ø,/Ø,BØ,>Ø,6ó
8ñ 
8ˆFð �O‰O˜KÕ(ð	)ð ”×2Ñ2Ò2Ø˜h q™k×.Ñ.Ñ/ˆGÜ�8‹} Ò!Ø! (¨1¡+×"2Ñ"2Ñ3�Ø$×:Ñ:¸2ÀØ@Gð@IØJLóN�äŸ'™'Ÿ-™-¨¨H°Q©K¸À!¹ÀcÓJ�Øœ×)Ñ)Ò)Ü(6Ø  ™ X¨a¡[°&¸'À9ó)NÑ%�H™gð %×:Ñ:¸2À¸zÈ2ÓN�ÜŸ'™'Ÿ-™-¨¨H°Q©K¸Ó=�Ø!)ˆI�gÑØ×)Ñ)ˆFØ�M‰Mœ"Ÿ)™) G¨\¸3Ó?Ô@Ü×)Ñ)ó 	EˆAÜ˜"˜aÕ ô !/¨w¸¸JÈCÔ P�ÜŸ6™6 %¬°}Ó)EÀsÓK�Ø)0°Ñ)?�˜Ÿ™Ñ&Ü#Ÿ}™}¨W×-CÑ-CÀMÓ-RÓS�Ü˜l¬B¯G©GÔ4¸¿¹ÈIÒ9UÐZf×ZkÑZkÐouÒZuÜ"$§&¡&¨´¸mÓ0LÈcÓ"R�ZÜ05·
±
×0AÑ0AÄ$Ó0G�W˜ZŸ_™_Ñ-Ü Ÿi™i¨´°cÓ:�VÜ%'§Y¡Y¨v°zÀ3Ó%G�]Ü$&§G¡G§O¡O°JÀÈÓ$L�\Ø—]‘] =Ô1äŸ'™'Ÿ,™, x°¸2¸sÓC�Ø" 8§=¡=Ñ1×?Ñ?ØœuÓ$G¸hÔ$GÓGÈóM�à%-�	˜'Ñ"Ø!×-Ñ-�à—‘œbŸi™i¨°hÀÓDÔEØ—‘œbŸi™i¨°¸sÓCÖDñ1	Eô2 
�Dœ"Ÿ&™&Ô	!Ø˜$Ÿ)™)Ñ$ˆÜ�gœuŸ{™{Ô+Ø—]‘]ˆFÜ,ØØØ&Ø"ØØØØØØó
‰Gð ˆFØˆGØ�‰”b—i‘i ¨°sÓ;Õ<Ü	�Dœ"Ÿ(™(Ô	#Ü—‘Ó!×4Ñ4°T·Z±ZÓ@ˆØ�‰”b—i‘i  l°CÓ8Ô9ä
ˆ6ƒ{�aÒÜ×,Ñ,Ø<¸TÀ!¸HÀAÐFØ—‘ô
ð 	
ð ‡K�K�×!Ñ! 4Ô(Ø!'€GˆL×ÑÑØ€Mrl   c                 ó  — | j                   }| j                  }t        j                  |t	        d«      |«      }t
        j                  j                  t        «      ||j                  <   t        j                  dt        |«      }t        j                  |||«      }	t        j                  j                  |d|«      }
t        j                  |t	        d«      |«      }t        t        j                  |«      }|||j                  <   t        j                  |
||«      }t        j                  j!                  || |gd|«      }|j#                  ||| j                     ||j                     gi «      }|j%                  |	|g«       ||fS )z‰generate 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Í  rm  r	   rc  r    r   rÎ  rÏ  r9  rV  rÐ  rË  rÞ  rÅ  r#   r|  rÜ  rÕ  rÿ  )Úarg1Úarg2rk  r�  r   rÍ  rm  rÛ  rÜ  rÝ  Údiv_attr_callÚattr_varÚfunc_var_typÚattr_assignÚdiv_callrq  s                   rh   rc  rc  é  s2  € ð �J‰J€EØ
�(‰(€Cä�v‰v�eœ]¨;Ó7¸Ó=€HÜ"ŸZ™Z×.Ñ.¬uÓ5€GˆH�M‰MÑÜ�9‰9�Tœ5 #Ó&€DÜ—)‘)˜D (¨CÓ0€Kä—G‘G—O‘O H¨h¸Ó<€MÜ�v‰v�eœ]¨;Ó7¸Ó=€HÜ#¤E§L¡L°)Ó<€LØ)€GˆH�M‰MÑÜ—)‘)˜M¨8°SÓ9€Kä�w‰w�|‰|˜H t¨T l°B¸Ó<€HØ×)Ñ)Ø�G˜DŸI™IÑ&¨°·	±	Ñ(:Ð;¸RóA€Hà
‡M�M�; Ð,Ô-Ø�XÐÐrl   c
           	      óÆ  — |j                   }
|}||j                     }||j                     j                  }t        |«      }| j	                  |«      xs g }|D �cg c]  }| j                  |«      ‘Œ }}|dk(  �r?t        j                  |j                  t        d«      |
«      }t        j                  j                  |j                  dd¬«      }|||j                  <   t        j                  dt         j"                  ||g|||«      }|j$                  j'                  |«       |}t        j(                  d|j                   «      }t        j                  |j                  t        d«      |
«      }t        j*                  ||j                  <   t        j,                  |||
«      }|	j/                  |«       |}�nÒ|dk(  r|d   }�nÆt1        |D �cg c]  }|d	u‘Œ c}«      �rª||z
  }t        j                  |j                  t        d
«      |
«      }t        j2                  j5                  t        j*                  |«      ||j                  <   t        j(                  d|j                   «      }t        j                  |j                  t        d«      |
«      }t        j*                  ||j                  <   t        j,                  |||
«      }|	j/                  |«       g }t7        t9        |«      «      D ]:  }||   }||   }|dk(  r|j/                  |«       Œ$|j/                  |||z      «       Œ< t;        t7        |«      «      }t        j<                  j?                  ||
«      }t        j,                  |||
«      }|	j/                  |«       |}t        j<                  jA                  |||
«      } tC        |||j                     ||j                     «      || <   | S c c}w c c}w )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ƒ   ru  )r�   r™   rw  r­   z$const_ind_0r  Nz$parfor_index_tuple_var_bcast)"rm  rV  r™   r‰   r  Úget_equiv_constr	   rc  rÍ  r    r   rÌ   rÍ   r�   r   Úgen_np_callr9  r­   r‰  rÿ  rÒ  rN  rË  rb  r"  r^  r_  r  ru   r¹  rÞ  r`  r  rQ   )!rx  rø   ri  rj  r  rŸ  r   r�  rt  rk  rm  rv  rz  rc  Únum_indicesr  re   Úsize_constsÚ	ravel_varÚ	ravel_typÚstmtsÚ
const_nodeÚ	const_varÚconst_assignÚ
ind_offsetrd  r   r�   rT  Ú
size_constre  rf  rr  s!                                    rh   rg  rg    s0  € ð  �'‰'€CØ&€IØ�s—x‘xÑ €GØ�C—H‘HÑ×"Ñ"€EÜÐ(Ó)€KØ×#Ñ# CÓ(Ò.¨B€IØ9BÖC°A�9×,Ñ,¨QÕ/ÐC€KÐCà�ƒzä—F‘F˜3Ÿ9™9¤m°HÓ&=¸sÓCˆ	Ü—N‘N×(Ñ(¨w¯}©}À1ÈSÐ(ÓQˆ	Ø"+ˆ�	—‘ÑÜ×$Ñ$ W¬e¯k©k¸9ÀsÀeÈYÐX_ÐajÓkˆØ�‰×Ñ˜uÔ%Øˆä—X‘X˜a §¡Ó)ˆ
Ü—F‘F˜3Ÿ9™9¤m°NÓ&CÀSÓIˆ	Ü"'§+¡+ˆ�	—‘ÑÜ—y‘y ¨Y¸Ó<ˆØ�‰�lÔ#ØŠ	à	�!Šà& rÑ*Š	ä	 [Ö1 ˆa�tŠmÒ1Õ	2à  5Ñ(ˆ
Ü—F‘F˜3Ÿ9™9¤mØ+ó'-Ø.1ó3ˆ	ä"'×"2Ñ"2×";Ñ";¼E¿K¹KÈÓ"Oˆ�	—‘Ñô —X‘X˜a §¡Ó)ˆ
Ü—F‘F˜3Ÿ9™9¤m°NÓ&CÀSÓIˆ	Ü"'§+¡+ˆ�	—‘ÑÜ—y‘y ¨Y¸Ó<ˆØ�‰�lÔ#Øˆ
Üœ% ›,Ó'ò 	FˆAØ  ‘|ˆHØ$ Q™ˆJØ˜QŠØ×!Ñ! )Õ,à×!Ñ!Ð"4°ZÀ!±^Ñ"DÕEð	Fô œ( :Ó.Ó/ˆ
Ü—W‘W×(Ñ(¨°SÓ9ˆ
Ü—y‘y ¨Y¸Ó<ˆØ�‰�lÔ#Øˆ	ä�g‰g�o‰o˜c 9¨cÓ2€GÜ" 6¨7°3·8±8Ñ+<Ø#*¨9¯>©>Ñ#:ó<€IˆgÑà€Nùòi Dùò, 2s   ÁOÇOc                 ó�   — |D ]+  }| |   }t        |t        «      sŒ|j                  |k(  sŒ)|c S  t        j                  d|¬«      ‚)zAfind variable in typemap which represents the function func.
    zufunc call variable not foundr]  )rš   rR   Ú
typing_keyr   ra  )r�  rW  rs  rm  rí  r¹  s         rh   rf  rf  O  sL   € ð ò ˆØ�A‰Jˆä�aœÕ" q§|¡|°tÓ';ØŠHð	ô
 ×
(Ñ
(Ð)HÈcÔ
RÐRrl   c           
      ó   — t         j                  j                  t        j                  |j                  «      «       d}i }t        t        |j                  j                  «       «      «      j                  }|j                  j                  «       D ]  \  }}	t        ||	|||||¬«      \  }}|	||<   Œ! ||_        |rt        |j                  «      |_        t        |d«       t        ||||d   «       t        |d«       y )NF©rÍ  z after parfor sequential loweringr†   z after parfor sequential simplify)r   rô  r"  r*  rÐ  ÚnextÚiterrç  rÍ  rˆ  Ú_lower_parfor_sequential_blockr2   r/   r4   )
r   rª  r�  rŸ  rõ  Úparfor_foundr¾  rÍ  rR  r�  s
             rh   rQ  rQ  Z  sâ   € Ü×Ñ×"Ñ"¤8×#:Ñ#:¸7¿>¹>Ó#JÔKØ€LØ€JÜ”�g—n‘n×+Ñ+Ó-Ó.Ó/×5Ñ5€EØ '§¡× 4Ñ 4Ó 6ò (Ñˆ�eÜ$BØ˜ 
¨G°YÀØô%Ñ!ˆ�\ð #(ˆ
�;Òð(ð  €G„NáÜ& w§~¡~Ó6ˆŒÜ�7Ð>Ô?ÜˆW�g˜y¨(°9Ñ*=Ô>Ü�7Ð>Õ?rl   c           
      ó|  — t        |j                  «      }|dk7  �rd}|j                  |   }|j                  j                  }	t	        j
                  ||	«      }
|j                  d | |
_        |j                  |dz   d  |_        t        «       }|
j                  j                  t	        j                  ||	«      «       t        |j                  |«      ||<   |
|| <   t        «       } t        |j                  «      }t        |«      D �]9  }|j                  |   }t        «       }t        «       }t        ||j                  |j                  |j                   |||	«      }||j                  d   _        |j                  d   j"                  }|||<   t%        |||||	«      }|j&                  |j                  d   _        |||<   |dk(  rN|j                  j                  j                  t	        j                  ||	«      «       | |j                  d   _        n+||   j                  d   _        ||j                  d   _        |}�Œ< t-        |j.                  j1                  «       «      }|j.                  |   j                  j                  t	        j                  |	«      «       t3        |j.                  j1                  «       «      }|j                  d   _        |j.                  j5                  «       D ])  \  }}t7        |||||||¬«      \  }}t        ||«      ||<   Œ+ t        |j                  «      }|dk7  r�Œ| |fS )Nr  Trƒ   éþÿÿÿr   r”  )Ú_find_first_parforr‰  rt  rm  r	   r  r!   rb  rP  rJ   r‰   rs  ru   r$   r  r   r  rÌ  r%   r[  ÚfalsebrÚtruebrr§   ru  ré  r“   rˆ  r—  )rR  r�  r¾  r�  rŸ  r˜  rÍ  r�   râ  rm  Ú
prev_blockÚ
init_labelrc  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—  n  sè  € ô 	˜5Ÿ:™:Ó&€AØ
ˆr‹'ØˆØ�z‰z˜!‰}ˆØ�o‰o×!Ñ!ˆä—X‘X˜e SÓ)ˆ
ØŸ*™* R a˜.ˆ
ŒØ—Z‘Z  A¡ Ð'ˆŒ
ä“\ˆ
Ø�‰×ÑœrŸw™w z°3Ó7Ô8Ü!/°·±ÀÓ!Gˆ
�:ÑØ",ˆ
�;ÑÜ “lˆä�D—O‘OÓ$ˆÜ�u“ó 	-ˆAØ—‘ qÑ)ˆHä$›,ˆKÜ%›<ˆLÜ(ØØ—‘Ø—‘Ø—‘ØØØóˆKð +7ˆK×Ñ˜RÑ Ô'Ø!×&Ñ& rÑ*×1Ñ1ˆGØ&1ˆJ�{Ñ#Ü)¨'°7¸IØ*/°ó6ˆLà+3×+BÑ+BˆL×Ñ˜bÑ!Ô(Ø'3ˆJ�|Ñ$à�AŠvØ—‘×$Ñ$×+Ñ+¬B¯G©G°KÀÓ,EÔFØ0;�×!Ñ! "Ñ%Õ-à@K�
Ð,Ñ-×2Ñ2°2Ñ6Ô=Ø0A�×!Ñ! "Ñ%Ô-Ø ,Òð7	-ô< ˜dŸn™n×1Ñ1Ó3Ó4ˆØ�‰�Ñ'×,Ñ,×3Ñ3Ü�G‰G�L #Ó&ô	(ô ˜tŸ~™~×2Ñ2Ó4Ó5ÐØ'7ˆ×Ñ˜"ÑÔ$à—n‘n×*Ñ*Ó,ò 	5‰FˆQ�Ü<Ø�1�j '¨9°lØô‰OˆAˆ|ô +¨1¨eÓ4ˆJ�qŠMð		5ô
 ˜uŸz™zÓ*ˆðu ˆrŒ'ðv ˜Ð$Ð$rl   c                 ól   — t        | «      D ]&  \  }}t        |t        «      sŒ|j                  rŒ$|c S  y©Nr  )r1  rš   rh  ri  ©r‰  r�   râ  s      rh   r›  r›  µ  s5   € Ü˜t“_ò ‰	ˆˆDÜ�dœFÕ#¨D×,GÓ,GØŠHðð rl   c                 óT  — t        «       }g }t        «       }t        | «      \  }}t        | «      }|D ]ñ  }	| |	   }
t        |
j                  «      D ]Ê  \  }}t        j                  |
j                  |
j                  «      }|
j                  d| |_        t        d|i«      j                  d   }||z  }t        ||||«      }t        |
j                  ||j                  «      \  |_        |_        |j                  |j                  «       |j!                  |«       ŒÌ |||	   z  }Œó ||fS )zfind variables used in body of parfors from outside and save them.
    computed as live variables at entry of first block.
    Nr   )rn  rK   r0   Ú_find_parforsr‰  r	   r  rÍ  rm  rÖ  Úget_parfor_params_innerÚ#_combine_params_races_for_ssa_namesrj  rw  rè  rr  rb  )rÐ  Úoptions_fusionrº  rŽ  r†   Úpre_defsr¿  Úall_defsr
  r×  r�  r�   r‡   Údummy_blockÚbefore_defsrw  s                   rh   r8  r8  ¼  s$  € ô “€JØ€GÜ‹u€HÜ" 6Ó*�K€A€xÜ  Ó(€JØò $ˆØ�u‘ˆÜ& u§z¡zÓ2ò 	#‰IˆAˆväŸ(™( 5§;¡;°·	±	Ó:ˆKØ$Ÿz™z¨"¨1˜~ˆKÔÜ*¨A¨{Ð+;Ó<×CÑCÀAÑFˆKØ˜Ñ#ˆHÜ,Ø˜ .°+óˆFô +NØ—‘˜V V§\¡\ó+Ñ'ˆFŒM˜6œ<ð �N‰N˜6Ÿ9™9Ô%Ø�N‰N˜6Õ"ð	#ð 	�H˜U‘OÑ#‰ð#$ð$ �wÐÐrl   c                 ó¾   ‡ ‡‡— ˆ fd„Št        |«      }t        t        ‰|«      «      }|D ]*  Št        ˆˆfd„|D «       «      r|j	                  ‰«       Œ* n ||z  |fS )z§Returns `(params|races1, races1)`, where `races1` contains all variables
    in `races` are NOT referring to the same unversioned (SSA) variables in
    `params`.
    c                 ór   •— 	 ‰j                  | «      j                  S # t        j                  $ r | cY S w xY wr`   )r  r  r	   r  )rù  rÍ  s    €rh   Ú	unversionz6_combine_params_races_for_ssa_names.<locals>.unversionä  s7   ø€ ð	Ø—?‘? 1Ó%×6Ñ6Ð6øÜ×!Ñ!ò 	àŠHð	ús   ƒ ž6µ6c              3   ó4   •K  — | ]  } ‰‰«      |k(  –— Œ y ­wr`   rk   )r  ÚpvÚrvr¶  s     €€rh   r  z6_combine_params_races_for_ssa_names.<locals>.<genexpr>ï  s   øè ø€ Ò: r‰y˜‹} Õ"Ñ:ùs   ƒ)rn  r¹  r  r"  Údiscard)rÍ  rw  rj  Úraces1Úunver_paramsr¹  r¶  s   `    @@rh   r®  r®  ß  sa   ú€ ô
ô �‹Z€FÜœ˜I vÓ.Ó/€Làò ˆÜÔ:¨\Ô:Ô:Ø�N‰N˜2Õáð	ð �F‰?˜FÐ"Ð"rl   c                 ó  — t        | «      }t        |«      }t        |«      }t        |||j                  |j
                  «      }t        |||«      \  }}	t        |«      }
|
dkD  rUt        j                  r-|rdnd}t        dj                  || j                  |
|«      «       t        |«      || j                  <   t        | «       t        |j!                  «       «      }|d   }|d   }|j
                  |   |z  }||   |z  }|S )Nr   rI  r€  z2{}, parallel for-loop {} has nested Parfor(s) #{}.rƒ   )r«  rN   rK   rL   rÕ  rÖ  r8  r‰   r   r~  rd   r$  rr  r¹  r®  rš  ré  )r‡   r°  r¯  rº  rÐ  ræ  rç  rÑ  rŽ  r¿  r�  r“  Úkeylistrt  Úfirst_non_init_blockr³  rw  s                    rh   r­  r­  ÷  sþ   € Ü Ó'€FÜ
! &Ó
)€CÜ˜vÓ&€GÜ  V¨W¯^©^¸W¿^¹^ÓL€HÜ% f¨n¸kÓJ�M€J�Ü�J“€IØ�1‚}Ü×'Ò'Ù.<™NØ!7ð äð (ß)/©Ø˜fŸi™i¨°Jó*@ôAô "& jÓ!1ˆ�F—I‘IÑä˜Ô Ü�X—]‘]“_Ó%€GØ˜‘€JØ" 1™:Ðà—.‘. Ñ,¨xÑ7€KØÐ*Ñ+¨kÑ9€FØ€Mrl   c              #   ó`   K  — t        | «      D ]  \  }}t        |t        «      sŒ||f–— Œ y ­wr`   )r1  rš   rh  rª  s      rh   r¬  r¬    s0   è ø€ Ü˜T“?ò ‰ˆˆ4Ü�dœFÕ#Ø�T�'‹Mñùs   ‚".¥	.c                 ó   — t        t        | |j                  «      }t        |t        j
                  «      rO|j                  dk(  r@|j                  D �cg c]  }|j                  ‘Œ c}|D �cg c]  }|j                  ‘Œ c}k(  ryyc c}w c c}w )Nr`  TF)r;   r?   rV  rš   r	   rÞ  rl  rˆ  )rª  r¯   Únest_indicesÚ	index_defre   s        rh   Ú_is_indirect_indexrÄ    se   € Ü”n g¨u¯z©zÓ:€IÜ�)œRŸW™WÔ%¨)¯,©,¸-Ò*GØ%ŸO™OÖ,�qˆA�F‹FÒ,ÀÖ0N¸A°·³Ò0NÒNØàùò -ùÒ0Ns   ÁBÁ,Bc           
      óî  — | D �]ï  }|j                   D �]Ü  }t        |t        j                  t        j                  f«      r�t        |«      }t        |t        j                  «      rB|j                  |k(  st        |||«      r&|j                  |j                  j                  «       Œ•|j                  |j                  j                  «       Œ»t        |t        j                  «      rÎt        |j                  t        j                  «      rª|j                  j                  dv r’|j                  j                  }	|j                  j                  j                  }
t        |	t        j                  «      r/|	j                  |k(  st        ||	|«      r|j                  |
«       �Œ�|j                  |
«       �Œ£t        |t         «      s�Œµt#        |j$                  j'                  «       |||||«       �Œß �Œò y )NrÀ  )r‰  rš   r	   r?  r  r5  rc  rV  rÄ  rè  rÌ  rË  rÝ  rÞ  rl  r¯   rh  Ú,get_array_indexed_with_parfor_index_internalru  rç  )ru  r¯   Úret_indexedÚret_not_indexedrÂ  rª  rØ  rŠ  Úsetarray_indexÚgetarray_indexÚgetarray_names              rh   rÆ  rÆ     su  € ð ó "ˆØ—H‘Hó !	ˆDÜ˜$¤×!1Ñ!1´2·:±:Ð >Ô?Ü!.¨tÓ!4�Ü˜~¬r¯v©vÔ6Ø#×(Ñ(¨EÒ1Ü'Ø Ø'Ø%ô'ð  —O‘O D§K¡K×$4Ñ$4Õ5à#×'Ñ'¨¯©×(8Ñ(8Õ9Ü˜T¤2§9¡9Ô-Ü˜TŸZ™Z¬¯©Ô1Ø—*‘*—-‘-Ð#@Ñ@Ø!%§¡×!1Ñ!1�Ø $§
¡
× 0Ñ 0× 5Ñ 5�Ü˜~¬r¯v©vÔ6Ø#×(Ñ(¨EÒ1Ü'Ø Ø'Ø%ô'ð  —O‘O MÖ2à#×'Ñ'¨Ö6Ü˜D¤&Ö)Ü<Ø—N‘N×)Ñ)Ó+ØØØ#Ø Øöò7!	ñ"rl   c                 óR   — t        «       }t        «       }t        | |||||«       ||fS r`   )rn  rÆ  )ru  r¯   rÂ  rª  rÇ  rÈ  s         rh   Ú#get_array_indexed_with_parfor_indexrÍ  K  s9   € ô “%€KÜ“e€OÜ0ØØØØØØôð ˜Ð'Ð'rl   c                 óü  — t        | j                  j                  «       «      }g }| j                  j                  «       D ]�  }|j                  D ]  }t        |t        j                  t        j                  f«      sŒ.t        |«      j                  | j                  j                  k(  sŒ[|j                  |j                  j                  «       Œ� Œ’ t        t        |«      t        |«      z  «      }t!        |«      S )zhget arrays that are written to inside the parfor and need to be passed
    as parameters to gufunc.
    )r§   ru  ré  rç  r‰  rš   r	   r?  r  r5  rV  rv  rb  rÌ  r¹  rn  rš  )r‡   Úparfor_paramsÚ
last_labelÚoutputsrØ  rŠ  s         rh   Úget_parfor_outputsrÒ  [  sÅ   € ô �V×%Ñ%×*Ñ*Ó,Ó-€JØ€GØ×Ñ×&Ñ&Ó(ò 1ˆØ—H‘Hò 	1ˆDÜ˜4¤"×"2Ñ"2´B·J±JÐ!?Õ@Ü˜dÓ#×(Ñ(¨F×,<Ñ,<×,AÑ,AÓAØ—‘˜tŸ{™{×/Ñ/Õ0ñ	1ð1ô ”3�w“<¤# mÓ"4Ñ4Ó5€GÜ�'‹?Ðrl   Ú_RedVarInfo©r²   Úreduce_nodesÚredopT)Úfrozenc	                 óŽ  — |€i }|€g }|€t        t        «      }|€t        t        «      }|€i }t        |«      }	t        |	«      }
|
dd }
t	        |«       t        |
«      D �]¼  }t        |j                  |   j                  «      D �]“  }t        |t        j                  «      �rP|j                  j                  |v s|j                  j                  |v �r|j                  }|j                  }|j                  |v r|n||j                     }g }t        |t        j                  «      r|j                  g}nKt        |t        j                  «      r1|j                  j!                  «       D �cg c]  }|j                  ‘Œ }}||   j#                  |«       |D ]  }|||<   Œ	 t%        j&                  |«      }|j                  |v r||j                     ||j                  <   ||   j)                  |«       t        |t*        «      s�Œ�t-        | |||||d||«	       �Œ– �Œ¿ |j/                  «       D ]‹  \  }}|j                  }||v sŒ||vsŒ||   j1                  «        t3        |||   | «      }|€ŒB|j)                  |«       t5        ||«       t7        t8        |«      }|�|\  }}nd}d}t;        |||¬«      ||<   Œ� ||fS c c}w )z‚find variables that are updated using their previous values and an array
    item accessed with parfor index, e.g. s = s+A[i]
    Nrƒ   rÔ  )r   r¹  r«  r0   r®  r  ru  r‰  rš   r	   rË  rÌ  rV  rÝ  rc  rÞ  re  rÿ  rå  ræ  rb  rh  r9  rˆ  r  Úget_reduce_nodesÚ%check_conflicting_reduction_operatorsr;   Úget_reduction_initrÓ  )rª  r‡   rÏ  rŸ  Ú
reductionsÚreduce_varnamesÚ
param_usesÚparam_nodesÚvar_to_paramrÐ  r
  r×  rŠ  rÙ  r  Ú	cur_paramÚ	used_varsrí  Ústmt_cpÚparamÚ
param_namerÕ  Úgri_outr²   rÖ  s                            rh   r9  r9  t  sÀ  € ð ÐØˆ
ØÐØˆð ÐÜ ¤Ó&ˆ
ØÐÜ!¤$Ó'ˆØÐØˆä Ó'€FÜ  Ó(€JØ˜A˜B�€JÜ˜Ô ä˜*Ó%ó RˆÜ˜V×-Ñ-¨eÑ4×9Ñ9Ó:ó 	RˆDÜ˜4¤§¡Õ+ØŸ™×)Ñ)¨]Ñ:ØŸ™×)Ñ)¨\Ò9Ø—k‘k�Ø—j‘j�Ø#&§8¡8¨}Ñ#<™CÀ,ÈsÏxÉxÑBX�	Ø�	Ü˜c¤2§6¡6Ô*Ø!$§¡ 
‘IÜ ¤R§W¡WÔ-Ø15·±×1EÑ1EÓ1GÖ H¨A §£Ð H�IÐ HØ˜9Ñ%×,Ñ,¨YÔ7Ø"ò 0�AØ&/�L ’Oð0ô Ÿ-™-¨Ó-�Ø—:‘: Ñ*Ø/8¸¿¹Ñ/D�I˜gŸm™mÑ,Ø˜IÑ&×-Ñ-¨gÔ6Ü˜$¤Ö'ä% g¨t°]ÀIØ °°{ÀLöRò-	RðRð4 '×,Ñ,Ó.ò Ñˆˆyð —Z‘Zˆ
Ø˜Ò" z¸Ò'HØ˜Ñ×&Ñ&Ô(Ü+¨E°;¸uÑ3EÀwÓOˆLð Ñ'Ø×&Ñ& zÔ2Ü5°e¸\ÔJÜÔ 2°LÓA�ØÐ&Ø&-‘O�H™eà#�HØ �EÜ)4Ø%Ø!-Øô*�
˜:Ò&ð/ð: ˜JÐ&Ð&ùòW !Is   Å-Kc                 óŒ  — d}|D ]½  }t        |t        j                  «      sŒt        |j                  t        j                  «      sŒC|j                  j
                  dk(  sŒ]|€|j                  j                  }Œv||j                  j                  k7  sŒ�d| j                  z  }t        j                  ||j                  «      ‚ y)zÿIn 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.
    Nr  zCReduction variable %s has multiple conflicting reduction operators.)rš   r	   rË  rÝ  rÞ  rl  Úfnr  r   ra  rm  )rä  ÚnodesÚfirst_red_funcÚnoder¤  s        rh   rÚ  rÚ  Æ  sš   € ð €NØò 
HˆÜ�tœRŸY™YÕ'Ü�t—z‘z¤2§7¡7Õ+Ø�J‰J�M‰M˜?Ó*ØÐ%Ø!%§¡§¡‘à! T§Z¡Z§]¡]Ó2ð2Ø49×4JÑ4JñK�Cä ×8Ñ8¸¸d¿h¹hÓGÐGñ
Hrl   c                 óÚ  — t        t        | «      dk\  «       t        t        d„ | «      «      d   j                  }t        t        |t        j                  «      xr |j                  dv «       |j                  }|j                  dk(  r�|t        j                  k(  rt        j                  }nk|t        j                  k(  rt        j                  }nG|t        j                  k(  rt        j                   }n#|t        j"                  k(  rt        j$                  }|t        j                  k(  s|t        j                  k(  rd|fS |t        j                   k(  s|t        j$                  k(  rd|fS y)z^
    Get initial value for known reductions.
    Currently, only += and *= are supported.
    rƒ   c                 óJ   — t        | j                  t        j                  «      S r`   )rš   rÝ  r	   rÞ  r  s    rh   r4  z$get_reduction_init.<locals>.<lambda>á  s   € ¤Z°·±¼¿¹Ó%A€ rl   r  )r  r  r  r   ré  )r<   r‰   r¹  rC  rÝ  rš   r	   rÞ  rl  rè  r.  rè  ÚiaddÚsubÚisubÚmulÚimulrb  Úitruediv)ré  Úacc_exprÚacc_expr_fns      rh   rÛ  rÛ  Ù  s
  € ô
 ŒC�‹J˜!‰OÔô ”FÑAÀ5ÓIÓJÈ2ÑN×TÑT€HÜŒJ�x¤§¡Ó)ÒW¨h¯k©kÐ=WÐ.WÔXØ—+‘+€KØ‡{�{�gÒØœ(Ÿ,™,Ò&Ü"Ÿ-™-‰KØœHŸL™LÒ(Ü"Ÿ-™-‰KØœHŸL™LÒ(Ü"Ÿ-™-‰KØœH×,Ñ,Ò,Ü"×+Ñ+ˆKØ”h—m‘mÒ# {´h·m±mÒ'CØ�+ˆ~ÐØ
œŸ™Ò
&Ø
œ×*Ñ*Ò
*Ø�+ˆ~ÐØrl   c                 óN  — | j                   dk(  s| j                   dk(  râ| j                  t        j                  k(  s| j                  t        j                  k(  r t        j                  d| j                  «      ‚t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  g}| j                  |v S | j                   dk(  rt!        t"        || «      }|dv ryy)Nr  r  zÑParallel 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   r÷  TF)rl  rè  r.  Ú	ifloordivÚfloordivr   ÚNumbaValueErrorrm  rî  rð  rò  ró  rè  rï  rñ  rb  r;   r9   )re   rª  Úsuppsr·  s       rh   Úsupported_reductionrü  ô  sá   € Ø‡t�tˆÒ !§$¡$¨'¢/Ø�4‰4”8×%Ñ%Ò%¨¯©´×1BÑ1BÒ)BÜ×(Ñ(ð +7ð :;¿¹ó	@ð @ô
 —‘Ü—‘Ü—‘Ü×"Ñ"Ü—‘Ü—‘Ü—‘Ü×!Ñ!ð#ˆð �t‰t�uˆ}ÐØ‡t�tˆv‚~Üœ¨°Ó3ˆØð 
ñ 
ð Ørl   c           	      ó$  ‡‡‡— d}i Šdˆˆfd„	Šˆfd„Š| j                   }| j                  }t        |«      D �]Ä  \  }}|j                  }|j                  }	|	‰|j                   <   t        |	t        j                  «      r|	j                   ‰v r ‰|	«      }	t        |	t        j                  «      sŒyt        ˆfd„|	j                  «       D «       «      }
||
v sŒ |dz   t        |«      k  r³t        ||dz      t        j                  «      r||dz      j                  j                  |k7  rtd}t        ||dz   d «      D ]9  \  }}t        |t        j                  «      sŒ!|j                  |k(  sŒ1||z   dz   } n |�#|d|dz    |||dz    z   ||dz   | z   ||dz   d z   }|dz   t        |«      k  r?t        ||dz      t        j                  «      r||dz      j                  j                  |k(  s|j                  |k7  rt        d|›d�«      ‚t        |	|«      st        d|z   d	z   «      ‚t        |	«      D �cg c]  }|j                    ‰|d«      f‘Œ }}|D ��cg c]  \  }}|j                   |k7  sŒ|‘Œ }}}t        |«      dk(  sJ ‚|D ��cg c]  \  }}||j                   k7  sŒ||f‘Œ }}}t!        |«      }t        j                  |j"                  |d
z   |j$                  «      ||d   <   t'        |	|«       ||d } |S  |S c c}w c c}}w c c}}w )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                 óª   •— ‰j                  | j                  d«      }t        |t        j                  «      r|€|}n||k(  ry ‰||¬«      S |s|€| S |S )zeLookup definition of ``var``.
        Returns ``None`` if variable definition forms a cycle.
        N)r  )rŸ  rV  rš   r	   rc  )rø   Úvaronlyr  Úlookedup_varÚcyclic_lookupÚdefss       €€rh   r  z'get_reduce_nodes.<locals>.cyclic_lookup  s[   ø€ ð —x‘x §¡¨$Ó/ˆÜ�l¤B§F¡FÔ+Øˆ}Ø$‘Ø˜,Ò&àÙ  °UÔ;Ð;á" lÐ&:�3ÐMÀÐMrl   c                  ó2   •—  ‰| i |¤Ž}|€t        d«      ‚|S )zZSimilar to cyclic_lookup but raise AssertionError if a cycle is
        detected.
        zunexpected cycle in lookup())r�  )rw   Úkwargsr�  r  s      €rh   Únoncyclic_lookupz*get_reduce_nodes.<locals>.noncyclic_lookup(  s*   ø€ ñ ˜TÐ, VÑ,ˆØˆ;Ü Ð!?Ó@Ð@Øˆ
rl   c              3   óD   •K  — | ]  } ‰|d «      j                   –— Œ y­w©TNr½  )r  rí  r  s     €rh   r  z#get_reduce_nodes.<locals>.<genexpr>:  s&   øè ø€ ò 4Øñ +¨1¨dÓ3×8Õ8ñ 4ùs   ƒ 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  )rV  r  r1  rÌ  rÝ  rš   r	   rc  rÞ  rn  re  r‰   rË  r#  rü  Úget_expr_argsr¶  rÍ  rm  r(   )Úreduction_noderé  rª  rÕ  rV  r  r�   rŠ  rÙ  r  Úin_varsÚfoundjrÈ   Újstmtre   rw   rg   Únon_red_argsÚreplace_dictr  r  r  s                      @@@rh   rÙ  rÙ    sC  ú€ ð €LØ€DöNôð ×Ñ€DØ%×6Ñ6ÐÜ˜UÓ#ó H‰ˆˆ4Ø�k‰kˆØ�j‰jˆØˆˆS�X‰X‰Ü�cœ2Ÿ6™6Ô" s§x¡x°4Ñ'7Ù Ó$ˆCÜ�cœ2Ÿ7™7Õ#Üó 4Ø#&§=¡=£?ô4ó 4ˆGà�wŠð& ˜‘EœC ›JÒ&Ü$ U¨1¨q©5¡\´2·9±9Ô=Ø˜1˜q™5‘\×(Ñ(×9Ñ9Ð=MÒMØ!�Fä$-¨e°A¸±E°F¨mÓ$<ò 	"™˜˜5ô & e¬R¯Y©YÕ7¸E¿K¹KÈ3Ó<Nð &'¨¡U¨Q¡Y˜FÙ!ð	"ð Ð)ð "' v¨¨A© Ø!& v¨f°q©jÐ!9ñ":à!& q¨1¡u¨VÐ!4ñ"5ð "' v°¡z {Ð!3ñ"4˜ð
 ˜1™œs 5›zÒ)¬j¸¸qÀ¹s¹ÄRÇYÁYÔ.OØ! ! A¡#™J×-Ñ-×>Ñ>ÐBRÒRØ×0Ñ0Ð4DÒDÜ$Ø4Ð5EÐ4Hð I%ð %óð ô +¨3°Ô8Ü$Ð&BÐEUÑ&UØ&Nñ'Oó Qð Qô "/¨sÓ!3ö6Øð Ÿ™Ñ!1°!°TÓ!:Ò;ð 6�ð 6à15×I¡v¨¨1¸¿¹À4»¢ÐI�ÑIÜ˜<Ó(¨AÒ-Ð-Ð-Ø.2×C¡F Q¨°a¸1¿6¹6³k˜!˜QšÐC�ÑCÜ# D›z�Ü02·±°s·y±yÀ$ÀwÁ,ÐPS×PWÑPWÓ0X�˜\¨!™_Ñ-Ü" 3¨Ô5Ø$ Q R˜y�ØØÐðSHðR Ðùò6ùãIùãCs   È3LÉLÉ.LÊ
LÊ"Lc                 óÞ   — | j                   dv r| j                  | j                  gS | j                   dk(  r| j                  D �cg c]  }|‘Œ c}S t	        dj                  | «      «      ‚c c}w )z-
    Get arguments of an expression node
    )r  r  rÜ  zget arguments for expression {})rl  rÙ  r  rw   r�  r$  )rÁ  rí  s     rh   r  r  ~  sa   € ð ‡w�wÐ,Ñ,Ø—‘˜$Ÿ(™(Ð#Ð#Ø‡w�w�&ÒØŸ9™9Ö%�a’Ò%Ð%Ü
Ð?×FÑFÀtÓLÓ
MÐMùò &s   Á	A*c                 ó€  — | j                   D ]¯  }|d   dk(  sŒ|d   d   }t        t        |«      «      D ]3  }t        ||   t        j
                  «      sŒ!t        ||   ||«      ||<   Œ5 |d   d   }t        t        |«      «      D ]3  }t        ||   t        j
                  «      sŒ!t        ||   ||«      ||<   Œ5 Œ± y )Nr   r-  rƒ   )ry  ru   r‰   rš   r	   rc  r*   )r‡   ÚcallbackÚcbdatar  Úleft_lengthsr�   Úright_lengthss          rh   Úvisit_parfor_pattern_varsr  ˆ  sÐ   € à—?‘?ò NˆØ�1‰:˜Ó"Ø" 1™: a™=ˆLÜœ3˜|Ó,Ó-ò N�Ü˜l¨1™o¬r¯v©vÕ6Ü&6°|ÀA±Ø<DÀfó'N�L ’OðNð $ A™J q™MˆMÜœ3˜}Ó-Ó.ò N�Ü˜m¨AÑ.´·±Õ7Ü'7¸ÀaÑ8HØ<DÀfó(N�M !Ò$ñNñNrl   c                 óÞ  — t         j                  dk\  r/t        d| «       t        dt        |j	                  «       «      «       | j
                  D ]ß  }t        |j                  ||«      |_        t        |j                  t        j                  «      rt        |j                  ||«      |_	        t        |j                  t        j                  «      rt        |j                  ||«      |_        t        |j                  t        j                  «      sŒÄt        |j                  ||«      |_        Œá t        d| j                  i||«       t!        | ||«       t        | j"                  ||«       y )Nrƒ   zvisiting parfor vars for:zcbdata: r  )r   r  rd   rš  rˆ  rs  r*   r[  rš   r  r	   rc  r   r  r)   rt  r  ru  )r‡   r  r  rf   s       rh   Úvisit_vars_parforr  —  s
  € Ü×Ñ Ò"ÜÐ)¨6Ô2Üˆjœ& §¡£Ó0Ô1Ø×Ñò @ˆÜ+¨A×,<Ñ,<¸hÈÓOˆÔÜ�a—g‘gœrŸv™vÔ&Ü& q§w¡w°¸&ÓAˆAŒGÜ�a—f‘fœbŸf™fÔ%Ü% a§f¡f¨h¸Ó?ˆAŒFÜ�a—f‘fœbŸf™fÕ%Ü% a§f¡f¨h¸Ó?ˆA�Fð@ô ��F×%Ñ%Ð&¨°&Ô9Ü˜f h°Ô7Üˆv×Ñ ¨6Ô2Ø
rl   c                 ó”  — |€
t        «       }|€
t        «       }t        | «      }t        |«      \  }}t        |«      }t	        |j                  «       «      }t        | «       |j                  «       }|j                  «       |   }	|j                  «       j                  «       D ]  }
|	|
j                  z  }	Œ |D ]I  }||	v r,|j                  ||   |z
  «       |j                  ||   «       Œ3|j                  ||   |z
  «       ŒK | j                  D �ch c]=  }t        |j                  t         j"                  «      sŒ(|j                  j$                  ’Œ? }}|| j                  D �ch c]=  }t        |j&                  t         j"                  «      sŒ(|j&                  j$                  ’Œ? c}z  }|| j                  D �ch c]=  }t        |j(                  t         j"                  «      sŒ(|j(                  j$                  ’Œ? c}z  }|j                  ||z
  «       |t+        | «      z  }t-        j.                  ||¬«      S c c}w c c}w c c}w )zzlist variables written in this parfor by recursively
    calling compute_use_defs() on body and combining block defs.
    )rÕ  rÖ  )rn  r«  rK   rN   r§   ré  r®  r
  Ú
dominatorsr×  rç  r‰  r"  rs  rš   r  r	   rc  rV  r   r  Úget_parfor_pattern_varsr   Ú_use_defs_result)r‡   Úuse_setÚdef_setrÐ  Úusesr  ræ  rÐ  r
  Údefinitely_executedr‹  r×  rf   Ú	loop_varss                 rh   Úparfor_defsr!  ­  sü  € ð €Ü“%ˆØ€Ü“%ˆÜ Ó'€FÜ! &Ó)�J€Dˆ$Ü
! &Ó
)€CÜ�V—[‘[“]Ó#€JÜ˜Ô ð —‘Ó!€JàŸ.™.Ó*¨:Ñ6Ðà—	‘	“×"Ñ"Ó$ò )ˆØ˜tŸy™yÑ(Ñð)àò 	2ˆØÐ'Ñ'ð
 �N‰N˜4 ™;¨Ñ0Ô1Ø�N‰N˜4 ™;Õ'à�N‰N˜4 ™;¨Ñ0Õ1ð	2ð %×/Ñ/öØ´:Ø�G‰G”R—V‘Võ4ˆ�‰�‹ð€Ið ð Ø#×.Ñ.öØ´*Ø�F‰F”B—F‘Fõ3ˆ�‰�‹òñ €Ið Ø#×.Ñ.öØ´*Ø�F‰F”B—F‘Fõ3ˆ�‰�‹òñ €Ið ‡N�N�9˜wÑ&Ô'ØÔ& vÓ.Ñ.€Gä×$Ñ$¨G¸GÔDÐDùòùòùòs$   Ä)H;Ä<H;Å%)I ÆI Æ;)IÇ%Ic                 ó�   — |t        | j                  «      z  }t        | «      }|t        j                  |«      z  }t        | «       y)zx
    Reduction variables for parfors and the reduction variables within
    nested parfors must be stack allocated.
    N)rn  r{  r«  r   Úmust_use_allocar®  )r‡   Ú
alloca_setrÐ  s      rh   Ú_parfor_use_allocar%  ä  s>   € ð
 ”#�f—n‘nÓ%Ñ%€Jä Ó'€FØ”(×*Ñ*¨6Ó2Ñ2€Jä˜Õ rl   c                 ó<  — t        | «      }t        |«      }t        |«      }t        |||j                  |j
                  «      }t        ||||j
                  «      }| j                  D �ch c]=  }t        |j                  t        j                  «      sŒ(|j                  j                  ’Œ? }}|| j                  D �ch c]=  }t        |j                  t        j                  «      sŒ(|j                  j                  ’Œ? c}z  }|| j                  D �ch c]=  }t        |j                  t        j                  «      sŒ(|j                  j                  ’Œ? c}z  }|| j                  D �ch c]  }|j                  j                  ’Œ c}z  }t!        «       }	|j#                  «       D ]‚  }
|j$                  |
xx   |z  cc<   |j$                  |
xx   |z  cc<   |	|j$                  |
   z  }	|j&                  |
xx   |z  cc<   |j&                  |
xx   |z  cc<   |	|j&                  |
   z  }	Œ„  G d„ dt(        «      }t+        j,                   ||«      «      }|j/                  |j$                  |j&                  «       t1        | «       |	|z  S c c}w c c}w c c}w c c}w )z~insert dels in parfor. input: dead variable set right after parfor.
    returns the variables for which del was inserted.
    c                   ó   — e Zd Zd„ Zy)ú'parfor_insert_dels.<locals>.DummyFuncIRc                 ó   — || _         y r`   )rÐ  rÏ  s     rh   r]  z0parfor_insert_dels.<locals>.DummyFuncIR.__init__  s	   € Ø ˆD�Krl   N)ry   rz   r{   r]  rk   rl   rh   ÚDummyFuncIRr(    s   „ ó	!rl   r*  )r«  rN   rK   rL   rÕ  rÖ  rM   rs  rš   r  r	   rc  rV  r   r  r[  rn  ré  r  ÚescapingÚobjectr   ÚPostProcessorÚ_patch_var_delsr®  )r‡   Úcurr_dead_setrÐ  ræ  rç  rÑ  Údead_maprf   r   Údead_setr×  r*  Ú	post_procs                rh   Úparfor_insert_delsr3  ô  s?  € ô   Ó'€FÜ
! &Ó
)€CÜ˜vÓ&€GÜ  V¨W¯^©^¸W¿^¹^ÓL€HÜ   f¨h¸¿¹ÓG€Hð %×/Ñ/öØ´:Ø�G‰G”R—V‘Võ4ˆ�‰�‹ð€Ið ð Ø#×.Ñ.öØ´*Ø�F‰F”B—F‘Fõ3ˆ�‰�‹òñ €Ið Ø#×.Ñ.öØ´*Ø�F‰F”B—F‘Fõ3ˆ�‰�‹òñ €Ið °×1BÑ1BÖC¨A�!×"Ñ"×'Ó'ÒCÑC€Iô ‹u€HØ—‘“ò -ˆà×Ñ˜%Ó  MÑ1Ó Ø×Ñ˜%Ó  IÑ-Ó Ø�H×%Ñ% eÑ,Ñ,ˆØ×Ñ˜%Ó  MÑ1Ó Ø×Ñ˜%Ó  IÑ-Ó Ø�H×%Ñ% eÑ,Ñ,‰ð-ô!”fô !ô ×&Ñ&¡{°6Ó':Ó;€IØ×Ñ˜h×/Ñ/°×1BÑ1BÔCÜ˜Ô à�iÑÐùòAùòùòùò Ds*   Á*)J
ÂJ
Â=)JÃ'JÄ)JÄ=JÅ)Jc           	      ó°   — t        |«      \  }}t        || j                  || «      \  }}|j                  «       D ]  }d}	|	sŒt	        | |||||«      }	|	rŒŒ y)zm
    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�  r5  rÀ  r¿  Ú	alias_mapÚarg_aliasesr�  Úorder_changeds
             rh   r:  r:  %  ss   € ô
 # 6Ó*�M€J�Ü3Ø!'Ø!(×!2Ñ!2Ø!(Ø!(ó	Ñ€Iˆ{ð —‘“ò 
ˆØˆÚÜ1Ø 'Ø %Ø *Ø )Ø +Ø ,óˆMó ñ
rl   c                 óV  — d}d}|t        |j                  «      dz
  k  r‰|j                  |   }|j                  |dz      }	|rt        ||	| |||«      nt        |	|| |||«      }
|
r#|	|j                  |<   ||j                  |dz   <   d}|dz  }|t        |j                  «      dz
  k  rŒ‰|S )NFr   rË   rƒ   T)r‰   r‰  Ú_can_reorder_stmts)rª  r�  rÀ  r7  r8  r5  r9  r�   rŠ  r@  Úcan_reorders              rh   r6  r6  =  sÉ   € à€MØ	€Að Œc�%—*‘*‹o Ñ!Ò
!Ø�z‰z˜!‰}ˆØ—J‘J˜q ™s‘Oˆ	ñ (ô *¨$°	¸7Ø*4°iÀôNä-?À	È4Ø ¨Y¸ó.Eð 	ñ Ø%ˆE�J‰J�q‰MØ"ˆE�J‰J�q˜‘s‰OØ ˆMØ	ˆQ‰ˆð Œc�%—*‘*‹o Ñ!Ó
!ð Ðrl   c                 ó¤   — t        «       }| D ]@  }||v r|j                  ||   «      }||v r|j                  |«      }|j                  |«       ŒB |S r`   )rn  rê  rè  )Úthe_setr7  r8  Úretr�   s        rh   Úexpand_aliasesr@  Q  sY   € Ü
‹%€CØò ˆØ�	‰>Ø—)‘)˜I a™LÓ)ˆCØ�ÑØ—)‘)˜KÓ(ˆCØ�‰��
ðð €Jrl   c                 óŒ  — t        | t        «      �r)t        |t        «      �st        |t        j                  «      sþt        |t        j                  «      r:t        |j                  t        «       |«      st        t        ||j                  «      rªt        | j                  «       D �ch c]  }|j                  ’Œ c}||«      }t        t        | «      ||«      }t        |j                  «       D �ch c]  }|j                  ’Œ c}||«      }	t        t        |«      ||«      }
t        ||	z  |
|z  z  «      dk(  ryyc c}w c c}w )zw
    Check dependencies to determine if a parfor can be reordered in the IR block
    with a non-parfor statement.
    r   TF)rš   rh  r	   rM  rË  r6   rÝ  rn  r;   Úis_assert_equivr@  re  rV  Úget_parfor_writesr1   r‰   )rŠ  r@  rª  rÀ  r7  r8  rí  Ústmt_accessesÚstmt_writesÚnext_accessesÚnext_writess              rh   r;  r;  [  s	  € ô 	�4œÕ Ü˜9¤fÕ-Ü˜9¤b§h¡hÔ/Ü˜I¤r§y¡yÔ1Ü! )§/¡/´3³5¸*ÔEÜ”_ g¨y¯©Ô?Ü&¸¿¹Ó8HÖ'I°1¨¯«Ò'IØ'0°+ó?ˆä$Ô%6°tÓ%<Ø%.°ó=ˆä&¸	×8KÑ8KÓ8MÖ'N°1¨¯«Ò'NØ'0°+ó?ˆä$¤_°YÓ%?Ø%.°ó=ˆä�˜mÑ+Ø Ñ.ñ0ó 1Ø45ò6àØùò (Jùò (Os   Â(D<Ã1Ec                 ó*   — t        | |«      \  }}|dk(  S )NrX   )r9   )rª  rÁ  r4  r‡  s       rh   rB  rB  x  s   € Ü'¨°Ó6Ñ€IˆxØ˜Ñ&Ð&rl   c                 óf  — t        | t        «      sJ ‚t        «       }| j                  j	                  «       }| j
                  |d<   |j                  «       D ]X  }|j                  D ]G  }|j                  t        |«      «       t        |t        «      sŒ.|j                  t        |«      «       ŒI ŒZ |S r©  )rš   rh  rn  ru  rå  rt  rç  r‰  r"  r1   rC  )r‡   ÚwritesrÐ  r�  rŠ  s        rh   rC  rC  }  s˜   € Ü�fœfÔ%Ð%Ð%Ü‹U€FØ×Ñ×"Ñ"Ó$€FØ×"Ñ"€Fˆ2�JØ—‘“ò 7ˆØ—J‘Jò 	7ˆDØ�M‰Mœ/¨$Ó/Ô0Ü˜$¤Õ'Ø—‘Ô/°Ó5Õ6ñ	7ð7ð
 €Mrl   ÚFusionReport)ÚfirstÚsecondÚmessagec           
      ó0	  ‡ ‡‡‡— t        d|d|«       d}|j                  |j                  k7  r2t        d«       d}t        |j                  |j                  |«      }d|fS t	        |j
                  «      t	        |j
                  «      k7  r�t        d«       d}d}||j                  t	        |j
                  «      fz  }	||j                  t	        |j
                  «      fz  }
t        |j                  |j                  ||	|
fz  «      }d|fS t	        |j
                  «      }ˆ fd	„}ˆfd
„}t        |«      D �]-  }|j
                  |   }|j
                  |   } ||j                  |j                  «      r; ||j                  |j                  «      r ||j                  |j                  «      rŒzt        d|«       d}|d ||j                  «      ›d ||j                  «      ›d ||j                  «      ›d�z  }|d ||j                  «      ›d ||j                  «      ›d ||j                  «      ›d�z  }t        |j                  |j                  ||z  «      }d|fc S  t        |j                  «      |_        t        ||‰«      \  }}}}|st        ||‰|||«      d   }nd}|s|rKt        d«       d}t        |j                  |j                  ||j                  |j                  fz  «      }d|fS t        |j                  «      }t!        «       }|j"                  j%                  «       D ]  }||z  }Œ	 |t'        |«      z  }|t!        |j(                  «      z  }t        |j                  «      }t        d|j*                  i«      j,                  d   }|j,                  j%                  «       D ]  }||z  }Œ	 |j/                  |«      }t	        |«      dk7  r­t1        |j                  j%                  «       |j2                  j4                  |j7                  «       |«      \  }Šˆˆfd„|D «       }t9        |«      rKt        d«       d}t        |j                  |j                  ||j                  |j                  fz  «      }d|fS t;        ||«      S )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                 ó6   •— | |k(  xs ‰j                  | |«      S r`   )Úis_equiv)re   rg   rx  s     €rh   rQ  ztry_fuse.<locals>.is_equiv§  s   ø€ Ø�A‰vÒ1˜×+Ñ+¨A¨qÓ1Ð1rl   c                 ó‚   •— t        | t        j                  «      s| S | j                  } d‰v r| ‰d   v r
‰d   |    }|S | S )z.get original variable name by user if possibleÚvar_rename_map)rš   r	   rc  rV  )rí  Úuser_varnamerõ  s     €rh   Úget_user_varnamez"try_fuse.<locals>.get_user_varnameª  sO   ø€ ä˜!œRŸV™VÔ$ØˆHØ�F‰FˆØ˜xÑ'¨A°Ð:JÑ1KÑ,KØ#Ð$4Ñ5°aÑ8ˆLØÐØˆ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   óf   •K  — | ](  }t        ‰|   t        j                  «       xs |‰v –— Œ* y ­wr`   )rš   r   rM  )r  re   Úp2arraynotindexedr�  s     €€rh   r  ztry_fuse.<locals>.<genexpr>í  s4   øè ø€ ÒsÐfgœ* W¨Q¡Z´×1FÑ1FÓGÐGÒaÈ1ÐPaÐKaÓaÑsùs   ƒ.1z)try_fuse: parfor2 depends on parfor1 bodyzT- fusion failed: parallel loop %s has a dependency on the body of parallel loop %s. )Údprintr}  rK  rr  r‰   rs  ru   r  r   r  r@   rÐ  r7  Úhas_cross_iter_deprK   ru  rn  rÖ  rç  rC  r{  rt  rÕ  rá  rÍ  rv  rV  r†  r"  Úfuse_parfors_inner) rx  Úparfor1Úparfor2rõ  rª  r�  r�  r¤  r€  r‘  r’  rc  rQ  rU  r�   Únest1Únest2Úp1_cross_depÚp1_ipÚp1_iaÚ	p1_non_iaÚp2_cross_depÚp1_body_usedefsÚp1_body_defsr  Ú
p2_usedefsÚp2_usesr  Úoverlapr¿  Ú
unsafe_varrW  s    `  ` `                         @rh   r=  r=  ‹  s1  û€ ô Ð(¨'°4¸ÔAð €Fð ‡�˜'Ÿ/™/Ò)ÜÐ5Ô6Ø1ˆÜ˜gŸj™j¨'¯*©*°cÓ:ˆØ�Vˆ|Ðô ˆ7×ÑÓ¤# g×&8Ñ&8Ó"9Ò9ÜÐ@ÔAØDˆØ8ˆØ�G—J‘J¤ G×$6Ñ$6Ó 7Ð8Ñ8ˆØ�G—J‘J¤ G×$6Ñ$6Ó 7Ð8Ñ8ˆÜ˜gŸj™j¨'¯*©*°c¸RÀ¸H±nÓEˆØ�Vˆ|Ðä�×"Ñ"Ó#€Eô2ôô �5‹\ó  ˆØ×"Ñ" 1Ñ%ˆØ×"Ñ" 1Ñ%ˆÙ˜Ÿ™ e§k¡kÔ2Ù˜Ÿ™ U§Z¡ZÔ0Ù˜Ÿ™ U§Z¡ZÕ0ÜÐDÀaÔHØKˆCÙÑ.>¸u¿{¹{Õ.KÙ  §¡Õ,Ñ.>¸u¿z¹zÕ.JðLñ LˆCáÑ*:¸5¿;¹;Õ*GÙ  §¡Õ,Ñ.>¸u¿z¹zÕ.JðLñ LˆCä! '§*¡*¨g¯j©j¸#À¹'ÓBˆFØ˜�<Òð ô -¨W¯^©^Ó<€GÔÜ,>¸wÈÐQXÓ,YÑ)€L�%˜ 	ÙÜ)¨'°7¸GÀUÈEÐS\Ó]Ð^_Ñ`‰àˆá‘|ÜÐBÔCð,ˆä˜gŸj™j¨'¯*©*Ø # w§z¡z°7·:±:Ð&>Ñ >ó@ˆà�Vˆ|Ðô
 ' w×'8Ñ'8Ó9€OÜ“5€LØ×&Ñ&×-Ñ-Ó/ò ˆØ˜Ñ‰ðàÔ% gÓ.Ñ.€Lð ”C˜Ÿ™Ó(Ñ(€Lä! '×"3Ñ"3Ó4€JÜ  7×#5Ñ#5Ð6Ó7×>Ñ>¸qÑA€GØ×!Ñ!×(Ñ(Ó*ò ˆØ�4‰‰ðð ×'Ñ'¨Ó0€Gä
ˆ7ƒ|�qÒäBØ×Ñ×$Ñ$Ó&Ø×Ñ×"Ñ"Ø×&Ñ&Ó(Øó	 ÑˆÐô tÐkrÔsˆ
äˆzŒ?ÜÐ>Ô?ð1ˆCä! '§*¡*¨g¯j©jØ$'¨7¯:©:°w·z±zÐ*BÑ$BóDˆFà˜�<Ðä˜g wÓ/Ð/rl   c                 ó’  — | j                   j                  j                  |j                   j                  «       t        |j                  j                  «       «      }|j                  |   j                  }t        | j                  j                  «       «      }t        | j                  j                  «       «      }| j                  |   j                  j                  |«       | j                  j                  |j                  «       | j                  j                  |«       t        | j                  «      }|j                  j                  | j                  i}t        |«      D ]?  }| j                  |   j                  ||j                  |   j                  j                  <   ŒA t        | j                  |«       t!        | |¬«      }	t#        |	«      }	t%        | |	«       t'        d„ |j)                  «       D «       «      }
t+        | j                  |
«       | j,                  j                  |j,                  «       t.        j0                  r/t3        dj5                  |j6                  | j6                  «      «       d}|j5                  |j6                  | j6                  «      }t9        | j6                  |j6                  |«      }| |fS )N)Úentry_labelc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr`   r½  r¾  s     rh   r  z%fuse_parfors_inner.<locals>.<genexpr>  s   è ø€ Ò6˜Q�!—&•&Ñ6ùr¿  z1Parallel for-loop #{} is fused into for-loop #{}.zE- fusion succeeded: parallel for-loop #{} is fused into for-loop #{}.)rt  r‰  rÿ  r“   ru  ré  r§   r"  rÊ  r‰   rs  rv  rV  ru   r[  r'   r«  r2   r®  rn  rç  Úremove_duplicate_definitionsry  r   r~  rd   r$  rr  rK  )r[  r\  Úparfor2_first_labelÚparfor2_first_blockÚparfor1_first_labelÚparfor1_last_labelrc  Ú
index_dictr�   rÐ  Únamesetr¤  r�  s                rh   rZ  rZ  ú  sA  € ð ×Ñ×Ñ×"Ñ" 7×#5Ñ#5×#:Ñ#:Ô;ô ˜g×/Ñ/×4Ñ4Ó6Ó7ÐØ!×+Ñ+Ð,?Ñ@×EÑEÐÜ˜g×/Ñ/×4Ñ4Ó6Ó7ÐÜ˜W×.Ñ.×3Ñ3Ó5Ó6ÐØ×ÑÐ(Ñ)×.Ñ.×5Ñ5Ð6IÔJð ×Ñ×Ñ˜W×.Ñ.Ô/Ø×Ñ×ÑÐ-Ô.ô �×"Ñ"Ó#€EØ×#Ñ#×(Ñ(¨'×*;Ñ*;Ð<€JÜ�5‹\ò ˆØ@G×@RÑ@RØñAß‰~ð 	�7×%Ñ% aÑ(×7Ñ7×<Ñ<Ò=ðô �×"Ñ" JÔ/ô   Ð5HÔI€FÜ˜6Ó"€FÜ˜ &Ô)äÑ6 *×"3Ñ"3Ó"5Ô6Ó6€GÜ  ×!2Ñ!2°GÔ<Ø×Ñ×Ñ˜G×,Ñ,Ô-Ü×#Ò#ÜÐA×HÑHØ�j‰j˜'Ÿ*™*ó&ô 	'ð R€CØ
�*‰*�W—Z‘Z §¡Ó
,€CÜ˜'Ÿ*™* g§j¡j°#Ó6€Fà�Fˆ?Ðrl   c                 ó6  — | j                  «       D ]†  \  }}|j                  }g }t        «       }|D ]]  }t        |t        j
                  «      r0|j                  j                  }||v r||v rŒ<|j                  |«       |j                  |«       Œ_ ||_        Œˆ y)zsRemove duplicated definition for variables in the given nameset, which
    is often a result of parfor fusion.
    N)
rˆ  r‰  rn  rš   r	   rË  rÌ  rV  rè  rb  )	rÐ  rs  r×  r�  r‰  r  Údefinedrâ  rV  s	            rh   rm  rm  %  s•   € ð Ÿ™›ò ‰ˆˆuØ�z‰zˆØˆÜ“%ˆØò 	"ˆDÜ˜$¤§	¡	Ô*Ø—{‘{×'Ñ'�Ø˜7‘?Ø˜w‘Ø Ø—K‘K Ô%Ø�O‰O˜DÕ!ð	"ð ˆ�
ðð rl   c                 ó   ‡‡‡‡— | j                   D �ch c]  }|j                  j                  ’Œ c}Št        «       }|€i }|€
t        «       }|€
t        «       }d„ Šˆˆˆˆfd„}| j                  j                  «       D �]é  }	|	j                  D �]Ö  }
t        |
t        j                  t        j                  f«      rqt        ‰|
j                  j                     t        j                  j                  «      r5 ||
j                  |
j                  j                  ||||«      r
d|||fc c S ŒŸt        |
t        j                   «      sŒºt        |
j"                  t        j$                  «      r@|
j"                  j                  ‰v sŒ÷‰j'                  |
j                  j                  «       �Œt        |
j"                  t        j(                  «      s�ŒD|
j"                  j*                  }|dv r�t        ‰|
j"                  j"                  j                     t        j                  j                  «      rI ||
j"                  j                  |
j"                  j"                  j                  ||||«      r
d|||fc c S �Œî|dk(  rjt-        |
j"                  j/                  «       D �cg c]3  }t        ‰|j                     t        j                  j                  «      ‘Œ5 c}«      r
d|||fc c S |
j"                  j/                  «       D �cg c]  }|j                  ‘Œ }}‰j1                  |«      r|j1                  |«      r�Œ²|j'                  |
j                  j                  «       �ŒÙ �Œì d|||fS c c}w c c}w c c}w )Nc                 óÔ   — t        | t        «      rt        | «      } d| vr||v ry|j                  |«       y||v ry|j                  |«       t	        | «      }||vr| ||<   y||   | k7  S )aA  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¹  r  rè  r‰   )Únew_positionÚarray_accessedÚindex_positionsÚindexed_arraysÚnon_indexed_arraysÚnpsizes         rh   Úadd_check_positionz.has_cross_iter_dep.<locals>.add_check_positiono  s‘   € ô �l¤DÔ)Ü  Ó.ˆLð �|Ñ#ð  Ñ/Øð #×&Ñ& ~Ô6Øð
 Ð/Ñ/Øà×Ñ˜>Ô*ä�\Ó"ˆà˜Ñ(ð '3ˆO˜FÑ#Øð ˜vÑ&¨,Ñ6Ð6rl   c                 óò  •— t        | t        j                  «      rÒt        ‰| j                     t        j
                  «      rvt        t        ‰| «      }|�b|\  }}t        |D �	cg c]   }	|	j                  ‰v xs |	j                  |v‘Œ" c}	«      r'|D �	cg c]  }	|	j                  ‰v ‘Œ }
}	 ‰|
||||«      S yy| j                  ‰v r ‰d||||«      S | j                  |v ry ‰d||||«      S yc c}	w c c}	w )zÅLooks 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	   rc  rV  r   r   r;   r:   Úallr   ÚInternalError)Ú
stmt_indexry  rz  r{  r|  Úderived_from_indicesÚfbs_resÚind_seqr¿  re   Únew_index_positionsr~  rª  rÄ  r�  s              €€€€rh   Úcheck_indexz'has_cross_iter_dep.<locals>.check_index¡  sH  ø€ ô �j¤"§&¡&Ô)ä˜' *§/¡/Ñ2´E·O±OÔDäÔ 3°W¸jÓI�ØÐ&Ø!(‘J�G˜Qô ØDKöMØ?@ð ŸV™V wÐ.ò ;ØŸ™Ð&:Ð:ñ;ò Mô Nð KRÖ.RÀQ¨q¯v©v¸Ò/@Ð.RÐ+Ð.Rñ  2Ð2EØ2@Ø2AØ2@Ø2Dó	 Fð Fð  $ð  ð —?‘? gÑ-ñ .¨gØ.<Ø.=Ø.<Ø.@ó	Bð Bð
  —_‘_Ð(<Ñ<ð  ñ
 .¨hØ.<Ø.=Ø.<Ø.@ó	Bð Bð ùòWMùò /Ss   Á$%C/ÂC4TrÀ  rÜ  F)rs  r[  rV  rn  ru  rç  r‰  rš   r	   r  r?  rÌ  r   rÌ   rÍ   r¯   rË  rÝ  rc  rè  rÞ  rl  r"  re  Ú
isdisjoint)r‡   rª  r�  rz  r{  r|  rf   r…  r‰  r¼   rŠ  rl  re   Úrhs_varsr~  rÄ  s    ``           @@rh   rY  rY  9  sÛ  û€ ð( /5×.?Ñ.?Ö@¨ˆq×Ñ×$Ó$Ò@€Gô
 ›5Ðð, ÐØˆØÐÜ›ˆØÐ!Ü ›UÐò07÷dDJðN ×Ñ×$Ñ$Ó&ó 6CˆØ—F‘Fó 5	CˆDä˜$¤§¡¬R×-=Ñ-=Ð >Ô?Ü˜g d§k¡k×&6Ñ&6Ñ7¼¿¹×9MÑ9MÔNá" 4§:¡:Ø#'§;¡;×#3Ñ#3Ø#2Ø#1Ø#5Ø#7ô9ð  $ _°nÐFXÐXÔXàÜ˜D¤"§)¡)Õ,ô ˜dŸj™j¬"¯&©&Ô1Ø—z‘z—‘¨'Ò1ØŸ™ D§K¡K×$4Ñ$4Ô5Ù Ü §
¡
¬B¯G©GÖ4ØŸ™Ÿ™�BàÐ:Ñ:Ü% g¨d¯j©j×.>Ñ.>×.CÑ.CÑ&DÄeÇnÁn×FZÑFZÔ[á*¨4¯:©:×+;Ñ+;Ø+/¯:©:×+;Ñ+;×+@Ñ+@Ø+:Ø+9Ø+=Ø+?ô Að (,¨_¸nÐN`Ð'`Ô `á Ø˜všô  Ø%)§Z¡Z×%9Ñ%9Ó%;ö!=Ø !ô ",¨G°A·F±F©O¼U¿^¹^×=QÑ=QÕ!Rò !=ô >à#'¨¸.ÐJ\Ð#\Ô\ð 15·
±
×0DÑ0DÓ0FÖG¨1 §£ÐG�HÐGð $×.Ñ.¨xÔ8Ø0×;Ñ;¸HÖEØ,×0Ñ0°·±×1AÑ1AÖBòk5	Cð6Cðp �/ >Ð3EÐEÐEùòg AùòH!=ùò
  Hs   “M1Ê"8M6ÌM;c                  ó<   — t         j                  dk\  r	t        | Ž  y y r  )r   r  rd   )r¾   s    rh   rX  rX  #  s   € Ü×Ñ Ò"ÜˆqŠ	ð #rl   c                 óî   — t        «       }| j                  D ][  }|d   dk(  sŒ|d   d   }|d   d   }||z   D ]8  }t        |t        j                  «      sŒ|j                  |j                  «       Œ: Œ] |S )z: get the variables used in parfor pattern information
    r   r-  rƒ   )rn  ry  rš   r	   rc  rè  rV  )r‡   Úoutr  r  r  rí  s         rh   r  r  '  s|   € ô ‹%€Cà—?‘?ò $ˆØ�1‰:˜Ó"Ø" 1™: a™=ˆLØ# A™J q™MˆMØ! -Ñ/ò $�Ü˜a¤§¡Õ(Ø—G‘G˜AŸF™F•Oñ$ð	$ð €Jrl   c                 ó¼	  — t        | j                  «      5  t        | j                  «      }ddd«       d   }i }	t        | j                  |   j                  | j
                  ||	|«       t        |	j                  «       «      }
|D ]ó  }||k(  rŒ	| j                  |   j                  D ]Ï  }t        |t        j                  «      rut        |j                  t        j                  «      rQ|j                  j                  dk(  r8|j                  j                  j                  | j
                  j                  k(  rŒ’t        d„ |j!                  «       D «       «      }||
z  }|D ]  }|	j#                  |d«       Œ ŒÑ Œõ |D ]J  }||k(  rŒ	| j                  |   }|	j%                  «       }t        |j                  | j
                  |||«       ŒL | j                  j%                  «       }t'        |j                  «       «      }t)        |||«      \  }}t        j*                  |t        j,                  dd«      «      }||   j                  j/                  |«       t1        |«      }t3        |«      }t5        |||j6                  |j8                  «      }t        |j                  «       «      }|j;                  «       D �]b  \  }}g }|j<                  j!                  «       D �ch c]  }|j                  ’Œ }}|j?                  |«      D ]  \  }} |||   z  }Œ tA        |j                  «      D ]Ù  }||z  }!|!D ]
  }|||   z  }Œ t        |t        jB                  t        jD                  f«      r]tG        |«      j                  | j
                  j                  k(  r1|jH                  j                  |vr|jH                  j                  |vrŒž||j!                  «       D �ch c]  }|j                  ’Œ c}z  }|j/                  |«       ŒÛ |jK                  «        ||_        �Œe |j#                  |j                  «       ||   j                  j#                  «        	 tM        | |||||«       tO        | jP                  j                  «      dk(  }"| j                  jS                  «       D ]  }|"tO        |j                  «      dk(  z  }"Œ |"ry| S # 1 sw Y   �Œ�xY wc c}w c c}w )z7 remove dead code inside parfor including get/sets
    Nr   r  c              3   ó4   K  — | ]  }|j                   –— Œ y ­wr`   r½  )r  rí  s     rh   r  z%remove_dead_parfor.<locals>.<genexpr>S  s   è ø€ Ò< a˜1Ÿ6�6Ñ<ùr¿  Úparfors_dummyr  )*r  ru  r0   Ú_update_parfor_get_setitemsr‰  rv  rn  ré  rš   r	   rË  rÝ  rÞ  rl  r¯   rV  re  rÊ  rå  r§   Ú_add_liveness_return_blockrP  ÚLocrb  rN   rK   rL   rÕ  rÖ  rˆ  Ú
terminatorÚ
successorsr  r?  r  r5  rÌ  r  Úremove_dead_parfor_recursiver‰   rt  rç  )#r‡   ÚlivesÚlives_n_aliasesr8  r7  rª  r�  rû  r  Úfirst_block_saved_valuesÚ
saved_arrsrf   rŠ  ÚvarnamesÚrm_arrsr»   r�  Úsaved_valuesrÐ  rÐ  Úreturn_labelrd  Újumpræ  rç  rÑ  Ú	alias_setr×  r  rí  Úin_livesÚout_blkÚ_dataÚalias_livesÚis_emptys#                                      rh   Úremove_dead_parforr§  5  s]  € ô 
# 6×#3Ñ#3Ó	4ñ 3Ü  ×!1Ñ!1Ó2ˆ÷3ð ˜‘)€KØ!ÐÜØ×Ñ˜Ñ%×*Ñ*Ø×Ñ˜)Ø Øô	
ô Ð-×2Ñ2Ó4Ó5€JØò 6ˆØ�ÒØØ×$Ñ$ QÑ'×,Ñ,ò 	6ˆDÜ˜4¤§¡Ô+´
¸4¿:¹:ÄrÇwÁwÔ0OØŸ
™
Ÿ™¨Ò2ØŸ
™
×(Ñ(×-Ñ-°×1AÑ1A×1FÑ1FÒFØÜÑ<¨4¯>©>Ó+;Ô<Ó<ˆHØ Ñ+ˆGØò 6�Ø(×,Ñ,¨Q°Õ5ñ6ñ	6ð6ð  ò GˆØ�ÒØØ× Ñ  Ñ#ˆØ/×4Ñ4Ó6ˆÜ# E§J¡J°×0@Ñ0@À)Ø(4°oõ	GðGð ×Ñ×"Ñ"Ó$€FÜ�V—[‘[“]Ó#€JÜ8¸ÀÐRYÓZÑ€L�)ä�7‰7�<¤§¡¨¸Ó!<Ó=€DØ
ˆ:Ñ×Ñ×"Ñ" 4Ô(Ü
! &Ó
)€CÜ˜vÓ&€GÜ  V¨W¯^©^¸W¿^¹^ÓL€HÜ�I—N‘NÓ$Ó%€IàŸ™›ó ‰ˆˆuØˆØ$)×$4Ñ$4×$>Ñ$>Ó$@ÖA˜q�A—F“FÐAˆÐAà!Ÿn™n¨UÓ3ò 	*‰NˆG�UØ˜ Ñ)Ñ)‰Hð	*ä˜UŸZ™ZÓ(ò 	"ˆDà" YÑ.ˆKØ ò )�Ø˜I a™LÑ(‘ð)ä˜4¤"×"2Ñ"2´B·J±JÐ!?Ô@Ü˜dÓ#×(Ñ(¨F×,<Ñ,<×,AÑ,AÒAØ—‘× Ñ ¨Ñ0Ø—‘× Ñ ¨Ñ3ØØ¨¯©Ó)9Ö: A˜Ÿ›Ò:Ñ:ˆHØ�O‰O˜DÕ!ð	"ð 	×ÑÔØˆŽ
ð'ð* ‡K�K�	—‘ÔØ
ˆ:Ñ×Ñ×ÑÔ!ðô !Ø��{ I¨w¸ôAô �6×$Ñ$×)Ñ)Ó*¨aÑ/€HØ×!Ñ!×(Ñ(Ó*ò )ˆØ”C˜Ÿ
™
“O qÑ(Ñ(‰ð)áØØ€M÷A3ñ 3üòr Bùò ;s   –SËSÏS
ÓSc                 ó  — | D �]ù  }t        |t        j                  t        j                  f«      r›t	        |«      j
                  |j
                  k(  ry|j                  j
                  |vra|j                  |j                  j
                  g «      D ]  }|j                  |d«       Œ |j                  ||j                  j
                  <   ŒÉt        |t        j                  «      r³t        |j                  t        j                  «      r�|j                  }|j                  dk(  rtt        |j                  t        j                  «      rP|j                  j
                  |j
                  k(  r-|j                  |j                  j
                  |«      |_	        �Œ–|j                  «       D ]Q  }|j                  |j
                  d«       |j                  |j
                  g «      D ]  }|j                  |d«       Œ ŒS �Œü y)zS
    replace getitems of a previously set array in a block of parfor loop body
    Nr  )rš   r	   r?  r  r5  rV  rÌ  rŸ  rÊ  rÝ  rË  rÞ  rl  r¯   rc  re  )	Ú
block_bodyrv  r7  rž  r˜  rŠ  Úwr  rí  s	            rh   r’  r’  ›  s}  € ð
 ó *ˆÜ�tœb×.Ñ.´·
±
Ð;Ô<Ü˜$Ó×$Ñ$¨	¯©Ò6Ø�K‰K×Ñ EÑ)à—]‘] 4§;¡;×#3Ñ#3°RÓ8ò *�Ø× Ñ   DÕ)ð*ð .2¯Z©ZˆL˜Ÿ™×)Ñ)Ñ*ØÜ�dœBŸI™IÔ&¬:°d·j±jÄ"Ç'Á'Ô+JØ—*‘*ˆCØ�v‰v˜Ò"¤z°#·)±)¼R¿V¹VÔ'DØ—9‘9—>‘> Y§^¡^Ò3à!-×!1Ñ!1°#·)±)·.±.À#Ó!F�D”JÙð —‘Ó!ò 	*ˆAØ×Ñ˜QŸV™V TÔ*à—]‘] 1§6¡6¨2Ó.ò *�Ø× Ñ   DÕ)ñ*ò	*ð)*ð4 rl   c           	      ó”  — | j                   j                  «       }t        |j                  «       «      }|dkD  sJ ‚t	        |j                  «       «      }	 t        |||«      \  }	}
||   j                  }t        j                  |t        d«      t        j                  dd«      «      }t        j                  ||j                  <   t        j                  |||	t        j                  dd«      «      }||   j                  j!                  |«       | j"                  |d<   |d   j                  j!                  t        j$                  |t        j                  dd«      «      «       t'        ||||||«       |j)                  |
j                  «       |d   j                  j)                  «        ||   j                  j)                  «        y)zIcreate a dummy function from parfor and call remove dead recursively
    r   z$branchcondr‘  r  N)ru  rå  r“   ré  r§   r“  rÍ  r	   rc  r    r”  r   ÚbooleanrV  rO  r‰  rb  rt  rP  r+   rÊ  )r‡   r˜  r8  r7  rª  r�  rÐ  rù  rÐ  rŸ  rd  rÍ  Ú
branchcondÚbranchs                 rh   r—  r—  ¿  sr  € ð ×Ñ×"Ñ"Ó$€FÜ˜6Ÿ;™;›=Ó)ÐØ˜aÒÐÐÜ�V—[‘[“]Ó#€Jð
ô 9¸ÀÈÓPÑ€L�)ð �:Ñ×$Ñ$€Eä—‘˜œ}¨]Ó;¼R¿V¹VÀOÐUWÓ=XÓY€JÜ$Ÿ}™}€GˆJ�O‰OÑä�Y‰Y�zÐ#3°\Ä2Ç6Á6È/Ð[]ÓC^Ó_€FØ
ˆ:Ñ×Ñ×"Ñ" 6Ô*ð ×!Ñ!€Fˆ1�IØ
ˆ1�I‡N�N×Ñœ"Ÿ'™'Ð"2´B·F±F¸?ÈBÓ4OÓPÔQô �˜ W¨g°yÀ+ÔNØ‡K�K�	—‘ÔØ
ˆ1�I‡N�N×ÑÔØ
ˆ:Ñ×Ñ×ÑÔ!Ø
rl   c                 óÆ  — t        | j                  «       «      }|dz   }| |   j                  }| |   j                  }t	        j
                  ||«      | |<   t	        j                  |t        d«      |«      }t        j                  j                  t        j                  d«      ||j                  <   |D �cg c]  }t	        j                  |||«      ‘Œ }	}t        j                  j                  |	|«      }
| |   j                  j!                  t	        j"                  |
||«      «       | |   j                  j!                  t	        j$                  ||«      «       ||fS c c}w )Nrƒ   z
$tuple_varrË   )r§   ré  rm  rÍ  r	   r  rc  r    r   r^  r_  rN  rV  rÞ  r`  r‰  rb  rË  ÚReturn)rÐ  r˜  r�  rÐ  rŸ  rm  rÍ  rd  rí  rÎ  re  s              rh   r“  r“  é  s!  € Ü�V—[‘[“]Ó#€JØ ‘>€Là
�Ñ
×
 Ñ
 €CØ�:Ñ×$Ñ$€EÜŸ8™8 E¨3Ó/€Fˆ<Ñô —‘�uœm¨LÓ9¸3Ó?€Iä#×.Ñ.×7Ñ7Ü�‰�Qó€GˆI�N‰NÑà05Ö6¨1”—‘˜˜q #Õ&Ð6€IÐ6Ü—‘×$Ñ$ Y°Ó4€JØ
ˆ<Ñ×Ñ×$Ñ$¤R§Y¡Y¨z¸9ÀcÓ%JÔKØ
ˆ<Ñ×Ñ×$Ñ$¤R§Y¡Y¨y¸#Ó%>Ô?Ø˜Ð"Ð"ùò	 7s   Â5Ec                 ód   — t        | «      }t        j                  ||||||«       t        | «       y r`   )r«  r   rH   r®  )r‡   rw   r�  rª  r7  r8  rÐ  s          rh   Úfind_potential_aliases_parforr²  ý  s3   € Ü Ó'€FÜ×#Ñ#Ø��g˜w¨	°;ô@ä˜Ô Ø
rl   c           
      óJ  — d}| j                  «       D �]Œ  }|j                  D �]y  }t        |t        «      sŒ|dz  }|}|j                  t        |j                  j                  «       «         }|j                  }t        j                  dd«      }t        j                  |t        d«      |«      }|j                  j                  t        j                  t        j                  d|«      ||«      «       |j                  j                  t        j                  ||«      «       t!        |j                  «      |_        |j                  t        |j                  j                  «       «         }|j                  j#                  «        t%        |j                  «       �Œ| �Œ� |S )z%simplify CFG of body loops in parforsr   rƒ   r‘  r  ú$const)rç  r‰  rš   rh  ru  r§   ré  rÍ  r	   r”  rc  r    rb  rË  rÒ  r°  r5   rÊ  r6  )	rÐ  r�  r�  rŠ  r‡   Ú
last_blockrÍ  rm  Úconsts	            rh   r6  r6    sC  € à€IØ—‘“ó ;ˆØ—J‘Jó 	;ˆDÜ˜$¤Õ'Ø˜Q‘�	Ø�ð $×-Ñ-¬c°&×2BÑ2B×2GÑ2GÓ2IÓ.JÑK�
Ø"×(Ñ(�Ü—f‘f˜_¨bÓ1�ÜŸ™˜u¤m°HÓ&=¸sÓC�Ø—‘×&Ñ&¤r§y¡y´·±¸!¸SÓ1AÀ5È#Ó'NÔOØ—‘×&Ñ&¤r§y¡y°¸Ó'<Ô=Ü#/°×0@Ñ0@Ó#A�Ô Ø#×-Ñ-¬c°&×2BÑ2B×2GÑ2GÓ2IÓ.JÑK�
Ø—‘×#Ñ#Ô%ä(¨×)9Ñ)9Ö:ò!	;ð;ð$ Ðrl   c                 ó  — | j                   j                  «       }|€t        |j                  «       «      }|dkD  sJ ‚| j                  |d<   |d   j
                  j                  t        j                  ||d   j                  «      «       |j                  «       D ]m  }t        |j
                  «      dk(  s|j
                  d   j                  rŒ5|j
                  j                  t        j                  ||j                  «      «       Œo |S )z5wrap parfor blocks for analysis/optimization like CFGr   r  )ru  rå  r“   ré  rt  r‰  rb  r	   rP  rm  rç  r‰   Úis_terminator)r‡   rk  rÐ  r�  s       rh   r«  r«    sÏ   € à×Ñ×"Ñ"Ó$€FØÐÜ˜&Ÿ+™+›-Ó(ˆØ˜Š?Ðˆ?ð ×!Ñ!€Fˆ1�IØ
ˆ1�I‡N�N×Ñœ"Ÿ'™' +¨v°a©y¯}©}Ó=Ô>Ø—‘“ò ?ˆÜˆu�z‰z‹?˜aÒ¨¯
©
°2©×(DÓ(DØ�J‰J×ÑœbŸg™g k°5·9±9Ó=Õ>ð?ð €Mrl   c                 óZ  — |�1t        |j                  «       «      }|j                  |«       || _        t        | j                  j                  «       «      }t	        | j
                  j                  d   t        j                  «      sJ ‚| j
                  j                  j                  «        | j                  j                  «       D ]a  }t	        |j                  d   t        j                  «      sŒ+|j                  d   j                  |k(  sŒH|j                  j                  «        Œc y)zb
    unwrap parfor blocks after analysis/optimization.
    Allows changes to the parfor loop.
    Nr  )r“   ré  rÊ  ru  rš   rt  r‰  r	   rP  rç  rÌ  )r‡   rÐ  Úinit_block_labelrü  r�  s        rh   r®  r®  .  së   € ð
 Ðä˜vŸ{™{›}Ó-Ðà�
‰
Ð#Ô$Ø!ˆÔô ˜6×+Ñ+×0Ñ0Ó2Ó3ÐÜ�f×'Ñ'×,Ñ,¨RÑ0´"·'±'Ô:Ð:Ð:ð ×Ñ×Ñ×ÑÔ ð ×!Ñ!×(Ñ(Ó*ò ˆÜ�u—z‘z "‘~¤r§w¡wÕ/Ø�J‰J�r‰N×!Ñ!Ð%5Ó5à�J‰J�N‰NÕð	ð
 rl   c                 óª  — t        | «      }t        ||«      \  }}t        ||«      \  }}t        | «       |d   }| j                  j                  «       D ]%  }|||   D �	�
ch c]  \  }	}
|	’Œ	 c}
}	z  }|||   z  }Œ' t        | j                  j                  «       «      }||   |d   z  }t        j                  dk\  rt        d|d|«       ||fS c c}
}	w )z&find copies generated/killed by parforr   rƒ   zcopy propagate parfor gens:Úkill_set)
r«  r,   r-   r®  ru  ré  r§   r   r  rd   )r‡   r�  rÐ  Úin_copies_parforÚout_copies_parforÚin_gen_copiesÚin_extra_killr¼  r×  rf   r3  rÐ  Úgenss                rh   Úget_copies_parforrÂ  J  sê   € ä Ó'€FÜ*8¸ÀÓ*IÑ'ÐÐ'Ü#3°F¸GÓ#DÑ €M�=Ü˜Ô ð ˜QÑ€HØ×!Ñ!×&Ñ&Ó(ò )ˆØ =°Ñ#7×8™4˜1˜a’QÓ8Ñ8ˆØ�M %Ñ(Ñ(‰ð)ô
 �V×%Ñ%×*Ñ*Ó,Ó-€JØ˜ZÑ(¨=¸Ñ+;Ñ;€Dä×Ñ Ò"ÜÐ+¨T°:¸xÔHØ�ˆ>Ðùó 9s   Á C
c                 óâ  — t        | j                  «      D ],  \  }}|d   dk(  sŒdt        |d   |«      f| j                  |<   Œ. | j                  D ]S  }t        |j                  |«      |_        t        |j
                  |«      |_        t        |j                  |«      |_        ŒU t        | «      }	g }
|j                  «       D ]B  \  }}|
j                  t        j                  |||   t        j                  dd«      «      «       ŒD |
|	d   j                  z   |	d   _        t        |	|«      \  }}t        |	|||||«       t!        | «       |	d   j                  t#        |
«      d |	d   _        y)z*apply copy propagate recursively in parforr   r-  rƒ   Údummyr  N)r1  ry  r(   rs  r  r   r  r«  rˆ  rb  r	   rË  r”  r‰  r,   r.   r®  r‰   )r‡   Úvar_dictÚname_var_tabler�  rŸ  Úsave_copiesr�   r  rf   rÐ  Úassign_listÚlhs_namer  r½  r¾  s                  rh   Úapply_copies_parforrÊ  f  sc  € ô   §¡Ó0ò :‰
ˆˆ7Ø�1‰:˜Ó"Ø"+Ü" 7¨1¡:¨xÓ8ð":ˆF�O‰O˜AÒð:ð ×Ñò 6ˆÜ$ Q§W¡W¨hÓ7ˆŒÜ# A§F¡F¨HÓ5ˆŒÜ# A§F¡F¨HÓ5ˆ�ð6ô
   Ó'€Fà€KØ!Ÿ™Ó)ò ;‰ˆ�#Ø×Ñœ2Ÿ9™9 S¨.¸Ñ*BÜ%'§V¡V¨G°RÓ%8ó:õ 	;ð;ð ! 6¨!¡9§>¡>Ñ1€Fˆ1�I„NÜ*8¸ÀÓ*IÑ'ÐÐ'Ü˜Ð!1°>À7Ø" Kô1ä˜Ô à˜A‘Y—^‘^¤C¨Ó$4Ð$5Ð6€Fˆ1�I„NØ
rl   c                 ó†  ‡‡‡— | j                  «       D �]*  }g }t        «       Ši }|j                  D ]Ä  }ˆˆˆfd„}	|sot        |t        «      r_|j
                  j                  D ]
  }
 |	|
«       Œ |j                  j                  «       }t        |‰‰|d¬«       |j                  |«       Œ{ |	|«       |j                  «       D ]  }|t        |j                  ‰‰‰|«      z  }Œ  |j                  |«       ŒÆ ||_        t        |«      dkD  sŒû|j                  «       D ]  \  }}||   ||<   Œ d|i}t        ||«       �Œ- y)zŸpush 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                 ó  •— t        | t        j                  «      rä| j                  }| j                  }t        |t        j
                  «      r+| ‰|j                  <   ‰j                  |j                  «       y t        |t        j                  «      rl|j                  dk(  r\|j                  j                  ‰v s|j                  j                  ‰v r+| ‰|j                  <   ‰j                  |j                  «       y y y y y )NrÅ  )
rš   r	   rË  rÝ  rÌ  rÐ  rV  rè  rÞ  rl  )rŠ  r  rÙ  Ú
block_defsÚsaved_getattrsÚsaved_globalss      €€€rh   Úprocess_assignz&push_call_vars.<locals>.process_assign™  sº   ø€ Ü˜d¤B§I¡IÔ.ØŸ*™*�CØŸ+™+�CÜ" 3¬¯	©	Ô2Ø26˜ c§h¡hÑ/Ø"Ÿ™ s§x¡xÕ0Ü# C¬¯©Ô1°c·f±fÀ	Ò6IØŸI™IŸN™N¨mÑ;Ø#&§9¡9§>¡>°^Ñ#CØ7;˜N¨3¯8©8Ñ4Ø&ŸN™N¨3¯8©8Õ4ð $Dð 7JÐ1ð /rl   T)Únestedr   N)rç  rn  r‰  rš   rh  rt  ru  rå  rJ  rb  re  Ú_get_saved_call_nodesrV  r‰   rˆ  rI   )rÐ  rÏ  rÎ  r�  rÑ  r�  r  Úrename_dictrŠ  rÐ  r¾   Úpblocksrí  rù  Útemp_blocksrÍ  s    ``            @rh   rJ  rJ  ˆ  sT  ú€ ð
 —‘“ó .8ˆØˆô “Uˆ
ð ˆØ—J‘Jò 	"ˆDö5ñ œj¨¬vÔ6ØŸ™×-Ñ-ò &�AÙ" 1Õ%ð&àŸ.™.×-Ñ-Ó/�Ü˜w¨°~ÀwÐW[Õ\Ø—‘ Ô%Øá˜tÔ$Ø—^‘^Ó%ò [�ØÔ1°!·&±&¸-Ø2@À*Èkó[ñ [‘ð[ð �O‰O˜DÕ!ð5	"ð6 ˆŒ
äˆ{Ó˜aÓà#×)Ñ)Ó+ò (‘��1Ø$ Q™Z�˜’
ð(ð ˜e˜*ˆKÜ˜k¨;Ö7ð].8ð` rl   c                 óü   — g }| |vre| |v s| |v r]d„ }| |v r |||    d|||«       d} n6| |v r2 |||    d|||«       ||    j                   j                   j                  } | |vr
| |v rŒX| |v rŒ]|j                  «        |S )al   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                 ó  — t        | t        j                  «      sJ ‚t        j                  | j                  j
                  t        |«      | j                  j                  «      }t        j                  t        j                  | j                  «      || j                  «      }|j                  |«       |j                  | j                  j                  «       |j                  j                  || j                  j                  <   y r`   )rš   r	   rË  rc  rÌ  rÍ  r    rm  rå  ræ  rÝ  rb  rè  rV  )ÚobjÚvar_baseré  rÍ  rÓ  Úrenamed_varÚrenamed_assigns          rh   Úrename_global_or_getattrz7_get_saved_call_nodes.<locals>.rename_global_or_getattrÊ  s¬   € Ü˜c¤2§9¡9Ô-Ð.Ð-ÜŸ&™& §¡×!1Ñ!1Ü!.¨xÓ!8Ø!$§¡§¡ó1ˆKô  ŸY™Y¤t§}¡}°S·Y±YÓ'?Ø'2Ø'*§w¡wó0ˆNð �L‰L˜Ô(Ø�N‰N˜3Ÿ:™:Ÿ?™?Ô+Ø+9×+@Ñ+@×+EÑ+EˆK˜Ÿ
™
Ÿ™Ò(rl   z$push_global_to_blockÚ_PA_DONEz$push_getattr_to_block)rÝ  rV  r  )ÚfnamerÏ  rÎ  rÍ  rÓ  ré  rÜ  s          rh   rÒ  rÒ  À  s¶   € ð €EØ˜
Ñ"¨°Ñ(>Ø+0°NÑ+Bò
	Fð �MÑ!Ù$ ]°5Ñ%9Ð;RØ%*¨J¸ôEà‰EØ�nÑ$Ù$ ^°EÑ%:Ð<TØ%*¨J¸ôEà" 5Ñ)×/Ñ/×5Ñ5×:Ñ:ˆEð+ ˜
Ñ"¨°Ò(>Ø+0°NÒ+Bð* 
‡M�M„OØ€Lrl   c           
      ó˜  — t        | t        «      r | d   }t        |t        «      st        |d«      r|j                  }nd}| d   }t        |«      dk(  rdj                  |t        |d   «      «      S d|z   dz   }dj                  |j                  |D �cg c]  }t        |«      ‘Œ c}«      «      S t        | t        j                  j                  j                  «      r$| j                  }|j                  d«      rd	|z  S |S t        | t        j                  j                  j                  «      rt!        | j"                  «      S yc c}w )
zMExtract operators from arrayexpr to represent it abstractly as a string.
    r   ry   r¿  rƒ   z({}({}))r  z({})ú$z'%s' (temporary variable))rš   r  rƒ  Úhasattrry   r‰   r$  r  r  r…   rÔ  r	   rc  rV  r…  rÒ  r„  rÝ  )rn  Úoprrw   re   rV  s        rh   r  r  á  s  € ô �)œUÔ#Ø˜‰lˆä˜#œsÔ#Ü�s˜JÔ'Ø—l‘l‘à�Ø˜‰|ˆÜˆt‹9˜Š>Ø×$Ñ$ S¬.¸¸a¹Ó*AÓBÐBà˜‘)˜c‘/ˆCØ—=‘= §¡ÀtÖ*MÀ!¬N¸1Õ,=Ò*MÓ!NÓOÐOÜ	�IœuŸz™zŸ}™}×0Ñ0Ô	1Ø�~‰~ˆØ�?‰?˜3ÔØ0°4Ñ7Ð7àˆKÜ	�IœuŸz™zŸ}™}×2Ñ2Ô	3Ü�I—O‘OÓ$Ð$àùò +Ns   ÂEc                 ór   — g }| j                   D ]  }|j                  ||   «       Œ t        |«      |_        y)z›postproc updates generator_info with live variables after transformations
    but generator variables have types in return_type that are updated here.
    N)Ú
state_varsrb  r  Ústate_types)rP  r�   r�  Únew_state_typesrí  s        rh   rO  rO  ý  s@   € ð €OØ×&Ñ&ò +ˆØ×Ñ˜w q™zÕ*ð+ä# OÓ4€KÔØ
rl   c                 óf   — |€i }|€i }t        | «      }t        |||«      \  }}t        | «       ||fS r`   )r«  r3   r®  )r‡   rÀ  Úreverse_call_tablerÐ  s       rh   Úget_parfor_call_tableré    sO   € ØÐØˆ
ØÐ!ØÐÜ Ó'€FÜ%3°F¸JØ4Fó&HÑ"€JÐ"ä˜Ô ØÐ)Ð)Ð)rl   c                 óf   — |€i }t        | «      }t        j                  ||«      }t        | «       |S r`   )r«  r   Úget_tuple_tabler®  )r‡   Útuple_tablerÐ  s      rh   Úget_parfor_tuple_tablerí    s7   € ØÐØˆÜ Ó'€FÜ×*Ñ*¨6°;Ó?€KÜ˜Ô ØÐrl   c                 óv   — |€
t        «       }t        | «      }t        j                  ||«      }t	        | «       |S r`   )rn  r«  r   Úget_array_accessesr®  )r‡   ÚaccessesrÐ  s      rh   Úget_parfor_array_accessesrñ  #  s8   € ØÐÜ“5ˆÜ Ó'€FÜ×*Ñ*¨6°8Ó<€HÜ˜Ô Ø€Orl   c                 ó|   — t        | «      }t        ||«      }||   |d<   |j                  |«       t        | |«       y r«   )r«  r8   rÊ  r®  )r‡   rœ  rÐ  s      rh   Úparfor_add_offset_to_labelsró  0  s>   € Ü Ó'€FÜ! &¨&Ó1€FØ�v‘€Fˆ1�IØ
‡J�JˆvÔÜ˜ Ô(Ø
rl   c                 ó\   — t        | «      }t        j                  |«      }t        | «       |S r`   )r«  r   r*  r®  )r‡   rÐ  Ú	max_labels      rh   Úparfor_find_max_labelrö  <  s*   € Ü Ó'€FÜ×'Ñ'¨Ó/€IÜ˜Ô ØÐrl   c           
      ó  — |j                   }t        | «      }| j                  D �cg c]  }|j                  ‘Œ }}t	        |j                  «       «      }||   j                  }|D �cg c]/  }t        j                  t        j                  d|d¬«      ||«      ‘Œ1 }	}||   j                  }
|	||   j                  z   ||   _
        ||_         |j                  «        ||_         |
||   _
        t        | «       y c c}w c c}w )Nrƒ   F)rm  Úuse_literal_type)rÐ  r«  rs  r[  r“   ré  rm  r	   rË  rÒ  r‰  Úbuild_constraintr®  )r‡   ÚtypeinfererÚsave_blocksrÐ  rf   r   Úfirst_blockrm  rí  Úindex_assignsÚsave_first_block_bodys              rh   Úparfor_typeinferrÿ  E  sñ   € Ø×$Ñ$€KÜ Ó'€FØ,2×,=Ñ,=Ö> q�!×"Ó"Ð>€JÐ>ô �f—k‘k“mÓ$€KØ
�Ñ
×
!Ñ
!€Cà^hÖiÐYZ”R—Y‘YœrŸx™x¨¨sÀUÔKÈQÐPSÕTÐi€MÐiØ" ;Ñ/×4Ñ4ÐØ,¨v°kÑ/B×/GÑ/GÑG€Fˆ;ÑÔØ€KÔØ× Ñ Ô"Ø$€KÔØ4€Fˆ;ÑÔÜ˜Õ ùò ?ùò js   ¦C:Á'4C?c                 ó„   — |€t        t        «      }t        | j                  |«       t        d| j                  i|«       |S )z)get variable definition table for parforsr   )r   r¹  r@   ru  rt  )r‡   Údefinitionss     rh   Úbuild_parfor_definitionsr  Z  s?   € àÐÜ!¤$Ó'ˆô �f×&Ñ&¨Ô4Ü�q˜&×+Ñ+Ð,¨kÔ:ØÐrl   c           	   #   ó’  K  — t        | j                  «       «      }| |   j                  }t        j                  |t        d«      t        j                  dd«      «      }| |   j                  j                  t        j                  |t        j                  dd«      «      «       d–— | |   j                  j                  «        y­w)zLadds dummy return to last block of parfor loop body for CFG computation
    r´  r‘  r  N)r§   ré  rÍ  r	   rc  r    r”  r‰  rb  r°  rÊ  )ru  rÐ  rÍ  r¶  s       rh   r  r  g  s—   è ø€ ô
 �Y—^‘^Ó%Ó&€JØ�jÑ!×'Ñ'€EÜ�F‰F�5œ-¨Ó1´2·6±6¸/È2Ó3NÓO€EØˆjÑ×Ñ×%Ñ%Ü
�	‰	�%œŸ™ °Ó4Ó5ô7ã	àˆjÑ×Ñ×"Ñ"Õ$ùs   ‚CCc                   ó   — e Zd Zd„ Zy)ÚReduceInferc                 óÀ   — |rJ ‚t        |«      dk7  rt        j                  d«      ‚t        |d   t        j
                  «      sJ ‚t        |d   j                  g|¢­Ž S )Nr   zlen(args) != 3rƒ   )r‰   r   ÚNumbaAssertionErrorrš   r   rÍ   rQ   r�   )r\  rw   r°  s      rh   ÚgenericzReduceInfer.genericw  sV   € ÙˆˆwÜˆt‹9˜Š>Ü×,Ñ,Ð-=Ó>Ð>Ü˜$˜q™'¤5§;¡;Ô/Ð/Ð/Ü˜˜a™Ÿ™Ð.¨Ò.Ð.rl   N)ry   rz   r{   r  rk   rl   rh   r  r  u  s   „ ó/rl   r  c                  óR   — t         j                  rd} t        j                  | «      ‚y)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�  )NNNNNré  r€  )NNNr`   (  rf  r   Úpytypesr–  r  rg  Útextwraprå  r.  rk  Ú	functoolsr   Úcollectionsr   r   r   Ú
contextlibr   r.  Údataclassesr   rÛ  Úllvmliter	   ÚlirÚnumba.core.imputilsr
   Únumba.core.irr…   r  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   r9  rÁ   Únumba.parforsrZ   Únumba.cpython.builtinsÚnumba.stencilsr[   r‚  ÚTextWrapperrb   ri   rƒ  rm   rq   r,  rs   rŸ   r©   rµ   r¹   r¿   rÅ   rÉ   rÐ   rÛ   rã   rê   rõ   rú   r%  r0  r¤  rJ  r®  r¤   rˆ   r¬   r¸   rU  rµ  rY  rÞ  ÚStmtrh  r±  Úarray_analysis_extensionsr³  r›  rÓ  rï  r÷  r5  r7  r  r  ri  r”  r²  rœ  r(  r3  rF  rŒ  r�  r~  rc  rg  rf  rQ  r—  r›  r8  r®  r­  r¬  rÄ  rÆ  rÍ  rÒ  rÓ  r9  rÚ  rÛ  rü  rÙ  r  r  r  Úvisit_vars_extensionsr!  Úir_extension_usedefsr%  Úir_extension_use_allocar3  Úir_extension_insert_delsr:  r6  r@  r;  rB  rC  rK  r=  rZ  rm  rY  rX  r  r§  r’  Úremove_dead_extensionsr—  r“  r²  Úalias_analysis_extensionsr6  r«  r®  rÂ  Úcopy_propagate_extensionsrÊ  Úapply_copy_propagate_extensionsrJ  rÒ  r  rO  ré  Úcall_table_extensionsrí  Útuple_table_extensionsrñ  Úarray_accesses_extensionsró  Úadd_offset_to_labels_extensionsrö  Úfind_max_label_extensionsrÿ  Útypeinfer_extensionsr  Úbuild_defs_extensionsr  r  r  rk   rl   rh   ú<module>r6     sF  ðñó ß Û 	Û Û Û Û Ý ß <Ñ <Ý %Û Ý &Û å Ý 2Û ß r× r× rÑ rß "ß Jß :ß FÝ 4ß @÷,÷ ,÷ ,÷ ,÷ ,÷ ,÷ ,÷ ,÷ ,÷ ,÷ ,ñ ,÷\Hó Hå *ß 0Ý /÷>÷ >õ *Û Û Û Ý (Û Ý (ð €
Ø"ˆh×"Ñ"¨ÀUÔK€ò0ð #Ð ò
ñ 
ˆ+Óñó ðô
�fô ò òDò@	ò	ò	òò"ò
'òò,ò.ò.ò8ð
 48ô 4GòlIñ0 :Ù9Ø'Ø'Ø(Ø(Ø'Ø)Ø)Ø'Ø'Ø'Ø-Ø1ñÐ ò"ð( ÐðÐ ð ñ>ó ð>ð
 ñ>ó ð>ð
 ñGó ðGð ñGó ðGñ ˜.¨6°6Ð*:Ó;€ñ 'Ð'7¸ÓHÙ&Ð'7¸ÓHÙ# M°;Ó?Ù# M°;Ó?Ù$ ]°KÓ@Ù$ ]°KÓ@ñ"Ð ôˆvô ô:K(ˆR�WŠW�b—g’gô K(ò\ð  4C€× (Ò (¨Ñ 0ôN˜ô Nôbc"�Fô c"òJ÷%ñ %÷<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   