§
    ƒÛg_ ã                   ó²	  — 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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.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5 ddl6m7Z7m8Z8m9Z9m: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l3muZu ddlZddlvZvddlvZwddlxmyZy ddlzZddl{m|Z| dZ} ej~        e}d¬¦  «        Zd„ Z€dZ�d„ Z‚ eue‚¦  «        d„ ¦   «         Zƒ G d„ d e„¦  «        Z…d!„ Z†d"„ Z‡d#„ Zˆd$„ Z‰d%„ ZŠd&„ Z‹d'„ ZŒd(„ Z�d)„ ZŽd*„ Z�d+„ Z�d,„ Z‘d-„ Z’dd.œd/„Z“d0„ Z”d1„ d2„ e†e‡e†e‡eŽe�e�e‘e’e�e“e”d3œZ•d4„ Z–d5e–iZ—e4d6„ ¦   «         Z˜e4d7„ ¦   «         Z™e4d8„ ¦   «         Zše4d9„ ¦   «         Z› ed:d;d<g¦  «        Zœ eœd=eš¦  «         eœd>e›¦  «         eœd?e™¦  «         eœd@e˜¦  «         eœd?e™¦  «         eœd@e˜¦  «        dAœZ� G dB„ dCe„¦  «        Zž G dD„ dEejŸ        ej         ¦  «        Z¡dF„ Z¢e¢eyj£        e¡<    G dG„ dHe„¦  «        Z¤ G dI„ dJe„¦  «        Z¥dK„ Z¦ G dL„ dM¦  «        Z§ G dN„ dO¦  «        Z¨dP„ Z© G dQ„ dR¦  «        Zªd©dS„Z«dT„ Z¬ G dU„ dV¦  «        Z­ G dW„ dX¦  «        Z® G dY„ dZ¦  «        Z¯d[„ Z° G d\„ d]e§¦  «        Z± G d^„ d_e§¦  «        Z² G d`„ dae§¦  «        Z³db„ Z´dc„ Zµdd„ Z¶de„ Z·df„ Z¸dg„ Z¹dh„ Zºdi„ Z»dj„ Z¼dk„ Z½dl„ Z¾dm„ Z¿dn„ ZÀdo„ ZÁdp„ ZÂdq„ ZÃdr„ ZÄ edsg dt¢du¬v¦  «        ZÅ	 	 	 dªdw„ZÆdx„ ZÇdy„ ZÈdz„ ZÉd{„ ZÊd|„ ZËd}„ ZÌd~„ ZÍeÍe%jÎ        e¡<   d«d„ZÏeÏe jÐ        e¡<   d€„ ZÑeÑe jÒ        e¡<   d�„ ZÓeÓe!jÔ        e¡<   d¬d‚„ZÕ	 d¬dƒ„ZÖd„„ Z×d…„ ZØd†„ ZÙd‡„ ZÚ edˆg d‰¢¦  «        ZÛdŠ„ ZÜd‹„ ZÝdŒ„ ZÞ	 	 	 d­d�„ZßdŽ„ Zàd�„ Zád�„ Zâd‘„ Zãeâe%jä        e¡<   d’„ Zåd“„ Zæd”„ Zçeçe%jè        e¡<   d•„ Zéd®d–„Zêd®d—„Zëd˜„ Zìeìe%jí        e¡<   d™„ Zîeîe%jï        e¡<   d©dš„Zðd›„ Zñdœ„ Zòd�„ Zód«dž„Zôeôe%jõ        e¡<   d®dŸ„Zöeöe%j÷        e¡<   d®d „Zøeøe%jù        e¡<   d¡„ Zúeúe%jû        e¡<   d¢„ Züeüe%jý        e¡<   d£„ Zþeþe#jÿ        e¡<   d®d¤„�Z �e e%�j        e¡<   ed¥„ ¦   «         �Z e/e¦  «         G d¦„ d§e0¦  «        ¦   «         �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Úmk_allocÚget_np_ufunc_typÚmk_range_blockÚmk_loop_headerÚget_name_var_tableÚreplace_varsÚreplace_vars_innerÚ
visit_varsÚvisit_vars_innerÚremove_deadÚcopy_propagateÚget_block_copiesÚapply_copy_propagateÚdprint_func_irÚfind_topo_orderÚget_stmt_writesÚrename_labelsÚget_call_tableÚsimplifyÚsimplify_CFGÚhas_no_side_effectÚcanonicalize_array_mathÚadd_offset_to_labelsÚfind_callnameÚfind_build_sequenceÚguardÚrequireÚGuardExceptionÚcompile_to_numba_irÚget_definitionÚbuild_definitionsÚreplace_arg_nodesÚreplace_returnsÚ
is_getitemÚ
is_setitemÚis_get_setitemÚindex_var_of_get_setitemÚset_index_var_of_get_setitemÚfind_potential_aliasesÚreplace_var_namesÚtransfer_scope)Úcompute_use_defsÚcompute_live_mapÚcompute_dead_mapsÚcompute_cfg_from_blocks)ÚCFGraph)ÚnpydeclÚ	signature)ÚFunction)Úrandom_int_argsÚrandom_1arg_sizeÚrandom_2arg_sizelastÚrandom_3arg_sizelastÚrandom_callsÚassert_equiv)Úoverload)Úarray_analysis)ÚstencilparforéP   F)ÚwidthÚdrop_whitespacec                 ó|   — |                       ¦   «         D ]&}d„ t                               |¦  «        D ¦   «          Œ'd S )Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS © ©Úprint©Ú.0Úys     úJ/granary/edev/quantum/lib/python3.11/site-packages/numba/parfors/parfor.pyú
<listcomp>z!print_wrapped.<locals>.<listcomp>k   s   € Ð/Ð/Ð/�a�ˆq‰ŒÐ/Ð/Ð/ó    )Ú
splitlinesÚ_txtwrapperÚwrap)ÚxÚls     rg   Úprint_wrappedro   i   sH   € Ø�\Š\‰^Œ^ð 0ð 0ˆØ/Ð/�;×+Ò+¨AÑ.Ô.Ð/Ñ/Ô/Ð/Ð/ð0ð 0ri   c                  ó   — d S ©Nra   ra   ri   rg   Úinit_prangerr   r   s   € Ø
€Fri   c                  ó   — d„ } | S )Nc                  ó   — d S rq   ra   ra   ri   rg   Úno_opz#init_prange_overload.<locals>.no_opw   s   € Øˆri   ra   )ru   s    rg   Úinit_prange_overloadrv   u   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                 ój  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         t           j        j                             | j	        ¦  «        }t           j        j         
                    t          | ¦  «        ¦  «        D ]}t          || |         ¦  «        }Œ|S rq   )ÚnumbaÚparforsÚparforrr   Úmin_checkerÚlenÚcpythonÚbuiltinsÚ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Ñ(Ô(Ð(Ý”mÔ,×?Ò?ÀÄÑMÔM�ÝœÔ-×=Ò=½cÀ&¹k¼kÑJÔJð ;ð ;�AÝ*¨3°°q´	Ñ:Ô:�C�CØ�
ri   c                 ój  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         t           j        j                             | j	        ¦  «        }t           j        j         
                    t          | ¦  «        ¦  «        D ]}t          || |         ¦  «        }Œ|S rq   )rŠ   r‹   rŒ   rr   r�   rŽ   r�   r�   r‘   r’   rx   Úminr“   s      rg   r†   z min_parallel_impl.<locals>.min_1’   ó‰   € Ý”Ô$×0Ò0Ñ2Ô2Ð2Ý�C ™KœKÑ(Ô(Ð(Ý”mÔ,×?Ò?ÀÄÑMÔM�ÝœÔ-×=Ò=½cÀ&¹k¼kÑJÔJð .ð .�AÝ˜c 6¨!¤9Ñ-Ô-�C�CØ�
ri   c                 ó:  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         t           j        j                             | j	        ¦  «        }t          j
        | j        ¦  «        D ]}t          || |         ¦  «        }Œ|S rq   )rŠ   r‹   rŒ   rr   r�   rŽ   r�   r�   r‘   r’   r   Úshaper˜   r“   s      rg   r†   z min_parallel_impl.<locals>.min_1š   ó|   € ÝŒMÔ ×,Ò,Ñ.Ô.Ð.Ý�˜F™œÑ$Ô$Ð$Ý”-Ô(×;Ò;¸F¼LÑIÔIˆCÝ”^ F¤LÑ1Ô1ð *ð *�Ý˜#˜v aœyÑ)Ô)��ØˆJri   ©ÚndimÚ
isinstancer’   r   Ú
NPDatetimeÚNPTimedelta)Úreturn_typeÚargr†   s      rg   Úmin_parallel_implr¤   �   s‹   € ð „x�1‚}€}ð	ð 	ð 	ð 	à	Œ�QŠˆÝ�c”i¥%Ô"2µEÔ4EÐ!FÑGÔGð 	ðð ð ð ðð ð ð ð	ð 	ð 	ð €Lri   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                 ój  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         t           j        j                             | j	        ¦  «        }t           j        j         
                    t          | ¦  «        ¦  «        D ]}t          || |         ¦  «        }Œ|S rq   )rŠ   r‹   rŒ   rr   Úmax_checkerrŽ   r�   r�   Úget_type_min_valuer’   rx   r   r“   s      rg   r§   z max_parallel_impl.<locals>.max_1ª   r–   ri   c                 ój  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         t           j        j                             | j	        ¦  «        }t           j        j         
                    t          | ¦  «        ¦  «        D ]}t          || |         ¦  «        }Œ|S rq   )rŠ   r‹   rŒ   rr   r©   rŽ   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        j                             | j	        ¦  «        }t          j
        | j        ¦  «        D ]}t          || |         ¦  «        }Œ|S rq   )rŠ   r‹   rŒ   rr   r©   rŽ   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¥%Ô"2µEÔ4EÐ!FÑGÔGð 	ðð ð ð ðð ð ð ð	ð 	ð 	ð €Lri   c                 ó  — t           j        j                             ¦   «          t	          t          | ¦  «        ¦  «         |                      ¦   «         }t           j        j         	                    |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‘   r’   r   Ú
