
    x-jh                    X   d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dl	Z
d dlZd dlmc mZ d dlmZ d dlmZ d dlmZ d d	lmZ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! 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-m.Z.m/Z/ erddl0m1Z1 g Z2 e%            Z3 e             Z4d Z5ddddZ6 G d d          Z7 G d d          Z8 G d d          Z9 G d d          Z: G d  d!          Z; G d" d#          Z< G d$ d%e<          Z= G d& d'          Z>ed(             Z?	 d0d1d/Z@dS )2    )annotationsN)contextmanager)cached_property)TYPE_CHECKING)_C_ops)	ValueDict)grad)core	framework)BuildStrategy)
check_type)switch_to_static_graph)Value
fake_valueget_fake_value_nameis_fake_value   )event_register   )TranslatorLogger)	RETURN_NO_VALUE_MAGIC_NUMBackendCUDAGraphStateTimeCounterauto_layout_is_enabledbackend_guardcse_is_enabledmaybe_dynamic_shape_tensoruse_specialized_device)ConcreteProgramc                <    t          |           rt          S | j        S N)r   FAKE_VALUE_NAMEname)values    h/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/jit/dy2static/pir_partial_program.pyget_value_namer'   <   s     U :    T
enable_cseenable_delete_assert_opc                   t           j                            d          }|r|                    di            |r|                    di            |                    |            d S )Nr   %common_subexpression_elimination_passdelete_assert_op_pass)paddlepirPassManageradd_passrun)programr*   r+   pms       r&   apply_general_passesr6   B   sg     
			"	"B A
;R@@@ 1
+R000FF7OOOOOr(   c                  \    e Zd ZdZd Zed             Zd Zd Ze	d             Z
d Zd Zd	S )
NestSequencea  
    A wrapper class that easily to flatten and restore the nest structure of
    given sequence. It also remove the duplicate variables in the sequence.
    For example:
    >>> t = [v1, v2, v1]
    >>> m = tolist(t)
    [v1, v2]
    >>> m.restore([t1, t2])
    [t1, t2, t1]
    c                V    || _         |                                 \  | _        | _        d S r"   )
_raw_input_tolist_var_map	_var_list)self	raw_inputs     r&   __init__zNestSequence.__init__Y   s#    #(,%t~~~r(   c                    | j         S r"   r=   r>   s    r&   var_listzNestSequence.var_list]   s
    ~r(   c                    t                      }g }t          j                            | j                  D ]D}t          |t                    s||v rt          |          ||<   |                    |           E||fS )zx
        Flattens the nested sequences into single list and remove duplicate variables + non-variable elements.
        )	r   r/   utilsflattenr:   
isinstancer   lenappend)r>   variable_mapvariable_listr%   s       r&   r;   zNestSequence._tolista   s     !{{\))$/:: 	( 	(EeU++ $$"%m"4"4L  '''']**r(   c                $    t           j                  t                    k    sJ  fd}t          j                             j        t          t          |t          j                             j                                                S )z@
        Restores the nested sequence from tensor list.
        c                X    t          | t                    rj        |                   S | S r"   )rH   r   r<   )xr>   tensor_result_lists    r&   to_tensor_resultz.NestSequence.restore.<locals>.to_tensor_resultw   s,    !U## <)$-*:;;Hr(   )	rI   r=   r/   rF   pack_sequence_asr:   listmaprG   )r>   rP   rQ   s   `` r&   restorezNestSequence.restoreq   s     4>""c*<&=&=====	 	 	 	 	 	
 |,,O%v|';';DO'L'LMMNN
 
 	
r(   c                      j         }t          |          dk    r|d         }t          d |D                       sJ  fd|D             S )Nr   r   c              3  @   K   | ]}t          |t                    V  d S r"   )rH   r   .0vs     r&   	<genexpr>z/NestSequence.quick_index_map.<locals>.<genexpr>   s,      <<A:a''<<<<<<r(   c                *    g | ]}j         |         S  )r<   rY   rZ   r>   s     r&   
<listcomp>z0NestSequence.quick_index_map.<locals>.<listcomp>   s     555Qa 555r(   )r:   rI   all)r>   
raw_inputss   ` r&   quick_index_mapzNestSequence.quick_index_map   sa    _
z??a#AJ<<<<<<<<<<5555*5555r(   c                *    fd| j         D             S )Nc                     g | ]
}|         S r]   r]   )rY   idxtensor_lists     r&   r_   z.NestSequence.quick_restore.<locals>.<listcomp>   s    AAASC AAAr(   )rb   )r>   rf   s    `r&   quick_restorezNestSequence.quick_restore   s     AAAAD,@AAAAr(   c                    | j         |         S r"   rB   )r>   items     r&   __getitem__zNestSequence.__getitem__   s    ~d##r(   N)__name__
__module____qualname____doc__r@   propertyrD   r;   rU   r   rb   rg   rj   r]   r(   r&   r8   r8   M   s        	 	7 7 7   X+ + + 
 
 
  6 6 _6B B B$ $ $ $ $r(   r8   c                     e Zd ZdZed             Zed"d            Zed             Zd Z	ed             Z
ed	             Zed
             Zed             Zed             Zed             Z	 	 	 d#dZd Zd Zd Zd Zd Zd Zd Zed             Zed             Zed$d            Zed%d            Zed             Zed              Zed!             ZdS )&RunnablePrograma  a pir program ready for run_program_op to run. constructed by 3 parts:
    - pir program (pir::Program)
    - in_out_values
        - input_x values ([string | pir::Value])
        - input_param values ([string | pir::Value])
        - output values ([string | pir::Value])
    - forward_backward_ranges
        - forward_range (tuple(Int, Int)) | None
        - backward_range (tuple(Int, Int)) | None
    c                T    g fd |                                             S )Nc                                         |                                                                            | j        D ]K}                     |                                           |                                D ]}  |            Ld S r"   )extendkwargsvaluesopsresultsblocks)blockop
