§
    2@ÄjE� ã                   ó  — 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`maZa ddlbmcZcmdZdmeZemfZf ddlgmhZh ddlimjZjmkZk ddllmmZm ddlnmoZompZpmqZqmrZrmsZsmtZt ddlumvZv ddlwmZx ddl4myZy ddlZddlzZzddlzZ{ddl|m}Z} ddl~Zddlm€Z€ dZ� ej‚        e�d¬¦  «        Zƒd„ Z„dZ…d„ Z† eye†¦  «        d „ ¦   «         Z‡ G d!„ d"eˆ¦  «        Z‰d#„ ZŠd$„ Z‹d%„ ZŒ e0eŒ¦  «         e0e‹¦  «         G d&„ d'e1¦  «        ¦   «         ¦   «         Z� e6eŒejŽ        ¦  «         e6eŒej�        ¦  «        d(„ ¦   «         ¦   «         Z� e6e‹ejŽ        ¦  «         e6e‹ej�        ¦  «        d)„ ¦   «         ¦   «         Z‘d*„ Z’d+„ Z“d,„ Z”d-„ Z•d.„ Z–d/„ Z—d0„ Z˜d1„ Z™d2„ Zšd3„ Z›d4„ Zœd5„ Z�dd6œd7„Zžd8„ ZŸd9„ d:„ eŠe’eŠe’e™eše›eœe�e˜ežeŸd;œZ d<„ Z¡d=e¡iZ¢e5d>„ ¦   «         Z£e5d?„ ¦   «         Z¤e5d@„ ¦   «         Z¥e5dA„ ¦   «         Z¦ edBdCdDg¦  «        Z§ e§dEe¥¦  «         e§dFe¦¦  «         e§dGe¤¦  «         e§dHe£¦  «         e§dGe¤¦  «         e§dHe£¦  «        dIœZ¨ G dJ„ dKeˆ¦  «        Z© G dL„ dMejª        ej«        ¦  «        Z¬dN„ Z­e­e}j®        e¬<    G dO„ dPeˆ¦  «        Z¯ G dQ„ dReˆ¦  «        Z°dS„ Z± G dT„ dU¦  «        Z² G dV„ dW¦  «        Z³dX„ Z´ G dY„ dZ¦  «        Zµd±d[„Z¶d\„ Z· G d]„ d^¦  «        Z¸ G d_„ d`¦  «        Z¹ G da„ db¦  «        Zºdc„ Z» G dd„ dee²¦  «        Z¼ G df„ dge²¦  «        Z½ G dh„ die²¦  «        Z¾dj„ Z¿dk„ ZÀdl„ ZÁdm„ ZÂdn„ ZÃdo„ ZÄdp„ ZÅdq„ ZÆdr„ ZÇds„ ZÈdt„ ZÉdu„ ZÊdv„ ZËdw„ ZÌdx„ ZÍdy„ ZÎdz„ ZÏ ed{g d|¢d}¬~¦  «        ZÐ	 	 	 d²d„ZÑd€„ ZÒd�„ ZÓd‚„ 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dS )·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Ú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)Úmk_alloc)r   )Úoverload)Úarray_analysis)ÚstencilparforéP   F)ÚwidthÚdrop_whitespacec                 ó|   — |                       ¦   «         D ]&}d„ t                               |¦  «        D ¦   «          Œ'd S )Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS © ©Úprint©Ú.0Úys     úEC:\Projects\Historical\venv\Lib\site-packages\numba/parfors/parfor.pyú
<listcomp>z!print_wrapped.<locals>.<listcomp>m   s   € Ð/Ð/Ð/�a�ˆq‰ŒÐ/Ð/Ð/ó    )Ú
splitlinesÚ_txtwrapperÚwrap)ÚxÚls     rg   Úprint_wrappedro   k   sH   € Ø�\Š\‰^Œ^ð 0ð 0ˆØ/Ð/�;×+Ò+¨AÑ.Ô.Ð/Ñ/Ô/Ð/Ð/ð0ð 0ri   c                  ó   — d S ©Nra   ra   ri   rg   Úinit_prangerr   t   s   € Ø
€Fri   c                  ó   — d„ } | S )Nc                  ó   — d S rq   ra   ra   ri   rg   Úno_opz#init_prange_overload.<locals>.no_opy   s   € Øˆri   ra   )ru   s    rg   Úinit_prange_overloadrv   w   s   € ðð ð à€Lri   c                   ó   — e Zd Zd„ ZdS )Úinternal_prangec                 ó   — t          |Ž S rq   )Úrange)ÚclsÚargss     rg   Ú__new__zinternal_prange.__new__   s   € Ý�dˆ|Ðri   N)Ú__name__Ú
__module__Ú__qualname__r}   ra   ri   rg   rx   rx   }   s#   € € € € € ðð ð ð ð ri   rx   c                 ó¦   — |j         dk    rd„ }nA|j         dk    r3t          |j        t          j        t          j        f¦  «        rd„ }nd„ }nd„ }|S )Nr   c                 ó   — | d         S ©Nra   ra   ©Úin_arrs    rg   Úmin_1z min_parallel_impl.<locals>.min_1‡   ó   € Ø˜"”:Ðri   é   c                 ó@  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         t          | j        ¦  «        }t           j        j                             t          | ¦  «        ¦  «        D ]}t          || |         ¦  «        }Œ|S rq   )
ÚnumbaÚparforsÚparforrr   Úmin_checkerÚlenÚget_type_max_valueÚdtyperx   r   ©r…   ÚvalÚis      rg   r†   z min_parallel_impl.<locals>.min_1Œ   ó~   € Ý”Ô$×0Ò0Ñ2Ô2Ð2Ý�C ™KœKÑ(Ô(Ð(Ý(¨¬Ñ6Ô6�ÝœÔ-×=Ò=½cÀ&¹k¼kÑJÔJð ;ð ;�AÝ*¨3°°q´	Ñ:Ô:�C�CØ�
ri   c                 ó@  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         t          | j        ¦  «        }t           j        j                             t          | ¦  «        ¦  «        D ]}t          || |         ¦  «        }Œ|S rq   )
rŠ   r‹   rŒ   rr   r�   rŽ   r�   r�   rx   Úminr‘   s      rg   r†   z min_parallel_impl.<locals>.min_1”   ó~   € Ý”Ô$×0Ò0Ñ2Ô2Ð2Ý�C ™KœKÑ(Ô(Ð(Ý(¨¬Ñ6Ô6�ÝœÔ-×=Ò=½cÀ&¹k¼kÑJÔJð .ð .�AÝ˜c 6¨!¤9Ñ-Ô-�C�CØ�
ri   c                 ó  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         t          | j        ¦  «        }t          j        | j	        ¦  «        D ]}t          || |         ¦  «        }Œ|S rq   )rŠ   r‹   rŒ   rr   r�   rŽ   r�   r�   r   Úshaper–   r‘   s      rg   r†   z min_parallel_impl.<locals>.min_1œ   óq   € ÝŒMÔ ×,Ò,Ñ.Ô.Ð.Ý�˜F™œÑ$Ô$Ð$Ý$ V¤\Ñ2Ô2ˆCÝ”^ F¤LÑ1Ô1ð *ð *�Ý˜#˜v aœyÑ)Ô)��ØˆJri   ©ÚndimÚ
isinstancer�   Ú	npy_typesÚ
NPDatetimeÚNPTimedelta)Úreturn_typeÚargr†   s      rg   Úmin_parallel_implr£   ƒ   s‹   € ð „x�1‚}€}ð	ð 	ð 	ð 	à	Œ�QŠˆÝ�c”i¥)Ô"6½	Ô8MÐ!NÑOÔOð 	ðð ð ð ðð ð ð ð	ð 	ð 	ð €Lri   c                 ó®   — t          | t          j        ¦  «        rt          j        S t          | t          j        ¦  «        r| j        S t          d¦  «        ‚©NzUnsupported type)r�   r   ÚFloatÚnpÚinfÚIntegerÚmaxvalÚNotImplementedError©Útyps    rg   r�   r�   §   sH   € Ý�#•u”{Ñ#Ô#ð ÝŒvˆÝ�#•u”}Ñ%Ô%ð ØŒzÐÝ
Ð0Ñ
1Ô
1Ð1ri   c                 ó°   — t          | t          j        ¦  «        rt          j         S t          | t          j        ¦  «        r| j        S t          d¦  «        ‚r¥   )r�   r   r¦   r§   r¨   r©   Úminvalr«   r¬   s    rg   Úget_type_min_valuer°   ®   sJ   € Ý�#•u”{Ñ#Ô#ð Ý”ˆwˆÝ�#•u”}Ñ%Ô%ð ØŒzÐÝ
Ð0Ñ
1Ô
1Ð1ri   c                   ó   — e Zd Zd„ ZdS )ÚMinValInferc                 óÀ   — |rJ ‚t          |¦  «        dk    sJ ‚t          |d         t          j        t          j        f¦  «        rt          |d         j        g|¢R Ž S d S ©Nrˆ   r   )rŽ   r�   r   ÚDTypeÚNumberClassrP   r�   ©Úselfr|   Úkwss      rg   ÚgenericzMinValInfer.generic¸   sd   € ØˆˆˆwÝ�4‰yŒy˜AŠ~ˆ~ˆ~ˆ~Ý�d˜1”g¥¤­UÔ->Ð?Ñ@Ô@ð 	3Ý˜T !œWœ]Ð2¨TÐ2Ð2Ð2Ð2ð	3ð 	3ri   N©r~   r   r€   rº   ra   ri   rg   r²   r²   µ   s#   € € € € € ð3ð 3ð 3ð 3ð 3ri   r²   c                 ó  — |j         d         j        }t          |t          j        ¦  «        r9|j        }t          j        |¦  «        }|j        }t          j	        ||¦  «        }�nt          |t          j
        ¦  «        r“|j        }|dk    rt          j        ¦   «         }n)|dk    rt          j        ¦   «         }nt          d¦  «        ‚t          t          d                     |¦  «        ¦  «        }	t          j	        |t          j         ¦  «        }net          |t$          j        t$          j        f¦  «        r?d}t          j        |¦  «        }t          j        j        dz   }t          j	        ||¦  «        }t-          | |||¦  «        S )Nr   é    é@   ú+llvmlite only supports 32 and 64 bit floatsúfloat{}rˆ   )r|   r�   r�   r   r©   ÚbitwidthÚlirÚIntTyper¯   ÚConstantr¦   Ú	FloatTypeÚ
DoubleTyper«   Úgetattrr§   Úformatr¨   rž   rŸ   r    Úint64r
   ©
ÚcontextÚbuilderÚsigr|   r­   ÚbwÚltyr’   ÚresÚnptys
             rg   Úlower_get_type_min_valuerÒ   ¾   sC  € ð Œ(�1Œ+Ô
€Cå�#•u”}Ñ%Ô%ð %ØŒ\ˆÝŒk˜"‰oŒoˆØŒjˆÝŒl˜3 Ñ$Ô$ˆ‰Ý	�C�œÑ	%Ô	%ð %ØŒ\ˆØ�Š8ˆ8Ý”-‘/”/ˆCˆCØ�2ŠXˆXÝ”.Ñ"Ô"ˆCˆCå%Ð&SÑTÔTÐTÝ•r˜9×+Ò+¨BÑ/Ô/Ñ0Ô0ˆÝŒl˜3¥¤ Ñ(Ô(ˆˆÝ	�C�)Ô.µ	Ô0EÐFÑ	GÔ	Gð %ØˆÝŒk˜"‰oŒoˆÝŒkÔ  1Ñ$ˆÝŒl˜3 Ñ$Ô$ˆÝ˜g w°°SÑ9Ô9Ð9ri   c                 ó  — |j         d         j        }t          |t          j        ¦  «        r9|j        }t          j        |¦  «        }|j        }t          j	        ||¦  «        }�nt          |t          j
        ¦  «        r’|j        }|dk    rt          j        ¦   «         }n)|dk    rt          j        ¦   «         }nt          d¦  «        ‚t          t          d                     |¦  «        ¦  «        }	t          j	        |t          j        ¦  «        }nbt          |t$          j        t$          j        f¦  «        r<d}t          j        |¦  «        }t          j        j        }t          j	        ||¦  «        }t-          | |||¦  «        S )Nr   r½   r¾   r¿   rÀ   )r|   r�   r�   r   r©   rÁ   rÂ   rÃ   rª   rÄ   r¦   rÅ   rÆ   r«   rÇ   r§   rÈ   r¨   rž   rŸ   r    rÉ   r
   rÊ   s
             rg   Úlower_get_type_max_valuerÔ   Ù   s<  € ð Œ(�1Œ+Ô
€Cå�#•u”}Ñ%Ô%ð %ØŒ\ˆÝŒk˜"‰oŒoˆØŒjˆÝŒl˜3 Ñ$Ô$ˆ‰Ý	�C�œÑ	%Ô	%ð %ØŒ\ˆØ�Š8ˆ8Ý”-‘/”/ˆCˆCØ�2ŠXˆXÝ”.Ñ"Ô"ˆCˆCå%Ð&SÑTÔTÐTÝ•r˜9×+Ò+¨BÑ/Ô/Ñ0Ô0ˆÝŒl˜3¥¤Ñ'Ô'ˆˆÝ	�C�)Ô.µ	Ô0EÐFÑ	GÔ	Gð %ØˆÝŒk˜"‰oŒoˆÝŒkÔ ˆÝŒl˜3 Ñ$Ô$ˆÝ˜g w°°SÑ9Ô9Ð9ri   c                 ó¦   — |j         dk    rd„ }nA|j         dk    r3t          |j        t          j        t          j        f¦  «        rd„ }nd„ }nd„ }|S )Nr   c                 ó   — | d         S rƒ   ra   r„   s    rg   Úmax_1z max_parallel_impl.<locals>.max_1ö   r‡   ri   rˆ   c                 ó@  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         t          | j        ¦  «        }t           j        j                             t          | ¦  «        ¦  «        D ]}t          || |         ¦  «        }Œ|S rq   )
rŠ   r‹   rŒ   rr   Úmax_checkerrŽ   r°   r�   rx   r   r‘   s      rg   r×   z max_parallel_impl.<locals>.max_1û   r”   ri   c                 ó@  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         t          | j        ¦  «        }t           j        j                             t          | ¦  «        ¦  «        D ]}t          || |         ¦  «        }Œ|S rq   )
rŠ   r‹   rŒ   rr   rÙ   rŽ   r°   r�   rx   Úmaxr‘   s      rg   r×   z max_parallel_impl.<locals>.max_1  r—   ri   c                 ó  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         t          | j        ¦  «        }t          j        | j	        ¦  «        D ]}t          || |         ¦  «        }Œ|S rq   )rŠ   r‹   rŒ   rr   rÙ   rŽ   r°   r�   r   r™   rÛ   r‘   s      rg   r×   z max_parallel_impl.<locals>.max_1  rš   ri   r›   )r¡   r¢   r×   s      rg   Úmax_parallel_implrÝ   ô   s‰   € Ø
„x�1‚}€}ð	ð 	ð 	ð 	à	Œ�QŠˆÝ�c”i¥)Ô"6½	Ô8MÐ!NÑOÔOð 	ðð ð ð ðð ð ð ð	ð 	ð 	ð €Lri   c                 óò  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         |                      ¦   «         }t          |j        ¦  «        }t          j
                             d|¦  «        }t           j        j                             t          |¦  «        ¦  «        D ]8}t          j
                             |||         ¦  «        }t          ||¦  «        }Œ9|j        S ©Nr   )rŠ   r‹   rŒ   rr   Úargmin_checkerrŽ   Úravelr�   r�   r   ÚbuiltinsÚ
IndexValuerx   r–   Úindex©r…   ÚAÚinit_valÚivalr“   Ú	curr_ivals         rg   Úargmin_parallel_implrê     ó¼   € Ý	„MÔ×$Ò$Ñ&Ô&Ð&Ý•3�v‘;”;ÑÔÐØ�Š‰Œ€AÝ! !¤'Ñ*Ô*€HÝŒ?×%Ò% a¨Ñ2Ô2€DÝŒ]Ô!×1Ò1µ#°a±&´&Ñ9Ô9ð $ð $ˆÝ”O×.Ò.¨q°!°A´$Ñ7Ô7ˆ	Ý�4˜Ñ#Ô#ˆˆØŒ:Ðri   c                 óò  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         |                      ¦   «         }t          |j        ¦  «        }t          j
                             d|¦  «        }t           j        j                             t          |¦  «        ¦  «        D ]8}t          j
                             |||         ¦  «        }t          ||¦  «        }Œ9|j        S rß   )rŠ   r‹   rŒ   rr   Úargmax_checkerrŽ   rá   r°   r�   r   râ   rã   rx   rÛ   rä   rå   s         rg   Úargmax_parallel_implrî     rë   ri   c                 óú   — t           j        j                             ¦   «          | j        d         }|j        d         }d}t           j        j                             |¦  «        D ]}|| |         ||         z  z  }Œ|S rß   )rŠ   r‹   rŒ   rr   r™   rx   )ÚaÚbrn   ÚmÚsr“   s         rg   Údotvv_parallel_implrô   *  su   € Ý	„MÔ×$Ò$Ñ&Ô&Ð&Ø	Œ�Œ
€AØ	Œ�Œ
€Að 	
€AÝŒ]Ô!×1Ò1°!Ñ4Ô4ð ð ˆØ	ˆQˆqŒT�A�a”D‰[ÑˆˆØ€Hri   c                 ó   — t           j        j                             ¦   «          | j        }|j        \  }}t          j        || j        ¦  «        }t           j        j                             |¦  «        D ]}|| |         ||d d …f         z  z  }Œ|S rq   )	rŠ   r‹   rŒ   rr   r™   r§   Úzerosr�   rx   )rð   rñ   rn   rò   ÚnÚcr“   s          rg   Údotvm_parallel_implrù   5  s‰   € Ý	„MÔ×$Ò$Ñ&Ô&Ð&Ø	Œ€AØŒ7�D€A€qõ 	Œ��A”GÑÔ€Aõ Œ]Ô!×1Ò1°!Ñ4Ô4ð ð ˆØ	ˆQˆqŒT�A�a˜˜˜�d”G‰^ÑˆˆØ€Hri   c                 óN  — t           j        j                             ¦   «          | j        \  }}|j        }t          j        || j        ¦  «        }t           j        j                             |¦  «        D ]1}d}t          |¦  «        D ]}|| ||f         ||         z  z  }Œ|||<   Œ2|S rß   )
rŠ   r‹   rŒ   rr   r™   r§   Úemptyr�   rx   rz   )	rð   rñ   rò   r÷   rn   rø   r“   ró   Újs	            rg   Údotmv_parallel_implrý   F  s¨   € Ý	„MÔ×$Ò$Ñ&Ô&Ð&ØŒ7�D€A€qØ	Œ€Aõ 	Œ��A”GÑÔ€AÝŒ]Ô!×1Ò1°!Ñ4Ô4ð ð ˆØˆÝ�q‘”ð 	 ð 	 ˆAØ��1�a�4”˜1˜Qœ4‘ÑˆAˆAØˆˆ!‰ˆØ€Hri   c                 ó
  — t          |t          j        j        ¦  «        r]t          |t          j        j        ¦  «        r@|j        |j        cxk    rdk    r
n nt
          S |j        dk    r|j        dk    rt          S d S d S d S d S )Nrˆ   é   )r�   r   ÚnpytypesÚArrayrœ   rô   rý   )r¡   ÚatypÚbtyps      rg   Údot_parallel_implr  T  s˜   € å�4�œÔ-Ñ.Ô.ð 'Ý�4�œÔ-Ñ.Ô.ð'àŒ9˜œ	Ð&Ð&Ò&Ð& QÒ&Ð&Ð&Ð&Ð&Ý&Ð&ð ŒY˜!Š^ˆ^ ¤	¨Q¢ Ý&Ð&ð'ð 'ð 'ð 'ð ˆ^  ri   c                 óh   ‡—  | d¦  «        Š|j         dk    rd„ }n|j         dk    rˆfd„}nˆfd„}|S )Nr   c                 ó   — | d         S rƒ   ra   r„   s    rg   Úsum_1z sum_parallel_impl.<locals>.sum_1d  r‡   ri   rˆ   c                 óÐ   •— t           j        j                             ¦   «          ‰}t           j        j                             t          | ¦  «        ¦  «        D ]}|| |         z  }Œ|S rq   ©rŠ   r‹   rŒ   rr   rx   rŽ   ©r…   r’   r“   Úzeros      €rg   r  z sum_parallel_impl.<locals>.sum_1g  s\   ø€ ÝŒMÔ ×,Ò,Ñ.Ô.Ð.ØˆCÝ”]Ô)×9Ò9½#¸f¹+¼+ÑFÔFð !ð !�Ø�v˜a”yÑ ��ØˆJri   c                 ó    •— t           j        j                             ¦   «          ‰}t          j        | j        ¦  «        D ]}|| |         z  }Œ|S rq   ©rŠ   r‹   rŒ   rr   r   r™   r
  s      €rg   r  z sum_parallel_impl.<locals>.sum_1n  sO   ø€ ÝŒMÔ ×,Ò,Ñ.Ô.Ð.ØˆCÝ”^ F¤LÑ1Ô1ð !ð !�Ø�v˜a”yÑ ��ØˆJri   ©rœ   )r¡   r¢   r  r  s      @rg   Úsum_parallel_implr  `  sx   ø€ Øˆ;�q‰>Œ>€Dà
„x�1‚}€}ð	ð 	ð 	ð 	à	Œ�QŠˆð	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð €Lri   c                 óh   ‡—  | d¦  «        Š|j         dk    rd„ }n|j         dk    rˆfd„}nˆfd„}|S )Nrˆ   r   c                 ó   — | d         S rƒ   ra   r„   s    rg   Úprod_1z"prod_parallel_impl.<locals>.prod_1z  r‡   ri   c                 óÐ   •— t           j        j                             ¦   «          ‰}t           j        j                             t          | ¦  «        ¦  «        D ]}|| |         z  }Œ|S rq   r	  ©r…   r’   r“   Úones      €rg   r  z"prod_parallel_impl.<locals>.prod_1}  s\   ø€ ÝŒMÔ ×,Ò,Ñ.Ô.Ð.ØˆCÝ”]Ô)×9Ò9½#¸f¹+¼+ÑFÔFð !ð !�Ø�v˜a”yÑ ��ØˆJri   c                 ó    •— t           j        j                             ¦   «          ‰}t          j        | j        ¦  «        D ]}|| |         z  }Œ|S rq   r  r  s      €rg   r  z"prod_parallel_impl.<locals>.prod_1„  sO   ø€ ÝŒMÔ ×,Ò,Ñ.Ô.Ð.ØˆCÝ”^ F¤LÑ1Ô1ð !ð !�Ø�v˜a”yÑ ��ØˆJri   r  )r¡   r¢   r  r  s      @rg   Úprod_parallel_implr  v  sx   ø€ Ø
ˆ+�a‰.Œ.€Cà
„x�1‚}€}ð	ð 	ð 	ð 	à	Œ�QŠˆð	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð €Mri   c                 óh   ‡—  | d¦  «        Š|j         dk    rd„ }n|j         dk    rˆfd„}nˆfd„}|S )Nr   c                 ó   — | d         S rƒ   ra   r„   s    rg   Úmean_1z"mean_parallel_impl.<locals>.mean_1’  r‡   ri   rˆ   c                 óð   •— t           j        j                             ¦   «          ‰}t           j        j                             t          | ¦  «        ¦  «        D ]}|| |         z  }Œ|t          | ¦  «        z  S rq   r	  r
  s      €rg   r  z"mean_parallel_impl.<locals>.mean_1•  sg   ø€ ÝŒMÔ ×,Ò,Ñ.Ô.Ð.ØˆCÝ”]Ô)×9Ò9½#¸f¹+¼+ÑFÔFð !ð !�Ø�v˜a”yÑ ��Ø•s˜6‘{”{‘?Ð"ri   c                 ó°   •— t           j        j                             ¦   «          ‰}t          j        | j        ¦  «        D ]}|| |         z  }Œ|| j        z  S rq   )rŠ   r‹   rŒ   rr   r   r™   Úsizer
  s      €rg   r  z"mean_parallel_impl.<locals>.mean_1œ  sV   ø€ ÝŒMÔ ×,Ò,Ñ.Ô.Ð.ØˆCÝ”^ F¤LÑ1Ô1ð !ð !�Ø�v˜a”yÑ ��Ø�v”{‘?Ð"ri   r  )r¡   r¢   r  r  s      @rg   Úmean_parallel_implr  �  sx   ø€ àˆ;�q‰>Œ>€Dà
„x�1‚}€}ð	ð 	ð 	ð 	à	Œ�QŠˆð	#ð 	#ð 	#ð 	#ð 	#ð 	#ð	#ð 	#ð 	#ð 	#ð 	#ð €Mri   c                 óH   — |j         dk    rd„ }n|j         dk    rd„ }nd„ }|S )Nr   c                 ó   — dS rß   ra   r„   s    rg   Úvar_1z var_parallel_impl.<locals>.var_1¦  s   € Ø�1ri   rˆ   c                 ón  — |                       ¦   «         }t          j        j                             ¦   «          d}t          j        j                             t          | ¦  «        ¦  «        D ]9}| |         |z
  }|t          j        |t          j	        |¦  «        z  ¦  «        z  }Œ:|t          | ¦  «        z  S rß   )
ÚmeanrŠ   r‹   rŒ   rr   rx   rŽ   r§   ÚrealÚconj©r…   rò   Ússdr“   r’   s        rg   r!  z var_parallel_impl.<locals>.var_1©  s”   € à—’‘”ˆAåŒMÔ ×,Ò,Ñ.Ô.Ð.ØˆCÝ”]Ô)×9Ò9½#¸f¹+¼+ÑFÔFð 3ð 3�Ø˜Q”i !‘m�Ø•r”w˜s¥R¤W¨S¡\¤\Ñ1Ñ2Ô2Ñ2��Ø�˜V™œÑ$Ð$ri   c                 ó.  — |                       ¦   «         }t          j        j                             ¦   «          d}t          j        | j        ¦  «        D ]9}| |         |z
  }|t          j        |t          j	        |¦  «        z  ¦  «        z  }Œ:|| j
        z  S rß   )r#  rŠ   r‹   rŒ   rr   r   r™   r§   r$  r%  r  r&  s        rg   r!  z var_parallel_impl.<locals>.var_1´  sƒ   € à—’‘”ˆAåŒMÔ ×,Ò,Ñ.Ô.Ð.ØˆCÝ”^ F¤LÑ1Ô1ð 3ð 3�Ø˜Q”i !‘m�Ø•r”w˜s¥R¤W¨S¡\¤\Ñ1Ñ2Ô2Ñ2��Ø˜œÑ$Ð$ri   r  )r¡   r¢   r!  s      rg   Úvar_parallel_implr)  ¤  sV   € Ø
„x�1‚}€}ð	ð 	ð 	ð 	à	Œ�QŠˆð		%ð 		%ð 		%ð 		%ð		%ð 		%ð 		%ð €Lri   c                 ó   — d„ }|S )Nc                 ó0   — |                       ¦   «         dz  S )Ng      à?)Úvarr„   s    rg   Ústd_1z std_parallel_impl.<locals>.std_1Á  s   € Ø�zŠz‰|Œ|˜sÑ"Ð"ri   ra   )r¡   r¢   r-  s      rg   Ústd_parallel_implr.  À  s   € ð#ð #ð #à€Lri   )r�   c                ó   ‡
— t          | j        ¦  «        Š
ˆ
fd„}d„ }ˆ
fd„}d„ }ˆ
fd„}d„ }t          d„ |D ¦   «         ¦  «        rd„ }	nd	„ }	t          |¦  «        d
k    r|€|n|S t          |¦  «        dk    r|€|n|S t          |¦  «        dk    r|€|n|S t          |¦  «        dk    r|	S t	          d                     |¦  «        ¦  «        ‚)Nc                 ó2   •— t          j        d| d‰¦  «        S ©Nr   rˆ   ©r§   Úarange)ÚstopÚinferred_dtypes    €rg   Úarange_1z&arange_parallel_impl.<locals>.arange_1È  s   ø€ ÝŒy˜˜D ! ^Ñ4Ô4Ð4ri   c                 ó0   — t          j        d| d|¦  «        S r1  r2  )r4  r�   s     rg   Úarange_1_dtypez,arange_parallel_impl.<locals>.arange_1_dtypeË  s   € ÝŒy˜˜D ! UÑ+Ô+Ð+ri   c                 ó2   •— t          j        | |d‰¦  «        S ©Nrˆ   r2  )Ústartr4  r5  s     €rg   Úarange_2z&arange_parallel_impl.<locals>.arange_2Î  s   ø€ ÝŒy˜  a¨Ñ8Ô8Ð8ri   c                 ó0   — t          j        | |d|¦  «        S r:  r2  )r;  r4  r�   s      rg   Úarange_2_dtypez,arange_parallel_impl.<locals>.arange_2_dtypeÑ  s   € ÝŒy˜  a¨Ñ/Ô/Ð/ri   c                 ó2   •— t          j        | ||‰¦  «        S rq   r2  )r;  r4  Ústepr5  s      €rg   Úarange_3z&arange_parallel_impl.<locals>.arange_3Ô  s   ø€ ÝŒy˜  d¨NÑ;Ô;Ð;ri   c                 ó0   — t          j        | |||¦  «        S rq   r2  )r;  r4  r@  r�   s       rg   Úarange_3_dtypez,arange_parallel_impl.<locals>.arange_3_dtype×  s   € ÝŒy˜  d¨EÑ2Ô2Ð2ri   c              3   óJ   K  — | ]}t          |t          j        ¦  «        V — Œd S rq   )r�   r   ÚComplex)re   rð   s     rg   ú	<genexpr>z'arange_parallel_impl.<locals>.<genexpr>Ú  s.   è è € Ð
6Ð
6¨A�:�a�œÑ'Ô'Ð
6Ð
6Ð
6Ð
6Ð
6Ð
6ri   c                 ó¤  — t           j        j                             ¦   «          || z
  |z  }t	          j        |j        ¦  «        }t	          j        |j        ¦  «        }t          t          t          ||¦  «        d¦  «        ¦  «        }t          j        ||¦  «        }t           j        j                             |¦  «        D ]}	| |	|z  z   ||	<   Œ|S rß   )rŠ   r‹   rŒ   rr   ÚmathÚceilr$  ÚimagÚintrÛ   r–   r§   rû   rx   )
r;  r4  r@  r�   Únitems_cÚnitems_rÚnitems_iÚnitemsÚarrr“   s
             rg   Úarange_4z&arange_parallel_impl.<locals>.arange_4Û  s¶   € ÝŒMÔ ×,Ò,Ñ.Ô.Ð.Ø˜u™¨Ñ,ˆHÝ”y ¤Ñ/Ô/ˆHÝ”y ¤Ñ/Ô/ˆHÝ��S ¨8Ñ4Ô4°aÑ8Ô8Ñ9Ô9ˆFÝ”(˜6 5Ñ)Ô)ˆCÝ”]Ô)×9Ò9¸&ÑAÔAð *ð *�Ø  T¡Ñ)��A‘�ØˆJri   c                 óL  — t           j        j                             ¦   «          t	          j        || z
  |z  ¦  «        }t          t          |d¦  «        ¦  «        }t          j	        ||¦  «        }| }t           j        j         
                    |¦  «        D ]}| ||z  z   ||<   Œ|S rß   )rŠ   r‹   rŒ   rr   rH  rI  rK  rÛ   r§   rû   rx   )	r;  r4  r@  r�   rM  rO  rP  r’   r“   s	            rg   rQ  z&arange_parallel_impl.<locals>.arange_4æ  s™   € ÝŒMÔ ×,Ò,Ñ.Ô.Ð.Ý”y $¨¡,°$Ñ!6Ñ7Ô7ˆHÝ�˜X qÑ)Ô)Ñ*Ô*ˆFÝ”(˜6 5Ñ)Ô)ˆCØˆCÝ”]Ô)×9Ò9¸&ÑAÔAð *ð *�Ø  T¡Ñ)��A‘�ØˆJri   rˆ   rÿ   é   é   zparallel arange with types {})r   r�   ÚanyrŽ   Ú
ValueErrorrÈ   )r¡   r�   r|   r6  r8  r<  r>  rA  rC  rQ  r5  s             @rg   Úarange_parallel_implrW  Å  sY  ø€ Ý˜kÔ/Ñ0Ô0€Nð5ð 5ð 5ð 5ð 5ð,ð ,ð ,ð9ð 9ð 9ð 9ð 9ð0ð 0ð 0ð<ð <ð <ð <ð <ð3ð 3ð 3õ Ð
6Ð
6°Ð
6Ñ
6Ô
6Ñ6Ô6ð ð		ð 		ð 		ð 		ð	ð 	ð 	õ ˆ4�y„y�A‚~€~Ø ˜=ˆxˆx¨nÐ<Ý	ˆT‰Œ�aŠˆØ!˜Mˆxˆx¨~Ð=Ý	ˆT‰Œ�aŠˆØ!˜Mˆxˆx¨~Ð=Ý	ˆT‰Œ�aŠˆØˆåÐ8×?Ò?ÀÑEÔEÑFÔFÐFri   c                 óÔ   ‡— t          | j        ¦  «        Šd„ }ˆfd„}t          |¦  «        dk    r|S t          |¦  «        dk    r|S t          d                     |¦  «        ¦  «        ‚)Nc                 ó.   — t          j        | |d¦  «        S )Né2   )r§   Úlinspace)r;  r4  s     rg   Ú
linspace_2z*linspace_parallel_impl.<locals>.linspace_2þ  s   € ÝŒ{˜5 $¨Ñ+Ô+Ð+ri   c                 ó   •— t           j        j                             ¦   «          t	          j        |‰¦  «        }|dz
  }|| z
  }| |d<   t           j        j                             |¦  «        D ]}| |||z  z  z   ||<   Œ|S r´   )rŠ   r‹   rŒ   rr   r§   rû   rx   )r;  r4  ÚnumrP  ÚdivÚdeltar“   r�   s          €rg   Ú
linspace_3z*linspace_parallel_impl.<locals>.linspace_3  s†   ø€ ÝŒÔ×(Ò(Ñ*Ô*Ð*ÝŒh�s˜EÑ"Ô"ˆØ�A‰gˆØ�u‘ˆØˆˆA‰Ý”Ô%×5Ò5°cÑ:Ô:ð 	/ð 	/ˆAØ˜U a¨#¡gÑ.Ñ.ˆC�‰FˆFØˆ
ri   rÿ   rS  zparallel linspace with types {})r   r�   rŽ   rV  rÈ   )r¡   r|   r\  ra  r�   s       @rg   Úlinspace_parallel_implrb  û  s„   ø€ Ý�[Ô&Ñ'Ô'€Eð,ð ,ð ,ðð ð ð ð õ ˆ4�y„y�A‚~€~ØÐÝ	ˆT‰Œ�aŠˆØÐåÐ:×AÒAÀ$ÑGÔGÑHÔHÐHri   c                 ó   — t           S rq   )rê   ©Úrrð   s     rg   ú<lambda>rf    ó   € Õ%9€ ri   c                 ó   — t           S rq   )rî   rd  s     rg   rf  rf    rg  ri   )©ÚargminÚnumpy©Úargmaxrk  ©r–   rk  ©rÛ   rk  ©Úaminrk  ©Úamaxrk  )Úsumrk  )Úprodrk  )r#  rk  )r,  rk  )Ústdrk  )Údotrk  )r3  rk  )r[  rk  c                 ó*   — |j         dk    rd„ }n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                             ¦   «          t           j        j                             t          | ¦  «        ¦  «        D ]}|| |<   Œd S rq   r	  r‘   s      rg   Úfill_1z"fill_parallel_impl.<locals>.fill_1)  sQ   € ÝŒMÔ ×,Ò,Ñ.Ô.Ð.Ý”]Ô)×9Ò9½#¸f¹+¼+ÑFÔFð  ð  �Ø��q‘	�	Ø�4ri   c                 óŽ   — t           j        j                             ¦   «          t          j        | j        ¦  «        D ]}|| |<   Œd S rq   r  r‘   s      rg   rz  z"fill_parallel_impl.<locals>.fill_1/  sD   € ÝŒMÔ ×,Ò,Ñ.Ô.Ð.Ý”^ F¤LÑ1Ô1ð  ð  �Ø��q‘	�	Ø�4ri   r  )r¡   rP  r’   rz  s       rg   Úfill_parallel_implr|  #  s9   € ð
 „x�1‚}€}ð	ð 	ð 	ð 	ð	ð 	ð 	ð
 €Mri   Úfillc                 ó0   — | dk    rt          d¦  «        ‚d S )Nr   zDzero-size array to reduction operation maximum which has no identity©rV  ©Úarr_sizes    rg   rÙ   rÙ   :  ó)   € à�1‚}€}Ýð <ñ >ô >ð 	>ð €}ri   c                 ó0   — | dk    rt          d¦  «        ‚d S )Nr   zDzero-size array to reduction operation minimum which has no identityr  r€  s    rg   r�   r�   @  r‚  ri   c                 ó0   — | dk    rt          d¦  «        ‚d S )Nr   z*attempt to get argmin of an empty sequencer  r€  s    rg   rà   rà   F  ó!   € à�1‚}€}ÝÐEÑFÔFÐFð €}ri   c                 ó0   — | dk    rt          d¦  «        ‚d S )Nr   z*attempt to get argmax of an empty sequencer  r€  s    rg   rí   rí   K  r…  ri   Úchecker_implÚnameÚfuncrà   rí   r�   rÙ   )ri  rl  rn  ro  rp  rr  c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )Ú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                 ó>   — || _         || _        || _        || _        d S rq   )Úindex_variabler;  r4  r@  )r¸   r�  r;  r4  r@  s        rg   Ú__init__zLoopNest.__init__c  s#   € Ø,ˆÔØˆŒ
ØˆŒ	ØˆŒ	ˆ	ˆ	ri   c                 óZ   — d                      | j        | j        | j        | j        ¦  «        S )Nz3LoopNest(index_variable = {}, range = ({}, {}, {})))rÈ   r�  r;  r4  r@  ©r¸   s    rg   Ú__repr__zLoopNest.__repr__j  s'   € ØEß’�tÔ*¨D¬J¸¼	À4Ä9ÑMÔMð	Ori   c                 ó”  — g }|                      | j        ¦  «         t          | j        t          j        ¦  «        r|                      | j        ¦  «         t          | j        t          j        ¦  «        r|                      | j        ¦  «         t          | j        t          j        ¦  «        r|                      | j        ¦  «         |S rq   )Úappendr�  r�   r;  r	   ÚVarr4  r@  )r¸   Úall_usess     rg   Ú	list_varszLoopNest.list_varsn  sŸ   € Ø€xØ‡‚�tÔ*Ñ+Ô+Ð+Ý
�T”Z¥¤Ñ
(Ô
(ð 'Ø�?Š?˜4œ:Ñ&Ô&Ð&Ý
�T”Y¥¤Ñ
'Ô
'ð &Ø�?Š?˜4œ9Ñ%Ô%Ð%Ý
�T”Y¥¤Ñ
'Ô
'ð &Ø�?Š?˜4œ9Ñ%Ô%Ð%Ø€ri   N)r~   r   r€   Ú__doc__rŽ  r‘  r–  ra   ri   rg   r‹  r‹  \  sN   € € € € € ðð ð
ð ð ðOð Oð Oð	ð 	ð 	ð 	ð 	ri   r‹  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k    sJ ‚|g| _        || _        |	| _        |
| _        g | _        i | _        d | _        t*          j        r-d}t/          |                     | j        ||¦  «        ¦  «         d S d S )NrŒ   )ÚopÚlocrˆ   z9Parallel for-loop #{} is produced from pattern '{}' at {})ÚsetÚsuperr™  rŽ  ÚtypeÚ
id_counterÚidÚ
loop_nestsÚ
init_blockÚ	loop_bodyÚ	index_varÚparamsÚ	equiv_setrŽ   ÚpatternsÚflagsrš  r›  ÚredvarsÚreddictÚlowererr   ÚDEBUG_ARRAY_OPT_STATSrc   rÈ   )r¸   r¤  r¥  r¦  rž  r§  r©  Úpatternr«  rš  r›  ÚfmtÚ	__class__s               €rg   rŽ  zParfor.__init__}  s8  ø€ ð ˆ=Ý‘E”EˆEÝ�f�dÑÔ×$Ò$ØØð 	%ñ 	
ô 	
ð 	
õ
 �t‘*”*Ô'ˆŒÝˆT‰
Œ
ÐÔ Ñ"ÐÔð %ˆŒØ$ˆŒØ"ˆŒØ"ˆŒØˆŒØ"ˆŒõ �7‰|Œ|˜aÒÐÐÐØ ˜	ˆŒØˆŒ
ð '=ˆÔ#ØˆŒ
ØˆŒØˆŒð
 ˆŒÝÔ'ð 	*ØOˆCÝ�#—*’*Ø”'˜7 Cñ)ô )ñ *ô *ð *ð *ð *ð	*ð 	*ri   c                 ó®   — dt          | j        ¦  «        z   t          | j        ¦  «        z   t          | j        ¦  «        z   t          | j        ¦  «        z   S )Nzid=)Ústrr£  Úreprr¤  r¦  r§  r�  s    rg   r‘  zParfor.__repr__±  sJ   € Ø•s˜4œ7‘|”|Ñ#¥d¨4¬?Ñ&;Ô&;Ñ;Ý�”Ñ Ô ñ!Ý#'¨¬Ñ#7Ô#7ñ8ð 	8ri   c                 ó$   — d„ | j         D ¦   «         S )Nc                 ó   — g | ]	}|j         ‘Œ
S ra   ©r�  ©re   rm   s     rg   rh   z-Parfor.get_loop_nest_vars.<locals>.<listcomp>¶  s   € Ð:Ð:Ð: Q�Ô Ð:Ð:Ð:ri   )r¤  r�  s    rg   Úget_loop_nest_varszParfor.get_loop_nest_varsµ  s   € Ø:Ð:¨$¬/Ð:Ñ:Ô:Ð:ri   c                 ó  — g }| j                              ¦   «         D ]&\  }}|j        D ]}||                     ¦   «         z  }ŒŒ'| j        D ]}||                     ¦   «         z  }Œ| j        j        D ]}||                     ¦   «         z  }Œ|S )zslist variables used (read/written) in this parfor by
        traversing the body and combining block uses.
        )r¦  ÚitemsÚbodyr–  r¤  r¥  )r¸   r•  rn   rñ   ÚstmtÚloops         rg   r–  zParfor.list_vars¸  s®   € ð ˆØ”N×(Ò(Ñ*Ô*ð 	-ð 	-‰DˆAˆqØœð -ð -�Ø˜DŸNšNÑ,Ô,Ñ,��ð-ð ”Oð 	)ð 	)ˆDØ˜ŸšÑ(Ô(Ñ(ˆHˆHà”OÔ(ð 	)ð 	)ˆDØ˜ŸšÑ(Ô(Ñ(ˆHˆHàˆri   c                 óŠ   — |�| 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
        )r©  ÚtypemapÚget_shape_classes)r¸   r,  rÁ  Úsave_typemaprÐ   s        rg   rÂ  zParfor.get_shape_classesÉ  sH   € ð ÐØœ>Ô1ˆLØ%,ˆDŒNÔ"ØŒn×.Ò.¨sÑ3Ô3ˆØÐØ%1ˆDŒNÔ"Øˆ
ri   c                 óØ  — |pt           j        }t          d                     | j        ¦  «                             dd¦  «        |¬¦  «         t          d| j        |¬¦  «         t          d| j        |¬¦  «         t          d| j        |¬¦  «         | j	        D ]}t          ||¬¦  «         Œt          d|¬¦  «         | j
                             |¦  «         t          | j                             ¦   «         ¦  «        D ]/\  }}t          d	|›d
�|¬¦  «         |                     |¦  «         Œ0t          d                     | j        ¦  «                             dd¦  «        |¬¦  «         d S )Nzbegin parfor {}é   ú-)Úfilezindex_var = z	params = zraces = zinit block:zlabel ú:zend parfor {})ÚsysÚstdoutrc   rÈ   r£  Úcenterr§  r¨  r›  r¤  r¥  ÚdumpÚsortedr¦  r¼  )r¸   rÇ  ÚloopnestÚoffsetÚblocks        rg   rÌ  zParfor.dumpÛ  sj  € ØÐ!•s”zˆÝÐ ×'Ò'¨¬Ñ0Ô0×8Ò8¸¸SÑAÔAÈÐMÑMÔMÐMÝˆn˜dœn°4Ð8Ñ8Ô8Ð8Ýˆk˜4œ;¨TÐ2Ñ2Ô2Ð2Ýˆj˜$œ*¨4Ð0Ñ0Ô0Ð0Øœð 	'ð 	'ˆHÝ�( Ð&Ñ&Ô&Ð&Ð&Ýˆm $Ð'Ñ'Ô'Ð'ØŒ×Ò˜TÑ"Ô"Ð"Ý# D¤N×$8Ò$8Ñ$:Ô$:Ñ;Ô;ð 	ð 	‰MˆF�EÝˆE   Ð)°Ð5Ñ5Ô5Ð5Ø�JŠJ�tÑÔÐÐÝˆ×%Ò% d¤gÑ.Ô.×6Ò6°r¸3Ñ?Ô?ÀdÐKÑKÔKÐKÐKÐKri   c                 óZ  — | j         €d}t          |¦  «        ‚| j         D ]Š}|                     |¦  «        }|€d}t          |¦  «        ‚t          |t          j        ¦  «        rF|j        t          j        k    r1d}t          j
        |||j        t          j        fz  | j        ¦  «        ‚Œ‹dS )z?
        Check that Parfors params are of valid types.
        Nz?Cannot run parameter validation on a Parfor with params not setzDCannot validate parameter %s, there is no type information availablea˜  Use of a tuple (%s) of length %d in a parallel region exceeds the maximum supported tuple size.  Since Generalized Universal Functions back parallel regions and those do not support tuples, tuples passed to parallel regions are unpacked if their size is below a certain threshold, currently configured to be %d. This threshold can be modified using the Numba environment variable NUMBA_PARFOR_MAX_TUPLE_SIZE.)r¨  rV  Úgetr�   r   Ú	BaseTupleÚcountr   ÚPARFOR_MAX_TUPLE_SIZEr   ÚUnsupportedParforsErrorrž  )r¸   rÁ  ÚmsgÚpÚtys        rg   Úvalidate_paramszParfor.validate_paramsê  sÁ   € ð Œ;ÐðˆCå˜S‘/”/Ð!Ø”ð 	(ð 	(ˆAØ—’˜Q‘”ˆBØˆzð/�å  ‘o”oÐ%Ý˜"�eœoÑ.Ô.ð (Ø”8�fÔ:Ò:Ð:ðO�Cõ !Ô8¸Ø  "¤(­FÔ,HÐIñ:Jà"œhñ(ô (ð (øð!	(ð 	(ri   rq   )r~   r   r€   r¢  rŽ  r‘  rº  r–  rÂ  rÌ  rÚ  Ú__classcell__)r²  s   @rg   r™  r™  y  s¸   ø€ € € € € à€Jð $)Øð2*ð 2*ð 2*ð 2*ð 2*ð 2*ð 2*ðh8ð 8ð 8ð;ð ;ð ;ðð ð ð"ð ð ð ð$Lð Lð Lð Lð(ð (ð (ð (ð (ð (ð (ri   r™  c                 óê   — |j         }t          | ¦  «        }|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_blocksr©  )rŒ   r©  rÁ  rZ   rÝ  Úparfor_blocksÚbackup_equivsets          rg   Ú_analyze_parforrä    s†   € ð Ô$€GÝ& vÑ.Ô.€Mð %Ô/×3Ò3°A°tÑ<Ô<€OØ€NÔ�} iÑ0Ô0Ð0Ý˜ Ñ/Ô/Ð/Ø%Ô0°Ô3€FÔàð 7Ø'6ˆÔ! !Ñ$Øˆrˆ6€Mri   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dS )Ú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| _
        d S )NÚ__numba_parfor_gufuncF)r‰  ÚdictÚreplaced_fnsÚinternal_namer   ÚlistÚfusion_infoÚnested_fusion_infoÚfusion_reportsÚ
hoist_infoÚ	has_setupr�  s    rg   rŽ  zParforDiagnostics.__init__  sW   € àˆŒ	å ™FœFˆÔà4ˆÔÝ&¥tÑ,Ô,ˆÔÝ"-­dÑ"3Ô"3ˆÔØ ˆÔØˆŒØˆŒˆˆri   c                 ó
  — || _         | j         j        j        | _        | j         j        | _        || _        | j        | j        v rd| _        nd| j        ›d| j        ›�| _        |  	                    ¦   «         | _
        d| _        d S )NzInternal parallel functionz	Function ú, T)rÝ  Úfunc_idÚfunc_qualnamerˆ  rž  ÚlineÚfusion_enabledrë  ÚpurposeÚget_parforsÚinitial_parforsrñ  )r¸   rÝ  r÷  s      rg   ÚsetupzParforDiagnostics.setup*  sƒ   € ØˆŒØ”LÔ(Ô6ˆŒ	Ø”LÔ$ˆŒ	Ø,ˆÔØÔ ¤Ð*Ð*Ø7ˆDŒLˆLð +ð 15´	°	°	¸4¼9¸9ÐEˆDŒLð  $×/Ò/Ñ1Ô1ˆÔØˆŒˆˆri   c                 ó   — | j         S rq   ©Ú
_has_setupr�  s    rg   rñ  zParforDiagnostics.has_setup9  s
   € àŒÐri   c                 ó   — || _         d S rq   rý  )r¸   Ústates     rg   rñ  zParforDiagnostics.has_setup=  s   € àˆŒˆˆri   Nc                 óD   — t          |                      ¦   «         ¦  «        S rq   )rŽ   rù  ©r¸   Úblockss     rg   Úcount_parforszParforDiagnostics.count_parforsA  s   € Ý�4×#Ò#Ñ%Ô%Ñ&Ô&Ð&ri   c                 ón   — t          |¦  «        }|                      ||¦  «         t          |¦  «         d S rq   )rÞ  Ú_get_parforsrá  )r¸   rŒ   Úparfors_listr  s       rg   Ú_get_nested_parforsz%ParforDiagnostics._get_nested_parforsD  s9   € Ý# FÑ+Ô+ˆØ×Ò˜& ,Ñ/Ô/Ð/Ý˜VÑ$Ô$Ð$Ð$Ð$ri   c                 óÎ   — |                      ¦   «         D ]O\  }}|j        D ]B}t          |t          ¦  «        r+|                     |¦  «         |                      ||¦  «         ŒCŒPd S rq   )r¼  r½  r�   r™  r“  r  )r¸   r  r  ÚlabelÚblkr¾  s         rg   r  zParforDiagnostics._get_parforsI  s‚   € Ø Ÿ,š,™.œ.ð 	Að 	A‰JˆE�3Øœð Að A�Ý˜d¥FÑ+Ô+ð AØ ×'Ò'¨Ñ-Ô-Ð-Ø×,Ò,¨T°<Ñ@Ô@Ð@øðAð	Að 	Ari   c                 óJ   — g }|                       | j        j        |¦  «         |S rq   )r  rÝ  r  )r¸   r  s     rg   rù  zParforDiagnostics.get_parforsP  s(   € ØˆØ×Ò˜$œ,Ô-¨|Ñ<Ô<Ð<ØÐri   c                 óV  — g }| j                              ¦   «         D ]Œ\  }}|                     dg ¦  «        }|D ]n}t          |j        t
          j        ¦  «        rM|j        j        dk    r=t          t          | j
        |j        ¦  «        }|�|dk    r|                     |¦  «         ŒoŒ�|S )NÚhoistedÚcall)rû   rk  )rð  r¼  rÒ  r�   Úvaluer	   ÚExprr�  r:   r8   rÝ  r“  )r¸   ÚallocsÚpf_idÚdatar¾  Úinstr  s          rg   Úhoisted_allocationsz%ParforDiagnostics.hoisted_allocationsU  s´   € ØˆØœ?×0Ò0Ñ2Ô2ð 	0ð 	0‰KˆE�4Ø—8’8˜I rÑ*Ô*ˆDØð 0ð 0�Ý˜dœj­"¬'Ñ2Ô2ð 0Ø”z”}¨Ò.Ð.Ý$¥]°D´LÀ$Ä*ÑMÔM˜ØÐ+°Ð8JÒ0JÐ0JØ"ŸMšM¨$Ñ/Ô/Ð/øð0ð ˆri   c                 ó
  — t          j        |¦  «        }|i k    rg t          ¦   «         fS t          ¦   «         }|                     ¦   «         D ]}|D ]}|                     |¦  «         ŒŒt          |                     ¦   «         ¦  «        }||z
  }|€t          ¦   «         }t          ¦   «         }t          t          t          |                     ¦   «         ¦  «                             |¦  «        ¦  «        dz   ¦  «        D ]@}| 	                    |¦  «        }	|	�|	||<   Œ|	g k    r|                     |¦  «         Œ;g ||<   ŒAg }
t          |                     ¦   «         ¦  «        D ]}|
                     ||         ¦  «         Œ|
|fS )zf
        compute adjacency list of the fused loops
        and find the roots in of the lists
        Nrˆ   )ÚcopyÚdeepcopyrŸ  ÚvaluesÚaddÚkeysrz   rÛ   ÚunionrÒ  rÍ  r“  )r¸   Ú_arð   ÚvtxÚvrm   Úpotential_rootsÚrootsÚ	not_rootsr’   rn   s              rg   Úcompute_graph_infoz$ParforDiagnostics.compute_graph_infoa  ss  € õ
 ŒM˜"ÑÔˆØ�Š7ˆ7Ø•s‘u”u�9Ðå‰eŒeˆØ—’‘”ð 	ð 	ˆAØð ð �Ø—’˜‘
”
�
�
ðõ ˜aŸfšf™hœh™-œ-ˆØ #Ñ%ˆØˆ=Ý‘E”EˆEõ ‘E”Eˆ	Ý•s�3˜qŸvšv™xœx™=œ=×.Ò.¨sÑ3Ô3Ñ4Ô4°qÑ8Ñ9Ô9ð 	ð 	ˆAØ—%’%˜‘(”(ˆCØˆØ��!‘�Ø˜’�Ø—’˜aÑ Ô Ð Ð à��!‘�ð
 ˆÝ˜Ÿš™œÑ!Ô!ð 	ð 	ˆAØ�HŠH�Q�q”T‰NŒNˆNˆNà�%ˆxˆri   c                 ó:   ‡— ˆ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 ]E}|dz  }||         g k    r|t          | |         ¦  «        z  }Œ, ‰| ||||¦  «        \  }}||z  }|}ŒF||fS r:  ©rŽ   )	ÚfadjÚnadjÚrootÚnfusedÚnserialÚkÚnfÚnsÚ
count_roots	           €rg   r0  z/ParforDiagnostics.get_stats.<locals>.count_root�  sw   ø€ Ø˜$”Zð !ð !�Ø˜1‘�Ø˜”7˜b’=�=Ø�c $ q¤'™lœlÑ*�F�Fà'˜Z¨¨d°A°v¸wÑGÔG‘F�B˜Ø˜b‘L�FØ �G�GØ˜7�?Ð"ri   r   ra   )r¸   r(  r)  r*  r+  r,  r0  s         @rg   Ú	get_statszParforDiagnostics.get_stats‰  sC   ø€ ð		#ð 		#ð 		#ð 		#ð 		#ð %˜* T¨4°°q¸!Ñ<Ô<‰ˆ�Ø�wˆÐri   c                 óÀ   — g }|                      ||         ¦  «         ||         D ]7}||         g k    r)|                      |                      ||¦  «        ¦  «         Œ8|S )zf
        returns a list of nodes reachable in an adjacency list from a
        specified root
        )ÚextendÚreachable_nodes)r¸   Úadjr*  Úfusersr-  s        rg   r4  z!ParforDiagnostics.reachable_nodesœ  sg   € ð
 ˆØ�Š�c˜$”iÑ Ô Ð Ø�T”ð 	<ð 	<ˆAØ�1Œv˜Š|ˆ|Ø—’˜d×2Ò2°3¸Ñ:Ô:Ñ;Ô;Ð;øØˆri   c                 ót  — ||         d         }|j         d         }t          d|j        j        dz
  ¦  «        }| 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 ]\}|rX||         D ]+}|                     |                      ||¦  «        ¦  «         Œ,|r"t          dt          |¦  «        dz
  ¦  «        c S Œ]|j                             ¦   «         D ]=}|j        D ]3}|j        j        |k    r!t          d|j        j        dz
  ¦  «        c c S Œ4Œ>| j        j                             ¦   «         D ]…}	 |j                             |¦  «        }t'          |dz
  dd¦  «        D ]C}|j        |         }t          |t(          ¦  «        st          d|j        j        dz
  ¦  «        } nŒDŒv# t*          $ r Y Œ‚w xY w|S )zX
        pd_id - the parfors id
        parfors_simple - the simple parfors map
        r   rˆ   Úinternalrÿ   éÿÿÿÿ)rª  rÛ   rž  rö  rÝ  Úfilenamer$  rî  rí  r�   Útupler“  Úsort_pf_by_liner–   r¦  r  r½  r  rä   rz   r™  rV  )r¸   r  Úparfors_simpleÚpfr°  rö  r:  r)  Únrootsr(  ÚfrootsÚgraphsÚreported_locÚtmpr5  r-  r  r¾  Úidxr“   s                       rg   r<  z!ParforDiagnostics.sort_pf_by_line¨  sŠ  € ð ˜EÔ" 1Ô%ˆØ”+˜a”.ˆÝ�1�b”f”k A‘oÑ&Ô&ˆØ”<Ô#Ô,ˆØ×.Ò.¨tÔ/FÑGÔG‰ˆˆfØ×.Ò.¨tÔ/?Ñ@Ô@‰ˆˆfØ˜�ˆõ �g�uÑ%Ô%ñ !	!Ø�qŒz˜ZÒ'Ñ'Ø& qœz¨!œ}�ØÔ(¨HÒ4Ð4Ý˜q ,Ô"3°aÑ"7Ñ8Ô8Ð8ð �CØ%ð <ð <˜Øð <Ø%(¨¤Zð Tð T Ø #§
¢
¨4×+?Ò+?ÀÀ>Ñ+RÔ+RÑ SÔ SÐ SÐ SØ"ð <Ý'*¨1­c°#©h¬h¸©lÑ';Ô';Ð ;Ð ;Ð ;øð  "œ|×2Ò2Ñ4Ô4ð Að A˜Ø$'¤Hð Að A˜DØ#œxÔ0°HÒ<Ð<Ý'*¨1¨d¬h¬m¸aÑ.?Ñ'@Ô'@Ð @Ð @Ð @Ð @Ð @ð  =ðAð  $œ|Ô2×9Ò9Ñ;Ô;ð 	!ð 	!˜ð!Ø"%¤(§.¢.°Ñ"4Ô"4˜CÝ%*¨3°©7°A°rÑ%:Ô%:ð *ð * Ø'*¤x°¤{ Ý'1°$½Ñ'?Ô'?ð !*Ý+.¨q°$´(´-À!Ñ2CÑ+DÔ+D DØ$) Eð!*øøõ  *ð !ð !ð !Ø ˜Dð!øøøàˆs   Æ5A2H(È(
H5È4H5c           	      ó*  — t          ¦   «         }t          | j        d„ ¬¦  «        D ]ì}|j        d         }|j        d         }|j        }t          |t          ¦  «        r‰|d         dk    r}|d         dk    rQd                     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 rq   )rž  rö  ©rm   s    rg   rf  z6ParforDiagnostics.get_parfors_simple.<locals>.<lambda>æ  s
   € ¸Q¼U¼Z€ ri   ©Úkeyr   r   rˆ   r8  ú.rÿ   ú z(internal parallel version)Úuserzuser defined pranger   zinternal pndindexz5Parallel for-loop #%s: is produced from %s:
    %s
 
)ré  rÍ  rú  rª  rž  r�   r;  ÚjoinÚreversedrì  ro   r£  )	r¸   Úprint_loop_searchr=  r>  Ú	r_patternr°  rž  Úreplfnr±  s	            rg   Úget_parfors_simplez$ParforDiagnostics.get_parfors_simpleâ  s?  € Ý™œˆõ ˜Ô-Ð3GÐ3GÐHÑHÔHð 	9ð 	9ˆBð œ AœˆIØ”k !”nˆGØ”&ˆCÝ˜'¥5Ñ)Ô)ð !Ø˜1”: Ò)Ð)Ø˜q”z ZÒ/Ð/Ø!$§¢­(µ4¸À¼
À1¼Ñ3FÔ3FÑ*GÔ*GÑ!HÔ!H˜Ø% aœj¨œm˜Ø/5¨v¨vÐ7TÐ7TÐ$U˜	˜	Ø  œ vÒ-Ð-Ø$9˜	˜	Ø  œ zÒ1Ð1Ø$7˜	˜	à ˜qØLˆCØ ð =Ý˜c R¤U¨C°Ð$;Ñ;Ñ<Ô<Ð<Ø%'¨¨iÐ$8ˆN˜2œ5Ñ!Ð!ØÐri   c                 óÆ  — |                       | j        ¦  «        \  }}|                       | j        ¦  «        \  }}t          |¦  «        t          |¦  «        k    rt          |¦  «        }|}nt          |¦  «        }|}t	          t          |¦  «        |¦  «        D ]}|                     g ¦  «         Œt          ¦   «         }	|r&|D ]#}
||
         g k    r|	                     |
¦  «         Œ$||	z  }i }|D ] }|                      ||¦  «        }d||f||<   Œ!i }|	D ] }|                      ||¦  «        }d||f||<   Œ!| 	                    ¦   «         }| 
                    |¦  «         |S )NÚfuseÚnest)r$  rí  rî  rŽ   rz   r“  rŸ  r  r<  r  Úupdate)r¸   r=  r(  r@  r)  Ú_nrootsÚlimrC  rm   r?  re  Ú	all_rootsÚfroots_linesrö  Únroots_linesÚ	all_liness                   rg   Úget_all_lineszParforDiagnostics.get_all_linesÿ  sŽ  € ð ×.Ò.¨tÔ/?Ñ@Ô@‰ˆˆfØ×/Ò/°Ô0GÑHÔH‰ˆˆgåˆt‰9Œ9•s˜4‘y”yÒ Ð Ý�d‘)”)ˆCØˆCˆCå�d‘)”)ˆCØˆCÝ•s˜3‘x”x Ñ%Ô%ð 	ð 	ˆAØ�JŠJ�r‰NŒNˆNˆNõ ‘”ˆØð 	"Øð "ð "�Ø˜”7˜b’=�=Ø—J’J˜q‘M”M�MøØ˜V‘Oˆ	ð ˆØð 	1ð 	1ˆAØ×'Ò'¨¨>Ñ:Ô:ˆDØ!'¨¨D ˆL˜ÑÐàˆØð 	1ð 	1ˆAØ×'Ò'¨¨>Ñ:Ô:ˆDØ!'¨¨D ˆL˜ÑÐà ×%Ò%Ñ'Ô'ˆ	Ø×Ò˜Ñ&Ô&Ð&ØÐri   c                 ó¢  — | j         j        j        }|                      ¦   «         }| j         j        j        }	 t          j        |¦  «                             ¦   «         }n# t          $ r d }Y nw xY w|�rL|�rIt          d„ |D ¦   «         ¦  «        }t          t          ¦  «        }|                     ¦   «         D ]Z\  }	}
||	         d         j        |k    r>|                      |	|¦  «        }||                              t!          |	¦  «        ¦  «         Œ[t          dgd„ |                     ¦   «         D ¦   «         z   ¦  «        }|d|t%          t!          |¦  «        ¦  «        dz   z  z   z   }g }|                     d¦  «         |                     d|z  ¦  «         |                     |dz  dz   ¦  «         d	}t          d
| j         j        j        dz
  ¦  «        }t)          ||¦  «        D ]³\  }}|                     |d ¦  «        }|�dd                     |¦  «        z   }nd}|                     d¦  «        }t%          |¦  «        }|r|                     |dz  ||¦  «        }n|                     |dz  ||¦  «        }|                     |||d …         z   ¦  «         Œ´t3          d                     |¦  «        ¦  «         d S t3          d¦  «         d S )Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS ra   r'  r¹  s     rg   rh   z4ParforDiagnostics.source_listing.<locals>.<listcomp>4  s   € Ð3Ð3Ð3¨�S ™VœVÐ3Ð3Ð3ri   rˆ   c                 ó,   — g | ]}t          |¦  «        ‘ŒS ra   r'  r¹  s     rg   rh   z4ParforDiagnostics.source_listing.<locals>.<listcomp>=  s   € Ð(QÐ(QÐ(Q°A­¨Q©¬Ð(QÐ(QÐ(Qri   rÿ   ú
zParallel loop listing for %srÆ  z	|loop #IDz{0:{1}}| {2}r   ú#ró  Ú rK  zNo source available)rÝ  rž  r:  r  rô  r‰  ÚinspectÚ	getsourcerj   ÚOSErrorrÛ   r   rì  r¼  r<  r“  r´  r  rŽ   rö  Ú	enumeraterÒ  rM  ÚstriprÈ   rc   )r¸   r=  Úpurpose_strr:  rÔ  Ú	func_nameÚlinesÚ	src_widthÚmap_line_to_pfr-  r   Ú
match_lineÚmax_pf_per_liner]   Únewlinesr±  ÚlstartÚnorö  Úpf_idsÚpfstrÚstrippedÚsrclenrn   s                           rg   Úsource_listingz ParforDiagnostics.source_listing+  sÝ  € Ø”<Ô#Ô,ˆØ×"Ò"Ñ$Ô$ˆØ”LÔ(Ô-ˆ	ð	ÝÔ% iÑ0Ô0×;Ò;Ñ=Ô=ˆEˆEøÝð 	ð 	ð 	ØˆEˆEˆEð	øøøàñ "	)�^ñ "	)ÝÐ3Ð3¨UÐ3Ñ3Ô3Ñ4Ô4ˆIÝ(­Ñ.Ô.ˆNØ&×,Ò,Ñ.Ô.ð >ð >‘��1ð " !Ô$ QÔ'Ô0°HÒ<Ð<Ø!%×!5Ò!5°a¸Ñ!HÔ!H�JØ" :Ô.×5Ò5µc¸!±f´fÑ=Ô=Ð=øå! 1 #Ð(QÐ(Q¸×9NÒ9NÑ9PÔ9PÐ(QÑ(QÔ(QÑ"QÑRÔRˆOØ  _½½CÀ¹J¼J¹¼È!Ñ8KÑ%LÑ!LÑMˆEØˆHØ�OŠO˜DÑ!Ô!Ð!Ø�OŠOÐ:¸[ÑHÑIÔIÐIØ�OŠO˜E C™K¨+Ñ5Ñ6Ô6Ð6Ø ˆCå˜˜DœLÔ,Ô1°AÑ5Ñ6Ô6ˆFÝ% e¨VÑ4Ô4ð 7ð 7‘��DØ'×+Ò+¨B°Ñ5Ô5�ØÐ%Ø $§)¢)¨FÑ"3Ô"3Ñ3�E�Eà�EØŸ:š: dÑ+Ô+�Ý˜X™œ�Øð >ØŸ
š
 5¨3¡;°°uÑ=Ô=�A�AàŸ
š
 5¨3¡;°°uÑ=Ô=�AØ—’ ¨1¨V¨W¨W¬:Ñ 5Ñ6Ô6Ð6Ð6Ý�$—)’)˜HÑ%Ô%Ñ&Ô&Ð&Ð&Ð&åÐ'Ñ(Ô(Ð(Ð(Ð(s   ¸&A ÁA.Á-A.c                 ór  ‡ ‡‡— dŠt          ‰¦  «        Š‰                      ‰ j        ¦  «        \  }}‰                      ‰ j        ¦  «        \  }}t          |¦  «        t          |¦  «        k    rt          |¦  «        }|}nt          |¦  «        }|}t	          t          |¦  «        |¦  «        D ]}|                     g ¦  «         Œˆˆ ˆfd„}	ˆˆ ˆfd„}
d}g }t          |                     ¦   «         ¦  «        D ]<\  }}|\  }}}|dk    r||vr |
d||d|¦  «        }Œ%|dk    r |	|||||¦  «        }Œ;J ‚d S )Nú+--c                 óž   •‡‡— ˆˆˆˆˆfd„Š||         g k    r4t          d|z  ¦  «          ‰| ||d¦  «         t          d¦  «         |dz   }|S )Nc           	      ó   •— t          ‰|z  dz  ‰›|›dd›�z   ¦  «         ||         D ]Ô}||         g k    rµg }|                     ‰|dz   z  dz  ‰›|›dd›�z   ¦  «         | |         g k    rG|‰
vrC‰                     | |¦  «        }|D ]*}|                     ‰|dz   z  dz  ‰›|›dd›�z   ¦  «         Œ+‰
                     |¦  «         t          d                     |¦  «        ¦  «         ŒÃ ‰	| |||dz   ¦  «         ŒÕd S )NrK  ú
(parallel)rˆ   ra  )ro   r“  r4  rM  )Úfadj_Únadj_ÚnrootÚdepthr-  r×  Úfusedr“   ÚfacÚprint_gÚreportedr¸   Úswords           €€€€€rg   rƒ  zHParforDiagnostics.print_unoptimised.<locals>.print_nest.<locals>.print_gh  s[  ø€ Ý˜c E™k¨CÑ/¸u¸uÀeÀeÀeÈ\È\Ð2ZÑZÑ[Ô[Ð[Ø˜uœð <ð <�AØ˜Q”x 2’~�~Ø ˜ØŸ
š
 3¨%°!©)Ñ#4°sÑ#:È%È%ÐQRÐQRÐQRÐT`ÐT`Ð=aÑ#aÑbÔbÐbØ  œ8 rš>˜>¨a°xÐ.?Ð.?Ø$(×$8Ò$8¸ÀÑ$BÔ$B˜EØ%*ð kð k Ø #§
¢
¨3°%¸!±)Ñ+<¸sÑ+BÐRWÐRWÐYZÐYZÐYZÐ\hÐ\hÐEiÑ+iÑ jÔ jÐ jÐ jØ Ÿš¨Ñ*Ô*Ð*Ý% d§i¢i°¡n¤nÑ5Ô5Ð5Ð5à˜  u¨a°¸±Ñ;Ô;Ð;Ð;ð<ð <ri   úParallel region %s:r   ra  rˆ   ©ro   rc   )	r}  r~  Útherootr„  Ú	region_idrƒ  r‚  r¸   r…  s	      ` @€€€rg   Ú
print_nestz7ParforDiagnostics.print_unoptimised.<locals>.print_nestg  s‡   øøø€ ð<ð <ð <ð <ð <ð <ð <ð <ð <ð �WŒ~ Ò#Ð#ÝÐ3°iÑ?Ñ@Ô@Ð@Ø�˜˜u g¨qÑ1Ô1Ð1Ý�d‘”�Ø%¨™M�	ØÐri   c                 ó˜  •— g }t          d|z  ¦  «         |                     ‰|z  dz  ‰
›|›dd›�z   ¦  «         ||         g k    rMt          ‰	                     ||¦  «        ¦  «        }|D ]'}|                     ‰|z  dz  ‰
›|›dd›�z   ¦  «         Œ(|dz   }t          d                     |¦  «        ¦  «         t          d¦  «         |S )Nr†  rK  r|  rˆ   ra  )ro   r“  rÍ  r4  rM  rc   )rÙ  r  r5  r€  r‰  r×  r�  r-  r‚  r¸   r…  s           €€€rg   Ú
print_fusez7ParforDiagnostics.print_unoptimised.<locals>.print_fuse~  sì   ø€ ØˆCÝÐ/°)Ñ;Ñ<Ô<Ð<Ø�JŠJ�s˜U‘{ SÑ(¸¸¸u¸u¸uÀlÀlÐ+SÑSÑTÔTÐTØ�5Œz˜RÒÐÝ˜t×3Ò3°C¸Ñ?Ô?Ñ@Ô@�Øð Yð Y�AØ—J’J˜s U™{¨SÑ0ÀÀÀqÀqÀqÈ,È,Ð3WÑWÑXÔXÐXÐXØ! A™ˆIÝ˜$Ÿ)š) C™.œ.Ñ)Ô)Ð)Ý�$‰KŒKˆKØÐri   r   rT  ÚfrU  )rŽ   r$  rí  rî  rz   r“  rÍ  r¼  )r¸   rk  r(  r@  r)  rW  rX  rC  rm   rŠ  rŒ  r‰  r„  rö  ÚinfoÚopt_tyr  r5  r‚  r…  s   `                 @@rg   Úprint_unoptimisedz#ParforDiagnostics.print_unoptimisedW  s”  øøø€ àˆÝ�%‰jŒjˆØ×.Ò.¨tÔ/?Ñ@Ô@‰ˆˆfØ×/Ò/°Ô0GÑHÔH‰ˆˆgåˆt‰9Œ9•s˜4‘y”yÒ Ð Ý�d‘)”)ˆCØˆCˆCå�d‘)”)ˆCØˆCÝ•s˜3‘x”x Ñ%Ô%ð 	ð 	ˆAØ�JŠJ�r‰NŒNˆNˆNð	ð 	ð 	ð 	ð 	ð 	ð 	ð.	ð 	ð 	ð 	ð 	ð 	ð 	ð ˆ	ØˆÝ  §¢¡¤Ñ/Ô/ð 	ð 	‰JˆD�$Ø!%ÑˆF�E˜3Ø˜ÒÐØ Ð(Ð(Ø * 
¨3°°s¸A¸yÑ IÔ I�IøØ˜6Ò!Ð!Ø&˜J t¨T°5¸(ÀIÑNÔN�	�	à�qð	ð 	ri   c           	      ó¶  ‡ ‡‡‡— dŠt          ‰¦  «        Š‰                      ‰ j        ¦  «        \  }}‰                      ‰ j        ¦  «        \  }}t          |¦  «        t          |¦  «        k    rt          |¦  «        }|}nt          |¦  «        }|}t	          t          |¦  «        |¦  «        D ]}|                     g ¦  «         Œt          ¦   «         Šˆˆ ˆˆfd„}	ˆˆ ˆˆfd„}
d}g }t          |                     ¦   «         ¦  «        D ]<\  }}|\  }}}|dk    r||vr |
d||d|¦  «        }Œ%|dk    r |	|||||¦  «        }Œ;J ‚‰r€t          ‰                     ¦   «         ¦  «        D ]\\  }}d}|d	         }|d
         }|d         }|dk    r|dz  }t          ||||||fz  ¦  «         ŒB|dz  }t          ||||fz  ¦  «         Œ]d S t          d¦  «         d S )Nry  c                 óâ   •‡‡‡— ˆˆˆˆˆˆˆ	fd„Š||         g k    rSt          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 k    rN|‰
vrJt          ‰                     | |¦  «        ¦  «        }|dz  }|d                     d„ |D ¦   «         ¦  «        z  }|dz  }‰
                     |¦  «         t	          |¦  «         ‰‰	         dxx         t          |¦  «        z  cc<   n#t	          |dz   ¦  «          ‰| |||dz   ¦  «         ‰‰	         d	xx         dz  cc<   �Œd S )
NrK  z(serialú, fused with loop(s): ró  c                 ó,   — g | ]}t          |¦  «        ‘ŒS ra   ©r´  r¹  s     rg   rh   zZParforDiagnostics.print_optimised.<locals>.print_nest.<locals>.print_g.<locals>.<listcomp>µ  s   € Ð-DÐ-DÐ-D¸­c°!©f¬fÐ-DÐ-DÐ-Dri   ú)r�  rˆ   Ú
serialized)rÍ  r4  rM  r“  ro   rŽ   )r}  r~  r  r€  r-  r×  r�  r‚  rƒ  r‰  r„  r¸   Úsummaryr…  s          €€€€€€€rg   rƒ  zFParforDiagnostics.print_optimised.<locals>.print_nest.<locals>.print_g­  s[  ø€ Ø˜uœð :ñ :�AØ ™+¨Ñ+¸5¸5À!À!À!ÀYÀYÐ.OÑO�CØ˜Q”x 2’~�~Ø "˜Ø  œ8 rš>˜>¨a°xÐ.?Ð.?Ý$*¨4×+?Ò+?ÀÀqÑ+IÔ+IÑ$JÔ$J˜EØÐ#;Ñ;˜CØ 4§9¢9Ð-DÐ-D¸eÐ-DÑ-DÔ-DÑ#EÔ#EÑE˜CØ˜s™
˜Ø Ÿš¨Ñ*Ô*Ð*Ý% cÑ*Ô*Ð*Ø 	Ô*¨7Ð3Ð3Ô3µs¸5±z´zÑAÐ3Ð3Ñ3Ð3å% c¨C¡iÑ0Ô0Ð0Ø˜  u¨a°¸±Ñ;Ô;Ð;Ø˜IÔ& |Ð4Ð4Ô4¸Ñ9Ð4Ð4Ñ4Ñ4ð:ð :ri   r†  rK  r|  r   ©r*  r�  r˜  rˆ   ra  r‡  )
r}  r~  rˆ  r„  r‰  rƒ  r‚  r¸   r™  r…  s
      ``@€€€€rg   rŠ  z5ParforDiagnostics.print_optimised.<locals>.print_nest¬  sÄ   øøøø€ ð:ð :ð :ð :ð :ð :ð :ð :ð :ð :ð :ð$ �WŒ~ Ò#Ð#ÝÐ3°iÑ?Ñ@Ô@Ð@Ý¨5¨5°'°'°'¸<¸<ÐHÑIÔIÐIØ.5ÀÐQRÐ%SÐ%S�˜	Ñ"Ø�˜˜u g¨qÑ1Ô1Ð1Ý�d‘”�Ø%¨™M�	ØÐri   c                 ó|  •— t          d|z  ¦  «         ‰|z  dz  ‰
›|›dd›�z   }g }||         g k    rJt          ‰                     ||¦  «        ¦  «        }|dz  }|d                     d„ |D ¦   «         ¦  «        z  }|t	          |¦  «        ddœ‰	|<   |d	z  }t          |¦  «         t          d
¦  «         |dz   }|S )Nr†  rK  z	(parallelr”  ró  c                 ó,   — g | ]}t          |¦  «        ‘ŒS ra   r–  r¹  s     rg   rh   zIParforDiagnostics.print_optimised.<locals>.print_fuse.<locals>.<listcomp>Ï  s   € Ð!8Ð!8Ð!8¨Q¥# a¡&¤&Ð!8Ð!8Ð!8ri   r   rš  r—  ra  rˆ   )ro   rÍ  r4  rM  rŽ   rc   )rÙ  r  r5  r€  r‰  r×  r�  r‚  r¸   r™  r…  s          €€€€rg   rŒ  z5ParforDiagnostics.print_optimised.<locals>.print_fuseÈ  sæ   ø€ ÝÐ/°)Ñ;Ñ<Ô<Ð<Ø˜‘+ Ñ#°5°5¸%¸%¸%ÀÀÐ&MÑMˆCØˆEØ�5Œz˜RÒÐÝ˜t×3Ò3°C¸Ñ?Ô?Ñ@Ô@�ØÐ/Ñ/�Ø�t—y’yÐ!8Ð!8°%Ð!8Ñ!8Ô!8Ñ9Ô9Ñ9�à*/½#¸e¹*¼*ÐTUÐ!VÐ!VˆG�IÑØ�3‰JˆCÝ˜#ÑÔÐÝ�$‰KŒKˆKØ! A™ˆIØÐri   r   rT  r�  rU  z5
 
Parallel region %s (loop #%s) had %s loop(s) fusedr*  r�  r˜  zE and %s loop(s) serialized as part of the larger parallel loop (#%s).rJ  z&Parallel structure is already optimal.)
rŽ   r$  rí  rî  rz   r“  ré  rÍ  r¼  ro   )r¸   rk  r(  r@  r)  rW  rX  rC  rm   rŠ  rŒ  r‰  r„  rö  rŽ  r�  r  r5  r-  r   r×  r*  r�  r˜  r‚  r™  r…  s   `                       @@@rg   Úprint_optimisedz!ParforDiagnostics.print_optimised˜  sr  øøøø€ ð ˆÝ�%‰jŒjˆØ×.Ò.¨tÔ/?Ñ@Ô@‰ˆˆfØ×/Ò/°Ô0GÑHÔH‰ˆˆgåˆt‰9Œ9•s˜4‘y”yÒ Ð Ý�d‘)”)ˆCØˆCˆCå�d‘)”)ˆCØˆCÝ•s˜3‘x”x Ñ%Ô%ð 	ð 	ˆAØ�JŠJ�r‰NŒNˆNˆNå‘&”&ˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð8	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð" ˆ	ØˆÝ  §¢¡¤Ñ/Ô/ð 	ð 	‰JˆD�$Ø!%ÑˆF�E˜3Ø˜ÒÐØ Ð(Ð(Ø * 
¨3°°s¸A¸yÑ IÔ I�IøØ˜6Ò!Ð!Ø&˜J t¨T°5¸(ÀIÑNÔN�	�	à�qð ð 	DÝ˜wŸ}š}™œÑ/Ô/ð :ð :‘��1ð$�à˜”y�Ø˜'œ
�Ø˜|œ_�
Ø ’?�?Øð +ñ ,�Cõ " #¨¨D°%¸ÀTÐ(JÑ"JÑKÔKÐKÐKà˜3‘J�CÝ! #¨¨D°%Ð(8Ñ"8Ñ9Ô9Ð9Ð9ð:ð :õ ÐBÑCÔCÐCÐCÐCri   c                 ó,  — d}t          d¦  «         | j                             ¦   «         D �]T\  }}|                     dg ¦  «        }|D �]4}t	          |j        t          j        ¦  «        �r	 |j        j        }|dk    räd}|j	        }t          |||fz  ¦  «         	 t          j                             |j        ¦  «        }	n4# t          $ r' t          j                             |j        ¦  «        }	Y nw xY wt#          j        |	¦  «        }
|
rF|j        r?t          d|
|j        dk     rdn	|j        d	z
                                ¦   «         z   ¦  «         t          d
¦  «         d}�Œ# t*          t,          f$ r Y �Œ0w xY w�Œ6�ŒV|st          d¦  «         d S d S )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)rc   rð  r¼  rÒ  r�   r  r	   r  Úattrrž  ro   ÚosÚpathÚrelpathr:  rV  ÚabspathÚ	linecacheÚgetlinesrö  rh  ÚKeyErrorÚAttributeError)r¸   Úfoundr  r  r¾  r  rŸ  r×  rž  r¡  rk  s              rg   Úallocation_hoistz"ParforDiagnostics.allocation_hoistø  sÐ  € ØˆÝÐ$Ñ%Ô%Ð%Øœ?×0Ò0Ñ2Ô2ð 	ñ 	‰KˆE�4Ø—8’8˜I rÑ*Ô*ˆDØð ñ �Ý˜dœj­"¬'Ñ2Ô2ñ ðØ#œzœ˜Ø 7š?˜?ð$;˜Cð
 #'¤(˜CÝ)¨#°°e°Ñ*<Ñ=Ô=Ð=ðEÝ')¤w§¢°s´|Ñ'DÔ'D  øÝ#-ð Eð Eð EÝ')¤w§¢°s´|Ñ'DÔ'D   ðEøøøå$-Ô$6°tÑ$<Ô$<˜EØ$ð w¨¬ð wÝ -Ð.@À5ÈcÌhÐYZÊlÈlÈÈÐ`cÔ`hÐklÑ`lÔCm×CsÒCsÑCuÔCuÑ.uÑ vÔ vÐ vÝ)Ð*]Ñ^Ô^Ð^Ø$(˜EùøÝ$¥nÐ5ð ð ð Ø™ðøøøñ)ñð. ð 	:ÝÐ8Ñ9Ô9Ð9Ð9Ð9ð	:ð 	:s7   Á-/E%Â$CÃE%Ã.C3Ã0E%Ã2C3Ã3A0E%Å%E:Å9E:c                 óø  — t          d¦  «         t          d¦  «         d}| j        r²| j                             ¦   «         D ]˜\  }}|                     dd ¦  «        }|                     dd ¦  «        }|s|st          d|z  ¦  «         ŒHt          d|z  ¦  «         |rt          d¦  «         d	„ |D ¦   «          d
}|rt          d¦  «         d„ |D ¦   «          d
}Œ™|st	          d¦  «         t	          d¦  «         d S )Nrc  zInstruction hoisting:Fr  Únot_hoistedzloop #%s has nothing to hoist.z	loop #%s:z  Has the following hoisted:c                 ó2   — g | ]}t          d |z  ¦  «        ‘ŒS )ú    %srb   rd   s     rg   rh   z7ParforDiagnostics.instruction_hoist.<locals>.<listcomp>&  s$   € Ð:Ð:Ð:¨Q•U˜8 a™<Ñ(Ô(Ð:Ð:Ð:ri   Tz   Failed to hoist the following:c                 ó>   — g | ]\  }}t          d |›d|›�¦  «        ‘ŒS )z    z: rb   ©re   rm   rf   s      rg   rh   z7ParforDiagnostics.instruction_hoist.<locals>.<listcomp>*  s1   € ÐJÐJÐJ±d°a¸•U�U¨1¨1¨1¨a¨aÐ0Ñ1Ô1ÐJÐJÐJri   zNo instruction hoisting foundzP--------------------------------------------------------------------------------)rc   rð  r¼  rÒ  ro   )r¸   Úhoist_info_printedr  r  r  r«  s         rg   Úinstruction_hoistz#ParforDiagnostics.instruction_hoist  s:  € Ýˆb‰	Œ	ˆ	ÝÐ%Ñ&Ô&Ð&Ø"ÐØŒ?ð 	.Ø#œ×4Ò4Ñ6Ô6ð .ð .‘��tØŸ(š( 9¨dÑ3Ô3�Ø"Ÿhšh }°dÑ;Ô;�Øð  {ð ÝÐ:¸UÑBÑCÔCÐCØå�k EÑ)Ñ*Ô*Ð*Øð .ÝÐ8Ñ9Ô9Ð9Ø:Ð:°'Ð:Ñ:Ô:Ð:Ø)-Ð&Øð .ÝÐ<Ñ=Ô=Ð=ØJÐJ¸kÐJÑJÔJÐJØ)-Ð&øØ!ð 	;ÝÐ9Ñ:Ô:Ð:Ý�hÑÔÐÐÐri   rˆ   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d S t          d¦  «         t          t          dz  ¦  «         t          d|z   
                    t          d¦  «        ¦  «         t          t          dz  ¦  «         t          d¦  «         |r(t          d 
                    t          d¦  «        ¦  «         ‰                      |¦  «        }‰                      ¦   «         }|r)t          d|z  ¦  «         t          dt          z  ¦  «         ‰ j        j        j        }	 t          j                             |¦  «        }n/# t          $ r" t          j                             |¦  «        }Y nw xY w|r‰                      ||¦  «         dŠ ‰                      ¦   «         }d„ |D ¦   «         }t)          |¦  «        }|s|	rit*          s:t          d 
                    t          d¦  «        ¦  «         d}t          |¦  «         n(d}t          |¦  «         t          t          dz  ¦  «         |dk    �r°ˆ ˆ fd„}|r8‰ j        D ]0}|\  }}}t          d|›d|›d �¦  «         t          d!|z  ¦  «         Œ1‰ j        i k    r#|	r!t          d"¦  «          |‰ j        d#d$¦  «         |	rs‰ j        rd%}nd&}t          d'                     ||d                     d(„ |D ¦   «         ¦  «        ¦  «        ¦  «         t          t          dz  ¦  «         t          d¦  «         |
r~‰ j        i k    rst          d) 
                    t          d¦  «        ¦  «         t          d*¦  «         d+}d,} |‰ j        ||¦  «         t          t          dz  ¦  «         t          d¦  «         ‰                      |¦  «        }|rTt;          d- 
                    t          d¦  «        ¦  «         ‰                      |¦  «         t;          t          dz  ¦  «         |rTt;          d. 
                    t          d¦  «        ¦  «         ‰                      |¦  «         t;          t          dz  ¦  «         t          d¦  «         t          t          dz  ¦  «         t          d¦  «         |s|r#t          d/ 
                    d0d¦  «        ¦  «         |r‰                       ¦   «          |r‰  !                    ¦   «          d S d S t          d1                     ||¦  «        ¦  «         d S )2Nzself.setup has not been calledzInternal parallel functions r8  z
 Function ró  rK  rL  F)rˆ   rÿ   rS  rT  Tz1Report level unknown, should be one of 1, 2, 3, 4)rÿ   rS  rT  )rS  rT  rS  rT  z
 ú=z% Parallel Accelerator Optimizing: %s rc  zLooking for parallel loopsrÆ  z
Found %s parallel loops.ry  c                 ó   — g | ]	}|j         ‘Œ
S ra   )r£  r¹  s     rg   rh   z*ParforDiagnostics.dump.<locals>.<listcomp>‚  s   € Ð,Ð,Ð,˜q�a”dÐ,Ð,Ð,ri   z Fusing loops zPAttempting fusion of parallel loops (combines loops with similar properties)...
z+Performing sequential lowering of loops...
r9  c                 óˆ   •‡‡‡‡— t          ‰¦  «        Šˆˆˆˆˆfd„}‰                     | ¦  «        \  Š} |‰|¦  «         d S )Nc                 óˆ   •‡— ˆˆˆˆfd„Š|D ]4}t          ‰›|›d‰›�¦  «          ‰‰|d¦  «         t          d¦  «         Œ5d S )Nc                 ó”   •— | |         D ]=}t          ‰|z  dz  ‰›|›d‰›�z   ¦  «         | |         g k    r ‰| ||dz   ¦  «         Œ>d S )NrK  rˆ   ©ro   )r5  r*  r€  r-  r‚  Únode_msgrƒ  r…  s       €€€€rg   rƒ  zYParforDiagnostics.dump.<locals>.dump_graph_indented.<locals>.print_graph.<locals>.print_g•  sv   ø€ Ø!$ T¤ð ;ð ;˜AÝ)¨#°©+¸Ñ*;È5È5ÐRSÐRSÐRSÐU]ÐU]Ð>^Ñ*^Ñ_Ô_Ð_Ø" 1œv¨š|˜|Ø ' ¨¨Q°¸±	Ñ :Ô :Ð :øð;ð ;ri   rK  rˆ   rc  r¸  )	r5  r"  re  rƒ  r‚  rn   r¹  Úroot_msgr…  s	      @€€€€€rg   Úprint_graphzHParforDiagnostics.dump.<locals>.dump_graph_indented.<locals>.print_graph”  s‰   øø€ ð;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð
 #ð *ð *˜Ý%°5°5¸!¸!¸!¸X¸XÐ&FÑGÔGÐGØ˜  1 aÑ(Ô(Ð(Ý% bÑ)Ô)Ð)Ð)ð*ð *ri   )rŽ   r$  )	rð   rº  r¹  r»  r"  r‚  rn   r¸   r…  s	    ``  @@€€rg   Údump_graph_indentedz3ParforDiagnostics.dump.<locals>.dump_graph_indented’  sp   øøøøø€ Ý˜%‘j”j�ð	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð  ×2Ò2°1Ñ5Ô5‘��5Ø�˜A˜uÑ%Ô%Ð%Ð%Ð%ri   z  Trying to fuse loops #z and #rÈ  r­  z
 
Fused loop summary:
z&has the following loops fused into it:z(fused)z4Following the attempted fusion of parallel for-loopsúWith fusion disabledzL
{} there are {} parallel for-loop(s) (originating from loops labelled: {}).c                 ó   — g | ]}d |z  ‘ŒS )z#%sra   r¹  s     rg   rh   z*ParforDiagnostics.dump.<locals>.<listcomp>´  s   € Ð;ZÐ;ZÐ;ZÈ!¸EÀA¹IÐ;ZÐ;ZÐ;Zri   z Optimising loop nests zNAttempting loop nest rewrites (optimising for the largest parallel loops)...
 zis a parallel loopz--> rewritten as a serial loopz Before Optimisation z After Optimisation zLoop invariant code motionr\   z+Function %s, %s, has no parallel for-loops.)"rñ  ÚRuntimeErrorrÝ  rô  rõ  rž  rë  rV  ro   Ú
_termwidthrË  rR  r  r:  r   r¡  r¢  r£  rw  rù  rŽ   Úsequential_parfor_loweringrï  rí  r÷  rÈ   rM  rî  r]  rc   r�  r�  r©  r±  )!r¸   Úlevelrˆ  rö  ri  rø  rO  Ú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:  r¡  r‹   Ú
parfor_idsÚ	n_parforsr×  r¼  ÚreportÚl1Úl2Úafter_fusionrº  r¹  r\  r…  s!   `                               @rg   rÌ  zParforDiagnostics.dump0  sž  øø€ ØŒ~ð 	AÝÐ?Ñ@Ô@Ð@ØŒ|Ô#Ô1ˆØŒ|ÔˆØÔ Ð%Ð%Ø8ˆKØ ˆGˆGð &ð 26°°°t°t°tÐ<ˆKØˆGà!ÐØ$ÐØ#ÐØ$ÐØ!&ÐØ#ÐØ$ÐØ!&ÐØ"'ÐØˆð �LÐ Ð Ø#'Ð Ø#'Ð Ð åÐPÑQÔQÐQà�IÐÐØ"&Ðà�Fˆ?ˆ?Ø%)Ð"à�AŠ:ˆ:Ø#'Ð Ø%)Ð"à�AŠ:ˆ:Ø"&ÐØ&*Ð#Ø!ˆNà�jÒ Ð ¨Ð ØˆFå�eÑÔÐÝ•j 3Ñ&Ñ'Ô'Ð'ÝÐ>ÀÑL×TÒTÕU_ÐadÑeÔeÑfÔfÐfÝ•j 3Ñ&Ñ'Ô'Ð'Ý�bÑÔÐð ð 	PÝÐ6×=Ò=½jÈ#ÑNÔNÑOÔOÐOØ×0Ò0Ð1BÑCÔCˆà×"Ò"Ñ$Ô$ˆØð 	,ÝÐ6¸Ñ>Ñ?Ô?Ð?Ý˜#¥
Ñ*Ñ+Ô+Ð+ð ”<Ô#Ô,ˆð	-õ ”7—?’? 8Ñ,Ô,ˆDˆDøÝð 	-ð 	-ð 	-õ ”7—?’? 8Ñ,Ô,ˆDˆDˆDð		-øøøð  ð 	=Ø×Ò °Ñ<Ô<Ð<ð ˆØ×"Ò"Ñ$Ô$ˆØ,Ð, GÐ,Ñ,Ô,ˆ
Ý˜
‘O”Oˆ	ð ð 		0Ð"6ð 		0Ý-ð 0ÝÐ.×5Ò5µjÀ#ÑFÔFÑGÔGÐGð8�å˜cÑ"Ô"Ð"Ð"àD�Ý˜cÑ"Ô"Ð"Ý�j¨3Ñ.Ñ/Ô/Ð/à�rŠ>‰>ð&ð &ð &ð &ð &ð &ð #ð 2Ø"Ô1ð 2ð 2�FØ"(‘K�B˜˜CÝ!�MÈ2È2È2ÈrÈrÈrÐ"RÑSÔSÐSÝ! (¨S¡.Ñ1Ô1Ð1Ð1àÔ 2Ò%Ð%Ø'ð oÝ!Ð">Ñ?Ô?Ð?à'Ð'¨Ô(8Ð:bÐdmÑnÔnÐnà#ð 	"ØÔ&ð :Ø#Y�L�Là#9�LåÐn×vÒvØ$ i°·²Ð;ZÐ;ZÈzÐ;ZÑ;ZÔ;ZÑ1[Ô1[ñ]ô ]ñ ^ô ^ð ^å�j¨3Ñ.Ñ/Ô/Ð/Ý˜bÑ!Ô!Ð!ð &ð &ØÔ*¨bÒ0Ð0Ý!Ð#<×"DÒ"DÅZÐQTÑ"UÔ"UÑVÔVÐVÝ!Ð"sÑtÔtÐtØ3�HØ?�HØ'Ð'¨Ô(?ÀÈ8ÑTÔTÐTÝ!¥*¨sÑ"2Ñ3Ô3Ð3Ý! "Ñ%Ô%Ð%ð ×*Ò*¨>Ñ:Ô:ˆIà"ð (ÝÐ-×4Ò4µZÀÑDÔDÑEÔEÐEØ×&Ò& yÑ1Ô1Ð1Ý•j 3Ñ&Ñ'Ô'Ð'à#ð (ÝÐ,×3Ò3µJ¸sÑCÔCÑDÔDÐDØ×$Ò$ YÑ/Ô/Ð/Ý•j 3Ñ&Ñ'Ô'Ð'Ý˜"ÑÔÐÝ�* sÑ*Ñ+Ô+Ð+Ý˜%Ñ Ô Ð ð &ð LÐ)@ð LÝÐ:×AÒAÀ"ÀcÑJÔJÑKÔKÐKà%ð (Ø×%Ò%Ñ'Ô'Ð'à&ð )Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)ð )õ ÐG×NÒNÈtÐUYÑZÔZÑ[Ô[Ð[Ð[Ð[s   Æ.G Ç)G:Ç9G:c                 ó8   — d}|t          | j        ¦  «        z  }|S )NzParforDiagnostics:
)rµ  rê  ©r¸   re  s     rg   Ú__str__zParforDiagnostics.__str__à  s!   € Ø#ˆØ	�T�$Ô#Ñ$Ô$Ñ$ˆØˆri   c                 ó
   — d}|S )Nræ  ra   rÓ  s     rg   r‘  zParforDiagnostics.__repr__å  s   € Ø ˆØˆri   rq   )rˆ   )r~   r   r€   r—  rŽ  rû  Úpropertyrñ  Úsetterr  r  r  rù  r  r$  r1  r4  r<  rR  r]  rw  r�  r�  r©  r±  rÌ  rÔ  r‘  ra   ri   rg   ræ  ræ    sµ  € € € € € ðð ðð ð ðð ð ð ðð ñ „Xðð Ôð ð  ñ Ôð ð'ð 'ð 'ð 'ð%ð %ð %ð
Að Að Aðð ð ð

ð 
ð 
ð&ð &ð &ðPð ð ð&
ð 
ð 
ð8ð 8ð 8ðtð ð ð:*ð *ð *ðX*)ð *)ð *)ðX?ð ?ð ?ðB^Dð ^Dð ^Dð@:ð :ð :ð> ð  ð  ð2n\ð n\ð n\ð n\ð`ð ð ð
ð ð ð ð ri   ræ  c                   ó(   — e Zd ZdZ	 dd„Zd„ Zd„ ZdS )ÚPreParforPasszwPreprocessing for the Parfor pass. It mostly inlines parallel
    implementations of numpy functions if available.
    Nc	                 ó¤   — |€i }|| _         || _        || _        || _        || _        || _        || _        |€t          }|| _        dddœ| _	        d S )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	            rg   rŽ  zPreParforPass.__init__î  si   € àˆ?ØˆGØˆŒØˆŒØ"ˆŒØ"ˆŒØ"ˆŒØˆŒàˆŒØ Ð(Ý$6Ð!Ø%:ˆÔ"àØð
ð 
ˆŒ
ˆ
ˆ
ri   c                 óî   — t          | j        | j        | j        | j        ¦  «         | j        j        r|                      | j        j        ¦  «         t          | j        j        ¦  «        | j        _        dS )z(Run pre-parfor processing pass.
        N)
r6   rÝ  rÁ  rÝ  rÞ  rà  rk  Ú_replace_parallel_functionsr  r4   r�  s    rg   rà  zPreParforPass.run  sn   € õ 	  ¤¨d¬lØ $¤°´ñ	@ô 	@ð 	@àŒ<Ôð 	BØ×,Ò,¨T¬\Ô-@ÑAÔAÐAÝ*¨4¬<Ô+>Ñ?Ô?ˆŒÔÐÐri   c           	      ó”	  ‡ ‡‡‡‡‡‡‡— ‰ j         ŠddlmŠ t          |                     ¦   «         ¦  «        Š‰�rŽ‰                     ¦   «         \  }Št          ‰j        ¦  «        D �]\\  Š}t          |t          j
        ¦  «        �r;|j        }‰ j        |j                 Š|j        Št          ‰t          j        ¦  «        r?‰j        dk    r4ˆˆˆˆˆˆ ˆˆfd„}t#          |¦  «        r‰ j        dxx         dz  cc<    �nÅŒšt          ‰t          j        ¦  «        �r§‰j        dk    �r›‰j        dk    �r�‰ j        ‰j        j                 }t          |t(          j        j        ¦  «        �rX|j        }‰j        }|j        }	t          j        |t7          d	¦  «        |	¦  «        }
t(          j                             t<          ¦  «        ‰ j        |
j        <   t          j        d
t<          |	¦  «        }t          j
        ||
|	¦  «        }tA          |¦  «        }|dk    rd}t          j        |t7          d¦  «        |	¦  «        }t)          j!        |¦  «        ‰ j        |j        <   t          j
        t          j"        ||	¦  «        ||	¦  «        }t          j        |t7          d¦  «        |	¦  «        }tG          t<          j        ¦  «        }tH          j%        j         &                    |¦  «        }| '                    ‰ j(        ‰ j        |j                 fi ¦  «         t(          j)         &                    |¦  «        ‰ j        |j        <   t          j         *                    |
d|	¦  «        }t          j
        |||	¦  «        }t          j        |t7          d¦  «        |	¦  «        }t(          j         +                    |¦  «        ‰ j        |j        <   t          j         ,                    ||gd|	¦  «        }t          j
        |||	¦  «        }t[          ‰ j        |j                 ‰ j        |j                 ¦  «        ‰ j.        |<   ||_        ‰j         /                    d|¦  «         ‰j         /                    d|¦  «         ‰j         /                    d|¦  «         ‰j         /                    d|¦  «         ‰ j        dxx         dz  cc<    n�Œ^‰�°ŒdS dS )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                             |d ¦  «        }|€¬t          |¦  «        dk    r™t          |d         t          j	        ¦  «        ryt          ‰j
        |d         j                 t          j        j        ¦  «        rDt                               |d         d ¦  «        }|�!‰j                             d|d         ¦  «         t%          |d u¦  «         t'          ˆfd„‰j        D ¦   «         ¦  «        }ˆfd„‰j        D ¦   «         }	  |‰g|¢R i |¤Ž}n# t*          $ r d }Y nw xY wt%          |d u¦  «          t-          j        |¦  «        j        |i |¤Žj        }t3          j        ‰j        j        j        j        ¦  «        }t8          |d<   t:          |d<   t<          |d<   t>                               |d ¦  «        }|�|j        ||j        <    ‰‰j        |‰‰|‰j         ‰j!        |‰j
        ‰j"        ‰¦  «        \  }}	tG          |d	¬
¦  «        }
|
D ]H}| $                    ¦   «         D ]1\  }}|d         dk    r ||j%        | ‰j&        ‰         j'        g‰|<    nŒ2ŒIdS )Nrÿ   rˆ   r   c              3   ó<   •K  — | ]}‰j         |j                 V — Œd S rq   ©rÁ  rˆ  )re   rm   r¸   s     €rg   rF  zRPreParforPass._replace_parallel_functions.<locals>.replace_func.<locals>.<genexpr>.  s,   øè è € Ð(QÐ(QÀ!¨¬°a´fÔ)=Ð(QÐ(QÐ(QÐ(QÐ(QÐ(Qri   c                 ó<   •— i | ]\  }}|‰j         |j                 “ŒS ra   rë  )re   r-  rm   r¸   s      €rg   ú
<dictcomp>zSPreParforPass._replace_parallel_functions.<locals>.replace_func.<locals>.<dictcomp>/  s(   ø€ Ð'UÐ'UÐ'UÁDÀAÀq¨¨4¬<¸¼Ô+?Ð'UÐ'UÐ'Uri   rŠ   r§   rH  F)Útopological_orderingrx   T)(r>   rÝ  r‰  r8   rã  rÒ  rŽ   r�   r	   r”  rÁ  rˆ  r   r   r  Úreplace_functions_ndarrayr|   Úinsertr;   r;  r¹   Ú	Exceptionr   ÚpysignatureÚbindr  rô  Ú__globals__rŠ   rk  rH  Úreplace_functions_checkers_maprÞ  rß  rÝ  r2   r¼  r~   r½  rž  )Úfunc_defÚcallnameÚ	repl_funcÚtypsÚkws_typsÚnew_funcÚgÚcheckÚ
new_blocksÚ_Ú
call_tabler  r-  r   rÐ  Úexprr“   rè  Úlhs_typr¸   rá  Ú	work_lists                 €€€€€€€€rg   Úreplace_funcz?PreParforPass._replace_parallel_functions.<locals>.replace_func  sÚ  ø€ Ý'5°d´lÀDÄIÑ'NÔ'N˜HÝ'4°T´\À4Ñ'HÔ'H˜HØ(,Ô(B×(FÒ(FÀxÐQUÑ(VÔ(V˜Ià )Ð 1Ý # H¡¤°Ò 2Ð 2Ý *¨8°A¬;½¼Ñ ?Ô ?ð !3å *¨4¬<¸À¼Ô8HÔ+IÝ+0¬>Ô+?ñ!Aô !Að !3õ -F×,IÒ,IÈ(ÐSTÌ+ÐW[Ñ,\Ô,\ 	Ø#,Ð#8à$(¤I×$4Ò$4°Q¸À¼Ñ$DÔ$DÐ$Då# I°TÐ$9Ñ:Ô:Ð:Ý#(Ð(QÐ(QÐ(QÐ(QÀtÄyÐ(QÑ(QÔ(QÑ#QÔ#Q˜DØ'UÐ'UÐ'UÐ'UÈDÌHÐ'UÑ'UÔ'U˜Hð0Ø,5¨I°gÐ,QÀÐ,QÐ,QÐ,QÈÐ,QÐ,Q  øÝ#,ð 0ð 0ð 0Ø+/   ð0øøøå# H°DÐ$8Ñ9Ô9Ð9à#C¥5Ô#4°XÑ#>Ô#>Ô#CÀTÐ#VÈXÐ#VÐ#VÔ#[˜Då $¤	¨$¬,Ô*>Ô*CÔ*OÑ PÔ P˜AÝ).˜A˜g™JÝ&+˜A˜d™GÝ(,˜A˜f™Iõ %C×$FÒ$FÀxØGKñ%Mô %M˜Eà$Ð0Ø05´
  %¤*¡à,?Ð,?ÀÄÈaØ,1°1°hÀÄÐPTÔP^Ø,0°$´,ÀÄÐPYñ-[ô -[™M˜J¨õ *8¸
ÐY^Ð)_Ñ)_Ô)_˜Jð )3ð .ð . Ø,0¯JªJ©L¬Lð !.ð !.¡D A qØ'(¨¤tÐ/@Ò'@Ð'@Ø6>À	Ô@RÐT\Ð^cÔ^hÐijÔ^kÔ^oÐ5p¨°©
Ø(-¨ð (Aøð $( 4s   Ä?E ÅEÅErÛ  rˆ   rÇ   r�   ú	$np_g_varr§   ÚboolÚbool_z$np_typ_varz$dtype_attr_varz
$dtype_varra   rÜ  N)0rá  Únumba.core.inline_closurecallrè  rì  r¼  Úpoprg  r½  r�   r	   ÚAssignÚtargetrÁ  rˆ  r  r  r�  r:   rä  rŸ  r   r   r  r�   Úscoperž  r”  r    ÚmiscÚModulerk  ÚGlobalr´  ÚStringLiteralÚConstÚfind_templaterŠ   ÚcorerQ   Úget_call_typerÞ  Ú	functionsrÇ   rµ   r  rP   rÝ  rð  )r¸   r  r
  ÚinstrÚlhsr  r­   r�   r  rž  Úg_np_varÚg_npÚg_np_assignÚ	dtype_strÚtyp_varÚtyp_var_assignÚdtype_attr_varÚtempÚtfuncÚdtype_attr_getattrÚdtype_attr_assignÚ	dtype_varÚdtype_getattrÚdtype_assignrÐ  r  r“   rè  r  rá  r  s   `                       @@@@@@@rg   ræ  z)PreParforPass._replace_parallel_functions  s™  øøøøøøøø€ ð ”,ˆØEÐEÐEÐEÐEÐEÝ˜Ÿš™œÑ(Ô(ˆ	Øñ x	"Ø$Ÿ=š=™?œ?‰LˆE�5Ý% e¤jÑ1Ô1ð v"ñ v"‘��5Ý˜e¥R¤YÑ/Ô/ñ u"Øœ,�CØ"œl¨3¬8Ô4�GØ œ;�DÝ! $­¬Ñ0Ô0ð q"°T´WÀÒ5FÐ5Fð0(ð 0(ð 0(ð 0(ð 0(ð 0(ð 0(ð 0(ð 0(ð 0(ð 0(ð 0(õb ! Ñ.Ô.ð "Ø œJ Ð7Ð7Ô7¸1Ñ<Ð7Ð7Ñ7Ø!™Eð"õ % T­2¬7Ñ3Ô3ñ ;"¸¼À9Ò8LÑ8LØœ) wÒ.Ñ.ð #œl¨4¬:¬?Ô;˜Ý% c­5¬>Ô+?Ñ@Ô@ñ 6"ð %(¤I˜EØ$)¤K˜EØ"'¤)˜CÝ')¤v¨eµ]À;Ñ5OÔ5OÐQTÑ'UÔ'U˜HÝ:?¼*×:KÒ:KÍEÑ:RÔ:R˜DœL¨¬Ñ7Ý#%¤9¨Tµ5¸#Ñ#>Ô#>˜DÝ*,¬)°D¸(ÀCÑ*HÔ*H˜Kõ ),¨E©
¬
˜IØ(¨FÒ2Ð2Ø,3 	Ý&(¤fØ %¥}°]Ñ'CÔ'CÀSñ'Jô 'J˜Gå9>Ô9LØ )ñ:+ô :+˜DœL¨¬Ñ6å-/¬YÝ "¤¨°CÑ 8Ô 8¸'À3ñ.Hô .H˜Nõ .0¬V°E½=ÐIZÑ;[Ô;[Ð]`Ñ-aÔ-a˜NÝ#0µ´Ñ#=Ô#=˜DÝ$)¤JÔ$4×$=Ò$=¸dÑ$CÔ$C˜EØ!×/Ò/°´ÀÄÈgÌlÔA[Ð@]Ð_aÑbÔbÐbÝ@EÄ×@XÒ@XÐY]Ñ@^Ô@^˜DœL¨Ô)<Ñ=Ý13´·²ÀÈ7ÐTWÑ1XÔ1XÐ.Ý02´	Ð:LÈnÐ^aÑ0bÔ0bÐ-õ )+¬¨uµmÀLÑ6QÔ6QÐSVÑ(WÔ(W˜IÝ;@¼>×;OÒ;OÐPUÑ;VÔ;V˜DœL¨¬Ñ8Ý,.¬G¯LªL¸È'ÈÐTVÐX[Ñ,\Ô,\˜MÝ+-¬9°]ÀIÈsÑ+SÔ+S˜LÝ<EØ $¤¨Y¬^Ô <¸d¼lÈ7Ì<Ô>Xñ=Zô =Z˜DœN¨=Ñ9ð +4˜EœKà!œJ×-Ò-¨a°Ñ>Ô>Ð>Ø!œJ×-Ò-¨aÐ1BÑCÔCÐCØ!œJ×-Ò-¨a°Ñ@Ô@Ð@Ø!œJ×-Ò-¨a°Ñ=Ô=Ð=Ø œJÐ'7Ð8Ð8Ô8¸AÑ=Ð8Ð8Ñ8Ø!˜Eùðq ñ x	"ð x	"ð x	"ð x	"ð x	"ri   ©NN)r~   r   r€   r—  rŽ  rà  ræ  ra   ri   rg   rÙ  rÙ  ê  s^   € € € € € ðð ð ?Cð
ð 
ð 
ð 
ð(@ð @ð @ðA"ð A"ð A"ð A"ð A"ri   rÙ  c                 ój   — t           j        j        j        j        j        D ]}|j        | k    r|c S Œd S rq   )rŠ   r  r   Ú	templatesÚbuiltin_registryr  rI  )r�  Úfts     rg   r  r  �  sB   € ÝŒjÔÔ)Ô:ÔDð ð ˆØŒ6�RŠ<ˆ<ØˆIˆIˆIð ðð ri   c                   ó,   — e Zd ZdZ e¦   «         fd„ZdS )ÚParforPassStateszCThis class encapsulates all internal states of the ParforPass.
    c                 óÖ  — || _         || _        || _        || _        || _        || _        || _        |
| _        |
j        | _	        |
j
        | _
        |
j        | _        t          j        | j        | j         | j        | j        ¦  «        | _        t          j                             t#          |j                             ¦   «         ¦  «        ¦  «         || _        |	| _        d|	vri |	d<   d S d S )Nr‹   )rÝ  rÁ  rÝ  rÞ  rß  r¡   rà  Údiagnosticsrê  Úswapped_fnsrí  rî  rZ   ÚArrayAnalysisr   Ú_the_max_labelrV  rÛ   r  r  r«  Úmetadata)r¸   rÝ  rÁ  rÝ  r¡   rÞ  rß  rà  r«  r2  r.  s              rg   rŽ  zParforPassStates.__init__™  så   € ð ˆŒØˆŒØ"ˆŒØ"ˆŒØ"ˆŒØ&ˆÔØˆŒØ&ˆÔØ&Ô3ˆÔØ&Ô2ˆÔØ"-Ô"@ˆÔå,Ô:ØŒN˜DœL¨$¬,¸¼ñ
ô 
ˆÔõ 	Ô×&Ò&¥s¨7¬>×+>Ò+>Ñ+@Ô+@Ñ'AÔ'AÑBÔBÐBØˆŒ
Ø ˆŒØ˜HÐ$Ð$Ø"$ˆH�YÑÐÐð %Ð$ri   N)r~   r   r€   r—  ræ  rŽ  ra   ri   rg   r,  r,  •  s@   € € € € € ðð ð
 /Ð.Ñ0Ô0ð%ð %ð %ð %ð %ð %ri   r,  c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚConvertInplaceBinopú0Parfor subpass to convert setitem on Arrays
    c                 ó"   — || _         g | _        dS ©zV
        Parameters
        ----------
        pass_states : ParforPassStates
        N©Úpass_statesÚ	rewritten©r¸   r9  s     rg   rŽ  zConvertInplaceBinop.__init__¶  ó   € ð 'ˆÔØˆŒˆˆri   c           	      óz  — | j         }t          |¦  «        }|D �] }||         }g }|j                             |¦  «        }|j        D �]i}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                             t1          ||d¬¦  «        ¦  «         |t          j        ||	|¦  «        g}t          |t2          ¦  «        r|                     |¦  «         �ŒT|                     |¦  «         �Œk||_        �Œ¢d S )NÚinplace_binop©ÚoldÚnewÚreason)r9  r/   rZ   Úget_equiv_setr½  r�   r	   r
  r  r  r  r�  rž  r  ÚrhsrÁ  rˆ  r   r   r  Ú_inplace_binop_to_parforÚimmutable_fnr:  r“  ré  rì  r3  )r¸   r  r9  Ú
topo_orderr
  rÐ  Únew_bodyr©  r  r  r  rž  r  r  Ú
target_typÚ	value_typÚ	new_instrs                    rg   rà  zConvertInplaceBinop.run¿  sÈ  € ØÔ&ˆå$ VÑ,Ô,ˆ
ð  ð 	"ñ 	"ˆEØ˜5”MˆEØˆHØ#Ô2×@Ò@ÀÑGÔGˆIØœð +ñ +�Ý˜e¥R¤YÑ/Ô/ñ QØœ,�CØ œ;�DÝ! $­¬Ñ0Ô0ð Q°T´WÀÒ5OÐ5OØ"œh˜Ø!%¤˜Ø $¤˜Ø%0Ô%8¸¼Ô%E˜
Ø$/Ô$7¸¼
Ô$C˜	å% jµ%´.Ô2FÑGÔGð 	Qå)¨)µU´^Ô5IÑJÔJð QØ,0×,IÒ,IÈ)Ø(+¨TÔ->ÀÈñ-Oô -O 	à $¤× 5Ò 5Ý$(¨U¸	Ø0?ð%Añ %Aô %Añ!"ô !"ð !"ð *3µB´I¸fÀcÈ3Ñ4OÔ4OÐ(P Ý˜e¥TÑ*Ô*ð +Ø—O’O EÑ*Ô*Ð*Ñ*à—O’O EÑ*Ô*Ð*Ñ*Ø!ˆEŒJ‰Jð;	"ð 	"ri   c           
      óÎ  — | j         }|j        }|j        |j                 }|j        }	t          j        ||¦  «        }
|j        |j                 }|                     |¦  «        }t          |j        |||¦  «        \  }}t          ¦   «         }t          j        ||¦  «        }t          |j        |||¦  «        \  }}t          j        |t          d¦  «        |¦  «        }|j        |j        |j        <   t
          j                             |||¦  «        }t          |j        ||¦  «        |j        |<   |j                             t          j        |||¦  «        ¦  «         t          j        |t          d¦  «        |¦  «        }|	|j        |j        <   t
          j                             |||¦  «        }t          |	||¦  «        |j        |<   |j                             t          j        |||¦  «        ¦  «         t          j        |t          d¦  «        |¦  «        }|	|j        |j        <   t
          j                             ||||¦  «        }|j                             t          j        |||¦  «        ¦  «         | j         j                             |	|j        ¦  «        }t          |||¦  «        |j        |<   t          j        ||||¦  «        }t          t0          j        |||	¦  «        |j        |<   |j                             |¦  «         t5          ||
i |||d|j        ¦  «        }||i|_        t:          j        dk    r#t?          d¦  «         |                      ¦   «          |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>  rc  rˆ   zparfor from inplace_binop)!r9  r  rÁ  rˆ  r�   r	   ÚBlockÚ	get_shapeÚ_mk_parfor_loopsr!   Ú_make_index_varr”  r    r  ÚgetitemrP   rÝ  r½  r“  r
  ÚbinoprÞ  Úunify_pairsÚSetItemr   Únoner™  r«  r¦  r   ÚDEBUG_ARRAY_OPTrc   rÌ  )r¸   r©  rž  r�  r  r  r9  r  Úarr_typÚel_typr¥  rJ  Ú	size_varsÚ
index_varsÚ	loopnestsÚ
body_labelÚ
body_blockr§  Úindex_var_typÚ	value_varÚgetitem_callÚ
target_varÚexpr_out_varÚ
binop_exprÚunified_typeÚsetitem_noderŒ   s                              rg   rE  z,ConvertInplaceBinop._inplace_binop_to_parforä  s  € ð
 Ô&ˆØ”ˆØÔ% f¤kÔ2ˆØ”ˆÝ”X˜e SÑ)Ô)ˆ
ØÔ'¨¬
Ô3ˆ	à×'Ò'¨Ñ/Ô/ˆ	õ !1°Ô1DÀiÐQVÐX[Ñ \Ô \Ñˆ
�Iõ  ‘\”\ˆ
Ý”X˜e SÑ)Ô)ˆ
Ý#2ØÔ# U¨J¸
ñ$Dô $DÑ ˆ	�=õ ”F˜5¥-°Ñ"=Ô"=¸sÑCÔCˆ	Ø.7¬oˆÔ˜IœNÑ+Ý”w—’ u¨i¸Ñ=Ô=ˆÝ.7ØŒO˜Y¨ñ/7ô /7ˆÔ˜lÑ+àŒ×Ò�rœy¨°yÀ#ÑFÔFÑGÔGÐGõ ”V˜E¥=°Ñ#?Ô#?ÀÑEÔEˆ
Ø/5ˆÔ˜JœOÑ,Ý”w—’ v¨y¸#Ñ>Ô>ˆÝ.7Ø�G˜]ñ/,ô /,ˆÔ˜lÑ+àŒ×Ò�rœy¨°zÀ3ÑGÔGÑHÔHÐHõ ”v˜e¥]°?Ñ%CÔ%CÀSÑIÔIˆØ17ˆÔ˜LÔ-Ñ.õ ”W—]’] 2 z°9¸cÑBÔBˆ
ØŒ×Ò�rœy¨°\À3ÑGÔGÑHÔHÐHØÔ'Ô1×=Ò=¸fÀiÄoÑVÔVˆÝ,5Ø˜,¨ñ-6ô -6ˆÔ˜jÑ)õ ”z &¨)°\À3ÑGÔGˆÝ.7ÝŒJ˜ °ñ/8ô /8ˆÔ˜lÑ+àŒ×Ò˜|Ñ,Ô,Ð,å˜	 :¨r°3¸	À9Ø-¨{Ô/@ñBô Bˆà&¨
Ð3ˆÔÝÔ! QÒ&Ð&ÝÐ-Ñ.Ô.Ð.Ø�KŠK‰MŒMˆMØˆri   c                 óv   — t           j        }| j        j                             |t          |¦  «        i ¦  «        S rq   ©ÚoperatorrT  r9  rÞ  Úresolve_function_typer;  ©r¸   r|   Úfntys      rg   Ú_type_getitemz!ConvertInplaceBinop._type_getitem$  ó/   € ÝÔˆØÔÔ)×?Ò?ÀÅeÈDÁkÄkÐSUÑVÔVÐVri   N)r~   r   r€   r—  rŽ  rà  rE  ro  ra   ri   rg   r4  r4  ³  sa   € € € € € ðð ðð ð ð#"ð #"ð #"ðJ>ð >ð >ð@Wð Wð Wð Wð Wri   r4  c                 óR   — t          | t          j        ¦  «        r| j        n| j        S rq   )r�   r	   rW  rä   r§  rG  s    rg   Úget_index_varrr  )  s!   € Ý  ¥B¤JÑ/Ô/Ð@ˆ1Œ7ˆ7°Q´[Ð@ri   c                   ó,   — e Zd ZdZd„ Zd„ Zdd„Zd„ ZdS )ÚConvertSetItemPassr5  c                 ó"   — || _         g | _        dS r7  r8  r;  s     rg   rŽ  zConvertSetItemPass.__init__0  r<  ri   c           
      óô  — | j         }t          |¦  «        }|D �]]}||         }g }|j                             |¦  «        }|j        D �]&}t          |t          j        t          j        f¦  «        �rç|j	        }	|j
        }
t          |¦  «        }|j        }|j        |
j                 }|j        |j                 }|j        |j                 }t          |t          j        j        ¦  «        �rmt          |t          j        j        ¦  «        �rVt          |j        t          j        ¦  «        �r6|j        |j        k    �r%t          |t          j        ¦  «        rG|                      ||	|
||¦  «        }| j                             t3          ||d¬¦  «        ¦  «         |}�n»t          |t          j        j        ¦  «        r¤t5          t6          |j        |j        ¦  «        }t          |t          j        ¦  «        rj|j        dk    r_|j        j        |j        k    rJ|                      ||	|
||j        ¦  «        }| j                             t3          ||d¬¦  «        ¦  «         |}n÷|                      |¦  «        }t          |t          j!        ¦  «        r1tE          tG          tI          d„ |j        ¦  «        ¦  «        ¦  «        }n$t          |t          j%        j&        ¦  «        rd}nd}|�qt          |t          j        j        ¦  «        r||j        k    rG|                      ||	|
|||¬¦  «        }| j                             t3          ||d	¬¦  «        ¦  «         |}|                     |¦  «         �Œ(||_        �Œ_d S )
NÚmasked_assign_broadcast_scalarr?  rT  Úmasked_assign_arrayc                 ó@   — t          | t          j        j        ¦  «        S rq   )r�   r   r  Ú	SliceTyperG  s    rg   rf  z(ConvertSetItemPass.run.<locals>.<lambda>r  s   € ­j¸½E¼JÔ<PÑ.QÔ.Q€ ri   rˆ   r   )r™   Úslice)'r9  r/   rZ   rC  r½  r�   r	   ÚStaticSetItemrW  rž  r  rr  r  rÁ  rˆ  r   r   r  r�   ÚBooleanrœ   ÚNumberÚ_setitem_to_parforr:  r“  ré  r:   r>   rÝ  r  r�  rä   rQ  rÓ  rŽ   rì  Úfilterr  rz  )r¸   r  r9  rG  r
  rÐ  rH  r©  r  rž  r  rä   r  rI  Ú	index_typrJ  rK  Úval_defr™   Úsliced_dimss                       rg   rà  zConvertSetItemPass.run9  sŸ  € ØÔ&ˆõ % VÑ,Ô,ˆ
ð  ð I	"ñ I	"ˆEØ˜5”MˆEØˆHØ#Ô2×@Ò@ÀÑGÔGˆIØœð D'ñ D'�Ý˜e¥bÔ&6½¼
Ð%CÑDÔDñ B2Øœ)�CØ"œ\�FÝ)¨%Ñ0Ô0�EØ!œK�EØ!,Ô!4°V´[Ô!A�JØ +Ô 3°E´JÔ ?�IØ +Ô 3°E´JÔ ?�Iå! *­e¬nÔ.BÑCÔCñ 92Ý& yµ%´.Ô2FÑGÔGñ 82Ý& y¤½¼ÑFÔFñ82à&œO¨y¬~Ò=Ñ=å)¨)µU´\ÑBÔBð 6Ø,0×,CÒ,CÀIØ(+¨V°U¸Eñ-Cô -C 	à $¤× 5Ò 5Ý$(¨U¸	Ø/Oð%Qñ %Qô %Qñ!"ô !"ð !"ð )2 ¡å!+¨Iµu´~Ô7KÑ!LÔ!Lð 6Ý*/µÀÔ@SØ05´
ñ+<ô +< å$.¨w½¼Ñ$@Ô$@ð 	!6Ø$+¤J°)Ò$;Ð$;Ø$+¤MÔ$6¸%¼*Ò$DÐ$DØ04×0GÒ0GÈ	Ø,/°¸ÀÄñ1Oô 1O Ià$(¤N×$9Ò$9Ý(,°¸IØ4Ið)Kñ )Kô )Kñ%&ô %&ð %&ð -6 Eøð %.×$7Ò$7¸Ñ$>Ô$>˜Eå)¨)µU´_ÑEÔEð 0õ /2µ$µvØ$QÐ$QØ$-¤Oñ85ô 85ñ 36ô 36ñ /7ô /7  õ ",¨Iµu´zÔ7KÑ!LÔ!Lð 0ð /0  à./ ð
 !&Ð 1Ý%/°	½5¼>Ô;OÑ%PÔ%Pð !2à!,°	´Ò!>Ð!>Ø,0×,CÒ,CÀIØ(+¨V°U¸EÈð -Dñ -Pô -P 	à $¤× 5Ò 5Ý(,°¸IØ4;ð)=ñ )=ô )=ñ!"ô !"ð !"ð )2 Ø—’ Ñ&Ô&Ð&Ñ&Ø!ˆEŒJ‰JðSI	"ð I	"ri   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                             |||¦  «        }t          j                             |	|¦  «        j        }||j        |j        <   |                      |	|f¦  «        |j        |<   |                     t          j        |||¦  «        ¦  «         |}n8t          |t          j        ¦  «        sJ ‚|                     |¦  «        }|j        }g }g }|D ]x}t          j        |t          d¦  «        |¦  «        }|                     |¦  «         t          j        |j        |j        <   |                     t5          |d|d¦  «        ¦  «         Œyt7          ¦   «         }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          !                    t          j        |||¦  «        t          j"        ||||¦  «        g¦  «         |j        |j                 } t          | t          j#        j$        ¦  «        r¥t          j        |t          d¦  «        |¦  «        }!| j        |j        |!j        <   t
          j                             |||¦  «        }tK          | j        | |¦  «        |j        |<   |j                              t          j        ||!|¦  «        ¦  «         n|}!t          j&        |||!|¦  «        }"tK          t          j'        |j        |j                 ||
¦  «        |j        |"<   |j                              |"¦  «         |r-|j                              t          j(        ||¦  «        ¦  «         tR          j*        dk    r#tW          d	¦  «         | ,                    ¦   «          |S )
rM  z$subarrÚparfor_indexr   rˆ   )Úsetitemrc  Nz	$mask_varrN  zparfor from setitem)-r9  r  rÁ  rˆ  r�   r	   rP  r�   r   rÓ  rz  r”  r    r  rT  r   Ú	arraydeclÚget_array_index_typeÚresultro  rÝ  r“  r
  ÚArrayCompatiblerQ  Úuintpr‹  r!   rS  r™  r«  r¦  r½  r3  ÚBranchr   r  rP   rW  rX  ÚJumpr   rY  rc   rÌ  )#r¸   r©  rž  r  rä   r  r™   r9  r  rZ  r[  r�  r¥  r\  Ú
subarr_varrc  Ú
subarr_typÚbool_typr^  r]  Úsize_varr§  r_  r`  ra  rŒ   Ú
true_blockÚ	end_labelÚ
true_labelÚ	end_blockÚmask_varÚmask_valrJ  rb  rh  s#                                      rg   r  z%ConvertSetItemPass._setitem_to_parfor‹  s¨  € ð
 Ô&ˆØ”ˆØÔ% f¤kÔ2ˆØ”ˆØÔ'¨¬
Ô3ˆ	Ý”X˜e SÑ)Ô)ˆ
àð 	'õ ˜i­¬Ñ9Ô9ð ;Ý˜i­¬Ñ9Ô9ð;ð ;ð :ð ˆIåœ ¥}°YÑ'?Ô'?ÀÑEÔEˆJÝœ7Ÿ?š?¨6°5¸#Ñ>Ô>ˆLÝÔ)×>Ò>ÀÈÑSÔSÔZˆJØ3=ˆKÔ 
¤Ñ0Ø26×2DÒ2DÀgÈyÐEYÑ2ZÔ2ZˆKÔ! ,Ñ/Ø×Ò�bœi¨°jÀ#ÑFÔFÑGÔGÐGØˆFˆFõ ˜i­Ô)>Ñ?Ô?Ð@Ð@Ð?Ø!×+Ò+¨FÑ3Ô3ˆIØ ”ˆHð ˆ	Øˆ
Ø!ð 	Bð 	BˆHÝœ˜u¥m°NÑ&CÔ&CÀSÑIÔIˆIØ×Ò˜iÑ(Ô(Ð(Ý27´+ˆKÔ 	¤Ñ/Ø×Ò�X i°°H¸aÑ@Ô@ÑAÔAÐAÐAõ  ‘\”\ˆ
Ý”X˜e SÑ)Ô)ˆ
Ý#2ØÔ# U¨J¸
ñ$Dô $DÑ ˆ	�=å˜	 :¨r°3¸	À9Ø'¨Ô):ñ<ô <ˆàð 	à *¨JÐ7ˆFÔØ#ˆJØˆIˆIõ $™œˆJÝœ %¨Ñ-Ô-ˆJÝ"™œˆIÝœ ¨Ñ,Ô,ˆIØ *¨JØ *¨JØ )¨Ið "ˆFÔõ ”v˜e¥]°;Ñ%?Ô%?ÀÑEÔEˆHØ19ˆKÔ ¤Ñ.Ý”w—’ u¨i¸Ñ=Ô=ˆHØŒO×"Ò"ÝŒy˜ 8¨SÑ1Ô1ÝŒy˜ :¨y¸#Ñ>Ô>ð$ñ ô ð ð
  Ô'¨¬
Ô3ˆ	Ý�i¥¤Ô!5Ñ6Ô6ð 	Ýœ˜u¥m°LÑ&AÔ&AÀ3ÑGÔGˆIØ2;´/ˆKÔ 	¤Ñ/Ýœ7Ÿ?š?¨5°)¸SÑAÔAˆLÝ2;Ø” ¨Mñ3;ô 3;ˆKÔ! ,Ñ/àŒO×"Ò"¥2¤9¨\¸9ÀcÑ#JÔ#JÑKÔKÐKÐKàˆIÝ”z &¨)°YÀÑDÔDˆÝ.7ÝŒJ˜Ô+¨F¬KÔ8¸-Èñ/Qô /QˆÔ˜lÑ+àŒ×Ò˜|Ñ,Ô,Ð,Øð 	<ØŒO×"Ò"¥2¤7¨9°cÑ#:Ô#:Ñ;Ô;Ð;åÔ! QÒ&Ð&ÝÐ'Ñ(Ô(Ð(Ø�KŠK‰MŒMˆMØˆri   c                 óv   — t           j        }| j        j                             |t          |¦  «        i ¦  «        S rq   rj  rm  s      rg   ro  z ConvertSetItemPass._type_getitemé  rp  ri   rq   )r~   r   r€   r—  rŽ  rà  r  ro  ra   ri   rg   rt  rt  -  sm   € € € € € ðð ðð ð ðP"ð P"ð P"ðd\ð \ð \ð \ð|Wð Wð Wð Wð Wri   rt  c                 óZ  — t          |¦  «        }|j        }|dk    s|rÞt          j        |t	          d¦  «        |¦  «        }t
          j                             t
          j        |¦  «        | |j	        <   t          j
                             t          |¦  «        |¦  «        }t          j        |||¦  «        }	|j                             |	¦  «         |t
          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©rž  )rŽ   rž  r	   r”  r    r   Ú
containersÚUniTupler‹  rˆ  r  Úbuild_tuplerì  r
  r½  r“  r   ÚUnsupportedRewriteError)
rÁ  r  r]  r`  Úforce_tupleÚndimsrž  Ú	tuple_varÚ
tuple_callÚtuple_assigns
             rg   rS  rS  î  s  € õ �
‰OŒO€EØ
Œ.€CØˆq‚y€y�K€yÝ”F˜5¥-Ø%ñ#'ô #'Ø(+ñ-ô -ˆ	å"'Ô"2×";Ò";ÝŒK˜ñ# ô # ˆ�	”Ñå”W×(Ò(­¨jÑ)9Ô)9¸3Ñ?Ô?ˆ
Ý”y ¨Y¸Ñ<Ô<ˆØŒ×Ò˜|Ñ,Ô,Ð,Ø�%Ô*×3Ò3µE´KÀÑGÔGÐGÐGØ	�!ŠˆØ˜!Œ}�eœkÐ)Ð)åÔ,Ø:Øð
ñ 
ô 
ð 	
ri   c           	      óþ   — g }g }|D ]s}t          j        |t          d¦  «        |¦  «        }|                     |¦  «         t          j        | |j        <   |                     t          |d|d¦  «        ¦  «         Œt||fS )zN
    Create loop index variables and build LoopNest objects for a parfor.
    r…  r   rˆ   )r	   r”  r    r“  r   r‹  rˆ  r‹  )rÁ  r\  r  rž  r^  r]  r‘  r§  s           rg   rR  rR    sŠ   € ð €IØ€JØð >ð >ˆÝ”F˜5¥-°Ñ"?Ô"?ÀÑEÔEˆ	Ø×Ò˜)Ñ$Ô$Ð$Ý"'¤+ˆ�	”ÑØ×Ò� )¨Q°¸!Ñ<Ô<Ñ=Ô=Ð=Ð=Ø�yÐ Ð ri   c                   óB   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )ÚConvertNumpyPassz]
    Convert supported Numpy functions, as well as arrayexpr nodes, to
    parfor nodes.
    c                 ó"   — || _         g | _        d S rq   r8  r;  s     rg   rŽ  zConvertNumpyPass.__init__  ó   € Ø&ˆÔØˆŒˆˆri   c           	      óB  — | j         }t          |¦  «        }g }|D �]‚}||         }g }|j                             |¦  «        }|j        D �]K}	t          |	t          j        ¦  «        �r|	j        }
|	j	        }| j         j
        |j                 }|                      |¦  «        rÄt          | j        |
¦  «        rF|                      |||
¦  «        }|�,| j                             t%          |	|d¬¦  «        ¦  «         |}	nit          |
t          j        ¦  «        rO|
j        dk    rD|                      |||
|¦  «        }| j                             t%          |	|d¬¦  «        ¦  «         |}	|                     |j        ¦  «         |                     |	¦  «         �ŒM||_        �Œ„d S )NÚnumpy_allocatorr?  Ú	arrayexpr)r9  r/   rZ   rC  r½  r�   r	   r
  r  r  rÁ  rˆ  Ú_is_C_or_F_orderr:   Ú_is_supported_npycallÚ_numpy_to_parforr:  r“  ré  r  r�  Ú_arrayexpr_to_parfor)r¸   r  r9  rG  Ú
avail_varsr
  rÐ  rH  r©  r  r  r  r  rK  s                 rg   rà  zConvertNumpyPass.run!  sÓ  € ØÔ&ˆÝ$ VÑ,Ô,ˆ
ð ˆ
Øð 	"ñ 	"ˆEØ˜5”MˆEØˆHØ#Ô2×@Ò@ÀÑGÔGˆIØœð 'ñ '�Ý˜e¥R¤YÑ/Ô/ñ 0Ø œ;�DØœ,�CØ"Ô.Ô6°s´xÔ@�GØ×,Ò,¨WÑ5Ô5ð .Ý  Ô!;¸TÑBÔBð .Ø(,×(=Ò(=¸iÈÈdÑ(SÔ(S˜IØ(Ð4Ø $¤× 5Ò 5µdØ(-Ø(1Ø+<ð7"ñ 7"ô 7"ñ !#ô !#ð !#ð
 )2 øÝ'¨­b¬gÑ6Ô6ð .¸4¼7ÀkÒ;QÐ;QØ(,×(AÒ(AØ )¨3°°jñ)Bô )B˜Ià œN×1Ò1µ$Ø$)Ø$-Ø'2ð3ñ 3ô 3ñ ô ð ð
 %.˜EØ×%Ò% c¤hÑ/Ô/Ð/Ø—’ Ñ&Ô&Ð&Ñ&Ø!ˆEŒJ‰Jð=	"ð 	"ri   c                 ó  — t          |t          j        j        ¦  «        r|j        dk    o
|j        dk    S |t          u rG| j        j        |         }t          |t          j        j        ¦  «        o|j        dk    o
|j        dk    S dS )NÚCr   F©	r�   r   r   r  Úlayoutrœ   r´  r9  rÁ  ©r¸   Úarr_namer­   s      rg   Ú_is_C_orderzConvertNumpyPass._is_C_orderG  s†   € Ý�h¥¤Ô 4Ñ5Ô5ð 	Ø”? cÒ)Ð?¨h¬m¸aÒ.?Ð?Ø�ˆ_ˆ_ØÔ"Ô*¨8Ô4ˆCÝ˜s¥E¤NÔ$8Ñ9Ô9ð !Ø”J #Ò%ð!à”H˜q’Lð"ð �5ri   c                 ó<  — t          |t          j        j        ¦  «        r!|j        dk    s|j        dk    o
|j        dk    S |t          u rR| j        j        |         }t          |t          j        j        ¦  «        o |j        dk    p
|j        dk    o
|j        dk    S dS )Nr²  ÚFr   Fr³  rµ  s      rg   r¬  z!ConvertNumpyPass._is_C_or_F_orderR  sŸ   € Ý�h¥¤Ô 4Ñ5Ô5ð 	Ø”O sÒ*ÐD¨h¬oÀÒ.DÐ[È(Ì-ÐZ[ÒJ[Ð[Ø�ˆ_ˆ_ØÔ"Ô*¨8Ô4ˆCÝ˜s¥E¤NÔ$8Ñ9Ô9ð !Ø”Z 3Ò&Ð;¨#¬*¸Ò*;ð!à”H˜q’Lð"ð �5ri   c                 óÄ  — | 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                             t+          |j        |j        |j        |j        |||||||¦  «        ¦  «         d                     t1          |j        ¦  «        ¦  «        f}t3          ||i ||||d         |j        ¦  «        }t          j        ||||¦  «        }t9          t:          j        |j        |j                 ||
¦  «        |j        |<   |j                             |¦  «         ||i|_         tB          j"        dk    r#tG          d¦  «         | $                    ¦   «          |S )zegenerate parfor from arrayexpr node, which is essentially a
        map with recursive tree.
        rO  zarray expression {}r   rˆ   zparfor from arrayexpr)%r9  r  rž  r  rÁ  rˆ  r�   rQ  rR  r	   rP  rX   rÞ  rÝ  r;  r½  r!   r”  r    rS  r3  Ú_arrayexpr_tree_to_irrÝ  rÈ   Úrepr_arrayexprr™  r«  rW  rP   r   rX  r“  r¦  r   rY  rc   rÌ  )r¸   r©  r  r«  r°  r9  r  rž  r  rZ  r[  r\  r]  r^  r¥  r_  r`  re  r§  ra  ÚpatrŒ   rh  s                          rg   r¯  z%ConvertNumpyPass._arrayexpr_to_parfor]  sX  € ð Ô&ˆØ”	ˆØŒgˆØŒ~ˆØÔ% c¤hÔ/ˆØ”ˆð ×'Ò'¨Ñ,Ô,ˆ	Ý 0°Ô1DÀiÐQVÐX[Ñ \Ô \Ñˆ
�Iõ ”X˜e SÑ)Ô)ˆ
Ý"ØÔ!ØÔ Ô!6¸Ý�)ÑÔ˜f e¨SØÔ ¤Ô)ñ	+ô +ˆ
Œõ
  ‘\”\ˆ
Ý”X˜e SÑ)Ô)ˆ
Ý”v˜e¥]°?Ñ%CÔ%CÀSÑIÔIˆØ17ˆÔ˜LÔ-Ñ.å#2ØÔ ¨
°Jñ$@ô $@Ñ ˆ	�=ð 	Œ×ÒÝ!ØÔ#ØÔ%ØÔ#ØÔ%ØØØØØØØñô ñ	ô 	ð 	ð %×+Ò+­N¸9¼>Ñ,JÔ,JÑKÔKÐMˆå˜	 :¨r°3¸	À9ÈcÐRSÌfÐVaÔVgÑhÔhˆå”z # y°,ÀÑDÔDˆÝ.7ÝŒJ˜Ô+¨C¬HÔ5°}Àfñ/Nô /NˆÔ˜lÑ+àŒ×Ò˜|Ñ,Ô,Ð,Ø&¨
Ð3ˆÔÝÔ! QÒ&Ð&ÝÐ)Ñ*Ô*Ð*Ø�KŠK‰MŒMˆMØˆri   c                 óÆ   — t          | j        j        |¦  «        \  }}t          |t          ¦  «        r|                     d¦  «        sdS |dv rdS |dk    r|t          v rdS dS )zLcheck if we support parfor translation for
        this Numpy call.
        rk  F©rö   ÚonesTúnumpy.random)r8   r9  rÝ  r�   r´  Ú
startswithrV   )r¸   r  Ú	call_nameÚmod_names       rg   r­  z&ConvertNumpyPass._is_supported_npycall—  sz   € õ ,¨DÔ,<Ô,DÀdÑKÔKÑˆ	�8Ý˜8¥SÑ)Ô)ð 	¨h×.AÒ.AÀ'Ñ.JÔ.Jð 	Ø�5ØÐ)Ð)Ð)Ø�4Ø�~Ò%Ð%¨)µ|Ð*CÐ*CØ�4àˆuri   c                 óö   — t          | j        j        |¦  «        \  }}|j        }t	          |j        ¦  «        }|dv s|dk    r|                      ||||||¦  «        S t          j        d|› �|j	        ¬¦  «        ‚)Nr¿  rÁ  zparfor translation failed for rš  )
r8   r9  rÝ  r|   ré  r¹   Ú_numpy_map_to_parforr   rž  rž  )r¸   r©  r  r  rÃ  rÄ  r|   r¹   s           rg   r®  z!ConvertNumpyPass._numpy_to_parfor¥  sŽ   € Ý+¨DÔ,<Ô,DÀdÑKÔKÑˆ	�8ØŒyˆÝ�4”8‰nŒnˆØÐ)Ð)Ð)¨X¸Ò-GÐ-GØ×,Ò,¨Y¸	À3ÈÈcÐSWÑXÔXÐXåÔ,Ø3¨TÐ3Ð3¸¼ð
ñ 
ô 
ð 	
ri   c                 óž  — | j         }|j        }|j        }	|j        |j                 }
|
j        }|                     |¦  «        }|€!t          j        dk    rt          d¦  «         dS 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                             |¦  «         |j        |j        j                                      t;          j        ¦   «         ||¦  «        |j        |<   |}n"t?          d                      |¦  «        ¦  «        ‚t          j!        |||	¦  «        }|j         "                    |¦  «         t          j#        ||||	¦  «        }tI          tJ          j&        |j        |j                 ||¦  «        |j        |<   |j         "                    |¦  «         tO          ||i |	||d	                      |¦  «        d
f|j(        ¦  «        }||i|_)        t          j        dk    r#t          d¦  «         | *                    ¦   «          |S )z8generate parfor from Numpy calls that are maps.
        Nrˆ   z3Could not convert numpy map to parfor, unknown sizerO  rö   r   rÀ  z,Map of numpy.{} to parfor is not implementedú{} functionzNumPy mappingzgenerated parfor for numpy map:)+r9  r  rž  rÁ  rˆ  r�   rQ  r   rY  rc   rR  r	   rP  rX   rÞ  rÝ  r;  r½  r!   r”  r    rS  r  rV   Ú_remove_size_argÚ_get_call_arg_typesr	  r‰  r  r   ÚContextr«   rÈ   r
  r“  rW  rP   r   rX  r™  r«  r¦  rÌ  )r¸   r©  rÃ  r  r|   r¹   r  r9  r  rž  rZ  r[  r\  r]  r^  r¥  r_  r`  re  r§  ra  r  Únew_arg_typsÚnew_kw_typesÚvalue_assignrh  rŒ   s                              rg   rÆ  z%ConvertNumpyPass._numpy_map_to_parfor°  sB  € ð Ô&ˆØ”	ˆØŒgˆØÔ% c¤hÔ/ˆØ”ˆð ×'Ò'¨Ñ,Ô,ˆ	ØÐÝÔ%¨Ò*Ð*ÝÐKÑLÔLÐLØ�4å 0°Ô1DÀiÐQVÐX[Ñ \Ô \Ñˆ
�Iõ ”X˜e SÑ)Ô)ˆ
Ý"ØÔ!ØÔ Ô!6¸Ý�)ÑÔ˜f e¨SØÔ ¤Ô)ñ	+ô +ˆ
Œõ
  ‘\”\ˆ
Ý”X˜e SÑ)Ô)ˆ
Ý”v˜e¥]°?Ñ%CÔ%CÀSÑIÔIˆØ17ˆÔ˜LÔ-Ñ.å#2ØÔ ¨
°Jñ$@ô $@Ñ ˆ	�=ð ˜ÒÐÝ”H˜V˜V A™YœY¨Ñ,Ô,ˆEˆEØ˜&Ò Ð Ý”H˜V˜V A™YœY¨Ñ,Ô,ˆEˆEØ�,Ð&Ð&å˜Y¨Ñ-Ô-Ð-å)<Ø�kÔ)ñ*+ô *+Ñ&ˆL˜,àÔ!×%Ò% dÑ+Ô+Ð+Ø*5Ô*=¸d¼i¼nÔ*M×*[Ò*[Ý”Ñ Ô  ,°ñ+>ô +>ˆKÔ! $Ñ'àˆEˆEå%Ø>×EÒEÀiÑPÔPñRô Rð Rõ ”y ¨°cÑ:Ô:ˆØŒ×Ò˜|Ñ,Ô,Ð,å”z # y°,ÀÑDÔDˆÝ.7ÝŒJ˜Ô+¨C¬HÔ5°}Àfñ/Nô /NˆÔ˜lÑ+àŒ×Ò˜|Ñ,Ô,Ð,å˜	 :¨r°3¸	À9Ø&×-Ò-¨iÑ9Ô9¸?ÐKØ#Ô)ñ+ô +ˆð '¨
Ð3ˆÔÝÔ! QÒ&Ð&ÝÐ3Ñ4Ô4Ð4Ø�KŠK‰MŒMˆMØˆri   N)r~   r   r€   r—  rŽ  rà  r·  r¬  r¯  r­  r®  rÆ  ra   ri   rg   r¦  r¦    s�   € € € € € ðð ðð ð ð$"ð $"ð $"ðL	ð 	ð 	ð	ð 	ð 	ð8ð 8ð 8ðtð ð ð	
ð 	
ð 	
ðBð Bð Bð Bð Bri   r¦  c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚConvertReducePassz:
    Find reduce() calls and convert them to parfors.
    c                 ó"   — || _         g | _        d S rq   r8  r;  s     rg   rŽ  zConvertReducePass.__init__ù  r¨  ri   c           	      ó  — | j         }t          |¦  «        }|D ]ï}||         }g }|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                             t%          |	|d¬¦  «        ¦  «         |	}|                     |¦  «         Œ»||_        Œðd S )N)r   râ   )r   Ú
_functoolsr   )rA  r@  rB  )r9  r/   rZ   rC  r½  r�   r	   r
  rž  r  r  r:   r8   rÝ  Ú_reduce_to_parforr|   r:  r“  ré  )r¸   r  r9  rG  r
  rÐ  rH  r©  r  rŒ   rž  r  r  r÷  s                 rg   rà  zConvertReducePass.runý  s:  € ØÔ&ˆå$ VÑ,Ô,ˆ
Øð 	"ð 	"ˆEØ˜5”MˆEØˆHØ#Ô2×@Ò@ÀÑGÔGˆIØœð 'ð '�Ø�Ý˜e¥R¤YÑ/Ô/ð 'Øœ)�CØœ,�CØ œ;�DÝ$¥]°KÔ4GÈÑNÔN�HØ Ð$:Ò:Ð:Ø#Ð'?Ò?Ð?å!& tÔ'=¸yÈ#Ø'+¤y°#ñ"7ô "7˜àð 'Øœ×-Ò-­dØ &Ø %Ø#+ð/ñ /ô /ñ ô ð ð
 !'˜Ø—’ Ñ&Ô&Ð&Ð&Ø!ˆEŒJˆJØˆri   c                 ó,  ‡— | j         }|j        }|d         }|d         }t          |j        |j        ¦  «        }	d}
d}t          t          |j        |j        |	¦  «        }|r|\  }}
}}|d         }|                     |€|n|
¦  «        }|€dS t          |j        |||¦  «        \  Š}‰}|rt          d¦  «        ‚|}t          j        ||¦  «        }|j                             t          j        |||¦  «        ¦  «         t#          ¦   «         }|                      |||‰||¦  «        \  }}|rt          d¦  «        ‚|
�ôt'          |                     ¦   «         ¦  «        }t+          |                     ¦   «         ¦  «        }t          j        ||¦  «        }|||<   t          j        |t/          d¦  «        |¦  «        }||j        |j        <   t          j                             |
||¦  «        }|j                             t          j        |||¦  «        t          j        ||||¦  «        g¦  «         t9          ||||||d                     |¦  «        d	f|j        ¦  «        }t>          j         dk    r#tC          d
¦  «         | "                    ¦   «          |S )zy
        Convert a reduce call to a parfor.
        The call arguments should be (call_name, array, init_value).
        r   rˆ   Nrÿ   Úunreachablec              3   ó0   •K  — | ]}|r|n‰d          V — ŒdS ©r   Nra   ©re   rm   r]  s     €rg   rF  z6ConvertReducePass._reduce_to_parfor.<locals>.<genexpr>:	  s0   øè è € ÐOÐO¸Q AÐ8˜q˜q¨:°a¬=ÐOÐOÐOÐOÐOÐOri   ú	$mask_valrÈ  Ú	reductionzparfor from reduction)#r9  r  r>   rÝ  rˆ  r:   Ú
_find_maskrÁ  rQ  rR  ÚAssertionErrorr;  r	   rP  r½  r“  r
  r!   Ú_mk_reduction_bodyr–   r  rÛ   r”  r    r  rT  r3  rŒ  r™  rÈ   r«  r   rY  rc   rÌ  )r¸   r©  r  r|   rž  r9  r  rÃ  r…   Úarr_defr–  Úmask_indicesÚmask_query_resultÚmask_typrç   r\  r^  Ú
mask_indexÚacc_varr¥  r_  r§  r¦  r”  Úfalse_labelr`  Úmaskr—  rŒ   r]  s                                @rg   rÔ  z#ConvertReducePass._reduce_to_parfor	  s«  ø€ ð
 Ô&ˆà”	ˆØ˜”Gˆ	Ø�a”ˆÝ  Ô!4°f´kÑBÔBˆàˆØˆõ "¥*¨kÔ.AÀ;ÔCVÐX_Ñ`Ô`ÐØð 	IØ7HÑ4ˆF�H˜h¨à˜”7ˆØ×'Ò'°,Ð2F¨¨ÈHÑUÔUˆ	ØÐØ�4å 0°Ô1DÀiÐQVÐX[Ñ \Ô \Ñˆ
�IØˆ
Øð 	På  Ñ/Ô/Ð/àˆõ ”X˜e SÑ)Ô)ˆ
ØŒ×Ò�rœy¨°7¸CÑ@Ô@ÑAÔAÐAõ  ‘\”\ˆ
Ø#×6Ò6°yØ % s¨J¸Àñ Iô  IÑˆ	�9àð 	&å  Ñ/Ô/Ð/ð ÐÝ˜YŸ^š^Ñ-Ô-Ñ.Ô.ˆJÝ˜iŸnšnÑ.Ô.Ñ/Ô/ˆKÝœ %¨Ñ-Ô-ˆJØ$.ˆI�jÑ!Ý”6˜%¥¨{Ñ!;Ô!;¸SÑAÔAˆDØ-5ˆKÔ ¤	Ñ*Ý”w—’ x°¸CÑ@Ô@ˆHØŒO×"Ò"ÝŒy˜ 4¨Ñ-Ô-ÝŒy˜˜z¨;¸Ñ<Ô<ð$ñ ô ð õ
 ˜	 :¨y¸#¸yØ! M×$8Ò$8¸Ñ$CÔ$CØ$/ð$1Ø2=Ô2CñEô Eˆõ Ô! QÒ&Ð&ÝÐ)Ñ*Ô*Ð*Ø�KŠK‰MŒMˆMØˆri   c           	      ó  — ddl m} | j        }t          |j        |¦  «        }	 ||j        |	¦  «        }
|j        |j                 }|j        }t          j	        ||¦  «        }t          |j        |||¦  «        \  }}t          j        |t          d¦  «        |¦  «        }||j        |j        <   t          j                             |||¦  «        }t          |||¦  «        |j        |<   |                     t          j        |||¦  «        ¦  «         t'          |
|j        j        j        j        |j        |j        ||f|j        |j        ¦  «        }|j        }t5          ¦   «         }t          j	        ||¦  «        }|||<   t7          |j                             ¦   «         ¦  «        }|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è  r9  r>   rÝ  rÁ  rˆ  r�   r	   rP  rS  r”  r    r  rT  rP   rÝ  r“  r
  r=   rô  r‰  rô  rÞ  rß  r  r!   r–   r  r½  r3  r@   rA   )r¸   rÃ  r  rž  r]  r…   rä  rè  r9  Úreduce_funcÚfcoderZ  Úin_typr`  r§  Úindex_var_typeÚtmp_varrc  Úreduce_f_irr¦  r“  r•  Úfirst_reduce_labelÚfirst_reduce_blocks                           rg   rÞ  z$ConvertReducePass._mk_reduction_body_	  s  € ð
 	DÐCÐCÐCÐCÐCàÔ&ˆÝ$ [Ô%8¸)ÑDÔDˆØ!Ð! +Ô"5°{ÑCÔCˆàÔ% f¤kÔ2ˆØ”ˆÝ”X˜e SÑ)Ô)ˆ
Ý$3ØÔ ¨
°Jñ%@ô %@Ñ!ˆ	�>õ ”&˜¥¨fÑ 5Ô 5°sÑ;Ô;ˆØ,2ˆÔ˜GœLÑ)Ý”w—’ v¨y¸#Ñ>Ô>ˆÝ.7Ø�G˜^ñ/-ô /-ˆÔ˜lÑ+à×Ò�"œ) L°'¸3Ñ?Ô?Ñ@Ô@Ð@å)¨%Ø(3Ô(;Ô(CÔ(HÔ(TØ(3Ô(=Ø(3Ô(=Ø)/°Ð(8Ø(3Ô(;Ø(3Ô(=ñ?ô ?ˆð  Ô&ˆ	Ý‘L”Lˆ	Ý”H˜U CÑ(Ô(ˆ	Ø(ˆ	�)ÑÝ  Ô!3×!8Ò!8Ñ!:Ô!:Ñ;Ô;ÐØ(Ô/Ð0BÔCÐØŒ×ÒÐ1Ô6Ñ7Ô7Ð7Ø",¤/ÐÔÝÐ,¨w¸Ð.@ÑAÔAÐAÝ˜	 7¨IÑ6Ô6Ð6Ø˜)Ð#Ð#ri   N)r~   r   r€   r—  rŽ  rà  rÔ  rÞ  ra   ri   rg   rÐ  rÐ  õ  s^   € € € € € ðð ðð ð ðð ð ð>Að Að AðF)$ð )$ð )$ð )$ð )$ri   rÐ  c                   óB   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )ÚConvertLoopPassz*Build Parfor nodes from prange loops.
    c                 ó"   — || _         g | _        d S rq   r8  r;  s     rg   rŽ  zConvertLoopPass.__init__Ž	  r¨  ri   c                 ó,  ‡‡;‡<‡=‡>‡?‡@‡A‡B‡C‡D— | j         ŠDt          ‰¦  «        \  }}t          ‰¦  «        }t          ‰¦  «        }t	          |‰|j        |j        ¦  «        Š>|                     ¦   «         ŠCˆCfd„‰C                     ¦   «         D ¦   «         }g }t          |d„ ¬¦  «        D �	]k\  Š?}t          ‰?j        ¦  «        dk    st          ‰?j        ¦  «        dk    rÃt          j        s¶‰?j        D ]®}	‰|	         j        D ]ž}
t!          |
t"          j        ¦  «        r‚t!          |
j        t"          j        ¦  «        rc|
j        j        dk    rS|                      |
j        j        j        |¦  «        r.d}t3          j        t7          j        ||
j        ¦  «        ¦  «         ŒŸŒ¯Œùt=          ‰?j        ¦  «        d         }	‰|	         j        D �]I}
t!          |
t"          j        ¦  «        �r+t!          |
j        t"          j        ¦  «        �r|
j        j        dk    �rú|                      |
j        j        j        |¦  «        �rÔˆˆ?fd„‰?j        D ¦   «         }|
j        j        }|                       |
j        j        j        |¦  «        \  }}‰‰?j!                 j        d d	…         }d ŠAtE          |¦  «        D ]^\  }}t!          |t"          j        ¦  «        r?t!          |j        t"          j        ¦  «        r |j        j        d
k    r|j#        j        ŠA|} nŒ_‰A€J ‚|d |…         ||dz   d …         z   }tI          d‰‰?j!                 i‰Dj%        ¦  «        \  }}|d         }tM          ˆAfd„|D ¦   «         ¦  «        ŠB‰B '                    ‰A¦  «         ‰|	         j(        }|
j        }‰Dj)         *                    ‰?j!        ¦  «        }t#          j+        ||¦  «        }|  ,                    ‰|	         ||¦  «        |_        ˆfd„|D ¦   «         Š@t[          ¦   «         }t#          j+        ||¦  «        ‰@|<   tM          ¦   «         }|D ]"}| .                    |j        |         ¦  «        }Œ#tM          ¦   «         }‰?j        D ]}| .                    ‰>|         ¦  «        }Œ| /                    |¦  «        }| /                    ˆDfd„|D ¦   «         ¦  «        }|D ]F}‰@|         j        d	         }t!          |t"          j0        ¦  «        r|j#        ‰?j!        k    r||_#        ŒGˆ@ˆBfd„Š;d } d }!ˆ;ˆ>ˆ?ˆDfd„}"d}#|dk    �rÕ| 1                    |d         ¦  «        sJ ‚te          |"|d         ¦  «        }$|$r|$\  }%} }&}!n|d         }%t!          |%t"          j3        ¦  «        sJ ‚‰Dj%        |%j                 }'t!          |'th          j5        ¦  «        rSt#          j3        |tm          d¦  «        |¦  «        Š<th          j7        ‰Dj%        ‰<j        <   tq          ‰<d|%d¦  «        gŠC‰<gŠ=n3| 9                    |!€|%n| ¦  «        }(tu          ‰Dj%        |(||¦  «        \  Š=ŠCt          ‰C¦  «        dk    sJ ‚‰=})|!rtw          ˆ=fd„|!D ¦   «         ¦  «        Š=‰@ty          ‰@                     ¦   «         ¦  «                 }*t#          j+        ||¦  «        }+t{          ‰Dj%        |‰=|+d¬¦  «        \  Š<},|+j        |*j        z   }-|-|*_        |!r	|)d         }.n‰<}.| �t}          d¦  «        ‚�n±d}5d}6|d         }7t          |¦  «        dk    r|d         }5|d         }7t          |¦  «        dk    r¸|d         }5|d         }7	 ‰DjD         E                    |d         ¦  «        }6n)# tŒ          $ r t7          jG        d|
j        ¬¦  «        ‚w xY wt!          |6t"          jH        ¦  «        st7          jG        d|
j        ¬¦  «        ‚|6j        }6|6dk    rt7          jG        d|
j        ¬¦  «        ‚t#          j3        |tm          d¦  «        |¦  «        Š<t!          |5t’          ¦  «        r|5dk    rth          j7        },nth          jJ        },d}#tq          ‰<|5|7|6¦  «        gŠC|,‰Dj%        ‰<j        <   ty          ‰@                     ¦   «         ¦  «        }8|‰@|8         j        z   ‰@|8         _        ˆ<fd„‰BD ¦   «         }9t—          ‰@|9¦  «         |#r|  L                    ‰@‰B‰<¦  «         t›          ‰C|‰@||!r|.n‰<|d||f‰DjN        |¬ ¦	  «	        }:|:g‰‰?j!                 _        ‰‰?j!                 j         B                    |¦  «         ‰‰?j!                 j         O                    t#          j0        t=          ‰?j        ¦  «        d         |¦  «        ¦  «         | jP         O                    t£          ‰?|:d!¬"¦  «        ¦  «         |D ]"}|‰?j!        k    r‰ R                    |¦  «         Œ#t          jS        dk    r#t©          d#¦  «         |: U                    ¦   «          �ŒK�	Œmd S )$Nc                 óT   •— g | ]$}‰|         t          ‰|         j        ¦  «        f‘Œ%S ra   )rŽ   r½  )re   r-  Úloopss     €rg   rh   z'ConvertLoopPass.run.<locals>.<listcomp>š	  s0   ø€ ÐLÐLÐL¸!˜˜aœ¥# e¨A¤h¤mÑ"4Ô"4Ð5ÐLÐLÐLri   c                 ó   — | d         S r:  ra   )Útups    rg   rf  z%ConvertLoopPass.run.<locals>.<lambda>�	  s
   € ¸3¸q¼6€ ri   rH  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   c                 ó2   •— g | ]}|‰v ¯|‰j         k    ¯|‘ŒS ra   )Úheader)re   rn   r  r¿  s     €€rg   rh   z'ConvertLoopPass.run.<locals>.<listcomp>À	  s:   ø€ ð #Gð #Gð #G¨!Ø$%¨ K K°A¸¼Ò4DÐ4Dð %&Ø4DÐ4DÐ4Dri   r9  Ú
pair_firstc              3   ó.   •K  — | ]\  }}|‰k    ¯|V — Œd S rq   ra   )re   Útr   Ú
loop_indexs      €rg   rF  z&ConvertLoopPass.run.<locals>.<genexpr>Þ	  s+   øè è € Ð)OÐ)O±°°1¸qÀJº¸¨!¸¸¸¸Ð)OÐ)Ori   c                 ó"   •— i | ]}|‰|         “ŒS ra   ra   )re   rn   r  s     €rg   rí  z'ConvertLoopPass.run.<locals>.<dictcomp>ç	  s   ø€ Ð CÐ CÐ C°!  F¨1¤IÐ CÐ CÐ Cri   c                 óh   •— h | ].}t          ‰j        |         t          j        j        ¦  «        °,|’Œ/S ra   )r�   rÁ  r   r  r  )re   rm   r9  s     €rg   ú	<setcomp>z&ConvertLoopPass.run.<locals>.<setcomp>ú	  sK   ø€ ð 0\ð 0\ð 0\°aÝ%/°Ô0CÀAÔ0FÍÌ
ÔHYÑ%ZÔ%Zð0\°ð 0\ð 0\ð 0\ri   c                  ó8  •— t          j         ‰¦  «        } ‰                     ¦   «         D ]p}|                     t          j        ¦  «        D ]N}t          |j        t          j        ¦  «        r-|j        j        | v r|  	                    |j
        j        ¦  «         ŒOŒqg }g }‰                     ¦   «         D ]ä}|j        D ]Ú}t          d„ |                     ¦   «         D ¦   «         ¦  «        }|| z  r¨|                     | ¦  «        rŒHt          t          |t          j        ¦  «        ¦  «         |j        }t          t          |t          j        ¦  «        o|j        dv ¦  «         |                     |j        j        ¦  «         |                     |¦  «         ŒÛŒå||fS )z˜find expressions that involve getitem using the
                        index variable. Return both the arrays and expressions.
                        c              3   ó$   K  — | ]}|j         V — Œd S rq   ©rˆ  r¹  s     rg   rF  zCConvertLoopPass.run.<locals>.find_indexed_arrays.<locals>.<genexpr>
  s$   è è € Ð(JÐ(J°A¨¬Ð(JÐ(JÐ(JÐ(JÐ(JÐ(Jri   ©rT  Ústatic_getitem)r  r  Ú
find_instsr	   r
  r�   r  r”  rˆ  r  r  r½  rŸ  r–  Úissubsetr;   r  r�  r“  )	ÚindicesrÐ  r  ÚarrsÚexprsÚlvr  r¦  Úloop_index_varss	          €€rg   Úfind_indexed_arraysz0ConvertLoopPass.run.<locals>.find_indexed_arrays
  s¦  ø€ õ #'¤)¨OÑ"<Ô"<˜Ø%.×%5Ò%5Ñ%7Ô%7ð Bð B˜EØ(-×(8Ò(8½¼Ñ(CÔ(Cð Bð B Ý$.¨t¬z½2¼6Ñ$BÔ$Bð !BØ$(¤J¤O°wÐ$>Ð$>Ø$+§K¢K°´Ô0@Ñ$AÔ$AÐ$AøðBð  "˜Ø "˜Ø%.×%5Ò%5Ñ%7Ô%7ð 7ð 7˜EØ(-¬
ð 
7ð 
7 Ý%(Ð(JÐ(J¸¿ºÑ9IÔ9IÐ(JÑ(JÔ(JÑ%JÔ%J Ø#%¨¡<ð !7Ø')§{¢{°7Ñ';Ô';ð %1Ø(0Ý$+­J°t½R¼YÑ,GÔ,GÑ$HÔ$HÐ$HØ+/¬: DÝ$+­J°t½R¼WÑ,EÔ,Eð -PØ'+¤wÐ2OÐ'Oñ%Qô %Qð %Qà$(§K¢K°´
´Ñ$@Ô$@Ð$@Ø$)§L¢L°Ñ$6Ô$6Ð$6øð
7ð  $ U˜{Ð*ri   c                 ó  •— t          ‰j        | ¦  «        }t          |o/t          |t          j        ¦  «        o|j        dk    o
|j        dk    ¦  «         |j        }t          j
        ˆ
fd„‰j        D ¦   «         Ž } ‰	¦   «         \  }}t          |j        gt          |¦  «        k    ¦  «         t          |j        |v¦  «         t          ‰j        |j        ¦  «        }t          ‰j        ‰j        |¦  «        }t!          d¦  «        ‚)zƒFind the case where size_var is defined by A[M].shape,
                        where M is a boolean array.
                        rÇ   r™   c                 ó    •— g | ]
}‰|         ‘ŒS ra   ra   )re   rn   Úlive_maps     €rg   rh   zDConvertLoopPass.run.<locals>.find_mask_from_size.<locals>.<listcomp>(
  s   ø€ Ð/PÐ/PÐ/PÀ°¸´Ð/PÐ/PÐ/Pri   rÖ  )r>   rÝ  r;   r�   r	   r  r�  rŸ  r  rŸ  r  Úexitsrˆ  rì  rÜ  rÁ  rÝ  )r‘  Úsize_defÚarr_varÚ	live_varsÚ
index_arrsÚindex_exprsrß  r‰  r  r  r  r¿  r9  s            €€€€rg   Úfind_mask_from_sizez0ConvertLoopPass.run.<locals>.find_mask_from_size 
  s  ø€ õ $2°+Ô2EÀxÑ#PÔ#P˜Ý ð !V­Z¸Å"Ä'Ñ-JÔ-Jð !VØ (¤¨yÒ 8ð!VØ=E¼]ÈgÒ=UñWô Wð Wà"*¤.˜Ý$'¤IÐ/PÐ/PÐ/PÐ/PÀTÄZÐ/PÑ/PÔ/PÐ$Q˜	Ø2EÐ2EÑ2GÔ2GÑ/˜
 KÝ ¤ µ$°zÑ2BÔ2BÒ BÑCÔCÐCå ¤°IÐ =Ñ>Ô>Ð>å"0°Ô1DÀhÄnÑ"UÔ"U˜Ý!+¨KÔ,?ÀÔATÐV]Ñ!^Ô!^˜õ -¨]Ñ;Ô;Ð;ri   Tr   r…  c              3   ó0   •K  — | ]}|r|n‰d          V — ŒdS rØ  ra   rÙ  s     €rg   rF  z&ConvertLoopPass.run.<locals>.<genexpr>Z
  sL   øè è € ð /Fð /FØ34ð 56Ð/H¨q¨q¸:Àa¼=ð /Fð /Fð /Fð /Fð /Fð /Fri   F)rŸ  rÖ  rÚ  rÿ   rS  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 prangec                 ó   •— i | ]}|‰“ŒS ra   ra   )re   r   r§  s     €rg   rí  z'ConvertLoopPass.run.<locals>.<dictcomp>¬
  s   ø€ Ð$KÐ$KÐ$K°a Q¨	Ð$KÐ$KÐ$Kri   r   )r›  r¿  )Úold_looprA  rB  zparfor from loop)Vr9  r2   rM   rJ   rK   ÚusemapÚdefmaprö  r  rÍ  rŽ   Úentriesr  r   ÚDISABLE_PERFORMANCE_WARNINGSr½  r�   r	   r
  r  r  r�  Ú_is_parallel_loopr‰  rˆ  ÚwarningsÚwarnr   ÚNumbaPerformanceWarningrž  rì  r|   Ú_get_loop_kindrú  rg  r  r,   rÁ  rŸ  r  r  rZ   rC  rP  Ú_get_prange_init_blockr!   r  Úintersectionr�  Ú	has_shaper:   r”  r   r©   r    r‹  r‹  rQ  rR  r;  r–   rS  rÝ  r7   rÛ   rT  r3  rŒ  rÝ  r>   r¦  rž  r  rK  Úintpr&   Ú_replace_loop_access_indicesr™  r«  r“  r:  ré  r	  rY  rc   rÌ  )Er¸   r  r   rÿ  ÚcfgÚusedefsÚsized_loopsÚmoved_blocksró   Úentryr  r×  Úbody_labelsr|   Ú	loop_kindÚloop_replacingÚheader_bodyÚhbir¾  Úli_indexÚcpsr  rž  r©  r¥  r“  ÚbodydefsÚblÚ
exit_livesr›  rn   Ú	last_instr–  rà  r  Úunsigned_indexr‰  r…   râ  Ú
in_arr_typr\  Ú
orig_indexÚfirst_body_blockr`  ra  r½  Úorig_index_varr_  Úlabelsr”  rå  ræ  r—  r;  r@  r‘  Úfirst_body_labelÚindex_var_maprŒ   r  r§  r]  r  r¿  r¦  rþ  r  rö  r9  sE    `                                                         @@@@@@@@@@rg   rà  zConvertLoopPass.run’	  sb  øøøøøøøøøøø€ ØÔ&ˆå& vÑ.Ô.‰ˆ
�AÝ% fÑ-Ô-ˆÝ" 6Ñ*Ô*ˆÝ# C¨°´ÀÄÑPÔPˆØ—	’	‘”ˆØLÐLÐLÐL¸u¿zºz¹|¼|ÐLÑLÔLˆØˆå˜kÐ/AÐ/AÐBÑBÔBð n	&ñ n	&‰GˆD�!Ý�4”<Ñ Ô  AÒ%Ð%­¨T¬Z©¬¸AÒ)=Ð)=ÝÔ:ð 8Ø!%¤ð 8ð 8˜Ø$*¨5¤MÔ$6ð 8ð 8˜Dõ !+¨4µ´Ñ ;Ô ;ð8å$.¨t¬z½2¼7Ñ$CÔ$Cð8ð %)¤J¤M°VÒ$;Ð$;Ø$(×$:Ò$:Ø$(¤J¤OÔ$8¸*ñ%Fô %Fð %<ð'4 õ
 !)¤Ý$*Ô$BØ(+¨T¬Xñ%7ô %7ñ!8ô !8ð !8øð8ð" å˜œÑ&Ô& qÔ)ˆEØ˜uœÔ*ð V&ñ V&�å˜t¥R¤YÑ/Ô/ñ T&Ý& t¤zµ2´7Ñ;Ô;ñT&à œJœM¨VÒ3Ñ3Ø ×2Ò2°4´:´?Ô3GÈÑTÔTñ 4ð#Gð #Gð #Gð #Gð #G¨t¬yð #Gñ #Gô #G�Kàœ:œ?�DØ04×0CÒ0CÀDÄJÄOÔDXØDNñ1Pô 1PÑ-�I˜~ð #)¨¬Ô"5Ô":¸3¸B¸3Ô"?�Kà!%�JÝ%.¨{Ñ%;Ô%;ð "ð "™	˜˜TÝ& t­R¬YÑ7Ô7ð "Ý$.¨t¬z½2¼7Ñ$CÔ$Cð"à$(¤J¤M°\Ò$AÐ$AØ)-¬Ô)9˜JØ'*˜HØ!˜EøØ%Ð1Ð1Ð1ð #.¨i¨x¨iÔ"8¸;ÀxÐPQÁzÀ{À{Ô;SÑ"S�Kõ .¨q°&¸¼Ô2EÐ.FØ.9Ô.AñCô C‘F�C˜à˜aœ&�CÝ&)Ð)OÐ)OÐ)OÐ)O¸Ð)OÑ)OÔ)OÑ&OÔ&O�OØ#×'Ò'¨
Ñ3Ô3Ð3à" 5œMÔ/�EØœ(�CØ +Ô :× HÒ HÈÌÑ UÔ U�IÝ!#¤¨%°Ñ!5Ô!5�JØ&*×&AÒ&AÀ&ÈÄ-Ø<FÈñ'Nô 'N�J”Oà CÐ CÐ CÐ C°{Ð CÑ CÔ C�Iå *¡¤�IÝ+-¬8°E¸3Ñ+?Ô+?�I˜iÑ(õ  #™uœu�HØ)ð Fð F˜Ø#+§>¢>°'´.ÀÔ2DÑ#EÔ#E˜˜Ý!$¡¤�JØ"œjð Dð D˜Ø%/×%5Ò%5°h¸r´lÑ%CÔ%C˜
˜
Ø$×1Ò1°*Ñ=Ô=�Eð "×.Ò.ð 0\ð 0\ð 0\ð 0\¸5ð 0\ñ 0\ô 0\ñ ]ô ]�Eð )ð 9ð 9˜Ø$-¨a¤LÔ$5°bÔ$9˜	Ý& yµ"´'Ñ:Ô:ð 9Ø%Ô,°´Ò;Ð;Ø/8˜IÔ,øð+ð +ð +ð +ð +ð +ð4  $�HØ#'�Lð&ð &ð &ð &ð &ð &ð &ð &ð6 &*�Nð ! JÒ.Ñ.Ø(×2Ò2°4¸´7Ñ;Ô;Ð<Ð<Ð;õ "'Ð':¸DÀ¼GÑ!DÔ!D˜Ø!ð -ØGMÑD˜F H¨h¸¸à%)¨!¤W˜FÝ)¨&µ"´&Ñ9Ô9Ð:Ð:Ð9Ø%0Ô%8¸¼Ô%E˜
Ý% jµ%´-Ñ@Ô@ð 
Ý(*¬¨uµmÀNÑ6SÔ6SÐUXÑ(YÔ(Y˜IÝBGÄ+˜KÔ/°	´Ñ?Ý%-¨i¸¸FÀAÑ%FÔ%FÐ$G˜EØ*3¨˜J˜Jà(1×(;Ò(;Ø-9Ð-Að =C¸FØGOñ)Qô )Q˜Iå0@Ø +Ô 3°YÀÀsñ1ô 1Ñ-˜J¨õ  # 5™zœz¨Aš~˜~˜~˜~Ø%/˜
Ø'ð Fõ */ð /Fð /Fð /Fð /FØ8Dð/Fñ /Fô /Fñ *Fô *F˜Jà+4µS¸¿ºÑ9IÔ9IÑ5JÔ5JÔ+KÐ(Ý%'¤X¨e°SÑ%9Ô%9˜
Ý3BØ'Ô/°¸
ÀJØ(-ð4ñ 4ô 4Ñ0˜	 =ð  *œÐ1AÔ1FÑF˜Ø04Ð(Ô-Ø'ð 7Ø-7¸¬]˜N˜Nà-6˜Nð $Ð/å"0°Ñ"?Ô"?Ð?ñ 0ð( !"˜Ø ˜Ø#'¨¤7˜Ý˜t™9œ9¨š>˜>Ø$(¨¤G˜EØ'+¨A¤w˜HÝ˜t™9œ9¨š>˜>Ø$(¨¤G˜EØ'+¨A¤w˜Hð"Ø'2Ô':×'IÒ'IÈ$ÈqÌ'Ñ'RÔ'R  øÝ#+ð "ð "ð "Ý&,Ô&DØ$RØ(,¬ð'"ñ '"ô '"ð !"ð"øøøõ
 $.¨dµB´HÑ#=Ô#=ð "Ý&,Ô&DØ$UØ(,¬ð'"ñ '"ô '"ð !"ð $(¤:˜DØ# qšy˜yÝ&,Ô&DØ$ZØ(,¬ð'"ñ '"ô '"ð !"õ %'¤F¨5µ-ÀÑ2OÔ2OÐQTÑ$UÔ$U˜	õ & e­SÑ1Ô1ð 3°e¸q²j°jÝ,1¬K˜M˜Må,1¬J˜MØ-2˜NÝ!)¨)°U¸HÀdÑ!KÔ!KÐ L˜Ø>K˜Ô+¨I¬NÑ;õ ,/¨y¯~ª~Ñ/?Ô/?Ñ+@Ô+@Ð(Ø;FÈÐScÔIdÔIiÑ;i˜	Ð"2Ô3Ô8à$KÐ$KÐ$KÐ$K¸?Ð$KÑ$KÔ$K�MÝ  ¨MÑ:Ô:Ð:Ø%ð Cð ×9Ò9Ø% ¸	ñCô Cð Cå# E¨:°yÀ#Ø6BÐ$Q N NÈ	Ø$-Ø%-¨y¸.Ð$IØ$/Ô$5¸Uð	Dñ Dô D�Fð 17¨x�F˜4œ;Ô'Ô,ð
 ˜4œ;Ô'Ô,×3Ò3°KÑ@Ô@Ð@Ø˜4œ;Ô'Ô,×3Ò3µB´G½DÀÄÑ<LÔ<LÈQÔ<OÐQTÑ4UÔ4UÑVÔVÐVØ”N×)Ò)­$Ø!%Ø"Ø%ð+ñ +ô +ñ ô ð ð )ð *ð *˜Ø ¤Ò+Ð+Ø"ŸJšJ q™MœM˜MøÝÔ-°Ò2Ð2ÝÐ0Ñ1Ô1Ð1ØŸš™œ˜ùñmV&ð1n	&ð n	&s   Ý ].Ý.&^c                 óò   — ||vrdS ||         }t          |¦  «        dk    oV|d         dk    pJ|d         t          k    p9|d         dk    p-|d         t          k    p|d         dk    p|d         t          k    S )NFr   r   rx   r   )rŽ   r   rx   r   ©r¸   Úfunc_varr   r  s       rg   r   z!ConvertLoopPass._is_parallel_loopÍ
  sš   € à˜:Ð%Ð%Ø�5Ø˜(Ô#ˆÝ�4‰yŒy˜1Š}ð A $ q¤'¨XÒ"5ð #@¸¸a¼ÅFÒ9Jð #@Ø˜”7Ð/Ò/ð#@Ø37¸´7½oÒ3Mð#@à˜”7˜jÒ(ð#@à,0°¬GµxÒ,?ð	Ari   c                 óN  — | j         }||v sJ ‚||         }t          |¦  «        dk    sJ ‚d}|d         dk    s|d         t          k    r<	 d|j        |         d         |j        |         d         ff}n1# t          $ r d}Y n#w xY w|d         dk    s|d         t
          k    rd}|S )	z(see if prange is user prange or internalr   )rL  rc  rx   r8  r9  )r8  )rc  rc  r   )r   rc  )r9  rŽ   rx   r/  r¦  r   )r¸   rD  r   r9  r  Úkinds         rg   r$  zConvertLoopPass._get_loop_kindÖ
  sÜ   € àÔ&ˆà˜:Ð%Ð%Ð%Ð%Ø˜(Ô#ˆÝ�4‰yŒy˜1Š}ˆ}ˆ}ˆ}ØˆØ�Œ7Ð'Ò'Ð'¨4°¬7µoÒ+EÐ+Eð,Ø! KÔ$;¸HÔ$EÀaÔ$HÈ+ÔJaÐbjÔJkÐlnÔJoÐ#pÐp��øÝð ,ð ,ð ,ð ,���ð	,øøøð
 �!ŒW˜
Ò"Ð" d¨1¤gµÒ&9Ð&9Ø!ˆDØˆs   Á(A4 Á4BÂBc                 óä  — d}d}g }t          |j        ¦  «        D ]å\  }}t          |t          j        ¦  «        rVt          |j        t          j        ¦  «        r7|j        j        dk    r'|                      |j        j	        j
        |¦  «        r|}t          |t          j        ¦  «        rVt          |j        t          j        ¦  «        r7|j        j        dk    r'|                      |j        j	        j
        |¦  «        r|}Œæ|dk    ré|dk    rãd„ |D ¦   «         }	g }
t          t          |dz   |¦  «        ¦  «        D ]b}|j        |         }d„ |                     ¦   «         D ¦   «         }|	|z  r|	|z  }	|
                     |¦  «         ŒM|                     |¦  «         Œc|                     ¦   «          |
                     ¦   «          |j        d|…         |
z   |j        |dz   d…         z   |_        |S )z–
        If there is init_prange, find the code between init_prange and prange
        calls. Remove the code from entry_block and return it.
        r9  r  c                 ó   — h | ]	}|j         ’Œ
S ra   r  ©re   r   s     rg   r  z9ConvertLoopPass._get_prange_init_block.<locals>.<setcomp>ÿ
  s   € Ð<Ð<Ð<¨1 ¤Ð<Ð<Ð<ri   rˆ   c                 ó   — h | ]	}|j         ’Œ
S ra   r  rI  s     rg   r  z9ConvertLoopPass._get_prange_init_block.<locals>.<setcomp>  s   € Ð>Ð>Ð>¨˜QœVÐ>Ð>Ð>ri   N)rg  r½  r�   r	   r
  r  r  r�  Ú_is_prange_initr‰  rˆ  r   rN  rz   r–  r“  Úreverse)r¸   Úentry_blockr   Úprange_argsÚinit_call_indÚprange_call_indÚ	init_bodyr“   r  Úarg_related_varsÚsaved_nodesÚ	inst_varss               rg   r%  z&ConvertLoopPass._get_prange_init_blockê
  s  € ð
 ˆØˆØˆ	Ý  Ô!1Ñ2Ô2ð 		$ð 		$‰GˆAˆtå˜4¥¤Ñ+Ô+ð "µ
¸4¼:ÅrÄwÑ0OÔ0Oð "Øœ
œ¨Ò/Ð/Ø×,Ò,¨T¬Z¬_Ô-AÀ:ÑNÔNð 0à !�Ý˜4¥¤Ñ+Ô+ð $µ
¸4¼:ÅrÄwÑ0OÔ0Oð $Øœ
œ¨Ò/Ð/Ø×.Ò.¨t¬z¬Ô/CÀZÑPÔPð 0à"#�øØ˜BÒÐ ?°bÒ#8Ð#8ð  =Ð<°Ð<Ñ<Ô<ÐØˆKÝ�e M°!¡O°_ÑEÔEÑFÔFð +ð +�Ø"Ô'¨Ô*�Ø>Ð>¨T¯^ª^Ñ-=Ô-=Ð>Ñ>Ô>�	Ø# iÑ/ð +Ø$¨	Ñ1Ð$Ø×&Ò& tÑ,Ô,Ð,Ð,à×$Ò$ TÑ*Ô*Ð*Ð*à×ÒÑÔÐØ×ÒÑ!Ô!Ð!Ø +Ô 0°°-°Ô @Ø%ñ!&Ø(3Ô(8¸ÈÑ9JÐ9KÐ9KÔ(Lñ!MˆKÔð Ðri   c                 ó~   — ||vrdS ||         }t          |¦  «        dk    o|d         dk    p|d         t          k    S )NFr   rr   )rŽ   rr   rC  s       rg   rK  zConvertLoopPass._is_prange_init  sH   € Ø˜:Ð%Ð%Ø�5Ø˜(Ô#ˆÝ�4‰yŒy˜1Š}ÐU $ q¤'¨]Ò":Ð"T¸dÀ1¼gÍÒ>TÐUri   c                 ó¢  ‡— |                      |j        ¦  «         t          |¦  «        5  t          |¦  «        }ddd¦  «         n# 1 swxY w Y   |d         }t	          ¦   «         }|D �]Þ}||         }|j        D �]Ê}	t          |	t          j        ¦  «        rýt          |	j	        t          j
        ¦  «        rÞ||k    r[|	j	        j        |v rM|	j        j        |vr?|                      |	j        j        ¦  «         |                      |	j        j        ¦  «         n}|j        Šˆfd„}
 |
|	j        j        ¦  «        t          |
|¦  «        v rL |
|	j        j        ¦  «         |
|	j	        j        ¦  «        k    r t          j        d|	j        j        ¬¦  «        ‚t#          |	¦  «        rpt%          |	¦  «        }|€�Œ<t'          t(          | j        j        |d¬¦  «        }|j        |v s|�|j        |v rt/          |	|¦  «         t'          | j        |||¦  «         t          |	t2          ¦  «        r|                      |	j        ||¦  «         �ŒÌ�Œà||z  }dS )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                 ój   •— ddl m} 	 ‰                     | ¦  «        j        S # |j        $ r | cY S w xY w)Nr   )r   )Ú
numba.corer   Ú	get_exactÚunversioned_nameÚNotDefinedError)rˆ  r   r  s     €rg   Úunverz;ConvertLoopPass._replace_loop_access_indices.<locals>.unver7  sV   ø€ Ø9Ð9Ð9Ð9Ð9Ð9ð,Ø',§¢°tÑ'<Ô'<Ô'MÐ MøØ#)Ô#9ð ,ð ,ð ,Ø'+   ð,øøøs   ‰# £2±2z Overwrite of parallel loop indexrš  T)Úlhs_only)r  rˆ  Údummy_return_in_loop_bodyr/   rŸ  r½  r�   r	   r
  r  r”  r  r  Úmapr   rž  rž  rD   rE   r:   r>   r9  rÝ  rF   Ú_replace_multi_dim_indr™  r)  r¦  )r¸   r¦  Ú	index_setÚ	new_indexr?  Úfirst_labelÚadded_indicesrn   rÐ  r¾  r\  rä   Úind_defr  s                @rg   r)  z,ConvertLoopPass._replace_loop_access_indices  sì  ø€ ð 	�Š�i”nÑ%Ô%Ð%å& yÑ1Ô1ð 	0ð 	0Ý$ YÑ/Ô/ˆFð	0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0øøøð 	0ð 	0ð 	0ð 	0ð ˜Q”iˆÝ™œˆð
 ð /	\ñ /	\ˆAØ˜a”LˆEØœ
ð -\ñ -\�Ý˜t¥R¤YÑ/Ô/ð Ý& t¤zµ2´6Ñ:Ô:ðð ˜[Ò(Ð(¨T¬Z¬_À	Ð-IÐ-IØ $¤Ô 0¸	Ð AÐ AØ!Ÿš d¤kÔ&6Ñ7Ô7Ð7Ø%×)Ò)¨$¬+Ô*:Ñ;Ô;Ð;Ð;ð !&¤˜ð,ð ,ð ,ð ,ð ,ð !˜5 ¤Ô!1Ñ2Ô2µc¸%ÀÑ6KÔ6KÐKÐKÐPUÐPUÐVZÔVaÔVfÑPgÔPgÐkpÐkpÐquÔq{ô  rAñ  lBô  lBò  QBð  QBÝ"(Ô"@Ø BØ$(¤K¤Oð#ñ #ô #ð õ " $Ñ'Ô'ð PÝ4°TÑ:Ô:�Eà�}Ù Ý#¥N°DÔ4DÔ4LØ$)°Dð:ñ :ô :�Gàœ
 iÐ/Ð/Ø 'Ð 3Ø$+¤L°IÐ$=Ð$=Ý4°T¸9ÑEÔEÐEõ ˜$Ô5°wÀ	ØENñPô Pð Põ ˜d¥FÑ+Ô+ð \Ø×5Ò5°d´nÀiÐQZÑ[Ô[Ð[ùñ[-\ð` 	�]Ñ"ˆ	Øˆs   «AÁAÁAc                 ó€  ‡‡— | j         }t          |du¦  «         t          t          |j        |j                 t
          j        t
          j        f¦  «        ¦  «         t          |j	        |¦  «        }t          t          |t          j        ¦  «        o
|j        dk    ¦  «         ˆˆfd„|j        D ¦   «         |_        dS )zq
        replace individual indices in multi-dimensional access variable, which
        is a build_tuple
        Nr�  c                 ó*   •— g | ]}|j         ‰v r‰n|‘ŒS ra   r  )re   r   ra  rb  s     €€rg   rh   z:ConvertLoopPass._replace_multi_dim_ind.<locals>.<listcomp>j  s9   ø€ ð ;ð ;ð ;Ø"#ð ,-¬6°YÐ+>Ð+>˜i˜iÀAð ;ð ;ð ;ri   )r9  r;   r�   rÁ  rˆ  r   ÚTuplerœ  r>   rÝ  r	   r  r�  r¼  )r¸   Úind_varra  rb  r9  Úind_def_nodes     ``  rg   r`  z&ConvertLoopPass._replace_multi_dim_ind]  sÑ   øø€ ð
 Ô&ˆÝ�˜tÐ#Ñ$Ô$Ð$å•
˜;Ô.¨w¬|Ô<Ý”�eœnÐ-ñ/ô /ñ 	0ô 	0ð 	0å% kÔ&9¸7ÑCÔCˆÝ•
˜<­¬Ñ1Ô1ð 5Ø ”O }Ò4ñ	6ô 	6ð 	6ð;ð ;ð ;ð ;ð ;Ø'3Ô'9ð;ñ ;ô ;ˆÔÐÐri   N)r~   r   r€   r—  rŽ  rà  r   r$  r%  rK  r)  r`  ra   ri   rg   rò  rò  ‹	  s¥   € € € € € ðð ðð ð ðy&ð y&ð y&ðv	Að Að Aðð ð ð(%ð %ð %ðNVð Vð VðDð Dð DðL;ð ;ð ;ð ;ð ;ri   rò  c                 óÂ  — t          t          |t          j        ¦  «        o
|j        dk    ¦  «         |j        }|j        }| |j                 }| |j                 }|j        }t          t          |t          j
        j        ¦  «        ¦  «         t          |t          j
        j        ¦  «        r5t          |j        t          j        ¦  «        r||j        k    r|||j        dfS t          |t          j        ¦  «        �r]t          ||¦  «        \  }}	t          |	dk    ot!          |¦  «        |k    ¦  «         d}
g }d}|D ]ý}| |j                 }t          |t          j
        j        ¦  «        r>t          |j        t          j        ¦  «        r|}|j        }|                     d¦  «         Œlt          |t          j
        j        ¦  «        r>t          |j        t          j        ¦  «        r|}|j        }|                     d¦  «         ŒÉt          |t          j        ¦  «        r|
dz  }
|                     |¦  «         Œþt          |o|
|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.
    rT  Nr�  r   rˆ   )r;   r�   r	   r  r�  r  rä   rˆ  rœ   r   r   r  r�   r}  rÓ  r9   rŽ   r“  r©   r<   )rÁ  rÝ  rß  r  rä   rJ  r�  rœ   Úseqr�  Úcount_constsrà  r–  Úindrâ  s                  rg   rÜ  rÜ  n  s9  € õ �J�w¥¤Ñ(Ô(ÐD¨W¬Z¸9Ò-DÑEÔEÐEØŒM€EØŒM€EØ˜œ
Ô#€IØ˜œ
Ô#€IØŒ>€DÝ�J�y¥%¤.Ô"6Ñ7Ô7Ñ8Ô8Ð8Ý�9�eœnÔ2Ñ3Ô3ð  7Ý�9”?¥E¤MÑ2Ô2ð 7à�	”ÒÐØ�e˜Yœ_¨dÐ2Ð2Ý	�I�uœÑ	/Ô	/ñ 7õ & g¨uÑ5Ô5‰ˆˆRÝ��mÒ#Ð8­¨C©¬°DÒ(8Ñ9Ô9Ð9ØˆØˆØˆØð 	)ð 	)ˆCØ ¤Ô)ˆIå˜9¥e¤nÔ&:Ñ;Ô;ð )Ý˜9œ?­E¬MÑ:Ô:ð)à�Ø$œ?�Ø×#Ò# DÑ)Ô)Ð)Ð)å˜Y­¬Ô(<Ñ=Ô=ð )Ý˜9œ?­E¬MÑ:Ô:ð)à�Ø$œ?�Ø×#Ò# DÑ)Ô)Ð)Ð)å˜I¥u¤}Ñ5Ô5ð )Ø Ñ!�Ø×#Ò# CÑ(Ô(Ð(øå�Ð5˜\¨T°A©XÒ5Ñ6Ô6Ð6Ø�h ¨,Ð6Ð6Ý
Ðri   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )Ú
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        ¦  «         t          j                             t	          j        | j        j        ¦  «        ¦  «         d S rq   )rZ   rà  rÝ  r  r   r1  rV  Úfind_max_labelr�  s    rg   Ú_pre_runzParforPass._pre_run§  sV   € àÔ×Ò ¤Ô 3Ñ4Ô4Ð4åÔ×&Ò&ÝÔ# D¤LÔ$7Ñ8Ô8ñ	:ô 	:ð 	:ð 	:ð 	:ri   c           	      óŒ  — |                       ¦   «          | j        j        rLt          | j        | j        | j        | j        | j        | j	        | j
        ¦  «        }|                     ¦   «          | j        j        r,t          | ¦  «                             | j        j        ¦  «         | j        j        r,t!          | ¦  «                             | j        j        ¦  «         | j        j        r,t%          | ¦  «                             | j        j        ¦  «         | j        j        r,t)          | ¦  «                             | j        j        ¦  «         | j        j        r,t-          | ¦  «                             | j        j        ¦  «         | j                             | j        | j        j        ¦  «         t5          | j        d¦  «         dS )zgrun parfor conversion pass: replace Numpy calls
        with Parfors when possible and optimize the IR.zafter parfor passN)rs  rà  Ústencilr   rÝ  rÁ  rÝ  rZ   rÞ  rß  r«  rà  r†  rt  r  rk  r¦  rÛ  rÐ  r   rò  r>  r4  r.  rû  Úfusionr.   )r¸   Ústencil_passs     rg   rà  zParforPass.run®  s‚  € ð 	�Š‰ŒˆàŒ<Ôð 	Ý& t¤|°T´\Ø'+¤~°tÔ7JØ'+¤~°t´~Ø'+¤zñ3ô 3ˆLð ×ÒÑÔÐØŒ<Ôð 	>Ý˜tÑ$Ô$×(Ò(¨¬Ô)<Ñ=Ô=Ð=ØŒ<Ôð 	<Ý˜TÑ"Ô"×&Ò& t¤|Ô':Ñ;Ô;Ð;ØŒ<Ô!ð 	=Ý˜dÑ#Ô#×'Ò'¨¬Ô(;Ñ<Ô<Ð<ØŒ<Ôð 	;Ý˜DÑ!Ô!×%Ò% d¤lÔ&9Ñ:Ô:Ð:ØŒ<Ô%ð 	?Ý Ñ%Ô%×)Ò)¨$¬,Ô*=Ñ>Ô>Ð>ð 	Ô×Ò˜tœ|¨T¬\Ô-@ÑAÔAÐAå�t”|Ð%8Ñ9Ô9Ð9Ð9Ð9ri   c                 ó8   — 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     rg   rÜ  zParforPass._find_maskÉ  s   € õ ˜$œ,¨¬°gÑ>Ô>Ð>ri   c                 ó0   — t          | j        |||¦  «        S )zV
        Create loop index variables and build LoopNest objects for a parfor.
        )rR  rÁ  )r¸   r\  r  rž  s       rg   rR  zParforPass._mk_parfor_loopsÑ  s   € õ   ¤¨i¸ÀÑDÔDÐDri   N)r~   r   r€   r—  rs  rà  rÜ  rR  ra   ri   rg   rp  rp  Ÿ  s_   € € € € € ðð ð:ð :ð :ð:ð :ð :ð6?ð ?ð ?ðEð Eð Eð Eð Eri   rp  c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚParforFusionPassz=ParforFusionPass class is responsible for fusing parfors
    c                 óò  — 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        ¦  «         t          | j        j        | j        j        | j        ¦  «        \  }}|D ]0}t#          | j        ||j        | j        ¦  «        \  |_        |_        Œ1t+          | j        | j        j        | j        d¬¦  «         t-          | j        d¦  «         |                      | j        | j        j        | j        | j        ¦  «         t-          | j        d¦  «         t+          | j        | j        j        | j        ¦  «         t-          | j        d¦  «         |                      | j        | j        j        | j        | j        ¦  «         t-          | j        d¦  «         t          | j        | j        | j        | j        d         ¦  «         d	S d	S d	S )
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  r3   rÁ  rÝ  r2  rà  rv  r?   Ú_definitionsré  rZ   rß  rà  Úget_parfor_paramsrî  Úget_parfor_reductionsr¨  r¬  r­  Úmaximize_fusionr.   Úfuse_parfors)r¸   rÍ  rÿ  r‹   rØ  s        rg   rà  zParforFusionPass.runÝ  sM  € õ
 -¨T¬\Ô-@ÑAÔAˆ	å�”˜tœ|¨T¬^¸T¼]È9Ô=UÑVÔVÐVõ 	�”˜tœ|¨T¬^¸T¼]È9Ô=UÑVÔVÐVàŒ<Ôñ &	[ 9°¢>¡>Ý(9¸$¼,Ô:MÑ(NÔ(NˆDŒLÔ%Ý-1©V¬VˆDÔÔ*ØÔ×#Ò# D¤LÔ$7Ñ8Ô8Ð8õ +¨4¬<Ô+>Ø+/¬<Ô+>Ø+/Ô+BñDô D‰JˆAˆwð ð Mð M�Ý'<¸T¼\Ø=>Ø=>¼XØ=A¼^ñ(Mô (MÑ$�”	˜1œ9˜9õ ˜DœL¨$¬,Ô*=¸t¼|ØINðPñ Pô Pð På˜4œ<Ð)EÑFÔFÐFØ×Ò˜dÔ1Ø"œlÔ1Ø"œlØ"œlñ,ô ,ð ,õ ˜4œ<Ð);Ñ<Ô<Ð<å˜DœL¨$¬,Ô*=¸t¼|ÑLÔLÐLÝ˜4œ<Ð)CÑDÔDÐDà×Ò˜dÔ1Ø"œlÔ1Ø"œlØ"œlñ,ô ,ð ,õ ˜4œ<¨Ñ8Ô8Ð8å�T”\ 4¤<°´ÀÄÈyÔAYÑZÔZÐZÐZÐZðM&	[ð &	[ > >ri   c           	      óâ  — |                      ¦   «         D �]Ø\  }} |j        |¦  «        }d}|�r½d}g }	d}
|
t          |j        ¦  «        dz
  k     �rq|j        |
         }|j        |
dz            }t	          |t
          ¦  «        rÜt	          |t
          ¦  «        rÇ |j        |¦  «        }||_        ||_        t          |||| j        d         ||¦  «        \  }}| j	        j
                             |¦  «         |�fd}| j	        j        |j                                      |j        g¦  «         |	                     |¦  «         |                      ||||¦  «         |
dz  }
�Œ*|	                     |¦  «         t	          |t
          ¦  «        r|                      ||||¦  «         |
dz  }
|
t          |j        ¦  «        dz
  k     �°q|	                     |j        d         ¦  «         |	|_        |�°½�ŒÚd S )NTFr   rˆ   r‹   rÿ   r9  )r¼  rC  rŽ   r½  r�   r™  r©  Útry_fuser2  r.  rï  r“  rí  r£  r3  Úfuse_recursive_parfor)r¸   rZ   r  rÝ  rÁ  r
  rÐ  r©  Úfusion_happenedrH  r“   r¾  Ú	next_stmtÚ
fused_nodeÚfuse_reports                  rg   rƒ  zParforFusionPass.fuse_parfors  s	  € Ø"ŸLšL™NœNð  	&ñ  	&‰LˆE�5Ø4˜Ô4°UÑ;Ô;ˆIØ"ˆOØ!ñ &Ø"'�Ø�Ø�Ø�#˜eœj™/œ/¨AÑ-Ò-Ñ-Ø œ: aœ=�DØ %¤
¨1¨q©5Ô 1�IÝ! $­Ñ/Ô/ð %µJ¸yÍ&Ñ4QÔ4Qð %ð %A NÔ$@ÀÑ$GÔ$G˜	Ø)2˜œØ.7˜	Ô+Ý2:¸9ÀdÈIØ œM¨)Ô4°g¸wñ3Hô 3HÑ/˜
 Kð Ô(Ô7×>Ò>¸{ÑKÔKÐKØ%Ð1Ø.2˜OØ Ô,Ô8¸¼ÔA×HÒHÈ)Ì,ÈÑXÔXÐXØ$ŸOšO¨JÑ7Ô7Ð7Ø ×6Ò6°zÀ9ÈgÐW^Ñ_Ô_Ð_Ø ™F˜AÙ$Ø—O’O DÑ)Ô)Ð)Ý! $­Ñ/Ô/ð VØ×2Ò2°4¸ÀGÈWÑUÔUÐUØ˜‘F�Að/ �#˜eœj™/œ/¨AÑ-Ò-Ñ-ð0 —’ ¤
¨2¤Ñ/Ô/Ð/Ø%�”
ð; "ñ &ùð< 	ˆri   c                 óV  — t          |¦  «        }t          | j        || j        ¦  «         t	          | j        d|¦  «         t          j        | j        | j        | j        | j        ¦  «        }| 	                    ||¦  «         |  
                    ||||¦  «         t          |¦  «         d S )Nz$after recursive maximize fusion down)rÞ  r‚  rÝ  rÁ  r.   rZ   r0  rÞ  rÝ  rà  rƒ  rá  )r¸   rŒ   r©  rÝ  rÁ  r  Úarr_analysiss          rg   r†  z&ParforFusionPass.fuse_recursive_parfor6  s£   € Ý# FÑ+Ô+ˆÝ˜œ f¨d¬lÑ;Ô;Ð;Ý�t”|Ð%KÈVÑTÔTÐTÝ%Ô3°D´NÀDÄLØ04´¸d¼nñNô Nˆà×Ò˜ Ñ+Ô+Ð+Ø×Ò˜,¨°¸ÑAÔAÐAÝ˜VÑ$Ô$Ð$Ð$Ð$ri   N)r~   r   r€   r—  rà  rƒ  r†  ra   ri   rg   r{  r{  Ø  sP   € € € € € ðð ð3[ð 3[ð 3[ðj"ð "ð "ðH%ð %ð %ð %ð %ri   r{  c                   ó   — e Zd ZdZd„ ZdS )ÚParforPreLoweringPasszSParforPreLoweringPass class is responsible for preparing parfors for lowering.
    c           
      óì  — t          | j        j        i i | j        ¦  «         t	          | j        d¦  «         t          | j        | j        | j        | j        d         ¦  «         t	          | j        d¦  «         t          j	        dk    rIt          dt          | j                             ¦   «         ¦  «        ¦  «         t          d| j        ¦  «         t          j	        dk    �r | j        j                             ¦   «         D �] \  }}g }|j        }|j        D �]á}|                     |¦  «         t!          |t"          j        ¦  «        �r®|j        }|j        }|j        }| j        |j                 }	t          d|j        |	t/          |	¦  «        ¦  «         |	t0          j        v st!          |	t0          j        ¦  «        �r:t#          j        |t9          d	¦  «        |¦  «        }
t1          j        |j        ¦  «        | j        |
j        <   t#          j        |j        |¦  «        }t#          j        ||
|¦  «        }|                     |¦  «         t#          j        |
gd
|¦  «        }tA          t0          j!        | j        |
j                 ¦  «        | j        |<   |                     |¦  «         t#          j        |gd
|¦  «        }tA          t0          j!        |	¦  «        | j        |<   |                     |¦  «         �Œã||_        �Œ| j        j"        r%tG          | j        j$        | j%        | j        ¦  «         tL          r.tO          | j(        | j        | j        | j        | j        ¦  «         d
S tS          | j        j        | j*        j+        | j,        ¦  «        \  }}|D ]0}t[          | j        ||j.        | j        ¦  «        \  |_/        |_0        Œ1|D ]}| 1                    | j        ¦  «         Œt          j2        r�| j        j3        j4        }tk          |¦  «        }|dk    r7| j*        j+        rdnd}t          d 6                    ||||¦  «        ¦  «         d
S t          d 6                    |¦  «        ¦  «         d
S d
S )zrun parfor prelowering passzafter push call varsr‹   zafter optimizationrˆ   zvariable types: zcall types: rS  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.   r3   rÝ  r2  r   rY  rc   rÍ  r¼  r  r½  r“  r�   r	   r
  rž  r  r  rˆ  r¡  r   Únumber_domainÚLiteralr”  r    r  r  ÚPrintrP   rX  Úis_generatorÚfix_generator_typesÚgenerator_infor¡   rÁ  Úlower_parfor_sequentialrÞ  r€  rà  rv  rî  r�  r¨  r¬  r­  rÚ  r¯  rô  rõ  rŽ   rÈ   )r¸   Úblock_labelrÐ  Ú	new_blockr  r¾  rž  r  rD  r  r�  Ú	lhs_constÚ
str_assignÚ	str_printÚir_printrÌ  r‹   rØ  rˆ  rÍ  rÑ  s                        rg   rà  zParforPreLoweringPass.runF  sO  € õ
 	�t”|Ô*¨B°°D´LÑAÔAÐAÝ�t”|Ð%;Ñ<Ô<Ð<å�”˜tœ|¨T¬^¸T¼]È9Ô=UÑVÔVÐVÝ�t”|Ð%9Ñ:Ô:Ð:ÝÔ! QÒ&Ð&ÝÐ$¥f¨T¬\×-?Ò-?Ñ-AÔ-AÑ&BÔ&BÑCÔCÐCÝ�. $¤.Ñ1Ô1Ð1åÔ! QÒ&Ñ&Ø'+¤|Ô':×'@Ò'@Ñ'BÔ'Bð 'ñ 'Ñ#�˜UØ�	Øœ�Ø!œJð 7ñ 7�DØ×$Ò$ TÑ*Ô*Ð*Ý! $­¬	Ñ2Ô2ñ 7Ø"œh˜Ø"œk˜Ø"œj˜Ø"&¤,¨s¬xÔ"8˜ÝÐ?ÀÄÈ7ÕTXÐY`ÑTaÔTaÑbÔbÐbØ"¥eÔ&9Ð9Ð9½ZÈÕQVÔQ^Ñ=_Ô=_Ñ9Ý&(¤f¨UµMÀ)Ñ4LÔ4LÈcÑ&RÔ&R˜GÝ9>Ô9LÈSÌXÑ9VÔ9V˜DœL¨¬Ñ6Ý(*¬°´¸3Ñ(?Ô(?˜IÝ)+¬°9¸gÀsÑ)KÔ)K˜JØ%×,Ò,¨ZÑ8Ô8Ð8Ý(*¬°'°¸DÀ#Ñ(FÔ(F˜IÝ8AÅ%Ä*ÈdÌlÐ[bÔ[gÔNhÑ8iÔ8i˜DœN¨9Ñ5Ø%×,Ò,¨YÑ7Ô7Ð7Ý')¤x°°°t¸SÑ'AÔ'A˜HÝ7@ÅÄÈWÑ7UÔ7U˜DœN¨8Ñ4Ø%×,Ò,¨XÑ6Ô6Ð6ùØ&�”
‘
àŒ<Ô$ð 	.Ý ¤Ô ;¸TÔ=MØ $¤ñ.ô .ð .å%ð  	EÝ#Ø” ¤¨d¬l¸D¼NÈDÌMñ[ô [ð [ð [ð [õ #4°D´LÔ4GØ48´LÔ4GØ48Ô4Kñ#Mô #MÑˆJ˜ð
 ð Mð M�Ý'<¸T¼\Ø=>Ø=>¼XØ=A¼^ñ(Mô (MÑ$�”	˜1œ9˜9ð ð 0ð 0�Ø×!Ò! $¤,Ñ/Ô/Ð/Ð/åÔ+ð 
EØ”|Ô+Ô9�Ý 
™OœO�	Ø˜q’=�=Ø6:´lÔ6Ið %@ N NØ)?ð !åð :ß;Aº6Ø'¨¨y¸*ñ<Fô <FñGô Gð Gð Gð Gõ Ð6×=Ò=¸dÑCÔCÑDÔDÐDÐDÐDð
Eð 
Eri   N)r~   r   r€   r—  rà  ra   ri   rg   rŽ  rŽ  A  s7   € € € € € ðð ðKEð KEð KEð KEð KEri   rŽ  c                 ób  — t          |j        ¦  «        }|                     dd¦  «         t          |                     ¦   «         ¦  «        |_        | t
          t          z   v rg |_        | t          v r1t          |j        ¦  «        dk    r|j                             ¦   «          | t          v r1t          |j        ¦  «        dk    r|j                             ¦   «          | dk    r•t          |j        ¦  «        dk    r|j                             ¦   «          t          |j        ¦  «        dk    rL|j                             ¦   «         }|j                             ¦   «          |j                             |¦  «         | dk    r1t          |j        ¦  «        dk    r|j                             ¦   «          dS )	z%remove size argument from args or kwsr  rc  rS  rÿ   ÚrandintrT  Ú
triangularN)ré  r¹   r	  r;  r¼  rS   rR   r|   rU   rŽ   rT   r“  )rÃ  r  r¹   Údt_args       rg   rÉ  rÉ  ”  sZ  € õ ˆtŒx‰.Œ.€CØ‡G‚GˆF�BÑÔÐÝ�S—Y’Y‘[”[Ñ!Ô!€D„Hð Õ$¥Ñ6Ð6Ð6ð ˆŒ	àÕ(Ð(Ð(åˆtŒy‰>Œ>˜QÒÐØŒI�MŠM‰OŒOˆOàÕ(Ð(Ð(åˆtŒy‰>Œ>˜QÒÐØŒI�MŠM‰OŒOˆOà�IÒÐåˆtŒy‰>Œ>˜QÒÐØŒI�MŠM‰OŒOˆOÝˆtŒy‰>Œ>˜QÒÐØ”Y—]’]‘_”_ˆFØŒI�MŠM‰OŒOˆOØŒI×Ò˜VÑ$Ô$Ð$à�LÒ Ð åˆtŒy‰>Œ>˜QÒÐØŒI�MŠM‰OŒOˆOà
€Fri   c                 óº   — g }| j         D ]"}|                     ||j                 ¦  «         Œ#i }| j        D ]\  }}||j                 ||<   Œt	          |¦  «        |fS rq   )r|   r“  rˆ  r¹   r;  )r  rÁ  rÌ  r¢   rÍ  rˆ  s         rg   rÊ  rÊ  ¼  sw   € Ø€LØŒyð /ð /ˆØ×Ò˜G C¤HÔ-Ñ.Ô.Ð.Ð.à€LØ”Xð /ð /‰	ˆˆcØ$ S¤XÔ.ˆ�TÑÐå�ÑÔ Ð,Ð,ri   c                 óº
  ‡— ‰|j                  }|j        }|j        }g }t          |t          ¦  «        �rÑ|\  }}g }|D ]`}t          j        |t          d¦  «        |¦  «        }|‰|j         <   |t          | |‰|||||||	|
¦  «        z  }| 	                    |¦  «         Œa|t          j        v �r'‰|d         j                  }t          |¦  «        dk    r�‰|d         j                  }|                     |||fi ¦  «        }t
          j                             ||d         |d         |¦  «        }|t           j        k    r"t%          |d         |d         |‰|¦  «        \  }}n?|                     ||fi ¦  «        }t
          j                             ||d         |¦  «        }|||<   |j        }| 	                    t          j        |||¦  «        ¦  «         t,          j        D �]"}t          ||¦  «        �rt1          ‰||
|¬¦  «        }t          j        |t          |¦  «        |¦  «        }‰|         ‰|j         <   t3          j        |                      |¦  «        ¦  «        }t          |t
          j        ¦  «        rÌ|j        dk    rÁ|j        dk    r¶t          j        |t          d¦  «        |¦  «        }t<          j                              tB          ¦  «        ‰|j         <   t          j"        d	tB          |¦  «        }t          j        |||¦  «        }t
          j         #                    |d|¦  «        }| 	                    |¦  «         t
          j         $                    ||d
|¦  «        }‰|j                   %                    |t	          ˆfd„|D ¦   «         ¦  «        i ¦  «        }|||<   |j        }| 	                    t          j        |||¦  «        ¦  «         | 	                    t          j        |||¦  «        ¦  «         �Œ$nýt          |t
          j        ¦  «        ru‰|j                  } t          | t<          j&        ¦  «        r | j'        }tQ          ||||	|||‰||¦
  «
        }n| }|}| 	                    t          j        |||¦  «        ¦  «         nnt          |t
          j)        ¦  «        rTtU          j+        ¦   «          ,                    |j-        ¦  «        }| 	                    t          j        |||¦  «        ¦  «         t          |¦  «        dk    r t]          j/        d|d›d�|j        ¬¦  «        ‚‰ 0                    |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_varrH  ra   c              3   ó2   •K  — | ]}‰|j                  V — Œd S rq   r  )re   rð   rÁ  s     €rg   rF  z(_arrayexpr_tree_to_ir.<locals>.<genexpr>  s)   øè è € Ð$GÐ$G¸ W¨Q¬V¤_Ð$GÐ$GÐ$GÐ$GÐ$GÐ$Gri   z.Don't know how to translate array expression 're  ú'N)1rˆ  r  rž  r�   r;  r	   r”  r    r»  r“  rO   Úsupported_array_operatorsrŽ   rl  r  rU  rk  ÚtruedivÚ_gen_np_divideÚunaryr¡   r
  rZ   Ú	MAP_TYPESÚ_find_func_varr  r  r>   r�  rŸ  r   r  r  rH  r  rÇ   r  r  r  r�   Ú_gen_arrayexpr_getitemr  r   rË  Úresolve_value_typer  r   rž  r	  )!rÝ  rÞ  rÁ  rÝ  r©  r¥  re  r  Úparfor_index_tuple_varÚall_parfor_indicesr°  r[  r  rž  Úout_irr�  Úarr_expr_argsÚarg_varsr¢   Úarg_out_varÚel_typ1Úel_typ2Úfunc_typÚir_exprÚTÚfunc_var_namerD  Úfunc_var_defÚ
g_math_varÚg_mathÚg_math_assignÚcall_typÚvar_typs!     `                              rg   r»  r»  È  sA  ø€ ð �\Ô&Ô'€FØÔ€EØ
Ô
€CØ€Få�$�ÑÔñ Q:Ø ÑˆˆMØˆØ ð 	)ð 	)ˆCÝœ& ­°nÑ(EÔ(EÀsÑKÔKˆKØ(.ˆG�KÔ$Ñ%ØÕ+¨GØ,5Ø,3Ø,5Ø,5Ø,6Ø,7Ø,/Ø,BØ,>Ø,6ñ
8ô 
8ñ 
8ˆFð �OŠO˜KÑ(Ô(Ð(Ð(Ø•Ô2Ð2Ñ2Ø˜h qœkÔ.Ô/ˆGÝ�8‰}Œ} Ò!Ð!Ø! (¨1¤+Ô"2Ô3�Ø$×:Ò:¸2ÀØ@Gð@IØJLñNô N�åœ'Ÿ-š-¨¨H°Q¬K¸À!¼ÀcÑJÔJ�Ø�Ô)Ò)Ð)Ý(6Ø  œ X¨a¤[°&¸'À9ñ)Nô )NÑ%�H˜gøð %×:Ò:¸2À¸zÈ2ÑNÔN�Ýœ'Ÿ-š-¨¨H°Q¬K¸Ñ=Ô=�Ø!)ˆI�gÑØÔ)ˆFØ�MŠM�"œ) G¨\¸3Ñ?Ô?Ñ@Ô@Ð@ÝÔ)ð 	Eñ 	EˆAÝ˜"˜aÑ Ô ñ Eõ !/¨w¸¸JÈCÐ PÑ PÔ P�Ýœ6 %­°}Ñ)EÔ)EÀsÑKÔK�Ø)0°Ô)?�˜œÑ&Ý#œ}¨W×-CÒ-CÀMÑ-RÔ-RÑSÔS�Ý˜l­B¬GÑ4Ô4ð 2¸¼ÈIÒ9UÐ9UÐZfÔZkÐouÒZuÐZuÝ"$¤&¨µ¸mÑ0LÔ0LÈcÑ"RÔ"R�ZÝ05´
×0AÒ0AÅ$Ñ0GÔ0G�W˜Zœ_Ñ-Ý œi¨µ°cÑ:Ô:�VÝ%'¤Y¨v°zÀ3Ñ%GÔ%G�]Ý$&¤G§O¢O°JÀÈÑ$LÔ$L�\Ø—]’] =Ñ1Ô1Ð1åœ'Ÿ,š, x°¸2¸sÑCÔC�Ø" 8¤=Ô1×?Ò?Ø�uÐ$GÐ$GÐ$GÐ$G¸hÐ$GÑ$GÔ$GÑGÔGÈñMô M�à%-�	˜'Ñ"Ø!Ô-�à—’�bœi¨°hÀÑDÔDÑEÔEÐEØ—’�bœi¨°¸sÑCÔCÑDÔDÐDùð1	Eõ2 
�D�"œ&Ñ	!Ô	!ð :Ø˜$œ)Ô$ˆÝ�g�uœ{Ñ+Ô+ð 	Ø”]ˆFÝ,ØØØ&Ø"ØØØØØØñ
ô 
ˆGˆGð ˆFØˆGØ�Š•b”i ¨°sÑ;Ô;Ñ<Ô<Ð<Ð<Ý	�D�"œ(Ñ	#Ô	#ð :Ý”Ñ!Ô!×4Ò4°T´ZÑ@Ô@ˆØ�Š•b”i  l°CÑ8Ô8Ñ9Ô9Ð9å
ˆ6�{„{�aÒÐÝÔ,ØF¸TÐFÐFÐFÐFØ”ð
ñ 
ô 
ð 	
ð ‡K‚K�Ô! 4Ñ(Ô(Ð(Ø!'€GˆLÔÑØ€Mri   c                 óö  — | j         }| j        }t          j        |t	          d¦  «        |¦  «        }t
          j                             t          ¦  «        ||j	        <   t          j
        dt          |¦  «        }t          j        |||¦  «        }	t          j                             |d|¦  «        }
t          j        |t	          d¦  «        |¦  «        }t          t          j        |¦  «        }|||j	        <   t          j        |
||¦  «        }t          j                             || |gd|¦  «        }|                     ||| j	                 ||j	                 gi ¦  «        }|                     |	|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_attrra   )r  rž  r	   r”  r    r   r  r  rk  rˆ  r  r
  r  rÇ   r"   rÄ  r  r  r3  )Úarg1Úarg2r³  rÁ  rÞ  r  rž  r  r  r  Údiv_attr_callÚattr_varÚfunc_var_typÚattr_assignÚdiv_callr¹  s                   rg   r«  r«  9  sA  € ð ŒJ€EØ
Œ(€CåŒv�e�]¨;Ñ7Ô7¸Ñ=Ô=€HÝ"œZ×.Ò.­uÑ5Ô5€GˆHŒMÑÝŒ9�T�5 #Ñ&Ô&€DÝ”)˜D (¨CÑ0Ô0€Kå”G—O’O H¨h¸Ñ<Ô<€MÝŒv�e�]¨;Ñ7Ô7¸Ñ=Ô=€HÝ#¥E¤L°)Ñ<Ô<€LØ)€GˆHŒMÑÝ”)˜M¨8°SÑ9Ô9€KåŒw�|Š|˜H t¨T l°B¸Ñ<Ô<€HØ×)Ò)Ø�G˜DœIÔ&¨°´	Ô(:Ð;¸RñAô A€Hà
‡M‚M�; Ð,Ñ-Ô-Ð-Ø�XÐÐri   c
           	      ó^  ‡ — |j         }
|}||j                 }||j                 j        }t          |¦  «        }‰                      |¦  «        pg }ˆ fd„|D ¦   «         }|dk    �rt          j        |j        t          d¦  «        |
¦  «        }t          j
                             |j        dd¬¦  «        }|||j        <   t          j        dt          j        ||g|||¦  «        }|j                             |¦  «         |}t          j        d|j         ¦  «        }t          j        |j        t          d¦  «        |
¦  «        }t          j        ||j        <   t          j        |||
¦  «        }|	                     |¦  «         |}�nÞ|dk    r
|d	         }�nÎt/          d
„ |D ¦   «         ¦  «        �r´||z
  }t          j        |j        t          d¦  «        |
¦  «        }t          j                             t          j        |¦  «        ||j        <   t          j        d|j         ¦  «        }t          j        |j        t          d¦  «        |
¦  «        }t          j        ||j        <   t          j        |||
¦  «        }|	                     |¦  «         g }t5          t7          |¦  «        ¦  «        D ]L}||         }||         }|dk    r|                     |¦  «         Œ.|                     |||z            ¦  «         ŒMt9          t5          |¦  «        ¦  «        }t
          j                             ||
¦  «        }t          j        |||
¦  «        }|	                     |¦  «         |}t
          j                             |||
¦  «        }tA          |||j                 ||j                 ¦  «        ||<   |S )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).
    c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS ra   )Úget_equiv_const)re   rm   r©  s     €rg   rh   z*_gen_arrayexpr_getitem.<locals>.<listcomp>h  s'   ø€ ÐCÐCÐC°A�9×,Ò,¨QÑ/Ô/ÐCÐCÐCri   r   z$ravelrˆ   r²  )r�   rœ   r´  rá   z$const_ind_0r9  c                 ó   — g | ]}|d u‘ŒS rq   ra   r¹  s     rg   rh   z*_gen_arrayexpr_getitem.<locals>.<listcomp>~  s   € Ð1Ð1Ð1 ˆa�tˆmÐ1Ð1Ð1ri   z$parfor_index_tuple_var_bcast)!rž  rˆ  rœ   rŽ   rQ  r	   r”  r  r    r   r   r  r�   r   Úgen_np_callrk  rá   r½  r3  r  r‹  r
  r“  rU  r›  rœ  rN  rz   rì  r  r�  rT  rP   ) r©  r,  r±  r²  r[  rÝ  rÞ  rÁ  r¥  r³  rž  r§  rÂ  r   Únum_indicesr\  Úsize_constsÚ	ravel_varÚ	ravel_typÚstmtsÚ
const_nodeÚ	const_varÚconst_assignÚ
ind_offsetr¡  r]  r“   r‘  Ú
size_constr¢  r£  rº  s    `                               rg   r¯  r¯  R  s_  ø€ ð  Œ'€CØ&€IØ�s”xÔ €GØ�C”HÔÔ"€EÝÐ(Ñ)Ô)€KØ×#Ò# CÑ(Ô(Ð.¨B€IØCÐCÐCÐC¸ÐCÑCÔC€Kà�‚z�zå”F˜3œ9¥m°HÑ&=Ô&=¸sÑCÔCˆ	Ý”N×(Ò(¨w¬}À1ÈSÐ(ÑQÔQˆ	Ø"+ˆ�	”ÑÝÔ$ W­e¬k¸9ÀsÀeÈYÐX_ÐajÑkÔkˆØŒ×Ò˜uÑ%Ô%Ð%Øˆå”X˜a ¤Ñ)Ô)ˆ
Ý”F˜3œ9¥m°NÑ&CÔ&CÀSÑIÔIˆ	Ý"'¤+ˆ�	”ÑÝ”y ¨Y¸Ñ<Ô<ˆØ�Š�lÑ#Ô#Ð#Øˆ	‰	à	�!Šˆà& rÔ*ˆ	‰	å	Ð1Ð1 [Ð1Ñ1Ô1Ñ	2Ô	2ñ à  5Ñ(ˆ
Ý”F˜3œ9¥mØ+ñ'-ô '-Ø.1ñ3ô 3ˆ	å"'Ô"2×";Ò";½E¼KÈÑ"OÔ"Oˆ�	”Ñõ ”X˜a ¤Ñ)Ô)ˆ
Ý”F˜3œ9¥m°NÑ&CÔ&CÀSÑIÔIˆ	Ý"'¤+ˆ�	”ÑÝ”y ¨Y¸Ñ<Ô<ˆØ�Š�lÑ#Ô#Ð#Øˆ
Ý�% ™,œ,Ñ'Ô'ð 	Fð 	FˆAØ  ”|ˆHØ$ QœˆJØ˜QŠˆØ×!Ò! )Ñ,Ô,Ð,Ð,à×!Ò!Ð"4°ZÀ!±^Ô"DÑEÔEÐEÐEÝ�( :Ñ.Ô.Ñ/Ô/ˆ
Ý”W×(Ò(¨°SÑ9Ô9ˆ
Ý”y ¨Y¸Ñ<Ô<ˆØ�Š�lÑ#Ô#Ð#Øˆ	åŒg�oŠo˜c 9¨cÑ2Ô2€GÝ" 6¨7°3´8Ô+<Ø#*¨9¬>Ô#:ñ<ô <€IˆgÑà€Nri   c                 ó�   — |D ].}| |         }t          |t          ¦  «        r|j        |k    r|c S Œ/t          j        d|¬¦  «        ‚)zAfind variable in typemap which represents the function func.
    zufunc call variable not foundrš  )r�   rQ   Ú
typing_keyr   rž  )rÁ  r‰  r°  rž  r   rý  s         rg   r®  r®  Ÿ  s[   € ð ð ð ˆØ�AŒJˆå�a�Ñ"Ô"ð 	 q¤|°tÒ';Ð';ØˆHˆHˆHøÝ
Ô
(Ð)HÈcÐ
RÑ
RÔ
RÐRri   c           
      ó  — t           j                             t          j        |j        ¦  «        ¦  «         d}i }t          t          |j                             ¦   «         ¦  «        ¦  «        j        }|j         	                    ¦   «         D ]#\  }}	t          ||	|||||¬¦  «        \  }}|	||<   Œ$||_        |rt          |j        ¦  «        |_        t          |d¦  «         t          ||||d         ¦  «         t          |d¦  «         d S )NF©r  z after parfor sequential loweringr‹   z after parfor sequential simplify)r   r1  rV  rr  r  ÚnextÚiterr  r  r¼  Ú_lower_parfor_sequential_blockr1   r.   r3   )
rÞ  rÝ  rÁ  rÝ  r2  Úparfor_foundrþ  r  rš  rÐ  s
             rg   r™  r™  ª  s  € ÝÔ×"Ò"¥8Ô#:¸7¼>Ñ#JÔ#JÑKÔKÐKØ€LØ€JÝ•�g”n×+Ò+Ñ-Ô-Ñ.Ô.Ñ/Ô/Ô5€EØ '¤× 4Ò 4Ñ 6Ô 6ð (ð (Ñˆ�eÝ$BØ˜ 
¨G°YÀØð%ñ %ô %Ñ!ˆ�\ð #(ˆ
�;ÑÐØ€G„Nàð 7Ý& w¤~Ñ6Ô6ˆŒÝ�7Ð>Ñ?Ô?Ð?ÝˆW�g˜y¨(°9Ô*=Ñ>Ô>Ð>Ý�7Ð>Ñ?Ô?Ð?Ð?Ð?ri   c           
      óB  — t          |j        ¦  «        }|dk    �rd}|j        |         }|j        j        }	t	          j        ||	¦  «        }
|j        d |…         |
_        |j        |dz   d …         |_        t          ¦   «         }|
j                             t	          j        ||	¦  «        ¦  «         t          |j        |¦  «        ||<   |
|| <   t          ¦   «         } t          |j        ¦  «        }t          |¦  «        D �]}|j        |         }t          ¦   «         }t          ¦   «         }t          ||j        |j        |j        |||	¦  «        }||j        d         _        |j        d         j        }|||<   t%          |||||	¦  «        }|j        |j        d         _        |||<   |dk    rE|j        j                             t	          j        ||	¦  «        ¦  «         | |j        d         _        n*|||         j        d         _        ||j        d         _        |}�Œ!t-          |j                             ¦   «         ¦  «        }|j        |         j                             t	          j        ||	¦  «        ¦  «         t3          |j                             ¦   «         ¦  «        }||j        d         _        |j                             ¦   «         D ]1\  }}t7          |||||||¬¦  «        \  }}t          ||¦  «        ||<   Œ2t          |j        ¦  «        }|dk    �°| |fS )Nr9  Trˆ   éþÿÿÿr   rÞ  )Ú_find_first_parforr½  r¥  rž  r	   rP  r!   r“  r�  rI   rŽ   r¤  rz   r#   r;  r4  r@  r  r$   r�  ÚfalsebrÚtruebrrÛ   r¦  r  r–   r¼  rá  )rš  rÐ  rþ  rÁ  rÝ  râ  r  r“   r  rž  Ú
prev_blockÚ
init_labelr   rÎ  Úrange_labelÚheader_labelÚrange_blockÚphi_varÚheader_blockÚprev_header_labelÚbody_last_labelÚbody_first_labelrn   rñ   s                           rg   rá  rá  ¾  s  € õ 	˜5œ:Ñ&Ô&€AØ
ˆrŠ'‰'ØˆØŒz˜!Œ}ˆØŒoÔ!ˆå”X˜e SÑ)Ô)ˆ
Øœ* R a Rœ.ˆ
ŒØ”Z  A¡  Ô'ˆŒ
å‘\”\ˆ
ØŒ×Ò�rœw z°3Ñ7Ô7Ñ8Ô8Ð8Ý!/°´ÀÑ!GÔ!Gˆ
�:ÑØ",ˆ
�;ÑÝ ‘l”lˆå�D”OÑ$Ô$ˆÝ�u‘”ð 	-ñ 	-ˆAØ” qÔ)ˆHå$™,œ,ˆKÝ%™<œ<ˆLÝ(ØØ”Ø”Ø”ØØØñô ˆKð +7ˆKÔ˜RÔ Ô'Ø!Ô& rÔ*Ô1ˆGØ&1ˆJ�{Ñ#Ý)¨'°7¸IØ*/°ñ6ô 6ˆLà+3Ô+BˆLÔ˜bÔ!Ô(Ø'3ˆJ�|Ñ$à�AŠvˆvØ”Ô$×+Ò+­B¬G°KÀÑ,EÔ,EÑFÔFÐFØ0;�Ô! "Ô%Ô-Ð-à@K�
Ð,Ô-Ô2°2Ô6Ô=Ø0A�Ô! "Ô%Ô-Ø ,ÐÑõ ˜dœn×1Ò1Ñ3Ô3Ñ4Ô4ˆØŒ�Ô'Ô,×3Ò3ÝŒG�L #Ñ&Ô&ñ	(ô 	(ð 	(õ ˜tœ~×2Ò2Ñ4Ô4Ñ5Ô5ÐØ'7ˆÔ˜"ÔÔ$à”n×*Ò*Ñ,Ô,ð 	5ð 	5‰FˆQ�Ý<Ø�1�j '¨9°lØðñ ô ‰OˆAˆ|õ +¨1¨eÑ4Ô4ˆJ�q‰MˆMÝ˜uœzÑ*Ô*ˆðu ˆrŠ'‰'ðv ˜Ð$Ð$ri   c                 óp   — t          | ¦  «        D ]%\  }}t          |t          ¦  «        r|j        s|c S Œ&dS ©Nr9  )rg  r�   r™  rš  ©r½  r“   r  s      rg   rå  rå    sF   € Ý˜t‘_”_ð ð ‰	ˆˆDÝ�d�FÑ#Ô#ð 	¨DÔ,Gð 	ØˆHˆHˆHøØˆ2ri   c                 óf  — 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        ¦  «         |                     |¦  «         ŒÃ|||	         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   )rŸ  rJ   r/   Ú_find_parforsr½  r	   rP  r  rž  r  Úget_parfor_params_innerÚ#_combine_params_races_for_ssa_namesr›  r¨  r  r£  r“  )r  Úoptions_fusionrí  rÌ  r‹   Úpre_defsrÿ  Úall_defsrG  r
  rÐ  r“   rŒ   Údummy_blockÚbefore_defsr¨  s                   rg   r€  r€    s=  € õ ‘”€JØ€GÝ‰uŒu€HÝ" 6Ñ*Ô*�K€A€xÝ  Ñ(Ô(€JØð $ð $ˆØ�u”ˆÝ& u¤zÑ2Ô2ð 	#ð 	#‰IˆAˆvåœ( 5¤;°´	Ñ:Ô:ˆKØ$œz¨"¨1¨"œ~ˆKÔÝ*¨A¨{Ð+;Ñ<Ô<ÔCÀAÔFˆKØ˜Ñ#ˆHÝ,Ø˜ .°+ñô ˆFõ +NØ”˜V V¤\ñ+ô +Ñ'ˆFŒM˜6œ<ð �NŠN˜6œ9Ñ%Ô%Ð%Ø�NŠN˜6Ñ"Ô"Ð"Ð"à�H˜U”OÑ#ˆˆØ�wÐÐri   c                 óæ   ‡ ‡‡— ˆ fd„Št          |¦  «        }t          t          ‰|¦  «        ¦  «        }|D ]4Št          ˆˆfd„|D ¦   «         ¦  «        r|                     ‰¦  «         Œ4 ||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                 óh   •— 	 ‰                      | ¦  «        j        S # t          j        $ r | cY S w xY wrq   )rY  rZ  r	   r[  )r-  r  s    €rg   Ú	unversionz6_combine_params_races_for_ssa_names.<locals>.unversion4  sD   ø€ ð	Ø—?’? 1Ñ%Ô%Ô6Ð6øÝÔ!ð 	ð 	ð 	àˆHˆHˆHð	øøøs   ƒ �1°1c              3   ó6   •K  — | ]} ‰‰¦  «        |k    V — Œd S rq   ra   )re   ÚpvÚrvr   s     €€rg   rF  z6_combine_params_races_for_ssa_names.<locals>.<genexpr>?  s0   øè è € Ð:Ð: rˆyˆy˜‰}Œ} Ò"Ð:Ð:Ð:Ð:Ð:Ð:ri   )rŸ  rì  r_  rU  Údiscard)r  r¨  r›  Úraces1Úunver_paramsr  r   s   `    @@rg   rø  rø  /  s    øøø€ ð
ð ð ð ð õ �‰ZŒZ€FÝ�˜I vÑ.Ô.Ñ/Ô/€Làð ð ˆÝÐ:Ð:Ð:Ð:Ð:¨\Ð:Ñ:Ô:Ñ:Ô:ð 	Ø�NŠN˜2ÑÔÐÐàà�F‰?˜FÐ"Ð"ri   c                 óF  — t          | ¦  «        }t          |¦  «        }t          |¦  «        }t          |||j        |j        ¦  «        }t          |||¦  «        \  }}	t          |¦  «        }
|
dk    rSt          j	        r0|rdnd}t          d                     || j        |
|¦  «        ¦  «         t          |¦  «        || j        <   t          | ¦  «         t          |                     ¦   «         ¦  «        }|d         }|d         }|j        |         |z  }||         |z  }|S )Nr   r‘  r½  z2{}, parallel for-loop {} has nested Parfor(s) #{}.rˆ   )rÞ  rM   rJ   rK   r  r  r€  rŽ   r   r¯  rc   rÈ   r£  rì  rá  rÍ  r  )rŒ   rú  rù  rí  r  r*  r+  r  rÌ  rÿ  rÍ  rÑ  Úkeylistr¥  Úfirst_non_init_blockrý  r¨  s                    rg   r÷  r÷  G  s1  € Ý Ñ'Ô'€FÝ
! &Ñ
)Ô
)€CÝ˜vÑ&Ô&€GÝ  V¨W¬^¸W¼^ÑLÔL€HÝ% f¨n¸kÑJÔJ�M€J�Ý�J‘”€IØ�1‚}€}ÝÔ'ð 	AØ.<ð 8˜N˜NØ!7ð åð (ß)/ªØ˜fœi¨°Jñ*@ô *@ñAô Að Aõ "& jÑ!1Ô!1ˆ�F”IÑå˜Ñ Ô Ð Ý�X—]’]‘_”_Ñ%Ô%€GØ˜”€JØ" 1œ:Ðà”. Ô,¨xÑ7€KØÐ*Ô+¨kÑ9€FØ€Mri   c              #   ój   K  — t          | ¦  «        D ] \  }}t          |t          ¦  «        r||fV — Œ!d S rq   )rg  r�   r™  rô  s      rg   rö  rö  a  sI   è è € Ý˜T‘?”?ð ð ‰ˆˆ4Ý�d�FÑ#Ô#ð 	Ø�T�'ˆMˆMˆMøðð ri   c                 óÈ   — t          t          | |j        ¦  «        }t          |t          j        ¦  «        r,|j        dk    r!d„ |j        D ¦   «         d„ |D ¦   «         k    rdS dS )Nr�  c                 ó   — g | ]	}|j         ‘Œ
S ra   r  r¹  s     rg   rh   z&_is_indirect_index.<locals>.<listcomp>j  s   € Ð,Ð,Ð,�qˆAŒFÐ,Ð,Ð,ri   c                 ó   — g | ]	}|j         ‘Œ
S ra   r  r¹  s     rg   rh   z&_is_indirect_index.<locals>.<listcomp>j  s   € Ð0NÐ0NÐ0N¸A°´Ð0NÐ0NÐ0Nri   TF)r:   r>   rˆ  r�   r	   r  r�  r¼  )rÝ  rä   Únest_indicesÚ	index_defs       rg   Ú_is_indirect_indexr  g  si   € Ý•n g¨u¬zÑ:Ô:€IÝ�)�RœWÑ%Ô%ð ¨)¬,¸-Ò*GÐ*GØ,Ð,˜IœOÐ,Ñ,Ô,Ð0NÐ0NÀÐ0NÑ0NÔ0NÒNÐNØ�4àˆ5ri   c           
      ó’  — | D �]Â}|j         D �]¶}t          |t          j        t          j        f¦  «        r…t          |¦  «        }t          |t          j        ¦  «        r<|j        |k    st          |||¦  «        r | 	                    |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        ¦  «        r3|	j        |k    st          ||	|¦  «        r| 	                    |
¦  «         �Œ_| 	                    |
¦  «         �Œvt          |t           ¦  «        r+t#          |j                             ¦   «         |||||¦  «         �Œ¸�ŒÄd S )Nr  )r½  r�   r	   r|  rW  rr  r”  rˆ  r  r  r  r
  r  r  r�  rä   r™  Ú,get_array_indexed_with_parfor_index_internalr¦  r  )r¦  rä   Úret_indexedÚret_not_indexedr  rÝ  r  r¾  Úsetarray_indexÚgetarray_indexÚgetarray_names              rg   r  r  p  sÒ  € ð ð "ñ "ˆØ”Hð !	ñ !	ˆDÝ˜$¥Ô!1µ2´:Ð >Ñ?Ô?ð  Ý!.¨tÑ!4Ô!4�Ý˜~­r¬vÑ6Ô6ð :Ø#Ô(¨EÒ1Ð1Ý'Ø Ø'Ø%ñ'ô 'ð 2ð
  —O’O D¤KÔ$4Ñ5Ô5Ð5Ð5à#×'Ò'¨¬Ô(8Ñ9Ô9Ð9Ð9Ý˜T¥2¤9Ñ-Ô-ð Ý˜TœZ­¬Ñ1Ô1ðà”*”-Ð#@Ð@Ð@Ø!%¤Ô!1�Ø $¤
Ô 0Ô 5�Ý˜~­r¬vÑ6Ô6ð 7Ø#Ô(¨EÒ1Ð1Ý'Ø Ø'Ø%ñ'ô 'ð 2ð
  —O’O MÑ2Ô2Ð2Ñ2à#×'Ò'¨Ñ6Ô6Ð6Ñ6Ý˜D¥&Ñ)Ô)ð Ý<Ø”N×)Ò)Ñ+Ô+ØØØ#Ø Øñô ð ùñ7!	ð"ð "ri   c                 ój   — t          ¦   «         }t          ¦   «         }t          | |||||¦  «         ||fS rq   )rŸ  r  )r¦  rä   r  rÝ  r  r  s         rg   Ú#get_array_indexed_with_parfor_indexr  ›  sG   € õ ‘%”%€KÝ‘e”e€OÝ0ØØØØØØñô ð ð ˜Ð'Ð'ri   c                 óâ  — t          | j                             ¦   «         ¦  «        }g }| j                             ¦   «         D ]s}|j        D ]i}t          |t          j        t          j        f¦  «        rAt          |¦  «        j
        | j        j
        k    r|                     |j        j
        ¦  «         ŒjŒtt          t          |¦  «        t          |¦  «        z  ¦  «        }t!          |¦  «        S )zhget arrays that are written to inside the parfor and need to be passed
    as parameters to gufunc.
    )rÛ   r¦  r  r  r½  r�   r	   r|  rW  rr  rˆ  r§  r“  r  rì  rŸ  rÍ  )rŒ   Úparfor_paramsÚ
last_labelÚoutputsr  r¾  s         rg   Úget_parfor_outputsr  «  s×   € õ �VÔ%×*Ò*Ñ,Ô,Ñ-Ô-€JØ€GØÔ×&Ò&Ñ(Ô(ð 1ð 1ˆØ”Hð 	1ð 	1ˆDÝ˜4¥"Ô"2µB´JÐ!?Ñ@Ô@ð 1Ý˜dÑ#Ô#Ô(¨FÔ,<Ô,AÒAÐAØ—’˜tœ{Ô/Ñ0Ô0Ð0øð	1õ
 •3�w‘<”<¥# mÑ"4Ô"4Ñ4Ñ5Ô5€GÝ�'‰?Œ?Ðri   Ú_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
        ¦  «        �r|j        j        |v s|j        j        |v rú|j        }|j        }|j        |v r|n||j                 }g }t          |t          j        ¦  «        r	|j        g}n=t          |t          j        ¦  «        r#d„ |j                             ¦   «         D ¦   «         }||                              |¦  «         |D ]}|||<   Œt%          j        |¦  «        }|j        |v r||j                 ||j        <   ||                              |¦  «         t          |t*          ¦  «        rt-          | |||||d||¦	  «	         �Œb�Œ†|                     ¦   «         D ]¢\  }}|j        }||v r’||vrŽ||                              ¦   «          t3          |||         | ¦  «        }|�[|                     |¦  «         t5          ||¦  «         t7          t8          |¦  «        }|�|\  }}nd}d}t;          |||¬¦  «        ||<   Œ£||fS )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ˆ   c                 ó   — g | ]	}|j         ‘Œ
S ra   r  rI  s     rg   rh   z)get_parfor_reductions.<locals>.<listcomp>é  s   € Ð HÐ HÐ H¨A ¤Ð HÐ HÐ Hri   r   )r   rì  rÞ  r/   rá  rN  r¦  r½  r�   r	   r
  r  rˆ  r  r”  r  r–  r3  r  r  r“  r™  r�  r¼  rL  Úget_reduce_nodesÚ%check_conflicting_reduction_operatorsr:   Úget_reduction_initr  )rÝ  rŒ   r  rÝ  Ú
reductionsÚreduce_varnamesÚ
param_usesÚparam_nodesÚvar_to_paramr  rG  r
  r¾  r  rD  Ú	cur_paramÚ	used_varsr   Ústmt_cpÚparamÚ
param_namer!  Úgri_outrç   r"  s                            rg   r�  r�  Ä  s)  € ð ÐØˆ
ØÐØˆð ÐÝ ¥Ñ&Ô&ˆ
ØÐÝ!¥$Ñ'Ô'ˆØÐØˆå Ñ'Ô'€FÝ  Ñ(Ô(€JØ˜A˜B˜B”€JÝ˜Ñ Ô Ð å˜*Ñ%Ô%ð Rñ RˆÝ˜VÔ-¨eÔ4Ô9Ñ:Ô:ð 	Rñ 	RˆDÝ˜4¥¤Ñ+Ô+ñ 7ØœÔ)¨]Ð:Ð:ØœÔ)¨\Ð9Ð9Ø”k�Ø”j�Ø#&¤8¨}Ð#<Ð#<˜C˜CÀ,ÈsÌxÔBX�	Ø�	Ý˜c¥2¤6Ñ*Ô*ð IØ!$¤ 
�I�IÝ ¥R¤WÑ-Ô-ð IØ HÐ H°´×1EÒ1EÑ1GÔ1GÐ HÑ HÔ H�IØ˜9Ô%×,Ò,¨YÑ7Ô7Ð7Ø"ð 0ð 0�AØ&/�L ‘O�Oåœ-¨Ñ-Ô-�Ø”: Ð*Ð*Ø/8¸¼Ô/D�I˜gœmÑ,Ø˜IÔ&×-Ò-¨gÑ6Ô6Ð6Ý˜$¥Ñ'Ô'ð Rå% g¨t°]ÀIØ °°{ÀLñRô Rð Rùñ-	Rð2 '×,Ò,Ñ.Ô.ð ð Ñˆˆyð ”Zˆ
Ø˜Ð"Ð" z¸Ð'HÐ'HØ˜Ô×&Ò&Ñ(Ô(Ð(Ý+¨E°;¸uÔ3EÀwÑOÔOˆLð Ð'Ø×&Ò& zÑ2Ô2Ð2Ý5°e¸\ÑJÔJÐJÝÕ 2°LÑAÔA�ØÐ&Ø&-‘O�H˜e˜eà#�HØ �EÝ)4Ø%Ø!-Øð*ñ *ô *�
˜:Ñ&øð ˜JÐ&Ð&ri   c                 ó,  — d}|D ]Ž}t          |t          j        ¦  «        rrt          |j        t          j        ¦  «        rS|j        j        dk    rC|€|j        j        }ŒZ||j        j        k    r$d| j        z  }t          j	        ||j
        ¦  «        ‚Œ�dS )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  r�  ÚfnrZ  r   rž  rž  )r1  ÚnodesÚfirst_red_funcÚnoder×  s        rg   r'  r'    sª   € ð €NØð 
Hð 
HˆÝ�t�RœYÑ'Ô'ð 		HÝ�t”z¥2¤7Ñ+Ô+ð		HàŒJŒM˜?Ò*Ð*ØÐ%Ø!%¤¤��à! T¤Z¤]Ò2Ð2ð2Ø49Ô4JñK�Cå Ô8¸¸d¼hÑGÔGÐGøð
Hð 
Hri   c                 ó’  — t          t          | ¦  «        dk    ¦  «         t          t          d„ | ¦  «        ¦  «        d         j        }t          t          |t          j        ¦  «        o|j        dv ¦  «         |j	        }|j        dk    rs|t          j        k    rt          j        }nV|t          j        k    rt          j        }n9|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 dS )z^
    Get initial value for known reductions.
    Currently, only += and *= are supported.
    rˆ   c                 ó@   — t          | j        t          j        ¦  «        S rq   )r�   r  r	   r  rG  s    rg   rf  z$get_reduction_init.<locals>.<lambda>1  s   € ¥Z°´½¼Ñ%AÔ%A€ ri   r9  )r>  rU  rU  r   r&  )r;   rŽ   rì  r€  r  r�   r	   r  r�  r5  rk  r  ÚiaddÚsubÚisubÚmulÚimulrª  Úitruediv)r6  Úacc_exprÚacc_expr_fns      rg   r(  r(  )  s!  € õ
 �C�‰JŒJ˜!ŠOÑÔÐõ •FÐAÐAÀ5ÑIÔIÑJÔJÈ2ÔNÔT€HÝ�J�x¥¤Ñ)Ô)ÐW¨h¬kÐ=WÐ.WÑXÔXÐXØ”+€KØ„{�gÒÐØ�(œ,Ò&Ð&Ý"œ-ˆKˆKØ�HœLÒ(Ð(Ý"œ-ˆKˆKØ�HœLÒ(Ð(Ý"œ-ˆKˆKØ�HÔ,Ò,Ð,Ý"Ô+ˆKØ•h”mÒ#Ð# {µh´mÒ'CÐ'CØ�+ˆ~ÐØ
�œÒ
&Ð
&Ø
�Ô*Ò
*Ð
*Ø�+ˆ~ÐØˆ:ri   c                 óÎ  — | 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dS dS )Nr>  rU  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   rD  TF)r�  r5  rk  Ú	ifloordivÚfloordivr   ÚNumbaValueErrorrž  r;  r=  r?  r@  r  r<  r>  rª  r:   r8   )rm   rÝ  Úsuppsr÷  s       rg   Úsupported_reductionrI  D  s×   € Ø„tˆÒÐ !¤$¨'¢/ /ØŒ4•8Ô%Ò%Ð%¨¬µÔ1BÒ)BÐ)BÝÔ(ð +7ð :;¼ñ	@ô @ð @õ
 ”Ý”Ý”ÝÔ"Ý”Ý”Ý”ÝÔ!ð#ˆð Œt�uˆ}ÐØ„tˆv‚~€~Ý�¨°Ñ3Ô3ˆØð 
ð 
ð 
ð �4Øˆ5ri   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        ¦  «        �rDt          ˆfd„| 
                    ¦   «         D ¦   «         ¦  «        }	‰|	v �r|dz   t          |¦  «        k     rÆt          ||dz            t          j        ¦  «        r||dz            j        j        |k    rŠd}
t          ||dz   d…         ¦  «        D ]4\  }}t          |t          j        ¦  «        r|j        |k    r
||z   dz   }
 nŒ5|
�7|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        |k    rt          d|›d�¦  «        ‚t          ||¦  «        st          d|z   d	z   ¦  «        ‚ˆfd
„t          |¦  «        D ¦   «         }ˆfd„|D ¦   «         }t          |¦  «        dk    sJ ‚d„ |D ¦   «         }t!          |¦  «        }t          j        |j        ‰dz   |j        ¦  «        ||d         <   t'          ||¦  «         ||d…         } n�Œ­|S )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        d¦  «        }t          |t          j        ¦  «        r|€|}n||k    rdS  ‰||¬¦  «        S |s|€| n|S )zeLookup definition of ``var``.
        Returns ``None`` if variable definition forms a cycle.
        N)r;  )rÒ  rˆ  r�   r	   r”  )r,  Úvaronlyr;  Úlookedup_varÚcyclic_lookupÚdefss       €€rg   rN  z'get_reduce_nodes.<locals>.cyclic_lookupi  st   ø€ ð —x’x ¤¨$Ñ/Ô/ˆÝ�l¥B¤FÑ+Ô+ð 	NØˆ}Ø$��Ø˜,Ò&Ð&à�tØ �= °UÐ;Ñ;Ô;Ð;à"ÐM lÐ&:�3�3ÀÐMri   c                  ó:   •—  ‰| i |¤Ž}|€t          d¦  «        ‚|S )zZSimilar to cyclic_lookup but raise AssertionError if a cycle is
        detected.
        Nzunexpected cycle in lookup())rÝ  )r|   ÚkwargsrÐ   rN  s      €rg   Únoncyclic_lookupz*get_reduce_nodes.<locals>.noncyclic_lookupx  s2   ø€ ð ˆm˜TÐ, VÐ,Ð,ˆØˆ;Ý Ð!?Ñ@Ô@Ð@Øˆ
ri   c              3   ó:   •K  — | ]} ‰|d ¦  «        j         V — ŒdS ©TNr  )re   r   rR  s     €rg   rF  z#get_reduce_nodes.<locals>.<genexpr>Š  sG   øè è € ð 4ð 4Øð +Ð*¨1¨dÑ3Ô3Ô8ð 4ð 4ð 4ð 4ð 4ð 4ri   rˆ   zUse of reduction variable z? other than in a supported reduction function is not permitted.z& in an unsupported reduction function.c                 ó6   •— g | ]}|j          ‰|d ¦  «        f‘ŒS ©Tr  )re   rm   rR  s     €rg   rh   z$get_reduce_nodes.<locals>.<listcomp>Â  s>   ø€ ð 6ð 6ð 6Øð œÐ!1Ð!1°!°TÑ!:Ô!:Ð;ð 6ð 6ð 6ri   c                 ó0   •— g | ]\  }}|j         ‰k    ¯|‘ŒS ra   r  )re   rm   rf   rˆ  s      €rg   rh   z$get_reduce_nodes.<locals>.<listcomp>Ä  s$   ø€ ÐIÐIÐI¡v¨¨1¸¼À4º¸ ¸¸¸ri   c                 ó2   — g | ]\  }}||j         k    ¯||f‘ŒS ra   r  r¯  s      rg   rh   z$get_reduce_nodes.<locals>.<listcomp>Æ  s'   € ÐCÐCÐC¡F Q¨°a¸1¼6²k°k˜!˜Q˜°k°k°kri   z#initr   rT  )rˆ  rZ  rg  r  r  r�   r	   r”  r  rŸ  r–  rŽ   r
  rV  rI  Úget_expr_argsré  r  rž  r'   )Úreduction_noder6  rÝ  r!  rZ  r“   r¾  r  rD  Úin_varsÚfoundjrü   Újstmtr|   Únon_red_argsÚreplace_dictrN  rO  rˆ  rR  s                   @@@@rg   r&  r&  `  sÀ  øøøø€ ð €LØ€DðNð Nð Nð Nð Nð Nð Nðð ð ð ð ð Ô€DØ%Ô6ÐÝ˜UÑ#Ô#ð Hñ H‰ˆˆ4ØŒkˆØŒjˆØˆˆSŒX‰Ý�c�2œ6Ñ"Ô"ð 	% s¤x°4Ð'7Ð'7Ø�- Ñ$Ô$ˆCÝ�c�2œ7Ñ#Ô#ñ B	Ýð 4ð 4ð 4ð 4Ø#&§=¢=¡?¤?ð4ñ 4ô 4ñ 4ô 4ˆGà�wˆ‰ð& ˜‘E�C ™JœJÒ&Ð&Ý$ U¨1¨q©5¤\µ2´9Ñ=Ô=ð 'à˜1˜q™5”\Ô(Ô9Ð=MÒMÐMØ!�Få$-¨e°A¸±E°F°F¬mÑ$<Ô$<ð 	"ð 	"™˜˜5õ & e­R¬YÑ7Ô7ð "¸E¼KÈ3Ò<NÐ<Nð &'¨¡U¨Q¡Y˜FØ!˜EøØÐ)ð "' v¨¨A© v¤Ø!& v¨f°q©jÐ'8Ô!9ñ":à!& q¨1¡u¨V |Ô!4ñ"5ð "' v°¡z { {Ô!3ñ"4˜ð
 ˜1™�s 5™zœzÒ)Ð)­j¸¸qÀ¹s¼ÅRÄYÑ.OÔ.OÐ)Ø! ! A¡#œJÔ-Ô>ÐBRÒRÐRØÔ0Ð4DÒDÐDÝ$ð%Ð5Eð %ð %ð %ñô ð õ +¨3°Ñ8Ô8ð QÝ$Ð&BÐEUÑ&UØ&Nñ'Oñ Qô Qð Qð6ð 6ð 6ð 6Ý!.¨sÑ!3Ô!3ð6ñ 6ô 6�àIÐIÐIÐI°ÐIÑIÔI�Ý˜<Ñ(Ô(¨AÒ-Ð-Ð-Ð-ØCÐC¨dÐCÑCÔC�Ý# D™zœz�Ý02´°s´yÀ$ÀwÁ,ÐPSÔPWÑ0XÔ0X�˜\¨!œ_Ñ-Ý" 3¨Ñ5Ô5Ð5Ø$ Q R Rœy�Ø�ùØÐri   c                 ó¬   — | j         dv r| j        | j        gS | j         dk    rd„ | j        D ¦   «         S t	          d                     | ¦  «        ¦  «        ‚)z-
    Get arguments of an expression node
    )rU  r>  r  c                 ó   — g | ]}|‘ŒS ra   ra   rI  s     rg   rh   z!get_expr_args.<locals>.<listcomp>Õ  s   € Ð%Ð%Ð%�a�Ð%Ð%Ð%ri   zget arguments for expression {})r�  r  rD  r|   r«   rÈ   )r  s    rg   rY  rY  Î  sa   € ð „wÐ,Ð,Ð,Ø”˜$œ(Ð#Ð#Ø„w�&ÒÐØ%Ð%˜4œ9Ð%Ñ%Ô%Ð%Ý
Ð?×FÒFÀtÑLÔLÑ
MÔ
MÐMri   c                 óÎ  — | j         D ]Ü}|d         dk    rÎ|d         d         }t          t          |¦  «        ¦  «        D ]<}t          ||         t          j        ¦  «        rt          ||         ||¦  «        ||<   Œ=|d         d         }t          t          |¦  «        ¦  «        D ]<}t          ||         t          j        ¦  «        rt          ||         ||¦  «        ||<   Œ=ŒÝd S )Nr   ru  rˆ   )rª  rz   rŽ   r�   r	   r”  r)   )rŒ   ÚcallbackÚcbdatar°  Úleft_lengthsr“   Úright_lengthss          rg   Úvisit_parfor_pattern_varsrg  Ø  s  € à”?ð Nð NˆØ�1Œ:˜Ò"Ð"Ø" 1œ: aœ=ˆLÝ�3˜|Ñ,Ô,Ñ-Ô-ð Nð N�Ý˜l¨1œo­r¬vÑ6Ô6ð NÝ&6°|ÀA´Ø<DÀfñ'Nô 'N�L ‘Oøà# AœJ qœMˆMÝ�3˜}Ñ-Ô-Ñ.Ô.ð Nð N�Ý˜m¨AÔ.µ´Ñ7Ô7ð NÝ'7¸ÀaÔ8HØ<DÀfñ(Nô (N�M !Ñ$øøðNð Nri   c                 óÈ  — t           j        dk    r?t          d| ¦  «         t          dt          |                     ¦   «         ¦  «        ¦  «         | j        D ]Ë}t          |j        ||¦  «        |_        t          |j	        t          j        ¦  «        rt          |j	        ||¦  «        |_	        t          |j        t          j        ¦  «        rt          |j        ||¦  «        |_        t          |j        t          j        ¦  «        rt          |j        ||¦  «        |_        ŒÌt          d| j        i||¦  «         t!          | ||¦  «         t          | j        ||¦  «         d S )Nrˆ   zvisiting parfor vars for:zcbdata: r9  )r   rY  rc   rÍ  r¼  r¤  r)   r�  r�   r;  r	   r”  r4  r@  r(   r¥  rg  r¦  )rŒ   rc  rd  rn   s       rg   Úvisit_vars_parforri  ç  s7  € ÝÔ Ò"Ð"ÝÐ)¨6Ñ2Ô2Ð2Ýˆj�& §¢¡¤Ñ0Ô0Ñ1Ô1Ð1ØÔð @ð @ˆÝ+¨AÔ,<¸hÈÑOÔOˆÔÝ�a”g�rœvÑ&Ô&ð 	BÝ& q¤w°¸&ÑAÔAˆAŒGÝ�a”f�bœfÑ%Ô%ð 	@Ý% a¤f¨h¸Ñ?Ô?ˆAŒFÝ�a”f�bœfÑ%Ô%ð 	@Ý% a¤f¨h¸Ñ?Ô?ˆAŒFøÝ��FÔ%Ð&¨°&Ñ9Ô9Ð9Ý˜f h°Ñ7Ô7Ð7ÝˆvÔ ¨6Ñ2Ô2Ð2Ø
€Fri   c                 óx  — |€t          ¦   «         }|€t          ¦   «         }t          | ¦  «        }t          |¦  «        \  }}t          |¦  «        }t	          |                     ¦   «         ¦  «        }t          | ¦  «         |                     ¦   «         }|                     ¦   «         |         }	| 	                    ¦   «          
                    ¦   «         D ]}
|	|
j        z  }	Œ|D ]^}||	v r:|                     ||         |z
  ¦  «         |                     ||         ¦  «         Œ@|                     ||         |z
  ¦  «         Œ_d„ | j        D ¦   «         }|d„ | j        D ¦   «         z  }|d„ | j        D ¦   «         z  }|                     ||z
  ¦  «         |t          | ¦  «        z  }t          j        ||¬¦  «        S )zzlist variables written in this parfor by recursively
    calling compute_use_defs() on body and combining block defs.
    Nc                 ód   — h | ]-}t          |j        t          j        ¦  «        ¯!|j        j        ’Œ.S ra   ©r�   r;  r	   r”  rˆ  ©re   rn   s     rg   r  zparfor_defs.<locals>.<setcomp>"  óD   € ð ð ð Øµ:ØŒG•R”Vñ4ô 4ðØ	ŒŒðð ð ri   c                 ód   — h | ]-}t          |j        t          j        ¦  «        ¯!|j        j        ’Œ.S ra   ©r�   r4  r	   r”  rˆ  rm  s     rg   r  zparfor_defs.<locals>.<setcomp>%  óD   € ð ð ð Øµ*ØŒF•B”Fñ3ô 3ðØ	ŒŒðð ð ri   c                 ód   — h | ]-}t          |j        t          j        ¦  «        ¯!|j        j        ’Œ.S ra   ©r�   r@  r	   r”  rˆ  rm  s     rg   r  zparfor_defs.<locals>.<setcomp>(  rq  ri   )r  r  )rŸ  rÞ  rJ   rM   rÛ   r  rá  rG  Ú
dominatorsrö  r  r½  rV  r¤  Úget_parfor_pattern_varsr   Ú_use_defs_result)rŒ   Úuse_setÚdef_setr  ÚusesrO  r*  r  rG  Údefinitely_executedr¿  r
  Ú	loop_varss                rg   Úparfor_defsr|  ý  sï  € ð €Ý‘%”%ˆØ€Ý‘%”%ˆÝ Ñ'Ô'€FÝ! &Ñ)Ô)�J€Dˆ$Ý
! &Ñ
)Ô
)€CÝ�V—[’[‘]”]Ñ#Ô#€JÝ˜Ñ Ô Ð ð —’Ñ!Ô!€JàŸ.š.Ñ*Ô*¨:Ô6Ðà—	’	‘”×"Ò"Ñ$Ô$ð )ð )ˆØ˜tœyÑ(ÐÐØð 	2ð 	2ˆØÐ'Ð'Ð'ð
 �NŠN˜4 œ;¨Ñ0Ñ1Ô1Ð1Ø�NŠN˜4 œ;Ñ'Ô'Ð'Ð'à�NŠN˜4 œ;¨Ñ0Ñ1Ô1Ð1Ð1ðð Ø$Ô/ðñ ô €Ið ð ð Ø#Ô.ðñ ô ñ €Ið ð ð Ø#Ô.ðñ ô ñ €Ið ‡N‚N�9˜wÑ&Ñ'Ô'Ð'ØÕ& vÑ.Ô.Ñ.€GåÔ$¨G¸GÐDÑDÔDÐDri   c                 óž   — |t          | j        ¦  «        z  }t          | ¦  «        }|t          j        |¦  «        z  }t          | ¦  «         dS )zx
    Reduction variables for parfors and the reduction variables within
    nested parfors must be stack allocated.
    N)rŸ  r¬  rÞ  r   Úmust_use_allocará  )rŒ   Ú
alloca_setr  s      rg   Ú_parfor_use_allocar€  4  sN   € ð
 •#�f”nÑ%Ô%Ñ%€Jå Ñ'Ô'€FØ•(Ô*¨6Ñ2Ô2Ñ2€Jå˜Ñ Ô Ð Ð Ð ri   c                 óV  — t          | ¦  «        }t          |¦  «        }t          |¦  «        }t          |||j        |j        ¦  «        }t          ||||j        ¦  «        }d„ | j        D ¦   «         }|d„ | j        D ¦   «         z  }|d„ | j        D ¦   «         z  }|d„ | j        D ¦   «         z  }t          ¦   «         }| 	                    ¦   «         D ]v}	|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  }Œw G d„ dt          ¦  «        }
t          j         |
|¦  «        ¦  «        }|                     |j
        |j        ¦  «         t!          | ¦  «         ||z  S )z~insert dels in parfor. input: dead variable set right after parfor.
    returns the variables for which del was inserted.
    c                 ód   — h | ]-}t          |j        t          j        ¦  «        ¯!|j        j        ’Œ.S ra   rl  rm  s     rg   r  z%parfor_insert_dels.<locals>.<setcomp>O  rn  ri   c                 ód   — h | ]-}t          |j        t          j        ¦  «        ¯!|j        j        ’Œ.S ra   rp  rm  s     rg   r  z%parfor_insert_dels.<locals>.<setcomp>R  rq  ri   c                 ód   — h | ]-}t          |j        t          j        ¦  «        ¯!|j        j        ’Œ.S ra   rs  rm  s     rg   r  z%parfor_insert_dels.<locals>.<setcomp>U  rq  ri   c                 ó&   — h | ]}|j         j        ’ŒS ra   ©r�  rˆ  rm  s     rg   r  z%parfor_insert_dels.<locals>.<setcomp>X  s   € ÐCÐCÐC¨A�!Ô"Ô'ÐCÐCÐCri   c                   ó   — e Zd Zd„ ZdS )ú'parfor_insert_dels.<locals>.DummyFuncIRc                 ó   — || _         d S rq   )r  r  s     rg   rŽ  z0parfor_insert_dels.<locals>.DummyFuncIR.__init__i  s   € Ø ˆDŒKˆKˆKri   N)r~   r   r€   rŽ  ra   ri   rg   ÚDummyFuncIRrˆ  g  s#   € € € € € ð	!ð 	!ð 	!ð 	!ð 	!ri   rŠ  )rÞ  rM   rJ   rK   r  r  rL   r¤  rŸ  r  r8  ÚescapingÚobjectr   ÚPostProcessorÚ_patch_var_delsrá  )rŒ   Úcurr_dead_setr  r*  r+  r  Údead_mapr{  Údead_setr
  rŠ  Ú	post_procs               rg   Úparfor_insert_delsr“  D  s+  € õ   Ñ'Ô'€FÝ
! &Ñ
)Ô
)€CÝ˜vÑ&Ô&€GÝ  V¨W¬^¸W¼^ÑLÔL€HÝ   f¨h¸¼ÑGÔG€Hðð Ø$Ô/ðñ ô €Ið ð ð Ø#Ô.ðñ ô ñ €Ið ð ð Ø#Ô.ðñ ô ñ €Ið ÐCÐC°Ô1BÐCÑCÔCÑC€Iõ ‰uŒu€HØ—’‘”ð -ð -ˆàÔ˜%Ð Ð Ô  MÑ1Ð Ð Ñ ØÔ˜%Ð Ð Ô  IÑ-Ð Ð Ñ Ø�HÔ% eÔ,Ñ,ˆØÔ˜%Ð Ð Ô  MÑ1Ð Ð Ñ ØÔ˜%Ð Ð Ô  IÑ-Ð Ð Ñ Ø�HÔ% eÔ,Ñ,ˆˆð!ð !ð !ð !ð !•fñ !ô !ð !õ Ô& { {°6Ñ':Ô':Ñ;Ô;€IØ×Ò˜hÔ/°Ô1BÑCÔCÐCÝ˜Ñ Ô Ð à�iÑÐri   c           	      óÀ   — t          |¦  «        \  }}t          || j        || ¦  «        \  }}|                     ¦   «         D ]}d}	|	rt	          | |||||¦  «        }	|	°ŒdS )zm
    Reorder statements to maximize parfor fusion. Push all parfors up or down
    so they are adjacent.
    TN)r2   rG   Ú	arg_namesr  Úmaximize_fusion_inner)
rÝ  r  rÁ  r}  r   rÿ  Ú	alias_mapÚarg_aliasesrÐ  Úorder_changeds
             rg   r‚  r‚  u  s”   € õ
 # 6Ñ*Ô*�M€J�Ý3Ø!'Ø!(Ô!2Ø!(Ø!(ñ	ô Ñ€Iˆ{ð —’‘”ð 
ð 
ˆØˆØð 	Ý1Ø 'Ø %Ø *Ø )Ø +Ø ,ñô ˆMð ð 	øð
ð 
ri   c                 óH  — 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     °‚|S )NFr   rÿ   rˆ   T)rŽ   r½  Ú_can_reorder_stmts)rÝ  rÐ  r   r—  r˜  r}  r™  r“   r¾  rˆ  Úcan_reorders              rg   r–  r–  �  sâ   € à€MØ	€Að �c�%”*‰oŒo Ñ!Ò
!Ð
!ØŒz˜!Œ}ˆØ”J˜q ™s”Oˆ	ð (ðEÕ)¨$°	¸7Ø*4°iÀñNô Nð Nå-?À	È4Ø ¨Y¸ñ.Eô .Eð 	ð ð 	!Ø%ˆEŒJ�q‰MØ"ˆEŒJ�q˜‘s‰OØ ˆMØ	ˆQ‰ˆð �c�%”*‰oŒo Ñ!Ò
!Ð
!ð Ðri   c                 óÆ   — t          ¦   «         }| D ]O}||v r|                     ||         ¦  «        }||v r|                     |¦  «        }|                     |¦  «         ŒP|S rq   )rŸ  r  r  )Úthe_setr—  r˜  Úretr“   s        rg   Úexpand_aliasesr   ¡  sj   € Ý
‰%Œ%€CØð ð ˆØ�	ˆ>ˆ>Ø—)’)˜I aœLÑ)Ô)ˆCØ�ÐÐØ—)’)˜KÑ(Ô(ˆCØ�Š�‰
Œ
ˆ
ˆ
Ø€Jri   c                 óª  — t          | t          ¦  «        �r<t          |t          ¦  «        �s&t          |t          j        ¦  «        �st          |t          j        ¦  «        r=t          |j        t          ¦   «         |¦  «        st          t          ||j        ¦  «        r´t          d„ |                      ¦   «         D ¦   «         ||¦  «        }t          t          | ¦  «        ||¦  «        }t          d„ |                     ¦   «         D ¦   «         ||¦  «        }t          t          |¦  «        ||¦  «        }	t          ||z  |	|z  z  ¦  «        dk    rdS dS )zw
    Check dependencies to determine if a parfor can be reordered in the IR block
    with a non-parfor statement.
    c                 ó   — h | ]	}|j         ’Œ
S ra   r  rI  s     rg   r  z%_can_reorder_stmts.<locals>.<setcomp>»  s   € Ð'IÐ'IÐ'I°1¨¬Ð'IÐ'IÐ'Iri   c                 ó   — h | ]	}|j         ’Œ
S ra   r  rI  s     rg   r  z%_can_reorder_stmts.<locals>.<setcomp>¿  s   € Ð'NÐ'NÐ'N°1¨¬Ð'NÐ'NÐ'Nri   r   TF)r�   r™  r	   r•  r
  r5   r  rŸ  r:   Úis_assert_equivr   r–  Úget_parfor_writesr0   rŽ   )
r¾  rˆ  rÝ  r   r—  r˜  Ústmt_accessesÚstmt_writesÚnext_accessesÚnext_writess
             rg   r›  r›  «  s]  € õ 	�4�Ñ Ô ñ Ý˜9¥fÑ-Ô-ñå˜9¥b¤hÑ/Ô/ñõ ˜I¥r¤yÑ1Ô1ðõ " )¤/µ3±5´5¸*ÑEÔEð	õ
 •_ g¨y¬Ñ?Ô?ðõ 'Ð'IÐ'I¸¿ºÑ8HÔ8HÐ'IÑ'IÔ'IØ'0°+ñ?ô ?ˆå$Õ%6°tÑ%<Ô%<Ø%.°ñ=ô =ˆå&Ð'NÐ'N¸	×8KÒ8KÑ8MÔ8MÐ'NÑ'NÔ'NØ'0°+ñ?ô ?ˆå$¥_°YÑ%?Ô%?Ø%.°ñ=ô =ˆå�˜mÑ+Ø Ñ.ñ0ñ 1ô 1Ø45ò6ð 6à�4Øˆ5ri   c                 ó4   — t          | |¦  «        \  }}|dk    S )NrW   )r8   )rÝ  r  rj  rÄ  s       rg   r¤  r¤  È  s!   € Ý'¨°Ñ6Ô6Ñ€IˆxØ˜Ò&Ð&ri   c                 óŠ  — t          | t          ¦  «        sJ ‚t          ¦   «         }| j                             ¦   «         }| j        |d<   |                     ¦   «         D ]e}|j        D ][}|                     t          |¦  «        ¦  «         t          |t          ¦  «        r"|                     t          |¦  «        ¦  «         Œ\Œf|S ró  )r�   r™  rŸ  r¦  r  r¥  r  r½  rV  r0   r¥  )rŒ   Úwritesr  rÐ  r¾  s        rg   r¥  r¥  Í  s½   € Ý�f�fÑ%Ô%Ð%Ð%Ð%Ý‰UŒU€FØÔ×"Ò"Ñ$Ô$€FØÔ"€Fˆ2�JØ—’‘”ð 7ð 7ˆØ”Jð 	7ð 	7ˆDØ�MŠM�/¨$Ñ/Ô/Ñ0Ô0Ð0Ý˜$¥Ñ'Ô'ð 7Ø—’Õ/°Ñ5Ô5Ñ6Ô6Ð6øð	7ð €Mri   ÚFusionReport)ÚfirstÚsecondÚmessagec           
      ó¸  ‡ ‡‡‡— t          d|d|¦  «         d}|j        |j        k    r0t          d¦  «         d}t          |j        |j        |¦  «        }d|fS t	          |j        ¦  «        t	          |j        ¦  «        k    rst          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	        ¦  «        s¨t          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|r?t          d¦  «         d}t          |j        |j        ||j        |j        fz  ¦  «        }d|fS t          |j        ¦  «        }t!          ¦   «         }|j                             ¦   «         D ]}||z  }Œ|t'          |¦  «        z  }|t!          |j        ¦  «        z  }t          |j        ¦  «        }t          d|j        i¦  «        j        d         }|j                             ¦   «         D ]}||z  }Œ|                     |¦  «        }t	          |¦  «        dk    r¥t1          |j                             ¦   «         |j        j        |                     ¦   «         |¦  «        \  }Šˆˆfd„|D ¦   «         }t9          |¦  «        r?t          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 
ra  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                 ó<   •— | |k    p‰                      | |¦  «        S rq   )Úis_equiv)rm   rf   r©  s     €rg   r³  ztry_fuse.<locals>.is_equiv÷  s"   ø€ Ø�AŠvÐ1˜×+Ò+¨A¨qÑ1Ô1Ð1ri   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	   r”  rˆ  )r   Úuser_varnamer2  s     €rg   Úget_user_varnamez"try_fuse.<locals>.get_user_varnameú  sY   ø€ å˜!�RœVÑ$Ô$ð 	ØˆHØŒFˆØ˜xÐ'Ð'¨A°Ð:JÔ1KÐ,KÐ,KØ#Ð$4Ô5°aÔ8ˆLØÐØˆri   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   ób   •K  — | ])}t          ‰|         t          j        ¦  «         p|‰v V — Œ*d S rq   )r�   r   rŠ  )re   rm   Úp2arraynotindexedrÁ  s     €€rg   rF  ztry_fuse.<locals>.<genexpr>=  sC   øè è € ÐsÐsÐfg�* W¨Q¤ZµÔ1FÑGÔGÐGÐaÈ1ÐPaÐKaÐsÐsÐsÐsÐsÐsri   z)try_fuse: parfor2 depends on parfor1 bodyzT- fusion failed: parallel loop %s has a dependency on the body of parallel loop %s. )Údprintr®  r­  r£  rŽ   r¤  rz   r;  r4  r@  r?   r  r  Úhas_cross_iter_deprJ   r¦  rŸ  r  r  r¥  r¬  r¥  r  r&  r  r§  rˆ  rº  rU  Úfuse_parfors_inner) r©  Úparfor1Úparfor2r2  rÝ  rÁ  rÎ  r×  r±  rÏ  rÐ  r   r³  r·  r“   Únest1Únest2Úp1_cross_depÚp1_ipÚp1_iaÚ	p1_non_iaÚp2_cross_depÚp1_body_usedefsÚp1_body_defsrO  Ú
p2_usedefsÚp2_usesry  Úoverlaprÿ  Ú
unsafe_varr¹  s    `  ` `                         @rg   r…  r…  Û  s  øøøø€ õ Ð(¨'°4¸ÑAÔAÐAð €Fð „˜'œ/Ò)Ð)ÝÐ5Ñ6Ô6Ð6Ø1ˆÝ˜gœj¨'¬*°cÑ:Ô:ˆØ�Vˆ|Ðõ ˆ7ÔÑÔ¥# gÔ&8Ñ"9Ô"9Ò9Ð9ÝÐ@ÑAÔAÐAØDˆØ8ˆØ�G”J¥ GÔ$6Ñ 7Ô 7Ð8Ñ8ˆØ�G”J¥ GÔ$6Ñ 7Ô 7Ð8Ñ8ˆÝ˜gœj¨'¬*°c¸RÀ¸H±nÑEÔEˆØ�Vˆ|Ðå�Ô"Ñ#Ô#€Eð2ð 2ð 2ð 2ð 2ðð ð ð ð õ �5‰\Œ\ð  ñ  ˆØÔ" 1Ô%ˆØÔ" 1Ô%ˆØ�˜œ e¤kÑ2Ô2ð 
	 Ø�˜œ U¤ZÑ0Ô0ð
	 à�˜œ U¤ZÑ0Ô0ð
	 õ ÐDÀaÑHÔHÐHØKˆCØˆCÐ.>Ð.>¸u¼{Ñ.KÔ.KÐ.KÐ.KØ Ð  ¤Ñ,Ô,Ð,Ð,Ð.>Ð.>¸u¼zÑ.JÔ.JÐ.JÐ.JðLñ LˆCàˆCÐ*:Ð*:¸5¼;Ñ*GÔ*GÐ*GÐ*GØ Ð  ¤Ñ,Ô,Ð,Ð,Ð.>Ð.>¸u¼zÑ.JÔ.JÐ.JÐ.JðLñ LˆCå! '¤*¨g¬j¸#À¹'ÑBÔBˆFØ˜�<ÐÐÐñ
	 õ -¨W¬^Ñ<Ô<€GÔÝ,>¸wÈÐQXÑ,YÔ,YÑ)€L�%˜ 	Øð Ý)¨'°7¸GÀUÈEÐS\Ñ]Ô]Ð^_Ô`ˆˆàˆàð �|ð ÝÐBÑCÔCÐCð,ˆå˜gœj¨'¬*Ø # w¤z°7´:Ð&>Ñ >ñ@ô @ˆà�Vˆ|Ðõ
 ' wÔ'8Ñ9Ô9€OÝ‘5”5€LØÔ&×-Ò-Ñ/Ô/ð ð ˆØ˜ÑˆˆØÕ% gÑ.Ô.Ñ.€Lð •C˜œÑ(Ô(Ñ(€Lå! 'Ô"3Ñ4Ô4€JÝ  7Ô#5Ð6Ñ7Ô7Ô>¸qÔA€GØÔ!×(Ò(Ñ*Ô*ð ð ˆØ�4‰ˆˆà×'Ò'¨Ñ0Ô0€Gå
ˆ7�|„|�qÒÐåBØÔ×$Ò$Ñ&Ô&ØÔÔ"Ø×&Ò&Ñ(Ô(Øñ	 ô  ÑˆÐð tÐsÐsÐsÐsÐkrÐsÑsÔsˆ
åˆz‰?Œ?ð 	 ÝÐ>Ñ?Ô?Ð?ð1ˆCå! '¤*¨g¬jØ$'¨7¬:°w´zÐ*BÑ$BñDô DˆFà˜�<Ðå˜g wÑ/Ô/Ð/ri   c                 ó  — | j         j                             |j         j        ¦  «         t          |j                             ¦   «         ¦  «        }|j        |         j        }t          | j                             ¦   «         ¦  «        }t          | j                             ¦   «         ¦  «        }| j        |         j                             |¦  «         | j                             |j        ¦  «         | j                             |¦  «         t          | j
        ¦  «        }|j        j        | j        i}t          |¦  «        D ],}| j
        |         j        ||j
        |         j        j        <   Œ-t          | j        |¦  «         t!          | |¬¦  «        }	t#          |	¦  «        }	t%          | |	¦  «         t'          d„ |                     ¦   «         D ¦   «         ¦  «        }
t+          | j        |
¦  «         | j                             |j        ¦  «         t.          j        r-t3          d                     |j        | j        ¦  «        ¦  «         d}|                     |j        | j        ¦  «        }t9          | j        |j        |¦  «        }| |fS )N)Úentry_labelc              3   ó$   K  — | ]}|j         V — Œd S rq   r  r¹  s     rg   rF  z%fuse_parfors_inner.<locals>.<genexpr>g  s$   è è € Ð6Ð6˜Q�!”&Ð6Ð6Ð6Ð6Ð6Ð6ri   z1Parallel for-loop #{} is fused into for-loop #{}.zE- fusion succeeded: parallel for-loop #{} is fused into for-loop #{}.)r¥  r½  r3  r–   r¦  r  rÛ   rV  r	  rŽ   r¤  r§  rˆ  rz   r�  r&   rÞ  r1   rá  rŸ  r  Úremove_duplicate_definitionsrª  r   r¯  rc   rÈ   r£  r­  )r½  r¾  Úparfor2_first_labelÚparfor2_first_blockÚparfor1_first_labelÚparfor1_last_labelr   Ú
index_dictr“   r  Únamesetr×  rÎ  s                rg   r¼  r¼  J  s\  € ð ÔÔ×"Ò" 7Ô#5Ô#:Ñ;Ô;Ð;õ ˜gÔ/×4Ò4Ñ6Ô6Ñ7Ô7ÐØ!Ô+Ð,?Ô@ÔEÐÝ˜gÔ/×4Ò4Ñ6Ô6Ñ7Ô7ÐÝ˜WÔ.×3Ò3Ñ5Ô5Ñ6Ô6ÐØÔÐ(Ô)Ô.×5Ò5Ð6IÑJÔJÐJð Ô×Ò˜WÔ.Ñ/Ô/Ð/ØÔ×ÒÐ-Ñ.Ô.Ð.õ �Ô"Ñ#Ô#€EØÔ#Ô(¨'Ô*;Ð<€JÝ�5‰\Œ\ð ð ˆØ@GÔ@RØôAÜð 	�7Ô% aÔ(Ô7Ô<Ñ=Ð=å�Ô" JÑ/Ô/Ð/õ   Ð5HÐIÑIÔI€FÝ˜6Ñ"Ô"€FÝ˜ &Ñ)Ô)Ð)åÐ6Ð6 *×"3Ò"3Ñ"5Ô"5Ð6Ñ6Ô6Ñ6Ô6€GÝ  Ô!2°GÑ<Ô<Ð<ØÔ×Ò˜GÔ,Ñ-Ô-Ð-ÝÔ#ð 'ÝÐA×HÒHØŒj˜'œ*ñ&ô &ñ 	'ô 	'ð 	'ð R€CØ
�*Š*�W”Z ¤Ñ
,Ô
,€CÝ˜'œ* g¤j°#Ñ6Ô6€Fà�Fˆ?Ðri   c                 ó2  — |                       ¦   «         D ]�\  }}|j        }g }t          ¦   «         }|D ][}t          |t          j        ¦  «        r*|j        j        }||v r||v rŒ1|                     |¦  «         | 	                    |¦  «         Œ\||_        Œ‚dS )zsRemove duplicated definition for variables in the given nameset, which
    is often a result of parfor fusion.
    N)
r¼  r½  rŸ  r�   r	   r
  r  rˆ  r  r“  )	r  rÕ  r
  rÐ  r½  rH  Údefinedr  rˆ  s	            rg   rÏ  rÏ  u  s«   € ð Ÿš™œð ð ‰ˆˆuØŒzˆØˆÝ‘%”%ˆØð 	"ð 	"ˆDÝ˜$¥¤	Ñ*Ô*ð &Ø”{Ô'�Ø˜7�?�?Ø˜w��Ø Ø—K’K Ñ%Ô%Ð%Ø�OŠO˜DÑ!Ô!Ð!Ð!ØˆŒ
ˆ
Ø
€Fri   c           
      ód  ‡‡‡‡— d„ | j         D ¦   «         Št          ¦   «         }|€i }|€t          ¦   «         }|€t          ¦   «         }d„ Šˆˆˆˆfd„}| j                             ¦   «         D �]>}|j        D �]2}	t          |	t          j        t          j        f¦  «        rYt          ‰|	j	        j
                 t          j        j        ¦  «        r) ||	j        |	j	        j
        ||||¦  «        r
d|||fc c S Œ‚t          |	t          j        ¦  «        �r•t          |	j        t          j        ¦  «        r/|	j        j
        ‰v r ‰                     |	j	        j
        ¦  «         ŒêŒët          |	j        t          j        ¦  «        �r'|	j        j        }
|
dv rit          ‰|	j        j        j
                 t          j        j        ¦  «        r3 ||	j        j        |	j        j        j
        ||||¦  «        r
d|||fc c S �Œ„|
dk    r<t+          ˆfd„|	j                             ¦   «         D ¦   «         ¦  «        r
d|||fc c S d„ |	j                             ¦   «         D ¦   «         }‰                     |¦  «        r|                     |¦  «        s|                     |	j	        j
        ¦  «         �Œ4�Œ@d	|||fS )
Nc                 ó&   — h | ]}|j         j        ’ŒS ra   r†  rm  s     rg   r  z%has_cross_iter_dep.<locals>.<setcomp>�  s   € Ð@Ð@Ð@¨ˆqÔÔ$Ð@Ð@Ð@ri   c                 ó  — t          | t          ¦  «        rt          | ¦  «        } d| vr||v rdS |                     |¦  «         dS ||v rdS |                     |¦  «         t	          | ¦  «        }||vr| ||<   dS ||         | k    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         rg   Úadd_check_positionz.has_cross_iter_dep.<locals>.add_check_position¿  s¿   € õ �l¥DÑ)Ô)ð 	/Ý  Ñ.Ô.ˆLð �|Ð#Ð#ð  Ð/Ð/Ø�tð #×&Ò& ~Ñ6Ô6Ð6Ø�uð
 Ð/Ð/Ð/Ø�4à×Ò˜>Ñ*Ô*Ð*å�\Ñ"Ô"ˆà˜Ð(Ð(ð '3ˆO˜FÑ#Ø�5ð ˜vÔ&¨,Ò6Ð6ri   c                 ó   •‡— t          | t          j        ¦  «        r±t          ‰| j                 t          j        ¦  «        rZt          t          ‰| ¦  «        }|�@|\  }}t          ˆˆfd„|D ¦   «         ¦  «        rˆfd„|D ¦   «         }	 ‰
|	||||¦  «        S dS dS | j        ‰v r ‰
d||||¦  «        S | j        ‰v rdS  ‰
d||||¦  «        S dS )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.
        Nc                 ó4   •— g | ]}|j         ‰v p|j         ‰v‘ŒS ra   r  )re   rm   Úderived_from_indicesr	  s     €€rg   rh   z;has_cross_iter_dep.<locals>.check_index.<locals>.<listcomp>  sF   ø€ ð Mð Mð MØ?@ð œV wÐ.ð ;ØœÐ&:Ð:ðMð Mð Mri   c                 ó"   •— g | ]}|j         ‰v ‘ŒS ra   r  )re   rm   r	  s     €rg   rh   z;has_cross_iter_dep.<locals>.check_index.<locals>.<listcomp>  s    ø€ Ð.RÐ.RÐ.RÀQ¨q¬v¸Ð/@Ð.RÐ.RÐ.Rri   TrV  ©F)r�   r	   r”  rˆ  r   rÓ  r:   r9   Úallr   ÚInternalError)Ú
stmt_indexrÜ  rÝ  rÞ  rß  rä  Úfbs_resÚind_seqrÿ  Únew_index_positionsrá  rÝ  r	  rÁ  s        `    €€€€rg   Úcheck_indexz'has_cross_iter_dep.<locals>.check_indexñ  sq  øø€ õ �j¥"¤&Ñ)Ô)ð 4	å˜' *¤/Ô2µE´OÑDÔDð /BåÕ 3°W¸jÑIÔI�ØÐ&Ø!(‘J�G˜Qõ ð Mð Mð Mð Mð MØDKðMñ Mô Mñ Nô Nð $ð /SÐ.RÐ.RÐ.RÈ'Ð.RÑ.RÔ.RÐ+ð  2Ð1Ð2EØ2@Ø2AØ2@Ø2Dñ	 Fô  Fð Fð  $˜tð  ˜4ð ”? gÐ-Ð-ð .Ð-¨gØ.<Ø.=Ø.<Ø.@ñ	Bô Bð Bð
  ”_Ð(<Ð<Ð<ð  ˜4ð
 .Ð-¨hØ.<Ø.=Ø.<Ø.@ñ	Bô Bð Bð �4ri   Tr  r  c                 ód   •— g | ],}t          ‰|j                 t          j        j        ¦  «        ‘Œ-S ra   )r�   rˆ  r   r   r  )re   rm   rÁ  s     €rg   rh   z&has_cross_iter_dep.<locals>.<listcomp>a  s>   ø€ ð !=ð !=ð !=Ø !õ ",¨G°A´F¬O½U¼^Ô=QÑ!RÔ!Rð !=ð !=ð !=ri   c                 ó   — g | ]	}|j         ‘Œ
S ra   r  r¹  s     rg   rh   z&has_cross_iter_dep.<locals>.<listcomp>f  s   € ÐGÐGÐG¨1 ¤ÐGÐGÐGri   F)r¤  rŸ  r¦  r  r½  r�   r	   rW  r|  r  rˆ  r   r   r  rä   r
  r  r”  r  r  r�  rU  r–  Ú
isdisjoint)rŒ   rÝ  rÁ  rÝ  rÞ  rß  rä  rí  rñ   r¾  r�  Úrhs_varsrá  r	  s    ``         @@rg   r»  r»  ‰  s]  øøøø€ ð( AÐ@¨fÔ.?Ð@Ñ@Ô@€Gõ
 ™5œ5Ðð, ÐØˆØÐÝ™œˆØÐ!Ý ™UœUÐð07ð 07ð 07ðdDJð DJð DJð DJð DJð DJð DJð DJðN Ô×$Ò$Ñ&Ô&ð 6Cñ 6CˆØ”Fð 5	Cñ 5	CˆDå˜$¥¤­RÔ-=Ð >Ñ?Ô?ð 3CÝ˜g d¤kÔ&6Ô7½¼Ô9MÑNÔNð Yà"�{ 4¤:Ø#'¤;Ô#3Ø#2Ø#1Ø#5Ø#7ñ9ô 9ð Yð  $ _°nÐFXÐXÐXÐXÐXÐXÐXàÝ˜D¥"¤)Ñ,Ô,ñ 'Cõ ˜dœj­"¬&Ñ1Ô1ð $CØ”z”¨'Ð1Ð1ØŸš D¤KÔ$4Ñ5Ô5Ð5Ø ð 2õ   ¤
­B¬GÑ4Ô4ñ  CØœœ�BàÐ:Ð:Ð:Ý% g¨d¬jÔ.>Ô.CÔ&DÅeÄnÔFZÑ[Ô[ð aà*˜{¨4¬:Ô+;Ø+/¬:Ô+;Ô+@Ø+:Ø+9Ø+=Ø+?ñ Aô  Að að (,¨_¸nÐN`Ð'`Ð `Ð `Ð `Ð `Ð `á Ø˜vš˜õ  ð !=ð !=ð !=ð !=Ø%)¤Z×%9Ò%9Ñ%;Ô%;ð!=ñ !=ô !=ñ >ô >ð ]à#'¨¸.ÐJ\Ð#\Ð\Ð\Ð\Ð\Ð\ð  HÐG°´
×0DÒ0DÑ0FÔ0FÐGÑGÔG�Hð $×.Ò.¨xÑ8Ô8ð CØ0×;Ò;¸HÑEÔEðCà,×0Ò0°´Ô1AÑBÔBÐBùñk5	Cðn �/ >Ð3EÐEÐEri   c                  ó<   — t           j        dk    rt          | Ž  d S d S r:  )r   rY  rc   )ró   s    rg   rº  rº  s  s%   € ÝÔ Ò"Ð"Ýˆqˆ	ˆ	ˆ	ˆ	ð #Ð"ri   c                 óþ   — t          ¦   «         }| j        D ]f}|d         dk    rX|d         d         }|d         d         }||z   D ]6}t          |t          j        ¦  «        r|                     |j        ¦  «         Œ7Œg|S )z: get the variables used in parfor pattern information
    r   ru  rˆ   )rŸ  rª  r�   r	   r”  r  rˆ  )rŒ   Úoutr°  re  rf  r   s         rg   ru  ru  w  s‡   € õ ‰%Œ%€Cà”?ð $ð $ˆØ�1Œ:˜Ò"Ð"Ø" 1œ: aœ=ˆLØ# AœJ qœMˆMØ! -Ñ/ð $ð $�Ý˜a¥¤Ñ(Ô(ð $Ø—G’G˜AœF‘O”O�OøøØ€Jri   c                 ó*	  — t          | j        ¦  «        5  t          | j        ¦  «        }ddd¦  «         n# 1 swxY w Y   |d         }i }	t          | j        |         j        | j        ||	|¦  «         t          |	                     ¦   «         ¦  «        }
|D ]Ò}||k    rŒ	| j        |         j        D ]¶}t          |t          j
        ¦  «        rOt          |j        t          j        ¦  «        r0|j        j        dk    r |j        j        j        | j        j        k    rŒkt          d„ |                     ¦   «         D ¦   «         ¦  «        }||
z  }|D ]}|	                     |d¦  «         ŒŒ·ŒÓ|D ]G}||k    rŒ	| j        |         }|	                     ¦   «         }t          |j        | j        |||¦  «         ŒH| j                             ¦   «         }t'          |                     ¦   «         ¦  «        }t)          |||¦  «        \  }}t          j        |t          j        dd¦  «        ¦  «        }||         j                             |¦  «         t1          |¦  «        }t3          |¦  «        }t5          |||j        |j        ¦  «        }t          |                     ¦   «         ¦  «        }|                     ¦   «         D �]3\  }}g }d„ |j                             ¦   «         D ¦   «         }|                     |¦  «        D ]\  }}|||         z  }ŒtA          |j        ¦  «        D ]²}||z  } | D ]}!|||!         z  }Œt          |t          j!        t          j"        f¦  «        r?tG          |¦  «        j        | j        j        k    r|j$        j        |vr|j$        j        |vrŒ||d„ |                     ¦   «         D ¦   «         z  }|                     |¦  «         Œ³| %                    ¦   «          ||_        �Œ5|                     |j        ¦  «         ||         j                             ¦   «          	 tM          | |||||¦  «         tO          | j(        j        ¦  «        dk    }"| j         )                    ¦   «         D ]}|"tO          |j        ¦  «        dk    z  }"Œ|"rdS | S )	z7 remove dead code inside parfor including get/sets
    Nr   rT  c              3   ó$   K  — | ]}|j         V — Œd S rq   r  rI  s     rg   rF  z%remove_dead_parfor.<locals>.<genexpr>£  s$   è è € Ð<Ð< a˜1œ6Ð<Ð<Ð<Ð<Ð<Ð<ri   Úparfors_dummyr9  c                 ó   — h | ]	}|j         ’Œ
S ra   r  rI  s     rg   r  z%remove_dead_parfor.<locals>.<setcomp>Â  s   € ÐAÐAÐA˜q�A”FÐAÐAÐAri   c                 ó   — h | ]	}|j         ’Œ
S ra   r  rI  s     rg   r  z%remove_dead_parfor.<locals>.<setcomp>Ð  s   € Ð:Ð:Ð: A˜œÐ:Ð:Ð:ri   )*r^  r¦  r/   Ú_update_parfor_get_setitemsr½  r§  rŸ  r  r�   r	   r
  r  r  r�  rä   rˆ  r–  r	  r  rÛ   Ú_add_liveness_return_blockr�  ÚLocr“  rM   rJ   rK   r  r  r¼  Ú
terminatorÚ
successorsrN  r|  rW  rr  r  rL  Úremove_dead_parfor_recursiverŽ   r¥  r  )#rŒ   ÚlivesÚlives_n_aliasesr˜  r—  rÝ  rÁ  r?  rc  Úfirst_block_saved_valuesÚ
saved_arrsrn   r¾  ÚvarnamesÚrm_arrsrð   rÐ  Úsaved_valuesr  r  Úreturn_labelr¡  Újumpr*  r+  r  Ú	alias_setr
  rH  Úin_livesÚout_blkÚ_dataÚalias_livesr   Úis_emptys#                                      rg   Úremove_dead_parforr  …  s  € õ 
# 6Ô#3Ñ	4Ô	4ð 3ð 3Ý  Ô!1Ñ2Ô2ˆð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3ð ˜”)€KØ!ÐÝØÔ˜Ô%Ô*ØÔ˜)Ø Øñ	
ô 
ð 
õ Ð-×2Ò2Ñ4Ô4Ñ5Ô5€JØð 6ð 6ˆØ�ÒÐØØÔ$ QÔ'Ô,ð 	6ð 	6ˆDÝ˜4¥¤Ñ+Ô+ð µ
¸4¼:ÅrÄwÑ0OÔ0Oð Øœ
œ¨Ò2Ð2Øœ
Ô(Ô-°Ô1AÔ1FÒFÐFØÝÐ<Ð<¨4¯>ª>Ñ+;Ô+;Ð<Ñ<Ô<Ñ<Ô<ˆHØ Ñ+ˆGØð 6ð 6�Ø(×,Ò,¨Q°Ñ5Ô5Ð5Ð5ð6ð	6ð ð Gð GˆØ�ÒÐØØÔ  Ô#ˆØ/×4Ò4Ñ6Ô6ˆÝ# E¤J°Ô0@À)Ø(4°oñ	Gô 	Gð 	Gð 	Gð
 Ô×"Ò"Ñ$Ô$€FÝ�V—[’[‘]”]Ñ#Ô#€JÝ8¸ÀÐRYÑZÔZÑ€L�)åŒ7�<¥¤¨¸Ñ!<Ô!<Ñ=Ô=€DØ
ˆ:ÔÔ×"Ò" 4Ñ(Ô(Ð(Ý
! &Ñ
)Ô
)€CÝ˜vÑ&Ô&€GÝ  V¨W¬^¸W¼^ÑLÔL€HÝ�I—N’NÑ$Ô$Ñ%Ô%€IàŸš™œð ñ ‰ˆˆuØˆØAÐA EÔ$4×$>Ò$>Ñ$@Ô$@ÐAÑAÔAˆà!Ÿnšn¨UÑ3Ô3ð 	*ð 	*‰NˆG�UØ˜ Ô)Ñ)ˆHˆHÝ˜UœZÑ(Ô(ð 	"ð 	"ˆDà" YÑ.ˆKØ ð )ð )�Ø˜I aœLÑ(��Ý˜4¥"Ô"2µB´JÐ!?Ñ@Ô@ð Ý˜dÑ#Ô#Ô(¨FÔ,<Ô,AÒAÐAØ”Ô ¨Ð0Ð0Ø”Ô ¨Ð3Ð3ØØÐ:Ð:¨¯ªÑ)9Ô)9Ð:Ñ:Ô:Ñ:ˆHØ�OŠO˜DÑ!Ô!Ð!Ð!Ø×ÒÑÔÐØˆŒ
‰
à‡K‚K�	”ÑÔÐØ
ˆ:ÔÔ×ÒÑ!Ô!Ð!ðõ !Ø��{ I¨w¸ñAô Að Aõ �6Ô$Ô)Ñ*Ô*¨aÒ/€HØÔ!×(Ò(Ñ*Ô*ð )ð )ˆØ•C˜œ
‘O”O qÒ(Ñ(ˆˆØð ØˆtØ€Ms   •6¶:½:c                 ój  — | D �]®}t          |t          j        t          j        f¦  «        ryt	          |¦  «        j        |j        k    r\|j        j        |vrN|                     |j        j        g ¦  «        D ]}|                     |d¦  «         Œ|j	        ||j        j        <   Œ¢t          |t          j
        ¦  «        rŒt          |j	        t          j        ¦  «        rm|j	        }|j        dk    r[t          |j        t          j        ¦  «        r<|j        j        |j        k    r'|                     |j	        j        |¦  «        |_	        �ŒH|                     ¦   «         D ]Q}|                     |j        d¦  «         |                     |j        g ¦  «        D ]}|                     |d¦  «         ŒŒR�Œ°dS )zS
    replace getitems of a previously set array in a block of parfor loop body
    NrT  )r�   r	   r|  rW  rr  rˆ  r  rÒ  r	  r  r
  r  r�  rä   r”  r–  )	Ú
block_bodyr§  r—  r  r   r¾  ÚwrD  r   s	            rg   rú  rú  ë  s£  € ð
 ð *ñ *ˆÝ�t�bÔ.µ´
Ð;Ñ<Ô<ð 		Ý˜$ÑÔÔ$¨	¬Ò6Ð6ØŒKÔ EÐ)Ð)à—]’] 4¤;Ô#3°RÑ8Ô8ð *ð *�Ø× Ò   DÑ)Ô)Ð)Ð)ð .2¬ZˆL˜œÔ)Ñ*ØÝ�d�BœIÑ&Ô&ð 	­:°d´jÅ"Ä'Ñ+JÔ+Jð 	Ø”*ˆCØŒv˜Ò"Ð"¥z°#´)½R¼VÑ'DÔ'DÐ"Ø”9”> Y¤^Ò3Ð3à!-×!1Ò!1°#´)´.À#Ñ!FÔ!F�D”JÙð —’Ñ!Ô!ð 	*ð 	*ˆAØ×Ò˜QœV TÑ*Ô*Ð*à—]’] 1¤6¨2Ñ.Ô.ð *ð *�Ø× Ò   DÑ)Ô)Ð)Ð)ð*ñ	*ð €Fri   c           	      ó°  — | j                              ¦   «         }t          |                     ¦   «         ¦  «        }|dk    sJ ‚t	          |                     ¦   «         ¦  «        }	 t          |||¦  «        \  }	}
||         j        }t          j        |t          d¦  «        t          j
        dd¦  «        ¦  «        }t          j        ||j        <   t          j        |||	t          j
        dd¦  «        ¦  «        }||         j                             |¦  «         | j        |d<   |d         j                             t          j        |t          j
        dd¦  «        ¦  «        ¦  «         t'          ||||||¦  «         |                     |
j        ¦  «         |d         j                             ¦   «          ||         j                             ¦   «          dS )zIcreate a dummy function from parfor and call remove dead recursively
    r   z$branchcondr÷  r9  N)r¦  r  r–   r  rÛ   rû  r  r	   r”  r    rü  r   Úbooleanrˆ  rŒ  r½  r“  r¥  r�  r*   r	  )rŒ   r   r˜  r—  rÝ  rÁ  r  r=  r  r  r¡  r  Ú
branchcondÚbranchs                 rg   rÿ  rÿ    s›  € ð Ô×"Ò"Ñ$Ô$€FÝ˜6Ÿ;š;™=œ=Ñ)Ô)ÐØ˜aÒÐÐÐÝ�V—[’[‘]”]Ñ#Ô#€Jð
õ 9¸ÀÈÑPÔPÑ€L�)ð �:ÔÔ$€Eå”˜�}¨]Ñ;Ô;½R¼VÀOÐUWÑ=XÔ=XÑYÔY€JÝ$œ}€GˆJŒOÑåŒY�zÐ#3°\Å2Ä6È/Ð[]ÑC^ÔC^Ñ_Ô_€FØ
ˆ:ÔÔ×"Ò" 6Ñ*Ô*Ð*ð Ô!€Fˆ1�IØ
ˆ1„I„N×Ò�"œ'Ð"2µB´F¸?ÈBÑ4OÔ4OÑPÔPÑQÔQÐQõ �˜ W¨g°yÀ+ÑNÔNÐNØ‡K‚K�	”ÑÔÐØ
ˆ1„I„N×ÒÑÔÐØ
ˆ:ÔÔ×ÒÑ!Ô!Ð!Ø
€Fri   c                 ó”  ‡‡	— t          |                      ¦   «         ¦  «        }|dz   }| |         j        Š| |         j        Š	t	          j        ‰	‰¦  «        | |<   t	          j        ‰	t          d¦  «        ‰¦  «        }t          j	         
                    t          j        d¦  «        ||j        <   ˆˆ	fd„|D ¦   «         }t          j                             |‰¦  «        }| |         j                             t	          j        ||‰¦  «        ¦  «         | |         j                             t	          j        |‰¦  «        ¦  «         ||fS )Nrˆ   z
$tuple_varrÿ   c                 ó<   •— g | ]}t          j        ‰|‰¦  «        ‘ŒS ra   )r	   r”  )re   r   rž  r  s     €€rg   rh   z._add_liveness_return_block.<locals>.<listcomp>F  s'   ø€ Ð6Ð6Ð6¨1•”˜˜q #Ñ&Ô&Ð6Ð6Ð6ri   )rÛ   r  rž  r  r	   rP  r”  r    r   r›  rœ  r‹  rˆ  r  r�  r½  r“  r
  ÚReturn)
r  r   rÁ  r  r  r¡  r  r¢  rž  r  s
           @@rg   rû  rû  9  s%  øø€ Ý�V—[’[‘]”]Ñ#Ô#€JØ ‘>€Là
�Ô
Ô
 €CØ�:ÔÔ$€EÝœ8 E¨3Ñ/Ô/€Fˆ<Ñõ ”�u�m¨LÑ9Ô9¸3Ñ?Ô?€Iå#Ô.×7Ò7ÝŒ�Qñô €GˆIŒNÑà6Ð6Ð6Ð6Ð6°Ð6Ñ6Ô6€IÝ”×$Ò$ Y°Ñ4Ô4€JØ
ˆ<ÔÔ×$Ò$¥R¤Y¨z¸9ÀcÑ%JÔ%JÑKÔKÐKØ
ˆ<ÔÔ×$Ò$¥R¤Y¨y¸#Ñ%>Ô%>Ñ?Ô?Ð?Ø˜Ð"Ð"ri   c                 ót   — t          | ¦  «        }t          j        ||||||¦  «         t          | ¦  «         d S rq   )rÞ  r   rG   rá  )rŒ   r|   rÁ  rÝ  r—  r˜  r  s          rg   Úfind_potential_aliases_parforr  M  sG   € Ý Ñ'Ô'€FÝÔ#Ø��g˜w¨	°;ñ@ô @ð @å˜Ñ Ô Ð Ø
€Fri   c           
      ó8  — d}|                       ¦   «         D �]�}|j        D �]u}t          |t          ¦  «        �r\|dz  }|}|j        t          |j                             ¦   «         ¦  «                 }|j        }t          j	        dd¦  «        }t          j
        |t          d¦  «        |¦  «        }|j                             t          j        t          j        d|¦  «        ||¦  «        ¦  «         |j                             t          j        ||¦  «        ¦  «         t!          |j        ¦  «        |_        |j        t          |j                             ¦   «         ¦  «                 }|j                             ¦   «          t%          |j        ¦  «         �Œw�Œƒ|S )z%simplify CFG of body loops in parforsr   rˆ   r÷  r9  ú$const)r  r½  r�   r™  r¦  rÛ   r  r  r	   rü  r”  r    r“  r
  r  r  r4   r	  r~  )	r  rÍ  rÐ  r¾  rŒ   Ú
last_blockr  rž  Úconsts	            rg   r~  r~  V  se  € à€IØ—’‘”ð ;ñ ;ˆØ”Jð 	;ñ 	;ˆDÝ˜$¥Ñ'Ô'ñ ;Ø˜Q‘�	Ø�ð $Ô-­c°&Ô2B×2GÒ2GÑ2IÔ2IÑ.JÔ.JÔK�
Ø"Ô(�Ý”f˜_¨bÑ1Ô1�Ýœ˜u¥m°HÑ&=Ô&=¸sÑCÔC�Ø”×&Ò&¥r¤yµ´¸!¸SÑ1AÔ1AÀ5È#Ñ'NÔ'NÑOÔOÐOØ”×&Ò&¥r¤y°¸Ñ'<Ô'<Ñ=Ô=Ð=Ý#/°Ô0@Ñ#AÔ#A�Ô Ø#Ô-­c°&Ô2B×2GÒ2GÑ2IÔ2IÑ.JÔ.JÔK�
Ø”×#Ò#Ñ%Ô%Ð%å(¨Ô)9Ñ:Ô:Ð:ùñ!	;ð" Ðri   c                 ó  — | j                              ¦   «         }|€!t          |                     ¦   «         ¦  «        }|dk    sJ ‚| j        |d<   |d         j                             t          j        ||d         j	        ¦  «        ¦  «         | 
                    ¦   «         D ]^}t          |j        ¦  «        dk    s|j        d         j        s2|j                             t          j        ||j	        ¦  «        ¦  «         Œ_|S )z5wrap parfor blocks for analysis/optimization like CFGNr   r9  )r¦  r  r–   r  r¥  r½  r“  r	   r�  rž  r  rŽ   Úis_terminator)rŒ   rÍ  r  rÐ  s       rg   rÞ  rÞ  n  sÚ   € àÔ×"Ò"Ñ$Ô$€FØÐÝ˜&Ÿ+š+™-œ-Ñ(Ô(ˆØ˜Š?ˆ?ˆ?ˆ?ð Ô!€Fˆ1�IØ
ˆ1„I„N×Ò�"œ' +¨v°a¬y¬}Ñ=Ô=Ñ>Ô>Ð>Ø—’‘”ð ?ð ?ˆÝˆuŒz‰?Œ?˜aÒÐ¨¬
°2¬Ô(DÐØŒJ×Ò�bœg k°5´9Ñ=Ô=Ñ>Ô>Ð>øØ€Mri   c                 óD  — |�=t          |                     ¦   «         ¦  «        }|                     |¦  «         || _        t          | j                             ¦   «         ¦  «        }t	          | j        j        d         t          j        ¦  «        sJ ‚| j        j                             ¦   «          | j         	                    ¦   «         D ]V}t	          |j        d         t          j        ¦  «        r/|j        d         j
        |k    r|j                             ¦   «          ŒWdS )zb
    unwrap parfor blocks after analysis/optimization.
    Allows changes to the parfor loop.
    Nr9  )r–   r  r	  r¦  r�   r¥  r½  r	   r�  r  r  )rŒ   r  Úinit_block_labelr@  rÐ  s        rg   rá  rá  ~  sþ   € ð
 Ðå˜vŸ{š{™}œ}Ñ-Ô-Ðà�
Š
Ð#Ñ$Ô$Ð$Ø!ˆÔõ ˜6Ô+×0Ò0Ñ2Ô2Ñ3Ô3ÐÝ�fÔ'Ô,¨RÔ0µ"´'Ñ:Ô:Ð:Ð:Ð:ð ÔÔ×ÒÑ Ô Ð ð Ô!×(Ò(Ñ*Ô*ð ð ˆÝ�u”z "”~¥r¤wÑ/Ô/ð 	ØŒJ�rŒNÔ!Ð%5Ò5Ð5àŒJ�NŠNÑÔÐøØ
€Fri   c                 óÌ  — t          | ¦  «        }t          ||¦  «        \  }}t          ||¦  «        \  }}t          | ¦  «         |d         }| j                             ¦   «         D ]"}|d„ ||         D ¦   «         z  }|||         z  }Œ#t          | j                             ¦   «         ¦  «        }	||	         |d         z  }
t          j        dk    rt          d|
d|¦  «         |
|fS )z&find copies generated/killed by parforr   c                 ó   — h | ]\  }}|’ŒS ra   ra   )re   rn   re  s      rg   r  z$get_copies_parfor.<locals>.<setcomp>§  s   € Ð8Ð8Ð8™4˜1˜a�QÐ8Ð8Ð8ri   rˆ   zcopy propagate parfor gens:Úkill_set)
rÞ  r+   r,   rá  r¦  r  rÛ   r   rY  rc   )rŒ   rÁ  r  Úin_copies_parforÚout_copies_parforÚin_gen_copiesÚin_extra_killr&  r
  r  Úgenss              rg   Úget_copies_parforr,  š  sÿ   € å Ñ'Ô'€FÝ*8¸ÀÑ*IÔ*IÑ'ÐÐ'Ý#3°F¸GÑ#DÔ#DÑ €M�=Ý˜Ñ Ô Ð ð ˜QÔ€HØÔ!×&Ò&Ñ(Ô(ð )ð )ˆØÐ8Ð8 =°Ô#7Ð8Ñ8Ô8Ñ8ˆØ�M %Ô(Ñ(ˆˆõ �VÔ%×*Ò*Ñ,Ô,Ñ-Ô-€JØ˜ZÔ(¨=¸Ô+;Ñ;€DåÔ Ò"Ð"ÝÐ+¨T°:¸xÑHÔHÐHØ�ˆ>Ðri   c                 ó  — t          | j        ¦  «        D ]1\  }}|d         dk    r dt          |d         |¦  «        f| j        |<   Œ2| j        D ]P}t          |j        |¦  «        |_        t          |j        |¦  «        |_        t          |j        |¦  «        |_        ŒQt          | ¦  «        }	g }
|                     ¦   «         D ]G\  }}|
 	                    t          j        |||         t          j        dd¦  «        ¦  «        ¦  «         ŒH|
|	d         j        z   |	d         _        t          |	|¦  «        \  }}t          |	|||||¦  «         t!          | ¦  «         |	d         j        t#          |
¦  «        d…         |	d         _        dS )z*apply copy propagate recursively in parforr   ru  rˆ   Údummyr9  N)rg  rª  r'   r¤  r;  r4  r@  rÞ  r¼  r“  r	   r
  rü  r½  r+   r-   rá  rŽ   )rŒ   Úvar_dictÚname_var_tablerÁ  rÝ  Úsave_copiesr“   r°  rn   r  Úassign_listÚlhs_namerD  r'  r(  s                  rg   Úapply_copies_parforr4  ¶  s—  € õ   ¤Ñ0Ô0ð :ð :‰
ˆˆ7Ø�1Œ:˜Ò"Ð"Ø"+Ý" 7¨1¤:¨xÑ8Ô8ð":ˆFŒO˜AÑøð Ôð 6ð 6ˆÝ$ Q¤W¨hÑ7Ô7ˆŒÝ# A¤F¨HÑ5Ô5ˆŒÝ# A¤F¨HÑ5Ô5ˆŒˆå Ñ'Ô'€Fà€KØ!ŸšÑ)Ô)ð ;ð ;‰ˆ�#Ø×Ò�2œ9 S¨.¸Ô*BÝ%'¤V¨G°RÑ%8Ô%8ñ:ô :ñ 	;ô 	;ð 	;ð 	;à  6¨!¤9¤>Ñ1€Fˆ1„I„NÝ*8¸ÀÑ*IÔ*IÑ'ÐÐ'Ý˜Ð!1°>À7Ø" Kñ1ô 1ð 1å˜Ñ Ô Ð à˜A”Y”^¥C¨Ñ$4Ô$4Ð$5Ð$5Ô6€Fˆ1„I„NØ
€Fri   c                 ó¶  ‡‡‡— |                       ¦   «         D �]?}g }t          ¦   «         Ši }|j        D ]Ï}ˆˆˆfd„}	|srt          |t          ¦  «        r]|j        j        D ]}
 |	|
¦  «         Œ|j                             ¦   «         }t          |‰‰|d¬¦  «         | 	                    |¦  «         Œ} |	|¦  «         | 
                    ¦   «         D ]}|t          |j        ‰‰‰|¦  «        z  }Œ| 	                    |¦  «         ŒÐ||_        t          |¦  «        dk    r9|                     ¦   «         D ]\  }}||         ||<   Œd|i}t          ||¦  «         �ŒAdS )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        ¦  «         d S t          |t          j        ¦  «        rO|j	        dk    rF|j        j        ‰v s|j        j        ‰v r,| ‰|j        <   ‰                     |j        ¦  «         d S d S d S d S d S )NrÇ   )
r�   r	   r
  r  r  r  rˆ  r  r  r�  )r¾  rD  r  Ú
block_defsÚsaved_getattrsÚsaved_globalss      €€€rg   Úprocess_assignz&push_call_vars.<locals>.process_assigné  sã   ø€ Ý˜d¥B¤IÑ.Ô.ð 
5Øœ*�CØœ+�CÝ" 3­¬	Ñ2Ô2ð 5Ø26˜ c¤hÑ/Ø"Ÿš s¤xÑ0Ô0Ð0Ð0Ð0Ý# C­¬Ñ1Ô1ð 5°c´fÀ	Ò6IÐ6IØœIœN¨mÐ;Ð;Ø#&¤9¤>°^Ð#CÐ#CØ7;˜N¨3¬8Ñ4Ø&ŸNšN¨3¬8Ñ4Ô4Ð4Ð4Ð4ð
5ð 
5ð5ð 5Ð6IÐ6Ià#CÐ#Cri   T)Únestedr   N)r  rŸ  r½  r�   r™  r¥  r¦  r  r’  r“  r–  Ú_get_saved_call_nodesrˆ  rŽ   r¼  rH   )r  r9  r8  rÁ  r;  rÐ  rH  Úrename_dictr¾  r:  ró   Úpblocksr   r-  Útemp_blocksr7  s    ``            @rg   r’  r’  Ø  s½  øøø€ ð
 —’‘”ð .8ñ .8ˆØˆõ ‘U”Uˆ
ð ˆØ”Jð 	"ð 	"ˆDð5ð 5ð 5ð 5ð 5ð 5ð 5ð ð %�j¨­vÑ6Ô6ð %ØœÔ-ð &ð &�AØ"�N 1Ñ%Ô%Ð%Ð%Øœ.×-Ò-Ñ/Ô/�Ý˜w¨°~ÀwÐW[Ð\Ñ\Ô\Ð\Ø—’ Ñ%Ô%Ð%Øà�˜tÑ$Ô$Ð$Ø—^’^Ñ%Ô%ð [ð [�ØÕ1°!´&¸-Ø2@À*Èkñ[ô [ñ [��à�OŠO˜DÑ!Ô!Ð!Ð!ØˆŒ
åˆ{ÑÔ˜aÒÐà#×)Ò)Ñ+Ô+ð (ð (‘��1Ø$ QœZ�˜‘
�
à˜e˜*ˆKÝ˜k¨;Ñ7Ô7Ð7ùà
€Fri   c                 ó   — g }| |vrc| |v s| |v r[d„ }| |v r |||          d|||¦  «         d} n0| |v r, |||          d|||¦  «         ||          j         j         j        } | |vr| |v °W| |v °[|                     ¦   «          |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        <   d S rq   )r�   r	   r
  r”  r  r  r    rž  r  r  r  r“  r  rˆ  )ÚobjÚvar_baser6  r7  r=  Úrenamed_varÚrenamed_assigns          rg   Úrename_global_or_getattrz7_get_saved_call_nodes.<locals>.rename_global_or_getattr  s±   € Ý˜c¥2¤9Ñ-Ô-Ð.Ð.Ð-Ýœ& ¤Ô!1Ý!.¨xÑ!8Ô!8Ø!$¤¤ñ1ô 1ˆKõ  œY¥t¤}°S´YÑ'?Ô'?Ø'2Ø'*¤wñ0ô 0ˆNð �LŠL˜Ñ(Ô(Ð(Ø�NŠN˜3œ:œ?Ñ+Ô+Ð+Ø+9Ô+@Ô+EˆK˜œ
œÑ(Ð(Ð(ri   z$push_global_to_blockÚ_PA_DONEz$push_getattr_to_block)r  rˆ  rL  )Úfnamer9  r8  r7  r=  r6  rF  s          rg   r<  r<    sõ   € ð €EØ˜
Ð"Ð"¨°Ð(>Ð(>Ø+0°NÐ+BÐ+Bð
	Fð 
	Fð 
	Fð �MÐ!Ð!Ø$Ð$ ]°5Ô%9Ð;RØ%*¨J¸ñEô Eð EàˆEˆEØ�nÐ$Ð$Ø$Ð$ ^°EÔ%:Ð<TØ%*¨J¸ñEô Eð Eà" 5Ô)Ô/Ô5Ô:ˆEð+ ˜
Ð"Ð"¨°Ð(>Ð(>Ø+0°NÐ+BÐ+Bð* 
‡M‚M�O„O€OØ€Lri   c                 ó˜  — t          | t          ¦  «        rµ| d         }t          |t          ¦  «        st          |d¦  «        r|j        }nd}| d         }t          |¦  «        dk    r)d                     |t          |d         ¦  «        ¦  «        S d|z   dz   }d                     |                     d„ |D ¦   «         ¦  «        ¦  «        S t          | t          j
        j        j        ¦  «        r#| j        }|                     d	¦  «        rd
|z  S |S t          | t          j
        j        j        ¦  «        rt!          | j        ¦  «        S dS )zMExtract operators from arrayexpr to represent it abstractly as a string.
    r   r~   rÿ  rˆ   z({}({}))rK  z({})c                 ó,   — g | ]}t          |¦  «        ‘ŒS ra   )r¼  r¹  s     rg   rh   z"repr_arrayexpr.<locals>.<listcomp>A  s    € Ð*MÐ*MÐ*MÀ!­N¸1Ñ,=Ô,=Ð*MÐ*MÐ*Mri   ú$z'%s' (temporary variable))r�   r;  r´  Úhasattrr~   rŽ   rÈ   r¼  rM  rŠ   r  r	   r”  rˆ  rÂ  r  rµ  r  )r«  Úoprr|   rˆ  s       rg   r¼  r¼  1  s7  € õ �)�UÑ#Ô#ð Ø˜Œlˆå˜#�sÑ#Ô#ð 	Ý�s˜JÑ'Ô'ð Ø”l��à�Ø˜Œ|ˆÝˆt‰9Œ9˜Š>ˆ>Ø×$Ò$ S­.¸¸a¼Ñ*AÔ*AÑBÔBÐBà˜‘)˜c‘/ˆCØ—=’= §¢Ð*MÐ*MÀtÐ*MÑ*MÔ*MÑ!NÔ!NÑOÔOÐOÝ	�I�uœzœ}Ô0Ñ	1Ô	1ð 	ØŒ~ˆØ�?Š?˜3ÑÔð 	Ø0°4Ñ7Ð7àˆKÝ	�I�uœzœ}Ô2Ñ	3Ô	3ð Ý�I”OÑ$Ô$Ð$àˆsri   c                 ó|   — g }| j         D ]}|                     ||         ¦  «         Œt          |¦  «        |_        dS )z›postproc updates generator_info with live variables after transformations
    but generator variables have types in return_type that are updated here.
    N)Ú
state_varsr“  r;  Ústate_types)r˜  r¡   rÁ  Únew_state_typesr   s        rg   r—  r—  M  sK   € ð €OØÔ&ð +ð +ˆØ×Ò˜w qœzÑ*Ô*Ð*Ð*Ý# OÑ4Ô4€KÔØ
€Fri   c                 ó~   — |€i }|€i }t          | ¦  «        }t          |||¦  «        \  }}t          | ¦  «         ||fS rq   )rÞ  r2   rá  )rŒ   r   Úreverse_call_tabler  s       rg   Úget_parfor_call_tablerT  X  s^   € ØÐØˆ
ØÐ!ØÐÝ Ñ'Ô'€FÝ%3°F¸JØ4Fñ&Hô &HÑ"€JÐ"å˜Ñ Ô Ð ØÐ)Ð)Ð)ri   c                 ót   — |€i }t          | ¦  «        }t          j        ||¦  «        }t          | ¦  «         |S rq   )rÞ  r   Úget_tuple_tablerá  )rŒ   Útuple_tabler  s      rg   Úget_parfor_tuple_tablerX  g  s@   € ØÐØˆÝ Ñ'Ô'€FÝÔ*¨6°;Ñ?Ô?€KÝ˜Ñ Ô Ð ØÐri   c                 óŒ   — |€t          ¦   «         }t          | ¦  «        }t          j        ||¦  «        }t	          | ¦  «         |S rq   )rŸ  rÞ  r   Úget_array_accessesrá  )rŒ   Úaccessesr  s      rg   Úget_parfor_array_accessesr\  s  sC   € ØÐÝ‘5”5ˆÝ Ñ'Ô'€FÝÔ*¨6°8Ñ<Ô<€HÝ˜Ñ Ô Ð Ø€Ori   c                 ó¤   — t          | ¦  «        }t          ||¦  «        }||         |d<   |                     |¦  «         t          | |¦  «         d S rß   )rÞ  r7   r	  rá  )rŒ   rÏ  r  s      rg   Úparfor_add_offset_to_labelsr^  €  sR   € Ý Ñ'Ô'€FÝ! &¨&Ñ1Ô1€FØ�v”€Fˆ1�IØ
‡J‚JˆvÑÔÐÝ˜ Ñ(Ô(Ð(Ø
€Fri   c                 ój   — t          | ¦  «        }t          j        |¦  «        }t          | ¦  «         |S rq   )rÞ  r   rr  rá  )rŒ   r  Ú	max_labels      rg   Úparfor_find_max_labelra  Œ  s3   € Ý Ñ'Ô'€FÝÔ'¨Ñ/Ô/€IÝ˜Ñ Ô Ð ØÐri   c                 óš  ‡— |j         }t          | ¦  «        }d„ | j        D ¦   «         }t          |                     ¦   «         ¦  «        }||         j        Šˆfd„|D ¦   «         }||         j        }|||         j        z   ||         _        ||_         |                     ¦   «          ||_         |||         _        t          | ¦  «         d S )Nc                 ó   — g | ]	}|j         ‘Œ
S ra   r¸  rm  s     rg   rh   z$parfor_typeinfer.<locals>.<listcomp>˜  s   € Ð>Ð>Ð> q�!Ô"Ð>Ð>Ð>ri   c           	      óf   •— g | ]-}t          j        t          j        d ‰d¬¦  «        |‰¦  «        ‘Œ.S )rˆ   F)rž  Úuse_literal_type)r	   r
  r  )re   r   rž  s     €rg   rh   z$parfor_typeinfer.<locals>.<listcomp>ž  s:   ø€ ÐiÐiÐiÐYZ•R”Y�rœx¨¨sÀUÐKÑKÔKÈQÐPSÑTÔTÐiÐiÐiri   )	r  rÞ  r¤  r–   r  rž  r½  Úbuild_constraintrá  )	rŒ   ÚtypeinfererÚsave_blocksr  r]  Úfirst_blockÚindex_assignsÚsave_first_block_bodyrž  s	           @rg   Úparfor_typeinferrl  •  s×   ø€ ØÔ$€KÝ Ñ'Ô'€FØ>Ð>¨FÔ,=Ð>Ñ>Ô>€Jõ �f—k’k‘m”mÑ$Ô$€KØ
�Ô
Ô
!€CàiÐiÐiÐiÐ^hÐiÑiÔi€MØ" ;Ô/Ô4ÐØ,¨v°kÔ/BÔ/GÑG€Fˆ;ÔÔØ€KÔØ× Ò Ñ"Ô"Ð"Ø$€KÔØ4€Fˆ;ÔÔÝ˜Ñ Ô Ð Ð Ð ri   c                 óŠ   — |€t          t          ¦  «        }t          | j        |¦  «         t          d| j        i|¦  «         |S )z)get variable definition table for parforsNr   )r   rì  r?   r¦  r¥  )rŒ   Údefinitionss     rg   Úbuild_parfor_definitionsro  ª  sH   € àÐÝ!¥$Ñ'Ô'ˆõ �fÔ&¨Ñ4Ô4Ð4Ý�q˜&Ô+Ð,¨kÑ:Ô:Ð:ØÐri   c           	   #   ó¤  K  — t          |                      ¦   «         ¦  «        }| |         j        }t          j        |t          d¦  «        t          j        dd¦  «        ¦  «        }| |         j                             t          j	        |t          j        dd¦  «        ¦  «        ¦  «         dV — | |         j         
                    ¦   «          dS )zLadds dummy return to last block of parfor loop body for CFG computation
    r  r÷  r9  N)rÛ   r  r  r	   r”  r    rü  r½  r“  r  r	  )r¦  r  r  r  s       rg   r^  r^  ·  s·   è è € õ
 �Y—^’^Ñ%Ô%Ñ&Ô&€JØ�jÔ!Ô'€EÝŒF�5�-¨Ñ1Ô1µ2´6¸/È2Ñ3NÔ3NÑOÔO€EØˆjÔÔ×%Ò%Ý
Œ	�%�œ °Ñ4Ô4Ñ5Ô5ñ7ô 7ð 7à	€E€E€EàˆjÔÔ×"Ò"Ñ$Ô$Ð$Ð$Ð$ri   c                   ó   — e Zd Zd„ ZdS )ÚReduceInferc                 óÌ   — |rJ ‚t          |¦  «        dk    rt          j        d¦  «        ‚t          |d         t          j        ¦  «        sJ ‚t          |d         j        g|¢R Ž S )NrS  zlen(args) != 3rˆ   )rŽ   r   ÚNumbaAssertionErrorr�   r   r  rP   r�   r·   s      rg   rº   zReduceInfer.genericÇ  sd   € ØˆˆˆwÝˆt‰9Œ9˜Š>ˆ>ÝÔ,Ð-=Ñ>Ô>Ð>Ý˜$˜qœ'¥5¤;Ñ/Ô/Ð/Ð/Ð/Ý˜˜aœœÐ.¨Ð.Ð.Ð.Ð.ri   Nr»   ra   ri   rg   rr  rr  Å  s#   € € € € € ð/ð /ð /ð /ð /ri   rr  c                  óJ   — t           j        rd} t          j        | ¦  «        ‚dS )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    rg   Úensure_parallel_supportrw  Ï  s1   € õ Ôð 2ðˆåÔ,¨SÑ1Ô1Ð1ð2ð 2ri   ræ  )NNNNNr&  rV  )NNNrq   (  r—  r   ÚpytypesrÉ  rH  r   Útextwrapr  rd  r¤  Ú	functoolsr   Úcollectionsr   r   r   Ú
contextlibr   rk  Údataclassesr   r!  Úllvmliter	   rÂ   Únumba.core.imputilsr
   Únumba.core.irrŠ   rX  r   r   r   r   r   r   r   r   r   r   r   Únumba.np.npdatetime_helpersr   r   Únumba.np.numpy_supportr   r   Únumba.core.typing.templatesr   r   Únumba.stencils.stencilparforr   Únumba.core.extendingr   r   Únumba.core.ir_utilsr    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   Únumba.core.analysisrJ   rK   rL   rM   Únumba.core.controlflowrN   Únumba.core.typingrO   rP   Únumba.core.types.functionsrQ   Únumba.parfors.array_analysisrR   rS   rT   rU   rV   rW   Únumba.parfors.ir_utilsrX   Únumba.nprž   rY   rk  r§   Únumba.parforsrZ   Únumba.cpython.builtinsÚnumba.stencilsr[   rÀ  ÚTextWrapperrk   ro   rÁ  rr   rv   rŒ  rx   r£   r�   r°   r²   r¶   rµ   rÒ   rÔ   rÝ   rê   rî   rô   rù   rý   r  r  r  r  r)  r.  rW  rb  râ  r|  rï  rÙ   r�   rà   rí   r‡  rõ  r‹  r  ÚStmtr™  rä  Úarray_analysis_extensionsræ  rÙ  r  r,  r4  rr  rt  rS  rR  r¦  rÐ  rò  rÜ  rp  r{  rŽ  rÉ  rÊ  r»  r«  r¯  r®  r™  rá  rå  r€  rø  r÷  rö  r  r  r  r  r  r�  r'  r(  rI  r&  rY  rg  ri  Úvisit_vars_extensionsr|  Úir_extension_usedefsr€  Úir_extension_use_allocar“  Úir_extension_insert_delsr‚  r–  r   r›  r¤  r¥  r­  r…  r¼  rÏ  r»  rº  ru  r  rú  Úremove_dead_extensionsrÿ  rû  r  Úalias_analysis_extensionsr~  rÞ  rá  r,  Úcopy_propagate_extensionsr4  Úapply_copy_propagate_extensionsr’  r<  r¼  r—  rT  Úcall_table_extensionsrX  Útuple_table_extensionsr\  Úarray_accesses_extensionsr^  Úadd_offset_to_labels_extensionsra  Úfind_max_label_extensionsrl  Útypeinfer_extensionsro  Úbuild_defs_extensionsr^  rr  rw  ra   ri   rg   ú<module>r£     s¨  ððð ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø %Ð %Ð %Ð %Ð %Ð %Ø €€€Ø &Ð &Ð &Ð &Ð &Ð &Ø €€€à Ð Ð Ð Ð Ð Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø Ð Ð Ð Ø rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rÐ rØ "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @ð+ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ð +ðZHð Hð Hð Hð Hð Hð Hð Hð Hð Hð Hð Hà *Ð *Ð *Ð *Ð *Ð *Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø /Ð /Ð /Ð /Ð /Ð /ð>ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð ,Ð +Ð +Ð +Ð +Ð +Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø )Ð )Ð )Ð )Ð )Ð )Ø €€€Ø €€€Ø Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (ð €
Ø"ˆhÔ"¨ÀUÐKÑKÔK€ð0ð 0ð 0ð #Ð ð
ð ð ð 
€ˆ+ÑÔðð ñ Ôðð
ð ð ð ð �fñ ô ð ð ð  ð  ðH2ð 2ð 2ð2ð 2ð 2ð €Ð Ñ!Ô!Ø€Ð Ñ!Ô!ð3ð 3ð 3ð 3ð 3Ð"ñ 3ô 3ñ "Ô!ñ "Ô!ð3ð €Ð! 5Ô#4Ñ5Ô5Ø€Ð! 5¤;Ñ/Ô/ð:ð :ñ 0Ô/ñ 6Ô5ð:ð2 €Ð! 5Ô#4Ñ5Ô5Ø€Ð! 5¤;Ñ/Ô/ð:ð :ñ 0Ô/ñ 6Ô5ð:ð2ð ð ð@	ð 	ð 	ð	ð 	ð 	ð	ð 	ð 	ðð ð ð"ð ð ð
'ð 
'ð 
'ðð ð ð,ð ð ð.ð ð ð.ð ð ð8ð ð ð
 48ð 4Gð 4Gð 4Gð 4Gð 4GðlIð Ið Ið0 :Ð9Ø9Ð9Ø'Ø'Ø(Ø(Ø'Ø)Ø)Ø'Ø'Ø'Ø-Ø1ðð Ð ð"ð ð ð( ÐðÐ ð ð>ð >ñ Ôð>ð
 ð>ð >ñ Ôð>ð
 ðGð Gñ ÔðGð ðGð Gñ ÔðGð ˆz˜.¨6°6Ð*:Ñ;Ô;€ð '˜,Ð'7¸ÑHÔHØ&˜,Ð'7¸ÑHÔHØ#�| M°;Ñ?Ô?Ø#�| M°;Ñ?Ô?Ø$˜ ]°KÑ@Ô@Ø$˜ ]°KÑ@Ô@ð"ð "Ð ðð ð ð ð ˆvñ ô ð ð:K(ð K(ð K(ð K(ð K(ˆRŒW�b”gñ K(ô K(ð K(ð\ð ð ð  4C€Ô (¨Ñ 0ðNð Nð Nð Nð N˜ñ Nô Nð Nðbc"ð c"ð c"ð c"ð c"�Fñ c"ô c"ð c"ðJð ð ð%ð %ð %ð %ð %ñ %ô %ð %ð<sWð sWð sWð sWð sWñ sWô sWð sWðlAð Að Að~Wð ~Wð ~Wð ~Wð ~Wñ ~Wô ~Wð ~WðB
ð 
ð 
ð 
ð:!ð !ð !ðZð Zð Zð Zð Zñ Zô Zð ZðzS$ð S$ð S$ð S$ð S$ñ S$ô S$ð S$ðl`;ð `;ð `;ð `;ð `;ñ `;ô `;ð `;ðF.ð .ð .ðb6Eð 6Eð 6Eð 6Eð 6EÐ!ñ 6Eô 6Eð 6Eðrf%ð f%ð f%ð f%ð f%Ð'ñ f%ô f%ð f%ðRPEð PEð PEð PEð PEÐ,ñ PEô PEð PEðf%ð %ð %ðP	-ð 	-ð 	-ðnð nð nðbð ð ð2Jð Jð JðZSð Sð Sð@ð @ð @ð(D%ð D%ð D%ðNð ð ð ð  ð  ðF#ð #ð #ð0ð ð ð4ð ð ðð ð ð(ð (ð (ðV(ð (ð (ð ð ð ð$ ˆnØØ)Ð)Ð)Øðñ ô €ð QUØ;?ØðP'ð P'ð P'ð P'ðdHð Hð Hð&ð ð ð6ð ð ð8lð lð lð\Nð Nð NðNð Nð Nðð ð ð& *;€Ô ˜vÑ &ð1Eð 1Eð 1Eð 1Eðh )4€Ô ˜fÑ %ð
!ð 
!ð 
!ð ,>€Ô   Ñ (ð+ ð + ð + ð\ -?€Ô ! &Ñ )ðð ð ð ð2 59ðð ð ð ð(ð ð ðð ð ð:'ð 'ð 'ð

ð 
ð 
ð ˆz˜.Ð*HÐ*HÐ*HÑIÔI€ðl0ð l0ð l0ð^(ð (ð (ðVð ð ð0 ØØðgFð gFð gFð gFðTð ð ðð ð ðdð dð dðLð ð ðB +=€Ô  Ñ 'ð(ð (ð (ðT#ð #ð #ð(ð ð ð .K€Ô " 6Ñ *ðð ð ð0ð ð ð ð ð ð ð ð8ð ð ð2 .?€Ô " 6Ñ *ðð ð ð> 4G€Ô (¨Ñ 0ð5ð 5ð 5ð 5ðpð ð ðBð ð ð8ð ð ð	*ð 	*ð 	*ð 	*ð *?€Õ ˜vÑ &ðð ð ñ ñ +A€Õ  Ñ 'ðð ð ñ ñ .G€Õ " 6Ñ *ðð ñ ñ 4O€Õ (¨Ñ 0ðð ñ ñ .C€Õ " 6Ñ *ð!ð !ñ !ñ& *:€	Õ ˜vÑ &ð	ð 	ð 	ñ 	ñ *B€Õ ˜vÑ &àð%ð %ñ „ñ%ð €ˆfÑÔð/ð /ð /ð /ð /Ð"ñ /ô /ñ Ôñ/ð2ð 2ñ 2ð 2ð 2ri   