Ë
    Ž\;j|  ã                   ó¢  — d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZm	Z	 d dl
mZmZ d dlmZ ddlmZ dd	lmZmZ dd
lmZmZmZmZmZ ddlmZmZmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z% dd„Z&d„ Z' G d„ d«      Z( G d„ d«      Z)d„ Z*d„ ddfdejV                  ej                  ge,f   fd„Z-ej\                  dd„«       Z/ej\                  dd„«       Z0y)é    N)ÚOrderedDict)Ú	framework)Úops_contain_noneÚprim_config)ÚOperatorÚdefault_main_program)Ú
as_tensorsé   )Ú
_composite)ÚaddÚ
fill_const)Úlookup_compositeÚlookup_orig2primÚlookup_prim2origÚop_position_inputsÚop_position_output)Ú_jvpÚ
_orig2primÚ
_prim2origÚ
_transpose)ÚflattenÚflatten_and_remove_noneÚget_input_var_listÚget_output_var_listÚmap_output_for_compositeÚprepare_python_api_argumentsc                 ó   ‡‡— |€t        «       j                  «       n|}g }g }t        «       Št        «       Š| D ](  }|�|j                  |k(  sJ d«       ‚|‰t	        |«      <   Œ* ˆfd„}|j
                  D ]C  } ||«      sŒ|j                  |«       t        t        |«      «      D ]  }|‰t	        |«      <   Œ ŒE t        ˆfd„|D «       «      Šˆfd„}	t        |«      D ]C  } |	|«      sŒ|j                  |«       t        t        |«      «      D ]  }|‰t	        |«      <   Œ ŒE | D �cg c]  }t	        |«      ‰vsŒ|‘Œ }
}|D �cg c]  }t	        |«      ‰vsŒ|‘Œ }}t        t        |«      «      |
|fS c c}w c c}w )aÜ  Returns the list of ops on the path from `xs` to `ys` in topological
    order.

    TODO(Tongxin): supporting control flow and nested blocks.
    Args:
        xs: a list|tuple of vars as source
        ys: a list|tuple of vars as sink
        block: the program block containing the path, optional
    Returns:
        (path, unused_xs, unreached_ys): a tuple comprised of the resulting op
        path, the unused variables in `xs`, and the unreached variables in `ys`
    z"x is not None and x.block != blockc                 óP   •— t        ˆfd„t        t        | «      «      D «       «      S )Nc              3   ó8   •K  — | ]  }t        |«      ‰v –— Œ y ­w©N©Úid)Ú.0ÚvÚreached_varss     €úgG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/incubate/autograd/primx.pyÚ	<genexpr>z.topo_path.<locals>.<lambda>.<locals>.<genexpr>J   s"   øè ø€ ð á@ˆAô 	ˆ1‹�ÔÙ@ùó   ƒ)Úanyr   r   )Úopr%   s    €r&   Ú<lambda>ztopo_path.<locals>.<lambda>J   s"   ø€ œ#ó ä(Ô);¸BÓ)?Ô@óô ó    c              3   óT   •K  — | ]  }t        |«      ‰v sŒt        |«      |f–— Œ! y ­wr    r!   )r#   Úyr%   s     €r&   r'   ztopo_path.<locals>.<genexpr>X   s%   øè ø€ ÐL±¨1´b¸³e¸|Ò6KœR ›U AœJ±ùs   ƒ(–(c                 óP   •— t        ˆfd„t        t        | «      «      D «       «      S )Nc              3   ó8   •K  — | ]  }t        |«      ‰v –— Œ y ­wr    r!   )r#   ÚoutÚ	used_varss     €r&   r'   z.topo_path.<locals>.<lambda>.<locals>.<genexpr>Y   s"   øè ø€ ð #áCˆCô 	ˆ3‹�9ÔÙCùr(   )r)   r   r   )r*   r2   s    €r&   r+   ztopo_path.<locals>.<lambda>Y   s"   ø€ œsó #ä*Ô+>¸rÓ+BÔCó#ô  r,   )r   Úcurrent_blockr   Úblockr"   ÚopsÚappendr   r   Úreversedr   Úlist)ÚxsÚysr4   ÚpathÚbackpathÚxÚreachingr*   ÚvarÚback_reachingÚ	unused_xsr.   Úunreached_ysr%   r2   s                @@r&   Ú	topo_pathrC   -   s|  ù€ ð 7<°mÔ Ó"×0Ñ0Ô2È€Eà€DØ€HÜ“=€LÜ“€Ió ˆàˆI˜Ÿ™ EÒ)ð	0à/ó	0Ø)àˆ”R˜“UÒð	 ó€Hð �iŒiˆÙ�B�<Ø�K‰K˜ŒOÜ.Ô/BÀ2Ó/FÖG�Ø(+�œR ›WÒ%ñ Hð ô ÓL±ÓLÓL€Ió€Mô �tŽnˆÙ˜ÕØ�O‰O˜BÔÜ.Ô/AÀ"Ó/EÖF�Ø%(�	œ"˜S›'Ò"ñ Gð ñ Ó9™B�q¤" Q£%¨yÒ"8’˜B€IÐ9Ù!Ó?™r˜!¤R¨£U°,Ò%>’A˜r€LÐ?ä”˜Ó"Ó# Y°Ð<Ð<ùò :ùÚ?s   Ä)E6Ä<E6ÅE;ÅE;c                 óv   — t        «       }| D ])  }t        t        |«      «      D ]  }||t        |«      <   Œ Œ+ |S )zÌReturns the output variables of all the ops on the path from `xs`
    to `ys`.

    Args:
        path: a list of ops on which to find the output variables

    Returns:
        vars: the output vars
    )r   r   r   r"   )r;   Úvarsr*   r1   s       r&   Úoutput_vars_on_pathrF   k   s?   € ô ‹=€DÛˆÜ*Ô+>¸rÓ+BÖCˆCØˆD”�C“ŠMñ Dð ð €Kr,   c                   óN   — e Zd ZdZg d¢Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zy)ÚVarMapz~A general map data structure for linking variables to variables.

    An example is linking variables to their gradients.
    )ÚnameÚvarsetÚtabc                 ó>   — || _         || _        t        «       | _        y r    )rI   rJ   r   rK   )ÚselfrI   rJ   s      r&   Ú__init__zVarMap.__init__…   s   € ØˆŒ	ØˆŒÜ“=ˆ�r,   c                 óF   — t        |«      | j                  t        |«      <   y r    ©r"   rK   )rM   Úkey_varÚ	value_vars      r&   r   z
