o
    2h4                     @   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 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	   U/var/www/html/chatgem/venv/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   c                    sF   |st d fdd}t|dkr|n }tj|g|R dddS )N#Must provide at least one structurec                     s"   t dd | D std |  S )Nc                 s   s     | ]}t j|d ddV  qdS )Tr   r&   Nr(   )r   sr	   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
   func_with_checke   s
   z&map_structure.<locals>.func_with_checkr/   Tr   r&   )rN   lenr   tree_map)r5   
structuresrQ   map_funcr	   rP   r
   map_structure`   s   rV   c                    s4   |st d fdd}tj|| g|R dddS )NrI   c                    s   t | s	td | S )NrL   r   r)   rN   )shallowrO   rP   r	   r
   )func_with_check_without_shallow_structurez   s   
zFmap_structure_up_to.<locals>.func_with_check_without_shallow_structureTr   r&   )rN   r   rS   )shallow_structurer5   rT   rY   r	   rP   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&   rL   rW   )a_leafb_leafr	   r	   r
   check   s   z$assert_same_structure.<locals>.checkTr   r&   r   rS   )abr^   r	   r	   r
   assert_same_structure   s   	rb   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
differencerN   )r`   ra   a_pathsb_pathsmsga_diffb_diffr	   r	   r
   assert_same_paths   s   

rk   c                 C   s    t j| ddd\}}t ||S r%   )r   r6   r9   )r+   flat_sequencerD   treespecr	   r	   r
   pack_sequence_as   s   
rn   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+   rq   r	   r	   r
   lists_to_tuples   s   rr   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
   rK      s    
z>map_shape_structure.<locals>.is_shape_tuple.<locals>.<genexpr>)r>   r   ro   rM   r   r	   r	   r
   is_shape_tuple   s   z+map_shape_structure.<locals>.is_shape_tupleTr   r-   r_   )r5   r+   ru   r	   r	   r
   map_shape_structure   s   rv   )T)r   optree.utilskeras.src.backend.configr   r   +tensorflow.python.trackable.data_structuresr   r   register_pytree_noder    rN   r,   r3   rE   rH   rV   r[   rb   rk   rn   rr   rv   r	   r	   r	   r
   <module>   sF    


 
