U
    9%eJ                     @   sH  U 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 d dlZd dlmZmZ d dlZd dlZd dlZe
dZe
dZe
dZe
dZdZeZeZeegeeef f Zeeegef ZeZeegef Zeegef ZG d	d
 d
eZ i Z!eee e f e"d< G dd deZ#i Z$eee e#f e"d< i Z%ee&ee f e"d< dddeeee	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d'd(d)Z0eed*d+d,Z1d-eee ef dd.d/Z2ee ed-dd0d1Z3e'e4e(e) e'e5e*e+ e'e6e,e- e'ee.e/e0e1d e'ee2e3 ee7d2d3d4Z8eed2d5d6Z9ee7d2d7d8Z:ej;G d9d: d:Z<G d;d< d<e<Z=eeee e<f d2d=d>Z>ee e<ed?d@dAZ?eeedBdCdDZ@eee ee f ZAeee ee ee f ZBeee eee df f ZCeeeeef gef ZDeeeef gef ZEeegef ZFeegef ZGeegeegef f ZHeeAeef eHeEeeef  dEdFdGZIeee eHeFeef  dEdHdGZIeeCeHeGe  dEdIdGZIeCeHeGe  dEdJdGZIeee eFeef eedKdLdMZJeeAeef eEeeef eedKdNdMZJeeBeeef eDeeeef eedKdOdMZJeCeGe eedKdPdMZJeege7f ee7dQdRdSZKeege7f ee7dQdTdUZLeee eFee7f ee7dVdWdXZMeeAeef eEeee7f ee7dVdYdXZMeeBeeef eDeeee7f ee7dVdZdXZMeCeGe7 ee7dVd[dXZMeee eFee7f ee7dVd\d]ZNeeAeef eEeee7f ee7dVd^d]ZNeCeGe7 ee7dVd_d]ZNee<e	ee  d`dadbZOej;G dcdd ddZPG dedf dfeZQi ZReeSeQf e"dg< e<ePdhdidjZTee<dkdldmZUeQeTeUeRd< dye<e	eS e&dndodpZVe&e<dqdrdsZWe<e&dhdtduZXe&e<dvdwdxZYdS )z    )
NamedTupleCallableAnyTupleListDictTypecastOptionalTypeVaroverloadUnionN)
namedtupleOrderedDictTSUR   c                   @   s*   e Zd ZU ee ed< eed< eed< dS )NodeDeftype
flatten_fnunflatten_fnN)__name__
__module____qualname__r   r   __annotations__FlattenFuncUnflattenFunc r   r   R/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/utils/_pytree.pyr   0   s   
r   SUPPORTED_NODESc                   @   s:   e Zd ZU ee ed< eed< ee ed< ee	 ed< dS )_SerializeNodeDeftyptype_fqnto_dumpable_contextfrom_dumpable_contextN)
r   r   r   r   r   r   strr
   ToDumpableContextFnFromDumpableContextFnr   r   r   r    r"   >   s   
r"   SUPPORTED_SERIALIZED_TYPESSERIALIZED_TYPE_TO_PYTHON_TYPE)r%   r&   )r#   r   r   r%   r&   returnc                C   sh   t | ||}|t| < |dk|dkA r4td|  d| j d| j }t| |||}|t| < | t|< dS )a  
    Args:
        typ: the type to register
        flatten_fn: A callable that takes a pytree and returns a flattened
            representation of the pytree and additional context to represent the
            flattened pytree.
        unflatten_fn: A callable that takes a flattened version of the pytree,
            additional context, and returns an unflattedn pytree.
        to_dumpable_context: An optional keyword argument to custom specify how
            to convert the context of the pytree to a custom json dumpable
            representation. This is used for json serialization, which is being
            used in torch.export right now.
        from_dumpable_context: An optional keyword argument to custom specify how
            to convert the custom json dumpable representation of the context
            back to the original context. This is used for json deserialization,
            which is being used in torch.export right now.
    Nz7Both to_dumpable_context and from_dumpable_context for z must be None or registered..)r   r!   