VarMap.addŠ   s   € Ü " 9£ˆ�‰”�G“Òr,   c                 óî  — |€y t        |t        j                  j                  j                  «      rgt        |t        j                  j                  j                  «      st        dt        |«      › �«      ‚t        |«      | j                  t        |«      <   y t        |«      t        |«      k(  s J dt        |«      › dt        |«      › d�«       ‚t        ||«      D ]  \  }}| j                  ||«       Œ y )Nz%value_vars must be Variable, but got zDlen(key_vars) shoule be equal to len(value_vars), but len(key_vars)=z and len(value_vars)=Ú.)Ú
isinstanceÚpaddleÚbaser   ÚVariableÚ	TypeErrorÚtyper"   rK   ÚlenÚzipÚadd_rec)rM   Úkey_varsÚ
value_varsrQ   rR   s        r&   r]   zVarMap.add_rec�   sÛ   € ØÐØÜ�h¤§¡× 5Ñ 5× >Ñ >Ô?Ü˜j¬&¯+©+×*?Ñ*?×*HÑ*HÔIÜØ;¼DÀÓ<LÐ;MÐNóð ô &(¨
£^ˆD�H‰H”R˜“\Ò"ä�x“=¤C¨
£OÒ3ð ð%Ü%(¨£] OÐ3HÌÈZËÐHYÐYZð\óÐ3ô '*¨(°JÖ&?Ñ"�˜Ø—‘˜W iÕ0ñ '@r,   c                 ó†   — | j                   j                  t        |«      «      }|�| j                  j                  |«      S y r    )rK   Úgetr"   rJ   )rM   rQ   Úvalue_ids      r&   ÚlookupzVarMap.lookupž   s4   € Ø—8‘8—<‘<¤ 7£Ó,ˆØÐØ—;‘;—?‘? 8Ó,Ð,àr,   c                 ód   — t        |«      }|| j                  v r| j                  t        |«      = y y r    rP   )rM   rQ   Úvarids      r&   ÚdeletezVarMap.delete¥   s,   € Ü�7“ˆØ�D—H‘HÑØ—‘œ˜G›Ñ%ð r,   c                 ó`   — |D ])  }t        |«      }|| j                  v sŒ| j                  |= Œ+ y r    rP   )rM   r^   r?   re   s       r&   Údelete_keyvarszVarMap.delete_keyvarsª   s,   € ÛˆCÜ�s“GˆEØ˜Ÿ™Ò Ø—H‘H˜U‘Oñ r,   c                 óÔ   — |D �cg c]  }t        |«      ‘Œ }}| j                  j                  «       D ��cg c]  \  }}||v sŒ|‘Œ }}}|D ]  }| j                  |= Œ y c c}w c c}}w r    )r"   rK   Úitems)rM   r_   r$   ÚidsÚkÚkeyss         r&   Údelete_valuevarszVarMap.delete_valuevars°   sb   € Ù(Ó)™j˜Œr�!�u˜jˆÐ)Ø"Ÿh™hŸn™nÔ.Ô;Ñ.‘d�a˜°!°s²(’Ð.ˆÑ;ÛˆAØ—‘˜‘ñ ùò *ùÛ;s   …A¶A$ÁA$c                 óJ   — | j                   j                  t        |«      «      S r    )rK   Ú__contains__r"   )rM   rQ   s     r&   Úcontain_varzVarMap.contain_var¶   s   € Ø�x‰x×$Ñ$¤R¨£[Ó1Ð1r,   c                 óL   — t        |«      | j                  j                  «       v S r    )r"   rK   Úvalues)rM   rR   s     r&   Úcontain_valuezVarMap.contain_value¹   s   € Ü�)‹} §¡§¡Ó 1Ð1Ð1r,   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rN   r   r]   rc   rf   rh   rn   rq   rt   © r,   r&   rH   rH   }   s;   „ ñò
 *€Iò!ò
.ò1ò"ò&ò
$òò2ó2r,   rH   c                   óP   — e 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d„Zy
)Ú	TransformzXAn object that maintains the state of transformations applied to a
    primitve program.c                 óî   — |t        «       j                  «       k(  sJ d«       ‚|| _        | j                  |«      | _        t        d| j                  «      | _        t        d| j                  «      | _        y )Nz8only support transform on current block of main program.Úvar2dotÚdot2var)r   r3   r4   Ú	init_varsrE   rH   r~   Údot2bar)rM   r4   s     r&   rN   zTransform.__init__Â   sd   € àÔ)Ó+×9Ñ9Ó;Ò;ð	FàEó	FØ;àˆŒ
