U
    ªÊ¹jÁ  ã                
   @   s  U d dl Z d dlmZmZmZmZmZmZ d dlZd dl	m
Z
 d dlmZmZmZmZmZmZmZ i Zeeee f ed< dddddœeee ee ee ee eddœd	d
„Ze
ejjedœdd„Ze
ejjeejj dœdd„Ze
ejjedœdd„Ze
ejjeej dœdd„Z dS )é    N)ÚAnyÚDictÚListÚOptionalÚTupleÚType)ÚExportedProgram)Ú_register_pytree_nodeÚContextÚDumpableContextÚFlattenFuncÚFromDumpableContextFnÚToDumpableContextFnÚUnflattenFuncÚ(SERIALIZED_DATACLASS_TO_PYTHON_DATACLASSF)Úto_dumpable_contextÚfrom_dumpable_contextÚreturn_none_fields)ÚtypÚ
flatten_fnÚunflatten_fnr   r   r   Úreturnc          
         s  t  ˆ¡stdˆ› �ƒ‚ˆj› dˆj› �‰ˆtˆ< tttt t	f dœ‡ ‡fdd„}tt t	tdœdd„}t	t
d	œ‡fd
d„}t
t	dœdd„}	|d k	rš|n|}|d k	rª|n|}|d k|d kA rÎtdˆ› d�ƒ‚|d k	rÚ|n|}|d k	rê|n|	}tˆ||||d� d S )Nz7Only dataclasses can be registered with this function: Ú.)Úobjr   c                    sj   g }g }g }t  | ¡D ]D}|jt| |jƒ }}|d k	s:ˆ rP| |¡ | |¡ q| |¡ q|ˆ||ffS ©N)ÚdataclassesÚfieldsÚnameÚgetattrÚappend)r   Z	flattenedÚ
flat_namesÚ
none_namesÚfr   Úval)r   r   © úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/_export/utils.pyÚdefault_flatten_fn'   s    
z=register_dataclass_as_pytree_node.<locals>.default_flatten_fn)ÚvaluesÚcontextr   c                 S   s,   |\}}}|f t t|| ƒƒdd„ |D ƒ—ŽS )Nc                 S   s   i | ]
}|d “qS r   r$   )Ú.0Úkr$   r$   r%   Ú
<dictcomp>6   s      zSregister_dataclass_as_pytree_node.<locals>.default_unflatten_fn.<locals>.<dictcomp>)ÚdictÚzip)r'   r(   r   r    r!   r$   r$   r%   Údefault_unflatten_fn4   s    
z?register_dataclass_as_pytree_node.<locals>.default_unflatten_fn)r(   r   c                    s   ˆ | d | d fS )Né   é   r$   )r(   )Úserialized_typer$   r%   Údefault_to_dumpable_context8   s    zFregister_dataclass_as_pytree_node.<locals>.default_to_dumpable_context)Údumpable_contextr   c                 S   s   t | d  | d | d fS )Nr   r/   r0   )r   )r3   r$   r$   r%   Údefault_from_dumpable_context;   s    
ýzHregister_dataclass_as_pytree_node.<locals>.default_from_dumpable_contextz7Both to_dumpable_context and from_dumpable_context for z must be None or registered.)r   r   )r   Úis_dataclassÚAssertionErrorÚ
__module__Ú__name__r   r   r   r   r
   r   Ú
ValueErrorr	   )
r   r   r   r   r   r   r&   r.   r2   r4   r$   )r   r1   r   r%   Ú!register_dataclass_as_pytree_node   s@    	ÿþ"
ÿÿýÿýûr:   )ÚprogramÚnoder   c                 C   s   |j | jjkS )zM
    Checks if the given node is a parameter within the exported program
    )r   Úgraph_signatureÚinputs_to_parameters©r;   r<   r$   r$   r%   Úis_param_   s    r@   c                 C   s&   t | |ƒr"| jj|j }| j| S dS )z£
    Returns the parameter associated with the given node in the exported program.
    Returns None if the node is not a parameter within the exported program
    N)r@   r=   r>   r   Ú
state_dict)r;   r<   Zparameter_namer$   r$   r%   Ú	get_paramg   s    	

rB   c                 C   s   |j | jjkS )zJ
    Checks if the given node is a buffer within the exported program
    )r   r=   Úinputs_to_buffersr?   r$   r$   r%   Ú	is_bufferw   s    rD   c                 C   s&   t | |ƒr"| jj|j }| j| S dS )z�
    Returns the buffer associated with the given node in the exported program.
    Returns None if the node is not a buffer within the exported program
    N)rD   r=   rC   r   rA   )r;   r<   Zbuffer_namer$   r$   r%   Ú
get_buffer   s    	

rE   )NN)!r   Útypingr   r   r   r   r   r   ZtorchZtorch._exportr   Ztorch.utils._pytreer	   r
   r   r   r   r   r   r   ÚstrÚ__annotations__Úboolr:   ZfxÚNoder@   ÚnnÚ	ParameterrB   rD   ZTensorrE   r$   r$   r$   r%   Ú<module>   s>     $  ýùøH	
ý	ý