U
    •Ê¹j­J  ã                   @   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/bwave/python/venv/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rŒzt 	| j
¡}W q˜ tk
rˆ } ztdƒ|‚W 5 d }~X Y q˜X n| | j
¡}dd„ | jD ƒ}t|||ƒS )NzSerializing ú in pytree is not registered.z�Unable 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ržzt | d ¡}W q¬ tk
rš   tdƒ‚Y q¬X n| | d ¡}g }| d D ]}| 	t
|ƒ¡ q¸t|||ƒS )Nr   r9   r©   r   zDeserializing r¯   zƒUnable 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		úù/$ $û
	(""(,"(,"(%!