
    0Vht8                       d Z ddlmZ ddlZddlZddlmZmZmZ ddl	m
Z
mZmZmZmZmZmZ ddlmZ ddlmZ ddlmZ e
rddlZddlmZmZ g d	Zej6                  d
k\  rddini Z ej:                  d/ddddde G d d             Z[ ed      Z edd      Z  edd      Z! edd      Z" G d de      Z# G d de      Z$ G d de      Z% G d de      Z& G d de$ee          Z' G d  d!e$ee!e"f         Z( G d" d#e'e         Z) G d$ d%e'e         Z* G d& d'e%      Z+ G d( d)e,ed*f         Z-d+e.cZ/Z0eD ]2  Z/ e1       e/   Z0 e2e0e3      s e4d,e0d-      d.e0_5         e6ee/e0       4 [/[0y)0zAccess support for pytrees.    )annotationsN)IterableMappingSequence)TYPE_CHECKINGAnyClassVarGenericLiteralTypeVaroverload)Self)
PyTreeKind)
NamedTupleStructSequence)PyTreeEntryGetItemEntryGetAttrEntryFlattenedEntry	AutoEntrySequenceEntryMappingEntryNamedTupleEntryStructSequenceEntryDataclassEntryPyTreeAccessor)   
   slotsTF)initrepreqfrozenc                  j    e Zd ZU dZded<   ded<   ded<   ddZdd	Zdd
ZddZddZ	ddZ
dddZy)r   zBase class for path entries.r   entrybuiltins.typetyper   kindc                   | j                   t        j                  k(  rt        d      | j                   t        j                  k(  rt        d      y)zPost-initialize the path entry.z Cannot create a leaf path entry.z$Cannot create a path entry for None.N)r(   r   LEAF
ValueErrorNONEselfs    @/home/dcms/DCMS/lib/python3.12/site-packages/optree/accessors.py__post_init__zPyTreeEntry.__post_init__=   s?    99
'?@@99
'CDD (    c                   	 || j                      S # t        $ r-}t        | j                  d|d| j                         |d}~ww xY w)Get the child object.z cannot access through z via entry N)r%   	TypeError	__class__)r.   objexs      r/   __call__zPyTreeEntry.__call__D   sS    	tzz?" 	>>$$;C7+djj^\	s    	A(AAc                   t        |t              rt        | |f      S t        |t              rt        | g|      S t        S )z8Join the path entry with another path entry or accessor.)
isinstancer   r   NotImplementedr.   others     r/   __add__zPyTreeEntry.__add__M   s<    e[)!4-00e^,!4.%.11r1   c                  t        |t              xr | j                  | j                  | j                  | j
                  j                  j                  j                  | j
                  j                  j                  j                  f|j                  |j                  |j                  |j
                  j                  j                  j                  |j
                  j                  j                  j                  fk(  S )z$Check if the path entries are equal.)
r:   r   r%   r'   r(   r5   r8   __code__co_codecodifyr<   s     r/   __eq__zPyTreeEntry.__eq__U   s    %- 


				''0088%%..66 



((1199&&//77	
r1   c                   t        | j                  | j                  | j                  | j                  j
                  j                  j                  | j                  j                  j                  j                  f      S )zGet the hash of the path entry.)	hashr%   r'   r(   r5   r8   r@   rA   rB   r-   s    r/   __hash__zPyTreeEntry.__hash__h   s[    

				''0088%%..66
 	
r1   c               h    | j                   j                   d| j                  d| j                  dS ))Get the representation of the path entry.z(entry=, type=))r5   __name__r%   r'   r-   s    r/   __repr__zPyTreeEntry.__repr__t   /    ..))*'$**wtyymSTUUr1   c               &    | d| j                   dS )+Generate code for accessing the path entry.z[<flat index z>]r%   r.   nodes     r/   rB   zPyTreeEntry.codifyx   s    }TZZN"55r1   N)returnNoner6   r   rS   r   )r=   objectrS   r   r=   rV   rS   boolrS   intrS   str rR   r\   rS   r\   )rK   
__module____qualname____doc____annotations__r0   r8   r>   rC   rF   rL   rB    r1   r/   r   r   5   s;    &J

E
&