Ø—N‘N 5Ó)ˆŒ	Ü˜i¨¯©Ó3ˆŒÜ˜i¨¯©Ó3ˆ�r,   c                 óz   — t        «       }|j                  j                  «       D ]  \  }}||t        |«      <   Œ |S r    )r   rE   rj   r"   )rM   r4   rE   Ú_r?   s        r&   r€   zTransform.init_varsË   s6   € Ü‹}ˆØ—j‘j×&Ñ&Ö(‰FˆAˆsØˆD”�C“ŠMð )àˆr,   c                 óz   — | j                   j                  |D �ci c]  }|€Œt        |«      |“Œ c}«       y c c}w r    )rE   Úupdater"   )rM   Únew_varsr$   s      r&   Úadd_varszTransform.add_varsÑ   s2   € Ø�	‰	×Ñ©HÓF©H q¸¹œ"˜Q›% ™(¨HÑFÕGùÒFs   š8¢8c                 ó2  — |€y t        |t        j                  j                  j                  «      r'| j
                  j                  t        |«      |i«       y t        |t        «      st        dt        |«      › �«      ‚|D ]  }| j                  |«       Œ y )Nznew_vars must be list, but got )rU   rV   rW   r   rX   rE   r…   r"   r8   rY   rZ   Úadd_vars_rec)rM   r†   r?   s      r&   r‰   zTransform.add_vars_recÔ   s}   € ØÐØÜ�h¤§¡× 5Ñ 5× >Ñ >Ô?Ø�I‰I×Ñœb ›l¨HÐ5Ô6ØÜ˜(¤DÔ)ÜÐ=¼dÀ8»nÐ=MÐNÓOÐOÛˆCØ×Ñ˜cÕ"ñ r,   c                 óÔ   — | j                   }t        |«      D ]!  }|j                  j                  ||dz   «       Œ# t        |«      D ]  }|j                  |= Œ |j                  «        y )Nr
   )r4   r7   ÚdescÚ
_remove_opr5   Ú_sync_with_cpp)rM   Úordered_indexesr4   Úop_indexs       r&   Ú	erase_opszTransform.erase_opsß   s]   € Ø—
‘
ˆÜ  Ö1ˆHØ�J‰J×!Ñ! (¨H°q©LÕ9ð 2ô ! Ö1ˆHØ—	‘	˜(Ñ#ð 2ð 	×ÑÕr,   c                 ó¤  — |D ]0  }t        |«      | j                  v sŒ| j                  t        |«      = Œ2 | j                  j                  |«       | j                  j                  |«       | j                  }|D ]D  }|j                  }|j                  j                  |j                  «       «       |j                  |= ŒF |j                  «        y r    )r"   rE   r�   rh   r~   rn   r4   rI   r‹   Ú_remove_varÚencoder�   )rM   Úvars_to_eraser?   r4   rI   s        r&   Ú
erase_dotszTransform.erase_dotsê   s    € Û ˆCÜ�#‹w˜$Ÿ)™)Ò#Ø—I‘Iœb ›gÑ&ð !ð 	�‰×#Ñ# MÔ2Ø�‰×%Ñ% mÔ4Ø—
‘
ˆÛ ˆCØ—8‘8ˆDØ�J‰J×"Ñ" 4§;¡;£=Ô1Ø—
‘
˜4Ñ ð !ð 	×ÑÕr,   c                 óâ   — t        |t        j                  j                  j                  «      r| j
                  j                  |«      }|S |D �cg c]  }| j                  |«      ‘Œ }}|S c c}w )zLookup var2dot recursively.)rU   rV   rW   r   rX   r~   rc   Úvar2dot_rec)rM   rE   Údotr?   Údotss        r&   r—   zTransform.var2dot_rec÷   s^   € ä�dœFŸK™K×1Ñ1×:Ñ:Ô;Ø—,‘,×%Ñ% dÓ+ˆCØˆJá15Ó6±¨#�× Ñ  Õ%°ˆÐ6Øˆùò 7s   ÁA,c                 óô   — t        |t        j                  j                  j                  «      r&| j
                  j                  |«      }|€J d«       ‚|S |D �cg c]  }| j                  |«      ‘Œ }}|S c c}w )Nzbar must be not None)rU   rV   rW   r   rX   r�   rc   Údot2bar_rec)rM   r™   Úbarr˜   Úbarss        r&   r›   zTransform.dot2bar_rec   sn   € Ü�dœFŸK™K×1Ñ1×:Ñ:Ô;Ø—,‘,×%Ñ% dÓ+ˆCØ�?Ð:Ð$:Ó:�?ØˆJá15Ó6±¨#�× Ñ  Õ%°ˆÐ6Øˆùò 7s   ÁA5Nc                 óð  — |€A|D �cg c]$  }t        d|j                  |j                  ¬«      ‘Œ& }}| j                  |«       n6t	        |«      t	        |«      k(  sJ dt	        |«      › dt	        |«      › �«       ‚t        ||«      D ]•  \  }}|j                  |j                  k(  s!J d|j                  › d|j                  › �«       ‚|j                  |j                  k(  s!J d|j                  › d|j                  › �«       ‚| j                  j                  ||«       Œ— t        ||| j                  «      \  }}}|D ]  }| j                  j                  |«       Œ |D ]b  }	t        |	«      }