ValueErrorr   r   r"   r*   r+   )r#   r   r   r%   r&   Znode_defr$   serialize_node_defr   r   r    _register_pytree_nodeG   s&    
   r0   )dr,   c                 C   s   t |  t |  fS Nlistvalueskeysr1   r   r   r    _dict_flattenv   s    r8   )r5   contextr,   c                 C   s   t t|| S r2   )dictzipr5   r9   r   r   r    _dict_unflatteny   s    r=   c                 C   s   | d fS r2   r   r7   r   r   r    _list_flatten|   s    r>   c                 C   s   t | S r2   r4   r<   r   r   r    _list_unflatten   s    r@   .c                 C   s   t | d fS r2   r?   r7   r   r   r    _tuple_flatten   s    rA   c                 C   s   t | S r2   )tupler<   r   r   r    _tuple_unflatten   s    rC   c                 C   s   t | t| fS r2   )r4   r   r7   r   r   r    _namedtuple_flatten   s    rD   c                 C   s   t t||  S r2   )r	   r   r<   r   r   r    _namedtuple_unflatten   s    rE   )r9   r,   c                 C   s   | j | jd}|S )N)
class_namefields)r   _fields)r9   Zjson_namedtupler   r   r    _namedtuple_serialize   s    rI   )dumpable_contextr,   c                 C   s(   | d }t |tstt|| d }|S )NrF   rG   )
isinstancer'   AssertionErrorr   )rJ   rF   r9   r   r   r    _namedtuple_deserialize   s    rM   zOrderedDict[Any, Any]c                 C   s   t |  t |  fS r2   r3   r7   r   r   r    _odict_flatten   s    rN   c                 C   s   t dd t|| D S )Nc                 s   s   | ]\}}||fV  qd S r2   r   ).0keyvaluer   r   r    	<genexpr>   s     z#_odict_unflatten.<locals>.<genexpr>)r   r;   r<   r   r   r    _odict_unflatten   s    rS   )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 )Nr   r   FrH   c                 s   s   | ]}t |tkV  qd S r2   )r   r'   )rO   entryr   r   r    rR      s     z*_is_namedtuple_instance.<locals>.<genexpr>)r   	__bases__lenrB   getattrrK   all)rT   r#   basesrG   r   r   r    _is_namedtuple_instance   s    
r[   c                 C   s   t | rtS t| S r2   )r[   r   r   rT   r   r   r    _get_node_type   s    r]   c                 C   s   t | tkS r2   )r]   r!   r\   r   r   r    _is_leaf   s    r^   c                   @   sJ   e Zd ZU eed< eed< ed  ed< ddddZdee	d	d
dZ
dS )TreeSpecr   r9   children_specsNr,   c                 C   s   t dd | jD | _d S )Nc                 S   s   g | ]
}|j qS r   )
num_leaves)rO   specr   r   r    
<listcomp>   s     z*TreeSpec.__post_init__.<locals>.<listcomp>)sumr`   rb   selfr   r   r    __post_init__   s    zTreeSpec.__post_init__r   indentr,   c                    s   d| j j d| j d}d}t| jr d7  || jd  7 }|t| jdkrVdnd7 }|d fd	d
| jdd  D 7 }| d}|| S )Nz	TreeSpec(z, z, [    r   r   ,c                    s"   g | ]}d d   |   qS )
 )__repr__rO   childrj   r   r    rd      s     z%TreeSpec.__repr__.<locals>.<listcomp>z]))r   r   r9   rW   r`   rp   join)rg   rj   Zrepr_prefixZchildren_specs_strZrepr_suffixr   rs   r    rp      s    
&
zTreeSpec.__repr__)r   )r   r   r   r   r   Contextr   rh   intr'   rp   r   r   r   r    r_      s
   
