Ë
    Ž\;j
È  ã                   óÎ  — 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	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Zd dlZd dlZd dlmZmZmZ d dlmZmZmZmZ d dlmZ d dlmZ d dl m!Z! d dl"m#Z# d	d
l$m%Z% d	dl&m'Z' d	dl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 g Z3dZ4dZ5dZ6dZ7dZ8da9dZ:dZ;dZ<dZ=dZ>dZ?dZ@dZAdZBdZCdZDdZEdZFd ZGd!ZHd"ZId#ZJd$ZKd%ZLd&ZMejœ                  jž                  j                   ejœ                  jž                  j¢                  ejœ                  jž                  j¤                  ejœ                  jž                  j¦                  gZT G d'„ d(e#jª                  «      ZVd)d*d+d,d-d.d/d0œZWdjd1„ZXd2„ ZY G d3„ d4«      ZZ G d5„ d6e[«      Z\d7„ Z]d8„ Z^d9„ Z_d:„ Z`dkd;„Zad<hZbd=„ Zcdld>„Zdd?„ Zed@„ ZfdA„ ZgdB„ ZhdC„ ZidD„ Zjd	gdEfdF„ZkdG„ Zl e#jÚ                  «       dHfdI„ZndJ„ ZodK„ ZpdL„ ZqdldM„ZrdN„ ZsdO„ ZtdldP„ZudQ„ ZvdR„ Zw G dS„ dTe#jª                  «      ZxdU„ ZydV„ ZzdW„ Z{dX„ Z| G dY„ dZ«      Z} G d[„ d\e#jª                  «      Z~d]„ Zd^„ Z€d_„ Z� G d`„ da«      Z‚db„ Zƒdc„ Z„dd„ Z…de„ Z†dkdf„Z‡e!dg„ «       Zˆdh„ Z‰e!di„ «       ZŠy)mé    N)ÚSourceFileLoader)ÚbaseÚ	get_flagsÚ	set_flags)ÚbackwardÚcoreÚ	frameworkÚunique_name)Úconvert_dtype)ÚLayerHelper)Úsignature_safe_contextmanager)Úgasté   )Úast_to_source_code)ÚStaticAnalysisVisitor)
ÚDYGRAPH_MODULE_PREFIXÚDYGRAPH_TO_STATIC_MODULE_PREFIXÚPADDLE_MODULE_PREFIXÚNodeVarTypeÚ_is_api_in_module_helperÚindex_in_listÚis_api_in_moduleÚis_dygraph_apiÚis_numpy_apiÚis_paddle_apiÚget_argsÚset_argsÚ__already_d2sÚ__argsz1Original information of source code for ast node.TÚ__for_loop_var_indexÚ__for_loop_iter_tupleÚ__for_loop_iter_targetÚ__for_loop_iter_iteratorÚ__for_loop_iter_tuple_indexÚ__for_loop_var_lenÚ__for_loop_iter_varÚ__for_loop_iter_zipz[a-zA-Z0-9_]+z[a-zA-Z0-9_]+\.Ú__no_value_return_vargº7Àv-ä–EÚtrue_fnÚfalse_fnÚwhile_conditionÚ
while_bodyÚfor_loop_conditionÚfor_loop_bodyzgrad/z@GRADc                   ó   — e Zd ZdZd„ Zd„ Zy)ÚBaseNodeVisitorzª
    Implement customized NodeVisitor inherited from gast.NodeVisitor.
    Ancestor nodes are traced to easily support more operations of currently
    visited node.
    c                 ó   — g | _         y ©N)Úancestor_nodes©Úselfs    úcG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/jit/dy2static/utils.pyÚ__init__zBaseNodeVisitor.__init__n   s
   € Ø ˆÕó    c                 óà   — | j                   j                  |«       d|j                  j                  z   }t	        | || j
                  «      } ||«      }| j                   j                  «        |S )zVisit a node.Úvisit_)r3   ÚappendÚ	__class__Ú__name__ÚgetattrÚgeneric_visitÚpop)r5   ÚnodeÚmethodÚvisitorÚrets        r6   ÚvisitzBaseNodeVisitor.visitq   s^   € à×Ñ×"Ñ" 4Ô(à˜DŸN™N×3Ñ3Ñ3ˆÜ˜$ ¨×(:Ñ(:Ó;ˆÙ�d‹mˆØ×Ñ×ÑÔ!Øˆ
r8   N)r=   Ú
__module__Ú__qualname__Ú__doc__r7   rE   © r8   r6   r0   r0   g   s   „ ñò!ór8   r0   Úcosine_decayÚexponential_decayÚinverse_time_decayÚnatural_exp_decayÚ
noam_decayÚpiecewise_decayÚpolynomial_decay)ÚCosineDecayÚExponentialDecayÚInverseTimeDecayÚNaturalExpDecayÚ	NoamDecayÚPiecewiseDecayÚPolynomialDecayc           
      óü   — t        di t        «       ¤Ž}t        |«      }t        t	        |«      «      D ]  }||   �Œ	d||<   Œ |j                  | ||t        j                  j                  j                  d|dd¬«      S )a  
    This function creates a Tensor on the global block. The created Tensor
    doesn't check the dtype and the shape of feed data because dygraph input
    data can be various-length. This API is used in translating dygraph into
    static graph.

    Note:
        The default :code:`stop_gradient` attribute of the Tensor created by
        this API is true, which means the gradient won't be passed backward
        through the data Tensor. Set :code:`var.stop_gradient = False` If
        user would like to pass backward gradient.

    Args:
       name (str): The name/alias of the Tensor, see :ref:`api_guide_Name`
           for more details.
       shape (list|tuple): List|Tuple of integers declaring the shape. You can
           set "None" at a dimension to indicate the dimension can be of any
           size. For example, it is useful to set changeable batch size as "None"
       dtype (np.dtype|VarType|str, optional): The type of the data. Supported
           dtype: bool, float16, float32, float64, int8, int16, int32, int64,
           uint8. Default: float32
       lod_level (int, optional): The LoD level of the LoDTensor. Usually users
           don't have to set this value. Default: 0

    Returns:
        Tensor: The global Tensor that gives access to the data.
    éÿÿÿÿTF)ÚnameÚshapeÚdtypeÚtypeÚstop_gradientÚ	lod_levelÚis_dataÚneed_check_feed)Údata)
r   ÚlocalsÚlistÚrangeÚlenÚcreate_global_variabler   ÚVarDescÚVarTypeÚ
LOD_TENSOR)rZ   r[   r\   r_   ÚhelperÚis         r6   Údata_layer_not_checkrm   ‡   s„   € ô8 Ñ,¤6£8Ñ,€FÜ�‹K€EÜ”3�u“:ÖˆØ�‰8ÑØˆE�!ŠHð ð ×(Ñ(ØØØÜ�\‰\×!Ñ!×,Ñ,ØØØØð )ó 	ð 	r8   c                  ó   — t        t        j                  d«      dgd«      } d| _        t	        di t        «       ¤Ž}|j                  j                  }d|j                  _        t        j                  t        | «       ||j                  _        | S )NÚundefined_varr   Úfloat64Fr   )Úcreate_undefined_variable)rm   r
   Úgenerater^   r   rc   Úmain_programÚcurrent_block_idxÚpaddleÚassignÚRETURN_NO_VALUE_MAGIC_NUM)Úvarrk   Úsaved_block_idss      r6   rq   rq   µ   sz   € Ü
Ü×Ñ˜_Ó-°¨s°Ió€Cð €CÔäÑA¼»ÑA€FØ×)Ñ)×;Ñ;€OØ,-€F×ÑÔ)Ü
‡M�MÔ+¨SÔ1Ø,;€F×ÑÔ)Ø€Jr8   c                   ó   — e Zd Zd„ Zd„ Zy)ÚUndefinedVarc                 ó   — || _         y r2   )rZ   ©r5   rZ   s     r6   r7   zUndefinedVar.__init__Ä   s	   € Øˆ�	r8   c                 ó   — t        d«      ‚)Nz6local variable '{}' should be created before using it.)ÚUnboundLocalErrorr4   s    r6   ÚcheckzUndefinedVar.checkÇ   s   € ÜØDó
ð 	
r8   N)r=   rF   rG   r7   r€   rI   r8   r6   r{   r{   Ã   s   „ òó
r8   r{   c                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ÚDygraph2StaticExceptionc                 ó$   •— t         ‰| �  |«       y r2   )Úsuperr7   )r5   Úmessager<   s     €r6   r7   z Dygraph2StaticException.__init__Î   s   ø€ Ü‰Ñ˜Õ!r8   )r=   rF   rG   r7   Ú__classcell__)r<   s   @r6   r‚   r‚   Í   s   ø„ ÷"ð "r8   r‚   c                 óF   — t        | t        «      r| j                  «       S | S r2   )Ú
isinstancer{   r€   ©Úxs    r6   Úsawr‹   Ò   s   € Ü�!”\Ô"Ø�w‰w‹yÐàˆr8   c                 ó  — t        j                  | «      }|j                  }|rd|d   k(  r|j                  dd }i }|j                  }|r=t	        |«      t	        |«      k  sJ ‚|t	        |«       d }t        t        ||«      «      }||fS )zB
    Returns full argument names as list. e.g ['x', 'y', 'z']
    r5   r   r   N)ÚinspectÚgetfullargspecÚargsÚdefaultsrf   ÚdictÚzip)ÚfunctionÚfullargspecÚ	arg_namesÚdefault_kwargsÚdefault_valuesÚdefault_kwarg_namess         r6   Úparse_arg_and_kwargsr™   Ù   sž   € ô ×(Ñ(¨Ó2€KØ× Ñ €IÙ�V˜y¨™|Ò+Ø×$Ñ$ Q RÐ(ˆ	ð €NØ ×)Ñ)€NÙÜ�>Ó"¤c¨)£nÒ4Ð4Ð4Ø'¬¨^Ó)<Ð(<Ð(>Ð?ÐÜœcÐ"5°~ÓFÓGˆà�nÐ$Ð$r8   c                 óH   — t        j                  | «      }|j                  }|S )zU
    Returns varargs name string of function. e.g: 'input' from `foo(x, *input)`
    )r�   rŽ   Úvarargs)r“   r”   r›   s      r6   Úparse_varargs_namerœ   í   s$   € ô ×(Ñ(¨Ó2€KØ×!Ñ!€GØ€Nr8   c                 ó,   — t        | «      j                  S r2   )r]   r=   )Úvs    r6   Ú	type_namerŸ   ö   s   € Ü�‹7×ÑÐr8   c                 ó¼  — t        | t        t        t        f«      rt        t	        t
        | «      «      S 	 t        | «       | S # t        $ r� t        | t        j                  «      rt        | j                  «       «      cY S t        | t        «      r)t        t	        t
        | j                  «       «      «      cY S |xs d}t        |dt        | «      z  z   «      ‚w xY w)z–
    Makes input `x` hashable.

    For some unhashable objects, such as `dict/list/set/np.ndarray`,applying hash function by using their values.
    zRequires a hashable object.z But received type: %s)rˆ   Útuplerd   ÚsetÚmapÚmake_hashableÚhashÚ	TypeErrorÚnpÚndarrayÚtostringr‘   ÚvaluesÚ
