
    iy+                         S SK r S SKJr  S SKJrJr  S SKrS SKJrJ	r	J
r
JrJrJr  S\S\4S jrS\S\4S	 jrS
\\\4   S\4S jr " S S\ R&                  5      rg)    N)
namedtuple)AnyDict)broadcast_to_and_flattenregister_customtree_flattentree_maptree_unflattenTreeSpecoreturnc                      [        U 5      u  pU$ N)r   )r   _specs      d/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/executorch/extension/pytree/test/test.py_specr      s    1oGAK    nc                     U [        U5      -   n[        U5       H  nUS-  nM
     US-  n[        U5       H  nUS:  a  US-  nUS-  nM     US-  nU$ )N#1(r   ,$))strrange)	type_charr   r   r   is        r   	_spec_strr    !   sg    s1vD1X CKD1Xq5CKD  	CKDKr   dc                 4   [        U 5      nS[        U5      -   n[        U5       H  nUS-  nM
     US-  nSnU R                  5        HG  nUS:  a  US-  n[	        U[        5      (       a  USU-   S-   -  nOU[        U5      -  nUS-  nUS-  nMI     US	-  nU$ )
NDr   r   r   r   'z:$   r   )lenr   r   keys
isinstance)r!   r   r   r   r   keys         r   _spec_str_dictr*   0   s    AAQ<D1X CKD	Avvxq5CKDc3C#IO#DCHD	Q  	CKDKr   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)
TestPytreeD   c           	      <   Sn0 nSS/US'   SUS'   SUS'   SS	S
.US'   [        U5      u  p4U R                  U/ SQ5        UR                  5       nU R                  XQ5        / n[        [	        U5      5       H?  nUS-  S:X  a  UR                  US-   5        M"  UR                  [        US-   5      5        MA     UR                  U5      nU R                  USS/SSSSS
.S.5        [        R                  " U5      n	U	R                  5       n
U R                  X5        g )NzLD4#2#1#2#2('a':L2#1#1($,$),1:$,2:T2#1#1($,$),'str':D2#1#1('str':$,'str2':$))	  r%   a   )ta   r3      47str)r   str2r   )r/   r%   r1   r2   r3   r4   r5   r      14   )16   18   )r0   r%   r3   r   )
r   assertEqualto_strr   r&   appendr   r
   r   from_str)selfSPECr!   leavespytree
pytree_strleaves_testr   	tree_testpytree_fromspec_str_tos              r   testTestPytree.testE   s!   ]q#!!w/%'?!BC]]_
*s6{#A1uz""1r6*""3q2v;/	 $ ))+6	t*
4QS;TU	

 ''-!((*+r   c                 l    SSSS/4n[        U5      u  p#U R                  UR                  5       S5        g )Nr%   r3      r1   zT3#1#1#2($,$,L2#1#1($,$))r   r>   r?   rB   nested_structr   rE   s       r   test_extract_nested_list#TestPytree.test_extract_nested_listb   s4    A1v"=1*EFr   c                 n    SSSSS.4n[        U5      u  p#U R                  UR                  5       S5        g )Nr%   r3   r1      )rN   r   z!T3#1#1#2($,$,D2#1#1(3:$,'str':$))rO   rP   s       r   test_extract_nested_dict#TestPytree.test_extract_nested_dictg   s6    A1Q/0"=1*MNr   c                 b    Sn[        U5      u  p#U R                  UR                  5       S5        g )Nr1   r   rO   )rB   structr   rE   s       r   test_extracted_scalar TestPytree.test_extracted_scalarl   s)    "6*#.r   c                 Z    SSSS/4n[        S U5      nU R                  USSSS/45        g )Nr%   r3   rN   r1   c                     SU -  $ )Nr3    xs    r   <lambda>%TestPytree.test_map.<locals>.<lambda>s   s    Ar   rU      )r	   r>   )rB   rY   
struct_maps      r   test_mapTestPytree.test_mapq   s7    QAov6
aQF^4r   c                 z   U R                  [        R                  " S5      [        R                  " S5      :H  5        U R                  [        S/5      [        R                  " S5      :H  5        U R                  [        S5      [        S/5      :g  5        U R                  [        S5      [        S5      :H  5        g )Nr   r%   zL1#1($)r3   )
assertTruer   rA   r   rB   s    r   test_treespec_equality!TestPytree.test_treespec_equalityv   s    ))#.(2C2CC2HHIqc
h&7&7	&BBCq
eQCj01q
eQj01r   c                 Z   ^  U 4S jnU" S5        U" S5        U" S 5        U" [         5        g )Nc                    > [        U 5      u  pTR                  X/5        TR                  U[        R                  " S5      5        [	        X5      nTR                  X05        g )Nr   )r   r>   r   rA   r
   )leafvaluestreespecunflattenedrB   s       r   run_test_with_leafBTestPytree.test_flatten_unflatten_leaf.<locals>.run_test_with_leaf}   sS    +D1FVV,Xx'8'8'=>(:K[/r   r%         ?)bool)rB   rr   s   ` r   test_flatten_unflatten_leaf&TestPytree.test_flatten_unflatten_leaf|   s*    	0 	134 4 r   c                 |   ^  U 4S jnU" / 5        U" SS/5        U" [         R                  " SS/5      SSSS/5        g )Nc                 n  > [        S[        U 5      5      n[        R                  " U5      n[	        U 5      u  p4TR                  [        U[        5      5        TR                  X05        TR                  XB5        [        X45      nTR                  XP5        TR                  [        U[        5      5        g )NL
r    r&   r   rA   r   rh   r(   listr>   r
   )lstr   expected_specro   rp   rq   rB   s         r   run_test8TestPytree.test_flatten_unflatten_list.<locals>.run_test   s    S#c(+D$--d3M+C0FOOJvt45V)X5(:K[.OOJ{D9:r   rt   r3   
   	      torchtensorrB   r   s   ` r   test_flatten_unflatten_list&TestPytree.test_flatten_unflatten_list   s=    	; 	#q%,,Qx(!RB78r   c                    ^  U 4S jnU" S5        U" S5        U" S5        U" [         R                  " SS/5      SSSS	45        g )
Nc                   > [        S[        U 5      5      n[        R                  " U5      n[	        U 5      u  p4TR                  [        U[        5      5        TR                  U[        U 5      5        TR                  XB5        [        X45      nTR                  XP5        TR                  [        U[        5      5        g )NT)r    r&   r   rA   r   rh   r(   r|   r>   r
   tupletupr   r~   ro   rp   rq   rB   s         r   r   9TestPytree.test_flatten_unflatten_tuple.<locals>.run_test   s    S#c(+D$--d3M+C0FOOJvt45VT#Y/X5(:K[.OOJ{E:;r   r^   )rt   )rt   r3   rt   r3   r   r   r   r   r   s   ` r   test_flatten_unflatten_tuple'TestPytree.test_flatten_unflatten_tuple   sA    	< 	%,,Qx(!RB78r   c                    ^  [        SSS/5      nU 4S jnU" U" SS5      5        U" U" [        R                  " S5      S5      5        g )NPointr`   yc                 D  > [        S[        U 5      5      n[        R                  " U5      n[	        U 5      u  p4TR                  [        U[        5      5        TR                  U[        U 5      5        TR                  XB5        [        X45      nTR                  XP5        g )NNr{   r   s         r   r   >TestPytree.test_flatten_unflatten_namedtuple.<locals>.run_test   s}    S#c(+D$--d3M+C0FOOJvt45VT#Y/X5(:K[.r   rt   r3   )r   r   r   )rB   r   r   s   `  r   !test_flatten_unflatten_namedtuple,TestPytree.test_flatten_unflatten_namedtuple   s@    7S#J/	/ 	sAu||C(!,-r   c                     [         R                  " SS5      n[         R                  " USS9n[        U5      u  p4[	        X45      nU R                  [        U5      [        U5      5        U R                  XR5        g )NrN   r   )dim)r   randnmaxr   r
   r>   type)rB   r`   expectedro   r   results         r   3test_flatten_unflatten_torch_namedtuple_return_type>TestPytree.test_flatten_unflatten_torch_namedtuple_return_type   s^    KK199QA&#H--ftH~6*r   c                    ^  U 4S jnU" 0 5        U" SS05        U" S[         R                  " SS5      05        U" S[         R                  " SS5      05        U" SS[         R                  " SS5      S.5        g )Nc                   > [        U 5      n[        U 5      u  p#TR                  [        U[        5      5        TR                  U[	        U R                  5       5      5        TR                  U[        R                  " U5      5        [        X#5      nTR                  X@5        TR                  [        U[        5      5        g r   )r*   r   rh   r(   r|   r>   ro   r   rA   r
   dict)r!   r   ro   rp   rq   rB   s        r   r   8TestPytree.test_flatten_unflatten_dict.<locals>.run_test   s    !!$D+AFOOJvt45VT!((*%56Xx'8'8'>?(:K[,OOJ{D9:r   r0   r%   abcdefgr3   rN   r0   bcr   r   r   s   ` r   test_flatten_unflatten_dict&TestPytree.test_flatten_unflatten_dict   sg    
	; 	#q)U[[A./0!U[[A&'(qqu{{1a'89:r   c           
         ^  U 4S jnS// 4SS0SSS0/S.SSSS0[         R                  " S	5      /[         R                  " SS	5      S4S
./nU H  nU" U5        M     g )Nc                    > [        U 5      u  pTR                  [        U[        5      5        [	        X5      nTR                  X05        g r   )r   rh   r(   r|   r
   r>   )rE   ro   rp   rq   rB   s       r   r   :TestPytree.test_flatten_unflatten_nested.<locals>.run_test   s;    +F3FOOJvt45(:K[1r   r^   r0   r   r   r%   r0   r   r3   rN   r   r   )rB   r   casescases   `   r   test_flatten_unflatten_nested(TestPytree.test_flatten_unflatten_nested   sq    	2 DE"IC8*%1sAhA7u{{1a?PRS>TU
 DTN r   c                    ^ ^ UU 4S jmg )Nc                 D  > S n[        [        [        U 5      S   U5      5      n[        [        X5      5      S   nTR	                  X#5        S nTR	                  [        [        X5      U5      U 5        S// 4SS0SSS0/S	.SSSS
0S/SS./nU H  nT" U5        M     g )Nc                     U S-  $ NrN   r^   r_   s    r   f4TestPytree.test_treemap.<locals>.run_test.<locals>.f   s    1ur   r   c                     U S-  $ r   r^   r_   s    r   invf7TestPytree.test_treemap.<locals>.run_test.<locals>.invf   s    Avr   r^   r0   r%   r   r3   r   rN   r1   )   rU   r   )summapr   r	   r>   )	rE   r   sm1sm2r   r   r   r   rB   s	          r   r   )TestPytree.test_treemap.<locals>.run_test   s     c,v.q1156Cx23A6CS& \,v*A4H&Q b	Qxj)q3(A.V<E  r   r^   r   s   `@r   test_treemapTestPytree.test_treemap   s    	r   c                 `    S/ SQ4n[        U5      u  p#U R                  [        U5      S5        g )Nr   r   r   r   zT2#1#3($,L3#1#1#1($,$,$)))r   r>   repr)rB   rE   r   r   s       r   test_treespec_reprTestPytree.test_treespec_repr	  s,    Yv&d%@Ar   c                    ^  " S S[         5      mS nU4S jn[        TX5        T" SSS5      n[        U5      u  pE[        XE5      nU R	                  [        U5      [        U5      5        g )Nc                        \ rS rSrS rS rSrg)/TestPytree.test_custom_tree_node.<locals>.Pointi  c                 (    Xl         X l        X0l        g r   r`   r   name)rB   r`   r   r   s       r   __init__8TestPytree.test_custom_tree_node.<locals>.Point.__init__  s     	r   c                 d    SR                  U R                  U R                  U R                  5      $ )NzPoint(x:{}, y:{}, name: {}))formatr`   r   r   ri   s    r   __repr__8TestPytree.test_custom_tree_node.<locals>.Point.__repr__  s#    4;;DFFDFFDIIVVr   )r   r`   r   N)__name__
__module____qualname____firstlineno__r   r   __static_attributes__r^   r   r   r   r     s    !
Wr   r   c                 P    U R                   U R                  /nU R                  nX4$ r   r   )pchildren
extra_datas      r   custom_flatten8TestPytree.test_custom_tree_node.<locals>.custom_flatten  s%    QSSzHJ))r   c                    > T" / U QUP76 $ r   r^   )r   r   r   s     r   custom_unflatten:TestPytree.test_custom_tree_node.<locals>.custom_unflatten  s    /(/J//r   )rt   rt   r%   g       @
point_name)objectr   r   r
   r>   r   )rB   r   r   pointr   r   point2r   s          @r   test_custom_tree_node TestPytree.test_custom_tree_node  sc    	WF 	W	*
	0 	~@mS,7%e,/US[1r   c                 J   SS/ 4SSS/4S/S/S/4SS/ SQ4SSS	.SSS	.SS/4S/SS 4S/SS 4SS/S 4S
SSS	.SS0S 4SSS	.SSS.S 4SSS	.SSSS.S 4SSS/4SSS/4/ SQ4SSS/4SSS/4/ SQ4SSS/4SS 4SSS/4S/ SQ4S 4SS/ SQ4S/ SQ/ SQ4SSSS	.SS/4SSSS//S4/ SQ4SSSS/ S/////S4/ SQ4S/ SQSS/4/ SQ4SSSS/S/SS/4/ SQ4/ SQS4SSS/S/SS/4/ SQ4/nU H9  u  p#n[        U5      u  pV[        X&5      nU R                  Xt[        X&U/5      S9  M;     g )Nr%   r^   )r%   )r   r   r%   r3   rN   r   r3   r   )r   r   r   Nr0   )r0   r   r   rN   )r3   rN   r1   r   )r%   r3   rN   r1   )r   r   )r%   r%   r%   )r%   r%   r%   r%   )r%   r%   r%   r%   r%   )r%   r3   )r%   r%   r%   r3   r3   )r%   r%   r%   r%   r3   r3   )r%   r3   r3   rN   r1   r1   )msg)r   r   r>   r   )rB   r   rE   	to_pytreer   r   to_specr   s           r   test_broadcast_to_and_flatten(TestPytree.test_broadcast_to_and_flatten'  s
   BK4!S1#sO	9-1QQ/!Q8S$S$A3%1Qx.1QQ/61QQQ7>!Q[1q!f+y1&!FA;/>!Q[+t,!Q[1i.$/	9%	9%aa 1a&)QHa ,/QB1#()1-?i!Q(/:q1a&!nq!f-/AB^q1a&!nq!f57IJ=
@ ,1'Fx%i0JA-f>FV37R3ST ,1r   r^   N)r   r   r   r   rK   rR   rV   rZ   re   rj   rv   r   r   r   r   r   r   r   r   r   r   r   r^   r   r   r,   r,   D   s[    ,:G
O
/
5
2!9$9&.&+;&$0B
22$Ur   r,   )unittestcollectionsr   typingr   r   r   executorch.extension.pytreer   r   r   r	   r
   r   r   intr   r    r*   TestCaser,   r^   r   r   <module>r      st     "   S X 
C 
C 
d38n  (GU"" GUr   