o
    Zh@=                     @  s  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  mZ ddlmZmZ d	d
lmZ erRddlZddlmZ ddlmZ g Zded< ejrSddlZddlZddl m  m!Z" eruddl m#Z# eej$j%dddCddZ&dZ'dD ]Z'e(ee'Z)ee)dde)j* [)q['ee"j+dd	dDdEdd Z+ee"j,d!d	dDdFd#d$Z,ed$g7 Zee"j-dd	dDdGd&d'Z-ed'g7 ZG d(d) d)e.Z/e/ Z0[/edd*G d+d, d,Z1e1d-ddd-dZ2dHd0d1Z3ee"j4d!d	dDdId3d4Z4ed4g7 Zee"j5d!d	dDdJd5d6Z5ed6g7 Zee"j6d!ddKd9d:Z6ed:g7 Zee"j7dddd;dLd?d@Z7ed@g7 Zee"j8dddd;dLdAdBZ8edBg7 ZdS dS )Mz)
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)Zcan_constant_fold_throughargsr   kwargsreturnboolc                  O  s   t d)NzeShould not be called directly because the original function will be called in the constant fold path.)
ValueError)r   r    r   M/var/www/auris/lib/python3.10/site-packages/torch/_dynamo/polyfills/pytree.py_$   s   r    )is_namedtupleis_namedtuple_classZis_namedtuple_instanceZis_structseqis_structseq_classZis_structseq_instanceZnamedtuple_fieldsZstructseq_fieldstreer   is_leafCallable[[PyTree], bool] | Nonec                 C  s<   | d u s|d ur|| rdS t jjt| ddd u rdS dS )NTtorch	namespaceF)optreeZregister_pytree_nodegettyper   r    r   r   r   tree_is_leafB   s
   r)   FIterable[Any]c                 c  sX    | g}|r*|  }t||dr|V  qtj||ddd^}}|t| |sd S d S )Nr    Tr"   r    none_is_leafr$   )popr)   r%   tree_flatten_one_levelextendreversed)r   r    stacknodechildrenr   r   r   r   	tree_iterM   s   
