o
    2h
                     @   s   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 dd ZdddZG d	d
 d
ZG dd dZeddd ZdS )    N)backend)keras_export)global_statec                  C   s4   t ddrdS dtjv rddlm}  |   S dS )Nin_tf_graph_scopeFT
tensorflowr   )r   )r   get_global_attributesysmoduleskeras.src.utils.module_utilsr   executing_eagerly)tf r   X/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/utils/backend_utils.pyin_tf_graph   s   

r   c                 C   s$   t  dkrt st j| |d} | S )Nr   )dtype)backend_moduler   r   convert_to_tensor)outputsr   r   r   r   convert_tf_tensor   s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TFGraphScopec                 C   s   t dd| _d S )Nr   F)r   r   _original_valueselfr   r   r   __init__   s   
zTFGraphScope.__init__c                 C   s   t dd d S )Nr   T)r   set_global_attributer   r   r   r   	__enter__"   s   zTFGraphScope.__enter__c                 O   s   t d| j d S )Nr   )r   r   r   )r   argskwargsr   r   r   __exit__%   s   zTFGraphScope.__exit__N)__name__
__module____qualname__r   r   r   r   r   r   r   r      s    r   c                   @   s>   e Zd ZdZdddZdd Zdd Zed	d
 Zdd Z	dS )DynamicBackendaF  A class that can be used to switch from one backend to another.

    Example:

    ```python
    backend = DynamicBackend("tensorflow")
    y = backend.square(tf.constant(...))
    backend.set_backend("jax")
    y = backend.square(jax.numpy.array(...))
    ```

    Args:
        backend: Initial backend to use (string).
    Nc                 C   s   |pt  | _d S Nr   r   _backendr   r   r   r   r   r   ;   s   zDynamicBackend.__init__c                 C   s    |dvrt d| || _d S )N)r   jaxtorchnumpyopenvinozaAvailable backends are ('tensorflow', 'jax', 'torch', 'numpy' and 'openvino'). Received: backend=)
ValueErrorr%   r&   r   r   r   set_backend>   s   
zDynamicBackend.set_backendc                 C   s   t  | _d S r#   r$   r   r   r   r   resetF   s   zDynamicBackend.resetc                 C   s   | j S r#   )r%   r   r   r   r   nameI   s   zDynamicBackend.namec                 C   s   | j dkrtd}t||S | j dkrtd}t||S | j dkr-td}t||S | j dkrAt dkr=tt|S td| j d	krPtd
}t||S d S )Nr   zkeras.src.backend.tensorflowr'   zkeras.src.backend.jaxr(   zkeras.src.backend.torchr)   zoCurrently, we cannot dynamically import the numpy backend because it would disrupt the namespace of the import.r*   zkeras.src.backend.openvino)r%   	importlibimport_modulegetattrr   r   NotImplementedError)r   r.   moduler   r   r   __getattr__M   s&   













zDynamicBackend.__getattr__r#   )
r   r    r!   __doc__r   r,   r-   propertyr.   r4   r   r   r   r   r"   +   s    

r"   zkeras.config.set_backendc                 C   s   | t jd< dd tj D }|D ]}tj|= qddl}tt }| D ]1\}}|j	|j	krWt
|drWt
|}||dd d }|d|d }t|t |< q&dS )	u  Reload the backend (and the Keras package).

    Example:

    ```python
    keras.config.set_backend("jax")
    ```

    ⚠️ WARNING ⚠️: Using this function is dangerous and should be done
    carefully. Changing the backend will **NOT** convert
    the type of any already-instantiated objects.
    Thus, any layers / tensors / etc. already created will no
    longer be usable without errors. It is strongly recommended **not**
    to keep around **any** Keras-originated objects instances created
    before calling `set_backend()`.

    This includes any function or class instance that uses any Keras
    functionality. All such code needs to be re-executed after calling
    `set_backend()`.
    KERAS_BACKENDc                 S   s   g | ]	}| d r|qS )keras)
startswith).0keyr   r   r   
<listcomp>|   s
    
zset_backend.<locals>.<listcomp>r   Nz<module 'keras.'   )osenvironr   r	   keysr8   copyglobalsitems	__class__strr9   findr/   r0   )r   loaded_modulesr;   r8   globsvaluemodule_namer   r   r   r,   d   s"   

r,   r#   )rB   r/   r?   r   	keras.srcr   r   keras.src.api_exportr   keras.src.backend.commonr   r   r   r   r"   r,   r   r   r   r   <module>   s    
9