all_valuesextend_valuess     r&   r}   z>RunnableProgram._get_program_all_values.<locals>.extend_values   s    ellnn3355666i ) )!!"**,,///YY[[ ) )E!M%(((()) )r(   )global_block)r4   r|   r}   s    @@r&   _get_program_all_valuesz'RunnableProgram._get_program_all_values   sK    
	) 	) 	) 	) 	) 	) 	g**,,---r(   returndict[str, Value]c                    t           t                      i}t                              |           D ]}|j        D ]}|||<   |S r"   )r#   r   rq   r   _names)r4   name_to_value_dictr%   r$   s       r&    _get_name_value_map_from_programz0RunnableProgram._get_name_value_map_from_program   sX    0?/N$<<WEE 	1 	1E 1 1+0"4((1!!r(   c                @    t                               | j                  S r"   )rq   r   r4   rC   s    r&   name_value_mapzRunnableProgram.name_value_map   s    ??MMMr(   c                ~    t          |          dk    rg S t          |d         t                    r|S d |D             S )Nr   c                ,    g | ]}t          |          S r]   r'   rX   s     r&   r_   z0RunnableProgram.convert_name.<locals>.<listcomp>   s     222aq!!222r(   )rI   rH   str)r>   rv   s     r&   convert_namezRunnableProgram.convert_name   sG    v;;!IfQi%% 	M2262222r(   c                *      fd j         D             S )Nc                *    g | ]}j         |         S r]   r   r^   s     r&   r_   z,RunnableProgram.x_values.<locals>.<listcomp>   s!    ===1#A&===r(   )x_namesrC   s   `r&   x_valueszRunnableProgram.x_values   s    ========r(   c                *      fd j         D             S )Nc                *    g | ]}j         |         S r]   r   r^   s     r&   r_   z0RunnableProgram.param_values.<locals>.<listcomp>   s!    AAA1#A&AAAr(   )param_namesrC   s   `r&   param_valueszRunnableProgram.param_values   s     AAAA0@AAAAr(   c                *      fd j         D             S )Nc                *    g | ]}j         |         S r]   r   r^   s     r&   r_   z.RunnableProgram.out_values.<locals>.<listcomp>   s!    ???1#A&???r(   )	out_namesrC   s   `r&   
out_valueszRunnableProgram.out_values   s    ????????r(   c                *      fd j         D             S )Nc                *    g | ]}j         |         S r]   r   r^   s     r&   r_   z1RunnableProgram.x_grad_values.<locals>.<listcomp>   !    BBB1#A&BBBr(   )x_grad_namesrC   s   `r&   x_grad_valueszRunnableProgram.x_grad_values        BBBB0ABBBBr(   c                *      fd j         D             S )Nc                *    g | ]}j         |         S r]   r   r^   s     r&   r_   z5RunnableProgram.param_grad_values.<locals>.<listcomp>   r   r(   )p_grad_namesrC   s   `r&   param_grad_valuesz!RunnableProgram.param_grad_values   r   r(   c                *      fd j         D             S )Nc                *    g | ]}j         |         S r]   r   r^   s     r&   r_   z3RunnableProgram.out_grad_values.<locals>.<listcomp>   r   r(   )o_grad_namesrC   s   `r&   out_grad_valueszRunnableProgram.out_grad_values   r   r(   Nc                   t          |t                    s
J d            t          |          dk    s
J d            t          |d         t                    s
J d            || _        |                     |d                   | _        |                     |d                   | _        |                     |d                   | _        || _	        || _
        || _        d| _        d| _        | j
        2dt          | j                                        j                  f| _
        | j        [t          | j                                        j                  t          | j                                        j                  f| _        |g g g f}|                     |d                   | _        |                     |d                   | _        |                     |d                   | _        | j
        d         t          | j                                        j                  k     r/| j                                        j        | j
        d                  nd | _        | j        d         dk    ro| j        d         dz
  t          | j                                        j                  k     r2| j                                        j        | j        d         dz
           nd | _        | j        d         t          | j                                        j                  k     r/| j                                        j        | j        d                  nd | _        d S )Nz)in_out_values must be tuple with len == 3   r   r   r   F)rH   tuplerI   rS   r4   r   r   r   r   out_stop_gradientsforward_rangebackward_rangehas_splitedfinish_passr~   rw   r   r   r   fwd_end_next_opbwd_start_pre_opbwd_end_nex_op)r>   r4   in_out_valuesr   grad_in_out_valuesr   r   s          r&   r@   zRunnableProgram.__init__   s(    -// 	
 	
7	
 	
/ =!!Q&&&7 '&& -*D11 	
 	
7	
 	
1 ((q)9::,,]1-=>>**=+;<<"4*,  %"#S)B)B)D)D)H%I%I!JD&DL--//344DL--//344#D %!#R --.@.CDD --.@.CDD --.@.CDD
 !!$s4<+D+D+F+F+J'K'KKK L%%''+D,>q,ABB 	 #A&**'*Q.dl//115667 7 L%%''+D,?,BQ,FGG  	 "1%DL,E,E,G,G,K(L(LLL L%%''+D,?,BCC 	r(   c                   | j         | j        dt          | j                                        j                  f| _        t          | j                                        j                  t          | j                                        j                  f| _        d S | j        d         }| j        d         }| j        d         }| j        d         }t          | j                                        j                  D ]/\  }}|| j         k    r|}|| j        k    r|dz   }|| j	        k    r|}0| j	        +t          | j                                        j                  }||f| _        ||f| _        d S Nr   r   )
r   r   rI   r4   r~   rw   r   r   	enumerater   )r>   	fwd_startfwd_end	bwd_startbwd_endre   r{   s          r&   update_op_rangezRunnableProgram.update_op_range  sh   '4+@+H"#S)B)B)D)D)H%I%I!JDDL--//344DL--//344#D
 *1-I(+G+A.I)!,G$T\%>%>%@%@%DEE " "R---!G... #aI,,,!G"*dl7799=>>"+W!5D#,g"6Dr(   c                    t           j        j        j                            | j                  \  }}t          || j        | j        | j	        f| j
        d | j        | j                  S r"   )r/   base	libpaddler0   clone_programr4   rq   r   r   r   r   r   r   )r>   cloned_program_s      r&   clonezRunnableProgram.clone,  sf    "K15CCL
 
 \4+T^<#
 
 	
r(   c                2   | j         du s
J d            d| _         |                                  t          j        j        j                            | j        | j        | j	        | j
        | j        | j        | j        | j        | j        	  	        \  \  }}}||g|fS )NFzJPlease ensure only split once! don't call split_forward_backward manually.T)r   r   r/   r   r   r0   split_programr4   r   r   r   r   r   r   r   r   )r>   fwd_progbwd_prog	prog_attrs       r&   split_forward_backwardz&RunnableProgram.split_forward_backward9  s    5(((X )((   K!%33LMO" 

 

	
 (#Y..r(   c                \   | j         }| j        }t                              dd| d           t                              dd| d           | j        } ||||          \  | _         | _        t                              dd| d           t                              dd| d           dS )a  
        Main entries for pass function, without considering any input/output and forward segmentation.
        pass_fn' signature is:

        1. This function will change forward and backward program.
        2. call self.program_attr means start to run.
        so we can't call this function after program_attr is called.

        def pass_fn(forward_program, backward_program):
            return forward_program, backward_program
        r   z<******** [JIT] PIR forward program before PIR PASS ********
 z=******** [JIT] PIR backward program before PIR PASS ********
z;******** [JIT] PIR forward program after PIR PASS ********
z<******** [JIT] PIR backward program after PIR PASS ********
N)forward_programbackward_programprog_loggerlogprogram_name_attr)r>   pass_fn
origin_fwd
origin_bwdr   s        r&   apply_pir_program_passz&RunnableProgram.apply_pir_program_passR  s     )
*
YJYYY	
 	
 	
 	ZZZZZ	
 	
 	

 !26=g