IndexValuerx   r˜   Úindex©r…   ÚAÚinit_valÚivalr•   Ú	curr_ivals         rg   Úargmin_parallel_implrº   Ã   óÇ   € Ý	„MÔ×$Ò$Ñ&Ô&Ð&Ý•3�v‘;”;ÑÔÐØ�Š‰Œ€AÝŒ}Ô%×8Ò8¸¼ÑAÔ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        j         	                    |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   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›   ÚnpÚzerosr’   rx   )rÀ   rÁ   rn   rÂ   ÚnÚcr•   s          rg   Údotvm_parallel_implrÊ   ä   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Î   õ   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Õ     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_1  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_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‹   rŒ   rr   r   r›   rÛ   s      €rg   rØ   z sum_parallel_impl.<locals>.sum_1  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_1)  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_13  sO   ø€ ÝŒMÔ ×,Ò,Ñ.Ô.Ð.ØˆCÝ”^ F¤LÑ1Ô1ð !ð !�Ø�v˜a”yÑ ��ØˆJri   rß   )r¢   r£   rã   ræ   s      @rg   Úprod_parallel_implrè   %  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_1A  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_1D  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_1K  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_1U  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_1X  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_1c  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ú   S  sV   € Ø
„x�1‚}€}ð	ð 	ð 	ð 	à	Œ�QŠˆð		%ð 		%ð 		%ð 		%ð		%ð 		%ð 		%ð €Lri   c                 ó   — d„ }|S )Nc                 ó0   — |                       ¦   «         dz  S )Ng      à?)Úvarr„   s    rg   Ústd_1z std_parallel_impl.<locals>.std_1p  s   € Ø�zŠz‰|Œ|˜sÑ"Ð"ri   ra   )r¢   r£   rþ   s      rg   Ústd_parallel_implrÿ   o  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_1w  s   ø€ ÝŒy˜˜D ! ^Ñ4Ô4Ð4ri   c                 ó0   — t          j        d| d|¦  «        S r  r  )r  r’   s     rg   Úarange_1_dtypez,arange_parallel_impl.<locals>.arange_1_dtypez  s   € ÝŒy˜˜D ! UÑ+Ô+Ð+ri   c                 ó2   •— t          j        | |d‰¦  «        S ©Nrˆ   r  )Ústartr  r  s     €rg   Úarange_2z&arange_parallel_impl.<locals>.arange_2}  s   ø€ ÝŒy˜  a¨Ñ8Ô8Ð8ri   c                 ó0   — t          j        | |d|¦  «        S r  r  )r  r  r’   s      rg   Úarange_2_dtypez,arange_parallel_impl.<locals>.arange_2_dtype€  s   € ÝŒy˜  a¨Ñ/Ô/Ð/ri   c                 ó2   •— t          j        | ||‰¦  «        S rq   r  )r  r  Ústepr  s      €rg   Úarange_3z&arange_parallel_impl.<locals>.arange_3ƒ  s   ø€ ÝŒy˜  d¨NÑ;Ô;Ð;ri   c                 ó0   — t          j        | |||¦  «        S rq   r  )r  r  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  r  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   r  r  r  r¬   rÆ   rÌ   rx   )	r  r  r  r’   r  r   r!  r”   r•   s	            rg   r"  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Ž   Ú
ValueErrorÚformat)r¢   r’   r|   r  r	  r  r  r  r  r"  r  s             @rg   Úarange_parallel_implr)  t  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  r  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 )Nrˆ   r   )rŠ   r‹   rŒ   rr   rÆ   rÌ   rx   )r  r  Únumr!  Ú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Ð   r$  zparallel linspace with types {})r   r’   rŽ   r'  r(  )r¢   r|   r.  r3  r’   s       @rg   Úlinspace_parallel_implr4  ª  s„   ø€ Ý�[Ô&Ñ'Ô'€Eð,ð ,ð ,ðð ð ð ð õ ˆ4�y„y�A‚~€~ØÐÝ	ˆT‰Œ�aŠˆØÐåÐ:×AÒAÀ$ÑGÔGÑHÔHÐHri   c                 ó   — t           S rq   )rº   ©ÚrrÀ   s     rg   ú<lambda>r8  Â  ó   € Õ%9€ ri   c                 ó   — t           S rq   )r¾   r6  s     rg   r8  r8  Ã  r9  ri   )©ÚargminÚnumpy©Úargmaxr=  ©r˜   r=  ©r¬   r=  ©Úaminr=  ©Úamaxr=  )Úsumr=  )Úprodr=  )rô   r=  )rý   r=  )Ústdr=  )Údotr=  )r  r=  )r-  r=  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   rL  z"fill_parallel_impl.<locals>.fill_1Þ  sD   € ÝŒMÔ ×,Ò,Ñ.Ô.Ð.Ý”^ F¤LÑ1Ô1ð  ð  �Ø��q‘	�	Ø�4ri   rß   )r¢   r!  r”   rL  s       rg   Úfill_parallel_implrN  Ò  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©r'  ©Ú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 identityrQ  rR  s    rg   r�   r�   ï  rT  ri   c                 ó0   — | dk    rt          d¦  «        ‚d S )Nr   z*attempt to get argmin of an empty sequencerQ  rR  s    rg   r±   r±   õ  ó!   € à�1‚}€}ÝÐEÑFÔFÐFð €}ri   c                 ó0   — | dk    rt          d¦  «        ‚d S )Nr   z*attempt to get argmax of an empty sequencerQ  rR  s    rg   r½   r½   ú  rW  ri   Úchecker_implÚnameÚfuncr±   r½   r�   r©   )r;  r>  r@  rA  rB  rD  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  r  r  )Úselfr_  r  r  r  s        rg   Ú__init__zLoopNest.__init__  s#   € Ø,ˆÔØˆŒ
ØˆŒ	ØˆŒ	ˆ	ˆ	ri   c                 óZ   — d                      | j        | j        | j        | j        ¦  «        S )Nz3LoopNest(index_variable = {}, range = ({}, {}, {})))r(  r_  r  r  r  ©r`  s    rg   Ú__repr__zLoopNest.__repr__  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	   ÚVarr  r  )r`  Úall_usess     rg   Ú	list_varszLoopNest.list_vars  sŸ   € Ø€xØ‡‚�tÔ*Ñ+Ô+Ð+Ý
�T”Z¥¤Ñ
(Ô
(ð 'Ø�?Š?˜4œ:Ñ&Ô&Ð&Ý
�T”Y¥¤Ñ
'Ô
'ð &Ø�?Š?˜4œ9Ñ%Ô%Ð%Ý
�T”Y¥¤Ñ
'Ô
'ð &Ø�?Š?˜4œ9Ñ%Ô%Ð%Ø€ri   N)r~   r   r€   Ú__doc__ra  rd  ri  ra   ri   rg   r]  r]    sN   € € € € € ðð ð
ð ð ðOð Oð Oð	ð 	ð 	ð 	ð 	ri   r]  c                   ób   ‡ — e Zd ZdZd e¦   «         dœˆ fd„
Zd„ Zd„ Zd„ Zdd	„Z	dd
„Z
d„ Zˆ xZS )ÚParforr   F)Úno_sequential_loweringÚracesc	                ó  •— 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 {})Úsuperrl  ra  ÚtypeÚ
id_counterÚidÚ
loop_nestsÚ
init_blockÚ	loop_bodyÚ	index_varÚparamsÚ	equiv_setrŽ   ÚpatternsÚflagsrm  rn  ÚredvarsÚreddictÚlowererr   ÚDEBUG_ARRAY_OPT_STATSrc   r(  )r`  rv  rw  rx  rq  ry  r{  Úpatternr}  rm  rn  ÚfmtÚ	__class__s               €rg   ra  zParfor.__init__,  s*  ø€ õ 	�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=)Ústrru  Úreprrv  rx  ry  rc  s    rg   rd  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>c  s   € Ð:Ð:Ð: Q�Ô Ð:Ð:Ð:ri   )rv  rc  s    rg   Úget_loop_nest_varszParfor.get_loop_nest_varsb  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.
        )rx  ÚitemsÚbodyri  rv  rw  )r`  rh  rn   rÁ   ÚstmtÚloops         rg   ri  zParfor.list_varse  s®   € ð ˆØ”N×(Ò(Ñ*Ô*ð 	-ð 	-‰DˆAˆqØœð -ð -�Ø˜DŸNšNÑ,Ô,Ñ,��ð-ð ”Oð 	)ð 	)ˆDØ˜ŸšÑ(Ô(Ñ(ˆHˆHà”OÔ(ð 	)ð 	)ˆDØ˜ŸšÑ(Ô(Ñ(ˆHˆHàˆri   Nc                 óŠ   — |�| 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_typemapÚress        rg   r”  zParfor.get_shape_classesv  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(  ru  Úcenterry  rz  rn  rv  rw  ÚdumpÚsortedrx  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.)rz  r'  ÚgetrŸ   r   Ú	BaseTupleÚcountr   ÚPARFOR_MAX_TUPLE_SIZEr   ÚUnsupportedParforsErrorrq  )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€   rt  Úsetra  rd  rŒ  ri  r”  rŸ  r­  Ú__classcell__)r„  s   @rg   rl  rl  (  s¾   ø€ € € € € à€Jð $)Ø�#‘%”%ð0*ð 0*ð 0*ð 0*ð 0*ð 0*ð 0*ðd8ð 8ð 8ð;ð ;ð ;ðð ð ð"ð ð ð ð$Lð Lð Lð Lð(ð (ð (ð (ð (ð (ð (ri   rl  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_setuprc  s    rg   ra  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_qualnamerZ  rq  Ú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_setuprc  s    rg   rÅ  zParforDiagnostics.has_setupæ  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_parforsî  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_parforsñ  s9   € Ý# FÑ+Ô+ˆØ×Ò˜& ,Ñ/Ô/Ð/Ý˜VÑ$Ô$Ð$Ð$Ð$ri   c                 óÎ   — |                      ¦   «         D ]O\  }}|j        D ]B}t          |t          ¦  «        r+|                     |¦  «         |                      ||¦  «         ŒCŒPd S rq   )rŽ  r�  rŸ   rl  rf  rÜ  )r`  r×  rÛ  ÚlabelÚblkr�  s         rg   rÚ  zParforDiagnostics._get_parforsö  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_parforsý  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Ì   r=  )rÄ  rŽ  r¥  rŸ   Úvaluer	   ÚExprrp  r;   r9   r±  rf  )r`  ÚallocsÚpf_idÚdatar�  Úinstrã  s          rg   Úhoisted_allocationsz%ParforDiagnostics.hoisted_allocations  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 u r|                     |¦  «         Œ9g ||<   Œ?g }
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   rf  )r`  Ú_arÀ   ÚvtxÚvrm   Úpotential_rootsÚrootsÚ	not_rootsr”   rn   s              rg   Úcompute_graph_infoz$ParforDiagnostics.compute_graph_info  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   r  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   r  s         @rg   Ú	get_statszParforDiagnostics.get_stats6  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   r  z!ParforDiagnostics.reachable_nodesI  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¬   rq  rÊ  r±  Úfilenamerø  rÂ  rÁ  rŸ   Útuplerf  Úsort_pf_by_liner˜   rx  rî  r�  r×  r´   rz   rl  r'  )r`  rç  Úparfors_simpleÚpfr‚  rÊ  r  rý  Únrootsrü  ÚfrootsÚgraphsÚreported_locÚtmpr	  r  rß  r�  Úidxr•   s                       rg   r  z!ParforDiagnostics.sort_pf_by_lineU  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   )rq  rÊ  ©rm   s    rg   r8  z6ParforDiagnostics.get_parfors_simple.<locals>.<lambda>“  s
   € ¸Q¼U¼Z€ ri   ©Úkeyr   r   rˆ   r  ú.rÐ   ú z(internal parallel version)Úuserzuser defined pranger   zinternal pndindexz5Parallel for-loop #%s: is produced from %s:
    %s
 
)r½  r   rÎ  r|  rq  rŸ   r  ÚjoinÚreversedrÀ  ro   ru  )	r`  Úprint_loop_searchr  r  Ú	r_patternr‚  rq  Ú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˜	˜	à ˜Ø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   rf  r®  rï  r  rì  Úupdate)r`  r  rü  r  rý  Ú_nrootsÚlimr  rm   r  r7  Ú	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>á  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Ç  Ú r  zNo source available)r±  rq  r  rØ  rÈ  r[  ÚinspectÚ	getsourcerj   ÚOSErrorr¬   r   rÀ  rŽ  r  rf  r†  rî  rŽ   rÊ  Ú	enumerater¥  r!  Ú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 )Nr  ú
(parallel)rˆ   r5  )ro   rf  r  r!  )Úfadj_Únadj_ÚnrootÚdepthr  rª  Úfusedr•   ÚfacÚprint_gÚreportedr`  Úswords           €€€€€rg   rW  zHParforDiagnostics.print_unoptimised.<locals>.print_nest.<locals>.print_g  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   r5  rˆ   ©ro   rc   )	rQ  rR  ÚtherootrX  Ú	region_idrW  rV  r`  rY  s	      ` @€€€rg   Ú
print_nestz7ParforDiagnostics.print_unoptimised.<locals>.print_nest  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 )NrZ  r  rP  rˆ   r5  )ro   rf  r   r  r!  rc   )r¬  rç  r	  rT  r]  rª  rU  r  rV  r`  rY  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   r(  Úfr)  )rŽ   rø  rÁ  rÂ  rz   rf  r   rŽ  )r`  r?  rü  r  rý  r+  r,  r  rm   r^  r`  r]  rX  rÊ  ÚinfoÚopt_tyrç  r	  rV  rY  s   `                 @@rg   Úprint_unoptimisedz#ParforDiagnostics.print_unoptimised  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�	�	à�ð	ð 	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 )NrM  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 )
Nr  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>b  s   € Ð-DÐ-DÐ-D¸­c°!©f¬fÐ-DÐ-DÐ-Dri   ú)rU  rˆ   Ú
serialized)r   r  r!  rf  ro   rŽ   )rQ  rR  rS  rT  r  rª  rU  rV  rW  r]  rX  r`  ÚsummaryrY  s          €€€€€€€rg   rW  zFParforDiagnostics.print_optimised.<locals>.print_nest.<locals>.print_gZ  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   rZ  r  rP  r   ©rþ  rU  rl  rˆ   r5  r[  )
rQ  rR  r\  rX  r]  rW  rV  r`  rm  rY  s
      ``@€€€€rg   r^  z5ParforDiagnostics.print_optimised.<locals>.print_nestY  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 )NrZ  r  z	(parallelrh  rÇ  c                 ó,   — g | ]}t          |¦  «        ‘ŒS ra   rj  r‹  s     rg   rh   zIParforDiagnostics.print_optimised.<locals>.print_fuse.<locals>.<listcomp>|  s   € Ð!8Ð!8Ð!8¨Q¥# a¡&¤&Ð!8Ð!8Ð!8ri   r   rn  rk  r5  rˆ   )ro   r   r  r!  rŽ   rc   )r¬  rç  r	  rT  r]  rª  rU  rV  r`  rm  rY  s          €€€€rg   r`  z5ParforDiagnostics.print_optimised.<locals>.print_fuseu  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   r(  ra  r)  z5
 
Parallel region %s (loop #%s) had %s loop(s) fusedrþ  rU  rl  zE and %s loop(s) serialized as part of the larger parallel loop (#%s).r  z&Parallel structure is already optimal.)
rŽ   rø  rÁ  rÂ  rz   rf  r½  r   rŽ  ro   )r`  r?  rü  r  rý  r+  r,  r  rm   r^  r`  r]  rX  rÊ  rb  rc  rç  r	  r  rô  rª  rþ  rU  rl  rV  rm  rY  s   `                       @@@rg   Úprint_optimisedz!ParforDiagnostics.print_optimisedE  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�	�	à�ð ð 	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å  Úattrrq  ro   ÚosÚpathÚrelpathr  r'  ÚabspathÚ	linecacheÚgetlinesrÊ  r<  ÚKeyErrorÚAttributeError)r`  Úfoundrç  rè  r�  ré  rs  rª  rq  ru  r?  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 )Nr7  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 r  z
 Function rÇ  r  r   F)rˆ   rÐ   r$  r%  Tz1Report level unknown, should be one of 1, 2, 3, 4)rÐ   r$  r%  )r$  r%  r$  r%  z
 ú=z% Parallel Accelerator Optimizing: %s r7  zLooking for parallel loopsr™  z
