o
    2h                     @   s^   d dl Z 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 G dd dZdS )    N)tree)StatelessScope)
tensorflowc                   @   sB   e Zd Zdd Zdd ZdddZddd	ZdddZdd ZdS )JaxExportArchivec                 C   s   g | _ g | _g | _d S N)_backend_variables_backend_trainable_variables _backend_non_trainable_variables)self r   W/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/backend/jax/export.py__init__   s   
zJaxExportArchive.__init__c                 C   s   |j }|j}| j j t| j|7  _ | j jt| j|7  _| jj | jj | j_|  j|7  _|  j|7  _| j| j | _	d S r   )
trainable_variablesnon_trainable_variables_tf_trackabler   map_structure_convert_to_tf_variable	variablesr   r	   r   )r
   layerr   r   r   r   r   _track_layer   s$   zJaxExportArchive._track_layerNc                    s  | dd }t|pi }t| dd}d|vr |d< d|vr*||d< t }t|j	 }|r`ddl
m}	 |	j fi |}
tj|dt| |jd|
_tj|
|dd	}|S  fd
d}j|||dfdd}tj|dt| |jd|_tj||dd	}|S )Njax2tf_kwargs	is_staticFnative_serializationpolymorphic_shapesr   jax2tf)
parametersreturn_annotation)input_signature	autographc           	         sp   t j| }t|d} |i |}W d    n1 sw   Y  g }jD ]}||}|| q'||fS )N)state_mapping)zipr   r   r	   get_current_valueappend)	r   argskwargsr    scopeoutputr   var	new_value)fnr
   r   r   stateless_fnU   s   

z3JaxExportArchive.add_endpoint.<locals>.stateless_fn)r   c                     sR    t jjg| R i |\}}tjj|D ]\}}|t||j q|S r   )	listr   r   r!   r   assigntfcastdtype)r$   r%   r'   r   r(   r)   )jax2tf_stateless_fnr
   r   r   stateful_fne   s   

z2JaxExportArchive.add_endpoint.<locals>.stateful_fn)popcopybool_check_device_compatible_to_polymorphic_shapeinspect	signaturer,   r   valuesjax.experimentalr   convert	Signaturelenr   __signature__r.   function_convert_jax2tf_function)r
   namer*   r   r%   r   r   fn_signaturefn_parametersr   jax_fndecorated_fnr+   r2   r   )r*   r1   r
   r   add_endpoint*   sP   
5zJaxExportArchive.add_endpointc                 C   sH   ddl m} | j| jdd}t|d }|g| |d< |j|fi |S )Nr   r   F)
allow_noner   )r;   r   r7   r   r,   r<   )r
   r*   r   r   r   variables_shapesinput_shapesr   r   r   rA      s   z)JaxExportArchive._convert_jax2tf_functionTc              
      sD    rt tjt dd t jtjdd fdd}t||S )Nc                 S   s   | | S r   r   )abr   r   r   <lambda>   s    z8JaxExportArchive._to_polymorphic_shape.<locals>.<lambda>   )repeatc                    s   g }t t| jD ].\}}|d ur|t| q	 s&td|  d| j |dkr0|d q	|t q	dd| d S )NzIllegal None dimension in z with shape r   batch(z, ))	enumerater,   shaper#   str
ValueErrornextjoin)x
poly_shapeindexdimrH   	dim_namesr   r   convert_shape   s   z=JaxExportArchive._to_polymorphic_shape.<locals>.convert_shape)	itertoolschainstringascii_lowercasestarmapproductr   r   )r
   structrH   r_   r   r]   r   r7      s   z&JaxExportArchive._to_polymorphic_shapec                 C   s<   ddl m} | dkrttjddkrtd dS dS )Nr   )default_backendgpuGPUaX  JAX backend is using GPU for export, but installed TF package cannot access GPU, so reloading the model with the TF runtime in the same environment will not work. To use JAX-native serialization for high-performance export and serving, please install `tensorflow-gpu` and ensure CUDA version compatibility between your JAX and TF installations.FT)jaxrg   r>   r.   configlist_physical_deviceswarningswarn)r
   
jax_devicer   r   r   r6      s   
	z)JaxExportArchive._check_device_compatibler   )T)	__name__
__module____qualname__r   r   rG   rA   r7   r6   r   r   r   r   r      s    

U

r   )r4   r8   r`   rb   rm   	keras.srcr   (keras.src.backend.common.stateless_scoper   keras.src.utils.module_utilsr   r.   r   r   r   r   r   <module>   s    