a
    h=                     @  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rddlZddlmZ ddlmZ g Zded< ejr ddlZddlZddl m  m!Z" erddl m#Z# eej$j%ddddddddZ&dZ'dD ]4Z'e(ee'Z)ee)dde)j*e+ e'< ee'g7 Z[)q['ee"j,ddd>ddddddZ,ee"j-ddd?ddddd d!Z-ed!g7 Zee"j.ddd@ddd"dd#d$Z.ed$g7 ZG d%d& d&e/Z0e0 Z1[0edd'G d(d) d)Z2e2d*ddd*dZ3dd+d,d-d.Z4ee"j5dddAddd/dd0d1Z5ed1g7 Zee"j6dddBddd)dd2d3Z6ed3g7 Zee"j7dddd)dd4d5d6Z7ed6g7 Zee"j8dddd7d8ddddd9d:d;Z8ed;g7 Zee"j9dddd7d8ddddd9d<d=Z9ed=g7 ZdS )Cz)
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_throughr   bool)argskwargsreturnc                  O  s   t dd S )NzeShould not be called directly because the original function will be called in the constant fold path.)
ValueError)r   r    r   L/var/www/auris/lib/python3.9/site-packages/torch/_dynamo/polyfills/pytree.py_$   s    r    )Zis_namedtupleis_namedtuple_classZis_namedtuple_instanceZis_structseqis_structseq_classZis_structseq_instanceZnamedtuple_fieldsZstructseq_fieldsr   zCallable[[PyTree], bool] | None)treeis_leafr   c                 C  s<   | d u s|d ur|| rdS t jjt| ddd u r8dS dS )NTtorch	namespaceF)optreeZregister_pytree_nodegettyper   r   r   r   r   tree_is_leafC   s
    r'   FIterable[Any]c                 c  sP   | g}|rL|  }t||dr&|V  qtj||ddd^}}|t| q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_iterN   s    
r3   	list[Any]c                 C  s   t t| |dS )Nr)   )listr3   r&   r   r   r   tree_leavesd   s    r6   c                      s4   e Zd ZdZdd fddZddddZ  ZS )		_Asteriskr   r   r   c                   s   t  | dS N*)super__new__)cls	__class__r   r   r<   p   s    z_Asterisk.__new__strc                 C  s   dS r9   r   selfr   r   r   __repr__s   s    z_Asterisk.__repr__)__name__
__module____qualname__	__slots__r<   rC   __classcell__r   r   r>   r   r7   m   s   r7   )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< ddddZddddZddddZedddd Zd!dd"d#Zd$dd%d&Zdd d'd(d)Zd*dd+d,Zddd'd-d.Zd/d0d1d2d3Zd4d/d5d6d7Zd8S )9
PyTreeSpecz0Analog for :class:`optree.PyTreeSpec` in Python.ztuple[PyTreeSpec, ...]	_childrenz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"   Noner8   c                 C  s   | j d u rTt| jdksJ | jd u s*J | jdks8J | jd u sFJ d}d}d}nDt| jsbJ 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  s   | ]}|j V  qd S N)rR   .0specr   r   r   	<genexpr>       z+PyTreeSpec.__post_init__.<locals>.<genexpr>)startc                 s  s   | ]}|j V  qd S rW   rS   rX   r   r   r   r[      r\   rR   rS   rT   r+   Tr"   r    )
rL   lenrK   rM   rN   rO   callablesumobject__setattr__)rB   rR   rS   rT   r   r   r   __post_init__   s"    