ValueErrorrŸ   )rŠ   Ú	error_msgs     r6   r¤   r¤   ú   s¶   € ô �!”eœT¤3Ð'Ô(Ü”Sœ¨Ó*Ó+Ð+ðNÜˆQŒð €Høô ò 	NÜ�aœŸ™Ô$ô ˜Ÿ
™
›Ó%Ò%Ü˜œ4Ô Üœœ]¨A¯H©H«JÓ7Ó8Ò8àÒ>Ð!>ˆ	Ü˜Ð%=Ä	È!ÃÑ%LÑLÓMÐMð	Nús   ¶A Á<CÂ7CÂ:!Cz$paddle.nn.layer.container.Sequentialc                 ó.   — t         j                  | «       y)zˆ
    Append API or class as ignored case for is_paddle_func, and they
    will be retured False while calling is_paddle_func(func).
    N)ÚAS_NOT_INNER_FUNC_LISTÚadd)Úpaths    r6   Úas_not_paddle_funcr±     s   € ô ×Ñ˜tÕ$r8   c                 óî  — d„ }	 t        | t        j                  «      r| j                  } t	        | dd«      }t        j                  | «      r-| j                  j                  j                  }| j                  } n"t        | d«      r| j                  j                  }t        j                  | «      }|duxr |j                  j                  t        «      }|r|xr
  |||«       }|S # t        $ r Y yw xY w)zŒ
    Return True if function is defined in Paddle module.
    Skip to check APIs in white list if specifying ignore_white_list as True.
    c                 ó8   — |€y| j                   dz   |z   t        v S )NFÚ.)r=   r®   )ÚmoduleÚ	func_names     r6   Úin_white_listz%is_paddle_func.<locals>.in_white_list(  s%   € ØÐØØ—‘ #Ñ%¨	Ñ1Ô6LÐLÐLr8   r=   Nr<   F)rˆ   Ú	functoolsÚpartialÚfuncr>   r�   ÚismethodÚ__self__r<   r=   Ú__func__ÚhasattrÚ	getmoduleÚ
startswithr   Ú	Exception)rº   Úignore_white_listr·   r¶   ÚmÚflags         r6   Úis_paddle_funcrÅ   "  sÕ   € òMð
Ü�dœI×-Ñ-Ô.Ø—9‘9ˆDä˜D *¨dÓ3ˆ	Ü×Ñ˜DÔ!ØŸ™×/Ñ/×8Ñ8ˆIØ—=‘=‰DÜ�T˜;Ô'ØŸ™×/Ñ/ˆIä×Ñ˜dÓ#ˆØ˜ˆ}ÒL §¡×!6Ñ!6Ô7KÓ!LˆÙØÒ;¡¨a°Ó ;Ð;ˆDàˆøÜò Ùðús   …C"C( Ã(	C4Ã3C4c                 ó.  — t        | t        j                  «      sJ ‚t        j                  t        j
                  | j                  «      «      }t        d|› d�«      }|d   }| j                  D �cg c]  }|j                  |v sŒ|‘Œ c}| _        y c c}w )Núinspect.getfullargspec(Ú)r   )
rˆ   r   ÚCallÚastorÚ	to_sourceÚgast_to_astrº   ÚevalÚkeywordsÚarg)rA   Úfunc_srcÚ	full_argsÚfull_args_nameÚks        r6   Ú_delete_keywords_fromrÔ   B  sx   € Ü�dœDŸI™IÔ&Ð&Ð&Ü�‰œt×/Ñ/°·	±	Ó:Ó;€HäÐ.¨x¨j¸Ð:Ó;€IØ˜q‘\€Nà $§¢ÓI¡˜1°·±¸.Ò1H’Q ÑI€D…MùÒIs   Á1BÂBc                 óB   — | t         v r	t         |    S t        d| › d�«      ‚)NzPaddle dygraph API z0 cannot be converted to static graph at present.)Údygraph_class_to_static_apiÚNotImplementedError)Údygraph_classs    r6   Úto_static_apirÙ   L  s4   € ØÔ3Ñ3Ü*¨=Ñ9Ð9ä!Ø! - ð 1*ð *ó
ð 	
r8   c           	      óÖ  — t        | t        j                  «      sJ ‚|dk(  rm| j                  D ]  }|j                  dk(  sŒd|_        Œ | j                  j                  t        j                  dt        j                  dd ¬«      ¬«      «       |dk(  r(| j                  D ]  }|j                  dk(  sŒd|_        Œ |d	k(  r)| j                  D ]  }|j                  d
k(  sŒd|_        Œ y y )NÚLinearÚ
output_dimÚsizeÚnum_flatten_dimsrY   )ÚvalueÚkind©rÏ   rß   ÚBilinearTensorProductÚPReluÚinputrŠ   )rˆ   r   rÉ   rÎ   rÏ   r;   ÚkeywordÚConstant)rA   Údygraph_api_nameÚast_keywords      r6   Ú_add_keywords_toré   V  sË   € Ü�dœDŸI™IÔ&Ð&Ð&Ø˜8Ò#ØŸ=œ=ˆKØ�‰ ,Ó.Ø"(�•ð )ð 	�‰×ÑÜ�L‰LØ&¬d¯m©mÀ"È4Ô.Pôô	
ð Ð2Ò2ØŸ=œ=ˆKØ�‰ ,Ó.Ø"(�•ð )ð ˜7Ò"ØŸ=œ=ˆKØ�‰ 'Ó)Ø"%�•ñ )ð #r8   c                 óâ  — t        | t        j                  «      sJ ‚t        |t        j                  «      sJ ‚t        |j                  j
                  «      }t        j                  |t        j                  «       t        j                  dt        j                  «       t        j                  t        j                  «       dd d ¬«      ¬«      ¬«      | _        t        | |d«       | j                  j                  |j                  «       | j                  j                  |j                  «       t        | |j                  j
                  «       t        | «       t        j                  | «       | S )NÚlayersr   )ÚctxÚidÚ
annotationÚtype_comment)Úattrrì   rß   Úforward)rˆ   r   rÉ   rÙ   rº   rð   Ú	AttributeÚLoadÚNameÚupdate_args_of_funcr�   ÚextendrÎ   ré   rÔ   Úfix_missing_locations)rA   Ú
class_nodeÚ
static_apis      r6   Úto_static_astrú   n  sø   € Ü�dœDŸI™IÔ&Ð&Ð&Ü�j¤$§)¡)Ô,Ð,Ð,Ü˜zŸ™×3Ñ3Ó4€Jä—‘ØÜ�I‰I‹KÜ�n‰nØÜ—	‘	“Ü—)‘)Ü—I‘I“K F°tÈ$ôô
ô
€D„Iô ˜˜j¨)Ô4à‡I�I×Ñ�Z—_‘_Ô%Ø‡M�M×Ñ˜×,Ñ,Ô-Ü�T˜:Ÿ?™?×/Ñ/Ô0Ü˜$Ôä×Ñ˜tÔ$à€Kr8   c                 ó  — t        | t        j                  «      sJ ‚|dvrt        d«      ‚t	        j
                  t        j                  |j                  «      «      }|dk(  st        d|› d�«      r+t        d|› d|› d�«      }|d	   D �cg c]
  }|d
k7  sŒ	|‘Œ }}ng }g }t        | j                  «      D ].  \  }}	|j                  t        j                  ||   |	¬«      «       Œ0 g | _
        || j                  z   | _        y c c}w )N)r7   rñ   zIThe method name of class to update args should be '__init__' or 'forward'r7   zissubclass(z, paddle.nn.Layer)rÇ   r´   rÈ   r   r5   rá   )rˆ   r   rÉ   r«   rÊ   rË   rÌ   rº   rÍ   Ú	enumerater�   r;   rå   rÎ   )
rA   Údygraph_nodeÚmethod_nameÚ	class_srcrÑ   Úarg_namerÒ   Úadded_keywordsÚidxrÏ   s
             r6   rõ   rõ   ‹  s  € Ü�dœDŸI™IÔ&Ð&Ð&ØÐ1Ñ1ÜØWó
ð 	
ô —‘¤× 0Ñ 0°×1BÑ1BÓ CÓD€Ià�jÒ ¤DØ
�i�[Ð 2Ð3ô%ô Ð2°9°+¸Q¸{¸mÈ1ÐMÓNˆ	à%.¨q¢\ó
Ù%1˜°XÀÓ5GŠH \ð 	ñ 
ð ˆØ€NÜ˜dŸi™iÖ(‰ˆˆSØ×ÑœdŸl™l¨~¸cÑ/BÈ#ÔNÕOð )ð €D„IØ" T§]¡]Ñ2€D…Mùò
s   Â
DÂDc                 ó   — t        | t        j                  t        j                  t        j                  f«      sJ ‚t        | t        j                  «      rEt        j
                  t        j                  d«      j                  d   j                  | gg ¬«      }|S t        | t        j                  «      rOt        j
                  t        j                  d«      j                  d   j                  | j                  gg ¬«      }|S t        | t        j                  «      r1t        j                  | «      }t        |j                  «      |_        |S y )Nzpaddle.shaper   )rº   r�   rÎ   )rˆ   r   rô   rò   Ú	SubscriptrÉ   ÚparseÚbodyrß   ÚcopyÚdeepcopyÚcreate_api_shape_node)Útensor_shape_nodeÚapi_shape_nodeÚresult_nodes      r6   r	  r	  ¥  s  € ÜØœDŸI™I¤t§~¡~´t·~±~ÐFôð ð ô Ð#¤T§Y¡YÔ/ÜŸ™Ü—‘˜NÓ+×0Ñ0°Ñ3×9Ñ9Ø#Ð$Øô
ˆð
 ÐäÐ#¤T§^¡^Ô4ÜŸ™Ü—‘˜NÓ+×0Ñ0°Ñ3×9Ñ9Ø#×)Ñ)Ð*Øô
