
    2Vhj8                     z   d dl Z d dlmc mZ d dlm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lmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ dZdZdZ G d de      Zd)dZd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd*dZ(d+dZ)d Z*d Z+d Z,d Z-d Z.	 d,dZ/d  Z0d! Z1d-d"Z2d# Z3d$ Z4d% Z5 G d& d'e      Zd( Z6y).    N)tree)KerasVariable)global_state)standardize_dtype)KerasTensor)
name_scope)StatelessScope)SymbolicScope)distribution_libTFc                   >     e Zd Zdd fd
Zd Zd ZddZd Z xZS )	VariableN)layoutc                2    || _         t        |   |i | y N)_layoutsuper__init__)selfr   argskwargs	__class__s       J/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/backend/jax/core.pyr   zVariable.__init__   s     $)&)    c                 $   | j                  |j                        | _        t        j                  d      }| j
                  >|<|j                  |       }ddlm} t        ||      r|j                  | _        n|| _        | j                  |       y )Ndistributionr   )TensorLayout)_validate_shapeshape_shaper   get_global_attributer   get_variable_layoutkeras.src.distributionr   
isinstancebackend_layout_direct_assign)r   valuer   tensor_layoutr   s        r   _initializezVariable._initialize   sx    **5;;7 $88H<<L$<(<<TBM;-6,;;,E"r   c                 j    | j                    t        j                  || j                         }|| _        y r   )r   r   distribute_variable_value)r   r&   s     r   r%   zVariable._direct_assign-   s)    <<#$88MEr   c                     t        ||d      S )NFdtypesparseconvert_to_tensor)r   r&   r.   s      r   _convert_to_tensorzVariable._convert_to_tensor2   s     eEBBr   c                     | j                   S r   )r&   )r   s    r   __jax_array__zVariable.__jax_array__6   s    zzr   r   )	__name__
__module____qualname__r   r(   r%   r2   r4   __classcell__r   s   @r   r   r      s     %) *# 
Cr   r   c                    |rt        d      |t        |      }t        | t        j                  t
        j                  f      r|| j                  |k(  r| S t        | t              r8|*| j                  |k7  r| j                  j                  |      S | j                  S t        | t        j                        r9||s| j                         } n$| | j                  |k7  r| j                  |      S | S t        |       s2t        |      dk(  r$t        j                  |       j                  |      S t        j                  | |      S )Nz/`ragged=True` is not supported with jax backendbfloat16r.   )
ValueErrorr   r#   jnpndarrayjaxArrayr.   r   r&   astype
jax_sparse	JAXSparsetodense	is_tensorasarray)xr.   r/   raggeds       r   r1   r1   :   s   JKK!%(!ckk399-.E)
 !XE!177>>%((ww!Z))*f		A177e#388E?"HQ<-e4
B {{1~$$U++;;q&&r   c                     t        | t        j                        r| j                         } t	        |       r4| j
                  dk(  r%t        j                  | t        j                        S t        j                  |       S )Nr;   r<   )
r#   rC   rD   rE   rF   r.   nparray	ml_dtypesr;   rH   s    r   convert_to_numpyrO   [   sT    !Z))*IIK|:-xx!3!34488A;r   c                 Z    t        | t        j                  t        j                  f      ryy)NTF)r#   r>   r?   rC   rD   rN   s    r   rF   rF   c   s!    !ckk:#7#789r   c                     | j                   S r   )r   rN   s    r   r   r   i   s     77Nr   c                     t        | |      S )Nr<   r0   )rH   r.   s     r   castrS   o   s    Qe,,r   c           	          t               5  t               5  t        d       t        t        t
        t        t        t        f}g g g i i t        |      D ]E  \  }}t        ||      r#j                  |       j                  |       5j                  |       G t              |j                         D ]  \  }}t        ||      r||<   ||<    d}t        j                  f      D ]2  }	t        |	t               st#        d |	j$                  D              s1d}4 dfd	 fd}
