
    2Vh
                         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 ZddZ G d d      Z G d	 d
      Z ed      d        Zy)    N)backend)keras_export)global_statec                      t        j                  dd      rydt        j                  v rddlm}  | j                          S y)Nin_tf_graph_scopeFT
tensorflowr   )r   )r   get_global_attributesysmoduleskeras.src.utils.module_utilsr   executing_eagerly)tfs    M/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/utils/backend_utils.pyin_tf_graphr      s:    (()<eDs{{"A'')))    c                 v    t        j                         dk7  r!t               st        j                  | |      } | S )Nr   )dtype)backend_moduler   r   convert_to_tensor)outputsr   s     r   convert_tf_tensorr      s.    </ 227%HNr   c                       e Zd Zd Zd Zd Zy)TFGraphScopec                 :    t        j                  dd      | _        y )Nr   F)r   r	   _original_valueselfs    r   __init__zTFGraphScope.__init__   s    +@@ 
r   c                 0    t        j                  dd       y )Nr   T)r   set_global_attributer   s    r   	__enter__zTFGraphScope.__enter__"   s    ))*=tDr   c                 D    t        j                  d| j                         y )Nr   )r   r    r   )r   argskwargss      r   __exit__zTFGraphScope.__exit__%   s    ))!5!5	
r   N)__name__
__module____qualname__r   r!   r%    r   r   r   r      s    

E
r   r   c                   :    e Zd ZdZddZd Zd Zed        Zd Z	y)	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                 >    |xs t        j                         | _        y Nr   r   _backendr   r   s     r   r   zDynamicBackend.__init__;   s    ;>#9#9#;r   c                 6    |dvrt        d|       || _        y )N)r   jaxtorchnumpyopenvinozaAvailable backends are ('tensorflow', 'jax', 'torch', 'numpy' and 'openvino'). Received: backend=)
ValueErrorr/   r0   s     r   set_backendzDynamicBackend.set_backend>   s1    MM>>EYH   r   c                 6    t        j                         | _        y r-   r.   r   s    r   resetzDynamicBackend.resetF   s    &..0r   c                     | j                   S r-   )r/   r   s    r   namezDynamicBackend.nameI   s    }}r   c                    | j                   dk(  r!t        j                  d      }t        ||      S | j                   dk(  r!t        j                  d      }t        ||      S | j                   dk(  r!t        j                  d      }t        ||      S | j                   dk(  r2t	        j
                         dk(  rt        t        |      S t        d      | j                   d	k(  r!t        j                  d
      }t        ||      S y )Nr   zkeras.src.backend.tensorflowr2   zkeras.src.backend.jaxr3   zkeras.src.backend.torchr4   zoCurrently, we cannot dynamically import the numpy backend because it would disrupt the namespace of the import.r5   zkeras.src.backend.openvino)r/   	importlibimport_modulegetattrr   r   NotImplementedError)r   r;   modules      r   __getattr__zDynamicBackend.__getattr__M   s    ==L(,,-KLF64((==E!,,-DEF64((==G#,,-FGF64((==G#%%'72~t44)L  ==J&,,-IJF64(( 'r   r-   )
r&   r'   r(   __doc__r   r7   r9   propertyr;   rB   r)   r   r   r+   r+   +   s/    < 1  )r   r+   zkeras.config.set_backendc                 f   | t         j                  d<   t        j                  j	                         D cg c]  }|j                  d      s| }}|D ]  }t        j                  |=  ddl}t        j                  t                     }|j                         D ]  \  }}|j                  |j                  k(  s t        |      j                  d      s;t        |      }||j                  d      dz   d }|d|j                  d       }t        j                  |      t               |<    yc c}w )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_BACKENDkerasr   Nz<module 'keras.'   )osenvironr
   r   keys
startswithrG   copyglobalsitems	__class__strfindr=   r>   )r   keyloaded_modulesrG   globsvaluemodule_names          r   r7   r7   d   s   , #*BJJ {{'')S^^G-DN   KK  IIgi Ekkm F
U??eoo-5z$$%67!%j)+*:*:3*?!*C*EF)*AK,<,<S,AB!*!8!8!E	#Fs   D.D.r-   )rN   r=   rJ   r
   	keras.srcr   r   keras.src.api_exportr   keras.src.backend.commonr   r   r   r   r+   r7   r)   r   r   <module>r\      sU      	 
 / - 1
 
6) 6)r ()'F *'Fr   