ˆð
 ÐäÐ#¤T§^¡^Ô4Ü—m‘mÐ$5Ó6ˆÜ1°+×2CÑ2CÓDˆÔØÐð 5r8   Úint64c           
      óh   — t        j                  | › dt        |«      › dt        |«      › d|› d�«      S )Nz = paddle.full(z, "z", rÈ   )r   r  Ústr)rZ   rß   r[   r\   s       r6   Úget_constant_variable_noder  À  s7   € Ü�:‰:Øˆ&�¤ E£
˜|¨3¬s°5«z¨l¸#¸e¸WÀAÐFóð r8   c                 ó°   — t        | t        j                  «      sJ d«       ‚t        j                  t        j
                  | «      «      j                  «       S )Nz3Input non-Attribute node to get attribute full name)rˆ   r   rò   rÊ   rË   rÌ   Ústrip)rA   s    r6   Úget_attribute_full_namer  Æ  sJ   € ÜØŒd�n‰nôð =à<ó=ð ô �?‰?œ4×+Ñ+¨DÓ1Ó2×8Ñ8Ó:Ð:r8   Fc                 ó>  ‡— t        | t        «      r| g} t        | t        t        t        f«      s t        dt        t        | «      «      z  «      ‚ˆfd„}| D �cg c]
  } ||«      ‘Œ }}t        |«      dk(  r	|s|d   }|S t        j                  |‰¬«      }|S c c}w )am  
    If name_ids is list or tuple or set with multiple strings, this function
    generates gast.Tuple of gast.Name.
    If the name_ids is single string or contains only 1 string, this function
    returns gast.Name if gen_tuple_if_single==False else returns gast.Tuple
    with only one gast.Name

    This function is used at several gast.Return statements.
    z6name_ids must be list or tuple or set, but received %sc                 ó–   •— d| vrt        j                  | ‰d d ¬«      S t        j                  | «      j                  d   j                  S )Nr´   )rí   rì   rî   rï   r   )r   rô   r  r  rß   )rZ   rì   s    €r6   Úcreate_node_for_namez0generate_name_node.<locals>.create_node_for_nameß  sF   ø€ Ø�d‰?Ü—9‘9Ø˜S¨TÀôð ô �z‰z˜$Ó×$Ñ$ QÑ'×-Ñ-Ð-r8   r   r   )Úeltsrì   )
rˆ   r  rd   r¡   r¢   r¦   r]   rf   r   ÚTuple)Úname_idsrì   Úgen_tuple_if_singler  Úname_idÚ
gast_namesÚ	name_nodes    `     r6   Úgenerate_name_noder  Í  s©   ø€ ô �(œCÔ Ø�:ˆÜ�h¤¤u¬cÐ 2Ô3ÜØDÜ”4˜“>Ó"ñ#ó
ð 	
ô
.ñ @HÓH¹x°GÑ& wÕ/¸x€JÐHÜ
ˆ:ƒ˜!ÒÑ$7Ø˜q‘Mˆ	ð Ðô —J‘J J°CÔ8ˆ	ØÐùò Is   ÁBc                 ó  — t        j                   | «      } |r/| j                  t        j                  t	        |«      ¬«      «       n%| j                  t        j                  d¬«      «       t        j
                  ||| g dd¬«      }|S )zh
    Wrapper all statements of nodes into one ast.FunctionDef, which can be
    called by ast.Call.
    )rß   N)rZ   r�   r  Údecorator_listÚreturnsrï   )r  r;   r   ÚReturnr  ÚFunctionDef)ÚnodesrZ   Ú
input_argsÚreturn_name_idsÚfunc_def_nodes        r6   Úcreate_funcDef_noder(  î  so   € ô
 �I‰I�eÓ€EáØ�‰”T—[‘[Ô'9¸/Ó'JÔKÕLà�‰”T—[‘[ tÔ,Ô-Ü×$Ñ$ØØØØØØô€Mð Ðr8   c                 óx   — t        | t        j                  «       ¬«      }t        j                  |g|¬«      }||fS )zT
    Creates a `gast.Assign` node by given name_id as target and node as value.
    )rì   )Útargetsrß   )r  r   ÚStoreÚAssign)rZ   rA   r*  Úassign_nodes       r6   Úcreate_assign_noder.    s3   € ô ! ¬4¯:©:«<Ô8€GÜ—+‘+ w i°tÔ<€KØ�KÐÐr8   c                  ó–  — dt        j                  «       › �} t         j                  j                  t         j                  j	                  d«      | «      }t
        j                  j                  d«      }|rt         j                  j                  |«      }t         j                  j                  |«      st        j                  |«       |S )z+
    Return @to_static temp directory.
    zpaddle/to_static_tmp/z~/.cacheÚwin)ÚosÚgetpidr°   ÚjoinÚ
expanduserÚsysÚplatformrÀ   ÚnormpathÚexistsÚmakedirs)Údir_nameÚtemp_dirÚ
is_windowss      r6   Úget_temp_dirr=    s…   € ð '¤r§y¡y£{ mÐ4€HÜ�w‰w�|‰|œBŸG™G×.Ñ.¨zÓ:¸HÓE€HÜ—‘×(Ñ(¨Ó/€JÙÜ—7‘7×#Ñ# HÓ-ˆä�7‰7�>‰>˜(Ô#Ü
�‰�HÔà€Or8   c                 ó:  — d„ }d„ }t        | «      }t        «       |z   }t        «       }t        j                  d ||«      dd|d¬«      }|5  t
        j                  j                  |j                  dd	 «      }|j                  |«       ddd«       |rt        rt        j                  ||¬
«       da
|j                  }	t        |j                  «      }
t        j                   j#                  |
j                  |
«      }t        j                   j%                  |«      }|
j'                  |«       t)        |d«      r|j*                  }|	|_        n't)        ||	«      rt-        ||	«      }nt/        d|	z  «      ‚t1        ||«       ||j                  fS # 1 sw Y   �ŒxY w)zõ
    Transform modified AST of decorated function into python callable object.
    TODO: If only decorate one of inner function instead of decorating the main
    function, the other inner functions are invisible for the decorated function.
    c                 ón   — t         j                  j                  | «      rt        j                  | «       y y r2   )r1  r°   r8  ÚshutilÚrmtree©Údir_paths    r6   Úremove_if_exitz#ast_to_func.<locals>.remove_if_exit$  s#   € Ü�7‰7�>‰>˜(Ô#Ü�M‰M˜(Õ#ð $r8   c                 ó¬   — | j                   }t        | d«      r3	 | j                  j                  j                   dz   | j                   z   }|S |S #  Y |S xY w)Nr¼   Ú_)r=   r¾   r¼   r<   )rº   Úpre_fixs     r6   Úfunc_prefixz ast_to_func.<locals>.func_prefix(  sW   € Ø—-‘-ˆÜ�4˜Ô$ðØŸ-™-×1Ñ1×:Ñ:¸SÑ@À4Ç=Á=ÑP�ð ˆˆwˆøðØØˆús   š0A ÁAÚwz.pyFzutf-8)ÚmodeÚprefixÚsuffixÚdeleteÚdirÚencodingNéýÿÿÿrB  Ú__i_m_p_l__z>Function: %s doesn't exist in the Module transformed from AST.)r   Ú_inject_import_statementsr=  ÚtempfileÚNamedTemporaryFiler1  r°   ÚbasenamerZ   ÚwriteÚDEL_TEMP_DIRÚatexitÚregisterr=   r   Ú	importlibÚutilÚspec_from_loaderÚmodule_from_specÚexec_moduler¾   rQ  r>   r«   Úrecover_globals_attribute)Úast_rootÚdyfuncÚdelete_on_exitrD  rH  Úsourcer;  ÚfÚmodule_namer¶   ÚloaderÚspecrµ   Úcallable_funcs                 r6   Úast_to_funcri    sf  € ò$òô   Ó)€FÜ&Ó(¨6Ñ1€FÜ‹~€HÜ×#Ñ#ØÙ˜6Ó"ØØØØô	€Aò 
Ü—g‘g×&Ñ& q§v¡v¨c¨r {Ó3ˆØ	�‰�Œ÷ 
ñ
 �,ä�‰˜°Õ:Øˆà—‘€IÜ˜k¨1¯6©6Ó2€FÜ�>‰>×*Ñ*¨6¯;©;¸Ó?€DÜ�^‰^×,Ñ,¨TÓ2€FØ
×Ñ�vÔô ˆv�}Ô%Ø×*Ñ*ˆØ!*ˆÕÜ	�˜Ô	#Ü ¨	Ó2‰äØMØñó
ð 	
ô ˜f mÔ4à˜!Ÿ&™&Ð Ð ÷A 
‰ús   Á>FÆFc                  ó2   — g d¢} dj                  | «      dz   S )N)zimport paddlezfrom paddle import Tensorzimport paddle.base as basez#import paddle.jit.dy2static as _jstzfrom typing import *zimport numpy as npzimport warningsz>warnings.filterwarnings('ignore', category=DeprecationWarning)Ú
)r3  )Úimport_statementss    r6   rR  rR  _  s!   € ò	Ðð �9‰9Ð&Ó'¨$Ñ.Ð.r8   c                 ó¼   — d}t        | |i «      }t        ||i «      }|j                  «       D ]-  \  }}|j                  d«      r|j                  d«      rŒ)|||<   Œ/ y )NÚ__globals__Ú__)r>   ÚitemsrÀ   Úendswith)Úsrc_objÚdst_objÚ	attr_nameÚsrc_globalsÚdst_globalsrÓ   rž   s          r6   r_  r_  m  sZ   € Ø€Iä˜' 9¨bÓ1€KÜ˜' 9¨bÓ1€Kà×!Ñ!Ö#‰ˆˆ1à—‘˜TÔ" q§z¡z°$Õ'7ØˆK˜ŠNñ $r8   c                 óê  — t        | t        j                  «      r| j                  } t	        j
                  | «      sBt	        j                  | «      s-t        dj                  t        | «      j                  «      «      ‚t	        j                  | «      \  }}|D �cg c]%  }|j                  «       j                  d«      s|nd‘Œ' }}dj                  |«      }|rt        j                   |«      }|S c c}w )z=
    Transforms function into raw string of source code.
    zGThe type of 'function' should be a function or method, but received {}.Ú#rk  Ú )rˆ   r¸   r¹   rº   r�   Ú
isfunctionr»   r¦   Úformatr]   r=   ÚgetsourcelinesÚlstriprÀ   r3  ÚtextwrapÚdedent)r“   r  Úsource_code_listrF  ÚlineÚsource_codes         r6   Úfunc_to_source_coderƒ  y  sß   € ô �(œI×-Ñ-Ô.Ø—=‘=ˆÜ×Ñ˜xÔ(¬G×,<Ñ,<¸XÔ,FÜØU×\Ñ\Ü�X“×'Ñ'óó
ð 	
ô "×0Ñ0°Ó:ÑÐ�añ %óá$ˆDð —K‘K“M×,Ñ,¨SÔ1‰°tÑ;Ø$ð ð ð —'‘'Ð*Ó+€KáÜ—o‘o kÓ2ˆàÐùòs   Â*C0c           	      óô   — t        | t        j                  t        j                  t        j                  t        j
                  t        j                  t        j                  f«      }dt        | «      v }|xs |S )z@
    Nodes with specified type will be dependent on tensor.
    z.numpy())	rˆ   r   ÚCompareÚBoolOpÚUnaryOpÚForÚIfÚWhiler   )rA   Úis_compare_nodeÚhas_numpy_attrs      r6   Úis_candidate_noder�  ”  s]   € ô !Øä�L‰LÜ�K‰KÜ�L‰LÜ�H‰HÜ�G‰GÜ�J‰Jð	
ó
€Oð  Ô#5°dÓ#;Ð;€NØÒ,˜nÐ,r8   c                 ó@  — t        | t        j                  «      r„| j                  | j                  fD ]i  }t        |t
        «      r|d   }t        |t        j                  «      r|j                  �+t        |t        j                  «      sŒY|j                  dk(  sŒi y y)zB
    Whether the comparator of `gast.Compare` node is `None`.
    r   ÚNoneTF)
rˆ   r   r…  ÚleftÚcomparatorsrd   ræ   rß   rô   rí   )rA   Úchilds     r6   Úcompare_with_noner“  ©  sv   € ô �$œŸ™Ô%Ø—i‘i ×!1Ñ!1Ó2ˆEä˜%¤Ô&Ø˜a™�Ü˜5¤$§-¡-Ô0°U·[±[Ð5HÜ˜5¤$§)¡)Õ,°·±¸VÓ1Cáð 3ð r8   c                   ón   — e Zd Z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y)ÚIsControlFlowVisitora#  
    Judge whether the ast_node of control flow from Dygraph code dependent on paddle Tensor.
    `ast_node` can be gast.If, gast.For, gast.While, gast.If.test(gast.Compare, gast.BoolOp, gast.UnaryOp).

    If returns True,
    gast.If.test must meet at least one of the following requirements:
        1. involves at least one var whose type is Tensor.
        2. the Tensor var calls `.numpy()[]` interface or Tensor.shape is [1].
        3. involves Tensor.shape[i] and the shape[i] is unknown in compile time.
    gast.While must meet at least one of the requirements 1 to 5:
        4. has `break` statement.
        5. has `continue` statement.
    gast.For must meet at least one of the requirements 4 to 8:
        6. calls `range` function in `for` statement and the argument of range is Tensor.
        7. calls `enumerate` function in `for` statement and the argument of enumerate is Tensor.
        8. the iterable varaible in `for` statement is Tensor.
        TODO: Support non-range case

    The following examples should not be considered as control_flow_if:
        1. `if Tensor_var` or `if Tensor_var is None`
        2. if Tensor.shape[i] is determined with fixed value (not -1 or None)

    Note: pred in ConditionalBlock require variable, which means all vars should be Tensor
          or transformed into Tensor, like fill_constant(shape=[1], dtype='int32', value=Tensor.shape[i]).

    TODO: 1. need to deal with `tensor.shape[i]` which need to eval the data of shape[i],
             because reshape_op may be called before this statement.
    Nc                 ó  — t        |t        j                  «      sJ dt        |«      z  «       ‚|| _        |€t        |«      }|| _        | j                  j                  «       | _        || _	        d| _
        t        «       | _        y )Nz7Type of input node should be gast.AST, but received %s.r   )rˆ   r   ÚASTr]   r`  r   Ústatic_analysis_visitorÚget_node_to_wrapper_mapÚnode_to_wrapper_mapÚnode_var_type_mapÚis_control_flow_numr¢   Ú_compare_node_tenor_set)r5   Úast_noder˜  r›  s       r6   r7   zIsControlFlowVisitor.__init__×  s�   € ô Ø”d—h‘hô