V6r1   r   _T_T_co)	covariant_KT_co_VT_coc                  D     e Zd ZU dZdZded<   	 	 	 	 	 	 	 	 d fdZ xZS )r   zTA generic path entry class that determines the entry type on creation automatically.rd   ClassVar[tuple[()]]	__slots__c                  ddl m}m} | t        urt        |   |       S |t        j                  k7  rt        d|d       ||      rt        }n_ ||      rt        }nPt        j                  |      rt        }n4t        |t              rt         }nt        |t"              rt$        }nt&        }t        |t              s
 ||||      S t)        d      )zCreate a new path entry.r   )is_namedtuple_classis_structseq_classz5Cannot create an automatic path entry for PyTreeKind .zUnreachable code.)optree.typingrn   ro   r   super__new__r   CUSTOMr+   r   r   dataclassesis_dataclassr   
issubclassr   r   r   r   r   NotImplementedError)clsr%   r'   r(   rn   ro   path_entry_typer5   s          r/   rs   zAutoEntry.__new__   s     	Ji7?3'':$$$TUYT\\]^__ d#1O &-O%%d+,Og&*Oh'+O,O/95 #5$55
 ""566r1   )r%   r   r'   r&   r(   r   rS   r   )rK   r`   ra   rb   rl   rc   rs   __classcell__r5   s   @r/   r   r      sC    ^%'I"'*7 *7 	*7
 *7 
