
    Vh@=                       U d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
mZmZ ddlmZ ddlmc mZ ddlmZmZ d	d
lmZ erddlZddlmZ ddlmZ g Zded<   ej:                  rddlZddlZddl mc m!Z" erddl m#Z#  eejH                  jJ                  d      d-d       Z&dZ'dD ]&  Z' e(ee'      Z)  ee)d      e)jT                         [)( [' ee"jV                  d      	 d.	 	 	 	 	 d/d       Z+ ee"jX                  d      	 d.	 	 	 	 	 d0d       Z,edgz  Z ee"jZ                  d      	 d.	 	 	 	 	 d1d       Z-edgz  Z G d de.      Z/ e/       Z0[/ ed       G d d             Z1 e1d ddd d      Z2d2d!Z3 ee"jh                  d      	 d.	 	 	 	 	 d3d"       Z4ed#gz  Z ee"jj                  d      	 d.	 	 	 	 	 d4d$       Z5ed%gz  Z ee"jl                  d      d5d&       Z6ed'gz  Z ee"jn                  d      dd(	 	 	 	 	 	 	 	 	 d6d)       Z7ed*gz  Z ee"jp                  d      dd(	 	 	 	 	 	 	 	 	 d6d+       Z8ed,gz  Zyy)7z)
Python polyfills for torch.utils.pytree
    )annotations)deque)	dataclassfield)AnyCallableLiteralTYPE_CHECKING)TypeIsN)BUILTIN_TYPESSTANDARD_DICT_TYPES   )substitute_in_graph)Iterable)Selfz	list[str]__all__)PyTreeT)can_constant_fold_throughc                     t        d      )NzeShould not be called directly because the original function will be called in the constant fold path.)
ValueError)argskwargss     N/home/dcms/DCMS/lib/python3.12/site-packages/torch/_dynamo/polyfills/pytree.py_r   $   s     V
 	
     )is_namedtupleis_namedtuple_classis_namedtuple_instanceis_structseqis_structseq_classis_structseq_instancenamedtuple_fieldsstructseq_fieldsc                t    | 
|	 ||       ryt         j                  j                  t        |       d      yy)NTtorch	namespaceF)optreeregister_pytree_nodegettypetreeis_leafs     r   tree_is_leafr0   B   s=    
 <G/GDM&&**4:*IQr   Fc              #     K   | g}|r[|j                         }t        ||      r| $t        j                  ||dd      ^}}|j	                  t        |             |rZy y w)Nr/   Tr&   r/   none_is_leafr(   )popr0   r)   tree_flatten_one_levelextendreversed)r.   r/   stacknodechildrenr   s         r   	tree_iterr<   M   sg     
 99;DD'2
!88!!	LHq LL(+, s   AA$"A$r<   c                .    t        t        | |            S Nr2   )listr<   r-   s     r   tree_leavesr@   c   s    
 IdG455r   r@   c                  ,     e Zd ZdZd fdZddZ xZS )	_Asterisk c                $    t         |   | d      S N*)super__new__)cls	__class__s    r   rH   z_Asterisk.__new__o   s    7?3,,r   c                     yrE   rC   selfs    r   __repr__z_Asterisk.__repr__r   s    r   )returnr   rO   str)__name__
__module____qualname__	__slots__rH   rN   __classcell__)rJ   s   @r   rB   rB   l   s    		-	r   rB   )frozenc                  2   e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<    ed      Zded<    ed      Zded<    ed      Zded<    ed      Z	ded<    ed      Z
ded<   d"dZd#dZd$dZed%d       Zd&dZd'dZd(dZd)dZd*dZd+dZd,d Zy!)-
PyTreeSpecz0Analog 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_funcF)initint	num_nodes
num_leavesnum_childrenzLiteral[True]r4   zLiteral['torch']r(   c                j   | j                   Nt        | j                        dk(  sJ | j                  J | j                  dk(  sJ | j
                  J d}d}d}nft        | j
                        sJ t        d | j                  D        d      }t        d | j                  D              }t        | j                        }t        j                  | d|       t        j                  | d|       t        j                  | d	|       t        j                  | d
d       t        j                  | dd       y )Nr   rC      c              3  4   K   | ]  }|j                     y wN)rb   .0specs     r   	<genexpr>z+PyTreeSpec.__post_init__.<locals>.<genexpr>   s      KD K   )startc              3  4   K   | ]  }|j                     y wrh   rc   ri   s     r   rl   z+PyTreeSpec.__post_init__.<locals>.<genexpr>   s      LT Lrm   rb   rc   rd   r4   Tr(   r&   )
r\   lenrZ   r]   r^   r_   callablesumobject__setattr__)rM   rb   rc   rd   s       r   __post_init__zPyTreeSpec.__post_init__   s   zz!4>>*a///~~---}}***++333	
  4 4555 KDNN KSTU	  LT^^ LL