ð 	
àDÄtØóH
ñ 
ó	
ð 
ð
 !ˆŒØ"Ð*Ü&;¸HÓ&EÐ#Ø'>ˆÔ$à×(Ñ(×@Ñ@ÓBð 	Ô ð "3ˆÔà#$ˆÔ Ü'*£uˆÕ$r8   c                 ób  — | j                   }t        |t        j                  «      r| j	                  |«       nit        |t        j
                  «      r| j                  |«       n=t        |t        j                  «      r| j                  |«       n| j                  |«       | j                  dkD  S )Nr   )r`  rˆ   r   r‰  Ú	_visit_Ifrˆ  Ú
_visit_ForrŠ  Ú_visit_WhilerE   rœ  ©r5   rA   s     r6   Ú	transformzIsControlFlowVisitor.transformë  sx   € Ø�}‰}ˆÜ�dœDŸG™GÔ$Ø�N‰N˜4Õ Ü˜œdŸh™hÔ'Ø�O‰O˜DÕ!Ü˜œdŸj™jÔ)Ø×Ñ˜dÕ#à�J‰J�tÔØ×'Ñ'¨!Ñ+Ð+r8   c                 ór   — t        |t        j                  «      sJ ‚| j                  |j                  «       y r2   )rˆ   r   r‰  rE   Útestr£  s     r6   r   zIsControlFlowVisitor._visit_If÷  s&   € Ü˜$¤§¡Ô(Ð(Ð(Ø�
‰
�4—9‘9Õr8   c                 óÖ  — t        |t        j                  «      sJ ‚t        |j                  t        j                  «      �rt        |j                  j
                  t        j                  «      rt|j                  j
                  j                  dk(  s#|j                  j
                  j                  dk(  r-|j                  j                  D ]  }| j                  |«       Œ n±y t        |j                  j
                  t        j                  «      r@|j                  j
                  j                  dk(  r| j                  |j                  «       nCy y t        |j                  t        j                  «      r| j                  |j                  «       ny t        j                  |«      D ]>  }t        |t        j                  t        j                  f«      sŒ.| j!                  |«       Œ@ y )Nre   rü   Únumpy)rˆ   r   rˆ  ÚiterrÉ   rº   rô   rí   r�   rE   rò   rð   Ú_visit_CallÚwalkÚContinueÚBreakÚ_visit_break_continue)r5   rA   rÏ   Ú
child_nodes       r6   r¡  zIsControlFlowVisitor._visit_Forû  s1  € Ü˜$¤§¡Ô)Ð)Ð)Ü�d—i‘i¤§¡Õ+ä˜$Ÿ)™)Ÿ.™.¬$¯)©)Ô4à—I‘I—N‘N×%Ñ%¨Ò0Ø—y‘y—~‘~×(Ñ(¨KÒ7à#Ÿy™yŸ~œ~˜ØŸ
™
 3�ñ  .ð ä˜DŸI™IŸN™N¬D¯N©NÔ;Ø—9‘9—>‘>×&Ñ&¨'Ò1Ø×$Ñ$ T§Y¡YÕ/ààÜ˜Ÿ	™	¤4§9¡9Ô-à�J‰J�t—y‘yÕ!àäŸ)™) Dž/ˆJÜ˜*¤t§}¡}´d·j±jÐ&AÕBØ×*Ñ*¨:Õ6ð *ð 	r8   c                 ó"  — t        |t        j                  «      sJ ‚|j                  }| j	                  |«       t        j
                  |«      D ]>  }t        |t        j                  t        j                  f«      sŒ.| j                  |«       Œ@ y r2   )	rˆ   r   rŠ  r¦  r?   r«  r¬  r­  r®  )r5   rA   r¦  r¯  s       r6   r¢  z!IsControlFlowVisitor._visit_While  sd   € Ü˜$¤§
¡
Ô+Ð+Ð+Ø�y‰yˆØ×Ñ˜4Ô ÜŸ)™) Dž/ˆJÜ˜*¤t§}¡}´d·j±jÐ&AÕBØ×*Ñ*¨:Õ6ñ *r8   c                 ó¬  — t        |t        j                  t        j                  f«      sJ ‚| j                  j                  |«      }|sy |j                  r~|j                  j                  }t        |t        j                  t        j                  f«      r%|| j                  u r| xj                  dz  c_        y y |j                  }|j                  rŒ~y ©Nr   )rˆ   r   r­  r¬  rš  ÚgetÚparentrA   rˆ  rŠ  r`  rœ  )r5   rA   Úwrapper_nodeÚparent_nodes       r6   r®  z*IsControlFlowVisitor._visit_break_continue#  sª   € Ü˜$¤§¡¬T¯]©]Ð ;Ô<Ð<Ð<Ø×/Ñ/×3Ñ3°DÓ9ˆÙàà×!Ò!Ø&×-Ñ-×2Ñ2ˆKÜ˜+¬¯©´$·*±*Ð'=Ô>Ø $§-¡-Ñ/Ø×,Ò,°Ñ1Õ,Øàà'×.Ñ.ˆLð ×!Ó!ð 	r8   c                 ób   — t        |j                  «      D ]  \  }}| j                  |«       Œ |S r2   )rü   rª   rE   )r5   rA   rl   r’  s       r6   Úvisit_BoolOpz!IsControlFlowVisitor.visit_BoolOp7  s*   € Ü! $§+¡+Ö.‰HˆAˆuØ�J‰J�uÕð /àˆr8   c                 ó6  — | j                   }t        |«      sW| j                  |«       t        j                  |«      D ].  }t        |t        j                  «      sŒ| j                  |«       Œ0 | j                   |kD  r| j                  j                  |«       |S r2   )
rœ  r“  r?   r   r«  rˆ   r  Ú_visit_Subscriptr�  r¯   )r5   rA   Úpre_control_flow_numr’  s       r6   Úvisit_Comparez"IsControlFlowVisitor.visit_Compare<  s|   € Ø#×7Ñ7ÐÜ  Ô&Ø×Ñ˜tÔ$ÜŸ™ 4ž�Ü˜e¤T§^¡^Õ4Ø×)Ñ)¨%Õ0ð )ð ×#Ñ#Ð&:Ò:Ø×(Ñ(×,Ñ,¨TÔ2Øˆr8   c                 ó¾   — | j                  |«       t        |d«      r?t        |j                  t        j
                  «      r| j                  |j                  «       |S )Nrß   )r?   r¾   rˆ   rß   r   rÉ   rª  r£  s     r6   rº  z%IsControlFlowVisitor._visit_SubscriptG  sB   € Ø×Ñ˜4Ô Ü�4˜Ô!¤j°·±¼T¿Y¹YÔ&GØ×Ñ˜TŸZ™ZÔ(Øˆr8   c                 óè   — t        |t        j                  «      sJ ‚t        |j                  t        j                  «      r2|j                  }|j
                  dk(  r| xj                  dz  c_        y y y )Nr¨  r   )rˆ   r   rÉ   rº   rò   rð   rœ  )r5   rA   Ú	attr_nodes      r6   rª  z IsControlFlowVisitor._visit_CallM  sX   € Ü˜$¤§	¡	Ô*Ð*Ð*Ü�d—i‘i¤§¡Ô0ØŸ	™	ˆIØ�~‰~ Ò(Ø×(Ò(¨AÑ-Ö(ð )ð 1r8   c                 óh   — | j                  |«       t        |«      r| xj                  dz  c_        |S r²  )rª  r   rœ  r£  s     r6   Ú
visit_CallzIsControlFlowVisitor.visit_CallT  s.   € Ø×Ñ˜ÔÜ˜ÔØ×$Ò$¨Ñ)Õ$Øˆr8   c                 óh   — | j                  ||j                  «      r| xj                  dz  c_        |S r²  )Ú_is_node_with_tensorrí   rœ  r£  s     r6   Ú
visit_NamezIsControlFlowVisitor.visit_NameZ  s,   € Ø×$Ñ$ T¨4¯7©7Ô3Ø×$Ò$¨Ñ)Õ$Øˆr8   c                 óh   — | j                  ||j                  «      r| xj                  dz  c_        |S r²  )rÃ  rß   rœ  r£  s     r6   Úvisit_Constantz#IsControlFlowVisitor.visit_Constant_  s,   € Ø×$Ñ$ T¨4¯:©:Ô6Ø×$Ò$¨Ñ)Õ$Øˆr8   c                 ó  — | j                   rD|rBt        |t        «      r2| j                   j                  |d «      }|r|t        j
                  z  ry| j                  j                  |d «      }|�|j                  t        j
                  z  ryy©NTF)r›  rˆ   r  r³  r   ÚTENSOR_TYPESrš  Únode_var_type)r5   rA   r  Úvar_typerµ  s        r6   rÃ  z)IsControlFlowVisitor._is_node_with_tensord  sz   € à×!Ò!Ùœ: g¬sÔ3Ø×1Ñ1×5Ñ5°g¸tÓD�Ù ¬;×+CÑ+CÒ CØà×/Ñ/×3Ñ3°D¸$Ó?ˆØÐ#Ø×)Ñ)¬K×,DÑ,DÒDØàr8   c                 ó   — | j                   S r2   )r�  r4   s    r6   Úget_compare_nodes_with_tensorz2IsControlFlowVisitor.get_compare_nodes_with_tensors  s   € Ø×+Ñ+Ð+r8   )NN)r=   rF   rG   rH   r7   r¤  r   r¡  r¢  r®  r¸  r¼  rº  rª  rÁ  rÄ  rÆ  rÃ  rÍ  rI   r8   r6   r•  r•  ¹  sZ   „ ñð< IMó-ò(