| j                  |
«      }t        |	g|¢­Ž }| j                  |«       t        |	«      }| j                  j!                  ||«       Œd |D �cg c]  }| j                  j#                  |«      ‘Œ }}||fS c c}w c c}w )	až  Performs the linearization transform, a.k.a, forward mode AD
        transform, on a primitive lowered program.

        Args:
            xs: a list of input variables
            ys: a list of output variables
            xs_dot: optional, a list of gradient input variables. The list size
                must be equal to `len(xs)`. The shape and dtype of each element
                must be the same as in `xs`

        Returns:
            (xs_dot, ys_dot): a tuple of two lists. `xs_dot` is the list of
            gradient inputs of the resulting linearized program. `ys_dot` is
            the list gradient outputs of the resulting linearized program

        ç      ð?©ÚshapeÚdtypez4len(xs) should be equal to len(xs_dot), but len(xs)=z and len(xs_dot)=z2x.dtype should be equal to dot.dtype, but x.dtype=z and dot.dtype=z2x.shape should be equal to dot.shape, but x.shape=z and dot.shape=)r   r¡   r¢   r‡   r[   r\   r~   r   rC   r4   rf   r   r—   r   r‰   r   r]   rc   )rM   r9   r:   Úxs_dotr=   r˜   r;   rA   rƒ   r*   ÚinsÚjvp_insÚouts_dotÚoutsr.   Úys_dots                   r&   Ú	linearizezTransform.linearize	  sò  € ð" ˆ>ÙMOÓPÉRÈ”j ¨A¯G©G¸1¿7¹7ÖCÈRˆFÐPØ�M‰M˜&Õ!ä�r“7œc &›kÒ)ð ðÜ" 2›w˜iÐ'8¼¸V»¸ðGóÐ)ô
 ˜"˜f–o‰FˆAˆsØ—7‘7˜cŸi™iÒ'ð ðØ Ÿw™w˜i °s·y±y°kðCóÐ'ð —7‘7˜cŸi™iÒ'ð ðØ Ÿw™w˜i °s·y±y°kðCóÐ'ð �L‰L×Ñ˜Q Õ$ð &ô ' r¨2¨t¯z©zÓ:Ñˆˆi˜ó ˆAØ�L‰L×Ñ Õ"ð ó ˆBô
 % RÓ(ˆCØ×&Ñ& sÓ+ˆGä˜BÐ) Ò)ˆHØ×Ñ˜hÔ'Ü% bÓ)ˆDØ�L‰L× Ñ   xÕ0ð ñ 35Ó5±"¨Q�$—,‘,×%Ñ% aÕ(°"ˆÐ5Ø�vˆ~ÐùòO QùòL 6s   ‡)G.Ç"G3c                 ó2  ‡— t        d„ |D «       «      sJ d«       ‚t        d„ |D «       «      sJ d«       ‚|€Lg }|D ]3  }|j                  t        d|j                  |j                  ¬«      «       Œ5 | j                  |«       n¾t        |«      t        |«      k(  sJ dt        |«      › dt        |«      › �«       ‚t        ||«      D ]y  \  }}|j                  |j                  k(  s!J d	|j                  › d
|j                  › �«       ‚|j                  |j                  k(  rŒZJ d|j                  › d|j                  › �«       ‚ t        ||«      D ]!  \  }}	| j                  j                  ||	«       Œ# t        ||| j                  «      \  }
}}|D ]  }| j                  j                  |«       Œ t        |
«      Š‰j                  d„ |D «       «       ˆfd„}t        |
«      D �]<  }t!        |«      }| j#                  |«      }t%        |||«      }t'        |t(        «      rt+        |«      }n|g}| j-                  |«       t/        |«      }t/        t1        |«      «      }t        |«      t        |«      k(  sJ dt        |«      › dt        |«      › �«       ‚t        ||«      D ]|  \  }}	|	€Œ	| j                  j3                  |«      }|€| j                  j                  ||	«       ŒCt        ||	«      }| j                  |g«       | j                  j                  ||«       Œ~ �Œ? |D �cg c]  }| j                  j3                  |«      ‘Œ }}|sÆt        |
«      dkD  r¸t5        «       }|
D ]%  }|j                  t7        t9        |«      «      «       Œ' g }| j                  }t;        |j<                  «      D ]<  \  }}||
v sŒ|j                  |«       |
j?                  d«       t        |
«      dk(  sŒ< n | jA                  |«       | jC                  |«       ||fS c c}w )a  Performs the transpose transform, a.k.a, reverse mode AD
        transform, on a linearized primitive program.

        Note, `transpose` is supposed to be used in couple with `linearize`.

        Args:
            ys_dot: a list of outputs of the linearized program.
            xs_dot: a list of inputs of the linearized program.
            ys_bar: optional, a list of inputs of the resulting transposed
                program. The list size must be equal to `len(ys_dot)`. The shape
                and dtype of each element must be the same as in `ys_dot`

        Returns:
            (ys_bar, xs_bar): a tuple of two lists. `ys_bar` is the list of
            inputs of the resulting transposed program. `xs_bar` is
            the list outputs of the resulting transposed program

        c              3   ó$   K  — | ]  }|d u–— Œ
 y ­wr    rz   ©r#   r$   s     r&   r'   z&Transform.transpose.<locals>.<genexpr>W  ó   è ø€ Ð1©& Q�1˜D”=©&ùó   ‚z`xs_dot` includes None.c              3   ó$   K  — | ]  }|d u–— Œ
 y ­wr    rz   r¬   s     r&   r'   z&Transform.transpose.<locals>.<genexpr>X  r­   r®   z`ys_dot` includes None.rŸ   r    z<len(ys_dot) should be equal to len(ys_bar), but len(ys_dot)=z and len(ys_bar)=z<y_dot.shape should be equal to y_bar.shape, but y_dot.shape=z and y_bar.shape=z<y_dot.dtype should be equal to y_bar.dtype, but y_dot.dtype=z and y_bar.dtype=c              3   ó6   K  — | ]  }t        |«      |f–— Œ y ­wr    r!   )r#   r?   s     r&   r'   z&Transform.transpose.<locals>.<genexpr>y  s   è ø€ Ð8±¨#œ˜3› ”~±ùs   ‚c                 ó   •— t        | «      ‰v S r    r!   )r$   Údotvarss    €r&   r+   z%Transform.transpose.<locals>.<lambda>{  s   ø€ œ2˜a›5 GÑ+r,   z7len(ins) should be equal to len(ins_bar), but len(ins)=z and len(ins_bar)=r   )"Úallr6   r   r¡   r¢   r‡   r[   r\   r�   r   rC   r4   rf   rF   r…   r7   r   r›   r   rU   Útupler8   r‰   r   r   rc   Úsetr   r   Ú	enumerater5   Úpopr�   r•   )rM   r¨   r£   Úys_barÚ
