U
    yh                     @   s  U d dl mZ d dl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 eeegef Zeeegef Zi Zee
e ef ed< i Zee
e ee f ed< de
e eee dddd	Zd eeee dddZeeef eee dddZee eee dddZe	e eee dddZeeee dddZeeef eedddZee eedddZe	e eedddZeeedddZee ee ee!ee ee"ee ej#j$D ]Z%ee%ee qeeee dS )!    )
namedtuple)AnyCallableDictList
NamedTupleOptionalTupleTypeN)PyTreeTreeSpecSUPPORTED_NODESSUPPORTED_NODES_EXACT_MATCH)clsflatten_fn_specflatten_fn_exact_match_specreturnc                 C   s   |t | < |t| < d S N)r   r   )r   r   r    r   B/var/www/html/venv/lib/python3.8/site-packages/torch/fx/_pytree.pyregister_pytree_flatten_spec   s    r   F)pytreespecr   c           
      C   s   |  r| gS |jtkr*tt|  dt|j }|| |}|rnt|j }|rn|| |sntd|  d| g }t||jD ]\}}t|||}	||	7 }q~|S )Nz does not have a flatten_fn_spec associated with it. Please register one with torch.fx._pytree.register_pytree_flatten_spec.  If you have serialized your model, make sure that any custom pytrees have been registered before loading it.zCannot flatten pytree z, given spec: )Zis_leaftyper   RuntimeErrorr   zipZchildren_specstree_flatten_spec)
r   r   Zexact_structural_matchr   Zchild_pytreesr   resultchildZ
child_specZflatr   r   r   r      s(    




r   )dr   r   c                    s    fdd|j D S )Nc                    s   g | ]} | qS r   r   ).0kr   r   r   
<listcomp>7   s     z&_dict_flatten_spec.<locals>.<listcomp>)contextr   r   r   r"   r   _dict_flatten_spec6   s    r&   c                    s    fddt |jD S )Nc                    s   g | ]} | qS r   r   r    ir"   r   r   r#   ;   s     z&_list_flatten_spec.<locals>.<listcomp>rangenum_childrenr%   r   r"   r   _list_flatten_spec:   s    r,   c                    s    fddt |jD S )Nc                    s   g | ]} | qS r   r   r'   r"   r   r   r#   ?   s     z'_tuple_flatten_spec.<locals>.<listcomp>r)   r%   r   r"   r   _tuple_flatten_spec>   s    r-   c                    s    fddt |jD S )Nc                    s   g | ]} | qS r   r   r'   r"   r   r   r#   C   s     z,_namedtuple_flatten_spec.<locals>.<listcomp>r)   r%   r   r"   r   _namedtuple_flatten_specB   s    r.   c                 C   s   t | |jkS r   lenr+   r%   r   r   r   _dict_flatten_spec_exact_matchF   s    r1   c                 C   s   t | |jkS r   r/   r%   r   r   r   _list_flatten_spec_exact_matchJ   s    r2   c                 C   s   t | |jkS r   r/   r%   r   r   r   _tuple_flatten_spec_exact_matchN   s    r3   c                 C   s   t | |jkS r   r/   r%   r   r   r   $_namedtuple_flatten_spec_exact_matchR   s    r4   )N)F)&collectionsr   typingr   r   r   r   r   r   r	   r
   Ztorch.return_typesZtorchZtorch.utils._pytreer   r   ZFlattenFuncSpecboolZFlattenFuncExactMatchSpecr   __annotations__r   r   r   r&   r,   r-   r.   r1   r2   r3   r4   dictlisttupleZreturn_typesZall_return_typesreturn_typer   r   r   r   <module>   s^    (  