$57
 7
3d3 	X:XXX	
 	
 	
 	YJYYY	
 	
 	
 	
 	
r(   c                \    | j                                         j        D ]}|j         dS dS )NTF)r4   r~   rw   	dist_attr)r>   r{   s     r&   is_distributed_programz&RunnableProgram.is_distributed_programw  s;    ,++--1 	 	B|'tt (ur(   c                    |                                  r5t          j        j        j        j                            | j                   d S d S r"   )r   r/   distributedauto_parallelstaticmix_to_dist_passapply_mix2dist_passr4   rC   s    r&   "apply_dist_pass_for_origin_programz2RunnableProgram.apply_dist_pass_for_origin_program}  sS    &&(( 	,3DXX    	 	r(   c                2   |                                  rt          j        j        j        j                            | j                   t          j        j        j        j        	                    | j                   t          j        j        j        j        j
                            | j                   t          j        j        j                            | j                   t          j        j        j        j                            | j                   d S d S r"   )r   r/   r   r   r   r   r   r4   pir_passapply_partition_passReshardPassesapply_reshard_passr   r   r0   apply_dist2dense_passremove_unuseful_comm_op_passrC   s    r&   !apply_dist_pass_for_whole_programz1RunnableProgram.apply_dist_pass_for_whole_program  s    &&(( 	,3DXX   ,3<QQ   ,3<J]]   K!%;;DLIII,3<YY    	 	r(   c                *    |                                  S r"   )r   rC   s    r&   _forward_backward_programz)RunnableProgram._forward_backward_program  s    **,,,r(   c                |   | j         du s
J d            d| _         t                              | j                  | j        }|d         }i }t                              | j        |          }t                              | j        |          }|                                D ]K\  }}||ht          |          z  r2||v r|	                    |           ||v r|	                    |           Lt          
                    | j        |           i }| j                                        D ]'\  }}|dk    rfd|D             || d<   ||| d<   (t          |d	                   t          | j                  k    s
J d
            t          |d	         | j                  D ]\  }	}
t          |	          r|
|	_        |S )NFzgprogram_attr() is called by PartialProgramLayer, don't call it manually, use program_name_attr instead.Tno_need_buffersfoc                T    g | ]$}                     |t                                %S r]   getr   )rY   nfwd_maps     r&   r_   z0RunnableProgram.program_attr.<locals>.<listcomp>  s8     / / /56GKK:<<00/ / /r(   _valuesr   	fo_valuesz0Output values and stop gradients length mismatch)r   rq   r   r   r   unify_value_namesr   itemssetremoveupdate_program_name_attrrI   r   zipr   stop_gradient)r>   r   no_need_buffer_namesrename_mappingoriginal_namenew_nameprogram_attrknsrZ   r   r   s              @r&   r   zRunnableProgram.program_attr  s?   5(((u )((  !BB 
 
 !201BC(:: .
 
 )::!>
 
 (6';';'='= 	: 	:#M8x(3/C+D+DD : $888(//>>>333(//99900"N	
 	
 	
 +1133 	, 	,EArDyy/ / / /:</ / /]]]+ *,LA&& <,--T5L1M1MMMM> NMM !$%t'>!
 !
 	, 	,A} Q +AOOr(   r   dict[str, str]c                   t          |          }t                              |           D ]b}|j        s
|j        }|                    ||          }|                    |                    ||                                                      ct                              |           D ]2}|j        r)|	                                sJ d| d|j
                     3|S )z7Ensure every value at most has one name in the program.z7Expected all values in Program have only one name, but z has multiple names: )dictrq   r   has_namer$   r   update_renamer~   _has_only_one_namer   )r4   r   r%   r   s       r&   r   z!RunnableProgram.unify_value_names  s    
 n--$<<WEE 	 	E> zH%))(H==H!!h(<(<(>(>??    %<<WEE 	 	E~ //11  xexxjojvxx 1 r(   	name_attrdict[str, list[str]]c                ^    |                                  D ]\  }}fd|D             | |<   d S )Nc                ,    g | ]}|v r|         n|S r]   r]   )rY   rZ   r   s     r&   r_   z<RunnableProgram.update_program_name_attr.<locals>.<listcomp>  s:       DEQ.%8%8q!!a  r(   )r   )r  r   r   vss    `  r&   r   z(RunnableProgram.update_program_name_attr  sZ     __&& 	 	EAr   IK  IaLL	 	r(   c                v    | j         d         }i }|                                D ]\  }}d |D             ||<   |S )Nr   c                ,    g | ]}t          |          S r]   r   rX   s     r&   r_   z5RunnableProgram.program_name_attr.<locals>.<listcomp>  s     >>>aq 1 1>>>r(   )r   r   )r>   origin_attr_program_attrr   r  s        r&   r   z!RunnableProgram.program_name_attr  sT    4Q7 &&(( 	? 	?EAr>>2>>>M!r(   c                (    | j         d         d         S )Nr   r   rC   s    r&   r   zRunnableProgram.forward_program      -a033r(   c                (    | j         d         d         S r   r  rC   s    r&   r   z RunnableProgram.backward_program  r  r(   )r   r   NNN)r   r  r   r  )r  r	  r   r  )rk   rl   rm   rn   staticmethodr   r   r   r   r   r   r   r   r   r   r   r@   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r]   r(   r&   rq   rq      s       	 	   \ " " " \" N N _N3 3 3 > > _> B B _B @ @ _@ C C _C C C _C C C _C  ;
 ;
 ;
 ;
z7 7 74
 
 
/ / /2#
 #
 #
J      " - - _- 2 2 _2h    \*    \   _ 4 4 _4 4 4 _4 4 4r(   rq   c                       e Zd Zd Zd Zd ZdS )PartialProgramLayerHookc                
    ||fS r"   r]   )r>   r   src_varss      r&   before_append_backwardz.PartialProgramLayerHook.before_append_backward  s    ((r(   c                    |||fS r"   r]   )r>   whole_programinputsr  grad_outputsforward_end_idxbackward_start_idxs          r&   after_append_backwardz-PartialProgramLayerHook.after_append_backward  s     ox77r(   c                    |S r"   r]   )r>   infer_programs     r&   after_inferz#PartialProgramLayerHook.after_infer  s    r(   N)rk   rl   rm   r  r"  r%  r]   r(   r&   r  r    sA        ) ) )	8 	8 	8    r(   r  c                  "    e Zd ZdZdZd Zd ZdS )OperatorIndexPreservePasspreserved_index_r   c                    t           j         t           j         | _        t           xj        dz  c_        || _        || _        d S Nr   )r'  OP_NAME_PREFIXcounterr$   r   index)r>   r-  r   s      r&   r@   z"OperatorIndexPreservePass.__init__  sA    0?dAZAbdd	!))Q.))


