a
    ij                     @  s   d Z ddlmZ ddlZddlZddlmZmZmZm	Z	m
Z
 ddlmZ e	dZe	dZdaddd	d
dZdddddZdddddZG dd dee ZejG dd dZejG dd dee ZdS )zUnfrozen dataclasses.    )annotationsN)AnyGenericNoReturnTypeVarUnion)epy_Cls_TF)clsreturnc                 C  sZ   t | dd}t | dd}|tu r,|tu r,| S |dus<|durJt|  dt| _t| _| S )z%Add the `frozen`, `unfrozen` methods.frozenNZhas_unfrozenz& already define `frozen` or `unfrozen`)getattrr   unfrozen
ValueError)r   Z
cls_frozenZcls_unfrozen r   T/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/etils/edc/frozen_utils.pyadd_unfrozen   s    r   )selfr   c                 C  s   t ddS )zFreeze the dataclass.z3`.frozen()` can only be called after `.unfrozen()`.Nr   r   r   r   r   r   2   s    r   c                 C  s@   t s*tjdd}|dur&|jt da t| t dd}|j	S )z*Returns a lazy deep-copy of the dataclass.jaxNT)objcommonis_root)
_is_tree_registeredsysmodulesget	tree_utilZregister_pytree_node_class_MutableProxy_MutableProxyImpl_Common
public_api)r   r   implr   r   r   r   7   s    r   c                      s   e Zd ZdZdd fddZdddd	Zd
dddZdddddZddddddZddddZ	ddddZ
eddddddZ  ZS )r    a  Proxy which mutate the dataclass.

  Note: To avoid attribute collisions with the wrapped class, the actual
  implementation is moved inside a `_edc_impl` attribute. We cannot use mangled
  names due to compatibility issues with autograph.

  This module only expose the public API.

  r!   )r$   c                   s   t  d| d S )N	_edc_impl)super__setattr__)r   r$   	__class__r   r   __init__R   s    z_MutableProxy.__init__r   r   c                 C  s   t dd S )Nz6Object is already unfrozen. Cannot call `.unfrozen()`.r   r   r   r   r   r   U   s    z_MutableProxy.unfrozenr
   c                 C  s
   | j  S N)r%   r   r   r   r   r   r   X   s    z_MutableProxy.frozenstrr   namer   c                 C  s   | j |S r,   )r%   r   r   r/   r   r   r   __getattr__[   s    z_MutableProxy.__getattr__Noner/   valuer   c                 C  s   | j ||S r,   )r%   setattrr   r/   r4   r   r   r   r'   ^   s    z_MutableProxy.__setattr__c                 C  s   t | j d| j dS )N())type__name__r%   resolver   r   r   r   __repr__a   s    z_MutableProxy.__repr__ztuple[list[Any], Any]c                 C  s   ddl }| j }|j|S z`jax.tree_utils` support.r   N)r   r%   r;   r   tree_flatten)r   r   r   r   r   r   r>   d   s    
z_MutableProxy.tree_flattenz	list[Any])metadata	flattenedr   c                 C  s   ddl }|j||S r=   )r   r   tree_unflatten)r   r?   r@   r   r   r   r   rA   m   s    z_MutableProxy.tree_unflatten)r:   
__module____qualname____doc__r*   r   r   r1   r'   r<   r>   classmethodrA   __classcell__r   r   r(   r   r    G   s   
	r    c                   @  sV   e Zd ZU dZejedZded< ejedZ	ded< dZ
