a
    ijr!                     @  s   d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	m
Z
mZ ddlmZ ddlmZ edZe	Ze	Ze	ZG dd	 d	ejZG d
d deZG dd deZG dd deZG dd deZeefZeejjfZee Z G dd deZ!dS )zTree API backends.    )annotationsN)AnyCallableTypeVar)epy)Tree_Tc                   @  s   e Zd ZdZejddddZejddddZ	ejdd	d
dddZ
ejdddddZejddddddZejddddddZdS )BackendzTree API backend.

  Note: The backend lazy-import the module on first call. This
  allow to use `etree` with Jax even if TF isn't installed (and
  vice-versa).
  ztypes.ModuleType)returnc              
   C  sN   z|   }W n< tyH } z$tj|d| jdd W Y d}~n
d}~0 0 |S )zModule used by the backend.zetree backend require .)suffixN)import_moduleImportErrorr   reraiseZMODULE_NAME)selfmodulee r   Q/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/etils/etree/backend.pyr   /   s
    .zBackend.modulec                 C  s   t dS )zImport and return the module.NNotImplementedErrorr   r   r   r   r   8   s    zBackend.import_modulezCallable[..., _Tout]z
Tree[_Tin]zTree[_Tout])map_fntreesr
   c                 G  s   t dS )zLike `tf.nest.map_structure`.Nr   r   r   r   r   r   r   map=   s    zBackend.mapzTree[_T]ztuple[list[_T], _TreeDef])treer
   c                 C  s   t dS )zLike `tf.nest.flatten`.Nr   r   r   r   r   r   flattenF   s    zBackend.flatten_TreeDefzlist[_T])	structureflat_sequencer
   c                 C  s   t d S Nr   r   r    r!   r   r   r   	unflattenK   s    zBackend.unflatten	Tree[Any]None)tree0tree1r
   c                 C  s   t d S r"   r   r   r'   r(   r   r   r   assert_same_structureO   s    zBackend.assert_same_structureN)__name__
__module____qualname____doc__r   cached_propertyr   abcabstractmethodr   r   r   r$   r*   r   r   r   r   r	   '   s   r	   c                   @  s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d
dddZdS )Jaxz`jax.tree_util` backend.c                 C  s   dd l }|jS Nr   )jaxZ	tree_util)r   r4   r   r   r   r   [   s    zJax.import_modulec                 G  s   | j j|g|R  S r"   )r   Ztree_mapr   r   r   r   r   `   s    zJax.mapc                 C  s   | j |\}}||fS r"   )r   Ztree_flatten)r   r   Z	flat_valsZtreedefr   r   r   r   c   s    zJax.flattenc                 C  s
   | |S r"   )r$   r#   r   r   r   r$   g   s    zJax.unflattenr%   r'   r(   c                 C  s8   | j |}| j |}||kr4td| d| d S )Nz?The two structures don't have the same nested structure.
