o
    ·2úh#  ã                   @   sZ   d dl Z d dlZzd dlZW n ey   dZY nw d dlmZ edƒG dd„ dƒƒZdS )é    N)Úkeras_exportzkeras.utils.Configc                   @   sÊ   e Zd ZdZdZdd„ Ze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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 )0ÚConfigaÝ  A Config is a dict-like container for named values.

    It offers a few advantages over a plain dict:

    - Setting and retrieving values via attribute setting / getting.
    - Ability to freeze the config to ensure no accidental config modifications
        occur past a certain point in your program.
    - Easy serialization of the whole config as JSON.

    Examples:

    ```python
    # Create a config via constructor arguments
    config = Config("learning_rate"=0.1, "momentum"=0.9)

    # Then keep adding to it via attribute-style setting
    config.use_ema = True
    config.ema_overwrite_frequency = 100

    # You can also add attributes via dict-like access
    config["seed"] = 123

    # You can retrieve entries both via attribute-style
    # access and dict-style access
    assert config.seed == 100
    assert config["learning_rate"] == 0.1
    ```

    A config behaves like a dict:

    ```python
    config = Config("learning_rate"=0.1, "momentum"=0.9)
    for k, v in config.items():
        print(f"{k}={v}")

    print(f"keys: {list(config.keys())}")
    print(f"values: {list(config.values())}")
    ```

    In fact, it can be turned into one:

    ```python
    config = Config("learning_rate"=0.1, "momentum"=0.9)
    dict_config = config.as_dict()
    ```

    You can easily serialize a config to JSON:

    ```python
    config = Config("learning_rate"=0.1, "momentum"=0.9)

    json_str = config.to_json()
    ```

    You can also freeze a config to prevent further changes:

    ```python
    config = Config()
    config.optimizer = "adam"
    config.seed = 123

    # Freeze the config to prevent changes.
    config.freeze()
    assert config.frozen

    config.foo = "bar"  # This will raise an error.
    ```
    Nc                 K   s   || _ d| _tt| ƒƒ| _d S ©NF)Ú_configÚ_frozenÚsetÚdirÚ	__attrs__)ÚselfÚkwargs© r   úQ/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/utils/config.pyÚ__init__U   s   zConfig.__init__c                 C   s   | j S )z%Returns True if the config is frozen.©r   ©r
   r   r   r   ÚfrozenZ   s   zConfig.frozenc                 C   s
   d| _ dS )zAMarks the config as frozen, preventing any ulterior modification.TNr   r   r   r   r   Úfreeze_   s   
zConfig.freezec                 C   s
   d| _ d S r   r   r   r   r   r   Úunfreezec   ó   
zConfig.unfreezec                 C   s   | j rtdƒ‚d S )Nz8Cannot mutate attribute(s) because the config is frozen.)r   Ú
ValueErrorr   r   r   r   Ú_raise_if_frozenf   s
   ÿÿzConfig._raise_if_frozenc                 C   s   t   | j¡S ©N)Úcopyr   r   r   r   r   Úas_dictl   ó   zConfig.as_dictc                 C   s   t  | j¡S r   )ÚjsonÚdumpsr   r   r   r   r   Úto_jsono   r   zConfig.to_jsonc                 C   ó
   | j  ¡ S r   )r   Úkeysr   r   r   r   r   r   r   zConfig.keysc                 C   r   r   )r   Úvaluesr   r   r   r   r    u   r   zConfig.valuesc                 C   r   r   )r   Úitemsr   r   r   r   r!   x   r   zConfig.itemsc                 G   s   |   ¡  | jj|Ž S r   )r   r   Úpop)r
   Úargsr   r   r   r"   {   ó   z
Config.popc                 O   s   |   ¡  | jj|i |¤ŽS r   )r   r   Úupdate)r
   r#   r   r   r   r   r%      s   zConfig.updatec                 C   s   | j  ||¡S r   )r   Úget)r
   ÚkeynameÚvaluer   r   r   r&   ƒ   ó   z
Config.getc                 C   s@   t  | d¡}|d u s||v rt  | ||¡S |  ¡  || j|< d S )Nr	   )ÚobjectÚ__getattribute__Ú__setattr__r   r   )r
   Únamer(   Úattrsr   r   r   r,   †   s
   zConfig.__setattr__c                 C   sˆ   t  | d¡}|d u s||v rt  | |¡S || jv r| j| S d|› d}td ur@tj|| j ¡ ddd}|r@|d|d › d	7 }t|ƒ‚)
Nr	   zUnknown attribute: 'z'.é   gffffffæ?)ÚnÚcutoffz Did you mean 'r   z'?)r*   r+   r   ÚdifflibÚget_close_matchesr   ÚAttributeError)r
   r-   r.   ÚmsgÚclosest_matchesr   r   r   Ú__getattr__Ž   s   

ÿzConfig.__getattr__c                 C   s   |   ¡  || j|< d S r   ©r   r   )r
   ÚkeyÚitemr   r   r   Ú__setitem__Ÿ   s   zConfig.__setitem__c                 C   s
   | j | S r   ©r   ©r
   r9   r   r   r   Ú__getitem__£   r   zConfig.__getitem__c                 C   s   d| j › dS )Nz<Config ú>r<   r   r   r   r   Ú__repr__¦   r)   zConfig.__repr__c                 c   s$    t | j ¡ ƒ}|D ]}|V  q
d S r   )Úsortedr   r   )r
   r   Úkr   r   r   Ú__iter__©   s
   €ÿzConfig.__iter__c                 C   s
   t | jƒS r   )Úlenr   r   r   r   r   Ú__len__®   r   zConfig.__len__c                 C   s   |   ¡  | j|= d S r   r8   r=   r   r   r   Ú__delitem__±   r$   zConfig.__delitem__c                 C   s
   || j v S r   r<   )r
   r:   r   r   r   Ú__contains__µ   r   zConfig.__contains__r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   Úpropertyr   r   r   r   r   r   r   r    r!   r"   r%   r&   r,   r7   r;   r>   r@   rC   rE   rF   rG   r   r   r   r   r      s4    E

r   )r   r   r2   ÚImportErrorÚkeras.src.api_exportr   r   r   r   r   r   Ú<module>   s    ÿ