r(   c                j   t          |                                j                  dk    r"| j        dk    sJ |                     |          S t
          j        j        j        	                    ||                                j        d         
                    d          | j        | j                   |                     |          }d}|                                j        D ]B}|                                dk    r#| j        |                                d         v r n|dz  }C|t          |                                j                  k    rt          d| j         d          |                                                    |                                j        |                    || _        |S )Nr   builtin.shadow_outputoutput_namer   z Can't find index preserve label z, don't remove it in pass.)rI   r~   rw   r-  r   r/   r   r   r0   append_shadow_outputresultr$   attrsRuntimeError	remove_op)r>   r4   	new_indexr{   s       r&   __call__z"OperatorIndexPreservePass.__call__  s   w##%%)**a//:????<<(((!66  ""&q)0033IJ		
 	
 	
 ,,w''	&&((, 	 	B		444IM!:::NIIG002267777X49XXX   	(()=)=)?)?)CI)NOOO
r(   N)rk   rl   rm   r+  r,  r@   r7  r]   r(   r&   r'  r'    s<        'NG      r(   r'  c                      e Zd Zd Zd ZdS )IndicesPreservePassc                0    || _         || _        d | _        d S r"   )r   indicesnew_indices)r>   r;  r   s      r&   r@   zIndicesPreservePass.__init__8  s    r(   c                    | j         g}t          | j                  D ].\  }}|                    t	          |||                              / |d         |          }d |dd          D             | _        |S )Nc                    g | ]	}|j         
S r]   )r-  )rY   ps     r&   r_   z0IndicesPreservePass.__call__.<locals>.<listcomp>C  s    888AG888r(   r   )r   r   r;  rJ   r'  r<  )r>   r4   passesre   r-  new_programs         r&   r7  zIndicesPreservePass.__call__=  s    ,#DL11 	I 	IJCMM3E6#;GGHHHH fRj))88VABBZ888r(   N)rk   rl   rm   r@   r7  r]   r(   r&   r9  r9  7  s2             
    r(   r9  c                  P    e Zd ZdZd Zd Zed             Zed             Zd Z	dS )ValuePreservePasspreserved_value_c                "    || _         || _        d S r"   )rv   use_cinn_pass)r>   rv   rG  s      r&   r@   zValuePreservePass.__init__J  s    *r(   c                     t          d          )NzNot implemented.)r4  )r>   r4   s     r&   applyzValuePreservePass.applyN  s    -...r(   c                     d fd}|S )Nr   c                       } dz  | S r*  r]   )r$   countprefixs    r&   name_genz9ValuePreservePass.create_name_generator.<locals>.name_genU  s!    %e%%DQJEKr(   r]   )rM  rN  rL  s   ` @r&   create_name_generatorz'ValuePreservePass.create_name_generatorQ  s.    	 	 	 	 	 	 r(   c           	         t          |           rd S | |v r||          S  |            }||| <   t          j        j        j                            || |t          |                                j                             |S r"   )	r   r/   r   r   r0   r1  rI   r~   rw   )r%   r4   
value2namename_generatorr$   s        r&   attach_preserved_namez'ValuePreservePass.attach_preserved_name]  s     	4Je$$~ 
5!66$$&&*++		
 	
 	
 r(   c                &   t                      t                              t          j                  t          j                            fd| j                  }|                               i g }	                                j
        D ]}|                                dk    r|                                d                             t          j                  rW|                    d                                          |                                d         <   |                    |           |D ])}	                                                    |           *t          j                            fd|          | _        S )Nc                >    t                               |           S r"   )rD  rS  )r%   rR  r4   rQ  s    r&   <lambda>z,ValuePreservePass.__call__.<locals>.<lambda>t  s$    +AA	  r(   r/  r0  r   c                H                         | t                                S r"   r   )r$   name2new_values    r&   rV  z,ValuePreservePass.__call__.<locals>.<lambda>  s    ++D*,,?? r(   )r   rD  rO  r+  r/   rF   map_structurerv   rI  r~   rw   r$   r3  
startswithoperandsourcerJ   r5  )r>   r4   namesto_remove_opr{   rX  rR  rQ  s    `   @@@r&   r7  zValuePreservePass.__call__m  s   [[
*@@,
 
 **      K
 
  **W%% &&((, 	, 	,Bwwyy33388::m,77%4  , AC

A Afhh #288::m#<= !''+++  	1 	1B  "",,R0000l00????
 
 r(   N)
rk   rl   rm   r+  r@   rI  r  rO  rS  r7  r]   r(   r&   rD  rD  G  s|        'N+ + +/ / / 	 	 \	   \) ) ) ) )r(   rD  c                      e Zd Zd ZdS )FullGraphPreProcessPassc                   t           j        j        j                            |          }| j        rt           j        j        j                                        }|                    di            t           j        j        j                            ||           t           j        j        j        	                    ||           |
                    |           |S )Nr.   )r/   r   r   r0   apply_bn_add_act_passrG  r1   r2   infer_symbolic_shape_passreduce_as_sum_passr3   )r>   r4   r5   s      r&   rI  zFullGraphPreProcessPass.apply  s    +'+AA'JJ 	&*6688BKK/444K!%??GLLLK!%88WEEEFF7OOOr(   N)rk   rl   rm   rI  r]   r(   r&   r`  r`    s#        	 	 	 	 	r(   r`  c                      e Zd ZdZdZ	 d%dd fdZed             Zd Z e	d          d             Z
d	 Zed&d            Zd Zd'dZed(d&d            Zed             Zed             Zed&d            Zed             Zed&d            Zed&d            Zd Zed)d            Zd(dZd Zd'dZd Zed             Zd Z d  Z!d*d"Z"d# Z#ed$             Z$ xZ%S )+PartialProgramLayera  
    PartialProgramLayer wraps all the ops from layers decorated by `@to_static`
    and execute them as a static subgraph.

    .. note::
        **1. This is a very low level API. Users should not use this API
             directly. Please use `partial_program_from(concrete_program)`
             to create it.
        **2. TensorArray is not currently supported in the output.

    Args:
        main_program(Program): The main program that contains ops need to be executed.
        inputs(list[Variable]): The input list of the decorated function by `@to_static`.
        outputs(list[Variable]): The output list of the decorated function by `@to_static`.
        parameters(list[Tensor]|None): All trainable parameters included in the program. Default None.
        constraints(list[tuple[str, int|None, int|None]]): A list to specify the constraints of the program. Default None.

    Returns:
        Layer: A Layer object that run all ops internally in static graph mode.
    N)constraintsc                  t                                                       t          |          | _        t          |          | _        ||ng | _        ||ng g f\  | _        | _        |                    dt                                | _
        t          | j
        t                    sJ |                     || j                  | _        |$| j        |d         d d <   | j        |d         d d <   d| _        i | _        d\  }}}	t!          j                    }