retain_fwdr.   Úy_dotÚy_barr˜   rœ   r;   Úunused_xs_dotrƒ   Úis_dotr*   r1   Úout_bar_recÚins_bar_recÚins_barr¤   Úgradr=   Úxs_barÚvars_to_removeÚ
op_indexesr4   Úir²   s                              @r&   Ú	transposezTransform.transposeD  sÕ  ø€ ô& Ñ1©&Ó1Ô1ÐLÐ3LÓLÐ1ÜÑ1©&Ó1Ô1ÐLÐ3LÓLÐ1àˆ>ØˆFÛ�Ø—‘œj¨°A·G±GÀ1Ç7Á7ÔKÕLð à�M‰M˜&Õ!ä�v“;¤# f£+Ò-ð ð#Ü#& v£; -Ð/@ÄÀVÃÀðOóÐ-ô !$ F¨FÖ 3‘��uØ—{‘{ e§k¡kÒ1ð ð'Ø',§{¡{ mÐ3DÀUÇ[Á[ÀMðSóÐ1ð —{‘{ e§k¡kÓ1ð ð'Ø',§{¡{ mÐ3DÀUÇ[Á[ÀMðSóÐ1ð !4ô ˜F FÖ+‰HˆC�Ø�L‰L×Ñ˜S #Õ&ð ,ô "+¨6°6¸4¿:¹:Ó!FÑˆˆm˜Qó !ˆCØ�L‰L×Ñ Õ$ð !ô & dÓ+ˆØ�‰Ñ8±Ó8Ô8ã+ˆä˜4—.ˆBÜ$ RÓ(ˆCØ×*Ñ*¨3Ó/ˆKÜ$ R¨°Ó=ˆKô
 ˜+¤uÔ-Ü" ;Ó/‘à*˜m�Ø×Ñ˜kÔ*ä˜kÓ*ˆGÜÔ,¨RÓ0Ó1ˆCÜ�s“8œs 7›|Ò+ð ð Ü # C£˜zÐ);¼CÀ»L¸>ðKóÐ+ô
    WÖ-‘��SØ‘?àŸ<™<×.Ñ.¨sÓ3�DØ�|ØŸ™×(Ñ(¨¨cÕ2ä" 4¨›~˜ØŸ™ t fÔ-ØŸ™×(Ñ(¨¨dÕ3ò .ð+ !ñ@ 39Ó9±&¨Q�$—,‘,×%Ñ% aÕ(°&ˆÐ9áœc $›i¨!šmÜ ›UˆNÛ�Ø×%Ñ%Ü+Ô,?ÀÓ,CÓDõð ð
 ˆJà—J‘JˆEÜ" 5§9¡9Ö-‘��2Ø˜’:Ø×%Ñ% aÔ(Ø—H‘H˜Q”KÜ˜4“y A“~Ùð .ð �N‰N˜:Ô&Ø�O‰O˜NÔ+à�vˆ~Ðùò- :s   Ì$"Pr    )NF)ru   rv   rw   rx   rN   r€   r‡   r‰   r�   r•   r—   r›   r©   rÆ   rz   r,   r&   r|   r|   ¾   s<   „ ñò4òòHò	#ò	òòòó9ôvor,   r|   c                 óÄ  ‡‡‡— ˆfd„Šˆfd„Šˆfd„Š|rt         nt        }|rt        nt        }i }i }i }| j                  j                  «       D ]2  }| j                  |j                  «       «      ||j                  «       <   Œ4 g }	t        «       }
t        t        | j                  «      «      D �]S  }| j                  |   }|	j                  |«        ||j                  «      �É|j                  |vr»t        |«      } ‰|||«       t         ‰t!        |«      «       ‰t#         ||g|¢­Ž «      «      «      D ]q  \  }}|d u |d u z  rJ d«       ‚|
j%                  |j                  «       |||j                  <   |j                  ||j                  <   |j                  ||j                  <   Œs Œÿi }t        t        |j&                  «      «      D ]7  } ‰|j)                  |j&                  |   «      |«      ||j&                  |   <   Œ9 i }t        t        |j*                  «      «      D ]0  }|j-                  |j*                  |   «      ||j*                  |   <   Œ2 i }t/        |j0                  «      D ]  }|j3                  |«      ||<   Œ ddlm} | j                  j9                  «       } ||«      5   ||«      5  t;        | ||j                  |||¬«      }d d d «       d d d «       | j                  j                  |«       �ŒV t=        |	«      D ].  }| j                  j?                  ||dz   «       | j                  |= Œ0 | jA                  «        t        t        | j                  «      «      D ]g  }| j                  |   }|jB                  D ]  }||v sŒ|jE                  |||   «       Œ |jF                  D ]  }||v sŒ|jI                  |||   «       Œ Œi t/        |
«      D ]P  }||v sJ d	|› d
�«       ‚|||   k7  sŒ| j                  jK                  |jM                  «       «       | jN                  |= ŒR | jA                  «        y # 1 sw Y   �ŒsxY w# 1 sw Y   �ŒxxY w)Nc                 óÚ   •— t        t        | «      «      D ]S  }t        | |   t        «      r ‰| |   ||«       Œ$| |   €Œ*| |   j                  |v sŒ<||| |   j                        | |<   ŒU y r    )Úranger[   rU   r8   rI   ©ÚargsÚto_bindÚvalue_tablerÅ   Úbinds       €r&   rÎ   z_lower.<locals>.bind¹  sh   ø€ Ü”s˜4“yÖ!ˆAÜ˜$˜q™'¤4Ô(Ù�T˜!‘W˜g {Õ3Ø�a‘Ñ$¨¨a©¯©¸Ò)@Ø% g¨d°1©g¯l©lÑ&;Ñ<��Q’ñ	 "r,   c                 ó    •— g }| D ]E  }t        |t        «      r|j                   ‰||«      «       Œ,|j                  ||v r||   n|«       ŒG |S r    ©rU   r8   r6   ©ÚnamesrÌ   Úreturn_listrI   Ú	bind_names       €r&   rÔ   z_lower.<locals>.bind_nameÀ  óS   ø€ ØˆÛˆDÜ˜$¤Ô%Ø×"Ñ"¡9¨T°7Ó#;Õ<à×"Ñ"°D¸G±O 7¨4¢=ÈÕNð	 ð
 Ðr,   c                 ót   •— g }| D ]/  }t        |t        «      r| ‰|«      z   }Œ|j                  |«       Œ1 |S r    rÐ   ©r9   rÓ   r=   Úexpand_nested_lists      €r&   rØ   z"_lower.<locals>.expand_nested_listÉ  óB   ø€ ØˆÛˆAÜ˜!œTÔ"Ø)Ñ,>¸qÓ,AÑA‘à×"Ñ" 1Õ%ð	 ð
 Ðr,   ú"orig_out and new_out should match.r   )Úparam_guard)r4   r‹   rZ   ÚinputsÚoutputsÚattrsr
   ú
