
    2Vh                     d    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      Zy)    N)tree)StatelessScope)
tensorflowc                   6    e Zd Zd Zd ZddZddZd	dZd Zy)
JaxExportArchivec                 .    g | _         g | _        g | _        y N)_backend_variables_backend_trainable_variables _backend_non_trainable_variables)selfs    L/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/backend/jax/export.py__init__zJaxExportArchive.__init__   s    "$,.)02-    c                 0   |j                   }|j                  }| j                  xj                   t        j                  | j
                  |      z  c_         | j                  xj                  t        j                  | j
                  |      z  c_        | j                  j                   | j                  j                  z   | j                  _        | xj                  |z  c_        | xj                  |z  c_        | j                  | j                  z   | _	        y r	   )
trainable_variablesnon_trainable_variables_tf_trackabler   map_structure_convert_to_tf_variable	variablesr   r   r
   )r   layerr   r   s       r   _track_layerzJaxExportArchive._track_layer   s     $77"'"?"?..$2D2D((*=3
 	
. 	22d6H6H((*A7
 	
2 22  889 	$
 	))-@@)--1HH---334 	r   Nc                     |j                  dd       }t        j                  |      xs i }t        |j                  dd            }d|vr j                         |d<   d|vr j	                  |      |d<   t        j                        }t        |j                  j                               }|reddl
m}	  |	j                  fi |}
t        j                  |dt        |       |j                        |
_        t#        j$                  |
|d	      }|S  fd
} j'                  |||       fd}t        j                  |dt        |       |j                        |_        t#        j$                  ||d	      }|S )Njax2tf_kwargs	is_staticFnative_serializationpolymorphic_shapesr   jax2tf)
parametersreturn_annotation)input_signature	autographc                     t        
j                  |       }t        |      5 } 	|i |}d d d        g }
j                  D ]$  }j	                  |      }|j                  |       & |fS # 1 sw Y   BxY w)N)state_mapping)zipr
   r   r   get_current_valueappend)r   argskwargsr&   scopeoutputr   var	new_valuefnr   s            r   stateless_fnz3JaxExportArchive.add_endpoint.<locals>.stateless_fnU   s     #D$;$;Y G#-@ 1E00F1 +-'@@ >C % 7 7 <I+229=> 6661 1s   	A..A7)r   c                      t        j                  j                        g| i |\  }}t        j                  j                  |      D ]4  \  }}|j                  t        j                  ||j                               6 |S r	   )	listr   r   r'   r   assigntfcastdtype)r*   r+   r-   r   r.   r/   jax2tf_stateless_fnr   s         r   stateful_fnz2JaxExportArchive.add_endpoint.<locals>.stateful_fne   s    2E++5563 3 	3// '*&&>>+' >NC JJrwwy#))<=	>
 r   )popcopybool_check_device_compatible_to_polymorphic_shapeinspect	signaturer3   r!   valuesjax.experimentalr    convert	Signaturelenr"   __signature__r5   function_convert_jax2tf_function)r   namer0   r#   r+   r   r   fn_signaturefn_parametersr    jax_fndecorated_fnr1   r9   r8   s   ` `           @r   add_endpointzJaxExportArchive.add_endpoint*   s   

?D9		-06BK78	 "6--/ 01  }4262L2L3M./ ((,\44;;=>/#V^^B8-8F#*#4#4(S-AB"."@"@$F 
 ;; /Lj Q
7 #'"?"?o] #@ # )0(9(9(S-AB"."@"@)K%
 ;; /L
 r   c                     ddl m} | j                  | j                  d      }t	        |d         }|g|z   |d<    |j
                  |fi |S )Nr   r   F)
allow_noner   )rB   r    r>   r
   r3   rC   )r   r0   r#   r   r    variables_shapesinput_shapess          r   rH   z)JaxExportArchive._convert_jax2tf_function   sa    +55## 6 
 M*>?@/?.@<.O*+v~~b2M22r   c           
          r\t        j                  t        j                  t        j                  d t        j
                  t        j                  d                  fd}t        j                  ||      S )Nc                     | |z   S r	    )abs     r   <lambda>z8JaxExportArchive._to_polymorphic_shape.<locals>.<lambda>   s
    Q r      )repeatc                 X   g }t        t        | j                              D ]p  \  }}||j                  t	        |             #st        d|  d| j                         |dk(  r|j                  d       W|j                  t                     r ddj                  |      z   dz   S )NzIllegal None dimension in z with shape r   batch(z, ))	enumerater3   shaper)   str
ValueErrornextjoin)x
poly_shapeindexdimrP   	dim_namess       r   convert_shapez=JaxExportArchive._to_polymorphic_shape.<locals>.convert_shape   s    J'QWW6 
7
s?%%c#h/#$4QC|AGG9M  aZ%%g.%%d9o6
7 :..44r   )	itertoolschainstringascii_lowercasestarmapproductr   r   )r   structrP   rj   ri   s     ` @r   r>   z&JaxExportArchive._to_polymorphic_shape   s`     "&&!!&%%f&<&<QGI	5 !!-88r   c                     ddl m}  |       dk(  rAt        t        j                  j                  d            dk(  rt        j                  d       yy)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)jaxrs   rE   r5   configlist_physical_deviceswarningswarn)r   
jax_devices     r   r=   z)JaxExportArchive._check_device_compatible   sF    5 LE!BII33E:;q@MM! r   r	   )T)	__name__
__module____qualname__r   r   rN   rH   r>   r=   rU   r   r   r   r      s"    3

0Sj39:r   r   )r;   r?   rk   rm   ry   	keras.srcr   (keras.src.backend.common.stateless_scoper   keras.src.utils.module_utilsr   r5   r   rU   r   r   <module>r      s)          C 9l lr   