U
    9%e                  
   @   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 rt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/Darija-Ai-API/env/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	
	