,òòò@7òò(ò
	òò.òòò
ò
ó,r8   r•  c                 óJ   — d„ }| } ||«      r|j                   } ||«      rŒ|S )z3
    Returns the object wrapped by decorators.
    c                 ó   — t        | d«      S )NÚ__wrapped__)r¾   )rd  s    r6   Ú_is_wrappedzunwrap.<locals>._is_wrapped}  s   € Ü�q˜-Ó(Ð(r8   )rÐ  )rº   rÑ  Úunwrapped_fs      r6   ÚunwraprÓ  x  s3   € ò
)ð €KÙ
�kÔ
"Ø!×-Ñ-ˆñ �kÕ
"ð Ðr8   c                 óD  — t        | «      }|t        |«      k7  r| D ]  }||vsŒ y yt        | |«      D ]j  \  }}t        |t        j                  j
                  «      s$t        |t        j                  j
                  «      rt        ||«      rŒ[ yt        ||«      rŒj y y)aV  
    Returns True if the two input specs are compatible, otherwise False.

    args:
        src_input_spec (list or tuple[InputSpec et.al]): list/tuple of
            paddle.static.InputSpec or int/str et.al
        desired_input_specs (list or tuple[InputSpec et.al]): list/tuple of
            paddle.static.InputSpec or int/str et.al
    FT)rf   r’   rˆ   ru   ÚstaticÚ	InputSpecÚ_compatible_tensor_specÚ_compatible_non_tensor_spec)Úsrc_input_specsÚdesired_input_specsÚ	len_specsrg  Úsrc_specÚdesired_specs         r6   Úinput_specs_compatiblerÞ  ‡  sŸ   € ô �OÓ$€IØ”CÐ+Ó,Ò,ó $ˆDØÐ.Ò.Ùð $ð ô '*¨/Ð;NÖ&OÑ"ˆH�lÜ˜(¤F§M¡M×$;Ñ$;Ô<Ä
ØœfŸm™m×5Ñ5ôAô /¨x¸ÕFÙ ä2°8¸\ÕJÙ ð 'Pð r8   c                 ó˜  — | |fD ](  }t        |t        j                  j                  «      rŒ( y | j                  }|j                  }t        |«      }|t        |«      k7  ryt        |«      D ]+  }||   �||   dk  rŒ||   �||   dk  rŒ||   ||   k7  sŒ+ y t        | j                  «      }t        |j                  «      }||k7  ryy)z;
    Check whether two tensor type spec is compatible.
    Fr   T)	rˆ   ru   rÕ  rÖ  r[   rf   re   r   r\   )	rÜ  rÝ  rg  Ú	src_shapeÚother_shapeÚ	len_shapeÚjÚ	src_dtypeÚother_dtypes	            r6   r×  r×  ¦  sÙ   € ð ˜<Ó(ˆÜ˜$¤§¡× 7Ñ 7Õ8Ùð )ð —‘€IØ×$Ñ$€KÜ�I“€IØ”C˜Ó$Ò$ØÜ�9ÖˆØ�Q‰<Ð 9¨Q¡<°!Ò#3ØØ�q‰>Ð! [°¡^°aÒ%7ØØ�Q‰<˜; q™>Ó)Ùð ô ˜hŸn™nÓ-€IÜ × 2Ñ 2Ó3€KØ�KÒØàr8   c                 ó6   — d„ } || «      } ||«      }||k7  ryy)z?
    Check whether two non-tensor type spec is compatible.
    c                 ó2   — 	 t        | «      }|S #  d }Y |S xY wr2   )r¤   )rg  Úhash_vals     r6   Ú
hash_valuez/_compatible_non_tensor_spec.<locals>.hash_valueÇ  s)   € ð	Ü$ TÓ*ˆHð ˆøð	Ø‰HØˆús   ‚ �FTrI   )rÜ  rÝ  ré  Úsrc_hash_valÚdesired_hash_vals        r6   rØ  rØ  Â  s-   € ò
ñ ˜hÓ'€LÙ! ,Ó/ÐàÐ'Ò'Øàr8   c                   óN   — 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y)Ú	NameScopec                 óÆ   — t        «       | _        t        «       | _        t        «       | _        d| _        t        «       | _        t        «       | _        t        «       | _        y)a(  
        A NameScope is a object which manager all the variable names.
        only FunctionDef and Controlflow node will have a namescope property.

        type can be "function" and "controlflow"

        we don't analyze the read only variable because they don't affect the analysis.
        N)r¢   ÚglobalsÚ	nonlocalsr�   ÚfatherÚw_varsÚcreatedÚpush_pop_varsr4   s    r6   r7   zNameScope.__init__Ø  sD   € ô “uˆŒÜ›ˆŒÜ“EˆŒ	ØˆŒÜ“eˆŒÜ“uˆŒô !›UˆÕr8   c                 ó   — || _         y r2   )rñ  )r5   rñ  s     r6   Ú
set_fatherzNameScope.set_fatherë  s	   € Øˆ�r8   c                 ó”   — | j                   | j                  z
  | j                  z
  | j                  z
  }t	        t        d„ |«      «      S )zWvars existing in current scope.
        they must not contain qualified names.
        c                 ó
   — d| vS ©Nr´   rI   r‰   s    r6   Ú<lambda>z(NameScope.existed_vars.<locals>.<lambda>ó  s   €  C¨q¡Lr8   )rò  rï  rð  r�   r¢   Úfilter)r5   Ú
local_varss     r6   Úexisted_varszNameScope.existed_varsî  s;   € ð —[‘[ 4§<¡<Ñ/°$·.±.Ñ@À4Ç9Á9ÑLˆ
Ü”6Ñ0°*Ó=Ó>Ð>r8   c                 ó   — | j                   S r2   )ró  r4   s    r6   Úcreated_varszNameScope.created_varsõ  s   € Ø�|‰|Ðr8   c                 ó   — | j                   S r2   )rò  r4   s    r6   Úmodified_varszNameScope.modified_varsø  s   € à�{‰{Ðr8   c           
      óä   — g }| j                   D ]U  }| j                  |«      r1| j                  |«      r t        j                  d|› d|› d|› d�«       ŒE|j                  |«       ŒW t        |«      S )a  
        At present, we do not support global append, such as

        import numpy as np
        a = []
        def func():
            a.append() # global names `a`, we will raise a warning.
            p.append(a, 1) # global names `np`, we will raise a warning.
        zFind variable `z$` defined in global scope and call `z.append() or zI.pop()`, which will be ignored and never be transfered into tensor array.)rô  Ú_is_simple_nameÚis_global_varÚwarningsÚwarnr;   r¢   )r5   Únon_global_push_pop_namesrx   s      r6   Úvariadic_length_varszNameScope.variadic_length_varsü  s€   € ð %'Ð!Ø×%Ô%ˆCØ×#Ñ# CÔ(¨T×-?Ñ-?ÀÔ-DÜ—‘Ø% c Uð +"Ø"%  m°C°5ð 9%ð&õð *×0Ñ0°Õ5ð &ô Ð,Ó-Ð-r8   c                 ór   — | j                   }| j                  j                  |z  f}|| j                   |z
  dœS )N)ÚglobalÚnonlocal)rò  rñ  Úglobal_vars)r5   Úvalid_namesÚtmps      r6   Úcontrol_flow_varszNameScope.control_flow_vars  s6   € Ø—k‘kˆØ�{‰{×&Ñ&¨Ñ4Ð6ˆØ¨4¯;©;¸Ñ+<Ñ=Ð=r8   c                 ó   — d|v sd|v ryy)Nr´   Ú[FTrI   r}   s     r6   r  zNameScope._is_simple_name  s   € Ø�$‰;˜# ™+ØØr8   c                 ó°   — | j                  |«      sJ d«       ‚| }|�:||j                  v ry||j                  |j                  z  v ry|j                  }|�Œ:y)a  
        Return whether the name is a var created in global scope.
        Search from bottom to top. If it is not created or modified,
        it means global vars; otherwise, it means local vars.
        Only valid after FunctionNameLivenessAnalysis visitor.
        z5is_global_var accept a simple name, but get `{name}`.TF)r  rï  rð  rò  rñ  )r5   rZ   Úancestors      r6   r  zNameScope.is_global_var  sw   € ð ×#Ñ#Øô
ð 	CàBó	Cð 
ð ˆØÐ"Ø�x×'Ñ'Ñ'ØØ˜×*Ñ*¨X¯_©_Ñ<Ñ=ØØ—‘ˆHð Ñ"ð r8   c                 ó&   — | j                  |«       S r2   )r  r}   s     r6   Úis_local_varzNameScope.is_local_var0  s   € Ø×%Ñ% dÓ+Ð+Ð+r8   c                 ó:  — | xj                   |j                   z  c_         | xj                  |j                  z  c_        | xj                  |j                  z  c_        | xj                  |j                  z  c_        | xj                  |j                  z  c_        y r2   )rï  rð  r�   rò  rô  )r5   Ú
name_scopes     r6   Ú
merge_fromzNameScope.merge_from3  sg   € Ø�Š˜
×*Ñ*Ñ*�Ø�Š˜*×.Ñ.Ñ.�Ø�	Š	�Z—_‘_Ñ$�	Ø�Š�z×(Ñ(Ñ(�Ø×Ò˜j×6Ñ6Ñ6Ör8   N)r=   rF   rG   r7   rö  rý  rÿ  r  r  r  r  r  r  r  rI   r8   r6   rí  rí  ×  s9   „ ò#ò&ò?òòò.ò.>ò
ò
ò&,ó7r8   rí  c                   óŽ   — 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„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚFunctionNameLivenessAnalysisa¡  analyze the liveness of a function.

    every variables stored in this scope will be collected,
    in addition with global/nonlocal information and
    push_pop information.

    1. global variable is stored in node.var_globals.
    2. nonlocal variable is stored in node.var_nonlocals.
    3. arguments is stored in node.var_args.
    4. if a variable's push and pop attribute is called,
       it will be collected in push_pop_vars. They are
       used for transformation to tensor_array.
       NOTE: push_pop_vars **may not** in w_vars.
       a.push(0) don't modify the variable a, but the content
       of a.

    For example:

    def func(*args, **kargs):
        a = 12
        global i,j
        nonlocal x,y
        print(a)
        i = k
        b = []
        c = [1,2,3]
        for m in range(10):
            q = 12
            b.push(1)
            c.pop()

    After this visitor we have:
    # node is the FunctionDef node with name: "func"
    node.pd_scope = NameScope(
        globals = ['i', 'j'],
        nonlocals = ['x', 'y'],
        args = ['args', 'kargs'],
        wr_vars = ['a', 'i', 'q', 'm', 'c', 'b']
        push_pop_vars = ['b', 'c']
    )
    c                 ó4   — g | _         | j                  |«       y r2   )Úscope_node_stackrE   )r5   Ú	root_nodes     r6   r7   z%FunctionNameLivenessAnalysis.__init__f  s   € Ø "ˆÔØ�
