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   Z/var/www/html/assistant/venv/lib/python3.9/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_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    
r4   	list[Any]c                 C  s   t t| |dS )Nr*   )listr4   r'   r   r   r   tree_leavesd   s    r7   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 r:   r   selfr   r   r   __repr__s   s    z_Asterisk.__repr__)__name__
__module____qualname__	__slots__r=   rD   __classcell__r   r   r?   r   r8   m   s   r8   )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#   Noner9   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)rS   .0specr   r   r   	<genexpr>       z+PyTreeSpec.__post_init__.<locals>.<genexpr>)startc                 s  s   | ]}|j V  qd S rX   rT   rY   r   r   r   r\      r]   rS   rT   rU   r,   Tr#   r!   )
rM   lenrL   rN   rO   rP   callablesumobject__setattr__)rC   rS   rT   rU   r   r   r   __post_init__   s"    

zPyTreeSpec.__post_init__rA   c                   s,   ddd fdd d |  d| j dS )	NrK   rA   )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   )rZ   subspechelperr   r   
<listcomp>   s   z7PyTreeSpec.__repr__.<locals>.helper.<locals>.<listcomp>zCustomTreeNode([z], [z, z]))r    r&   	_asteriskra   rP   rL   r   r$   r   r   rN   rE   join)rf   Zchildren_representationsrh   r   r   ri      s,    


z#PyTreeSpec.__repr__.<locals>.helperzPyTreeSpec(z, NoneIsLeaf, namespace=)r"   rB   r   rh   r   rD      s    zPyTreeSpec.__repr__c                 C  s   | j S rX   r_   rB   r   r   r   __len__   s    zPyTreeSpec.__len__c                 C  s   | j S rX   )rM   rB   r   r   r   r&      s    zPyTreeSpec.typer   c                 C  s   | j dko| jdkS )NrW   )rS   rT   rB   r   r   r   r       s    zPyTreeSpec.is_leafzlist[PyTreeSpec]c                 C  s
   t | jS rX   )r6   rL   rB   r   r   r   r3      s    zPyTreeSpec.children)indexr   c                 C  s
   | j | S rX   )rL   rC   rp   r   r   r   child   s    zPyTreeSpec.childr5   c                 C  s
   t | jS rX   )r6   rO   rB   r   r   r   entries   s    zPyTreeSpec.entriesc                 C  s
   | j | S rX   )rO   rq   r   r   r   entry   s    zPyTreeSpec.entryr   list[PyTree])r   r   c                   s,   ddddd fdd g } | || |S )NrK   r   ru   rV   )rf   r2   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   )rZ   keyr2   r   r   rj     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`   rU   rN   r   rs   set
differencer   ziprL   )rf   r2   rv   Z	node_typer3   metadatar   Zboth_standard_dictZexpected_keysZgot_key_setZexpected_key_setZmissing_keysZ
extra_keysmessageZsubtreerg   rh   ry   r   ri      s    








z(PyTreeSpec.flatten_up_to.<locals>.helperr   )rC   r   rv   r   rh   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   )
isinstancer6   tupler`   rT   r   r    rL   rz   	unflattenra   rP   rN   )rC   r   r^   endrv   rg   r   r   r   r   *  s*    

zPyTreeSpec.unflattenN)rE   rF   rG   __doc____annotations__r   rS   rT   rU   r,   r#   re   rD   ro   propertyr&   r    r3   rr   rs   rt   r   r   r   r   r   r   rK   y   s.   
YrK   r   zTypeIs[PyTreeSpec])objr   c                C  s
   t | tS rX   )r   rK   )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   r5   rK   )r2   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 rX   r   )rZ   rr   )ri   r   r   r   r\   c  r]   z/tree_flatten.<locals>.helper.<locals>.<genexpr>)r(   rz   
_LEAF_SPECr$   r.   r   rK   r&   )r2   r   r3   r~   rs   Zunflatten_funcZsubspecsri   r    )r   r   ri   Q  s     
	ztree_flatten.<locals>.helperr   )r   r    r   rf   r   r   r   tree_flattenG  s    

r   c                 C  s   t | |dd S )Nr*   rW   )r   r'   r   r   r   tree_structurel  s    
r   )r   rf   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 rw   )r   	TypeErrorr&   r   )r   rf   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   rZ   rrf   r   r   rj     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   rj     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   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(   r4   r7   rA   r8   rl   rK   r   r   r   r   r   r   r   r   r   r   r   <module>   s   

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