Found %s parallel loops.rM  c                 ó   — g | ]	}|j         ‘Œ
S ra   )ru  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...
r  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 )Nr  rˆ   ©ro   )r	  rþ  rT  r  rV  Únode_msgrW  rY  s       €€€€rg   rW  zYParforDiagnostics.dump.<locals>.dump_graph_indented.<locals>.print_graph.<locals>.print_gB  sv   ø€ Ø!$ T¤ð ;ð ;˜AÝ)¨#°©+¸Ñ*;È5È5ÐRSÐRSÐRSÐU]ÐU]Ð>^Ñ*^Ñ_Ô_Ð_Ø" 1œv¨š|˜|Ø ' ¨¨Q°¸±	Ñ :Ô :Ð :øð;ð ;ri   r  rˆ   r7  rŒ  )	r	  rö  r7  rW  rV  rn   r�  Úroot_msgrY  s	      @€€€€€rg   Úprint_graphzHParforDiagnostics.dump.<locals>.dump_graph_indented.<locals>.print_graphA  s‰   øø€ ð;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð
 #ð *ð *˜Ý%°5°5¸!¸!¸!¸X¸XÐ&FÑGÔGÐGØ˜  1 aÑ(Ô(Ð(Ý% bÑ)Ô)Ð)Ð)ð*ð *ri   )rŽ   rø  )	rÀ   rŽ  r�  r�  rö  rV  rn   r`  rY  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>a  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É  rq  r¿  r'  ro   Ú
_termwidthrž  r&  rØ  r  rt  ru  rv  rw  rK  rÍ  rŽ   Úsequential_parfor_loweringrÃ  rÁ  rË  r(  r!  rÂ  r1  rc   rd  rq  r}  r…  )!r`  ÚlevelrZ  rÊ  r=  rÌ  r#  Úprint_source_listingÚprint_fusion_searchÚprint_fusion_summaryÚprint_loopnest_rewriteÚprint_pre_optimisedÚprint_post_optimisedÚprint_allocation_hoistÚprint_instruction_hoistÚprint_internalr  r§  r  ru  r‹   Ú
parfor_idsÚ	n_parforsrª  r�  ÚreportÚl1Úl2Úafter_fusionrŽ  r�  r0  rY  s!   `                               @rg   rŸ  zParforDiagnostics.dumpÝ  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`  r7  s     rg   Ú__str__zParforDiagnostics.__str__�  s!   € Ø#ˆØ	�T�$Ô#Ñ$Ô$Ñ$ˆØˆri   c                 ó
   — d}|S )Nrº  ra   r§  s     rg   rd  zParforDiagnostics.__repr__’  s   € Ø ˆØˆri   rq   )rˆ   )r~   r   r€   rj  ra  rÏ  ÚpropertyrÅ  ÚsetterrØ  rÜ  rÚ  rÍ  rê  rø  r  r  r  r&  r1  rK  rd  rq  r}  r…  rŸ  r¨  rd  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i dfd„Zd„ Zd„ ZdS )ÚPreParforPasszwPreprocessing for the Parfor pass. It mostly inlines parallel
    implementations of numpy functions if available.
    Nc	                 óœ   — || _         || _        || _        || _        || _        || _        || _        |€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   ra  zPreParforPass.__init__›  s_   € àˆŒØˆŒØ"ˆŒØ"ˆŒØ"ˆŒØˆŒàˆŒØ Ð(Ý$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)
r7   r±  r“  r±  r²  r´  r=  Ú_replace_parallel_functionsr×  r5   rc  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	#  d }Y nxY wt%          |d u¦  «          t+          j        |¦  «        j        |i |¤Žj        }t1          j        ‰j        j        j        j        ¦  «        }t6          |d<   t8          |d<   t:          |d<   t<                               |d ¦  «        }|�|j        ||j        <    ‰‰j        |‰‰|‰j        ‰j         |‰j
        ‰j!        ‰¦  «        \  }}	tE          |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“  rZ  )re   rm   r`  s     €rg   r  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Æ   r  F)Útopological_orderingrx   T)'r?   r±  r[  r9   r·  r¥  rŽ   rŸ   r	   rg  r“  rZ  r   rÑ   rÒ   Úreplace_functions_ndarrayr|   Úinsertr<   r  Úkwsr   ÚpysignatureÚbindrì  rÈ  Ú__globals__rŠ   r=  r  Úreplace_functions_checkers_mapr²  r³  r±  r3   rŽ  r~   r�  rq  )Ú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Ø+/   øøøÝ# 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r¯  rˆ   Úgetattrr’   ú	$np_g_varrÆ   ÚboolÚbool_z$np_typ_varz$dtype_attr_varz
$dtype_varra   r°  N)0rµ  Únumba.core.inline_closurecallr¼  rÀ  rŽ  Úpopr;  r�  rŸ   r	   ÚAssignÚtargetr“  rZ  rä  rå  rp  r;   r¸  rs  r   rÑ   rÒ   r’   Úscoperq  rg  r    ÚmiscÚModuler=  ÚGlobalr†  ÚStringLiteralÚConstÚfind_templaterŠ   ÚcorerR   Úget_call_typer²  Ú	functionsrÙ  ÚDTyperã  rQ   r±  rÄ  )r`  r×  rÞ  ÚinstrÚlhsrØ  Útypr’   rá  rq  Ú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   )r~   r   r€   rj  ra  r´  rº  ra   ri   rg   r­  r­  —  s_   € € € € € ðð ð #%¸Dð
ð 
ð 
ð 
ð$@ð @ð @ð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ê  r  )rp  Ú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_labelr*  r¬   r×  rð  r}  Úmetadata)r`  r±  r“  r±  r¢   r²  r³  r´  r}  r  r  s              rg   ra  zParforPassStates.__init__D  så   € ð ˆŒØˆŒØ"ˆŒØ"ˆŒØ"ˆŒØ&ˆÔØˆŒØ&ˆÔØ&Ô3ˆÔØ&Ô2ˆÔØ"-Ô"@ˆÔå,Ô:ØŒN˜DœL¨$¬,¸¼ñ
ô 
ˆÔõ 	Ô×&Ò&¥s¨7¬>×+>Ò+>Ñ+@Ô+@Ñ'AÔ'AÑBÔBÐBØˆŒ
Ø ˆŒØ˜HÐ$Ð$Ø"$ˆH�YÑÐÐð %Ð$ri   N)r~   r   r€   rj  rº  ra  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`  r  s     rg   ra  zConvertInplaceBinop.__init__a  ó   € ð 'ˆÔØˆŒˆˆ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)r  r0   rZ   Úget_equiv_setr�  rŸ   r	   rß  rà  rä  rå  rp  rq  rí  Úrhsr“  rZ  r   rÑ   rÒ   Ú_inplace_binop_to_parforÚimmutable_fnr  rf  r½  rÀ  r  )r`  r×  r  Ú
topo_orderrÞ  r£  Únew_bodyr{  rì  rí  rÕ  rq  rà  rä  Ú
target_typÚ	value_typÚ	new_instrs                    rg   r´  zConvertInplaceBinop.runj  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  r7  rˆ   zparfor from inplace_binop)!r  rá  r“  rZ  r’   r	   ÚBlockÚ	get_shapeÚ_mk_parfor_loopsr!   Ú_make_index_varrg  r    rå  ÚgetitemrQ   r±  r�  rf  rß  Úbinopr²  Úunify_pairsÚSetItemr   Únonerl  r}  rx  r   ÚDEBUG_ARRAY_OPTrc   rŸ  )r`  r{  rq  rp  rà  rä  r  rá  Úarr_typÚel_typrw  r   Ú	size_varsÚ
index_varsÚ	loopnestsÚ
body_labelÚ
body_blockry  Úindex_var_typÚ	value_varÚgetitem_callÚ
target_varÚexpr_out_varÚ
binop_exprÚunified_typeÚsetitem_noderŒ   s                              rg   r  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   ©Úoperatorr*  r  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€   rj  ra  r´  r  rE  ra   ri   rg   r
  r
  ^  sa   € € € € € ðð ðð ð ð#"ð #"ð #"ðJ>ð >ð >ð@Wð Wð Wð Wð Wri   r
  c                 óR   — t          | t          j        ¦  «        r| j        n| j        S rq   )rŸ   r	   r-  r´   ry  r  s    rg   Úget_index_varrH  Ô  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 )ÚConvertSetItemPassr  c                 ó"   — || _         g | _        dS r  r  r  s     rg   ra  zConvertSetItemPass.__init__Û  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  r*  Úmasked_assign_arrayc                 ó@   — t          | t          j        j        ¦  «        S rq   )rŸ   r   râ  Ú	SliceTyper  s    rg   r8  z(ConvertSetItemPass.run.<locals>.<lambda>  s   € ­j¸½E¼JÔ<PÑ.QÔ.Q€ ri   rˆ   r   )r›   Úslice)'r  r0   rZ   r  r�  rŸ   r	   ÚStaticSetItemr-  rq  rà  rH  rä  r“  rZ  r   rÑ   rÒ   r’   ÚBooleanrž   ÚNumberÚ_setitem_to_parforr  rf  r½  r;   r?   r±  rå  rp  r´   r'  r¦  rŽ   rÀ  Úfilterrâ  rP  )r`  r×  r  r  rÞ  r£  r  r{  rì  rq  rà  r´   rä  r  Ú	index_typr   r!  Úval_defr›   Úsliced_dimss                       rg   r´  zConvertSetItemPass.runä  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 )