|rt        j&                  fdf      \  }} t)        j*                  |
d      |i |\  }}t        j&                  fdf      \  }} t)        j*                  |
d      |i |\  }}d	 fd
}t        j&                  |||      cd d d        cd d d        S t        j&                  f      \   t)        j*                  |
d      i \  }}d }t        j&                  ||      cd d d        cd d d        S # 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)NFc              3   $   K   | ]  }|d u  
 y wr    ).0ds     r   	<genexpr>z&compute_output_spec.<locals>.<genexpr>   s     1M!t)1Ms   Tc           	         t        | t              rUt        | j                        }|rt	        |      D ]  \  }}|	|||<    t        j                  || j                        }|S t        | t              r,| j                         D ci c]  \  }}| 	||       c}}S t        | t              r| D cg c]  } 	||       c}S | S c c}}w c c}w )Nr<   
fill_value)
r#   r   listr   	enumerater@   ShapeDtypeStructr.   dictitems)
rH   r\   r   ie
jax_tensorkvxiconvert_keras_tensor_to_jaxs
            r   rh   z8compute_output_spec.<locals>.convert_keras_tensor_to_jax   s    ![)QWW )% 0 219'1E!H2 !11%qwwG
!!!T" !"	1 21LL  !T"   0zJ  H
s   
C7Cc                     d }t        j                  || |f	f      \  } }g }d}d}d}|t        
      k  s|t        |       k  rZ|v r|j                  
|          |dz  }n|j                  | |          |dz  }|dz  }|t        
      k  rK|t        |       k  rZt	               5   |i |cd d d        S # 1 sw Y   y xY w)Nc                     t        |t              r-|j                  r!t        j                  j                  | d      S | S )N   )nse)r#   r   r/   rC   BCOO	fromdense)rH   maybe_symbolic_xs     r   to_bcoo_if_sparsezBcompute_output_spec.<locals>.wrapped_fn.<locals>.to_bcoo_if_sparse   s5    /=(//%??44QA4>>r   r   rk   )r   map_structurelenappendr	   )r   r   rp   rec_args
idx_staticidx_symrb   fnmaybe_symbolic_argsmaybe_symbolic_kwargsstatic_argsstatic_args_idxstatic_kwargss          r   
wrapped_fnz'compute_output_spec.<locals>.wrapped_fn   s      --!v$&;<LD& HJGAs;//7SY3F'OOK
$;<!OJOODM2qLGQ s;//7SY3F  ! @8?v??@ @ @s   +
B??Cc                      | d      S )NS   r[   rV   rH   rh   s    r   <lambda>z%compute_output_spec.<locals>.<lambda>       5aBG r   )return_shapec                      | d      S )NY   r[   rV   r   s    r   r   z%compute_output_spec.<locals>.<lambda>   r   r   c                 l    t        t        | |      D cg c]  \  }}||k(  r|nd  c}}      S c c}}w r   )tuplezip)shape1shape2d1d2s       r   merge_shapesz)compute_output_spec.<locals>.merge_shapes   s6    <?<OP&"b28R-P Ps   0
c                    t        | t        j                        rWt        |t        j                        st        d      t	         | j
                  |j
                        | j                        S t        | t        j                        rXt        |t        j                        st        d      t	         | j
                  |j
                        | j                  d      S | S )Nz Indeterministic output ordering.r<   Tr-   )	r#   r@   r_   r=   r   r   r.   rC   rm   )x1x2r   s     r   !convert_jax_specs_to_keras_tensorz>compute_output_spec.<locals>.convert_jax_specs_to_keras_tensor   s    b#"6"67%b#*>*>?()KLL&$RXXrxx8   JOO4%b*//:()KLL&$RXXrxx8 hh#  Ir   c                     t        | t        j                        r t        | j                  | j
                        S t        | t        j                        r"t        | j                  | j
                  d      S | S )NT)r/   )r#   r@   r_   r   r   r.   rC   rm   rN   s    r    convert_jax_spec_to_keras_tensorz=compute_output_spec.<locals>.convert_jax_spec_to_keras_tensor   sQ    !S112"177AGG44Az/"177AGGDAAHr   r   )r	   r
   typeintfloatstrboolcomplexbytesr^   r#   rs   r   ra   r   flattenr   anyr   rq   r@   