zPyTreeSpec.__post_init__r@   c                   s,   ddd fdd d |  d| j dS )	NrJ   r@   )treespecr   c                   s   |   r| jd u sJ tS | jd us(J t| js6J  fdd| jD }| jtv slt| jslt	| jrz| | j
|S d| jj d| j
dd| dS )Nc                   s   g | ]} |qS r   r   )rY   subspechelperr   r   
<listcomp>   s   z7PyTreeSpec.__repr__.<locals>.helper.<locals>.<listcomp>zCustomTreeNode([z], [z, z]))r   r%   	_asteriskr`   rO   rK   r   r#   r   r   rM   rD   join)re   Zchildren_representationsrg   r   r   rh      s,    


z#PyTreeSpec.__repr__.<locals>.helperzPyTreeSpec(z, NoneIsLeaf, namespace=)r!   rA   r   rg   r   rC      s    zPyTreeSpec.__repr__c                 C  s   | j S rW   r^   rA   r   r   r   __len__   s    zPyTreeSpec.__len__c                 C  s   | j S rW   )rL   rA   r   r   r   r%      s    zPyTreeSpec.typer   c                 C  s   | j dko| jdkS )NrV   )rR   rS   rA   r   r   r   r      s    zPyTreeSpec.is_leafzlist[PyTreeSpec]c                 C  s
   t | jS rW   )r5   rK   rA   r   r   r   r2      s    zPyTreeSpec.children)indexr   c                 C  s
   | j | S rW   )rK   rB   ro   r   r   r   child   s    zPyTreeSpec.childr4   c                 C  s
   t | jS rW   )r5   rN   rA   r   r   r   entries   s    zPyTreeSpec.entriesc                 C  s
   | j | S rW   )rN   rp   r   r   r   entry   s    zPyTreeSpec.entryr   list[PyTree])r   r   c                   s,   ddddd fdd g } | || |S )NrJ   r   rt   rU   )re   r1   subtreesr   c                   s  |   r|  d S t }| jtvr|| jkrJtd| jd|dtj ddd^}}}t|| jkrtd| j dt| d|| j	krtd| jdn<| jt
v o|t
v }|s|| jkrtd	| jd|dt | jkrtd| j dt  d|r|  }t }	t|}
|	|
kr|
|	}|	|
}d
}|rb|d| 7 }|rv|d| 7 }td| d fdd|D }nLt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   )rY   keyr1   r   r   ri     r\   z<PyTreeSpec.flatten_up_to.<locals>.helper.<locals>.<listcomp>z%Node metadata mismatch for node type z; expected )r   appendr%   r   r   r#   r-   r_   rT   rM   r   rr   set
differencer   ziprK   )re   r1   ru   Z	node_typer2   metadatar   Zboth_standard_dictZexpected_keysZgot_key_setZexpected_key_setZmissing_keysZ
extra_keysmessageZsubtreerf   rg   rx   r   rh      s    








z(PyTreeSpec.flatten_up_to.<locals>.helperr   )rB   r   ru   r   rg   r   flatten_up_to   s    TzPyTreeSpec.flatten_up_tor(   )leavesr   c                 C  s   t |ttfst|}t|| jkrFtdt| d| j d|  d|  rV|d S d}d}g }| jD ]*}||j7 }||	|||  |}qht
| jsJ | | j|S )Nz0treespec.unflatten(leaves): `leaves` has length z, but the spec refers to a pytree that holds z items (z).r   )
isinstancer5   tupler_   rS   r   r   rK   ry   	unflattenr`   rO   rM   )rB   r   r]   endru   rf   r   r   r   r   *  s*    

zPyTreeSpec.unflattenN)rD   rE   rF   __doc____annotations__r   rR   rS   rT   r+   r"   rd   rC   rn   propertyr%   r   r2   rq   rr   rs   r   r   r   r   r   r   rJ   y   s.   
YrJ   r   zTypeIs[PyTreeSpec])objr   c                C  s
   t | tS rW   )r   rJ   )r   r   r   r   _is_pytreespec_instanceD  s    r   ztuple[list[Any], PyTreeSpec]c                   s.   dddd fdd g } | |}||fS )Nr   r4   rJ   )r1   r   r   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 rW   r   )rY   rq   )rh   r   r   r   r[   c  r\   z/tree_flatten.<locals>.helper.<locals>.<genexpr>)r'   ry   
_LEAF_SPECr#   r-   r   rJ   r%   )r1   r   r2   r}   rr   Zunflatten_funcZsubspecsrh   r   )r   r   rh   Q  s     
	ztree_flatten.<locals>.helperr   )r   r   r   re   r   r   r   tree_flattenG  s    

r   c                 C  s   t | |dd S )Nr)   rV   )r   r&   r   r   r   tree_structurel  s    
r   )r   re   r   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 rv   )r   	TypeErrorr%   r   )r   re   r   r   r   tree_unflattenz  s    r   r)   zCallable[..., Any])funcr   restsr   r   c                  s>   t ||d\} |g fdd|D  } t| g|R  S )Nr)   c                   s   g | ]}  |qS r   r   rY   rre   r   r   ri     r\   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                   s   g | ]}  |qS r   r   r   r   r   r   ri     r\   ztree_map_.<locals>.<listcomp>r   )maxlen)r   r   r   r   r   r   r   	tree_map_  s    r   )N)N)N)N)N):r   
__future__r   collectionsr   Z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__globalsr'   r3   r6   r@   r7   rk   rJ   r   r   r   r   r   r   r   r   r   r   r   <module>   s   

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

