o
    biW                     @   s   d dl Z d dlZ d dlmZ dd Ze dkrKd dlmZ d dlmZ ze jedd	 d
d	 dd dd Z	e jee	dd	 dd W n	 e
yJ   Y nw 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 ))    N)backendc                 C   s   t j| ddS )Nkeras	namespace)optreeregister_pytree_node_class)cls r	   N/home/ubuntu/.local/lib/python3.10/site-packages/keras/src/tree/optree_impl.pyregister_tree_node_class   s   r   
tensorflow)ListWrapper)_DictWrapperc                 C   s   | d fS Nr	   xr	   r	   r
   <lambda>       r   c                 C   s   t t|S r   )r   listmetadatachildrenr	   r	   r
   r      s    r   r   c                    s,   t t  } fdd|D }|||fS )Nc                    s   g | ]} | qS r	   r	   ).0kdr	   r
   
<listcomp>   s    z*sorted_keys_and_values.<locals>.<listcomp>)sortedr   keys)r   r   valuesr	   r   r
   sorted_keys_and_values   s   
r    c                 C   s   t dd t| |D S )Nc                 S   s   i | ]\}}||qS r	   r	   )r   keychildr	   r	   r
   
<dictcomp>!   s    z<lambda>.<locals>.<dictcomp>)r   zipr   r	   r	   r
   r       s    c                 C   s   t j| ddd S NTr   none_is_leafr   r   tree_is_leaf	structurer	   r	   r
   	is_nested)   s   r,   Tc                    sb    fdd}r }|d u r| S n| } |}|d u r#|S t |tr/|jdkr/d S |S )Nc                     sR   t jfddddd\} }|jdkr|jdkrS t | fdd| D S )	Nc                    s   |  uS r   r	   r   r*   r	   r
   r   4   r   z5traverse.<locals>.traverse_children.<locals>.<lambda>Tr   is_leafr'   r      c                    s   g | ]	}t  |d qS )top_downtraverse)r   c)funcr1   r	   r
   r   =   s    z7traverse.<locals>.traverse_children.<locals>.<listcomp>)r   tree_flatten	num_nodes
num_leavestree_unflatten)r   treedefr5   r+   r1   r	   r
   traverse_children1   s   

z#traverse.<locals>.traverse_childrenMAP_TO_NONE)
isinstancetype__name__)r5   r+   r1   r<   rettraversed_structurer	   r;   r
   r3   /   s   r3   c                 C   s   t j| ddd\}}|S r%   )r   r6   )r+   leaves_r	   r	   r
   flattenO   s   
rE   c                 C   s$   t j| ddd\}}}tt||S r%   )r   tree_flatten_with_pathr   r$   )r+   pathsrC   rD   r	   r	   r
   flatten_with_pathY   s   rH   r'   c                   sH   |st d fdd}t|dkr|n }tj|g|R ddS )N#Must provide at least one structurec                     s&   t fdd| D std |  S )Nc                 3   s     | ]}t j| d dV  qdS )r   r&   Nr(   )r   srI   r	   r
   	<genexpr>f   s
    
z9map_structure.<locals>.func_with_check.<locals>.<genexpr>0Structures don't have the same nested structure.)all
ValueError)argsr5   r'   r	   r
   func_with_checke   s
   z&map_structure.<locals>.func_with_checkr/   r   r&   )rO   lenr   tree_map)r5   r'   
structuresrR   map_funcr	   rQ   r
   map_structure`   s   rW   c                    s4   |st d fdd}tj|| g|R dddS )NrJ   c                    s   t | s	td | S )NrM   r   r)   rO   )shallowrP   r5   r	   r
   )func_with_check_without_shallow_structurez   s   
zFmap_structure_up_to.<locals>.func_with_check_without_shallow_structureTr   r&   )rO   r   rT   )shallow_structurer5   rU   r[   r	   rZ   r
   map_structure_up_tot   s   r]   c                 C   s    dd }t j|| |ddd d S )Nc                 S   s,   t j| dddrt j|dddstdd S )NTr   r&   rM   rX   )a_leafb_leafr	   r	   r
   check   s   z$assert_same_structure.<locals>.checkTr   r&   r   rT   )abr`   r	   r	   r
   assert_same_structure   s   	rd   c                 C   sx   t tj| ddd}t tj|ddd}||kr:d}||}|r(|d| 7 }||}|r6|d| 7 }t|d S )NTr   r&   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   
tree_paths
differencerO   )rb   rc   a_pathsb_pathsmsga_diffb_diffr	   r	   r
   assert_same_paths   s   

rm   c                 C   s    t j| ddd\}}t ||S r%   )r   r6   r9   )r+   flat_sequencerD   treespecr	   r	   r
   pack_sequence_as   s   
rp   c                 C   s   dd }t || ddS )Nc                 S   s   t | tr	t| S d S r   )r>   r   tuple)instancer	   r	   r
   list_to_tuple   s   z&lists_to_tuples.<locals>.list_to_tupleFr0   r2   )r+   rs   r	   r	   r
   lists_to_tuples   s   rt   c                 C   s   dd }t j| ||dd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
   rL      s    
z>map_shape_structure.<locals>.is_shape_tuple.<locals>.<genexpr>)r>   r   rq   rN   r   r	   r	   r
   is_shape_tuple   s   z+map_shape_structure.<locals>.is_shape_tupleTr   r-   ra   )r5   r+   rw   r	   r	   r
   map_shape_structure   s   rx   )T)r   optree.utilskeras.src.backend.configr   r   +tensorflow.python.trackable.data_structuresr   r   register_pytree_noder    rO   r,   r3   rE   rH   rW   r]   rd   rm   rp   rt   rx   r	   r	   r	   r
   <module>   sF    


 
