
    &VfA7              
         d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
mZmZmZmZ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 dd	lmZ dd
lmZmZmZ ddlmZ ddl m!Z!m"Z" g dZ#e"Z$ ed          Z% ed          Z& ed          Z' ed          Z( ed          Z)ee%         Z* ede          Z+ee+         Z,e G d dee%                               Z- e.ee/e0f                   Z1d8dZ2 G d dee%                   Z3 G d d          Z4ee-e%         geee*e%         e,f         ee*e%         e,eee                  f         f         f         Z5ee,e*e%         ge-e%         f         Z6d9d"Z7d:d$Z8d;d'Z9d<d*Z: ed+d,-          Z; G d. d/e.          Z< G d0 d1e=ee;         e<2          Z>[<d9d3Z?d:d4Z@ejA        ZAd;d5ZBd<d6ZCdd7l m7Z7m9Z9m8Z8m?Z?mBZBm@Z@m:Z:mCZC dS )=zTyping utilities for OpTree.    )annotationsN)Hashable)AnyCallableDefaultDictDequeDict
ForwardRefGenericIterableListNoReturnOptionalSequenceTupleTypeVarUnion)
NamedTuple)OrderedDict)Self)	TypeAlias)FinalProtocolruntime_checkable)_C)
PyTreeKind
PyTreeSpec) r   	PyTreeDefr   PyTreePyTreeTypeVarCustomTreeNodeChildrenMetaDataFlattenFuncUnflattenFuncis_namedtupleis_namedtuple_instanceis_namedtuple_classnamedtuple_fieldsis_structseqis_structseq_instanceis_structseq_classstructseq_fieldsTSUKTVTr   r   r   r   r   r	   r   r   r   r.   r/   r0   r1   r2   	_MetaData)boundc                  2    e Zd ZdZddZedd
            ZdS )r!   z0The abstract base class for custom pytree nodes.returnQtuple[Children[T], MetaData] | tuple[Children[T], MetaData, Iterable[Any] | None]c                    dS )z@Flatten the custom pytree node into children and auxiliary data.N selfs    J/var/www/html/software/conda/lib/python3.11/site-packages/optree/typing.pytree_flattenzCustomTreeNode.tree_flattenf             metadatar#   childrenChildren[T]CustomTreeNode[T]c                    dS )zFUnflatten the children and auxiliary data into the custom pytree node.Nr9   )clsr@   rA   s      r<   tree_unflattenzCustomTreeNode.tree_unflattenq   r>   r?   N)r6   r7   )r@   r#   rA   rB   r6   rC   )__name__
__module____qualname____doc__r=   classmethodrF   r9   r?   r<   r!   r!   b   sX        ::	O 	O 	O 	O U U U [U U Ur?   r!   funcr   r6   c                     dd l } |                                           |                               d fd            }|S )Nr   argsr   kwdsr6   c                 F    	  | i |S # t           $ r  | i |cY S w xY wN	TypeError)rN   rO   cachedrL   s     r<   innerz_tp_cache.<locals>.inner~   sS    	'64(4((( 	' 	' 	'4&&&&&&	's      )rN   r   rO   r   r6   r   )	functools	lru_cachewraps)rL   rV   rU   rT   s   `  @r<   	_tp_cacherY   y   sl    "Y  ""4((F__T' ' ' ' ' ' ' Lr?   c                  J    e Zd ZdZedd            ZddZddZddZddZ	dS )r   aA  Generic PyTree type.

    >>> import torch
    >>> from optree.typing import PyTree
    >>> TensorTree = PyTree[torch.Tensor]
    >>> TensorTree  # doctest: +IGNORE_WHITESPACE
    typing.Union[torch.Tensor,
                 typing.Tuple[ForwardRef('PyTree[torch.Tensor]'), ...],
                 typing.List[ForwardRef('PyTree[torch.Tensor]')],
                 typing.Dict[typing.Any, ForwardRef('PyTree[torch.Tensor]')],
                 typing.Deque[ForwardRef('PyTree[torch.Tensor]')],
                 optree.typing.CustomTreeNode[ForwardRef('PyTree[torch.Tensor]')]]
    item#T | tuple[T] | tuple[T, str | None]r6   r   c                   t          |t                    s|df}t          |          dk    rt          | j         d|d          |\  }}|/t          |t
                    st          | j         d|d          t          |t                    r |j        t          u rt          |d          r|S |t          |          }nt          |t                    r t          | j         d|j         d          }nt          |t                    rb|j        dk    r|j        }n4	 |j         d|j         }n!# t          $ r |j         d|j         }Y nw xY wt          | j         d| d          }nt          | j         d|d          }t          |t           |d	f         t"          |         t$          t&          |f         t(          |         t*          |         f         }||_        |S )