|
r|
                                \  }}	|
j        }|5|dv r1t(          j        j        j                            ||	|          | _        i | _        g | _        |                    dt8          j                  | _        i | _        tA                      | _!        i | _"        d S )	Nbuild_strategyr   r   Tr  )float16bfloat16)custom_white_listcustom_black_listdtypebackend)#superr@   r8   _inputs_outputs_constraints_params_param_valuesr   r   _build_strategyrH   _verify_program_origin_main_programtraining_program_extra_infor   _dygraph_tracer_get_amp_op_list
_amp_dtyper/   r   amp
fp16_listsAutoMixedPrecisionLists	_amp_list_scope_cache_hookersr   PHI_backend_grad_var_namesr   _compile_time_counter_prog_attrs_map_cache)r>   main_programr  outputs
parametersrg  ru   	amp_dtyperl  rm  tracer	__class__s              r&   r@   zPartialProgramLayer.__init__  s    	#F++$W--+6+BKK$0JJr2h 	)d(  &zz*:MOOLL$.>>>>>$($8$8$-%
 %
! !#|JqM!!!#1JqM!!!#% :J7	$&7*,, 	*393J3J3L3L00)I Y2I%I%I !,DD&7&7# E   N 

9gk::!%0]]"%'"""r(   c                   |\  }}t           j        j                            t           j        j                            |          ||d         t
          j        k    |d                   }t          j        t          
                    |          t          
                    |          |                     |d          ||          S )Ncuda_graph_statecuda_graph_dispatch_keyT	cache_keyuse_scope_cache)r/   r   r
   calc_scope_cache_keyget_program_id_from_attrsr   DISABLEr   run_programrf  _valid_vars_create_scope_vec)partial_program_layerr  r  r3  
prog_attrscuda_graph_attrsscope_cache_keys          r&   run_implzPartialProgramLayer.run_impl  s    ',$
$ +*??K66zBB/0N4JJ67	
 
 !++F33++J77!33) $ 4   	
 	
 		
r(   c                    |                      d          }|                     |          }|                     || j        |          }|                     |          }|                     |          S )zQ
        Execute static graph by Interpreter and Return dynamic Tensors.
        Fin_sot_mode)_prepare_attributes_prepare_inputscall_run_impl_with_hookrt  _restore_out_remove_no_value)r>   r  r3  outrestored_nest_outs        r&   r7  zPartialProgramLayer.__call__	  sx     ((U(;;%%f--**L
 
 !--c22$$%6777r(   zsot call partial_programc                    |                      d          }|                     || j        |          }| j                            |          S )zz
        In sot, inputs and outputs of partial program only contain tensors, so we can skip some step to speed up
        Tr  )r  r  rt  rr  rg   )r>   r  r3  r  s       r&   sot_callzPartialProgramLayer.sot_call  sR    
 ((T(::**L
 

 }**3///r(   c                    t           j        )t          j                            |           |||          S t                               t           j                            |           |||          S r"   )rf  HOOKED_RUN_IMPLr  __get__)r>   r  r  r3  s       r&   r  z+PartialProgramLayer.call_run_impl_with_hook'  sp     .6&/77==   '66#,44T::	  r(   r   rq   c                r   t          | j        j                  }t          | j        j                  }d |D             }| j        }t
          j        j        j        	                    | j
        |t          | j
                                        j                  d           t          | j
        |||f|          S )Nc                    g | ]	}|j         
S r]   r   rX   s     r&   r_   z?PartialProgramLayer.origin_runnable_program.<locals>.<listcomp>A  s    ???!ao???r(   output_)rS   rq  rD   rr  ru  r/   r   r   r0   append_shadow_outputsrx  rI   r~   rw   rq   )r>   r  r  r   paramss        r&   origin_runnable_programz+PartialProgramLayer.origin_runnable_program;  s    dl+,,t}-.. @?w???#!77%)6688<==		
 	
 	
 %VW%
 
 	
r(   c                :    | j                             |           d S r"   )r  rJ   )r>   hookers     r&   
add_hookerzPartialProgramLayer.add_hookerO  s    V$$$$$r(   Fc                    |st          j                    S || j        vr
g | j        |<   | j        |         }|D ]}|j        r|c S t          j                    }|                    |           |S r"   )r
   Scoper  _can_reusedrJ   )r>   r  r  cached_scopesscopes        r&   