var_name "ú" is not in to_bind_rev.)(r   r   r   r   r‹   Úall_varsr?   rI   rµ   rÉ   r[   r5   r6   rZ   r   r\   r   r	   r   Úinput_namesÚinputÚoutput_namesÚoutputÚsortedÚ
attr_namesÚattrÚpaddle.base.dygraph.baserÛ   Ú	append_opr   r7   rŒ   r�   Úinput_arg_namesÚ_rename_inputÚoutput_arg_namesÚ_rename_outputr’   r“   rE   )r4   ÚreverseÚ	blacklistÚlower_fnÚ	lookup_fnrÍ   rÌ   Úto_bind_revr?   Úops_to_removerÃ   Úop_idxr*   Ú
input_argsÚorig_outÚnew_outrÜ   rÅ   rÝ   rÞ   rI   rÛ   Únew_op_descÚin_nameÚout_nameÚvar_namerÎ   rÔ   rØ   s                             @@@r&   Ú_lowerrý   ·  sî  ú€ ô=ôôñ %�z¬*€HÙ$+Õ Ô1A€Ià€KØ€GØ€KØ�z‰z×"Ñ"Ö$ˆØ"'§)¡)¨C¯H©H«JÓ"7ˆ�C—H‘H“JÒð %ð €MÜ“U€Nô œ˜EŸI™I›×'ˆØ�Y‰Y�vÑˆØ×Ñ˜VÔ$Ù�R—W‘WÓÐ)¨b¯g©g¸YÑ.FÜ+¨BÓ/ˆJÙ�˜W kÔ2ä%(Ù"Ô#6°rÓ#:Ó;Ù"¤:©h°rÐ.G¸JÒ.GÓ#HÓIö&Ñ!�˜'ð %¨Ð,Ø˜t�Oòð 8à7ó8ð ð ×"Ñ" 7§<¡<Ô0Ø,3�˜GŸL™LÑ)Ø)0¯©�˜Ÿ™Ñ&Ø,4¯M©M�˜GŸL™LÒ)ñ&ð ˆFÜœ3˜rŸ~™~Ó.Ö/�Ù,5Ø—H‘H˜RŸ^™^¨AÑ.Ó/°ó-��r—~‘~ aÑ(Ò)ð 0ð
 ˆGÜœ3˜rŸ™Ó/Ö0�Ø.0¯i©i¸¿¹ÈÑ8JÓ.K�˜Ÿ™¨Ñ*Ò+ð 1ð ˆEÜ˜rŸ}™}Ö-�Ø Ÿg™g d›m��d’ð .å<àŸ*™*×.Ñ.Ó0ˆKÙ˜VÕ$¡k°'Õ&:ÜØØ$ØŸ™Ø!Ø#Øô�÷ ';×$ð �I‰I×Ñ˜RÖ ðY (ô^ ˜=Ö)ˆØ�
‰
×Ñ˜f f¨q¡jÔ1Ø�I‰I�fÑð *ð 
×ÑÔäœ˜EŸI™I›Ö'ˆØ�Y‰Y�vÑˆØ×)Ô)ˆGØ˜+Ò%Ø× Ñ  ¨+°gÑ*>Õ?ð *ð ×+Ô+ˆHØ˜;Ò&Ø×!Ñ! (¨K¸Ñ,AÕBñ ,ð (ô ˜>Ö*ˆà˜Ñ#ð	;à˜�zÐ!9Ð:ó	;Ø#à�{ 8Ñ,Ó,Ø�J‰J×"Ñ" 8§?¡?Ó#4Ô5Ø—
‘
˜8Ñ$ð +ð 
×ÑÕ÷E ';Ñ&:ú×$Ñ$ús$   Ê2	QÊ;QËQÑQÑQÑQ	c                  ó   — y)NTrz   )r=   s    r&   r+   r+   *  s   € ÀTr,   éÿÿÿÿÚfilter_c                 ó<  ‡‡ ‡!— ˆfd„Šˆ fd„Š ˆ!fd„Š!t        | t        j                  j                  j                  «      �r%t        j                  d«       t        }t        }i }i }i }| j                  j                  «       D ]2  }	| j                  |	j                  «       «      ||	j                  «       <   Œ4 g }
t        «       }t        «       }d}t        | j                  «      }t!        |«      }d|cxk  r|k  sn J d|› d|› �«       ‚d|cxk  r|k  sn J d	|› d
|› �«       ‚|dkD  r|dkD  rJ d|› d|› �«       ‚|dkD  rt!        ||z
  «      }|dkD  rt!        ||«      }dx}}t!        |«      D �]¶  }| j                  |   }|