z.Instantiate a PyTree type with the given type.N   zS[...] only supports a tuple of 2 items, a parameter and a string of type name, got .__pytree_args__[]builtins.)
isinstancetuplelenrS   rG   str_GenericAlias
__origin__r   hasattrr
   r   typerH   rI   AttributeErrorr   r   r	   r   r   r!   r`   )rE   r[   paramnamerecurse_reftypenamepytree_aliass          r<   __class_getitem__zPyTree.__class_getitem__   sc    $&& 	 $<Dt99>>< H H>BH H H   tJtS$9$9< H H>BH H H   um,,	 E))011 * L$T**KKw'' 	C$%H%Hu~%H%H%HIIKKt$$ 
	C:-- -F"'"2IIU5GIIHH% F F F"'"2EEU^EEHHHF$%B%Bx%B%B%BCCKK$%A%Au%A%A%ABBK+s"#k!"+;')
 (,$s   "D4 4EEr   c                     t          d          )zProhibit instantiation.z*Cannot instantiate special typing classes.rR   rE   s    r<   __new__zPyTree.__new__   s    DEEEr?   rN   r   kwargsc                     t          d          Prohibit subclassing.z'Cannot subclass special typing classes.rR   rE   rN   rv   s      r<   __init_subclass__zPyTree.__init_subclass__       ABBBr?   c                    | S zImmutable copy.r9   r:   s    r<   __copy__zPyTree.__copy__       r?   memodict[int, Any]c                    | S r~   r9   r;   r   s     r<   __deepcopy__zPyTree.__deepcopy__   r   r?   N)r[   r\   r6   r   r6   r   rN   r   rv   r   r6   r   )r6   r   )r   r   r6   r   )
rG   rH   rI   rJ   rY   rr   ru   r{   r   r   r9   r?   r<   r   r      s          3 3 3 Y3jF F F FC C C C        r?   r   c                  B    e Zd ZdZedd            ZddZddZddZdS )r    a0  Type variable for PyTree.

    >>> import torch
    >>> from optree.typing import PyTreeTypeVar
    >>> TensorTree = PyTreeTypeVar('TensorTree', torch.Tensor)
    >>> TensorTree  # doctest: +IGNORE_WHITESPACE
    typing.Union[torch.Tensor,
                 typing.Tuple[ForwardRef('TensorTree'), ...],
                 typing.List[ForwardRef('TensorTree')],
                 typing.Dict[typing.Any, ForwardRef('TensorTree')],
                 typing.Deque[ForwardRef('TensorTree')],
                 optree.typing.CustomTreeNode[ForwardRef('TensorTree')]]
    rn   rg   rm   rk   r6   r   c                ~    t          |t                    st          | j         d|d          t          ||f         S )zEInstantiate a PyTree type variable with the given name and parameter.z* only supports a string of type name, got r_   )rd   rg   rS   rG   r   )rE   rn   rm   s      r<   ru   zPyTreeTypeVar.__new__   sH     $$$ 	bs|``W[```aaaeTk""r?   rN   r   rv   r   c                     t          d          rx   rR   rz   s      r<   r{   zPyTreeTypeVar.__init_subclass__   r|   r?   c                    | S r~   r9   r:   s    r<   r   zPyTreeTypeVar.__copy__   r   r?   r   r   c                    | S r~   r9   r   s     r<   r   zPyTreeTypeVar.__deepcopy__   r   r?   N)rn   rg   rm   rk   r6   r   r   )r6   r   )r   r   r6   r   )	rG   rH   rI   rJ   rY   ru   r{   r   r   r9   r?   r<   r    r       s~          # # # Y#C C C C        r?   r    objobject | typeboolc                l    t          | t                    r| nt          |           }t          |          S )zSReturn whether the object is an instance of namedtuple or a subclass of namedtuple.)rd   rk   r(   r   rE   s     r<   r&   r&     s.    C&&
5##DIICs###r?   objectc                :    t          t          |                     S )z7Return whether the object is an instance of namedtuple.)r(   rk   r   s    r<   r'   r'     s    tCyy)))r?   rE   rk   c                R   t          | t                    ot          | t                    o}t          t	          | dd          t                    oYt          d | j        D                       o;t          t	          | dd                    ot          t	          | dd                    S )z5Return whether the class is a subclass of namedtuple._fieldsNc              3  B   K   | ]}t          |          t          u V  d S rQ   )rk   rg   ).0fields     r<   	<genexpr>z&is_namedtuple_class.<locals>.<genexpr>  sA       
 
 KK3
 
 
 
 
 
r?   _make_asdict)rd   rk   
issubclassre   getattrallr   callablert   s    r<   r(   r(     s     	3 	4sE""	4wsIt44e<<	4  
 

 
 
 
 
	4 WS'40011	4 WS)T2233
r?   tuple | type[tuple]tuple[str, ...]c                    t          | t                    r%| }t          |          st          d|d          n1t          |           }t          |          st          d| d          |j        S )z'Return the field names of a namedtuple.z,Expected a collections.namedtuple type, got r_   z9Expected an instance of collections.namedtuple type, got )rd   rk   r(   rS   r   r   s     r<   r)   r)   &  s    #t b"3'' 	US3SSSTTT	U 3ii"3'' 	b`X[```aaa;r?   _T_coT)	covariantc                      e Zd Zd
dZddZd	S )_StructSequenceMetasubclassrk   r6   r   c                     t          |          S )aZ  Return whether the class is a PyStructSequence type.

        >>> import time
        >>> issubclass(time.struct_time, structseq)
        True
        >>> class MyTuple(tuple):
        ...     n_fields = 2
        ...     n_sequence_fields = 2
        ...     n_unnamed_fields = 0
        >>> issubclass(MyTuple, structseq)
        False
        )r,   )rE   r   s     r<   __subclasscheck__z%_StructSequenceMeta.__subclasscheck__7  s     "(+++r?   instancer   c                     t          |          S )zReturn whether the object is a PyStructSequence instance.

        >>> import sys
        >>> isinstance(sys.float_info, structseq)
        True
        >>> isinstance((1, 2), structseq)
        False
        )r+   )rE   r   s     r<   __instancecheck__z%_StructSequenceMeta.__instancecheck__F  s     %X...r?   N)r   rk   r6   r   )r   r   r6   r   )rG   rH   rI   r   r   r9   r?   r<   r   r   6  s<        , , , ,	/ 	/ 	/ 	/ 	/ 	/r?   r   c                  D    e Zd ZU dZded<   ded<   ded<   ddZdddZdS )	structseqz<A generic type stub for CPython's ``PyStructSequence`` type.z