ded	< d
ddddZdS )r"   aE  Shared variable across all nested childs of an `unfrozen()` object.

  Attributes:
    cache: Global mapping `id(_MutableProxyImpl) -> _MutableProxyImpl` to avoid
      duplicating the same object proxy

      ```python
      a = a.unfrozen()
      a.x = x
      a.y = x  # `a.x` and `a.y` point to the same object
      a = a.frozen()
      assert a.x is a.y
      ```

    resolved: Cache of the objects after they have been frozen (to avoid
      evaluating the object twice.
    is_frozen: Become `True` after `.frozen()` is called. After which all
      Mutable are invalid
  default_factoryzdict[int, _MutableProxyImpl]cachezdict[int, Any]resolvedFbool	is_frozenr   r!   )r4   r   c                 C  s.   t |}|| jvr$t|| d| j|< | j| S )z@Returns the proxy associated with the given value, or create it.)r   r   )idrI   r!   )r   r4   id_r   r   r   	get_proxy   s    
z_Common.get_proxyN)r:   rB   rC   rD   dataclassesfielddictrI   __annotations__rJ   rL   rO   r   r   r   r   r"   y   s
   
r"   c                   @  s   e Zd ZU dZded< ded< dZded< ejed	Z	d
ed< e
jddddZe
jddddZdddddZdddddZddddddZddddZddd d!Zddd"d#Zd$S )%r!   z=Proxy implementation is a separate class to avoid collisions.r
   r   r"   r   FrK   r   rG   z(dict[str, Union[_MutableProxyImpl, Any]]attrsr    r+   c                 C  s   t | S r,   )r    r   r   r   r   r#      s    z_MutableProxyImpl.public_apiz!dict[str, dataclasses.Field[Any]]c                 C  s   dd t | jD S )Nc                 S  s   i | ]}|j |qS r   )r/   ).0fr   r   r   
<dictcomp>       z-_MutableProxyImpl._fields.<locals>.<dictcomp>)rP   fieldsr   r   r   r   r   _fields   s    z_MutableProxyImpl._fieldsr-   r.   c                 C  s
   || j v S )z3Returns True if the field is a dataclass attribute.)rZ   r0   r   r   r   _is_dataclass_field   s    z%_MutableProxyImpl._is_dataclass_fieldr   c                 C  sp   | j jrtd|| jv r&| j| }n6t| j|}| |r\t|r\| j 	|}|| j|< t
|trl|j}|S )zReturns `obj.name`.z1Cannot access value after the mutable was frozen.)r   rL   AttributeErrorrT   r   r   r[   rP   is_dataclassrO   
isinstancer!   r#   r6   r   r   r   r      s    


z_MutableProxyImpl.getattrr2   r3   c                 C  s   | j jrtd| |s*td|dt|tr\|j}|j | j urrtd| d| nt	|rr| j 
|}|| j|< dS )zSet `obj.name`.z3Cannot set attributes after the mutable was frozen.zCannot set z: Not a dataclass attribute.z*Trying to mix `unfrozen` attributes. For: =N)r   rL   r\   r[   r^   r    r%   r   rP   r]   rO   rT   r6   r   r   r   r5      s    


z_MutableProxyImpl.setattrc                 C  s   | j stdd| j_|  S )Nz-Only the top-level dataclass can be `.frozen`T)r   r   r   rL   r;   r   r   r   r   r      s    z_MutableProxyImpl.frozenc                 C  s   | j j  |  S z=Recursivelly call `.replace` on instances which were mutated.)r   rJ   clear_resolve_innerr   r   r   r   r;      s    z_MutableProxyImpl.resolvec                 C  s~   t | }|| jjvrri }| j D ]"\}}t|tr<| }|||< q"|sR| j}nt	j
| jfi |}|| jj|< | jj| S r`   )rM   r   rJ   rT   itemsr^   r!   rb   r   rP   replace)r   rN   new_valskvrJ   r   r   r   rb      s    

z _MutableProxyImpl._resolve_innerN)r:   rB   rC   rD   rS   r   rP   rQ   rR   rT   r   cached_propertyr#   rZ   r[   r   r5   r   r;   rb   r   r   r   r   r!      s"   
r!   )rD   
__future__r   rP   r   typingr   r   r   r   r   Zetilsr   r	   r
   r   r   r   r   r    	dataclassr"   r!   r   r   r   r   <module>   s    2!