"4>>2t[)<t\:>t^\Bt^T:t[':r   c                B    dfdd |        d| j                   dS )Nc                (   | j                         r| j                  J t        S | j                  J t        | j                        sJ | j
                  D cg c]
  } |       }}| j                  t        v s>t        j                  | j                        st        j                  | j                        r| j	                  | j                  |      S d| j                  j                   d| j                  ddj                  |       dS c c}w )NzCustomTreeNode([z], [z, z]))r/   r,   	_asteriskrr   r_   rZ   r   r)   r   r!   r]   rR   join)treespecsubspecchildren_representationshelpers      r   r   z#PyTreeSpec.__repr__.<locals>.helper   s   ##%#==000$$}}000 8 89993;3E3E,(/F7O,( , MM]211(--@00?#33 **0 
 &hmm&<&<%=Qx?Q?Q>T U		":;<B@,s   DzPyTreeSpec(z, NoneIsLeaf, namespace=))r|   rY   rO   rQ   r'   )rM   r   s    @r   rN   zPyTreeSpec.__repr__   s,    2 fTl^+CDNNCUUVWr   c                    | j                   S rh   rp   rL   s    r   __len__zPyTreeSpec.__len__   s    ??"r   c                    | j                   S rh   )r\   rL   s    r   r,   zPyTreeSpec.type   s    ::r   c                B    | j                   dk(  xr | j                  dk(  S )Nrf   )rb   rc   rL   s    r   r/   zPyTreeSpec.is_leaf   s    >>Q&?4??a+??r   c                ,    t        | j                        S rh   )r?   rZ   rL   s    r   r;   zPyTreeSpec.children   s    ''r   c                     | j                   |   S rh   )rZ   rM   indexs     r   childzPyTreeSpec.child   s    >>%((r   c                ,    t        | j                        S rh   )r?   r^   rL   s    r   entrieszPyTreeSpec.entries   s    &&r   c                     | j                   |   S rh   )r^   r   s     r   entryzPyTreeSpec.entry   s    ==''r   c                <    	 	 	 	 	 	 	 	 dfdg } | ||       |S )Nc           	        | j                         r|j                  |       y t        |      }| j                  t        vr|| j                  k7  rt	        d| j                  d|d      t        j                  |dd      ^}}}t        |      | j                  k7  r%t	        d| j                   dt        |       d      || j                  k7  rt	        d| j                  d      | j                  t        v xr |t        v }|s+|| j                  k7  rt	        d	| j                  d|d      t        |      | j                  k7  r%t	        d| j                   dt        |       d      |r| j                         }t        |      }	t        |      }
|	|
k7  rG|
j                  |	      }|	j                  |
      }d
}|r|d| z  }|r|d| z  }t	        d| d      |D cg c]  }||   	 }}n[t        j                  |dd      ^}}}|t        ur8|| j                  k7  r)t	        d| j                  d| j                  d|d      t        || j                         D ]  \  }} |||        y c c}w )NzType mismatch; expected z
, but got .Tr&   )r4   r(   zNode arity mismatch; expected z+Node context mismatch for custom node type zNode type mismatch; expected r   z; missing key(s): z; extra key(s): zNode keys mismatchz%Node metadata mismatch for node type z; expected )r/   appendr,   r   r   r)   r6   rq   rd   r]   r   r   set
differencer   ziprZ   )r|   r:   subtrees	node_typer;   metadatar   both_standard_dictexpected_keysgot_key_setexpected_key_setmissing_keys
extra_keysmessagekeysubtreer}   r   s                    r   r   z(PyTreeSpec.flatten_up_to.<locals>.helper   s   
 ##%OOD) J	==5 HMM1(((0'8
9-qR 
 .4-J-J%)").*Hh
 8}(=(==(((0(=(='>jXWXZ   8#5#55(I(--IZZ[\  !)<< =%)<< ' .)x}}2L(((0'8
9-qR  4yH$9$99(((0(=(='>jTSTV 
 *(0(8(8(:&)$i+.}+=(&*::+;+F+F{+SL)4)?)?@P)QJ&(G+ '-?~+N N) '-=j\+J J",/A'!-L"MM9F#G#DI#G#G 281N1N )-&-2.(Q &#()&(*<*<<","GGX Y,,4,>,>+AH<WX!Z# 
 ),Hh6H6H(I 7$GW7GX67# $Hs   +I>)r|   rY   r:   r   r   list[PyTree]rO   NonerC   )rM   r.   r   r   s      @r   flatten_up_tozPyTreeSpec.flatten_up_to   sJ    R7$R7R7 'R7 	R7h &(H4x(Or   c           	        t        |t        t        f      st        |      }t        |      | j                  k7  r(t        dt        |       d| j                   d|  d      | j                         r|d   S d}d}g }| j                  D ]6  }||j                  z  }|j                  |j                  |||              |}8 t        | j                        sJ | j                  | j                  |      S )Nz0treespec.unflatten(leaves): `leaves` has length z, but the spec refers to a pytree that holds z items (z).r   )
isinstancer?   tuplerq   rc   r   r/   rZ   r   	unflattenrr   r_   r]   )rM   leavesrn   endr   r}   s         r   r   zPyTreeSpec.unflatten)  s    ftUm4f6{doo- Fs6{m TBBF//AR S"V2' 
 ||~ay  ECH>> w))) 1 1&s2C DE
 D00111''AAr   N)rO   r   rP   )rO   ra   )rO   r[   )rO   bool)rO   zlist[PyTreeSpec])r   ra   rO   rY   )rO   	list[Any])r   ra   rO   r   )r.   r   rO   r   )r   Iterable[Any]rO   r   )rR   rS   rT   __doc____annotations__r   rb   rc   rd   r4   r(   rv   rN   r   propertyr,   r/   r;   r   r   r   r   r   rC   r   r   rY   rY   x   s    >))##!!PPE*	3*U+