Final[int]n_fieldsn_sequence_fieldsn_unnamed_fieldsr6   r   c                     t          d          )ry   z/type 'structseq' is not an acceptable base typerR   rt   s    r<   r{   zstructseq.__init_subclass__]  s    IJJJr?   .sequenceIterable[_T_co]dictdict[str, Any]r   c                    t           rQ   )NotImplementedError)rE   r   r   s      r<   ru   zstructseq.__new__b  s    !!r?   Nr   ).)r   r   r   r   r6   r   )rG   rH   rI   rJ   __annotations__r{   ru   r9   r?   r<   r   r   V  sq         FF!!!!    K K K K
" " " " " " "r?   r   )	metaclassc                l    t          | t                    r| nt          |           }t          |          S )z\Return whether the object is an instance of PyStructSequence or a class of PyStructSequence.)rd   rk   r,   r   s     r<   r*   r*   i  s.    C&&
5##DIICc"""r?   c                :    t          t          |                     S )z=Return whether the object is an instance of PyStructSequence.)r,   rk   r   s    r<   r+   r+   o  s    d3ii(((r?   c                F   t          | t                    o| j        t          fk    o{t          t	          | dd          t
                    oWt          t	          | dd          t
                    o3t          t	          | dd          t
                    o| j        t          z   S )z8Return whether the class is a class of PyStructSequence.r   Nr   r   )rd   rk   	__bases__re   r   int	__flags__Py_TPFLAGS_BASETYPErt   s    r<   r,   r,   x  s     	3 	6MeX%	6 wsJ55s;;		6
 ws$7>>DD	6 ws$6==sCC	6 !445
r?   c                   t          | t                    r%| }t          |          st          d|d          n1t          |           }t          |          st          d| d          |j        }g }t          |                                          D ]I\  }}t          |          |k    r n0t          |t          j	                  r|
                    |           Jt          |          S )z-Return the field names of a PyStructSequence.z&Expected a PyStructSequence type, got r_   z3Expected an instance of PyStructSequence type, got )rd   rk   r,   rS   r   varsitemsrf   typesMemberDescriptorTypeappendre   )r   rE   r   fieldsrn   members         r<   r-   r-     s    #t \!#&& 	OMSMMMNNN	O 3ii!#&& 	\ZRUZZZ[[[ 2FS		))    fv;;+++Efe899 	 MM$==r?   )r&   r(   r'   r*   r,   r+   r)   r-   )rL   r   r6   r   )r   r   r6   r   )r   r   r6   r   )rE   rk   r6   r   )r   r   r6   r   )DrJ   
__future__r   r   collections.abcr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   typing_extensionsr   r   r   r   r   r   r   optreer   	optree._Cr   r   __all__r   r.   r/   r0   r1   r2   r"   r3   r#   r!   rk   r   rg   rh   rY   r   r    r$   r%   r&   r'   r(   r)   r   r   re   r   r*   r+   r   r,   r-   r9   r?   r<   <module>r      s   # " " " " " " "  $ $ $ $ $ $                                 " ) ( ( ( ( ( ) ) ) ) ) ) " " " " " " ' ' ' ' ' ' @ @ @ @ @ @ @ @ @ @       , , , , , , , ,! ! !H 	GCLLGCLLGCLLWT]]WT]] A;GKx000	I U U U U UXa[ U U U& U38_%%    S S S S SWQZ S S Sl               F A	hqk8#$hqk8Xhsm%<<=	? (HQK0.2CCD$ $ $ $* * * *
   
 
 
 
 	4(((/ / / / /$ / / /@" " " " "wu~1D " " " "  # # # #) ) ) ) ,       .	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	r?   