*7 *7r1   r   c                  2    e Zd ZU dZdZded<   ddZd	d
dZy)r   zWA generic path entry class for nodes that access their children by :meth:`__getitem__`.rd   rk   rl   c                    || j                      S r3   rP   r.   r6   s     r/   r8   zGetItemEntry.__call__       4::r1   c               &    | d| j                   dS )rO   []rP   rQ   s     r/   rB   zGetItemEntry.codify   s    qa((r1   NrU   r]   r_   )rK   r`   ra   rb   rl   rc   r8   rB   rd   r1   r/   r   r      s    a%'I"')r1   r   c                  N    e Zd ZU dZdZded<   ded<   edd       ZddZddd	Z	y
)r   zWA generic path entry class for nodes that access their children by :meth:`__getattr__`.rd   rk   rl   r\   r%   c                   | j                   S zGet the attribute name.rP   r-   s    r/   namezGetAttrEntry.name        zzr1   c               .    t        || j                        S r   )getattrr   r   s     r/   r8   zGetAttrEntry.__call__   s    sDII&&r1   c               $    | d| j                    S rO   rp   r   rQ   s     r/   rB   zGetAttrEntry.codify   s    q$$r1   Nr[   rU   r]   r_   )
rK   r`   ra   rb   rl   rc   propertyr   r8   rB   rd   r1   r/   r   r      s1    a%'I"'J '%r1   r   c                       e Zd ZU dZdZded<   y)r   z2A fallback path entry class for flattened objects.rd   rk   rl   N)rK   r`   ra   rb   rl   rc   rd   r1   r/   r   r      s    <%'I"'r1   r   c                  V    e Zd ZU dZdZded<   ded<   ded<   edd	       Zdd
ZddZ	y)r   z!A path entry class for sequences.rd   rk   rl   rZ   r%   zbuiltins.type[Sequence[_T_co]]r'   c                   | j                   S )zGet the index.rP   r-   s    r/   indexzSequenceEntry.index   r   r1   c                    || j                      S r   )r   r   s     r/   r8   zSequenceEntry.__call__   r   r1   c               h    | j                   j                   d| j                  d| j                  dS )rH   z(index=rI   rJ   )r5   rK   r   r'   r-   s    r/   rL   zSequenceEntry.__repr__   rM   r1   NrY   )r6   zSequence[_T_co]rS   rf   r[   )
rK   r`   ra   rb   rl   rc   r   r   r8   rL   rd   r1   r/   r   r      s8    +%'I"'J
(( Vr1   r   c                  V    e Zd ZU dZdZded<   ded<   ded<   edd	       Zdd
ZddZ	y)r   z A path entry class for mappings.rd   rk   rl   rh   r%   z&builtins.type[Mapping[_KT_co, _VT_co]]r'   c                   | j                   S )zGet the key.rP   r-   s    r/   keyzMappingEntry.key   r   r1   c                    || j                      S r   )r   r   s     r/   r8   zMappingEntry.__call__  s    488}r1   c               h    | j                   j                   d| j                  d| j                  dS )rH   z(key=rI   rJ   )r5   rK   r   r'   r-   s    r/   rL   zMappingEntry.__repr__  s.    ..))*%|7499-qQQr1   N)rS   rh   )r6   zMapping[_KT_co, _VT_co]rS   ri   r[   )
rK   r`   ra   rb   rl   rc   r   r   r8   rL   rd   r1   r/   r   r      s8    *%'I"'M
00 Rr1   r   c                  t    e Zd ZU dZdZded<   ded<   ded<   d	ed
<   edd       Zedd       ZddZ	dddZ
y)r   z*A path entry class for namedtuple objects.rd   rk   rl   rZ   r%   zbuiltins.type[NamedTuple[_T]]r'   zLiteral[PyTreeKind.NAMEDTUPLE]r(   c               2    ddl m}  || j                        S )Get the field names.r   )namedtuple_fields)rq   r   r'   )r.   r   s     r/   fieldszNamedTupleEntry.fields  s     	4 ++r1   c               4    | j                   | j                     S zGet the field name.r   r%   r-   s    r/   fieldzNamedTupleEntry.field       {{4::&&r1   c               h    | j                   j                   d| j                  d| j                  dS rH   z(field=rI   rJ   r5   rK   r   r'   r-   s    r/   rL   zNamedTupleEntry.__repr__"  rM   r1   c               $    | d| j                    S r   r   rQ   s     r/   rB   zNamedTupleEntry.codify&      q%%r1   NrS   ztuple[str, ...]r[   r]   r_   rK   r`   ra   rb   rl   rc   r   r   r   rL   rB   rd   r1   r/   r   r     sR    4%'I"'J
''
((, , ' 'V&r1   r   c                  t    e Zd ZU dZdZded<   ded<   ded<   d	ed
<   edd       Zedd       ZddZ	dddZ
y)r   z0A path entry class for PyStructSequence objects.rd   rk   rl   rZ   r%   z!builtins.type[StructSequence[_T]]r'   z"Literal[PyTreeKind.STRUCTSEQUENCE]r(   c               2    ddl m}  || j                        S )r   r   )structseq_fields)rq   r   r'   )r.   r   s     r/   r   zStructSequenceEntry.fields4  s     	3		**r1   c               4    | j                   | j                     S r   r   r-   s    r/   r   zStructSequenceEntry.field;  r   r1   c               h    | j                   j                   d| j                  d| j                  dS r   r   r-   s    r/   rL   zStructSequenceEntry.__repr__@  rM   r1   c               $    | d| j                    S r   r   rQ   s     r/   rB   zStructSequenceEntry.codifyD  r   r1   Nr   r[   r]   r_   r   rd   r1   r/   r   r   +  sR    :%'I"'J
++
,,+ + ' 'V&r1   r   c                  z    e Zd ZU dZdZded<   ded<   edd       Zedd       Zedd	       Z	edd
       Z
ddZy)r   z#A path entry class for dataclasses.rd   rk   rl   z	str | intr%   c               `    t        d t        j                  | j                        D              S )zGet all field names.c              3  4   K   | ]  }|j                     y wNr   .0fs     r/   	<genexpr>z(DataclassEntry.fields.<locals>.<genexpr>S  s     CQVVC   tupleru   r   r'   r-   s    r/   r   zDataclassEntry.fieldsP  s$     C[%7%7		%BCCCr1   c               `    t        d t        j                  | j                        D              S )zGet the init field names.c              3  N   K   | ]  }|j                   s|j                    y wr   )r    r   r   s     r/   r   z-DataclassEntry.init_fields.<locals>.<genexpr>X  s     MaffQVVMs   %%r   r-   s    r/   init_fieldszDataclassEntry.init_fieldsU  s$     M[%7%7		%BMMMr1   c                   t        | j                  t              r| j                  | j                     S | j                  S r   )r:   r%   rZ   r   r-   s    r/   r   zDataclassEntry.fieldZ  s1     djj#&##DJJ//zzr1   c                   | j                   S r   r   r-   s    r/   r   zDataclassEntry.namea  r   r1   c               h    | j                   j                   d| j                  d| j                  dS r   r   r-   s    r/   rL   zDataclassEntry.__repr__f  rM   r1   Nr   r[   )rK   r`   ra   rb   rl   rc   r   r   r   r   r   rL   rd   r1   r/   r   r   I  sn    -%'I"'D D N N    Vr1   r   c                       e Zd ZU dZdZded<   edd       Zdd fdZddZ	e
dd       Ze
dd	       Zd fd
ZddZd fdZd fdZd fdZd fdZd fdZdddZ xZS ) r   zA path class for PyTrees.rd   rk   rl   c               &    t        d | D              S )zGet the path of the accessor.c              3  4   K   | ]  }|j                     y wr   rP   )r   es     r/   r   z&PyTreeAccessor.path.<locals>.<genexpr>s  s     +QWW+r   )r   r-   s    r/   pathzPyTreeAccessor.pathp  s     +d+++r1   c                   t        |t        t        f      st        |      }t        d |D              st	        d|d      t
        |   | |      S )zCreate a new accessor instance.c              3  <   K   | ]  }t        |t                y wr   )r:   r   )r   ps     r/   r   z)PyTreeAccessor.__new__.<locals>.<genexpr>y  s     <!:a-<s   z$Expected a path of PyTreeEntry, got rp   )r:   listr   allr4   rr   rs   )ry   r   r5   s     r/   rs   zPyTreeAccessor.__new__u  sN    $u.;D<t<<B4(!LMMwsD))r1   c               $    | D ]
  } ||      } |S r   rd   )r.   r6   r%   s      r/   r8   zPyTreeAccessor.__call__}  s     	E*C	