‰
�9Õr8   c                 ó"   — t        «       |_        y r2   )rí  Úpd_scoper£  s     r6   Ú_reset_name_scopez.FunctionNameLivenessAnalysis._reset_name_scopej  s   € ä!›ˆ�r8   c                 óP   — t        |d«      st        «       |_        |j                  S )Nr  )r¾   rí  r  r£  s     r6   Ú_get_name_scopez,FunctionNameLivenessAnalysis._get_name_scopen  s   € Ü�t˜ZÔ(Ü%›KˆDŒMØ�}‰}Ðr8   c                 ó>   — | j                  | j                  d   «      S )NrY   )r"  r  r4   s    r6   Ú_current_name_scopez0FunctionNameLivenessAnalysis._current_name_scopes  s   € Ø×#Ñ# D×$9Ñ$9¸"Ñ$=Ó>Ð>r8   c                 óp   — t        | j                  «      dk(  ry | j                  | j                  d   «      S )Nr   éþÿÿÿ)rf   r  r"  r4   s    r6   Ú_father_name_scopez/FunctionNameLivenessAnalysis._father_name_scopev  s4   € Üˆt×$Ñ$Ó%¨Ò*ØØ×#Ñ# D×$9Ñ$9¸"Ñ$=Ó>Ð>r8   c                 ó¾   — t        | j                  «      dk(  ry | j                  dd d…   D ]/  }t        |t        j                  «      sŒ| j                  |«      c S  y )Nr   r&  rY   )rf   r  rˆ   r   r#  r"  r£  s     r6   Ú_nearest_function_scopez4FunctionNameLivenessAnalysis._nearest_function_scope{  sT   € Üˆt×$Ñ$Ó%¨Ò*ØØ×)Ñ)¨"¨&¨b¨&Ô1ˆDÜ˜$¤× 0Ñ 0Õ1Ø×+Ñ+¨DÓ1Ò1ñ 2r8   c                  ó   — y)z™[ i for i in range(10) ]
        In this case, `i` will not created in FunctionScope.
        We don't collect `i` by not calling generic_visit.
        NrI   r£  s     r6   Úvisit_ListCompz+FunctionNameLivenessAnalysis.visit_ListComp‚  s   € ð
 	r8   c                  ó   — y)zthe same as ListComp.NrI   r£  s     r6   Úvisit_DictCompz+FunctionNameLivenessAnalysis.visit_DictComp‰  s   € àr8   c                 ó  — | j                  |«       t        j                  t        j                  t        j                  f}t        |j                  |«      r4| j                  «       j                  j                  |j                  «       y y r2   )r?   r   r+  ÚAugStoreÚDelrˆ   rì   r$  rò  r¯   rí   ©r5   rA   Úwrite_contexts      r6   rÄ  z'FunctionNameLivenessAnalysis.visit_Name�  s\   € Ø×Ñ˜4Ô ÜŸ™¤T§]¡]´D·H±HÐ=ˆÜ�d—h‘h Ô.Ø×$Ñ$Ó&×-Ñ-×1Ñ1°$·'±'Õ:ð /r8   c                 óF   ‡ ‡— ˆˆ fd„}ˆˆ fd„}‰ j                  ‰||«       y )Nc                  ó|   •— ‰j                  «       xj                  t        ‰j                  ‰ «      «      z  c_        y r2   )r$  r�   r¢   Ú_get_argument_names©rA   r5   s   €€r6   Úpre_funcz@FunctionNameLivenessAnalysis.visit_FunctionDef.<locals>.pre_func”  s2   ø€ Ø×$Ñ$Ó&×+Ò+¬sØ×(Ñ(¨Ó.ó0ñ Ö+r8   c                  ór  •‡— t         t         t        t        t        t        gŠˆˆfd„} ‰j                  «       r | «       rw‰j                  «       xj                  ‰j                  «       j                  z  c_        ‰j                  «       xj                  ‰j                  «       j                  z  c_        yyy)a  NOTE: why we need merge w_vars and push_pop_vars here ?
            because we do ifelse_transformer after loop_transformer. Loops will changed into functioons. but we know this function will be called in if. so we add w_vars to father function scope.
            c                  óN   •— ‰D ]  } ‰j                   j                  | «      sŒ y yrÈ  )rZ   rÀ   )rK  Úcontrol_flow_function_defrA   s    €€r6   Úis_control_flow_def_nodezcFunctionNameLivenessAnalysis.visit_FunctionDef.<locals>.post_func.<locals>.is_control_flow_def_node¦  s'   ø€ Û7�FØ—y‘y×+Ñ+¨FÕ3Ù#ð 8ð r8   N)	ÚWHILE_BODY_PREFIXÚFOR_CONDITION_PREFIXÚFOR_BODY_PREFIXÚTRUE_FUNC_PREFIXÚFALSE_FUNC_PREFIXr'  rò  r$  rô  )r;  r:  rA   r5   s    @€€r6   Ú	post_funczAFunctionNameLivenessAnalysis.visit_FunctionDef.<locals>.post_func™  s›   ù€ ô
 "Ü!Ü$ÜÜ Ü!ð)Ð%õð ×&Ñ&Ô(Ñ-EÔ-GØ×'Ñ'Ó)×0Ò0Ø×,Ñ,Ó.×5Ñ5ñÕ0ð ×'Ñ'Ó)×7Ò7Ø×,Ñ,Ó.×<Ñ<ñÖ7ð	 .HÐ(r8   ©Ú_visit_scope_node©r5   rA   r7  rA  s   ``  r6   Úvisit_FunctionDefz.FunctionNameLivenessAnalysis.visit_FunctionDef“  s!   ù€ õ	õ
	ð6 	×Ñ˜t X¨yÕ9r8   c                 ó0  — | j                  |«       | j                  j                  |«       | j                  «       j	                  | j                  «       «       |r |«        | j                  |«       |r |«        | j                  j                  «        y)zQscope node main visit logic.
        pre_func and post_func is callbacks
        N)r   r  r;   r$  rö  r)  r?   r@   rD  s       r6   rC  z.FunctionNameLivenessAnalysis._visit_scope_node¶  sv   € ð 	×Ñ˜tÔ$Ø×Ñ×$Ñ$ TÔ*Ø× Ñ Ó"×-Ñ-¨d×.JÑ.JÓ.LÔMÙÙŒJØ×Ñ˜4Ô ÙÙŒKØ×Ñ×!Ñ!Õ#r8   c                 óF   ‡ ‡— ˆˆ fd„}ˆˆ fd„}‰ j                  ‰||«       y )Nc                  ó¬  •— ‰j                  «       j                  ‰j                  «       «       ‰j                  «       j                  ‰j                  «       «       ‰j                  «       j	                  «       ‰ j
                  z
  ‰j                  «       _        ‰j                  «       xj                  ‰j                  «       j                  z  c_        y r2   )r'  r  r$  r)  rý  Úbefore_createdró  r6  s   €€r6   rA  zGFunctionNameLivenessAnalysis._visit_controlflow_node.<locals>.post_funcÅ  sª   ø€ Ø×#Ñ#Ó%×0Ñ0°×1IÑ1IÓ1KÔLØ×(Ñ(Ó*×5Ñ5Ø×(Ñ(Ó*ôð ×,Ñ,Ó.×;Ñ;Ó=Ø×%Ñ%ñ&ð ×$Ñ$Ó&Ô.ð
 ×(Ñ(Ó*×2Ò2Ø×(Ñ(Ó*×2Ñ2ñÖ2r8   c                  óL   •— ‰j                  «       j                  «       ‰ _        y r2   )r)  rý  rI  r6  s   €€r6   r7  zFFunctionNameLivenessAnalysis._visit_controlflow_node.<locals>.pre_funcÓ  s   ø€ Ø"&×">Ñ">Ó"@×"MÑ"MÓ"OˆDÕr8   rB  )r5   rA   rA  r7  s   ``  r6   Ú_visit_controlflow_nodez4FunctionNameLivenessAnalysis._visit_controlflow_nodeÄ  s"   ù€ õ	õ	Pð 	×Ñ˜t X¨yÕ9r8   c                 ó&   — | j                  |«       y r2   ©rK  r£  s     r6   Ú	visit_Forz&FunctionNameLivenessAnalysis.visit_ForØ  ó   € Ø×$Ñ$ TÕ*r8   c                 ó&   — | j                  |«       y r2   rM  r£  s     r6   Úvisit_Whilez(FunctionNameLivenessAnalysis.visit_WhileÛ  rO  r8   c                 ó&   — | j                  |«       y r2   rM  r£  s     r6   Úvisit_Ifz%FunctionNameLivenessAnalysis.visit_IfÞ  rO  r8   c                 óp   — | j                  «       xj                  t        |j                  «      z  c_        y r2   )r$  rï  r¢   Únamesr£  s     r6   Úvisit_Globalz)FunctionNameLivenessAnalysis.visit_Globalá  s$   € Ø× Ñ Ó"×*Ò*¬c°$·*±*«oÑ=Ö*r8   c                 óp   — | j                  «       xj                  t        |j                  «      z  c_        y r2   )r$  rð  r¢   rU  r£  s     r6   Úvisit_Nonlocalz+FunctionNameLivenessAnalysis.visit_Nonlocalä  s$   € Ø× Ñ Ó"×,Ò,´°D·J±J³Ñ?Ö,r8   c                 ó6  — | j                  |«       t        j                  t        j                  t        j                  f}t        |j                  |«      rCt        |«      j                  «       }| j                  «       j                  j                  |«       y y r2   )r?   r   r+  r/  r0  rˆ   rì   r   r  r$  rò  r¯   )r5   rA   r2  rZ   s       r6   Úvisit_Attributez,FunctionNameLivenessAnalysis.visit_Attributeç  sk   € Ø×Ñ˜4Ô ÜŸ™¤T§]¡]´D·H±HÐ=ˆÜ�d—h‘h Ô.Ü% dÓ+×1Ñ1Ó3ˆDØ×$Ñ$Ó&×-Ñ-×1Ñ1°$Õ7ð /r8   c                 ó   — | j                  |«       t        j                  t        j                  t        j                  f}t        |j                  |«      r¸t        |j                  t        j                  «      r1|j                  }t        |j                  t        j                  «      rŒ1t        |j                  t        j                  «      r>| j                  «       j                  j                  |j                  j                  «       y y y r2   )r?   r   r+  r/  r0  rˆ   rì   rß   r  rô   r$  rò  r¯   rí   r1  s      r6   Úvisit_Subscriptz,FunctionNameLivenessAnalysis.visit_Subscriptî  s¦   € Ø×Ñ˜4Ô ÜŸ™¤T§]¡]´D·H±HÐ=ˆÜ�d—h‘h Ô.Ü˜TŸZ™Z¬¯©Ô8Ø—z‘z�ô ˜TŸZ™Z¬¯©Õ8ä˜$Ÿ*™*¤d§i¡iÔ0Ø×(Ñ(Ó*×1Ñ1×5Ñ5°d·j±j·m±mÕDð 1ð /r8   c                 óV  — | j                  |«       t        |j                  t        j                  «      sy ddg}|j                  j
                  |vry t        |j                  j                  «      j                  «       }| j                  «       j                  j                  |«       y )Nr;   r@   )r?   rˆ   rº   r   rò   rð   r   rß   r  r$  rô  r¯   )r5   rA   Úvariadic_length_methodrZ   s       r6   rÁ  z'FunctionNameLivenessAnalysis.visit_Call÷  s|   € Ø×Ñ˜4Ô Ü˜$Ÿ)™)¤T§^¡^Ô4ØØ"*¨EÐ!2ÐØ�9‰9�>‰>Ð!7Ñ7Øä! $§)¡)§/¡/Ó2×8Ñ8Ó:ˆØ× Ñ Ó"×0Ñ0×4Ñ4°TÕ:r8   c                 ó\  — t        |t        j                  «      sJ d«       ‚t        |j                  j                  «      }|j                  |j                  j                  «       |j                  |j                  j                  «       |D �cg c]  }|€Œ|j                  ‘Œ }}|S c c}w )z…get all arguments name in the functiondef node.
        this node is local to the function and shouldn't
        be created.
        z&Input node is not function define node)	rˆ   r   r#  rd   r�   r;   ÚvarargÚkwargrí   )r5   rA   rU  rl   s       r6   r5  z0FunctionNameLivenessAnalysis._get_argument_names  s�   € ô
 Ø”$×"Ñ"ô