C+!u-c-&+&7m7&+&7	#7	;*	:	# 
	 
		@	(	)	'	(W	r	Br   rY   rC   c               "    t        | t              S rh   )r   rY   )objs    r   _is_pytreespec_instancer   C  s    #z**r   c                2    dfdg } | |      }||fS )Nc                    t        |       rj                  |        t        S t        j                  | dd      \  }}}}t        fd|D              }t        |t        |       |||      S )Nr2   Tr&   r3   c              3  0   K   | ]  } |        y wrh   rC   )rj   r   r   r   s     r   rl   z/tree_flatten.<locals>.helper.<locals>.<genexpr>b  s     IuVE62Is   )r0   r   
_LEAF_SPECr)   r6   r   rY   r,   )	r:   r   r;   r   r   unflatten_funcsubspecsr   r/   s	    `     r   r   ztree_flatten.<locals>.helperP  su    D'2d#!! --!!	 IIIHhT
Hg~VVr   )r:   r   r   r   rO   rY   rC   )r.   r/   r   r|   r   s    `  @r   tree_flattenr   F  s'    	W* $'xr   r   c                "    t        | |      d   S )Nr2   rf   )r   r-   s     r   tree_structurer   k  s     D'2155r   r   c                j    t        |      st        dt        |       d      |j                  |       S )Nzhtree_unflatten(leaves, treespec): Expected `treespec` to be instance of PyTreeSpec but got item of type r   )r   	TypeErrorr,   r   )r   r|   s     r   tree_unflattenr   y  sC     'x0337>2B!E  !!&))r   r   r2   c                   t        ||      \  }}|g|D cg c]  }|j                  |       c}z   }|j                  t        | g|       S c c}w r>   )r   r   r   mapfuncr.   r/   restsr   r|   r	flat_argss           r   tree_mapr     sX     (g>H5Ia 6 6q 9II	!!#d"7Y"788  Js   Ar   c                   t        ||      \  }}|g|D cg c]  }|j                  |       c}z   }t        t        | g| d       |S c c}w )Nr2   r   )maxlen)r   r   r   r   r   s           r   	tree_map_r     sV     (g>H5Ia 6 6q 9II	c$##A.  Js   Ar   )r   r   r   r   rO   r   rh   )r.   r   r/   Callable[[PyTree], bool] | NonerO   r   )r.   r   r/   r   rO   r   )r.   r   r/   r   rO   r   )r   r   rO   zTypeIs[PyTreeSpec])r.   r   r/   r   rO   ztuple[list[Any], PyTreeSpec])r.   r   r/   r   rO   rY   )r   r   r|   rY   rO   r   )
r   zCallable[..., Any]r.   r   r   r   r/   r   rO   r   )9r   
__future__r   collectionsr   dataclassesr   r   typingr   r   r	   r
   typing_extensionsr   torch.utils._pytreeutils_pytreepython_pytreer   r   
decoratorsr   builtinscollections.abcr   r   r   r   _cxx_pytree_dynamo_traceabler)   	optree._Ctorch.utils._cxx_pytree_cxx_pytree
cxx_pytreer   _Cis_dict_insertion_orderedr   __namegetattr__func__python_implementation__r0   r<   r@   rQ   rB   rz   rY   r   r   r   r   r   r   r   rC   r   r   <module>r      s   #  ( 8 8 $ + + B , (&   --002		++"&
	
 F	  (CFdC,,	
  	00DQ 480 
 R --O 48--0- 
- P-& }G//4P 486606 
6 Q6 GC  IdFB FB FBP BdB5J+  #(	 48  0  
&  : G!! #(	 486606 
66  !!G!! #(	**  !!G,,M
 48	9 99 9 1	9
 
9 N9 
|G--N
 48		 		 	 1		
 
	 O	 }GO .r   