r#  z$subarrÚparfor_indexr   rˆ   )Úsetitemr7  Nz	$mask_varr$  zparfor from setitem)-r  rá  r“  rZ  r’   r	   r&  rŸ   r   r¦  rP  rg  r    rå  r*  r   Ú	arraydeclÚget_array_index_typeÚresultrE  r±  rf  rß  ÚArrayCompatibler'  Úuintpr]  r!   r)  rl  r}  rx  r�  r  ÚBranchrÑ   rÒ   rQ   r-  r.  ÚJumpr   r/  rc   rŸ  )#r`  r{  rq  rà  r´   rä  r›   r  rá  r0  r1  rW  rw  r2  Ú
subarr_varr9  Ú
subarr_typÚbool_typr4  r3  Úsize_varry  r5  r6  r7  rŒ   Ú
true_blockÚ	end_labelÚ
true_labelÚ	end_blockÚmask_varÚmask_valr   r8  r>  s#                                      rg   rU  z%ConvertSetItemPass._setitem_to_parfor6  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   r@  rC  s      rg   rE  z ConvertSetItemPass._type_getitem”  rF  ri   rq   )r~   r   r€   rj  ra  r´  rU  rE  ra   ri   rg   rJ  rJ  Ø  sm   € € € € € ðð ðð ð ðP"ð P"ð P"ðd\ð \ð \ð \ð|Wð Wð Wð Wð Wri   rJ  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©rq  )rŽ   rq  r	   rg  r    r   Ú
containersÚUniTuplera  rZ  rå  Úbuild_tuplerÀ  rß  r�  rf  r   ÚUnsupportedRewriteError)
r“  rá  r3  r6  Úforce_tupleÚndimsrq  Ú	tuple_varÚ
tuple_callÚtuple_assigns
             rg   r)  r)  ™  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	   rg  r    rf  r   ra  rZ  r]  )r“  r2  rá  rq  r4  r3  rg  ry  s           rg   r(  r(  ¶  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   r  r  s     rg   ra  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)r  r0   rZ   r  r�  rŸ   r	   rß  rä  rà  r“  rZ  Ú_is_C_or_F_orderr;   Ú_is_supported_npycallÚ_numpy_to_parforr  rf  r½  rå  rp  Ú_arrayexpr_to_parfor)r`  r×  r  r  Ú
avail_varsrÞ  r£  r  r{  rì  rÕ  rí  rÖ  r!  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†  r  r“  ©r`  Úarr_namerî  s      rg   Ú_is_C_orderzConvertNumpyPass._is_C_orderò  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_orderý  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.
        r%  zarray expression {}r   rˆ   zparfor from arrayexpr)%r  rá  rq  rÕ  r“  rZ  r’   r'  r(  r	   r&  r"   r²  r±  r  r�  r!   rg  r    r)  r  Ú_arrayexpr_tree_to_irr±  r(  Úrepr_arrayexprrl  r}  r-  rQ   r   r.  rf  rx  r   r/  rc   rŸ  )r`  r{  rí  r�  r†  r  rá  rq  rÕ  r0  r1  r2  r3  r4  rw  r5  r6  r;  ry  r7  ÚpatrŒ   r>  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.
        r=  F©rÇ   ÚonesTúnumpy.random)r9   r  r±  rŸ   r†  Ú