ð 	4à3ó	4ð 
ô �T—Y‘Y—^‘^Ó$ˆØ�‰�T—Y‘Y×%Ñ%Ô&Ø�‰�T—Y‘Y—_‘_Ô%Ù$Ó6™u˜!¨©�—“˜uˆÐ6Øˆùò 7s   ÂB)ÂB)N)r=   rF   rG   rH   r7   r   r"  r$  r'  r)  r+  r-  rÄ  rE  rC  rK  rN  rQ  rS  rV  rX  rZ  r\  rÁ  r5  rI   r8   r6   r  r  ;  st   „ ñ(òTò$òò
?ò?ò
2òòò;ò!:òF$ò:ò(+ò+ò+ò>ò@ò8òEò	;ór8   r  c                 ón  — d„ }t        | t        t        f«      sJ ‚t        | «      }| s |«       S |g k(  rd}nt	        |d   «      }d}|j                  t        j                  t        «      |dj                  | «      ¬«      }t        j                  t        j                  |«      «      j                  d   S )z{
    Create get_args function as follows:

        def get_args_0():
            nonlocal x, y
            return x, y
    c                  ó¦   — dt        j                  t        «      › d�} t        j                  t        j                  | «      «      j                  d   S )Nú
        def z():
            return
        r   )r
   rr   ÚGET_ARGS_FUNC_PREFIXr   r  r~  r  r  ©Úfunc_defs    r6   Ú
empty_nodez(create_get_args_node.<locals>.empty_node  sJ   € ðÜ×!Ñ!Ô"6Ó7Ð8ð 9	ðˆô �z‰zœ(Ÿ/™/¨(Ó3Ó4×9Ñ9¸!Ñ<Ð<r8   rk  r   zK
    def {func_name}():
        {nonlocal_vars}
        return {vars},
    Ú,)r¶   Únonlocal_varsÚvars)rˆ   rd   r¡   Úcreate_nonlocal_stmt_nodesr   r{  r
   rr   re  r3  r   r  r~  r  r  ©rU  rh  rA   rj  Útemplaterg  s         r6   Úcreate_get_args_nodero    sª   € ò=ô �eœd¤E˜]Ô+Ð+Ð+Ü% eÓ,€DÙÙ‹|ÐØˆr‚zØ‰ä*¨4°©7Ó3ˆð€Hð
 �‰Ü×&Ñ&Ô';Ó<Ø#Ø�X‰X�e‹_ð ó €Hô
 �:‰:”h—o‘o hÓ/Ó0×5Ñ5°aÑ8Ð8r8   c                 óx  — d„ }t        | t        t        f«      sJ ‚t        | «      }| s |«       S |g k(  rd}nt	        |d   «      }d}|j                  t        j                  t        «      t        |dj                  | «      ¬«      }t        j                  t        j                  |«      «      j                  d   S )zƒ
    Create set_args function as follows:

        def set_args_0(__args):
            nonlocal x, y
            x, y = __args
    c                  ó´   — dt        j                  t        «      › dt        › d�} t	        j
                  t        j                  | «      «      j                  d   S )Nrd  Ú(z):
            pass
        r   )	r
   rr   ÚSET_ARGS_FUNC_PREFIXÚ	ARGS_NAMEr   r  r~  r  r  rf  s    r6   rh  z(create_set_args_node.<locals>.empty_node?  sQ   € ðÜ×!Ñ!Ô"6Ó7Ð8¸¼)¸ð E	ðˆô �z‰zœ(Ÿ/™/¨(Ó3Ó4×9Ñ9¸!Ñ<Ð<r8   rk  r   zS
    def {func_name}({args}):
        {nonlocal_vars}
        {vars}, = {args}
    ri  )r¶   r�   rj  rk  )rˆ   rd   r¡   rl  r   r{  r
   rr   rs  rt  r3  r   r  r~  r  r  rm  s         r6   Úcreate_set_args_noderu  6  s­   € ò=ô �eœd¤E˜]Ô+Ð+Ð+Ü% eÓ,€DÙÙ‹|ÐØˆr‚zØ‰ä*¨4°©7Ó3ˆð€Hð
 �‰Ü×&Ñ&Ô';Ó<ÜØ#Ø�X‰X�e‹_ð	 ó €Hô �:‰:”h—o‘o hÓ/Ó0×5Ñ5°aÑ8Ð8r8   c                 óF  — t        | t        t        f«      sJ ‚t        t        d„ | «      «      }t        t        d„ |«      «      }t	        ||j
                  ¬«      } | sg S dj                  dj                  | «      «      }t        j                  |«      j                  d   gS )Nc                 ó
   — d| vS rù  rI   ©Úns    r6   rú  z,create_nonlocal_stmt_nodes.<locals>.<lambda>_  ó   €  3¨a¡<r8   c                 ó
   — d| vS )Nr  rI   rx  s    r6   rú  z,create_nonlocal_stmt_nodes.<locals>.<lambda>`  rz  r8   )Úkeyznonlocal {}ri  r   )rˆ   rd   r¡   rû  ÚsortedÚindexr{  r3  r   r  r  )rU  ÚmappedÚ	func_codes      r6   rl  rl  \  sŒ   € Ü�eœd¤E˜]Ô+Ð+Ð+ä”&Ñ/°Ó7Ó8€FÜ”&Ñ/°Ó8Ó9€FÜØ�F—L‘Lô€Eñ Øˆ	Ø×$Ñ$ S§X¡X¨e£_Ó5€IÜ�J‰J�yÓ!×&Ñ& qÑ)Ð*Ð*r8   c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚGetterSetterHelperzÐwe have two classes of names in setter and getter function:
    w_vars(loop_vars) + push_pop_vars
    To simplify the setter logic in convert_while and convert_cond,
    we extract the helper class here.
    c                 ó<  — d„ |D «       }d„ |D «       }t        t        j                  d„ |t        «       «      «      | _        | j                  j                  «        || _        || _        t        | j                  «      D ��ci c]  \  }}||“Œ
 c}}| _	        y c c}}w )Nc              3   ó(   K  — | ]
  }|€g n|–— Œ y ­wr2   rI   ©Ú.0rŠ   s     r6   Ú	<genexpr>z.GetterSetterHelper.__init__.<locals>.<genexpr>r  s   è ø€ ÐA±j°˜A˜I‘b¨1Ó,±jùs   ‚c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr2   )r¢   r…  s     r6   r‡  z.GetterSetterHelper.__init__.<locals>.<genexpr>s  s   è ø€ Ð0¡Z ”S˜—V¡Zùs   ‚c                 ó   — | |z  S r2   rI   )rŠ   Úys     r6   rú  z-GetterSetterHelper.__init__.<locals>.<lambda>u  s   € ¨!¨aª%r8   )
rd   r¸   Úreducer¢   Ú_unionÚsortÚgetterÚsetterrü   Úname2id)r5   Úgetter_funcÚsetter_funcÚ
name_listsÚ	name_setsr  rZ   s          r6   r7   zGetterSetterHelper.__init__q  sƒ   € ÙA±jÓAˆ
Ù0¡ZÓ0ˆ	ÜÜ×ÑÑ/°¼C»EÓBó
ˆŒð 	�‰×ÑÔØ!ˆŒØ!ˆŒÜ3<¸T¿[¹[Ô3IÔJÑ3I¡i c¨4˜˜c™	Ð3IÒJˆ�ùÓJs   ÂBc                 ó   — | j                   S r2   )rŒ  r4   s    r6   ÚunionzGetterSetterHelper.union|  s   € Ø�{‰{Ðr8   c                 óÔ   ‡ ‡— |€g }‰ j                  «       Š‰€y|D ]6  }|‰ j                  v rŒJ d|› d‰ j                  j                  «       › d�«       ‚ t        ˆ ˆfd„|D «       «      S )NrI   ú
the name `ú` not in name union set`ú`.c              3   óB   •K  — | ]  }‰‰j                   |      –— Œ y ­wr2   )r�  )r†  ry  r5   rk  s     €€r6   r‡  z)GetterSetterHelper.get.<locals>.<genexpr>‰  s   øè ø€ Ð:±E¨q�T˜$Ÿ,™, q™/Õ*±Eùs   ƒ)rŽ  r�  Úkeysr¡   )r5   rU  ry  rk  s   `  @r6   r³  zGetterSetterHelper.get  sy   ù€ Øˆ=ØˆEØ�{‰{‹}ˆØˆ<ØÛˆAà�T—\‘\Ò!ðOà˜A˜3Ð6°t·|±|×7HÑ7HÓ7JÐ6KÈ2ÐNóOØ!ð ô Ô:±EÓ:Ó:Ð:r8   c                 ó\  — |€g }|€g }| j                  «       }|€y |D ]6  }|| j                  v rŒJ d|› d| j                  j                  «       › d�«       ‚ t        |«      }|D �cg c]  }| j                  |   ‘Œ }}t	        ||«      D ]
  \  }}|||<   Œ | j                  |«       y c c}w )Nr˜  r™  rš  )rŽ  r�  rœ  rd   r’   r�  )r5   rU  rª   rk  ry  Úindicesrl   rž   s           r6   r¢   zGetterSetterHelper.set‹  sÅ   € Øˆ=ØˆEØˆ>ØˆFØ�{‰{‹}ˆØˆ<ØÛˆAà�T—\‘\Ò!ðOà˜A˜3Ð6°t·|±|×7HÑ7HÓ7JÐ6KÈ2ÐNóOØ!ð ô �D‹zˆÙ,1Ó2©E q�4—<‘< “?¨EˆÐ2Ü˜ Ö(‰DˆAˆqØˆD�ŠGð )à�‰�DÕùò 3s   Á&B)N)r=   rF   rG   rH   r7   r–  r³  r¢   rI   r8   r6   r‚  r‚  j  s   „ ñò	Kòò
