
    ȅip_              	         S r SSKJr  SSKJr  SSKJrJr  SSKJ	r	J
r
Jr  SSKrSSKrSSKrSSKJrJrJrJrJrJrJrJr  SSKJs  Jr  SSKJs  Jr  SSKJrJr  S	S
K J!r!  \
(       a  SSK"r"SSK#J$r$J%r%J&r&  SSK'J(r(J)r)  SSKJ*r*  / SQr+\" S5      r,\" S5      r-\" S5      r.\!" \R^                  R`                  SS9S8S j5       r1Sr2S\4S\4S\4S\4S\4S\4S\4S\44 H&  u  r2r3\!" \3SS9" \3Rh                  5      \5" 5       \2'   C3M(     C2\!" \Rl                  SS9 S9SSS.         S:S  jjj5       r6\!" \Rn                  SS9 S9SSS.         S;S! jjj5       r7\!" \Rp                  SS9 S9SSS.         S<S" jjj5       r8 " S# S$\95      r:\:" 5       r;C:\" SS%9 " S& S'5      5       r<S=S( jr=\!" \R|                  SS9SSS.     S>S) jj5       r>\!" \R~                  SS9 S?SSS.       S@S* jjj5       r?\!" \R                  SS9 S?SSS.         SAS+ jjj5       r@\!" \R                  SS9 S9SSS.         SBS, jjj5       rA\!" \R^                  R                  SS9   SC         SDS- jj5       rC\!" \R                  SS9 S9SSS.         SES. jjj5       rD\!" \R^                  R                  SS9   SC         SFS/ jj5       rF\!" \R                  SS9 S9SSS.         SGS0 jjj5       rG\!" \R                  SS9SHS1 j5       rH\R                  R                  \K" S5      5      rL\Lc   e\!" \LR                  SSS29SIS3 j5       rN\R                  " SS4S59   \R                  R                  \P5      rQ\Qc   e SSS5        \!" \QR                  SSS29    SJS6 j5       rS\!" \QR                  SSS29      SKS7 j5       rTg! , (       d  f       NM= f)Lz)
Python polyfills for torch.utils.pytree
    )annotations)deque)	dataclassfield)AnyTYPE_CHECKINGTypeVarN)is_namedtupleis_namedtuple_classis_namedtuple_instanceis_structseqis_structseq_classis_structseq_instancenamedtuple_fieldsstructseq_fields)BUILTIN_TYPESSTANDARD_DICT_TYPES   )substitute_in_graph)CallableIterableMapping)SelfTypeIs)PyTree)r
   r   r   r   r   r   r   r   treespec_leaftreespec_tupletreespec_dicttree_is_leaf	tree_itertree_leavestree_flattentree_flatten_with_pathtree_structuretree_unflatten_T_KT_VTT)can_constant_fold_throughc                     [        S5      e)NzeShould not be called directly because the original function will be called in the constant fold path.)