r1   c                    y r   rd   r.   r   s     r/   __getitem__zPyTreeAccessor.__getitem__  s    9<r1   c                    y r   rd   r   s     r/   r   zPyTreeAccessor.__getitem__  s    47r1   c               ~    t        |t              r| j                  t        |   |            S t        |   |      S )z6Get the child path entry or an accessor for a subpath.)r:   slicer5   rr   r   )r.   r   r5   s     r/   r   zPyTreeAccessor.__getitem__  s6    eU#>>%'"5e"<==w"5))r1   c                   t        |t              r| j                  g | |      S t        |t              r| j                  g | |      S t        S )z6Join the accessor with another path entry or accessor.)r:   r   r5   r   r;   r<   s     r/   r>   zPyTreeAccessor.__add__  sJ    e[)>>.D.%.11e^,>>/D/5/22r1   c               @    | j                  t        | 	  |            S zRepeat the accessor.)r5   rr   __mul__r.   valuer5   s     r/   r   zPyTreeAccessor.__mul__  s    ~~egoe455r1   c               @    | j                  t        | 	  |            S r   )r5   rr   __rmul__r   s     r/   r   zPyTreeAccessor.__rmul__  s    ~~eg.u566r1   c               F    t        |t              xr t        |   |      S )z!Check if the accessors are equal.)r:   r   rr   rC   )r.   r=   r5   s     r/   rC   zPyTreeAccessor.__eq__  s    %0JUW^E5JJr1   c                    t         |          S )zGet the hash of the accessor.)rr   rF   r.   r5   s    r/   rF   zPyTreeAccessor.__hash__  s    w!!r1   c               v    | j                   j                   d| j                          dt        |           dS )z'Get the representation of the accessor.(z, rJ   )r5   rK   rB   rr   rL   r   s    r/   rL   zPyTreeAccessor.__repr__  s7    ..))*!DKKM?"UW=M=O<PPQRRr1   c               :    |}| D ]  }|j                  |      } |S )z%Generate code for accessing the path.)rB   )r.   rootstringr%   s       r/   rB   zPyTreeAccessor.codify  s)     	*E\\&)F	*r1   )rS   ztuple[Any, ...])rd   )r   zIterable[PyTreeEntry]rS   r   rU   )r   rZ   rS   r   )r   r   rS   r   )r   zint | slicerS   zPyTreeEntry | Self)r=   rV   rS   r   )r   rZ   rS   r   rW   rY   r[   )*)r   r\   rS   r\   )rK   r`   ra   rb   rl   rc   r   r   rs   r8   r   r   r>   r   r   rC   rF   rL   rB   r{   r|   s   @r/   r   r   k  sz    #%'I"', ,* < <7 7*67K"S r1   r   .r^   zExpected a class, got rp   optreerd   )7rb   
__future__r   ru   syscollections.abcr   r   r   typingr   r   r	   r
   r   r   r   typing_extensionsr   	optree._C_Cr   builtinsrq   r   r   __all__version_infoSLOTS	dataclassr   re   rf   rh   ri   r   r   r   r   r   r   r   r   r   r   r   rV   _name_clsglobalsr:   r'   r4   r`   setattrrd   r1   r/   <module>r      s   " "  
 7 7 T T T "    8 ++w6$B MDutMuMD6 D6 ND6N 
 T]4(	T	*	T	*/7 /7d); )%; %*([ (VL'%. V,R<!8 R,&mB' &<&-+ &<V\ VDEU;+, ER &t E9UDdD!0:;;DOBt 
4r1   