j#                  |«       |j$                  } ||«      duxr  ||«      xr ||v }|s|r| j'                  «        |}|�rd}t(        d   j+                  |«       t-        |«      } ‰|||«        ‰!t/        |«      «      } ‰!t1         ||g|¢­Ž «      «      }t        |«      t        |«      k(  s"J d|› dt        |«      › dt        |«      › �«       ‚t3        ||«      D �]|  \  }}|�|€|t4        vrt7        d|› d|› d|› �«      ‚|€Œ*|��5|j8                  |j8                  k(  s>J d|› d|j                  › d|j8                  › d|j                  › d|j8                  › �
«       ‚d|j:                  vsJ d|› d�«       ‚|j:                  |j:                  k(  s>J d|› d|j                  › d|j:                  › d|j                  › d|j:                  › �
«       ‚|du |du z  rJ d«       ‚|j+                  |j                  «       |||j                  <   |j                  ||j                  <   |j                  ||j                  <   �Œb|j+                  |j                  «       �Œ �Œ‚| j                  j=                  «       }|j?                  |j                  «       �Œ¹ | j'                  «        tA        |
«      D ].  }| j                  jC                  ||dz   «       | j                  |= Œ0 | j'                  «        t!        t        | j                  «      «      D ]g  }| j                  |   }|jD                  D ]  }||v sŒ|jG                  |||   «       Œ |jH                  D ]  }||v sŒ|jK                  |||   «       Œ Œi tM        |«      D ]P  }||v sJ d|› d�«       ‚|||   k7  sŒ| j                  jO                  |jQ                  «       «       | jR                  |= ŒR | j'                  «        tM        |«      D ]8  }| j                  jO                  |jQ                  «       «       | jR                  |= Œ: | j'                  «        | j                  D ]v  }|jU                  |j                  j%                  «       «      sŒ-|j                  jW                  | j                  «       |j                  jY                  | j                  «       Œx |rt[        | |||¬ «       yt        | t\        j^                  «      r| D ]  }t[        ||||¬ «       Œ yt`        ‚)!z\The operators in block wich satisfy the filter conditon will be decomposite into primitives.c                 ó<  •— t        t        | «      «      D ]„  }t        | |   t        «      r ‰| |   ||«       t        | |   t        j
                  j                  j                  «      sŒU| |   €Œ[| |   j                  |v sŒm||| |   j                        | |<   Œ† y r    )	rÉ   r[   rU   r8   rV   rW   r   rX   rI   rÊ   s       €r&   rÎ   z_lower_composite.<locals>.bind0  s‰   ø€ Ü”s˜4“yÖ!ˆAÜ˜$˜q™'¤4Ô(Ù�T˜!‘W˜g {Ô3Ü˜d 1™g¤v§{¡{×'<Ñ'<×'EÑ'EÔFØØ�a‘Ñ$¨¨a©¯©¸Ò)@Ø% g¨d°1©g¯l©lÑ&;Ñ<��Q’ñ "r,   c                 ó    •— g }| D ]E  }t        |t        «      r|j                   ‰||«      «       Œ,|j                  ||v r||   n|«       ŒG |S r    rÐ   rÑ   s       €r&   rÔ   z#_lower_composite.<locals>.bind_name9  rÕ   r,   c                 ót   •— g }| D ]/  }t        |t        «      r| ‰|«      z   }Œ|j                  |«       Œ1 |S r    rÐ   r×   s      €r&   rØ   z,_lower_composite.<locals>.expand_nested_listB  rÙ   r,   z,Atomize composite op to primitive ops begin.Nrÿ   z expect -1 <= backward_length <= z, but got backward_length: zexpect -1 <= start_idx <= z, but got start_idx: zgot start_idx: z and backward_length: FTÚcomposite_ops_recordzwhen replace origin op z[ with composite rule, num of origin outs should be equal to new outs, but len(orig_outs) = z and len(new_outs) = zop z2 should not contain any None value. original outs=z and its composite rule outs=zW with composite rule, origin out dtype should be equal to new out dtype, but orig_out: z.dtype=z and new_out: z1 with composite rule, composite out shape has -1.zW with composite rule, origin out shape should be equal to new out shape, but orig_out: z.shape=rÚ   r
   rß   rà   )Ú	start_idxÚbackward_length)1rU   rV   rW   r   ÚBlockÚloggingÚinfor   r   r‹   rá   r?   rI   rµ   r[   r5   rÉ   r6   rZ   r�   r   r   r   r   r	   r\   r   Ú
ValueErrorr¢   r¡   rê   Ú	copy_fromr7   rŒ   rë   rì   rí   rî   ræ   r’   r“   rE   Ú_has_kernelÚinfer_var_typeÚinfer_shapeÚ_lower_compositeÚtypingÚSequencerY   )"r4   r   r  r  rñ   rò   rÍ   rÌ   ró   r?   rô   rÃ   Únone_vars_to_removeÚchangeÚlengthÚidx_listÚlowerÚ	lower_prerõ   r*   Úop_namerö   Ú	orig_outsÚnew_outsr÷   rø   Úop_descrú   rû   rü   ÚitemrÎ   rÔ   rØ   s"                                  @@@r&   r  r  (  sü  ú€ ô=ôôô �%œŸ™×.Ñ.×4Ñ4Õ5Ü�‰ÐCÔDô ˆÜ$ˆ	àˆØˆØˆØ—:‘:×&Ñ&Ö(ˆCØ&+§i¡i°·±³
Ó&;ˆK˜Ÿ™›
Ò#ð )ð ˆÜ›ˆô "›eÐàˆô �U—Y‘Y“ˆÜ˜“=ˆà�/Ô+ VÔ+ð	cà-¨f¨XÐ5PÐQ`ÐPaÐbó	cØ+ð �)Ô%˜vÔ%ð	Qà'¨ xÐ/DÀYÀKÐPó	QØ%ð ˜bÒ  Y°¢^ð	Pà˜Y˜KÐ'=¸oÐ=NÐOó	Pð 
ð ˜RÒÜ˜V oÑ5Ó6ˆHØ�rŠ>Ü˜Y¨Ó/ˆHà!Ð!ˆ�	ä˜F—mˆFØ—‘˜6Ñ"ˆBØ× Ñ  Ô(Ø—g‘gˆGñ ˜7Ó#¨4Ð/ò 'Ù˜B“Kò'à˜hÐ&ð ñ
 ¡Ø×$Ñ$Ô&ØˆIâØ�ÜÐ2Ñ3×7Ñ7¸Ô@Ü9¸"Ó=�
Ù�Z ¨+Ô6á.Ô/GÈÓ/KÓL�	Ù-Ü™x¨Ð8¨ZÒ8Ó9ó�ô ˜9“~¬¨X«Ò6ð Ø-¨g¨Yð 7,Ü,/°	«NÐ+;Ð;PÔQTÐU]ÓQ^ÐP_ðaóÐ6ô
 *-ØØ÷*Ñ%�H˜gð !Ð(¨G¨OØÔ'7Ñ7ä(Ø! ' Ð*\Ð]fÐ\gð  hEð  FNð  EOð  Póð ð  Ð'à Ø Ñ,Ø'Ÿ~™~°·±Ò>ð Ø5°g°Yð ?-Ø-5¯]©]¨O¸7À8Ç>Á>ÐBRÐR`Ðah×amÑamÐ`nÐnuÐv}÷  wDñ  wDð  vEðFóÐ>ð
  g§m¡mÑ3ðpà4°W°IÐ=nÐoópØ3à'Ÿ~™~°·±Ò>ð Ø5°g°Yð ?-Ø-5¯]©]¨O¸7À8Ç>Á>ÐBRÐR`Ðah×amÑamÐ`nÐnuÐv}÷  wDñ  wDð  vEðFóÐ>ð %-°Ð$4Ø# t˜Oò$ð @à?ó@ð  ð '×*Ñ*¨7¯<©<Ô8Ø4;˜ G§L¡LÑ1Ø18·±˜ §¡Ñ.Ø4<·M±M˜ G§L¡LÓ1à+×/Ñ/°·±Ö>òC*ðF  Ÿ*™*×.Ñ.Ó0�Ø×!Ñ! "§'¡'Ö*ðS $ðV 	×ÑÔä˜}Ö-ˆFØ�J‰J×!Ñ! &¨&°1©*Ô5Ø—	‘	˜&Ñ!ð .ð 	×ÑÔäœC §	¡	›NÖ+ˆFØ—‘˜6Ñ"ˆBØ×-Ô-�Ø˜kÒ)Ø×$Ñ$ W¨k¸'Ñ.BÕCð .ð ×/Ô/�Ø˜{Ò*Ø×%Ñ% h°¸HÑ0EÕFñ 0ð ,ô ˜~Ö.ˆHà˜KÑ'ð?à˜H˜:Ð%=Ð>ó?Ø'à˜; xÑ0Ó0Ø—