_get_scopezPartialProgramLayer._get_scopeR  s     	 :<<D---+-Di())4" 	 	E  
U###r(   c                z    |rʈ fd} j                                         }t                      rh j                                        rOt
          j                            d          }|                    di            |	                    |j
                    j        D ]}|                    |           |                    |           |S  j                                         }|                                 t                      rh j                                        rOt
          j                            d          }|                    di            |	                    |j
                                        |          }                      j        |            fd}|                    |           |S )Nc                   j                                         rt          | t                      j                                                    t          j        j        j                            | j	                   t          j        j        j        
                    |            nЉj                                         rYt          j        j        j                            | j	                   t          j        j        j                            |            n^t          | t                      j                                                    t          j        j        j                            |            | |fS )Nr)   )r  is_cinnr6   r   r/   r   r   r0   bind_symbolic_constraintsrs  apply_cinn_passis_pccapply_pcc_passcheck_infer_symbolic_if_need)r   r   r   r>   s      r&   r   z4PartialProgramLayer._create_program.<locals>.pass_fnd  s^   =((** ('#1#3#3040E0E0G0G   
 K)-GG'):   K)-==oNNNN]))++ K)-GG'):   K)-<<_MMMM('#1#3#3040E0E0G0G   
 K)-JJ'   '(888r(   r   auto_layout_passc                p   fd}t          | t                      j                                                   t          |t                      j                                                   j                                        rt          j        j        j                            | j	                   t          j        j        j        
                    |             || |           t          j        j        j        
                    |           nj                                        rYt          j        j        j                            | j	                   t          j        j        j                            |            n)t          j        j        j                            |            | |fS )Nc                  	 t           j        j        j                            |           	t           j        j        j                            |                              	           d |                                 D             	fd}
fd}|                                                                	                                D ]\  }} |||          } |||           d S )Nc                (    i | ]}|j         D ]}||S r]   )r   )rY   ri   r$   s      r&   
<dictcomp>zvPartialProgramLayer._create_program.<locals>.pass_fn.<locals>.init_backward_program_shape_analysis.<locals>.<dictcomp>  sC     . . . $(K. . ! d. . . .r(   c                Z                         |                    |                      d S r"   )set_shape_or_data_for_varget_shape_or_data_for_var)forward_valuebackward_valuebackward_shape_analysisforward_shape_analysiss     r&   +share_symbol_shape_from_forward_to_backwardzPartialProgramLayer._create_program.<locals>.pass_fn.<locals>.init_backward_program_shape_analysis.<locals>.share_symbol_shape_from_forward_to_backward  s@     0II*2LL -     r(   c                    | d         v r/d                              |           }d         |                  S | v r|          S t          d|  d          )Nbo_gr   z	kw_args: z
 not found)r-  	Exception)kw_namekw_valuere   forward_name_value_mapr   s      r&    get_kwargs_forward_matched_valuezPartialProgramLayer._create_program.<locals>.pass_fn.<locals>.init_backward_program_shape_analysis.<locals>.get_kwargs_forward_matched_value  sy    "&7&???"3F";"A"A'"J"JC#9 1$ 7 <$  %(>>>#9'#BB"+,K,K,K,K"L"LLr(   )
r/   r   r   r0    get_shape_constraint_ir_analysis(register_symbol_cstr_from_shape_analysis	list_varsr~   ru   r   )r   r   r  r  r  r  forward_matched_valuer  r  r  r   s          @@@r&   $init_backward_program_shape_analysiszbPartialProgramLayer._create_program.<locals>.pass_fn.<locals>.init_backward_program_shape_analysis  sS    .4[-B-F-g-g'. .* /5k.C.G.h.h(/ /+ ,TT.  . .$3$=$=$?$?. . .*     	M 	M 	M 	M 	M 	M )5577>>@@FFHH +( =<WhOO . DC18    r(   r)   )r6   r   r  r  r/   r   r   r0   r  rs  r  r  r  r  )r   r   r   r  r>   s     ` r&   r   z4PartialProgramLayer._create_program.<locals>.pass_fn  s   / / / / /b %#-//,0M,A,A,C,C   
 %$-//,0M,A,A,C,C   
 =((** K)-GG'):   K)-==oNNN88')9   K)-==>NOOOO]))++ K)-GG'):   K)-<<_MMMMK)-JJ'   '(888r(   )r  r   r   r  r  r/   r0   r1   r2   r3   r4   r  r%  r   r   _append_backward_set_grad_typert  )r>   is_infer_moder   r$  r5   r  train_programs   `      r&   _create_programz#PartialProgramLayer._create_program`  s    J	!9 9 9 9 9< !8>>@@M%'' .DM,A,A,C,C .Z++A...333},---- 2 2""=111100999   ,2244  <<>>> &'' .DM,A,A,C,C .Z++A...333},--- 11-@@Mm<<<O9 O9 O9 O9 O9b 00999  r(   c                P    t           j                            | j        |           }|S r"   )r/   rF   _hash_with_idr  )r>   
program_ids     r&   _train_program_idz%PartialProgramLayer._train_program_id  s"    \//0BDII
r(   c                L    t           j                            | j        |           S r"   )r/   rF   r  r$  rC   s    r&   _infer_program_idz%PartialProgramLayer._infer_program_id  s    |))$*<dCCCr(   c                ,    | j         r| j        S | j        S )z7
        Return current train or eval program.
        )ry  r  r$  rC   s    r&   r4   zPartialProgramLayer.program  s     
 = 	&%%%%r(   c                ,    | j         r| j        S | j        S )z?
        Return current train or eval program hash id.
        )ry  r  r  rC   s    r&   r  zPartialProgramLayer.program_id  s     
 = 	*))))r(   c                   t          | j                  5  | j                                        5  |                                 cd d d            cd d d            S # 1 swxY w Y   d d d            d S # 1 swxY w Y   d S r"   r   r  r  recordr  rC   s    r&   r  z!PartialProgramLayer.train_program  s   4=)) 	* 	*4+E+L+L+N+N 	* 	*''))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s4   A4AA4A 	 A4#A 	$A44A8;A8c                   t          | j                  5  | j                                        5  |                     d          cd d d            cd d d            S # 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )NT)r  r  rC   s    r&   r$  z!PartialProgramLayer.infer_program  s   4=)) 	< 	<4+E+L+L+N+N 	< 	<''d';;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<s4   A6AA6A"	"A6%A"	&A66A:=A:c                0    |                      |           |S )z
        Verify that the program parameter is initialized, prune some unused params,
        and remove redundant op callstack.
        )_check_params_all_inited)r>   r  r  s      r&   rw  z#PartialProgramLayer._verify_program  s     	%%l333r(   train_runnable_programc                N	   |j         }|j        }| j        D ]}|                    ||          \  }}|j        }|j        }t          t          j        ||                    }t          |
                                j                  }d }	|dk    r|
                                j        d         }	d gt          |          z  }
