a
    ijQ                     @  s   d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlZe	jZG dd	 d	eZe d
d ZG dd dZdddddZdddddZdS )zArray spec utils.    )annotationsN)AnyOptional)numpy_utils)typing)Arrayc                   @  s   e Zd ZdS )UnknownArrayErrorN)__name__
__module____qualname__ r   r   R/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/etils/enp/array_spec.pyr   !   s   r   c                  C  s2   t js
J t jjjd} | dd } | jd S )z Returns the tf.NoneTensorSpec().r   c                 S  s   | d fS Nr   )xr   r   r   <lambda>,       z _get_none_spec.<locals>.<lambda>)lazyhas_tftfdataZDatasetrangemapZelement_spec)Zdsr   r   r   _get_none_spec%   s    
r   c                   @  sr   e Zd ZdZddgZdd Zdddd	Zd
dddZddddZe	dd
dddZ
e	dddddZdS )	ArraySpecz!Structure containing shape/dtype.shapedtypec                 C  s.   t |rtd}t|| _t|| _d S )NO)r   Zis_dtype_strnpr   tupler   )selfr   r   r   r   r   __init__5   s    


zArraySpec.__init__str)returnc                 C  s   t j| j| jd}t|S )N)r   r   )array_typesArrayAliasMetar   r   repr)r    Z
array_typer   r   r   __repr__;   s
    zArraySpec.__repr__boolc                 C  s.   t |t| sdS |j|jf| j| jfkS d S )NF)
isinstancetyper   r   )r    otherr   r   r   __eq__B   s    zArraySpec.__eq__intc                 C  s   t | j| jfS r   )hashr   r   )r    r   r   r   __hash__H   s    zArraySpec.__hash__r   arrayr#   c                 C  s,   z|  | W n ty"   Y dS 0 dS dS )zBReturns `True` if the given value can be converted to `ArraySpec`.FTN)
from_arrayr   )clsr1   r   r   r   is_arrayK   s
    zArraySpec.is_arrayr   zOptional[ArraySpec]c                 C  s  t |tjtjtfr$|j}|j}nPtjr`t |tj	j
r`tj	j|jtj	jjr`|j}tj}ntjrt |tj	jtjjfr|j}|j}ntjrt |tjjtjjfr|j}dd |D }|jj}ntjrt |tt rdS t|r|j}|j}nt|r|j}|j}nht |tjrbzdd |j D }W n$ tyV   td| dY n0 |jj}ntdt| | ||dS )z/Construct the `ArraySpec` from the given array.c                 s  s"   | ]}|d urt |n|V  qd S r   r-   .0sr   r   r   	<genexpr>o   r   z'ArraySpec.from_array.<locals>.<genexpr>Nc                 s  s   | ]}t |V  qd S r   r5   r6   r   r   r   r9   {   r   zNot supported dynamic shape: zUnknown array-like type: )r   r   ) r)   r   ZndarrayZgenericr   r   r   r   Zhas_jaxZjaxr   ZdtypesZ
issubdtypeZprng_keyZuint32ZShapeDtypeStructZjnpr   r   Z
TensorSpecZTensorZas_numpy_dtyper*   r   	_is_grain	_is_orbaxr$   r%   split
ValueErrorr   Znp_dtype)r3   r1   r   r   r   r   r   r2   U   sX    




zArraySpec.from_arrayN)r	   r
   r   __doc__	__slots__r!   r'   r,   r/   classmethodr4   r2   r   r   r   r   r   0   s   	r   r   r(   r0   c                 C  s$   t jd}|d u rdS t| |jS )Nzgrain.tensorflowF)sysmodulesgetr)   r   )r1   Zgainr   r   r   r:      s    r:   c                 C  s.   t jd}|d u rdS t| |jj|jjfS )Nzorbax.checkpointF)rA   rB   rC   r)   Ztype_handlersZArrayMetadataZScalarMetadata)r1   Zocpr   r   r   r;      s    r;   )r>   
__future__r   	functoolsrA   r   r   r   Z	etils.enpr   Zetils.enp.array_typesr$   Zetils.enp.typingr   numpyr   r   	TypeErrorr   	lru_cacher   r   r:   r;   r   r   r   r   <module>   s   

W