r_   c                       s4   e Zd Zdd fddZd	eedddZ  ZS )
LeafSpecNra   c                    s   t  d d g  d| _d S )Nr   )super__init__rb   rf   	__class__r   r    ry      s    zLeafSpec.__init__r   ri   c                 C   s   dS )N*r   )rg   rj   r   r   r    rp      s    zLeafSpec.__repr__)r   )r   r   r   ry   rv   r'   rp   __classcell__r   r   rz   r    rw      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.
    )r^   rw   r]   r!   r   tree_flattenappendr_   )
rT   	node_typer   child_pytreesr9   resultr`   rr   flat
child_specr   r   r    r~      s    
r~   )r5   rc   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 r-   z2tree_unflatten(values, spec): `values` has length z, but the spec refers to a pytree that holds z items (z).r   )rK   r_   r.   r   rW   rb   rw   r!   r   r`   r   tree_unflattenr9   )r5   rc   r   startendr   r   r   r   r    r      s&    



r   )fnrT   r,   c                    s$   t |\}}t fdd|D |S )Nc                    s   g | ]} |qS r   r   )rO   ir   r   r    rd     s     ztree_map.<locals>.<listcomp>)r~   r   )r   rT   	flat_argsrc   r   r   r    tree_map  s    r   )tyr,   c                 C   s   d S r2   r   r   r   r   r    map_only*  s    r   c                 C   s   d S r2   r   r   r   r   r    r   .  s    c                 C   s   d S r2   r   r   r   r   r    r   3  s    c                    s,   t tgtf t tgtf d fdd}|S )a  
    Suppose you are writing a tree_map over tensors, leaving everything
    else unchanged.  Ordinarily you would have to write:

        def go(t):
            if isinstance(t, Tensor):
                return ...
            else:
                return t

    With this function, you only need to write:

        @map_only(Tensor)
        def go(t):
            return ...

    You can also directly use 'tree_map_only'
    )fr,   c                    s$   t  ttd fdd}|S )N)xr,   c                    s   t | r | S | S d S r2   rK   )r   )r   r   r   r    innerK  s    
z%map_only.<locals>.deco.<locals>.inner)	functoolswrapsr   r   )r   r   r   )r   r    decoJ  s    zmap_only.<locals>.deco)r   r   r   )r   r   r   r   r    r   7  s    ()r   r   rT   r,   c                 C   s   d S r2   r   r   r   rT   r   r   r    tree_map_onlyT  s    r   c                 C   s   d S r2   r   r   r   r   r    r   X  s    c                 C   s   d S r2   r   r   r   r   r    r   \  s    c                 C   s   t t| ||S r2   )r   r   r   r   r   r    r   `  s    )predrT   r,   c                 C   s   t |\}}tt| |S r2   )r~   rY   mapr   rT   r   _r   r   r    tree_allc  s    r   c                 C   s   t |\}}tt| |S r2   )r~   anyr   r   r   r   r    tree_anyg  s    r   )r   r   rT   r,   c                 C   s   d S r2   r   r   r   rT   r   r   r    tree_all_onlyk  s    r   c                 C   s   d S r2   r   r   r   r   r    r   o  s    c                 C   s   d S r2   r   r   r   r   r    r   s  s    c                    s$   t |\}}t fdd|D S )Nc                 3   s    | ]}t |r |V  qd S r2   r   rO   r   r   r   r   r    rR   y  s     
 z tree_all_only.<locals>.<genexpr>)r~   rY   r   r   rT   r   r   r   r   r    r   w  s    c                 C   s   d S r2   r   r   r   r   r    tree_any_only{  s    r   c                 C   s   d S r2   r   r   r   r   r    r     s    c                    s$   t |\}}t fdd|D S )Nc                 3   s    | ]}t |r |V  qd S r2   r   r   r   r   r    rR     s     
 z tree_any_only.<locals>.<genexpr>)r~   r   r   r   r   r    r     s    )rT   rc   r,   c           
      C   s   t |tst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 k	r||	7 }q d S q|S r2   )rK   r_   rL   r^   rb   rw   r]   r   r!   r   rW   r`   r9   r;   _broadcast_to_and_flatten)