t          | j                  5  t          |dt          t          t           fd           t#          j        |d           5  g }|D ]^}|j        du r"|                    t+                                 -t-          j        |d|j                  }|                    |           _t,          j        j        j                            ||t          |
                                j                  d           t          |
                                j                  |z
  }t          t          t;          d	 |                              dk    rt=          |t          t;          d
 |                    t          t;          d |                              }
|	9t?          |
                                j                  D ]\  }}||	k    r|dz   } nd d d            n# 1 swxY w Y   | j        D ]#}|                     |||||||z             \  }}}$	 d d d            n# 1 swxY w Y   d }t          |          }t          tC          ||
d|                             }t          tC          ||
|d                              }t          tC          ||                    }t          t;          d |                    }t          t;          d ||z                       }t          |
                                j                  }t,          j        j        j                            |||d           ||z   }tE          ||||||g| j        #                                          }tI          |||g|          } ||          }|j%        \  }}}}}}|j&        \  }}}tO          ||||f|j(        |||fd|f||f          }|)                                 |S )Nr   r>  targetszpaddle.static.gradientsTg      ?)
fill_valuern  grad_input_c                    | j         du S NFr  rO   s    r&   rV  z6PartialProgramLayer._append_backward.<locals>.<lambda>R      Q_-E r(   c                    | j         du S r  r  r  s    r&   rV  z6PartialProgramLayer._append_backward.<locals>.<lambda>Z  r  r(   c                "    t          |            S r"   r   r  s    r&   rV  z6PartialProgramLayer._append_backward.<locals>.<lambda>^  s    mA.>.>*> r(   )r  r  r  r   c                L    t          | t                    r| nt                      S r"   )rH   r   r   r  s    r&   rV  z6PartialProgramLayer._append_backward.<locals>.<lambda>w  s    z!U';';"M!! r(   c                "    t          |            S r"   r  r  s    r&   rV  z6PartialProgramLayer._append_backward.<locals>.<lambda>      q!1!11 r(   c                "    t          |            S r"   r  r  s    r&   rV  z6PartialProgramLayer._append_backward.<locals>.<lambda>  r  r(   grad_output_)*r4   r   r  r  r   r   rS   	itertoolschainrI   r~   rw   r   r  r   r   r   	ir_staticprogram_guardr   rJ   r   r/   	full_likern  r   r   r0   r  filterr	   r   r"  rT   r`  r  r9  rv   r<  rq   r   r   )r>   r  r4   r  r  r  r  combined_inputsr   forward_end_opgrad_info_mapforward_outputs_grads	out_valuer%   op_between_forward_and_backwardre   r{   mapping_valueinputs_sizex_grad_valuep_grad_valueo_grad_valueinput_grads_to_appendoutput_grads_to_appendbackward_end_op_indexbackward_start_op_indexfull_graph_pre_process_passforward_index_passr  s                                r&   r  z$PartialProgramLayer._append_backward  s    )0(3m 	O 	OF%<<WgNNGWW'0'4yvv>>??g2244899Q$11337;N_!5!554=)) E	 E	e$)	   ($77 0& 0&(*%!( 	< 	<I .$66-44Z\\BBBB & 0%'*"+/! ! !
 .44U;;;;%)??),,..233!	   ,,..233oE 0 "#E#EwOO  
   %). $"#E#EwOO! ! &*" > > 5 & &% % %M &1'01E1E1G1G1K'L'L & &GC!^3325' %  4]0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0& 0&d -  
 00#)##&EE 	#G	sE	 E	 E	 E	 E	 E	 E	 E	 E	 E	 E	 E	 E	 E	 E	N NM&kkC}Q{]/KLLMMC}[\\/JKKLLC/DEEFF !%11<@@!
 !
 "&11<,3NOO"
 "
 !$G$8$8$:$:$> ? ?!77"!		
 	
 	
 == 	 
 '>VWlL,OM!!##'
 '