make_jaxpr)rw   r   r   built_in_typesidxargre   rf   has_nonerH   r}   	ms_args_1ms_kwargs_1_	jax_out_1	ms_args_2ms_kwargs_2	jax_out_2r   jax_outr   rh   rx   ry   r   rz   r{   r|   s   `                    @@@@@@@r   compute_output_specr   t   s   		 LM=? LMt*c5#tWeL   "!$ 	0HC#~.&&s+""3'#**3/	0 $$78LLN 	-DAq!^,#$a +,%a(		- 24IJK 	 A![)c1MQWW1M.M	 	*	@ 	@@ %)%7%7G$&;<&"I{ I3>>*4H)LAy &*%7%7G$&;<&"I{ I3>>*4H)LAy
$ %%19isLM LM LMz 6:5G5G' "786
22 CS^^JTB 
$9

7	 !!"BGLYLM LM LM LM LM LM LMs=   I(C.II*B0I	I(-AI 	I(I	I((I1c                 F    t         j                  j                  | ||      S )N)true_fun	false_fun)r@   laxcond)predtrue_fnfalse_fns      r   r   r     s    77<<w(<CCr   c                 8     t        j                  |       |      S r   )r@   vmap)functionelementss     r   vectorized_mapr     s    388Hh''r   c                 B    t         j                  j                  | |      S r   )r@   r   map)fxss     r   r   r     s    77;;q"r   c                     t        |t              s#t        |t              r|dk  rt        d|       t        j
                  j                  | |||||      S )Nrk   zB`unroll` must be an positive integer or boolean. Received: unroll=)initr   lengthreverseunroll)r#   r   r   r=   r@   r   scan)r   r   r   r   r   r   s         r   r   r     sa    fd#&#&&1*$$*8-  77<<	FGF   r   c                 F    t         j                  j                  | |||      S r   )r@   r   associative_scan)r   elemsr   axiss       r   r   r     s    77##Augt<<r   c                     t        j                  ||j                        }t        t        j                  | dd            }|j
                  |   j                  |      S )Nr   )r>   zerosr.   r   moveaxisatadd)indicesvaluesr   r   keys        r   scatterr      sF    IIeV\\*E
Wb!,
-C88C=V$$r   c                     t        |       } t        j                  |      }t        j                  |      }| j                  t        |         j                  |      } | S r   )r1   r>   rL   	transposer   r   set)inputsr   updatess      r   scatter_updater   &  sJ    v&Fii GmmG$GYYuW~&**73FMr   c                 D    t         j                  j                  | ||      S r   )r@   r   dynamic_slice)r   start_indicesr   s      r   slicer   .  s    77  >>r   c                 D    t         j                  j                  | ||      S r   )r@   r   dynamic_update_slice)r   r   r   s      r   slice_updater   2  s    77''GGr   c                 D    t        j                  j                  | |g| S r   )r@   r   switch)indexbranchesoperandss      r   r   r   6  s    77>>%5H55r   c                      t        |t        t        f      rt        |      n|f}d}||fz   } fd}fd}n fd}fd}t        j                  j                  |||      }|d d }r|S |d   S )Nr   c                 &     | d d  | d   k  z  S )Nr   rV   )r   r   maximum_iterationss    r   _condzwhile_loop.<locals>._condG  s#    cr#tBx2D'DEEr   c                 L     | d d  }rt        |      n|f}|| d   dz   fz   S )Nr   rk   r   r   outputsbodyis_tuples     r   _bodyzwhile_loop.<locals>._bodyJ  s7    D"I&G(0eGnwjGd2hl_,,r   c                      |  S r   rV   )r   r   s    r   r   zwhile_loop.<locals>._condQ  s    ;r   c                 .     |  }rt        |      S |fS r   r   r   s     r   r   zwhile_loop.<locals>._bodyT  s    DkG%-5>=G:=r   r   )r#   r   r]   r@   r   
while_loop)	r   r   	loop_varsr   current_iterr   r   r   r   s	   `` `    @r   r   r   :  s     )eT]3H$,i 9,I%/		F	-		> gg  y9G%#2,7.GAJ.r   c                 F    t         j                  j                  | |||      S r   )r@   r   	fori_loop)lowerupperbody_funinit_vals       r   r   r   ^  s    77UE8X>>r   c                 x    t        | t              r| j                  } t        j                  j                  |       S r   )r#   r   r&   r@   r   stop_gradient)variables    r   r   r   b  s*    (H%>>77  **r   c           	          t        | j                  |         D cg c]%  }t        j                  j	                  | ||d      ' c}S c c}w )NF)keepdims)ranger   r@   r   index_in_dim)rH   numr   rb   s       r   unstackr   h  sI     qwwt}% 	Q4%8  s   *Ac                       y)Nuint32rV   rV   r   r   random_seed_dtyper  o  s    r   c                 .    t        j                  |       S )Nfun)r@   custom_gradientr  s    r   r  r  t  s    3''r   c                 ,    t        j                  |       S )zImplementation of rematerialization.

    Args:
        f: The function or operation to rematerialize.
    Returns:
        A function wrapping f that defines a custom gradient, which
        recomputes f on the backwards pass of a gradient call.
    )r@   