;ór8   r‚  c                 ó~   — | sy| D �cg c]  }d|j                  dd«      z  ‘Œ }}ddj                  |«      z  S c c}w )z(
    Return "('x', 'y')" for [x, y]
    r�  z'%s'Ú'z\'z(%s, )ri  )Úreplacer3  )r  rZ   Ú	names_strs      r6   Úcreate_name_strr£  ž  sH   € ñ ØáAIÓJÁ¸�˜4Ÿ<™<¨¨UÓ3Ó4À€IÐJØ�c—h‘h˜yÓ)Ñ)Ð)ùò Ks   ˆ:c                 ó2   — t        | |«      xs
 t        «       S r2   )Úcinn_is_enabledÚprim_is_enabled)Úbuild_strategyÚbackends     r6   Úprim_or_cinn_is_enabledr©  ©  s   € Ü˜>¨7Ó3ÒH´Ó7HÐHr8   c                 ó‚   — |dk(  ry| �| j                   ryt        j                  d«      }|�|j                  «       dv ryy)NÚCINNTÚFLAGS_use_cinn)ÚtrueÚ1F)Úbuild_cinn_passr1  ÚgetenvÚlower)r§  r¨  rß   s      r6   r¥  r¥  ­  sF   € Ø�&ÒØØÐ! n×&DÒ&DØä�I‰IÐ&Ó'€EØÐ˜UŸ[™[›]¨mÑ;ØØr8   c                  ó~   — t        j                  «        t        j                  «       xs t        j                  «       S r2   )r   Úcheck_and_set_prim_all_enabledÚ_is_bwd_prim_enabledÚ_is_fwd_prim_enabledrI   r8   r6   r¦  r¦  ¹  s+   € Ü×'Ñ'Ô)Ü×$Ñ$Ó&ÒE¬$×*CÑ*CÓ*EÐEr8   c                 ó¨   ‡ ‡— ˆ ˆfd„}t        ‰ t        j                  «      r |«       ry‰ t        j                  j                  «       v r |«       ryy)z‡predict whether a function is a builtin function with name={name}.
    if name == None, then any builtin function will return True
    c                  ó.   •— ‰d u xs ‰ j                   ‰k(  S r2   )r=   )rº   rZ   s   €€r6   Ú
name_judgezis_builtin.<locals>.name_judgeÃ  s   ø€ Ø�tˆ|Ò4˜tŸ}™}°Ñ4Ð4r8   TF)rˆ   ÚtypesÚBuiltinFunctionTypeÚbuiltinsÚ__dict__rª   )rº   rZ   r¸  s   `` r6   Ú
is_builtinr½  ¾  sB   ù€ õ
5ô �$œ×1Ñ1Ô2±z´|ØØ	”×"Ñ"×)Ñ)Ó+Ñ	+±
´Øàr8   c              #   ót  K  — t        j                  «        t        j                  «       }t        j                  «       }| dk(  rt        j                  d«       	 d –— t        j
                  |«       t        j                  |«       y # t        j
                  |«       t        j                  |«       w xY w­w)Nr«  T)r   r³  rµ  r´  Ú_set_prim_all_enabledÚ_set_prim_forward_enabledÚ_set_prim_backward_enabled)r¨  Ú	orign_fwdÚ	orign_bwds      r6   Úbackend_guardrÄ  Î  s‡   è ø€ ä×'Ñ'Ô)Ü×)Ñ)Ó+€IÜ×)Ñ)Ó+€Ià�&ÒÜ×"Ñ" 4Ô(ð3Ûä×&Ñ& yÔ1Ü×'Ñ'¨	Õ2øô 	×&Ñ& yÔ1Ü×'Ñ'¨	Õ2üs   ‚AB8ÁB	 Á+B8Â	,B5Â5B8c                 ó$  — i }d„ }t        j                  | |«      }t        t        ||«      «      |d<   t        j                  | |«      }t        t        ||«      «      |d<   t        j                  | |«      }t        t        ||«      «      |d<   |S )Nc                 ón   — t        | t        j                  «      r| j                  S t        j                  S r2   )rˆ   r	   ÚVariablerZ   ÚEMPTY_VAR_NAME)Úgrad_vars    r6   rú  z&construct_grad_names.<locals>.<lambda>à  s.   € Ü�h¤	× 2Ñ 2Ô3ð "Ÿ™ð &ä×%Ñ%ð&r8   rŠ   ÚparamÚout)r   Ú_get_grad_varsrd   r£   )	Úgrad_info_mapÚx_varsÚ
param_varsÚout_varsÚgrad_var_namesÚfnÚx_grad_varsÚparam_grad_varsÚout_grad_varss	            r6   Úconstruct_grad_namesrÖ  Ý  s‘   € Ø€Nñ	&ð ô
 ×)Ñ)¨-¸Ó@€KÜœs 2 {Ó3Ó4€N�3ÑÜ×-Ñ-¨m¸ZÓH€OÜ"¤3 r¨?Ó#;Ó<€N�7ÑÜ×+Ñ+¨M¸8ÓD€MÜ ¤ R¨Ó!7Ó8€N�5ÑØÐr8   c              #   ó0  K  — 	 t        | «      t        |«      k(  sJ ‚| D �cg c]  }|j                  ‘Œ }}t        | |«      D ]  \  }}||_        Œ d –— t        | |«      D ]  \  }}||_        Œ y c c}w # t        | «      D ]  \  }}||_        Œ w xY w­wr2   )rf   rZ   r’   )ÚtensorsrU  ÚtÚorigin_namesrZ   s        r6   Útensor_name_guardrÛ  í  s˜   è ø€ ðÜ�7‹|œs 5›zÒ)Ð)Ð)Ù(/Ó0© 1˜Ÿ›¨ˆÐ0Ü˜7 EÖ*‰GˆAˆtØˆA�Fð +ãä˜7 LÖ1‰GˆAˆtØˆA�Fñ 2ùò 1øô
 ˜7 LÖ1‰GˆAˆtØˆA�Fñ 2üs,   ‚B„A6 ¡A1´!A6 ÁBÁ1A6 Á6BÂB)Úfloat32r   r2   )T)‹rX  r»  r  r¸   Úimportlib.utilrZ  r�   r1  r@  r5  rS  r~  r¹  r  Úimportlib.machineryr   rÊ   r¨  r§   ru   r   r   r   Úpaddle.baser   r   r	   r
   Úpaddle.base.data_feederr   Úpaddle.base.layer_helperr   Úpaddle.base.wrapped_decoratorr   Úpaddle.utilsr   Ú	ast_utilsr   Ústatic_analysisr   Úutils_helperr   r   r   r   r   r   r   r   r   r   Ú__all__re  rs  ÚALREADY_D2Srt  Ú
ORIGI_INFOrW  ÚFOR_ITER_INDEX_PREFIXÚFOR_ITER_TUPLE_PREFIXÚFOR_ITER_TARGET_PREFIXÚFOR_ITER_ITERATOR_PREFIXÚFOR_ITER_TUPLE_INDEX_PREFIXÚFOR_ITER_VAR_LEN_PREFIXÚFOR_ITER_VAR_NAME_PREFIXÚFOR_ITER_ZIP_TO_LIST_PREFIXÚ	RE_PYNAMEÚRE_PYMODULEÚRETURN_NO_VALUE_VAR_NAMErw   r?  r@  ÚWHILE_CONDITION_PREFIXr<  r=  r>  ÚGRAD_PREFIXÚGRAD_SUFFIXrh   ri   ÚREADERÚSTEP_SCOPESÚFEED_MINIBATCHÚ
FETCH_LISTÚNO_SHAPE_VAR_TYPEÚNodeVisitorr0   rÖ   rm   rq   r{   rÁ   r‚   r‹   r™   rœ   rŸ   r¤   r®   r±   rÅ   rÔ   rÙ   ré   rú   rõ   r	  r  r  ró   r  r(  r.  r=  ri  rR  r_  rƒ  r�  r“  r•  rÓ  rÞ  r×  rØ  rí  r  ro  ru  rl  r‚  r£  r©  r¥  r¦  r½  rÄ  rÖ  rÛ  rI   r8   r6   Ú<module>rþ     s  ðó Û Û Û Û Û Û 	Û Û 
Û Û Û Û Ý 0ã Û ã ß -Ñ -ß >Ó >Ý 1Ý 0Ý GÝ å )Ý 2÷÷ ÷ ð €ð "Ð Ø!Ð Ø€Ø€	à@€
à€Ø.Ð Ø/Ð Ø1Ð Ø5Ð Ø;Ð Ø.Ð Ø0Ð Ø3Ð à€	Ø €ð 3Ð Ø&Ð àÐ ØÐ à*Ð Ø Ð Ø+Ð Ø!€à€Ø€ð 	‡L�L×Ñ×ÑØ‡L�L×Ñ×$Ñ$Ø‡L�L×Ñ×'Ñ'Ø‡L�L×Ñ×#Ñ#ð	Ð ô�d×&Ñ&ô ð, "Ø+Ø,Ø*ØØ'Ø)ñÐ ó+ò\÷
ñ 
ô"˜iô "ò
ò%ò(òóð8 AÐAÐ ò%óò@Jò
ò&ò0ò:3ò4ð6 45°#¸Wó ò;ð &/ T§Y¡Y£[Àeó òBò, òó ?!òD/ò	óò6-ò*ô {,˜4×+Ñ+ô {,ò~òò>ò8÷*a7ñ a7ôHS 4×#3Ñ#3ô Sòl"9òJ#9òL+÷1ñ 1òh*òIò	òFó
ð  ñ3ó ð3òð  ñ	ó ñ	r8   