
    ϑi4                         S SK r S SKJr  S SKrS SKJr  SSKJrJrJ	r	J
r
  SSKJr   " S S	5      r " S
 S5      r " S S5      rS rg)    N)chain)flatten   )
ConstTypesExportErrorNameGeneratorget_api_fullname   )Symbolc                   4    \ rS rSrSrS rS	S jrS rS rSr	g)
PyStatement       c                     / U l         Xl        g N)sub_statementlines)selfr   s     ^/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/jit/sot/symbolic/export.py__init__PyStatement.__init__   s    
    c                     U R                    Vs/ s H  o!U-   PM	     nnU R                   H0  nUR                  UR                  U R                  U-   5      5        M2     U$ s  snf r   )r   r   extend	get_linestab)r   prefixliner   	statements        r   r   PyStatement.get_lines    sV    +/::6:4$:6++ILL,,TXX->?@ , 7s   A!c                 L    [        U6 nU R                  R                  U5        U$ r   )r   r   append)r   r   subs      r   add_subPyStatement.add_sub&   s%    5!!!#&
r   c                 @    SR                  U R                  5       5      $ N
)joinr   r   s    r   __str__PyStatement.__str__+   s    yy)**r   )r   r   N) )
__name__
__module____qualname____firstlineno__r   r   r   r$   r+   __static_attributes__ r   r   r   r      s    
C
+r   r   c                   J    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSrg)	NameGener/   c                 ^    Xl         0 U l        [        S5      U l        [        S5      U l        g )Nzself.parameter_var_)SIRname_mapr   param_name_generatornon_param_name_generatorr   r9   s     r   r   NameGener.__init__0   s)    $12C$D!(5f(=%r   c                 $    U R                  U5      $ r   get_strr   vars     r   __call__NameGener.__call__6   s    ||C  r   c                 T   [        U[        5      (       a  U R                  U5      $ [        U[        5      (       a  U R	                  U5      $ [        U[
        5      (       a  U R                  U5      $ [        U[        5      (       a  U R                  U5      $ U R                  U5      $ r   )

isinstancelistget_list_strtupleget_tuple_strdictget_dict_strsetget_set_strget_obj_strrB   s     r   rA   NameGener.get_str9   s    c4  $$S))U##%%c**T""$$S))S!!##C((##C((r   c                 X   ^  SR                  SR                  U 4S jU 5       5      5      $ )Nz[{}], c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr   r@   .0rC   r   s     r   	<genexpr>)NameGener.get_list_str.<locals>.<genexpr>F   s     &JESt||C'8'8E   !formatr)   )r   list_s   ` r   rI   NameGener.get_list_strE   s!    }}TYY&JE&JJKKr   c                 X   ^  SR                  SR                  U 4S jU 5       5      5      $ )Nz({},)rS   c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr   r@   rU   s     r   rW   *NameGener.get_tuple_str.<locals>.<genexpr>I   s     'LVcS(9(9VrY   rZ   )r   tuple_s   ` r   rK   NameGener.get_tuple_strH   s!    ~~dii'LV'LLMMr   c                 t   ^  SR                  SR                  U 4S jUR                  5        5       5      5      $ )N{{{},}}rS   c              3   r   >#    U  H,  u  pTR                  U5       S TR                  U5       3v   M.     g7f)z: Nr@   rV   kvr   s      r   rW   )NameGener.get_dict_str.<locals>.<genexpr>M   s7      )DA <<?#2dll1o%67)s   47)r[   r)   items)r   dict_s   ` r   rM   NameGener.get_dict_strK   s5    II !KKM 
 	
r   c                 X   ^  SR                  SR                  U 4S jU 5       5      5      $ )Nrd   rS   c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr   r@   rU   s     r   rW   (NameGener.get_set_str.<locals>.<genexpr>T   s     )Lt$,,s*;*;trY   rZ   )r   set_s   ` r   rO   NameGener.get_set_strS   s#    		)Lt)L LMMr   c                     [        U[        5      (       a/  XR                  ;  a  U R                  U5        U R                  U   $ [        U[        5      (       a  SU S3$ [	        U5      $ )N')rG   r   r:   register_symbolstrrB   s     r   rP   NameGener.get_obj_strV   sZ    c6""--'$$S)==%%S!!se1:s8Or   c                     XR                   R                  ;   a  U R                  R                  5       nOU R                  R                  5       nX R
                  U'   g r   )r9   param_symbolr;   nextr<   r:   )r   symbolnames      r   rt   NameGener.register_symbola   sF    XX***,,113D00557D $fr   )r9   r:   r<   r;   N)r.   r/   r0   r1   r   rD   rA   rI   rK   rM   rO   rP   rt   r2   r3   r   r   r5   r5   /   s2    >!
)LN
N	%r   r5   c                   z    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rSrg)	PyFileGeni   c                     Xl         / U l        [        U R                   5      U l        SR	                  S UR
                   5       5      U l        g )Nz||c              3   V   #    U  H  oR                    S UR                   3v   M!     g7f):N)typer{   )rV   stmts     r   rW   %PyFileGen.__init__.<locals>.<genexpr>p   s$      !
3A4yyk499+&>s   '))r9   rootsr5   
name_generr)   
statementsSIR_sigr=   s     r   r   PyFileGen.__init__j   s?    
#DHH-yy !
36>>!
 
r   c                 L    [        U6 nU R                  R                  U5        U$ r   )r   r   r"   )r   argsr   s      r   new_rootPyFileGen.new_roott   s#    D!

$r   c                     / nU R                    H"  nUR                  UR                  5       5        M$     SR                  U5      $ r'   )r   r   r   r)   )r   r   roots      r   roots_to_stringPyFileGen.roots_to_stringy   s7    JJDLL)* yyr   c                 j   U R                  5         U R                  5         U R                  S5        U R                  5         U R                  S5        U R	                  5         U R                  S5        U R                  5         U R                  S5        U R                  5         U R                  5       $ r'   )check_exportablecreate_headerr   create_layercreate_inputscreate_testcreate_tailr   r*   s    r   gen_py_codesPyFileGen.gen_py_codes   s    dddd##%%r   c                 T   [        U[        [        [        R                  45      (       d	  U[
        L a  g[        U[        5      (       a_  U R                  UR                  5      =(       a=    U R                  UR                  5      =(       a    U R                  UR                  5      $ g)NTF)rG   r   r   paddledtypeEllipsissliceis_exportable_typestartstopstep)r   values     r   r   PyFileGen.is_exportable_type   s|    uz66<<@AA eU##''4 8++EJJ78++EJJ7
 r   c                     U R                   R                   HC  n[        UR                  5       H'  nU R	                  U5      (       a  M  [        SU 35      e   ME     g )Nz+Not support create python file with input: )r9   r   r   inputsr   r   )r   r   inps      r   r   PyFileGen.check_exportable   sQ    HH''Dt{{+..s33%EcUK  , (r   c                 F    U R                  SU R                   3SSS5        g )Nz# zimport paddlezimport unittestzimport numpy as np)r   r   r*   s    r   r   PyFileGen.create_header   s%     		
r   c                 ~  ^  T R                  S5      nUR                  S5      nUR                  S5        T R                  R                   Hl  nT R                  R                  U   R                  5       nUR                  T R                  U5       S3SUR                   S3SUR                   S3S5        Mn     T R                  R                   HE  nUR                  S	:X  d  M  UR                  5       nUR                  T R                  U5      5        MG     S
S/nT R                  R                   H^  nUT R                  R                  ;   d  M  T R                  R                  U   nUR                  ST R                  U5       SU 35        M`     UR                  S5        UR                  " U6 n	T R                  R                   H!  nU	R                  " T R!                  U5      6   M#     U	R                  SR#                  SR%                  U 4S jT R                  R&                   5       5      5      5        g )Nz!class LayerCase(paddle.nn.Layer):zdef __init__(self):zsuper().__init__()z = self.create_parameter(z	   shape=,z	   dtype=)layerzdef forward(z	    self,r   z,    # z):z	return {}rS   c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr   r   )rV   outr   s     r   rW   )PyFileGen.create_layer.<locals>.<genexpr>   s     K:J3$//#..:JrY   )r   r$   r9   rx   symbol_meta_mapunwrap_unsafer   shaper   r   r   r   init_sub_layerr   non_param_symbolr"   create_stmt_liner[   r)   outputs)
r   layer_classinit_fnparammetar   r   forward_definitionr   
forward_fns
   `         r   r   PyFileGen.create_layer   s   mm$GH%%&;<,-XX**E88++E2@@BDOO??5)**CDDJJ<q)DJJ<q)	 + HH''DyyG#

 3 3E :; (
 -k:88??Cdhh///xx//4"))4??3/0v> # 	!!$' ((*<=
HH''D 5 5d ;< ( 			K$((:J:JKK	
r   c           
      :   U R                  S5      nU R                  S5        U R                  S5      nS/nS/nU R                  R                   GH  nXPR                  R                  ;   d  M  U R                  R                  UR
                     R                  5       n[        UR                  5      S:X  a  SO[        UR                  5      nUR                  [        R                  [        R                  [        R                  [        R                  4;   ai  UR!                  SU SUR                   S	35        UR!                  S
R#                  U[        UR                  5      R%                  SS5      5      5        GM5  UR                  [        R&                  L a-  UR!                  SU S35        UR!                  SU S35        GM  UR!                  SU SUR                   S	35        UR!                  SR#                  U[        UR                  5      R%                  SS5      5      5        GM     UR!                  S5        UR!                  S5        UR!                  S5        UR!                  S5        UR(                  " U6   UR(                  " U6   g )Nzdef create_paddle_inputs():r(   zdef create_numpy_inputs():z
inputs = (r   z[1]z)    paddle.randint(low=0, high=10, shape=z, dtype=z),z;    np.random.randint(low=0, high=10, size={}, dtype='{}'),zpaddle.r-   z(    paddle.randint(low=0, high=2, shape=z(, dtype=paddle.int32).cast(paddle.bool),z*    np.random.randint(low=0, high=2, size=z, dtype='int').astype('bool'),z    paddle.rand(shape=z+    np.random.random(size={}).astype('{}'),r   zreturn inputs)r   r9   r   r   r   r{   r   lenr   ru   r   r   int8int16int32int64r"   r[   replaceboolr$   )r   create_paddle_inputscreate_numpy_inputspaddle_inputsnumpy_inputsr   r   	shape_strs           r   r   PyFileGen.create_inputs   s,   #}}-JKd"mm,HI%$~88??Chh///xx//9GGI%(_%9Es4::	::KKLLLLLL	"  "((CI;hW[WaWaVbbde !''U\\%s4::'>'>y"'M
 ZZ6;;.!((B9+Muv !''DYKOmn "((08DJJ<rR !''ELL%s4::'>'>y"'M; #F 	S!_-C O,$$m4##\2r   c                 ,   U R                  S5      nUR                  S5      nUR                  S5        UR                  S5        UR                  S5      nUR                  SSSS	S
SSSSS5
        UR                  S5      nUR                  SSSS5        g )Nz#class TestLayer(unittest.TestCase):zdef setUp(self):z$self.inputs = create_paddle_inputs()zself.net = LayerCase()zBdef train(self, net, to_static, with_prim=False, with_cinn=False):zif to_static:z5    paddle.base.core._set_prim_all_enabled(with_prim)z    if with_cinn:zM        assert with_prim, "with_cinn=True but with_prim=False is unsupported"zH        net = paddle.jit.to_static(net, backend="CINN", full_graph=True)z	    else:zF        net = paddle.jit.to_static(net, backend=None, full_graph=True)zpaddle.seed(123)zouts = net(*self.inputs)zreturn outszdef test_ast_prim_cinn(self):z-st_out = self.train(self.net, to_static=True)zOcinn_out = self.train(self.net, to_static=True, with_prim=True, with_cinn=True)zRfor st, cinn in zip(paddle.utils.flatten(st_out), paddle.utils.flatten(cinn_out)):zC    np.testing.assert_allclose(st.numpy(), cinn.numpy(), atol=1e-8))r   r$   )r   
test_classsetuptraintest_ast_cinn_statics        r   r   PyFileGen.create_test  s    ]]#HI
""#56<=./""P
 	C[VT&	
  *11+ 
 	$$;]`Q		
r   c                 (    U R                  SS5        g )Nzif __name__ == '__main__':z    unittest.main())r   r*   s    r   r   PyFileGen.create_tail'  s    (!	
r   c                     [        S5      e)Nz!Not support create sub layer now.)r   )r   r   
layer_names      r   r   PyFileGen.init_sub_layer-  s     =>>r   c                 ~   ^  SR                  [        U 4S jU 5       U 4S jUR                  5        5       5      5      $ )NrS   c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr   r   )rV   argr   s     r   rW   0PyFileGen.create_input_string.<locals>.<genexpr>5  s     6#%%rY   c              3   T   >#    U  H  u  pU S TR                  U5       3v   M     g7f)=Nr   rf   s      r   rW   r   6  s(     HA3a*+,s   %()r)   r   rj   )r   r   kwargss   `  r   create_input_stringPyFileGen.create_input_string2  s2    yy66HH
 	
r   c                 R   ^ ^^^ S/n/ nUUU 4S jmU4S jmU4S jmT" XU5        U$ )Nr   c                 $  > [        U [        [        45      (       a
  T" XU5        g [        U [        5      (       a
  T" XU5        g [        U [        5      (       a6  UR                  TR                  U 5      S-   SR                  U5      -   5        g g )N = r-   )rG   rH   rJ   rL   r   r"   r   r)   )r   pathresultsearch_dictsearch_sequencer   s      r   search5PyFileGen.create_unpack_output_string.<locals>.search>  sn    'D%=11v6GT**G62GV,,doog6>NO -r   c                    > [        U 5       H3  u  p4UR                  SU S35        T" XAU5        UR                  5         M5     g N[])	enumerater"   pop)r   r   r   idxr   r   s        r   r   >PyFileGen.create_unpack_output_string.<locals>.search_sequenceF  s;    %g.auAJ's&)
 /r   c                    > U R                  5        H3  u  p4UR                  SU S35        T" XAU5        UR                  5         M5     g r   )rj   r"   r   )r   r   r   rg   r   r   s        r   r   :PyFileGen.create_unpack_output_string.<locals>.search_dictL  s<    !--/as!H%s&)
 *r   r3   )r   r   r   r   r   r   r   s   `   @@@r   create_unpack_output_string%PyFileGen.create_unpack_output_string:  s0    w	P		 	wf%r   c                 F    [        U SUR                  -   S-   5      " U5      $ )Ncreate__stmt)getattrr   )r   r   s     r   r   PyFileGen.create_stmt_lineU  s"    tY2W<=dCCr   c                 j   UR                   u  p#U R                  X#5      nUR                  n[        U5      nUc  [	        SU 35      e[        UR                  [        5      (       a%  U R                  UR                  5       SU SU S3/$ SU SU S3nU R                  UR                  5      nU/UQ$ )NzCan not find module of r   (r   out = )
r   r   apir	   r   rG   r   r   r   r   )	r   r   r   r   	input_strr  api_strcompute_codeunpack_codess	            r   create_api_stmtPyFileGen.create_api_stmtX  s    {{,,T:	hh"3'? 7u=>>dllF++t||45S	9+QOPP#G9Ai[:L;;DLLIL 0<00r   c                 j   UR                   u  p#U R                  USS  U5      nU R                  US   5      S-   UR                  -   n[	        UR
                  [        5      (       a%  U R                  UR
                  5       SU SU S3/$ SU SU S3nU R                  UR
                  5      nU/UQ$ )Nr
   r   .r   r   r   r  )r   r   r   methodrG   r   r   r   )r   r   r   r   r  
method_strr  r  s           r   create_method_stmtPyFileGen.create_method_stmtf  s    {{,,T!"Xv>	__T!W-3dkkA
dllF++??4<<01ZL)AN  $J<q1=L;;DLLIL 0<00r   )r9   r   r   r   N)r.   r/   r0   r1   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r2   r3   r   r   r~   r~   i   s[    

 &
'
R13f
B
?

6D11r   r~   c           	      0    [        U 5      nUR                  5       n[
        R                  R                  U5      (       d  [
        R                  " U5        [        [
        R                  R                  XR                   S35      S5       nUR                  U5        [        SU R                   S[        U R                  5       35        S S S 5        g ! [         a$  n[        SU R                   S3U5         S nAg S nAff = f! , (       d  f       g = f)Nz[SOT] Export z Failed:z.pywz Success with size )r~   r   r   printr{   osr   existsmakedirsopenr)   writer   r   )r9   r   pygenstringefs         r   exportr  t  s    ###%
 77>>$
D	bggll4HH:S!12C	8A	CHH:%8S^^9L8MN	
 
9	8  chhZx0!4 
9	8s$   C A D
D C??D
D)r  	itertoolsr   r   paddle.utilsr   utilsr   r   r   r	   statement_irr   r   r5   r~   r  r3   r   r   <module>r      sC    
     L L  + +,7% 7%tH1 H1V
r   