o
    bi                     @   s   d dl mZ d dlmZ dd Zd"ddZdd	 Zd
d Zd#ddZ	dd Z
dd ZddddZdd Zdd Zdd Zdd Zdd Zd d! ZdS )$    )defaultdict)_pytreec                 C   s&   t j| dd | j| j dd d | S )Nc                 S      |   S N)torchtree_flattenx r	   Q/home/ubuntu/.local/lib/python3.10/site-packages/keras/src/tree/torchtree_impl.py<lambda>	       z*register_tree_node_class.<locals>.<lambda>c                 S   r   r   )torchtree_flatten_with_keysr   r	   r	   r
   r      r   )
flatten_fnunflatten_fnserialized_type_nameflatten_with_keys_fn)
torch_treeregister_pytree_nodetorchtree_unflatten__name__)clsr	   r	   r
   register_tree_node_class   s   r   Nc                 C   s$   |d ur
|| r
dS t | t jvS )NT)r   _get_node_typeSUPPORTED_NODES)treeis_leafr	   r	   r
   _tree_is_leaf   s   r   c                    sF   dd } fdd}| }|d u r| S t |tr!|jdkr!d S |S )Nc                    sX   t  tu r fddt  D S t  tu r*t j fddt  D S d S )Nc                       i | ]}| | qS r	   r	   .0kr   r	   r
   
<dictcomp>       z7_dict_to_ordered_dict.<locals>.func.<locals>.<dictcomp>c                    r   r	   r	   r   r   r	   r
   r!       r"   )typedictsortedkeysr   default_factoryr   r	   r   r
   func   s   z#_dict_to_ordered_dict.<locals>.funcc                     sH   t j  fddd\} }|jdkr|jdkr S t dd | D |S )Nc                       |  uS r   r	   r   	structurer	   r
   r   '   r   zB_dict_to_ordered_dict.<locals>.traverse_children.<locals>.<lambda>r      c                 S   s   g | ]}t |qS r	   )_dict_to_ordered_dictr   cr	   r	   r
   
<listcomp>-       zD_dict_to_ordered_dict.<locals>.traverse_children.<locals>.<listcomp>r   tree_flatten	num_nodes
num_leavestree_unflattenchildrentreedefr*   r	   r
   traverse_children$   s   

z0_dict_to_ordered_dict.<locals>.traverse_childrenMAP_TO_NONE)
isinstancer#   r   )r+   r(   r;   retr	   r*   r
   r.      s   
r.   c                 C   s
   t |  S r   )r   r*   r	   r	   r
   	is_nested9   s   
r?   Tc                    sj    fdd}t r }|d u r| S n| } |}|d u r'|S t|tr3|jdkr3d S |S )Nc                     sN   t jfddd\} }|jdkr|jdkrS t  fdd| D |S )Nc                    r)   r   r	   r   r*   r	   r
   r   A   r   z5traverse.<locals>.traverse_children.<locals>.<lambda>r,   r-   c                    s   g | ]	}t  |d qS )top_downtraverser/   )r(   rA   r	   r
   r1   G   s    z7traverse.<locals>.traverse_children.<locals>.<listcomp>r3   r8   r(   r+   rA   r	   r
   r;   >   s   

z#traverse.<locals>.traverse_childrenr<   )r.   r=   r#   r   )r(   r+   rA   r;   r>   traversed_structurer	   rD   r
   rC   =   s   rC   c                 C   s   t | } t| \}}|S r   )r.   r   r4   )r+   leaves_r	   r	   r
   flatten[   s   rH   c           
      C   s   t | } t| \}}g }g }|D ]\}}|D ]}t|tjr*|j|vr*||j qqt|}dd t|D }|D ]<\}}g }	|D ]*}t|tj	rR|	|j
 qCt|tjr_|	|j qCt|tjrm|	||j  qC|t|	|f q;|S )Nc                 S   s   i | ]\}}||qS r	   r	   )r   ifr	   r	   r
   r!   o   r"   z%flatten_with_path.<locals>.<dictcomp>)r.   r   tree_flatten_with_pathr=   
GetAttrKeynameappendr%   	enumerateSequenceKeyidx
MappingKeykeytuple)
r+   leaves_with_pathrG   resultsfieldsrS   leafr    field_to_idxpathr	   r	   r
   flatten_with_pathc   s0   r[   )none_is_leafc                   s6   |st d }|s fdd}|}tj|g|R  S )N#Must provide at least one structurec                     s:   | d d u rt dd | D std|  dd S  |  S )Nr   c                 s   s    | ]}|d u V  qd S r   r	   )r   sr	   r	   r
   	<genexpr>   s    z<map_structure.<locals>.func_skipping_none.<locals>.<genexpr>zQStructure mismatch: some arguments are None, others are not. Received arguments: .)all
ValueError)argsr(   r	   r
   func_skipping_none   s   z)map_structure.<locals>.func_skipping_nonerb   r   tree_map)r(   r\   
structuresmap_funcre   r	   rd   r
   map_structure~   s   rj   c                    s,   |st d fdd}tj|| g|R  S )Nr]   c                    s   t | std | S Nz0Structures don't have the same nested structure.r   rb   )shallowrc   rd   r	   r
   )func_with_check_without_shallow_structure   s   zFmap_structure_up_to.<locals>.func_with_check_without_shallow_structurerf   )shallow_structurer(   rh   rn   r	   rd   r
   map_structure_up_to   s   rp   c                 C   s   dd }t || | d S )Nc                 S   s   t | rt |stdd S rk   rl   )a_leafb_leafr	   r	   r
   check   s   z$assert_same_structure.<locals>.check)r   rg   )abrs   r	   r	   r
   assert_same_structure   s   rv   c                 C   s|   t dd t| D }t dd t|D }||kr<d}||}|r*|d| 7 }||}|r8|d| 7 }t|d S )Nc                 S      g | ]\}}|qS r	   r	   r   rZ   rG   r	   r	   r
   r1      r2   z%assert_same_paths.<locals>.<listcomp>c                 S   rw   r	   r	   rx   r	   r	   r
   r1      r2   z&`a` and `b` don't have the same paths.z
Paths in `a` missing in `b`:
z
Paths in `b` missing in `a`:
)setr[   
differencerb   )rt   ru   a_pathsb_pathsmsga_diffb_diffr	   r	   r
   assert_same_paths   s   

r   c                 C   s"   t | } t| \}}t||S r   )r.   r   r4   r7   )r+   flat_sequencerG   treespecr	   r	   r
   pack_sequence_as   s   r   c                 C   s   dd }t || ddS )Nc                 S   s   t | tr	t| S d S r   )r=   listrT   )instancer	   r	   r
   list_to_tuple   s   z&lists_to_tuples.<locals>.list_to_tupleFr@   rB   )r+   r   r	   r	   r
   lists_to_tuples   s   r   c                 C   s    dd }t |}tj| ||dS )Nc                 S   s    t | ttfotdd | D S )Nc                 s   s"    | ]}t |ttd fV  qd S r   )r=   intr#   )r   er	   r	   r
   r_      s    
z>map_shape_structure.<locals>.is_shape_tuple.<locals>.<genexpr>)r=   r   rT   ra   r   r	   r	   r
   is_shape_tuple   s   z+map_shape_structure.<locals>.is_shape_tupler,   )r.   r   rg   )r(   r+   r   r	   r	   r
   map_shape_structure   s   r   r   )T)collectionsr   torch.utilsr   r   r   r   r.   r?   rC   rH   r[   rj   rp   rv   r   r   r   r   r	   r	   r	   r
   <module>   s     
"
	