ValueError)argskwargss     X/home/james-whalen/.local/lib/python3.13/site-packages/torch/_dynamo/polyfills/pytree.py_r/   C   s     	R      r
   r   r   r   r   r   r   r   Fnone_is_leaf	namespacec                  U c  U(       d  Ub  U" U 5      (       a  g[         R                  R                  [        U 5      US9c  gg)NTr4   F)optreeregister_pytree_nodegettypetreeis_leafr3   r4   s       r.   r   r   c   sA     	7+>74==""&&tDzY&GOr0   c            #     #    U /nU(       ac  UR                  5       n[        UUUUS9(       a  Uv   M.  [        R                  " UUUUS9tpgUR	                  [        U5      5        U(       a  Mb  g g 7fNr=   r3   r4   )popr   r7   tree_flatten_one_levelextendreversed)r<   r=   r3   r4   stacknodechildrenr/   s           r.   r    r    s   sr      FE
yy{%	
 J44%	
 	Xh'(# %s   A+A1/A1c         	     ,    [        [        U UUUS95      $ r?   )listr    r;   s       r.   r!   r!      s%     %		
 r0   c                  :   ^  \ rS rSrSrSU 4S jjrSS jrSrU =r$ )	_Asterisk    c                $   > [         TU ]  U S5      $ N*)super__new__)cls	__class__s    r.   rR   _Asterisk.__new__   s    wsC((r0   c                    grO   rM   selfs    r.   __repr___Asterisk.__repr__   s    r0   )returnr   r[   str)	__name__
__module____qualname____firstlineno__	__slots__rR   rY   __static_attributes____classcell__)rT   s   @r.   rK   rK      s    I) r0   rK   )frozenc                  .   \ rS rSr% SrS\S'   S\S'   S\S'   S	\S
'   S\S'   S\S'   S\S'   \" SS9rS\S'   \" SS9rS\S'   \" SS9r	S\S'   S&S jr
S'S jrS(S jr\S)S j5       rS*S jrS+S jrS,S jrS-S jrS.S jrS/S  jrS0S! jrS1S" jrS2S# jrS$rg%)3
PyTreeSpec   z0Analog for :class:`optree.PyTreeSpec` in Python.ztuple[PyTreeSpec, ...]	_childrenbuiltins.type | None_typer   	_metadataztuple[Any, ...]_entriesz7Callable[[Any | None, Iterable[PyTree]], PyTree] | None_unflatten_funcboolr3   r]   r4   F)initint	num_nodes
num_leavesnum_childrenc                  U R                   cR  [        U R                  5      S:X  d   eU R                  b   eU R                  S:X  d   eU R
                  b   eSnSnSnOd[        U R
                  5      (       d   eSnSnU R                   H  nXR                  -  nX$R                  -  nM!     [        U R                  5      n[        R                  U SU5        [        R                  U SU5        [        R                  U SU5        g )Nr   rM      rr   rs   rt   )rk   lenri   rl   rm   rn   callablerr   rs   object__setattr__)rX   rr   rs   rt   childs        r.   __post_init__PyTreeSpec.__post_init__   s    ::t~~&!+++>>)))==B&&&''///IJLD001111IJ__,	...
 ( t~~.L4i84z:4>r0   c                  ^ ^ SUU 4S jjm[        T" T 5      5      /T R                  (       a  S/O/ QST R                  < 3PnSSR                  U5       S3$ )Nc                  > U R                  5       (       a  U R                  b   e[        $ U R                  c   e[        U R                  5      (       d   eU R
                   Vs/ s H  nT" U5      PM     nnU R                  [        ;   ds  U R                  [        S 5      L a  TR                  (       aJ  [        R                  " U R                  5      (       d%  [        R                  " U R                  5      (       a  U R	                  U R                  U5      $ SU R                  R                   SU R                  < SSR                  U5       S3$ s  snf )NzCustomTreeNode([z], [, z]))r=   r:   	_asteriskrx   rn   ri   r   r3   r7   r   r   rl   r^   join)treespecsubspecchildren_representationshelperrX   s      r.   r   #PyTreeSpec.__repr__.<locals>.helper   s/   !!}},,,  ==,,,H445555/7/A/A(/AGw/A % ( .MMT$Z/8I8I--hmm<<,,X]];;  //&&, 
 "(--"8"8!98;M;M:P QII678<(s   %E
NoneIsLeafz
namespace=zPyTreeSpec(r   ))r   rg   r[   r]   )r]   r3   r4   r   )rX   innerr   s   ` @r.   rY   PyTreeSpec.__repr__   sg    	 	6 t
 $ 1 1|nr
 *+

 TYYu-.a00r0   c                   U R                   $ N)rs   rW   s    r.   __len__PyTreeSpec.__len__   s    r0   c                   U R                   $ r   )rk   rW   s    r.   r:   PyTreeSpec.type   s    zzr0   c               L    U R                   S:H  =(       a    U R                  S:H  $ )Nrv   )rr   rs   rW   s    r.   r=   PyTreeSpec.is_leaf  s    ~~";t!';;r0   c               p   ^^ SUU4S jjm/ mT" U / 5        T Vs/ s H  n[        U5      PM     sn$ s  snf )Nc                   > U R                  5       (       a  TR                  U5        g [        U R                  U R                  SS9 H  u  p#T" X1U/-   5        M     g NTstrict)r=   appendziprm   ri   )r   path_prefixentryr   r   pathss       r.   r    PyTreeSpec.paths.<locals>.helper  sX    !![)"%!!""#
 wug 56#r0   )r   rg   r   	list[Any]r[   None)tuple)rX   pathr   r   s     @@r.   r   PyTreeSpec.paths  s:    
	7 
	7 "$tR(-.d...s   3c                  ^^       SUU4S jjm/ mT" U / 5        T Vs/ s H  n[         R                  " U5      PM     sn$ s  snf )Nc           
     t  > U R                  5       (       a  TR                  U5        g U R                  nUc   e[        R                  R                  X R                  S9nUc   eUR                  nUR                  n[        U R                  U R                  SS9 H  u  pgT	" UX" XbU5      /-   5        M     g )Nr6   Tr   )r=   r   r:   r7   r8   r9   r4   kindpath_entry_typer   rm   ri   )
r   entry_path_prefix	node_typehandlerr   r   r   r   entry_pathsr   s
           r.   r   $PyTreeSpec.accessors.<locals>.helper  s     !!""#45 I(((1155%7%7 6 G &&&&-llD8?8O8OO"%!!""#
 %4)P(QQ#r0   )r   rg   r   zlist[optree.PyTreeEntry]r[   r   )r7   PyTreeAccessor)rX   r   r   r   s     @@r.   	accessorsPyTreeSpec.accessors  s[    	 	7	 	 	6 79tR8CD%%d+DDDs    Ac               ,    [        U R                  5      $ r   )rI   ri   rW   s    r.   rG   PyTreeSpec.children5  s    DNN##r0   c                    U R                   U   $ r   )ri   rX   indexs     r.   r{   PyTreeSpec.child8  s    ~~e$$r0   c               ,    [        U R                  5      $ r   )rI   rm   rW   s    r.   entriesPyTreeSpec.entries;  s    DMM""r0   c                    U R                   U   $ r   )rm   r   s     r.   r   PyTreeSpec.entry>  s    }}U##r0   c               B   ^ ^         SUU 4S jjm/ nT" T X5        U$ )Nc           	       > U R                  5       (       a  UR                  U5        g [        U5      nU R                  [        ;  a  X0R                  :w  a  [	        SU R                  < SU< S35      e[
        R                  " UTR                  TR                  S9tpEn[        U5      U R                  :w  a%  [	        SU R                   S[        U5       S35      eXPR                  :w  a  [	        SU R                  < S35      eGOU R                  [        ;   =(       a	    U[        ;   nU(       d-  X0R                  :w  a  [	        SU R                  < SU< S35      e[        U5      U R                  :w  a%  [	        SU R                   S[        U5       S35      eU(       a  U R                  5       n[        U5      n	[        U5      n
X:w  aQ  U
R                  U	5      nU	R                  U
5      nSnU(       a  US	U 3-  nU(       a  US
U 3-  n[	        SU S35      eU Vs/ s H  oU   PM	     nnOp[
        R                  " UTR                  TR                  S9tpEnU[         La;  XPR                  :w  a,  [	        SU R                  < SU R                  < SU< S35      e[#        X@R$                  SS9 H  u  nnT" UX5        M     g s  snf )NzType mismatch; expected z
, but got .r2   zNode arity mismatch; expected z+Node context mismatch for custom node type zNode type mismatch; expected r1   z; missing key(s): z; extra key(s): zNode keys mismatchz%Node metadata mismatch for node type z; expected Tr   )r=   r   r:   r   r+   r7   rB   r3   r4   rw   rt   rl   r   r   set
differencer   r   ri   )r   rF   subtreesr   rG   metadatar/   both_standard_dictexpected_keysgot_key_setexpected_key_setmissing_keys
extra_keysmessagekeysubtreer   r   rX   s                    r.   r   (PyTreeSpec.flatten_up_to.<locals>.helperB  s   
 !!%T
I}}M1-$$$,MM#4Jym1N 
 *0)F)F!%!2!2"nn*&Q
 x=H$9$99$$$,$9$9#:*S]OSTV  111$EhmmEVVWX  2 MM%88 9!%88 # *i==.H$$$,MM#4Jym1N  t9 5 55$$$,$9$9#:*SYKqR 
 &$,$4$4$6M"%d)K'*='9$"6'7'B'B;'O%0%;%;<L%M
"$'#);L>'JJG%#)9*'FFG(+=gYa)HII5BC]cS	]HCH .4-J-J%)%6%6"&...*H "."&8&88(CHMMCT U((0(:(:'=Z|STV 
 %(2D2DT$R w2 %S!  Ds   &K)r   rg   rF   r   r   list[PyTree]r[   r   rM   )rX   r<   r   r   s   `  @r.   flatten_up_toPyTreeSpec.flatten_up_toA  sN    Q	3 Q	3Q	3 #Q	3 	Q	3 Q	3f "$tT$r0   c          	     
   [        U[        [        45      (       d  [        U5      n[        U5      U R                  :w  a(  [        S[        U5       SU R                   SU  S35      eU R                  5       (       a  US   $ SnSn/ nU R                   H5  nX5R                  -  nUR                  UR                  XU 5      5        UnM7     [        U R                  5      (       d   eU R                  U R                  U5      $ )Nz0treespec.unflatten(leaves): `leaves` has length z, but the spec refers to a pytree that holds z items (z).r   )
isinstancerI   r   rw   rs   r+   r=   ri   r   	unflattenrx   rn   rl   )rX   leavesstartendr   r   s         r.   r   PyTreeSpec.unflatten  s    &4-00&\Fv;$//)B3v;- P>>Boo=N Or# 
 <<>>!9 ~~G%%%COOG--f3.?@AE &
 ,,----##DNNH==r0   rM   N)r[   r   r\   )r[   rq   )r[   rj   )r[   ro   )r[   zlist[tuple[Any, ...]])r[   zlist[optree.PyTreeAccessor])r[   zlist[PyTreeSpec])r   rq   r[   rg   )r[   r   )r   rq   r[   r   )r<   r   r[   r   )r   Iterable[Any]r[   r   )r^   r_   r`   ra   __doc____annotations__r   rr   rs   rt   r|   rY   r   propertyr:   r=   r   r   rG   r{   r   r   r   r   rc   rM   r0   r.   rg   rg      s    :%%NLLN&Is&'J'5)L#)?, 1D  </"E@$%#$Vp>r0   rg   c               B    [        U [        [        R                  45      $ r   )r   rg   python_pytreeTreeSpec)objs    r.   _is_pytreespec_instancer     s    cJ(>(>?@@r0   c           
          [        SS S SS U SS9$ )NrM   r1   r2   )rg   r2   s     r.   r   r     s&     

! r0   c                ^^ [        U 5      n[        S U 5       5      (       a  [        SU< S35      e[        U4S jU 5       5      (       a  [        ST SU< S35      e[        U4S jU 5       5      (       a  [        ST< SU< S35      e[        R                  R                  [         TS	9nUc   e[        [        U5      [         S [        [        [        U5      5      5      UR                  TTS
9$ )Nc              3  B   #    U  H  n[        U5      (       + v   M     g 7fr   r   .0r{   s     r.   	<genexpr>!treespec_tuple.<locals>.<genexpr>  s     
D8%&u---8   z&Expected a tuple of PyTreeSpecs, got: r   c              3  @   >#    U  H  oR                   T:g  v   M     g 7fr   r3   r   r{   r3   s     r.   r   r     s     
D8%-8   YAll children PyTreeSpecs must have the same `none_is_leaf` value as the parent; expected , got: c              3  D   >#    U  H  oR                   TS 4;  v   M     g7fr1   Nr6   r   r{   r4   s     r.   r   r     s     
Hxe??9b/1x    VAll children PyTreeSpecs must have the same `namespace` value as the parent; expected r6   r2   )
r   anyr+   r7   r8   r9   rg   rangerw   unflatten_func)iterabler3   r4   rG   r   s    ``  r.   r   r     s    XH

D8
DDDA(QOPP

D8
DDD''3nGH<qJ
 	
 
Hx
HHH''0m78,aI
 	
 ))--ey-IGheCM"#! r0   c         
       ^^ [        U 40 UD6n[        S UR                  5        5       5      (       a  [        SU< S35      e[        U4S jUR                  5        5       5      (       a  [        ST SU< S35      e[        U4S jUR                  5        5       5      (       a  [        ST< SU< S35      e[        R
                  " UTTS	9u  nnnn[        [        U5      [         UUUTTS	9$ )
Nc              3  B   #    U  H  n[        U5      (       + v   M     g 7fr   r   r   s     r.   r    treespec_dict.<locals>.<genexpr>  s     
H<%&u---<r   z)Expected a dictionary of TreeSpecs, got: r   c              3  @   >#    U  H  oR                   T:g  v   M     g 7fr   r   r   s     r.   r   r     s     
H<%-<r   r   r   c              3  D   >#    U  H  oR                   TS 4;  v   M     g7fr   r6   r   s     r.   r   r   	  s     
L|e??9b/1|r   r   r2   )dictr   valuesr+   r7   rB   rg   r   )	mappingr3   r4   r-   dctrG   r   r   r   s	    ``      r.   r   r     s    w
!&
!C

H3::<
HHHDSG1MNN

H3::<
HHH''3nGC7!E
 	
 
Lszz|
LLL''0m73'D
 	
 	%%!	 h! r0   c              :   ^^^^ SUUUU4S jjm/ nT" X5      nXE4$ )Nc           
        >^ [        U TT
T	S9(       a   TR                  U 5        [        SS S SS T
T	S9$ [        R                  " U TT
T	S9u  nnnn[        UU4S jU 5       5      n[        U[        U 5      UUUT
T	S9$ )Nr@   rM   r2   c              3  6   >#    U  H  nT" UT5      v   M     g 7fr   rM   )r   r{   r   r   s     r.   r   /tree_flatten.<locals>.helper.<locals>.<genexpr>Q  s     EH5v..Hs   )r   r   rg   r7   rB   r   r:   )rF   r   rG   r   r   r   subspecsr   r=   r4   r3   s    `     r.   r   tree_flatten.<locals>.helper2  s    %	
 MM$)#  ))%	
	
 EHEEJ%
 	
r0   )rF   r   r   r   r[   rg   rM   )r<   r=   r3   r4   r   r   r   s    ```  @r.   r"   r"   $  s(    (
 (
T Fd#Hr0   c                   [        U UUUS9$ r?   r"   r<   leaf_predicater3   r4   s       r.   
_C_flattenr  a  s     !	 r0   c              B    [        U UUUS9u  pEUR                  5       XE4$ r?   )r"   r   )r<   r=   r3   r4   r   r   s         r.   r#   r#   v  s1     $!	F >>V--r0   c                   [        U UUUS9$ r?   )r#   r	  s       r.   _C_flatten_with_pathr    s     "!	 r0   c                   [        U UUUS9S   $ )Nr@   rv   r  r;   s       r.   r$   r$     s'     !	
 	 	r0   c                t    [        U 5      (       d  [        S[        U 5       S35      eU R                  U5      $ )NzIExpected `treespec` to be an instance of PyTreeSpec but got item of type r   )r   	TypeErrorr:   r   )r   r   s     r.   r%   r%     sF     #8,,//3H~.>aA
 	
 f%%r0   )r)   skip_signature_checkc               J    [        [        U5      5      S:w  a  [        S5      eg )Nr   zExpected no children.)rw   rI   r+   )r/   rG   s     r.   none_unflattenr    s$     4>a011r0   torchr6   c                   [         R                  R                  U 5      nU Vs/ s H  o U   PM	     nn[        U 5      nX4U4[	        U5      4$ s  snf r   )r7   utilstotal_order_sortedrI   r   )r   sorted_keysr   r   original_keyss        r.   dict_flattenr    sQ     ,,11#6K"-.+3#h+F.IM;/{1CCC /s   Ac               j    U u  p#[         R                  U5      nUR                  [        X1SS95        U$ r   )r   fromkeysupdater   )r   r   r  r  ds        r.   dict_unflattenr     s2     "*Mm$AHHST23Hr0   )r,   r   r-   r   r[   ro   r   )
r=   Callable[[PyTree], bool] | Noner<   r   r3   ro   r4   r]   r[   ro   )
r=   r!  r<   r   r3   ro   r4   r]   r[   r   )
r=   r!  r<   r   r3   ro   r4   r]   r[   r   )r   r   r[   z+TypeIs[PyTreeSpec | python_pytree.TreeSpec])r3   ro   r4   r]   r[   rg   )rM   )r   zIterable[PyTreeSpec]r3   ro   r4   r]   r[   rg   )
r   z;Mapping[Any, PyTreeSpec] | Iterable[tuple[Any, PyTreeSpec]]r3   ro   r4   r]   r-   rg   r[   rg   )
r=   r!  r<   r   r3   ro   r4   r]   r[   tuple[list[Any], PyTreeSpec])NFr1   )
r
  r!  r3   ro   r4   r]   r<   r   r[   r"  )
r=   r!  r<   r   r3   ro   r4   r]   r[   3tuple[list[tuple[Any, ...]], list[Any], PyTreeSpec])
r
  r!  r3   ro   r4   r]   r<   r   r[   r#  )
r=   r!  r<   r   r3   ro   r4   r]   r[   rg   )r   rg   r   r   r[   r   )r/   r   rG   zIterable[_T]r[   r   )r   dict[_KT, _VT]r[   z>tuple[list[_VT], tuple[list[_KT], list[_KT]], tuple[_KT, ...]])r   ztuple[list[_KT], list[_KT]]r   zIterable[_VT]r[   r$  )Ur   
__future__r   collectionsr   dataclassesr   r   typingr   r   r	   r7   	optree._Coptree.utilsr
   r   r   r   r   r   r   r   torch.utils._cxx_pytreer  _cxx_pytree
cxx_pytreetorch.utils._pytree_pytreer   r   r   
decoratorsr   builtinscollections.abcr   r   r   typing_extensionsr   r   r   __all__r&   r'   r(   _Cis_dict_insertion_orderedr/   __name__func__python_implementation__globalsr   r    r!   r]   rK   r   rg   r   r   r   r   r"   flattenr  r#   flatten_with_pathr  r$   r%   r8   r9   r:   _none_registrationr   r  dict_insertion_orderedr   _dict_registrationflatten_funcr  r   rM   r0   r.   <module>rA     s   #  ( . .   	 	 	 - , + + B , ;;.., T]enen 
II''"	 
m$/056\"-.34+,)*	NFF ,"& &&(GIf 		  V((DI 04
  -

   
 J V%%G 04)
 ) -)
)
 ) ) ) H): V''4H 04
  -

    I$  K	 $|> |> |>~A 
 $	   	  
 $	 &( " 	
  B 
 $	 LN( (H( 	(
 ( ( ((V 
 $	 044
 4 -4
4
 4 4 "44n 
II $	 7; 4 	
 
 " 
!! $	 04.
 . -.
.
 . . 9.." 
II $	 7; 4 	
 
 9 
 $	 04	
 	 -	
	
 	 	 		  
 $	&& 0044T$Z@ % %% %%"

 ""5G<4488>))) =
 ##"
D	DCD
D %%"
) 	
1 =<s   2!O
O)