startswithrW   )r`  rÕ  Ú	call_nameÚmod_names       rg   rƒ  z&ConvertNumpyPass._is_supported_npycallB  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 rp  )
r9   r  r±  r|   r½  rÅ  Ú_numpy_map_to_parforr   rt  rq  )r`  r{  rí  rÕ  r™  rš  r|   rÅ  s           rg   r„  z!ConvertNumpyPass._numpy_to_parforP  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 sizer%  rÇ   r   r–  z,Map of numpy.{} to parfor is not implementedú{} functionzNumPy mappingzgenerated parfor for numpy map:)+r  rá  rq  r“  rZ  r’   r'  r   r/  rc   r(  r	   r&  r"   r²  r±  r  r�  r!   rg  r    r)  ræ  rW   Ú_remove_size_argÚ_get_call_arg_typesrÞ  r[  ré  r   ÚContextÚNotImplementedErrorr(  rß  rf  r-  rQ   r   r.  rl  r}  rx  rŸ  )r`  r{  r™  rí  r|   rÅ  rÕ  r  rá  rq  r0  r1  r2  r3  r4  rw  r5  r6  r;  ry  r7  rä  Únew_arg_typsÚnew_kw_typesÚvalue_assignr>  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€   rj  ra  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   r  r  s     rg   ra  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   )r  r  r  )r  r0   rZ   r  r�  rŸ   r	   rß  rq  rà  rä  r;   r9   r±  Ú_reduce_to_parforr|   r  rf  r½  )r`  r×  r  r  rÞ  r£  r  r{  rì  rŒ   rq  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   r3  s     €rg   r  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)#r  rá  r?   r±  rZ  r;   Ú
_find_maskr“  r'  r(  ÚAssertionErrorr  r	   r&  r�  rf  rß  r!   Ú_mk_reduction_bodyr˜   rð  r¬   rg  r    rå  r*  r  rb  rl  r(  r}  r   r/  rc   rŸ  )r`  r{  rí  r|   rq  r  rá  r™  r…   Úarr_defrl  Úmask_indicesÚmask_query_resultÚmask_typr·   r2  r4  Ú
mask_indexÚacc_varrw  r5  ry  rx  rj  Úfalse_labelr6  Úmaskrm  rŒ   r3  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¿  r  r?   r±  r“  rZ  r’   r	   r&  r)  rg  r    rå  r*  rQ   r±  rf  rß  r>   rÈ  r[  rÈ  r²  r³  r×  r!   r˜   rð  r�  r  rA   rB   )r`  r™  rá  rq  r3  r…   r»  r¿  r  Úreduce_funcÚfcoder0  Úin_typr6  ry  Úindex_var_typeÚtmp_varr9  Úreduce_f_irrx  ri  rk  Ú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€   rj  ra  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   r  r  s     rg   ra  zConvertLoopPass.__init__9	  r~  ri   c                 ó¨  ‡‡:‡;‡<‡=‡>‡?‡@‡A‡B‡C— | j         ŠCt          ‰¦  «        \  }}t          ‰¦  «        }t          ‰¦  «        }t	          |‰|j        |j        ¦  «        Š=|                     ¦   «         ŠBˆBfd„‰B                     ¦   «         D ¦   «         }g }t          |d„ ¬¦  «        D �]©\  Š>}t          ‰>j        ¦  «        dk    st          ‰>j        ¦  «        dk    rŒ7t          ‰>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 Š@t7          |¦  «        D ]^\  }}t          |t           j        ¦  «        r?t          |j        t           j        ¦  «        r |j        j        d	k    r|j        j        Š@|} nŒ_‰@€J ‚|d |…         ||dz   d …         z   }t;          d‰‰>j                 i‰Cj        ¦  «        \  }}|d         }t?          ˆ@fd
„|D ¦   «         ¦  «        ŠA‰A                      ‰@¦  «         ‰|	         j!        }|
j"        }‰Cj#         $                    ‰>j        ¦  «        }t!          j%        ||¦  «        }|  &                    ‰|	         ||¦  «        |_        ˆfd„|D ¦   «         Š?tO          ¦   «         }t!          j%        ||¦  «        ‰?|<   t?          ¦   «         }|D ]"}| (                    |j        |         ¦  «        }Œ#t?          ¦   «         }‰>j        D ]}| (                    ‰=|         ¦  «        }Œ| )                    |¦  «        }| )                    ˆCfd„|D ¦   «         ¦  «        }|D ]F}‰?|         j        d         }t          |t           j*        ¦  «        r|j        ‰>j        k    r||_        ŒGˆ?ˆAfd„Š:d }d } ˆ:ˆ=ˆ>ˆCfd„}!d}"|dk    �rÕ| +                    |d         ¦  «        sJ ‚tY          |!|d         ¦  «        }#|#r|#\  }$}}%} n|d         }$t          |$t           j-        ¦  «        sJ ‚‰Cj        |$j                 }&t          |&t\          j/        ¦  «        rSt!          j-        |ta          d¦  «        |¦  «        Š;t\          j1        ‰Cj        ‰;j        <   te          ‰;d|$d¦  «        gŠB‰;gŠ<n3| 3                    | €|$n|¦  «        }'ti          ‰Cj        |'||¦  «        \  Š<ŠBt          ‰B¦  «        dk    sJ ‚‰<}(| rtk          ˆ<fd„| D ¦   «         ¦  «        Š<‰?tm          ‰?                     ¦   «         ¦  «                 })t!          j%        ||¦  «        }*to          ‰Cj        |‰<|*d¬¦  «        \  Š;}+|*j        |)j        z   },|,|)_        | r	|(d         }-n‰;}-|�tq          d¦  «        ‚�n±d}4d}5|d         }6t          |¦  «        dk    r|d         }4|d         }6t          |¦  «        dk    r¸|d         }4|d         }6	 ‰Cj>         ?                    |d         ¦  «        }5n)# t€          $ r tƒ          jB        d|
j"        ¬¦  «        ‚w xY wt          |5t           jC        ¦  «        stƒ          jB        d|
j"        ¬¦  «        ‚|5j        }5|5dk    rtƒ          jB        d|
j"        ¬¦  «        ‚t!          j-        |ta          d¦  «        |¦  «        Š;t          |4tˆ          ¦  «        r|4dk    rt\          j1        }+nt\          jE        }+d}"te          ‰;|4|6|5¦  «        gŠB|+‰Cj        ‰;j        <   tm          ‰?                     ¦   «         ¦  «        }7|‰?|7         j        z   ‰?|7         _        ˆ;fd„‰AD ¦   «         }8t�          ‰?|8¦  «         |"r|  G                    ‰?‰A‰;¦  «         t‘          ‰B|‰?|| r|-n‰;|d||f‰CjI        |¬¦	  «	        }9|9g‰‰>j                 _        ‰‰>j                 j         <                    |¦  «         ‰‰>j                 j         J                    t!          j*        t          ‰>j        ¦  «        d         |¦  «        ¦  «         | jK         J                    t™          ‰>|9d ¬!¦  «        ¦  «         |D ]"}|‰>j        k    r‰ M                    |¦  «         Œ#tœ          jO        dk    r#t¡          d"¦  «         |9 Q                    ¦   «          �ŒK�Œ«d S )#Nc                 óT   •— g | ]$}‰|         t          ‰|         j        ¦  «        f‘Œ%S ra   )rŽ   r�  )re   r  Úloopss     €rg   rh   z'ConvertLoopPass.run.<locals>.<listcomp>E	  s0   ø€ ÐLÐLÐL¸!˜˜aœ¥# e¨A¤h¤mÑ"4Ô"4Ð5ÐLÐLÐLri   c                 ó   — | d         S r  ra   )Útups    rg   r8  z%ConvertLoopPass.run.<locals>.<lambda>H	  s
   € ¸3¸q¼6€ ri   r  rˆ   r   rã  c                 ó2   •— g | ]}|‰v ¯|‰j         k    ¯|‘ŒS ra   )Úheader)re   rn   r×  r‘  s     €€rg   rh   z'ConvertLoopPass.run.<locals>.<listcomp>W	  s:   ø€ ð #Gð #Gð #G¨!Ø$%¨ K K°A¸¼Ò4DÐ4Dð %&Ø4DÐ4DÐ4Dri   r  Ú
pair_firstc              3   ó.   •K  — | ]\  }}|‰k    ¯|V — Œd S rq   ra   )re   Útrô  Ú
loop_indexs      €rg   r  z&ConvertLoopPass.run.<locals>.<genexpr>u	  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   r  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   ©rZ  r‹  s     rg   r  zCConvertLoopPass.run.<locals>.find_indexed_arrays.<locals>.<genexpr>©	  s$   è è € Ð(JÐ(J°A¨¬Ð(JÐ(JÐ(JÐ(JÐ(JÐ(Jri   ©r*  Ústatic_getitem)rì  rî  Ú
find_instsr	   rß  rŸ   rä  rg  rZ  rï  rà  r�  r®  ri  Úissubsetr<   rå  rp  rf  )	Úindicesr£  ré  ÚarrsÚexprsÚlvrÕ  rx  Ú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å  rp  rs  rä  r®  rñ  ÚexitsrZ  rÀ  r³  r“  r´  )rg  Úsize_defÚarr_varÚ	live_varsÚ
index_arrsÚindex_exprsr¶  r_  rÕ  rå  rè  r‘  r  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   r  z&ConvertLoopPass.run.<locals>.<genexpr>ñ	  sL   øè è € ð /Fð /FØ34ð 56Ð/H¨q¨q¸:Àa¼=ð /Fð /Fð /Fð /Fð /Fð /Fri   )ru  r­  r±  rÐ   r$  z,Only known step size is supported for prangerp  z/Only constant step size is supported for prangez4Only constant step size of 1 is supported for prangeFc                 ó   •— i | ]}|‰“ŒS ra   ra   )re   rô  ry  s     €rg   rÁ  z'ConvertLoopPass.run.<locals>.<dictcomp>C
  s   ø€ Ð$KÐ$KÐ$K°a Q¨	Ð$KÐ$KÐ$Kri   r   )rn  r‘  )Úold_loopr  r  zparfor from loop)Rr  r3   rN   rK   rL   ÚusemapÚdefmaprÍ  rð  r   rŽ   Úentriesré  rÀ  r�  rŸ   r	   rß  rä  rå  rp  Ú_is_parallel_loopr[  rZ  r|   Ú_get_loop_kindrÑ  r;  rà  r-   r“  r®  rï  rá  rq  rZ   r  r&  Ú_get_prange_init_blockr!   rñ  Úintersectionrc  Ú	has_shaper;   rg  r   ÚIntegerr    ra  r]  r'  r(  r  r˜   r)  r´  r8   r¬   r*  r  rb  r±  r?   rz  r   rt  ræ  r  Úintpr'   Ú_replace_loop_access_indicesrl  r}  rf  r  r½  rÞ  r   r/  rc   rŸ  )Dr`  r×  rÔ  rÓ  ÚcfgÚusedefsÚsized_loopsÚmoved_blocksrÃ   Úentryré  Úbody_labelsr|   Ú	loop_kindÚloop_replacingÚheader_bodyÚhbir�  Úli_indexÚcpsrá  rq  r{  rw  ri  ÚbodydefsÚblÚ
exit_livesrn  rn   Ú	last_instrl  r·  rï  Úunsigned_indexr_  r…   r¹  Ú
in_arr_typr2  Ú
orig_indexÚfirst_body_blockr6  r7  r�  Úorig_index_varr5  Úlabelsrj  r¼  r½  rm  r  r  rg  Úfirst_body_labelÚindex_var_maprŒ   rå  ry  r3  rè  r‘  rx  rÕ  rä  rÍ  r  sD    `                                                        @@@@@@@@@@rg   r´  zConvertLoopPass.run=	  s‘
  øøøøøøøøøøø€ ØÔ&ˆå& vÑ.Ô.‰ˆ
�AÝ% fÑ-Ô-ˆÝ" 6Ñ*Ô*ˆÝ# C¨°´ÀÄÑPÔPˆØ—	’	‘”ˆØLÐLÐLÐL¸u¿zºz¹|¼|ÐLÑLÔLˆØˆå˜kÐ/AÐ/AÐBÑBÔBð Z	&ñ Z	&‰GˆD�!Ý�4”<Ñ Ô  AÒ%Ð%­¨T¬Z©¬¸AÒ)=Ð)=ØÝ˜œÑ&Ô& 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Ð:Ð:Ð:Ø%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&ð	Z	&ð Z	&s   Ú Z,Ú,&[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_loopd
  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   )r   r7  rx   r  r  )r  )r7  r7  r   )r   r7  )r  rŽ   rx   r  rz  r   )r`  r  rÔ  r  rã  Úkinds         rg   r÷  zConvertLoopPass._get_loop_kindm
  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.
        r  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Û  r  s     rg   rØ  z9ConvertLoopPass._get_prange_init_block.<locals>.<setcomp>š
  s   € Ð>Ð>Ð>¨˜QœVÐ>Ð>Ð>ri   N)r;  r�  rŸ   r	   rß  rä  rå  rp  Ú_is_prange_initr[  rZ  rö  r"  rz   ri  rf  Ú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   r  s       rg   r  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)rZ  r   rá  s     €rg   Úunverz;ConvertLoopPass._replace_loop_access_indices.<locals>.unverÎ
  sV   ø€ Ø9Ð9Ð9Ð9Ð9Ð9ð,Ø',§¢°tÑ'<Ô'<Ô'MÐ MøØ#)Ô#9ð ,ð ,ð ,Ø'+   ð,øøøs   ‰# £2±2z Overwrite of parallel loop indexrp  T)Úlhs_only)rï  rZ  Údummy_return_in_loop_bodyr0   r®  r�  rŸ   r	   rß  rä  rg  rà  rá  Úmapr   rt  rq  rE   rF   r;   r?   r  r±  rG   Ú_replace_multi_dim_indrl  rý  rx  )r`  rx  Ú	index_setÚ	new_indexr  Úfirst_labelÚadded_indicesrn   r£  r�  r0  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
        Nrs  c                 ó*   •— g | ]}|j         ‰v r‰n|‘ŒS ra   rÛ  )re   rô  r5  r6  s     €€rg   rh   z:ConvertLoopPass._replace_multi_dim_ind.<locals>.<listcomp>  s9   ø€ ð ;ð ;ð ;Ø"#ð ,-¬6°YÐ+>Ð+>˜i˜iÀAð ;ð ;ð ;ri   )r  r<   rŸ   r“  rZ  r   ÚTuplerr  r?   r±  r	   rå  rp  rŽ  )r`  Úind_varr5  r6  r  Úind_def_nodes     ``  rg   r4  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€   rj  ra  r´  rö  r÷  rø  r  rý  r4  ra   ri   rg   rÉ  rÉ  6	  s¥   € € € € € ðð ðð ð ðe&ð e&ð e&ðN	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.
    r*  Nrs  r   rˆ   )r<   rŸ   r	   rå  rp  rä  r´   rZ  rž   r   rÑ   rÒ   r’   rS  r¦  r:   rŽ   rf  rû  r=   )r“  r±  r¶  rä  r´   r   rW  rž   Úseqrp  Úcount_constsr·  rl  Úindr¹  s                  rg   r³  r³    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   r  r*  Úfind_max_labelrc  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)rG  r´  Ústencilr   r±  r“  r±  rZ   r²  r³  r}  r´  r\  rJ  r×  r=  r|  r²  r§  r   rÉ  r  r
  r  rÏ  Úfusionr/   )r`  Ústencil_passs     rg   r´  zParforPass.runE  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.
        )r(  r“  )r`  r2  rá  rq  s       rg   r(  zParforPass._mk_parfor_loopsh  s   € õ   ¤¨i¸ÀÑDÔDÐDri   N)r~   r   r€   rj  rG  r´  r³  r(  ra   ri   rg   rD  rD  6  s_   € € € € € ðð ð:ð :ð :ð:ð :ð :ð6?ð ?ð ?ðEð Eð Eð Eð Eri   rD  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×  r4   r“  r±  r  r´  rJ  r@   Ú_definitionsr½  rZ   r³  r´  Úget_parfor_paramsrÂ  Úget_parfor_reductionsrz  r~  r  Úmaximize_fusionr/   Úfuse_parfors)r`  r¡  rÓ  r‹   r«  s        rg   r´  zParforFusionPass.runt  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Ð   r  )rŽ  r  rŽ   r�  rŸ   rl  r{  Útry_fuser  r  rÃ  rf  rÁ  ru  r  Úfuse_recursive_parfor)r`  rZ   r×  r±  r“  rÞ  r£  r{  Úfusion_happenedr  r•   r�  Ú	next_stmtÚ
fused_nodeÚfuse_reports                  rg   rW  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²  rV  r±  r“  r/   rZ   r  r²  r±  r´  rW  rµ  )r`  rŒ   r{  r±  r“  r×  Úarr_analysiss          rg   rZ  z&ParforFusionPass.fuse_recursive_parforÍ  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€   rj  r´  rW  rZ  ra   ri   rg   rO  rO  o  sP   € € € € € ðð ð3[ð 3[ð 3[ðj"ð "ð "ðH%ð %ð %ð %ð %ri   rO  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: r$  zAdding print for assignment to Ústr_varNr   úAfter fusionr‘  z0{}, function {} has {} parallel for-loop(s) #{}.zFunction {} has no Parfor.)7Úpush_call_varsr±  r×  r“  r/   r4   r±  r  r   r/  rc   r   rŽ  rá  r�  rf  rŸ   r	   rß  rq  rà  rä  rZ  rs  r   Únumber_domainÚLiteralrg  r    rå  ræ  ÚPrintrQ   r.  Úis_generatorÚfix_generator_typesÚgenerator_infor¢   r•  Úlower_parfor_sequentialr²  rT  r´  rJ  rÂ  rU  rz  r~  r  r­  r�  rÈ  rÉ  rŽ   r(  )r`  Úblock_labelr£  Ú	new_blockrá  r�  rq  rí  r  rÖ  rd  Ú	lhs_constÚ
str_assignÚ	str_printÚir_printr   r‹   r«  rZ  r¡  r¥  s                        rg   r´  zParforPreLoweringPass.runÝ  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€   rj  r´  ra   ri   rg   rb  rb  Ø  s7   € € € € € ðð ðKEð KEð KEð KEð KEri   rb  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î   r7  r$  rÐ   Úrandintr%  Ú
triangularN)r½  rÅ  rÞ  r  rŽ  rT   rS   r|   rV   rŽ   rU   rf  )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|   rf  rZ  rÅ  r  )rÕ  r“  r£  r£   r¤  rZ  s         rg   r   r   S  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ˆ   rp  rÙ  Úsqrtz$math_g_varr  ra   c              3   ó2   •K  — | ]}‰|j                  V — Œd S rq   rÛ  )re   rÀ   r“  s     €rg   r  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 'r7  ú'N)1rZ  rá  rq  rŸ   r  r	   rg  r    r‘  rf  rP   Úsupported_array_operatorsrŽ   rB  rå  r+  rA  ÚtruedivÚ_gen_np_divideÚunaryr¢   rß  rZ   Ú	MAP_TYPESÚ_find_func_varrì  rí  r?   rp  rs  r   râ  rã  r  rä  rÙ  rã  ré  rÒ   r’   Ú_gen_arrayexpr_getitemræ  r   r¡  Úresolve_value_typerä  r   rt  rÞ  )!r±  r²  r“  r±  r{  rw  r;  rÕ  Úparfor_index_tuple_varÚall_parfor_indicesr†  r1  rá  rq  Úout_irrp  Úarr_expr_argsÚarg_varsr£   Úarg_out_varÚel_typ1Úel_typ2Úfunc_typÚir_exprÚTÚfunc_var_namer  Úfunc_var_defÚ
g_math_varÚg_mathÚg_math_assignÚcall_typÚvar_typs!     `                              rg   r‘  r‘  _  s?  ø€ ð �\Ô&Ô'€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¤[°&¸'ñ)Cô )CÑ%�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|¦  «        }|                     t%          j        ¦   «         || 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á  rq  r	   rg  r    r   râ  rã  r=  rZ  rä  rß  rå  rÙ  r#   r˜  rã  ré  r   r¡  r  )Úarg1Úarg2r‡  r“  rá  rq  rï  rð  rñ  Údiv_attr_callÚattr_varÚfunc_var_typÚattr_assignÚdiv_callr�  s                  rg   r  r  Ð  sG  € ð Œ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Ñ1Ô1€LØ)€GˆHŒMÑÝ”)˜M¨8°SÑ9Ô9€KåŒw�|Š|˜H t¨T l°B¸Ñ<Ô<€HØ×)Ò)ÝŒÑÔ˜7 4¤9Ô-¨w°t´yÔ/AÐBÀBñHô H€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>ÿ  s'   ø€ ÐCÐCÐC°A�9×,Ò,¨QÑ/Ô/ÐCÐCÐCri   r   z$ravelrˆ   rˆ  )r’   rž   rŠ  r²   z$const_ind_0r  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)!rq  rZ  rž   rŽ   r'  r	   rg  rá  r    r   rÑ   rÒ   r’   r   Úgen_np_callr=  r²   r�  r  ræ  ra  rß  rf  r&  rq  rr  r"  rz   rÀ  rå  rs  r*  rQ   ) r{  rý   r…  r†  r1  r±  r²  r“  rw  r‡  rq  ry  r–  rv  Únum_indicesr2  Úsize_constsÚ	ravel_varÚ	ravel_typÚstmtsÚ
const_nodeÚ	const_varÚconst_assignÚ
ind_offsetrw  r3  r•   rg  Ú
size_constrx  ry  rŽ  s    `                               rg   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 foundrp  )rŸ   rR   Ú
typing_keyr   rt  )r“  r[  r†  rq  rô  rÔ  s         rg   r‚  r‚  6  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   r  r*  rF  r×  ÚnextÚiterrî  rá  rŽ  Ú_lower_parfor_sequential_blockr2   r/   r4   )
r²  r±  r“  r±  r  Úparfor_foundrÒ  rá  rn  r£  s
             rg   rm  rm  A  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 )Nr  Trˆ   éþÿÿÿr   r²  )Ú_find_first_parforr�  rw  rq  r	   r&  r!   rf  rc  rJ   rŽ   rv  rz   r$   r  r  r  rà  r%   r_  ÚfalsebrÚtruebrr¬   rx  rð  r˜   rŽ  rµ  )rn  r£  rÒ  r“  r±  r¶  rá  r•   ré  rq  Ú
