o
    h                     @   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ded	ee d
ee dee dee deddfddZde
dejjdefddZde
dejjdeejj fddZde
dejjdefddZde
dejjdeej f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J d j dj t< dtdttt tf f fdd}dtt dtdtfd	d
}dtdt	ffdd}dt	dtfdd}	|d urR|n|}|d urZ|n|}|d u |d u A rlt
d d|d urr|n|}|d urz|n|	}t||||d d S )Nz7Only dataclasses can be registered with this function: .objr   c                    sj   g }g }g }t | D ]"}|jt| |j}}|d us r(|| || q|| q|||ffS N)dataclassesfieldsnamegetattrappend)r   	flattened
flat_names
none_namesfr   val)r   r    I/var/www/html/ai/venv/lib/python3.10/site-packages/torch/_export/utils.pydefault_flatten_fn'   s   
z=register_dataclass_as_pytree_node.<locals>.default_flatten_fnvaluescontextc                 S   s0   |\}}}|di 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>r%   )dictzip)r(   r)   r   r!   r"   r%   r%   r&   default_unflatten_fn4   s   
&z?register_dataclass_as_pytree_node.<locals>.default_unflatten_fnc                    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_contextc                 S   s   t | d  | d | d fS )Nr   r0   r1   )r   )r4   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
__module____name__r   r   r   r   r
   r   
ValueErrorr	   )
r   r   r   r   r   r   r'   r/   r3   r5   r%   )r   r2   r   r&   !register_dataclass_as_pytree_node   s@   	$

r:   programnodec                 C      |j | jjv 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_      rA   c                 C   &   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)rA   r>   r?   r   
state_dict)r;   r<   parameter_namer%   r%   r&   	get_paramg      
	
rF   c                 C   r=   )zJ
    Checks if the given node is a buffer within the exported program
    )r   r>   inputs_to_buffersr@   r%   r%   r&   	is_bufferw   rB   rI   c                 C   rC   )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)rI   r>   rH   r   rD   )r;   r<   buffer_namer%   r%   r&   
get_buffer   rG   rK   )NN)!r   typingr   r   r   r   r   r   torchtorch._exportr   torch.utils._pytreer	   r
   r   r   r   r   r   r   str__annotations__boolr:   fxNoderA   nn	ParameterrF   rI   TensorrK   r%   r%   r%   r&   <module>   sV   
  $
H