r5   	list[Any]c                 C  s   t t| |dS )Nr+   )listr5   r(   r   r   r   tree_leavesc   s   r8   c                      s,   e Zd ZdZd	 fddZd
ddZ  ZS )	_Asteriskr   r   r   c                   s   t  | dS N*)super__new__)cls	__class__r   r   r=   o   s   z_Asterisk.__new__strc                 C  s   dS r:   r   selfr   r   r   __repr__r   s   z_Asterisk.__repr__)r   r   r   rA   )__name__
__module____qualname__	__slots__r=   rD   __classcell__r   r   r?   r   r9   l   s    r9   )frozenc                   @  s  e Zd ZU dZded< ded< ded< ded	< d
ed< eddZded< eddZded< eddZded< eddZ	ded< eddZ
ded< d9ddZd:ddZd;ddZed<dd Zd=d"d#Zd>d%d&Zd?d(d)Zd@d+d,ZdAd-d.ZdBd2d3ZdCd6d7Zd8S )D
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]r-   zLiteral['torch']r$   r   Nonec                 C  s   | j d u r*t| jdksJ | jd u sJ | jdksJ | jd u s#J d}d}d}n"t| js1J tdd | jD dd}tdd | jD }t| j}t	| d| t	| d	| t	| d
| t	| dd t	| dd d S )Nr   r      c                 s      | ]}|j V  qd S N)rU   .0specr   r   r   	<genexpr>       z+PyTreeSpec.__post_init__.<locals>.<genexpr>)startc                 s  rZ   r[   rV   r\   r   r   r   r_      r`   rU   rV   rW   r-   Tr$   r"   )
rO   lenrM   rP   rQ   rR   callablesumobject__setattr__)rC   rU   rV   rW   r   r   r   __post_init__   s"   

zPyTreeSpec.__post_init__rA   c                   s&   d
 fdd d |  d| j d	S )NtreespecrL   r   rA   c                   s   |   r| jd u sJ tS | jd usJ t| jsJ  fdd| jD }| jtv s6t| js6t	| jr=| | j
|S d| jj d| j
dd| dS )Nc                   s   g | ]} |qS r   r   )r]   subspechelperr   r   
<listcomp>   s    z7PyTreeSpec.__repr__.<locals>.helper.<locals>.<listcomp>zCustomTreeNode([z], [z, z]))r    r'   	_asteriskrd   rR   rM   r   r%   r   r   rP   rF   join)ri   Zchildren_representationsrk   r   r   rl      s*   



z#PyTreeSpec.__repr__.<locals>.helperzPyTreeSpec(z, NoneIsLeaf, namespace=))ri   rL   r   rA   r#   rB   r   rk   r   rD      s   zPyTreeSpec.__repr__c                 C     | j S r[   rb   rB   r   r   r   __len__   s   zPyTreeSpec.__len__c                 C  rr   r[   )rO   rB   r   r   r   r'      s   zPyTreeSpec.typer   c                 C  s   | j dko	| jdkS )NrY   )rU   rV   rB   r   r   r   r       s   zPyTreeSpec.is_leaflist[PyTreeSpec]c                 C  
   t | jS r[   )r7   rM   rB   r   r   r   r4         
zPyTreeSpec.childrenindexc                 C  
   | j | S r[   )rM   rC   rw   r   r   r   child   rv   zPyTreeSpec.childr6   c                 C  ru   r[   )r7   rQ   rB   r   r   r   entries   rv   zPyTreeSpec.entriesc                 C  rx   r[   )rQ   ry   r   r   r   entry   rv   zPyTreeSpec.entryr   r   list[PyTree]c                   s"   d fd	d
 g } | || |S )Nri   rL   r3   r   subtreesr}   r   rX   c                   s  |   r|  d S t }| jtvrT|| jkr%td| jd|dtj ddd^}}}t|| jkrEtd| j dt| d|| j	krStd| jdn| jt
v o\|t
v }|sp|| jkrptd	| jd|dt | jkrtd| j dt  d|r|  }t }	t|}
|	|
kr|
|	}|	|
}d
}|r|d| 7 }|r|d| 7 }td| d fdd|D }n$tj ddd^}}}|tur|| j	krtd| jd| j	d|dt|| jD ]
\}}||| qd S )NzType mismatch; expected z
, but got .Tr"   )r-   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 mismatchc                   s   g | ]} | qS r   r   )r]   keyr3   r   r   rm     s    z<PyTreeSpec.flatten_up_to.<locals>.helper.<locals>.<listcomp>z%Node metadata mismatch for node type z; expected )r    appendr'   r   r   r%   r/   rc   rW   rP   r   r{   set
differencer   ziprM   )ri   r3   r~   Z	node_typer4   metadatar   Zboth_standard_dictZexpected_keysZgot_key_setZexpected_key_setZmissing_keysZ
extra_keysmessageZsubtreerj   rk   r   r   rl      s   








z(PyTreeSpec.flatten_up_to.<locals>.helper)ri   rL   r3   r   r~   r}   r   rX   r   )rC   r   r~   r   rk   r   flatten_up_to   s   TzPyTreeSpec.flatten_up_toleavesr*   c                 C  s   t |ttfst|}t|| jkr#tdt| d| j d|  d|  r+|d S d}d}g }| jD ]}||j7 }||	|||  |}q4t
| jsQJ | | j|S )Nz0treespec.unflatten(leaves): `leaves` has length z, but the spec refers to a pytree that holds z items (z).r   )
isinstancer7   tuplerc   rV   r   r    rM   r   	unflattenrd   rR   rP   )rC   r   ra   endr~   rj   r   r   r   r   )  s*   

zPyTreeSpec.unflattenN)r   rX   rE   )r   rT   )r   rN   )r   r   )r   rt   )rw   rT   r   rL   )r   r6   )rw   rT   r   r   )r   r   r   r}   )r   r*   r   r   )rF   rG   rH   __doc____annotations__r   rU   rV   rW   r-   r$   rh   rD   rs   propertyr'   r    r4   rz   r{   r|   r   r   r   r   r   r   rL   x   s0   
 








YrL   r   objTypeIs[PyTreeSpec]c                C  s
   t | tS r[   )r   rL   )r   r   r   r   _is_pytreespec_instanceC  rv   r   tuple[list[Any], PyTreeSpec]c                   s&   d	 fdd g } | |}||fS )
Nr3   r   r   r6   r   rL   c                   s`   t | dr |  tS tj| ddd\}}}}t fdd|D }t|t| |||S )Nr+   Tr"   r,   c                 3  s    | ]} |V  qd S r[   r   )r]   rz   )rl   r   r   r   r_   b  s    z/tree_flatten.<locals>.helper.<locals>.<genexpr>)r)   r   
_LEAF_SPECr%   r/   r   rL   r'   )r3   r   r4   r   r{   Zunflatten_funcZsubspecsrl   r    )r   r   rl   P  s    
	ztree_flatten.<locals>.helper)r3   r   r   r6   r   rL   r   )r   r    r   ri   r   r   r   tree_flattenF  s   

r   c                 C  s   t | |dd S )Nr+   rY   )r   r(   r   r   r   tree_structurek  s   
r   r   ri   c                 C  s&   t |stdt| d|| S )Nzhtree_unflatten(leaves, treespec): Expected `treespec` to be instance of PyTreeSpec but got item of type r   )r   	TypeErrorr'   r   )r   ri   r   r   r   tree_unflatteny  s   
r   r+   funcCallable[..., Any]restsc                  s>   t ||d\} |g fdd|D  } t| g|R  S )Nr+   c                      g | ]}  |qS r   r   r]   rri   r   r   rm         ztree_map.<locals>.<listcomp>)r   r   mapr   r   r    r   r   Z	flat_argsr   r   r   tree_map  s   r   c                  sD   t ||d\} |g fdd|D  }tt| g|R  dd |S )Nr+   c                   r   r   r   r   r   r   r   rm     r   ztree_map_.<locals>.<listcomp>r   )maxlen)r   r   r   r   r   r   r   	tree_map_  s   r   )r   r   r   r   r   r   r[   )r   r   r    r!   r   r   )r   r   r    r!   r   r*   )r   r   r    r!   r   r6   )r   r   r   r   )r   r   r    r!   r   r   )r   r   r    r!   r   rL   )r   r*   ri   rL   r   r   )
r   r   r   r   r   r   r    r!   r   r   )9r   
__future__r   collectionsr   dataclassesr   r   typingr   r   r   r	   Ztyping_extensionsr
   Ztorch.utils._pytreeutilsZ_pytreeZpython_pytreer   r   Z
decoratorsr   builtinscollections.abcr   r   r   r   Z_cxx_pytree_dynamo_traceabler%   Z	optree._CZtorch.utils._cxx_pytreeZ_cxx_pytreeZ
cxx_pytreer   Z_CZis_dict_insertion_orderedr   Z__namegetattrZ__funcZ__python_implementation__r)   r5   r8   rA   r9   ro   rL   r   r   r   r   r   r   r   r   r   r   r   <module>   s    





	 I





   