prev_blockÚ
init_labelrv  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µ  U  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 ©Nr  )r;  rŸ   rl  rm  ©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®  rK   r0   Ú_find_parforsr�  r	   r&  rá  rq  rô  Úget_parfor_params_innerÚ#_combine_params_races_for_ssa_namesrn  rz  rï  ru  rf  )r×  Úoptions_fusionrÁ  r   r‹   Úpre_defsrÓ  Úall_defsr  rÞ  r£  r•   rŒ   Údummy_blockÚbefore_defsrz  s                   rg   rT  rT  £  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   )r-  r.  r	   r/  )r  rá  s    €rg   Ú	unversionz6_combine_params_races_for_ssa_names.<locals>.unversionË  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   r  z6_combine_params_races_for_ssa_names.<locals>.<genexpr>Ö  s0   øè è € Ð:Ð: rˆyˆy˜‰}Œ} Ò"Ð:Ð:Ð:Ð:Ð:Ð:ri   )r®  rÀ  r3  r&  Údiscard)rá  rz  rn  Ú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   re  r‘  z2{}, parallel for-loop {} has nested Parfor(s) #{}.rˆ   )r²  rN   rK   rL   ró  rô  rT  rŽ   r   r�  rc   r(  ru  rÀ  rµ  r   rð  )rŒ   rÎ  rÍ  rÁ  r×  rþ  rÿ  rè  r   rÓ  r¡  r¥  Úkeylistrw  Úfirst_non_init_blockrÑ  rz  s                    rg   rË  rË  Þ  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   )r;  rŸ   rl  rÈ  s      rg   rÊ  rÊ  ø  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 )Nrs  c                 ó   — g | ]	}|j         ‘Œ
S ra   rÛ  r‹  s     rg   rh   z&_is_indirect_index.<locals>.<listcomp>  s   € Ð,Ð,Ð,�qˆAŒFÐ,Ð,Ð,ri   c                 ó   — g | ]	}|j         ‘Œ
S ra   rÛ  r‹  s     rg   rh   z&_is_indirect_index.<locals>.<listcomp>  s   € Ð0NÐ0NÐ0N¸A°´Ð0NÐ0NÐ0Nri   TF)r;   r?   rZ  rŸ   r	   rå  rp  rŽ  )r±  r´   Únest_indicesÚ	index_defs       rg   Ú_is_indirect_indexrä  þ  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	   rR  r-  rH  rg  rZ  rä  rï  rà  rß  rä  rå  rp  r´   rl  Ú,get_array_indexed_with_parfor_index_internalrx  rî  )rx  r´   Úret_indexedÚret_not_indexedrâ  r±  rß  r�  Úsetarray_indexÚgetarray_indexÚgetarray_names              rg   ræ  ræ    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æ  )rx  r´   râ  r±  rç  rè  s         rg   Ú#get_array_indexed_with_parfor_indexrí  2  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¬   rx  rð  rî  r�  rŸ   r	   rR  r-  rH  rZ  ry  rf  rà  rÀ  r®  r   )rŒ   Úparfor_paramsÚ
last_labelÚoutputsrß  r�  s         rg   Úget_parfor_outputsrò  B  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Û  r  s     rg   rh   z)get_parfor_reductions.<locals>.<listcomp>€  s   € Ð HÐ HÐ H¨A ¤Ð HÐ HÐ Hri   rô  )r   rÀ  r²  r0   rµ  r"  rx  r�  rŸ   r	   rß  rà  rZ  rä  rg  rå  ri  r  rì  rí  rf  rl  rU  rŽ  r   Úget_reduce_nodesÚ%check_conflicting_reduction_operatorsr;   Úget_reduction_initró  )r±  rŒ   rï  r±  Ú
reductionsÚreduce_varnamesÚ
param_usesÚparam_nodesÚvar_to_paramr×  r  rÞ  r�  rí  r  Ú	cur_paramÚ	used_varsrô  Ústmt_cpÚparamÚ
param_namerõ  Úgri_outr·   rö  s                            rg   rU  rU  [  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å  rp  Úfnr.  r   rt  rq  )r  Ú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k    ¦  «         |j	        t          j        k    s|j	        t          j        k    r	d|j	        fS |j	        t          j        k    s|j	        t          j        k    r	d|j	        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å  r  s    rg   r8  z$get_reduction_init.<locals>.<lambda>È  s   € ¥Z°´½¼Ñ%AÔ%A€ ri   r  r  r   ©NN)r<   rŽ   rÀ  rV  rä  rŸ   r	   rå  rp  r	  rA  ÚiaddÚisubÚimulÚitruediv)r
  Úacc_exprs     rg   rü  rü  À  sÀ   € õ
 �C�‰JŒJ˜!ŠOÑÔÐõ •FÐAÐAÀ5ÑIÔIÑJÔJÈ2ÔNÔT€HÝ�J�x¥¤Ñ)Ô)ÐJ¨h¬k¸?Ò.JÑKÔKÐKØ„{•h”mÒ#Ð# x¤{µ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  r+  zÑParallel floordiv reductions are not supported. If all divisors are integers then a floordiv reduction can in some cases be parallelized as a multiply reduction followed by a floordiv of the resulting product.rã  ))r¬   r�   )r˜   r�   )r   únumba.np.npdatetime_helpers)r   r  TF)rp  r	  rA  Ú	ifloordivÚfloordivr   ÚNumbaValueErrorrq  r  r  r  r  rï  ÚsubÚmulr~  r;   r9   )rm   r±  ÚsuppsrË  s       rg   Úsupported_reductionr  Ñ  s×   € Ø„tˆÒÐ !¤$¨'¢/ /ØŒ4•8Ô%Ò%Ð%¨¬µÔ1BÒ)BÐ)BÝÔ(ð +7ð :;¼ñ	@ô @ð @õ
 ”Ý”Ý”ÝÔ"Ý”Ý”Ý”ÝÔ!ð#ˆð Œt�uˆ}ÐØ„tˆv‚~€~Ý�¨°Ñ3Ô3ˆØð 
ð 
ð 
ð �4Øˆ5ri   c                 óþ  ‡‡‡— d}i Šdˆˆfd„	Š| j         Š| j        }t          |¦  «        D �]Ï\  }}|j        }|j        }|‰|j         <   t          |t          j        ¦  «        r|j         ‰v r ‰|¦  «        }t          |t          j        ¦  «        �rht          ˆfd„| 
                    ¦   «         D ¦   «         ¦  «        }	‰|	v �r6|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 ‰|¦  «        S |s|€| n|S rq   )r¥  rZ  rŸ   r	   rg  )rý   Úvaronlyr”   ÚdefsÚlookups      €€rg   r"  z get_reduce_nodes.<locals>.lookupö  sM   ø€ Ø�hŠh�s”x Ñ&Ô&ˆÝ�c�2œ6Ñ"Ô"ð 	<Ø�6˜#‘;”;Ðà"Ð; c k�3�3¸Ð;ri   c              3   ó:   •K  — | ]} ‰|d ¦  «        j         V — ŒdS )TNrÛ  )re   rô  r"  s     €rg   r  z#get_reduce_nodes.<locals>.<genexpr>  s0   øè è € ÐHÐH°1˜&˜&  D™/œ/Ô.ÐHÐHÐHÐHÐHÐHri   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   r"  s     €rg   rh   z$get_reduce_nodes.<locals>.<listcomp>  s*   ø€ ÐPÐPÐP°q˜!œ& & &¨¨D¡/¤/Ð2ÐPÐPÐPri   c                 ó0   •— g | ]\  }}|j         ‰k    ¯|‘ŒS ra   rÛ  )re   rm   rf   rZ  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   r%  )rZ  r.  r;  rà  rä  rŸ   r	   rg  rå  r®  ri  rŽ   rß  r'  r  Úget_expr_argsr½  rá  rq  r(   )Úreduction_noder
  r±  rõ  r.  r•   r�  rí  r  Úin_varsr|   Únon_red_argsÚreplace_dictr!  r"  rZ  s                @@@rg   rú  rú  í  sm  øøø€ ð €LØ€Dð<ð <ð <ð <ð <ð <ð <ð Ô€DØ%Ô6ÐÝ˜UÑ#Ô#ð !ñ !‰ˆˆ4ØŒkˆØŒjˆØˆˆSŒX‰Ý�c�2œ6Ñ"Ô"ð 	 s¤x°4Ð'7Ð'7Ø�&˜‘+”+ˆCÝ�c�2œ7Ñ#Ô#ñ 	ÝÐHÐHÐHÐH¸¿º¹¼ÐHÑHÔHÑHÔHˆGØ�wˆ‰ð
 ˜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àPÐPÐPÐP½MÈ#Ñ<NÔ<NÐPÑPÔP�Ø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
    )r+  r  rã  c                 ó   — g | ]}|‘ŒS ra   ra   r  s     rg   rh   z!get_expr_args.<locals>.<listcomp>)  s   € Ð%Ð%Ð%�a�Ð%Ð%Ð%ri   zget arguments for expression {})rp  rí  r  r|   r¢  r(  )rÕ  s    rg   r(  r(  "  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   rI  rˆ   )r|  rz   rŽ   rŸ   r	   rg  r*   )rŒ   ÚcallbackÚcbdatar‚  Úleft_lengthsr•   Úright_lengthss          rg   Úvisit_parfor_pattern_varsr4  ,  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: r  )r   r/  rc   r   rŽ  rv  r*   r_  rŸ   r  r	   rg  r  r  r)   rw  r4  rx  )rŒ   r0  r1  rn   s       rg   Úvisit_vars_parforr6  ;  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	   rg  rZ  ©re   rn   s     rg   rØ  zparfor_defs.<locals>.<setcomp>v  óD   € ð ð ð Øµ:ØŒG•R”Vñ4ô 4ðØ	ŒŒðð ð ri   c                 ód   — h | ]-}t          |j        t          j        ¦  «        ¯!|j        j        ’Œ.S ra   ©rŸ   r  r	   rg  rZ  r:  s     rg   rØ  zparfor_defs.<locals>.<setcomp>y  óD   € ð ð ð Øµ*ØŒF•B”Fñ3ô 3ðØ	ŒŒðð ð ri   c                 ód   — h | ]-}t          |j        t          j        ¦  «        ¯!|j        j        ’Œ.S ra   ©rŸ   r  r	   rg  rZ  r:  s     rg   rØ  zparfor_defs.<locals>.<setcomp>|  r>  ri   )ró  rô  )r®  r²  rK   rN   r¬   rð  rµ  r  Ú
dominatorsrÍ  rî  r�  r*  rv  Úget_parfor_pattern_varsr   Ú_use_defs_result)rŒ   Úuse_setÚdef_setr×  Úusesr!  rþ  rð  r  Údefinitely_executedr‘  rÞ  Ú	loop_varss                rg   Úparfor_defsrI  Q  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_allocarM  ˆ  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   r9  r:  s     rg   rØ  z%parfor_insert_dels.<locals>.<setcomp>£  r;  ri   c                 ód   — h | ]-}t          |j        t          j        ¦  «        ¯!|j        j        ’Œ.S ra   r=  r:  s     rg   rØ  z%parfor_insert_dels.<locals>.<setcomp>¦  r>  ri   c                 ód   — h | ]-}t          |j        t          j        ¦  «        ¯!|j        j        ’Œ.S ra   r@  r:  s     rg   rØ  z%parfor_insert_dels.<locals>.<setcomp>©  r>  ri   c                 ó&   — h | ]}|j         j        ’ŒS ra   ©r_  rZ  r:  s     rg   rØ  z%parfor_insert_dels.<locals>.<setcomp>¬  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   ra  z0parfor_insert_dels.<locals>.DummyFuncIR.__init__½  s   € Ø ˆDŒKˆKˆKri   N)r~   r   r€   ra  ra   ri   rg   ÚDummyFuncIRrU  »  s#   € € € € € ð	!ð 	!ð 	!ð 	!ð 	!ri   rW  )r²  rN   rK   rL   ró  rô  rM   rv  r®  rð  r  ÚescapingÚobjectr   ÚPostProcessorÚ_patch_var_delsrµ  )rŒ   Úcurr_dead_setr×  rþ  rÿ  rè  Údead_maprH  Údead_setrÞ  rW  Ú	post_procs               rg   Úparfor_insert_delsr`  ˜  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)r3   rH   Ú	arg_namesrî  Úmaximize_fusion_inner)
r±  r×  r“  rQ  rÔ  rÓ  Ú	alias_mapÚarg_aliasesr£  Úorder_changeds
             rg   rV  rV  É  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Ô  rd  re  rQ  rf  r•   r�  r\  Úcan_reorders              rg   rc  rc  á  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_setrd  re  Úretr•   s        rg   Úexpand_aliasesrm  õ  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Û  r  s     rg   rØ  z%_can_reorder_stmts.<locals>.<setcomp>  s   € Ð'IÐ'IÐ'I°1¨¬Ð'IÐ'IÐ'Iri   c                 ó   — h | ]	}|j         ’Œ