‘
×&Ñ& x§¡Ó'8Ô9Ø—J‘J˜xÑ(ð /ð 	×ÑÔäÐ2Ö3ˆHØ�J‰J×"Ñ" 8§?¡?Ó#4Ô5Ø—
‘
˜8Ñ$ð 4ð 	×ÑÔà—)”)ˆBØ�~‰~˜bŸg™gŸl™l›nÕ-Ø—‘×&Ñ& u§z¡zÔ2Ø—‘×#Ñ# E§J¡JÕ/ð ñ
 ÜØØØ#Ø /õ	ð 	ä	�Eœ6Ÿ?™?Ô	+ÛˆDÜØØØ#Ø /ö	ð ð 	äˆr,   c                 óœ   — | €t        «       j                  «       n| } | t        «       j                  «       k(  sJ d«       ‚t        | dg ¬«       y)a-  
    Note:
        **This API is ONLY available in the static graph mode.**
        **Args block must be None or current block of main program.**

    All operators in the target block are processed as follows.
    If it is an original operator, it will be transformed into
    one or a series of automatic differential basic operators with
    equivalent function.

    Args:
        block(paddle.static.Block|None, optional): The
            target block to process on. Default None, and will
            process on the current block of main program.
    Nú7block is neither None nor current block of main programF©rï   rð   ©r   r3   rý   )r4   s    r&   Ú	orig2primr"  û  sO   € ð$ 7<°mÔ Ó"×0Ñ0Ô2È€EàÔ%Ó'×5Ñ5Ó7Ò7ðAà@óAØ7ä
ˆ5˜%¨2Ö.r,   c                 ó¨   — | €t        «       j                  «       n| } | t        «       j                  «       k(  sJ d«       ‚|€g n|}t        | d|¬«       y)a  
    Note:
        **ONLY available in the static graph mode.**
        **Args block must be None or current block of main program.**

    All operators in the target block are processed as follows.
    If it is an automatic differential basic operator, it will be
    transformed into one or a series of original operators with
    equivalent function to support execution.

    Args:
        block(paddle.static.Block|None, optional): The
            target block to process on. Default None, and will
            process on the current block of main program.
        blacklist(list[string]|None, optional): The names of automatic
            differential basic operator that will not be transformed
            into original operators. Default None, and the blacklist
            is treated as empty list.

    Examples:

        .. code-block:: python

            >>> import paddle
            >>> from paddle.incubate.autograd import enable_prim, prim_enabled, prim2orig

            >>> paddle.enable_static()
            >>> enable_prim()

            >>> x = paddle.ones(shape=[2, 2], dtype='float32')
            >>> x.stop_gradients = False
            >>> y = x * x
            >>> dy_dx = paddle.static.gradients(y, x)
            >>> if prim_enabled():
            ...     prim2orig()
    Nr  Tr   r!  )r4   rð   s     r&   Ú	prim2origr$    s\   € ðN 7<°mÔ Ó"×0Ñ0Ô2È€EàÔ%Ó'×5Ñ5Ó7Ò7ðAà@óAØ7àÐ'‘¨Y€IÜ
ˆ5˜$¨)Ö4r,   r    )NN)1r	  r  Úcollectionsr   rV   Úpaddle.baser   Úpaddle.base.corer   r   Úpaddle.base.frameworkr   r   Úpaddle.incubate.autograd.utilsr	   Úcomposite_rulesr   Úprimopsr   r   Úprimregr   r   r   r   r   Ú	primrulesr   r   r   r   Úutilsr   r   r   r   r   r   rC   rF   rH   r|   rý   ÚCallableÚboolr  Ústatic_onlyr"  r$  rz   r,   r&   Ú<module>r2     sÓ   ðó Û Ý #ã Ý !ß :ß @Ý 5å 'ß $÷õ ÷ @Ó ?÷÷ ó;=ò|÷$=2ñ =2÷Buñ uòrnñf <JØØñ	Pà�_‰_˜i×0Ñ0Ð1°4Ð7Ñ8óPðf ×Ñò/ó ð/ð0 ×Ñò+5ó ñ+5r,   