# 157LM'
 

 %$W-- (.	
 *		
#! (VW%"5<6 $&;<
 
 	77999s7   :K0FJ-!K0-J1	1K04J1	5.K00K47K4c                .   | j         | j        |f}|| j        vr`| j        j        | j        j        | j         | j         |d| j        j        z  }t          j        j	        
                    |          | j        |<   t          j        dd}| j        |         |fS )N)r   r   is_testr  r  r   )r  r  )r  ry  r  r4   r   r   r   r/   r   r
   construct_program_attribute_mapr   r  )r>   r  prog_attr_keyr  r  s        r&   r  z'PartialProgramLayer._prepare_attributes  s    $-E :::#'<#?$(L$A#},"o*  )*J  @@LL &}5
 !/ 6'(
 
 )-8:JJJr(   c                |   t          |t          t          f          sJ t          j                            |          }g }t          j                    }t          |          D ]\  }}t          |t          j
                  r&d}t          j                            |d|d          }nt          |t          j        j                  r_|j        rU|j                            |          s;t#                      s-t%          |          s|                    |d          }d|_        n|}n|                    |           |S )z1
        Prepare inputs, outputs, attrs.
        NFT)r%   persistableplace	zero_copy)rH   r   rS   r/   rF   rG   r   _current_expected_placer   npndarrayr
   eagerTensorr   r!  _equalsr   r   _copy_torJ   )r>   r  flatten_inputs
input_varsexpected_placeir%   vars           r&   r  z#PartialProgramLayer._prepare_inputs  sK    &5$-00000--f55
":<<!.11 	# 	#HAu%,, j'' %("	 (   E4:#455  '	 !K//??	  344	  7u==		   ..??C(,C%%CCc""""r(   c                6    |                      ||          }|gS )Nr  )r  )r>   r  r  inner_scopes       r&   r  z%PartialProgramLayer._create_scope_vec  s)    oo & 
 
 }r(   c                t    | j                             |          }|t          |          dk    r|d         }|S )zZ
        Restores same nested outputs by only replacing the Variable with Tensor.
        Nr   r   )rr  rU   rI   )r>   out_varsoutss      r&   r  z PartialProgramLayer._restore_out  s;     }$$X..D		Q7Dr(   c                .    |                     d          S )NT)for_test)r   )r>   r  s     r&   _clone_for_testz#PartialProgramLayer._clone_for_test  s    !!4!000r(   c                    t          |t          j        j                  r1|j        dgk    r%|                                d         t          k    rdS dS )Nr   r   TF)rH   r
   r&  r'  shapenumpyr   )r>   r.  s     r&   _is_no_valuez PartialProgramLayer._is_no_value   sI    c4:,-- 	#)s2B2Byy{{1~!:::tur(   c                    t          |t          j        j                  r                     |          rdS |S t          |t
          t          f          rt          |t
                    rt           fd|D                       }n fd|D             }t          |          t          |          k    }t          |          dk    r|rdS t          |          dk    r
|r|d         S |S |S )zK
        Removes invalid value for various-length return statement
        Nc              3  F   K   | ]}                     |          |V  d S r"   r:  rY   r.  r>   s     r&   r[   z7PartialProgramLayer._remove_no_value.<locals>.<genexpr>  sJ        43D3DS3I3I     r(   c                >    g | ]}                     |          |S r]   r=  r>  s     r&   r_   z8PartialProgramLayer._remove_no_value.<locals>.<listcomp>  s,    MMMsd6G6G6L6LMsMMMr(   r   r   )rH   r
   r&  r'  r:  r   rS   rI   )r>   r2  reshas_removeds   `   r&   r  z$PartialProgramLayer._remove_no_value  s    h
 122 	  ** tO5$-00 	(E** N    #+     NMMMhMMMh--#c((2K 3xx1}}}tSQ;1vJr(   r  c                   |j         }|j        }t          ||          D ]\  }}t          |          r|                                r4|                    t          j        j        j	        j
        j                   ]|                                r4|                    t          j        j        j	        j
        j                   t          d          d S )Nz5only support selected_row and dense_tensor grad type.)r   r4   r   r   is_selected_row_typer  r/   r   r
   VarDescVarTypeSELECTED_ROWSis_dense_tensor_typeDENSE_TENSORNotImplementedError)r>   r  r  forward_params_gradsparamr%   s         r&   r  z"PartialProgramLayer._set_grad_type"  s      ->%-(<== 	 	LE5U## ))++ $$K$,4B    ++-- $$K$,4A    *K  	 	r(   c           	        t          | j        t          t          f          s%t	          dt          | j                   d          t                      }t          | j                  D ]a\  }}t          |t          j	        j
                  s#t	          d| dt          |           d          |                    |j                   bdS )a  
        Check all params from main program are already initialized, see details as follows:
            1. all parameters in self._params should be type `framework.EagerParamBase` which are created in dygraph.
            2. all parameters from transformed program can be found in self._params.
               Because they share same data with EagerParamBase of original dygraph.
        zRType of self._params in PartialProgramLayer should be list or tuple, but received .zType of self._params[zG] in PartialProgramLayer should be Parameter or Variable, but received N)rH   rt  rS   r   	TypeErrortyper   r   r
   r&  r'  addr$   )r>   r  param_and_buffer_names_setr-  r.  s        r&   r  z,PartialProgramLayer._check_params_all_inited;  s     $,u66 	zeijnjvewewzzz   &)UU"-- 	5 	5FAsc4:#455  CA  C  Cvz{~vv  C  C  C   '**384444	5 	5r(   c                    | r| nd S r"   r]   )varss    r&   r  zPartialProgramLayer._valid_varsP  s    %tt%r(   r"   )r   rq   r  F)r  rq   r   rq   )r  rq   )&rk   rl   rm   rn   r  r@   r  r  r7  r   r  r  r   r  r  r  r   r  r  r  ro   r4   r  r  r$  rw  r  r  r  r  r  r6  r:  r  r  r  r  __classcell__)r  s   @r&   rf  rf    s        * O 5( 5( 5( 5( 5( 5( 5( 5(n 
 
 \
&8 8 8  ^.//0 0 0/0  ( 
 
 
 _
&% % %    K! K! K! K! K!Z   _ D D _D & & & X& * * X* * * * _* < < < _<   R R R RhK K K K(# # #J      1 1 1    6   25 5 5* & & \& & & & &r(   rf  c              #  ~   K   t           j        }| t           _        	 dV  |t           _        dS # |t           _        w xY w)z~
    A context manager to temporarily replace the run_impl of PartialProgramLayer.
    This is used for testing purposes.
    N)rf  r  )new_run_implold_run_impls     r&   replace_run_impl_guardrY  U  sK       '6L*6';.:+++l+::::s   . <Fconcrete_programr    from_methodboolr   c                    | j         }|r|r
|dd          }t          | j        || j        | j        fd| j        i| j        S )Nr   rg  )r  rf  r  r  r  rg  ru   )rZ  r[  r  s      r&   partial_program_fromr^  c  sp     $F  + % #	 
 %0 
!  r(   rT  )rZ  r    r[  r\  r   rf  )A
__future__r   r  
contextlibr   	functoolsr   typingr   r9  r$  r/   paddle.pir.corer0   r
   r  r   paddle.autograd.backward_utilsr   paddle.autograd.ir_backwardr	   paddle.baser   paddle.base.compilerr   paddle.base.data_feederr   paddle.base.dygraph.baser   
paddle.pirr   r   r   r   profilerr   logging_utilsr   rF   r   r   r   r   r   r   r   r   r   program_translatorr    __all__r   r#   r'   r6   r8   rq   r  r'  r9  rD  r`  rf  rY  r^  r]   r(   r&   <module>ro     s   # " " " " "     % % % % % % % % % % % %                  # # # # # # # # #       4 4 4 4 4 4 , , , , , , ' ' ' ' ' ' ' ' . . . . . . . . . . . . ; ; ; ; ; ; L L L L L L L L L L L L % % % % % % + + + + + +
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  4333333
   &%''        @$ @$ @$ @$ @$ @$ @$ @$Fj4 j4 j4 j4 j4 j4 j4 j4Z       &$ $ $ $ $ $ $ $N        O O O O O O O Od
 
 
 
 
/ 
 
 
l
& l
& l
& l
& l
& l
& l
& l
&^ 
; 
; 
; <A      r(   