checkpoint)r   s    r   rematr
  x  s     >>!r   c                   .     e Zd Z fdZd Z fdZ xZS )r   c                 Z    t        |   |fi | t        j                  |      | _        y r   )r   r   r@   named_scope_jax_name_scope)r   namer   r   s      r   r   zname_scope.__init__  s&    (("t4r   c                 H   t        j                  dg d      }| j                  rK|rI|d   j                  }|d   j                  }| j                  | j                  |u r| j                  |k(  r| S |j                  |        d| _        | j                  j                          | S )Nname_scope_stackT)defaultset_to_defaultr   )	r   r    deduplicatecallerr  rs   _pop_on_exitr  	__enter__)r   r  parent_callerparent_names       r   r  zname_scope.__enter__  s    '<<4
  0,R077M*2.33K'KK=0II,% &&(r   c                 v    t        |   |i | | j                  r | j                  j                  |i | y y r   )r   __exit__r  r  )r   r   r   r   s      r   r  zname_scope.__exit__  s>    $)&))D  ))4:6: r   )r5   r6   r7   r   r  r  r8   r9   s   @r   r   r     s    5$; ;r   r   c                     t        | t              r&| j                         } t        j                  |       }n+t        | t
        j                        st        d|  d      | }t        j                  |      S )Nz|Invalid value for argument `device_name`. Expected a string like 'gpu:0' or a `jax.Device` instance. Received: device_name='')	r#   r   r   r   _to_backend_devicer@   Devicer=   default_device)device_name
jax_devices     r   device_scoper#    sn    +s#!'')%88E
SZZ0&&1]!5
 	
 !
j))r   )NNN)NNFrk   )Fr   r   )Nr   )7r@   jax.experimental.sparseexperimentalr/   rC   	jax.numpynumpyr>   rM   rK   	keras.srcr   keras.src.backend.commonr   r   r   %keras.src.backend.common.keras_tensorr   #keras.src.backend.common.name_scoper   base_name_scope(keras.src.backend.common.stateless_scoper	   'keras.src.backend.common.symbolic_scoper
   keras.src.backend.jaxr   SUPPORTS_SPARSE_TENSORSSUPPORTS_RAGGED_TENSORSIS_THREAD_SAFEr   r1   rO   rF   r   rS   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r#  rV   r   r   <module>r3     s    
 , ,     2 1 6 = M C A 2  !} !H'B-
MM`D(	=%?H6 	!/H?+
(	; ;:*r   