o
    H&i                  	   @   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mZ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#de	e ded	e
e d
dfddZd$deded
ee fddZdeeef ded
ee fddZdee ded
ee fddZdee ded
ee fddZdeded
ee fddZdeeef ded
efddZdee ded
efddZdee ded
efdd Zdeded
efd!d"Zeeee ee ee ee!ee eeee dS )%    )
namedtuple)AnyCallableDictList
NamedTupleTupleTypeOptional)LeafSpecPyTreeTreeSpecSUPPORTED_NODESSUPPORTED_NODES_EXACT_MATCHNclsflatten_fn_specflatten_fn_exact_match_specreturnc                 C   s   |t | < |t| < d S N)r   r   )r   r   r    r   ;C:\wamp64\www\opt\env\Lib\site-packages\torch/fx/_pytree.pyregister_pytree_flatten_spec   s   r   Fpytreespecc           
      C   s   t |tr| gS |jtvrtt|  dt|j }|| |}|r8t|j }|r8|| |s8t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: )	
isinstancer   typer   RuntimeErrorr   zipchildren_specstree_flatten_spec)
r   r   Zexact_structural_matchr   Zchild_pytreesr   resultchildZ
child_specZflatr   r   r   r      s"   





r   dc                    s    fdd|j D S )Nc                       g | ]} | qS r   r   ).0kr"   r   r   
<listcomp>+       z&_dict_flatten_spec.<locals>.<listcomp>)contextr"   r   r   r&   r   _dict_flatten_spec*   s   r+   c                        fddt t|jD S )Nc                    r#   r   r   r$   ir&   r   r   r'   .   r(   z&_list_flatten_spec.<locals>.<listcomp>rangelenr   r*   r   r&   r   _list_flatten_spec-      r2   c                    r,   )Nc                    r#   r   r   r-   r&   r   r   r'   1   r(   z'_tuple_flatten_spec.<locals>.<listcomp>r/   r*   r   r&   r   _tuple_flatten_spec0   r3   r4   c                    r,   )Nc                    r#   r   r   r-   r&   r   r   r'   4   r(   z,_namedtuple_flatten_spec.<locals>.<listcomp>r/   r*   r   r&   r   _namedtuple_flatten_spec3   r3   r5   c                 C      t | t |jkS r   )r1   r)   r*   r   r   r   _dict_flatten_spec_exact_match6      r7   c                 C   r6   r   r1   r   r*   r   r   r   _list_flatten_spec_exact_match9   r8   r:   c                 C   r6   r   r9   r*   r   r   r   _tuple_flatten_spec_exact_match<   r8   r;   c                 C   r6   r   r9   r*   r   r   r   $_namedtuple_flatten_spec_exact_match?   r8   r<   r   )F)"collectionsr   typingr   r   r   r   r   r   r	   r
   Ztorch.utils._pytreer   r   r   ZFlattenFuncSpecboolZFlattenFuncExactMatchSpecr   __annotations__r   r   r   r+   r2   r4   r5   r7   r:   r;   r<   dictlisttupler   r   r   r   <module>   s<    (
"