Left: z
Right: )r   Ztree_structure
ValueError)r   r'   r(   Ztreedef0Ztreedef1r   r   r   r*   j   s    zJax.assert_same_structureN	r+   r,   r-   r.   r   r   r   r$   r*   r   r   r   r   r2   X   s   r2   c                   @  s   e Zd ZdZdd ZdS )Optreez`optree` backend.c                 C  s   dd l }|S r3   )optree)r   r9   r   r   r   r   {   s    zOptree.import_moduleN)r+   r,   r-   r.   r   r   r   r   r   r8   x   s   r8   c                   @  s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d
dddZdS )DmTreez`tree` backend.c                 C  s   dd l }|S r3   )r   r   r   r   r   r      s    zDmTree.import_modulec                 G  s   | j j|g|R  S r"   r   Zmap_structurer   r   r   r   r      s    z
DmTree.mapc                 C  s   | j ||fS r"   r   r   r   r   r   r   r      s    zDmTree.flattenc                 C  s   | j ||S r"   )r   Zunflatten_asr#   r   r   r   r$      s    zDmTree.unflattenr%   r5   c                 C  s   | j || d S r"   r   r*   r)   r   r   r   r*      s    zDmTree.assert_same_structureNr7   r   r   r   r   r:      s   r:   c                   @  s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d
dddZdS )Nestz`tf.nest` backend.c                 C  s   dd l }|jS r3   )Z
tensorflownest)r   tfr   r   r   r      s    zNest.import_modulec                 G  s   | j j|g|R  S r"   r;   r   r   r   r   r      s    zNest.mapc                 C  s   | j ||fS r"   r<   r   r   r   r   r      s    zNest.flattenc                 C  s   | j ||S r"   )r   Zpack_sequence_asr#   r   r   r   r$      s    zNest.unflattenr%   r5   c                 C  s   | j || d S r"   r=   r)   r   r   r   r*      s    zNest.assert_same_structureNr7   r   r   r   r   r>      s   r>   c                   @  s`   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dddddZ
dddddZdS )PythonzPure `Python` backend.c                 C  s   t dd S )Nz!Python backend do not have module)RuntimeErrorr   r   r   r   r      s    zPython.import_modulec                   s   |d }t |trN fddt| D }t|r@t|| S t||S nbt |tr fddtj| D }t |tj	rt||j
}|| |S t||S n | S d S )Nr   c                 3  s    | ]}j  g|R  V  qd S r"   r   .0vr   r   r   r   	<genexpr>       zPython.map.<locals>.<genexpr>c                 3  s(   | ] \}}|j  g|R  fV  qd S r"   rC   rE   krF   rG   r   r   rH      rI   )
isinstance_SEQUENCE_TYPESzipr   is_namedtupletype_MAPPING_TYPESzip_dictcollectionsdefaultdictdefault_factoryupdate)r   r   r   r'   	new_itemsnew_treer   rG   r   r      s    



z
Python.mapc                 C  s   t | ||fS r"   )list_flattenr   r   r   r   r      s    zPython.flattenc                   sZ   t |tr$tj fdd|D S t |trPtj fddt| D S |gS d S )Nc                 3  s   | ]}  |V  qd S r"   rZ   rD   r   r   r   rH      rI   z"Python._flatten.<locals>.<genexpr>c                 3  s   | ]\}}  |V  qd S r"   r[   )rE   _rF   r   r   r   rH      s   )rL   rM   	itertoolschainfrom_iterablerQ   sorteditemsr   r   r   r   rZ      s    


zPython._flattenc                 C  s   |  |t|S r"   )
_unflatteniterr#   r   r   r   r$      s    zPython.unflattenc                   s   t |trB fdd|D }t|r4t|| S t||S nvt |tr fddt| D fdd|D }t |tj	rt||j
}|| |S t||S nt S dS )z%`unflatten` recursive implementation.c                 3  s   | ]} | V  qd S r"   rb   rD   	flat_iterr   r   r   rH      rI   z$Python._unflatten.<locals>.<genexpr>c                   s   i | ]\}}| | qS r   rd   rJ   re   r   r   
<dictcomp>   s   z%Python._unflatten.<locals>.<dictcomp>c                 3  s   | ]}| | fV  qd S r"   r   )rE   rK   )ordered_itemsr   r   rH      rI   N)rL   rM   r   rO   rP   rQ   r`   ra   rS   rT   rU   rV   next)r   r    rf   rW   rX   r   )rf   rh   r   r   rb      s     




zPython._unflattenr%   r5   c              
   C  sH   z|  || W n2 tyB } ztj|dd W Y d }~n
d }~0 0 d S )Nz The two structures don't match: prefix)_assert_same_structure	Exceptionr   r   )r   r'   r(   r   r   r   r   r*      s    zPython.assert_same_structurec           
      C  s  t |tr4t|t|kr4tt| dt| t |trt|t|krhtt| dt| tt||D ]X\}\}}z| || W qv t	y } z"t
j|d| dd W Y d}~qvd}~0 0 qvnt |trxt|}t|}||krtd| d| t
||D ]\\}	\}}z| || W n< t	yp } z"t
j|d|	 dd W Y d}~n
d}~0 0 qndS dS )z1`assert_same_structure` recursive implementation.z != zIn z: rj   Nzdict keys do not match: )rL   
_ALL_TYPESrP   r6   rM   len	enumeraterN   rl   rm   r   r   rQ   r`   rR   )
r   r'   r(   iZv0Zv1r   Zk0Zk1rK   r   r   r   rl     s,    

0
2zPython._assert_same_structureN)r+   r,   r-   r.   r   r   r   rZ   r$   rb   r*   rl   r   r   r   r   rA      s   

rA   )"r.   
__future__r   r0   rS   collections.abcr]   typestypingr   r   r   Zetilsr   Zetils.etree.typingr   r   Z_TinZ_Toutr   ABCr	   r2   r8   r:   r>   rY   tuplerM   dictMappingrQ   rn   rA   r   r   r   r   <module>   s,   1 	