rT   rc   r   r   r   ctxr   rr   r   r   r   r   r    r     s&    




r   c                   @   s.   e Zd ZU ee ed< eed< ed  ed< dS )_TreeSpecSchemar   r9   children_specN)r   r   r   r
   r'   r   DumpableContextr   r   r   r   r    r     s   
r   c                   @   s2   e Zd ZU eegef ed< eegef ed< dS )_ProtocolFntreespec_to_jsonjson_to_treespecN)r   r   r   r   r_   r   r   r   r   r   r    r     s   
r   _SUPPORTED_PROTOCOLS)rc   r,   c              
   C   s   t | trtd d g S | jtkr2td| j dt| j }|j}|jd krzt	| j
}W q tk
r } ztd|W 5 d }~X Y qX n|| j
}dd | jD }t|||S )NzSerializing  in pytree is not registered.zUnable to serialize context. Please make the context json dump-able, or register a custom serializer using _register_pytree_node.c                 S   s   g | ]}t |qS r   )_treespec_to_jsonrq   r   r   r    rd     s     z%_treespec_to_json.<locals>.<listcomp>)rK   rw   r   r   r*   NotImplementedErrorr$   r%   jsondumpsr9   	TypeErrorr`   )rc   r/   r$   Zserialized_contexteZchild_schemasr   r   r    r     s$    



r   )json_schemar,   c                 C   s   | d d kr.| d d kr.t | d dkr.t S | d tkrNtd| d  dt| d  }t| }|jd krzt| d }W q tk
r   tdY qX n|| d }g }| d D ]}|	t
| qt|||S )Nr   r9   r   r   zDeserializing r   zUnable to deserialize context. Please make the context json load-able, or register a custom serializer using _register_pytree_node.)rW   rw   r+   r   r*   r&   r   loadsr   r   _json_to_treespecr_   )r   r#   r/   r9   r   Zchild_stringr   r   r    r     s.    


r   )treespecprotocolr,   c                 C   sX   |d krt }|tkr$t| | }ntd| dtt  t|t	|f}|S NzUnknown protocol z. Available protocols: )
'DEFAULT_TREESPEC_SERIALIZATION_PROTOCOLr   r   r.   r4   r6   r   r   dataclassesasdict)r   r   Z	json_specZstr_specr   r   r    treespec_dumps   s    r   )datar,   c                 C   sD   t | \}}|tkr$t| |S td| dtt  d S r   )r   r   r   r   r.   r4   r6   )r   r   r   r   r   r    treespec_loads  s    r   c                 C   s   t d t| S )Nz6pytree_to_str is deprecated. Please use treespec_dumps)warningswarnr   )rc   r   r   r    pytree_to_str  s    
r   )r   r,   c                 C   s   t d t| S )Nz6str_to_pytree is deprecated. Please use treespec_loads)r   r   r   )r   r   r   r    str_to_pytree  s    
r   )N)Ztypingr   r   r   r   r   r   r   r	   r
   r   r   r   r   collectionsr   r   r   r   r   r   r   r   r   r   ru   ZPyTreer   r   r   r(   r)   r   r!   r   r"   r*   r+   r'   r0   r8   r=   r>   r@   rA   rC   rD   rE   rI   rM   rN   rS   r:   r4   rB   boolr[   r]   r^   	dataclassr_   rw   r~   r   r   ZType2ZType3ZTypeAnyZFn3ZFn2ZFnZFnAnyZ	MapOnlyFnr   r   r   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   r    <module>   s    8		/$ $
	(""(,"(,"(%!