a
    7Sic                     @   st  U d dl mZmZmZmZmZmZmZmZm	Z	 d dl
mZ eZeZeegeeef f Zeeegef ZG dd deZi Zeee ef ed< eeedddd	Zeeef eee ef d
ddZee eeeef dddZee eee ef d
ddZee eee dddZeedf eee ef d
ddZee eeedf dddZeeee ef d
ddZee eedddZeeee eeee eeee eeee eedddZ eedd d!Z!eedd"d#Z"G d$d% d%Z#G d&d' d'e#Z$eeee e#f dd(d)Z%ee e#ed*d+d,Z&eeed-d.d/Z'ee#e	ee  d0d1d2Z(dS )3    )	
NamedTupleCallableAnyTupleListDictTypecastOptional)
namedtuplec                   @   s   e Zd ZU eed< eed< dS )NodeDef
flatten_fnunflatten_fnN)__name__
__module____qualname__FlattenFunc__annotations__UnflattenFunc r   r   O/var/www/html/django/DPS/env/lib/python3.9/site-packages/torch/utils/_pytree.pyr   !   s   
r   SUPPORTED_NODESN)typr   r   returnc                 C   s   t ||t| < d S N)r   r   )r   r   r   r   r   r   _register_pytree_node'   s    r   )dr   c                 C   s   t |  t |  fS r   )listvalueskeysr   r   r   r   _dict_flatten*   s    r!   )r   contextr   c                 C   s   dd t || D S )Nc                 S   s   i | ]\}}||qS r   r   ).0keyvaluer   r   r   
<dictcomp>.       z#_dict_unflatten.<locals>.<dictcomp>)zipr   r"   r   r   r   _dict_unflatten-   s    r*   c                 C   s   | d fS r   r   r    r   r   r   _list_flatten0   s    r+   c                 C   s   t | S r   r   r)   r   r   r   _list_unflatten3   s    r-   .c                 C   s   t | d fS r   r,   r    r   r   r   _tuple_flatten6   s    r.   c                 C   s   t | S r   )tupler)   r   r   r   _tuple_unflatten9   s    r0   c                 C   s   t | t| fS r   )r   typer    r   r   r   _namedtuple_flatten<   s    r2   c                 C   s   t t||  S r   )r	   r   r)   r   r   r   _namedtuple_unflatten?   s    r3   )pytreer   c                 C   sV   t | }|j}t|dks&|d tkr*dS t|dd }t|tsDdS tdd |D S )N   r   F_fieldsc                 s   s   | ]}t |tkV  qd S r   )r1   str)r#   entryr   r   r   	<genexpr>Q   r'   z*_is_namedtuple_instance.<locals>.<genexpr>)r1   	__bases__lenr/   getattr
isinstanceall)r4   r   basesfieldsr   r   r   _is_namedtuple_instanceI   s    
rA   c                 C   s   t | rtS t| S r   )rA   r   r1   r4   r   r   r   _get_node_typeS   s    rC   c                 C   s   t | t vS r   )rC   r   r   rB   r   r   r   _is_leafY   s    rD   c                   @   sR   e Zd Zeeed  ddddZedddZee	dd	d
Z
ee	dddZdS )TreeSpecN)r   r"   children_specsr   c                 C   s*   || _ || _|| _tdd |D | _d S )Nc                 S   s   g | ]
}|j qS r   )
num_leaves)r#   specr   r   r   
<listcomp>g   r'   z%TreeSpec.__init__.<locals>.<listcomp>)r1   r"   rF   sumrG   )selfr   r"   rF   r   r   r   __init__c   s    zTreeSpec.__init__r   c                 C   s    d| j j d| j d| j dS )Nz	TreeSpec(z, ))r1   r   r"   rF   rK   r   r   r   __repr__i   s    zTreeSpec.__repr__)otherr   c                 C   s:   | j |j ko.| j|jko.| j|jko.| j|jk}tt|S r   )r1   r"   rF   rG   r	   bool)rK   rQ   resultr   r   r   __eq__l   s    

zTreeSpec.__eq__c                 C   s   |  | S r   )rT   )rK   rQ   r   r   r   __ne__s   s    zTreeSpec.__ne__)r   r   r   r   Contextr   rL   r7   rP   rR   rT   rU   r   r   r   r   rE   b   s   rE   c                       s0   e Zd Zdd fddZedddZ  ZS )LeafSpecNrM   c                    s   t  d d g  d| _d S )Nr5   )superrL   rG   rO   	__class__r   r   rL   w   s    zLeafSpec.__init__c                 C   s   dS )N*r   rO   r   r   r   rP   {   s    zLeafSpec.__repr__)r   r   r   rL   r7   rP   __classcell__r   r   rY   r   rW   v   s   rW   c           
      C   sr   t | r| gt fS t| }t| j}|| \}}g }g }|D ]"}t|\}}	||7 }||	 q>|t|||fS )zkFlattens a pytree into a list of values and a TreeSpec that can be used
    to reconstruct the pytree.
    )rD   rW   rC   r   r   tree_flattenappendrE   )
r4   	node_typer   child_pytreesr"   rS   rF   childflat
child_specr   r   r   r]   ~   s    
r]   )r   rH   r   c                 C   s   t |tstdt| dt| |jkrNtdt|  d|j d| dt |tr`| d S t|j j}d}d}g }|j	D ]*}||j7 }|
t| || | |}q~|||jS )zqGiven a list of values and a TreeSpec, builds a pytree.
    This is the inverse operation of `tree_flatten`.
    z^tree_unflatten(values, spec): Expected `spec` to be instance of TreeSpec but got item of type .z2tree_unflatten(values, spec): `values` has length z, but the spec refers to a pytree that holds z items (z).r   )r=   rE   
ValueErrorr1   r;   rG   rW   r   r   rF   r^   tree_unflattenr"   )r   rH   r   startendr`   rc   r   r   r   rf      s2    



rf   )fnr4   r   c                    s$   t |\}}t fdd|D |S )Nc                    s   g | ]} |qS r   r   )r#   iri   r   r   rI      r'   ztree_map.<locals>.<listcomp>)r]   rf   )ri   r4   	flat_argsrH   r   rk   r   tree_map   s    rm   )r4   rH   r   c           
      C   s   t |tsJ t| r"| g|j S t |tr0d S t| }||jkrFd S t| j}|| \}}t	|t	|j
ksx||jkr|d S g }t||j
D ]*\}}t||}	|	d ur||	7 }q d S q|S r   )r=   rE   rD   rG   rW   rC   r1   r   r   r;   rF   r"   r(   _broadcast_to_and_flatten)
r4   rH   r_   r   r`   ctxrS   ra   rc   rb   r   r   r   rn      s&    




rn   ))typingr   r   r   r   r   r   r   r	   r
   collectionsr   rV   ZPyTreer   r   r   r   r   r   r!   r*   r+   r-   r.   r0   r2   r3   dictr   r/   rR   rA   rC   rD   rE   rW   r]   rf   rm   rn   r   r   r   r   <module>   s:   .$ $
	