S ra   rÛ  r  s     rg   rØ  z%_can_reorder_stmts.<locals>.<setcomp>  s   € Ð'NÐ'NÐ'N°1¨¬Ð'NÐ'NÐ'Nri   r   TF)rŸ   rl  r	   ri  rß  r6   rä  r®  r;   Úis_assert_equivrm  ri  Úget_parfor_writesr1   rŽ   )
r�  r\  r±  rÔ  rd  re  Ústmt_accessesÚstmt_writesÚnext_accessesÚnext_writess
             rg   rh  rh  ÿ  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 )NrX   )r9   )r±  rÕ  r>  rš  s       rg   rq  rq    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Ÿ   rl  r®  rx  rì  rw  rî  r�  r*  r1   rr  )rŒ   Úwritesr×  r£  r�  s        rg   rr  rr  !  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 
r5  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_equivK  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	   rg  rZ  )rô  Úuser_varnamer  s     €rg   Úget_user_varnamez"try_fuse.<locals>.get_user_varnameN  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) != rk  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   r  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€  rz  ru  rŽ   rv  rz   r  r  r  r@   r×  rS  Úhas_cross_iter_deprK   rx  r®  rô  rî  rr  r~  rw  ró  rù  rí  ry  rZ  rŒ  r&  Úfuse_parfors_inner) r{  Úparfor1Úparfor2r  r±  r“  r¢  rª  rƒ  r£  r¤  rv  r€  r„  r•   Únest1Únest2Úp1_cross_depÚp1_ipÚp1_iaÚ	p1_non_iaÚp2_cross_depÚp1_body_usedefsÚp1_body_defsr!  Ú
p2_usedefsÚp2_usesrF  ÚoverlaprÓ  Ú
unsafe_varr†  s    `  ` `                         @rg   rY  rY  /  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   r  z%fuse_parfors_inner.<locals>.<genexpr>½  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 #{}.)rw  r�  r  r˜   rx  rð  r¬   r*  rÞ  rŽ   rv  ry  rZ  rz   r_  r'   r²  r2   rµ  r®  rî  Úremove_duplicate_definitionsr|  r   r�  rc   r(  ru  rz  )rŠ  r‹  Úparfor2_first_labelÚparfor2_first_blockÚparfor1_first_labelÚparfor1_last_labelrv  Ú
index_dictr•   r×  Únamesetrª  r¢  s                rg   r‰  r‰     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à  rZ  rï  rf  )	r×  r¢  rÞ  r£  r�  r  Údefinedré  rZ  s	            rg   rœ  rœ  Ë  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   rS  r:  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>Z  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   Tr%  ©F)rŸ   r	   rg  rZ  r   r¦  r;   r:   Ú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_indexG  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Ÿ   rZ  r   rÑ   rÒ   )re   rm   r“  s     €rg   rh   z&has_cross_iter_dep.<locals>.<listcomp>·  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>¼  s   € ÐGÐGÐG¨1 ¤ÐGÐGÐGri   F)rv  r®  rx  rî  r�  rŸ   r	   r-  rR  rà  rZ  r   rÑ   rÒ   r´   rß  rä  rg  rï  rå  rp  r&  ri  Ú
isdisjoint)rŒ   r±  r“  rª  r«  r¬  r±  rº  rÁ   r�  rp  Ú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   r/  rc   )rÃ   s    rg   r‡  r‡  É  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   rI  rˆ   )r®  r|  rŸ   r	   rg  rï  rZ  )rŒ   Úoutr‚  r2  r3  rô  s         rg   rB  rB  Í  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   r*  c              3   ó$   K  — | ]}|j         V — Œd S rq   rÛ  r  s     rg   r  z%remove_dead_parfor.<locals>.<genexpr>ù  s$   è è € Ð<Ð< a˜1œ6Ð<Ð<Ð<Ð<Ð<Ð<ri   Úparfors_dummyr  c                 ó   — h | ]	}|j         ’Œ
S ra   rÛ  r  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Û  r  s     rg   rØ  z%remove_dead_parfor.<locals>.<setcomp>&  s   € Ð:Ð:Ð: A˜œÐ:Ð:Ð:ri   )*r2  rx  r0   Ú_update_parfor_get_setitemsr�  ry  r®  rð  rŸ   r	   rß  rä  rå  rp  r´   rZ  ri  rÞ  rì  r¬   Ú_add_liveness_return_blockrc  ÚLocrf  rN   rK   rL   ró  rô  rŽ  Ú
terminatorÚ
successorsr"  rR  r-  rH  rà  r   Úremove_dead_parfor_recursiverŽ   rw  rî  )#rŒ   ÚlivesÚlives_n_aliasesre  rd  r±  r“  r  r7  Úfirst_block_saved_valuesÚ
saved_arrsrn   r�  ÚvarnamesÚrm_arrsrÀ   r£  Úsaved_valuesr×  rð  Úreturn_labelrw  Újumprþ  rÿ  rè  Ú	alias_setrÞ  r  Ú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
    Nr*  )rŸ   r	   rR  r-  rH  rZ  rà  r¥  rÞ  rä  rß  rå  rp  r´   rg  ri  )	Ú
block_bodyry  rd  rÓ  rÍ  r�  Úwr  rô  s	            rg   rÇ  rÇ  A  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Ä  r  N)rx  rì  r˜   rð  r¬   rÈ  rá  r	   rg  r    rÉ  r   ÚbooleanrZ  rb  r�  rf  rw  rc  r+   rÞ  )rŒ   rÍ  re  rd  r±  r“  r×  r  rð  rÔ  rw  rá  Ú
branchcondÚbranchs                 rg   rÌ  rÌ  e  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	   rg  )re   rô  rq  rá  s     €€rg   rh   z._add_liveness_return_block.<locals>.<listcomp>œ  s'   ø€ Ð6Ð6Ð6¨1•”˜˜q #Ñ&Ô&Ð6Ð6Ð6ri   )r¬   rð  rq  rá  r	   r&  rg  r    r   rq  rr  ra  rZ  rå  rs  r�  rf  rß  ÚReturn)
r×  rÍ  r“  rð  rÔ  rw  rì  rx  rq  rá  s
           @@rg   rÈ  rÈ  �  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   rH   rµ  )rŒ   r|   r“  r±  rd  re  r×  s          rg   Úfind_potential_aliases_parforrè  £  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Ä  r  ú$const)rî  r�  rŸ   rl  rx  r¬   rð  rá  r	   rÉ  rg  r    rf  rß  ræ  ræ  r5   rÞ  rR  )	r×  r¡  r£  r�  rŒ   Ú
last_blockrá  rq  Úconsts	            rg   rR  rR  ¬  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   r  )rx  rì  r˜   rð  rw  r�  rf  r	   rc  rq  rî  rŽ   Úis_terminator)rŒ   rš  r×  r£  s       rg   r²  r²  Ä  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.
    Nr  )r˜   rð  rÞ  rx  rŸ   rw  r�  r	   rc  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   r7  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µ  rx  rð  r¬   r   r/  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   rI  rˆ   Údummyr  N)r;  r|  r(   rv  r  r  r  r²  rŽ  rf  r	   rß  rÉ  r�  r,   r.   rµ  rŽ   )rŒ   Úvar_dictÚname_var_tabler“  r±  Úsave_copiesr•   r‚  rn   r×  Úassign_listÚlhs_namer  rô  rõ  s                  rg   Úapply_copies_parforr    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ä  rZ  rï  rå  rp  )r�  r  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Ÿ   rl  rw  rx  rì  rf  rf  ri  Ú_get_saved_call_nodesrZ  rŽ   rŽ  rI   )r×  r  r  r“  r  r£  r  Úrename_dictr�  r  rÃ   Úpblocksrô  r  Útemp_blocksr  s    ``            @rg   rf  rf  .  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ß  rg  rà  rá  r    rq  rì  rí  rä  rf  rï  rZ  )ÚobjÚvar_baser
  r  r
  Úrenamed_varÚrenamed_assigns          rg   Úrename_global_or_getattrz7_get_saved_call_nodes.<locals>.rename_global_or_getattrp  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ä  rZ  r   )Úfnamer  r  r  r
  r
  r  s          rg   r	  r	  f  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({}({}))r  z({})c                 ó,   — g | ]}t          |¦  «        ‘ŒS ra   )r’  r‹  s     rg   rh   z"repr_arrayexpr.<locals>.<listcomp>—  s    € Ð*MÐ*MÐ*MÀ!­N¸1Ñ,=Ô,=Ð*MÐ*MÐ*Mri   ú$z'%s' (temporary variable))rŸ   r  r†  Úhasattrr~   rŽ   r(  r’  r!  rŠ   rè  r	   rg  rZ  r˜  ræ  r‡  rä  )r�  Úoprr|   rZ  s       rg   r’  r’  ‡  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_varsrf  r  Ústate_types)rl  r¢   r“  Únew_state_typesrô  s        rg   rk  rk  £  sK   € ð €OØÔ&ð +ð +ˆØ×Ò˜w qœzÑ*Ô*Ð*Ð*Ý# OÑ4Ô4€KÔØ
€Fri   c                 ó~   — |€i }|€i }t          | ¦  «        }t          |||¦  «        \  }}t          | ¦  «         ||fS rq   )r²  r3   rµ  )rŒ   rÔ  Úreverse_call_tabler×  s       rg   Úget_parfor_call_tabler!  ®  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_tabler%  ½  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)  É  sC   € ØÐÝ‘5”5ˆÝ Ñ'Ô'€FÝÔ*¨6°8Ñ<Ô<€HÝ˜Ñ Ô Ð Ø€Ori   c                 ó¤   — t          | ¦  «        }t          ||¦  «        }||         |d<   |                     |¦  «         t          | |¦  «         d S r°   )r²  r8   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   rF  rµ  )rŒ   r×  Ú	max_labels      rg   Úparfor_find_max_labelr.  â  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Š  r:  s     rg   rh   z$parfor_typeinfer.<locals>.<listcomp>î  s   € Ð>Ð>Ð> q�!Ô"Ð>Ð>Ð>ri   c           	      óf   •— g | ]-}t          j        t          j        d ‰d¬¦  «        |‰¦  «        ‘Œ.S )rˆ   F)rq  Úuse_literal_type)r	   rß  ræ  )re   rô  rq  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²  rv  r˜   rð  rq  r�  Úbuild_constraintrµ  )	rŒ   ÚtypeinfererÚsave_blocksr×  r3  Úfirst_blockÚindex_assignsÚsave_first_block_bodyrq  s	           @rg   Úparfor_typeinferr9  ë  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@   rx  rw  )rŒ   Údefinitionss     rg   Úbuild_parfor_definitionsr<     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Ä  r  N)r¬   rð  rá  r	   rg  r    rÉ  r�  rf  ræ  rÞ  )rx  rð  rá  rì  s       rg   r2  r2    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 )Nr$  zlen(args) != 3rˆ   )rŽ   r   ÚNumbaAssertionErrorrŸ   r   rÒ   rQ   r’   )r`  r|   rÅ  s      rg   ÚgenericzReduceInfer.generic  sd   € ØˆˆˆÝˆt‰9Œ9˜Š>ˆ>ÝÔ,Ð-=Ñ>Ô>Ð>Ý˜$˜qœ'¥5¤;Ñ/Ô/Ð/Ð/Ð/Ý˜˜aœœÐ.¨Ð.Ð.Ð.Ð.ri   N)r~   r   r€   rB  ra   ri   rg   r?  r?    s#   € € € € € ð/ð /ð /ð /ð /ri   r?  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_supportrE  %  s1   € õ Ôð 2ðˆåÔ,¨SÑ1Ô1Ð1ð2ð 2ri   r³  )NNNNNr  r%  )NNNrq   (  rj  r   Úpytypesrœ  r  rt  Útextwraprì  r8  rx  Ú	functoolsr   Úcollectionsr   r   r   Ú
contextlibr   rA  Údataclassesr   Úllvmliter	   ÚlirÚnumba.core.imputilsr
   Únumba.core.irrŠ   r,  r   r   r   r   r   r   r   r   r   r   r   Únumba.np.npdatetime_helpersr   r   Únumba.np.numpy_supportr   r   Únumba.core.typing.templatesr   r   Únumba.stencils.stencilparforr   Únumba.core.extendingr   r   Únumba.core.ir_utilsr    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   Únumba.core.analysisrK   rL   rM   rN   Únumba.core.controlflowrO   Únumba.core.typingrP   rQ   Únumba.core.types.functionsrR   Únumba.parfors.array_analysisrS   rT   rU   rV   rW   rX   rY   r=  rÆ   Únumba.parforsrZ   Únumba.cpython.builtinsÚnumba.stencilsr[   r”  ÚTextWrapperrk   ro   r•  rr   rv   rY  rx   r¤   r®   rº   r¾   rÄ   rÊ   rÎ   rÕ   rà   rè   rï   rú   rÿ   r)  r4  r¶  rN  rÃ  r©   r�   r±   r½   rY  rÉ  r]  rå  ÚStmtrl  r¸  Úarray_analysis_extensionsrº  r­  rç  r  r
  rH  rJ  r)  r(  r|  r§  rÉ  r³  rD  rO  rb  rŸ  r   r‘  r  rƒ  r‚  rm  rµ  r¹  rT  rÌ  rË  rÊ  rä  ræ  rí  rò  ró  rU  rû  rü  r  rú  r(  r4  r6  Úvisit_vars_extensionsrI  Úir_extension_usedefsrM  Úir_extension_use_allocar`  Úir_extension_insert_delsrV  rc  rm  rh  rq  rr  rz  rY  r‰  rœ  rˆ  r‡  rB  rÜ  rÇ  Úremove_dead_extensionsrÌ  rÈ  rè  Úalias_analysis_extensionsrR  r²  rµ  rù  Úcopy_propagate_extensionsr  Úapply_copy_propagate_extensionsrf  r	  r’  rk  r!  Úcall_table_extensionsr%  Útuple_table_extensionsr)  Úarray_accesses_extensionsr+  Úadd_offset_to_labels_extensionsr.  Úfind_max_label_extensionsr9  Útypeinfer_extensionsr<  Úbuild_defs_extensionsr2  r?  rE  ra   ri   rg   ú<module>rp     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Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @ð,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð\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ñ ô ð ð ð  ð  ðDð ð ð@	ð 	ð 	ð	ð 	ð 	ð	ð 	ð 	ðð ð ð"ð ð ð
'ð 
'ð 
'ðð ð ð,ð ð ð.ð ð ð.ð ð ð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ñ ô ð ð:I(ð I(ð I(ð I(ð I(ˆRŒW�b”gñ I(ô I(ð I(ðXð ð ð  4C€Ô (¨Ñ 0ðNð Nð Nð Nð N˜ñ Nô Nð Nðba"ð a"ð a"ð a"ð a"�Fñ a"ô a"ð a"ðFð ð ð%ð %ð %ð %ð %ñ %ô %ð %ð<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L;ð L;ð L;ð L;ð L;ñ L;ô L;ð L;ð^.ð .ð .ð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ð&ð ð ð"ð ð ð83ð 3ð 3ðj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€ðn0ð n0ð n0ðb(ð (ð (ð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   