
    2Vh4                     v   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
 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 Z*d  Z+d+d!Z,d" Z- G d# d$      Z.ej^                  d%        Z0d& Z1y),    N)tree)KerasVariable)standardize_dtype)slice_along_axis)result_type)KerasTensor)StatelessScope)SymbolicScopeFTc                   &    e Zd Zd Zd ZddZd Zy)Variablec                     || _         y N)_valueselfvalues     L/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/backend/numpy/core.py_initializezVariable._initialize   s	        c                 P    t        j                  || j                        | _        y Ndtype)nparray_dtyper   r   s     r   _direct_assignzVariable._direct_assign   s    hhuDKK8r   Nc                     t        ||      S r   convert_to_tensor)r   r   r   s      r   _convert_to_tensorzVariable._convert_to_tensor   s     e44r   c                     | j                   S r   )r   )r   s    r   	__array__zVariable.__array__!   s    zzr   r   )__name__
__module____qualname__r   r   r!   r#    r   r   r   r      s    95r   r   c                    |rt        d      |rt        d      |t        |      }t        | t              r8|r*|| j                  k7  r| j
                  j                  |      S | j
                  S t        |       s2t        |      dk(  r$t        j                  |       j                  |      S |=t        t        j                  |       D cg c]  }t        |dt        |             c} }t        j                  | |      S c c}w )Nz1`sparse=True` is not supported with numpy backendz1`ragged=True` is not supported with numpy backendbfloat16r   r   )
ValueErrorr   
isinstancer   r   r   astype	is_tensorr   asarrayr   r   flattengetattrtyper   )xr   sparseraggeditems        r   r    r    %   s    LMMLMM!%(!XUagg%77>>%((wwQ<-e4
B zz!}##E**}=A\\!_MTgdGT$Z0M
 88AU## Ns   Dc                 ,    t        j                  |       S r   )r   r   r2   s    r   convert_to_numpyr8   ;   s    88A;r   c                 Z    t        | t        j                  t        j                  f      ryy)NTF)r+   r   genericndarrayr7   s    r   r-   r-   ?   s    !bjj"**-.r   c                     | j                   S r   )shaper7   s    r   r=   r=   E   s    77Nr   c                     t        | |      S r   r   )r2   r   s     r   castr?   I   s    Qe,,r   c                 "    | r |       S  |       S r   r'   )predtrue_fnfalse_fns      r   condrD   M   s    y:r   c           
      V   t        |t        t        f      s)t        j                  |D cg c]
  } | |       c}      S |d   j
                  d   }g }t        |      D ]*  }|j                   | |D cg c]  }||   	 c}             , t        j                  |      S c c}w c c}w Nr   )r+   listtupler   stackr=   rangeappend)functionelementsr2   
batch_sizeoutput_storeindexs         r   vectorized_maprQ   S   s    hu.xxh7!788a[&&q)
:& 	HEH)Eq!E()E FG	Hxx%% 8
 *Fs   B!3B&c                 V   t               5  t               5  d }t        t        j                  |t        j                  ||f                  }ddt        j                  fd||f      \  }} | |i |}|}|rt        j                  fd||f      \  }	}
 | |	i |
}t        j                  |      }t        j                  |      }g }t        ||      D ]s  \  }}t        |j                        }t        |j                        D ]  \  }}|||   k7  sd ||<    |j                  t        |t        |j                                     u t        j                   ||      }d }t        j                  ||      }d d d        d d d        S # 1 sw Y   xY w# 1 sw Y   S xY w)Nc                 @    t        | t              rd | j                  v S y)NF)r+   r   r=   r7   s    r   has_none_shapez+compute_output_spec.<locals>.has_none_shapeb   s    ![)qww&r   c                     t        | t              rSt        | j                        }|rt	        |      D ]  \  }}|	|||<    t        j                  || j                        S | S )N)r=   r   )r+   r   rG   r=   	enumerater   emptyr   )r2   
fill_valuer=   ies        r   convert_keras_tensor_to_numpyz:compute_output_spec.<locals>.convert_keras_tensor_to_numpyk   sf    ![)QWW )% 0 219'1E!H2 xx''  Hr   c                      | d      S )NS   rX   r'   r2   r[   s    r   <lambda>z%compute_output_spec.<locals>.<lambda>y   s    3A"E r   c                      | d      S )NY   r^   r'   r_   s    r   r`   z%compute_output_spec.<locals>.<lambda>   s    7bI r   c                 n    t        |       r)t        | j                  t        | j                              S | S r   )r-   r   r=   r   r   r7   s    r   convert_numpy_to_keras_tensorz:compute_output_spec.<locals>.convert_numpy_to_keras_tensor   s)    |"177,=agg,FGGHr   r   )r	   r
   anybuiltinsmapr   r/   map_structureziprG   r=   rV   rK   r   r   r   pack_sequence_as)fnargskwargsrT   none_in_shapeargs_1kwargs_1	outputs_1outputsargs_2kwargs_2	outputs_2
flat_out_1
flat_out_2flat_outx1x2r=   rY   rZ   rd   output_specr[   s                         @r   compute_output_specr|   _   s   		 8Q=? 8Q	
 LLtVn)EF
	  --E6N
 +(+	#11Iv FH F/h/Ii0Ji0JHj*5 QBRXX%bhh/ (DAqE!H}#'a( E3DRXX3N OPQ ++Ix@G	
 (()FPq8Q 8Qr s8Q 8Q 8Qr s*   FDFA&F FF	FF(c                 2      fd}t        |d|      \  }}|S )Nc                     d |      fS )Nr'   r'   )_r2   fs     r   gzmap.<locals>.g   s    1Q4xr   r'   )scan)r   xsr   r   yss   `    r   rg   rg      s      BOEArIr   c                    t        |       st        d|        t        |t              s#t        |t              r|dk  rt        d|       |t        d      t        j                        t        j                        fd}fd}g }t	        |      }	nKt        j                        }|D 
cg c]  }
t        |
       }}
|t	        |      nt        |d         d   }	t        j                        }|D cg c]  }t        |       }} ||      |D cg c]  }t        j                  |       }}}g }|rt        nd } |t        |	            D ]M  }|D cg c]  }||   	 }}t        |      dkD  r ||      nd } | ||      \  }}|j!                  ||n|       O t        j"                  d	 g ||       }||fS c c}
w c c}w c c}w c c}w )
N&`f` should be a callable. Received: f=   zB`unroll` must be an positive integer or boolean. Received: unroll=z3Got no `xs` to scan over and `length` not provided.c                 >    rt        j                  |       S | d   S rF   r   rj   )r2   input_is_sequencer   s    r   
pack_inputzscan.<locals>.pack_input   s!    /@t$$R+JadJr   c                 >    rt        j                  |       S | d   S rF   r   )r2   initoutput_is_sequences    r   pack_outputzscan.<locals>.pack_output   s!    1Ct$$T1-M1Mr   r   c                     | S r   r'   r7   s    r   r`   zscan.<locals>.<lambda>   s     r   c                  ,    t        j                  |       S r   )r   rI   )r   s    r   r`   zscan.<locals>.<lambda>   s    BHHRL r   )callable	TypeErrorr+   boolintr*   r   	is_nestedr/   r    r=   r   
zeros_likereversedrJ   lenrK   rh   )r   r   r   lengthreverseunrollr   r   xs_flatnelem	init_flatdummy_ycarryr   maybe_reversedrY   r2   xs_slice	packed_xsy	stacked_yr   r   s    ``                   @@r   r   r      s   A;@DEEfd#&#&&1*$$*8-  
zfnNOOr*-KN 
zK,,r"7>?t$T*??!-CK53DQ3GT"I5>?T"4(?I?y!D/89tr}}T"9G9E	B!(XkNE!H% 3")*QAaD**,/MA,=Jx(4	UI&q
		q}!'2	3
 "" #1"#5I )' @ @9 +s   ?G
G*G#/G(c                    	
 t               st        d        t        j                        }|D cg c]  }t	        |       }}|r$|D cg c]  }t        j                  |f       }} fdt        |d   j                           t        fd|dd  D              s2t        dj                  |D cg c]  }|j                   c}            d 		
fd
 
|      }|r$|D cg c]  }t        j                  |f       }}t        j                  |      S c c}w c c}w c c}w c c}w )	Nr   c                     t        j                  |       }t        j                  |      } ||      }t        j                  |      }|S r   )r   rj   r/   )a_flatb_flatabcc_flatelemsr   s         r   _combinez"associative_scan.<locals>._combine   sD    !!%0!!%0aGar   r   c              3   T   K   | ]  }t        |j                           k(   ! y wr   )r   r=   ).0r   axis	num_elemss     r   	<genexpr>z#associative_scan.<locals>.<genexpr>   s$     Mds4::d#$	1Ms   %(r   zNArray inputs to associative_scan must have the same first dimension. (saw: {})c           	      B   | j                   |   |j                   |   k(  s$| j                   |   |j                   |   dz   k(  sJ t        | j                         }| j                   |   dz  dz
  ||<   t        |j                         }|j                   |   dz  dz
  ||<   t        j                  |      }t        j                  t        |ddd|      |        t        j                  |      }t        j                  t        |ddd|      |       t        | j                        D cg c]  }ddg }}| j                   |   |j                   |   k(  rdnd||   d<   t        |j                        D cg c]  }ddg }	}| j                   |   |j                   |   k(  rddgnddg|	|<   | j                  t        j                  k(  rt        j                  nt        j                  }
 |
t        j                  ||      t        j                  ||	            S c c}w c c}w )z>Given two Tensors of static shape, interleave them along axis.r      r   N)r=   rG   r   zeroscopytor   rJ   ndimr   bool_
bitwise_oraddpad)r   r   r   a_shapeb_shapea_dilb_dilr   a_padb_padops              r   _interleavez%associative_scan.<locals>._interleave   s    GGDMQWWT]*aggdmqwwt}q?P.P	
P
 qww-)A-qww-)A-!
		"5!T1d;Q?!
		"5!T1d;Q?!&qvv/A!Q// wwt}=!1dB!&qvv/A!Q// ! >q!fQFdgg1R]]rvvFF5% FF5% 
 	
 0 0s   %H2Hc                    | d   j                      }|dk  r| S  | D cg c]  }t        |ddd       c}| D cg c]  }t        |dd d       c}      } 
|      }|dz  dk(  rA |D cg c]  }t        |dd       c}| D cg c]  }t        |dd d       c}      }n% || D cg c]  }t        |dd d       c}      }t        | |      D cg c]+  \  }}t        j                  t        |dd      |g      - }}}t        t        j                  t        j                  	      ||            S c c}w c c}w c c}w c c}w c c}w c c}}w )Nr   r   r   )stepr   r   )r   )
r=   r   ri   r   concatenaterG   rf   rg   	functoolspartial)r   r   r   reduced_elems	odd_elemsrZ   
even_elemsresultr   r   _scanr   s           r   r   zassociative_scan.<locals>._scan  s   !HNN4(	q=L  " !q"14@ " !q$QTB	
 -(	q=A!@IJ1!!Q6J # %Q4adCJ " # %Q4adCJ #&eZ"8

 v	 NN!$148&A

 
 LL!!+D9:y
 	
G K
s"   E	E
2EE
4E
!0E")r   r   r   r/   r    r   flipr   r=   allr*   formatrj   )r   r   r   r   
elems_flatr   scansscannedr   r   r   r   s   `` `    @@@@r   associative_scanr      s,   A;@DEEe$J6@Ad#D)AJA9CDbggdTG,D
D JqM''-.IMjnMM))/(233*
 	

>-
^ *E:?@w4'*@@  ..M BD 4h As   D.D3D88D=c                    t        |       } t        |      }t        j                  ||j                        }| j                  d   }||d  }t        j
                  | d|g      } t        j
                  |dgt        |      z         }t        | j                  d         D ]   }| |   }|t        |      xx   ||   z  cc<   " |S )Nr   r   r   )	r    r   r   r   r=   reshaperG   rJ   rH   )indicesvaluesr=   r   index_lengthvalue_shaperY   rP   s           r   scatterr   C  s    (Gv&FHHU&,,/E==$L&Kjj2|"45GZZtK'8 89F7==#$ )
eElvay() Lr   c                 v    t        j                  |      }t        j                  |      }|| t        |      <   | S r   )r   r   	transposerH   )inputsr   updatess      r   scatter_updater   S  s1    hhwGll7#G$F5>Mr   c           	          t        |      t        |      k(  sJ t        ||      D cg c]  \  }}t        j                  |||z           }}}t        j                  | }| |   S c c}}w r   )r   ri   r   arangeix_)r   start_indiceslengthsstartr   r   meshs          r   slicer   Z  sq    }W---
 !8E6 			%(G  667D$<s   #A&c           	          t        ||j                        D cg c]  \  }}t        j                  |||z           }}}t        j                  | }|| |<   | S c c}}w r   )ri   r=   r   r   r   )r   r   r   r   r   r   r   s          r   slice_updater   j  sb     !>E6 			%(G  667DF4LMs   #Ac                 p    t        | d      } t        j                  | dt        |      dz
        }  ||    | S )Nint32r   r   )r    r   clipr   )rP   branchesoperandss      r   switchr   w  s:    eW-EGGE1c(ma/0E8E?H%%r   c                 6   d}fd}t        |t        t        f      }|rt        |      n|f}t        j                  t
        |      } | | rD ||      r< || }t        |t        t        f      s|f}t        |      }|dz  } | | r	 ||      r<|r|S |d   S )Nr   c                     d u xs | k  S r   r'   )itermaximum_iterationss    r   r`   zwhile_loop.<locals>.<lambda>  s    '4/L4:L3L r   r   )r+   rH   rG   r   rh   r    )rD   body	loop_varsr   current_iteriteration_checkis_tuples      `   r   
while_loopr   }  s     LL  )eT]3H$,i 9,I""#4i@I
	
|<)$	)dE]3"I)$	 	
|< !92il2r   c                 >    |}t        | |      D ]  } |||      } |S r   )rJ   )lowerupperbody_funinit_valvalrY   s         r   	fori_loopr    s.    
C5%  q#Jr   c                     | S r   r'   r7   s    r   stop_gradientr    s    Hr   c                     t        j                  | |d      } t        | j                  d         D cg c]  }| |   	 c}S c c}w rF   )r   moveaxisrJ   r=   )r2   numr   rY   s       r   unstackr    s9    
AtQA
+,QAaD,,,s   Ac                       y)Nuint32r'   r'   r   r   random_seed_dtyper    s    r   c                       e Zd ZdZd Zd Zy)custom_gradientzSDecorator for custom gradients.

    Args:
        fun: Forward pass function.
    c                 <    t        j                  d       || _        y )Nz`custom_gradient` for the numpy backend acts as a pass-through to support the forward pass. No gradient computation or modification takes place.)warningswarnfun)r   r  s     r   __init__zcustom_gradient.__init__  s    	

 r   c                 0     | j                   |i |\  }}|S r   )r  )r   rl   rm   rr   r   s        r   __call__zcustom_gradient.__call__  s     TXXt.v.
r   N)r$   r%   r&   __doc__r  r  r'   r   r   r  r    s    r   r  c              #      K   d  y wr   r'   )device_names    r   device_scoper    s	     	s   c                 0    t        j                  d       | S )NzRematerialization memory optimization is not supported by the Numpy backend. Please switch to JAX, TensorFlow, or PyTorch to utilize this feature.)r  r  )r   s    r   rematr    s    MM	 
 Hr   )NNN)NNFr   )Fr   r   rF   )2rf   
contextlibr   r  numpyr   	keras.srcr   keras.src.backend.commonr   r   &keras.src.backend.common.backend_utilsr   keras.src.backend.common.dtypesr   %keras.src.backend.common.keras_tensorr   (keras.src.backend.common.stateless_scoper	   'keras.src.backend.common.symbolic_scoper
   SUPPORTS_SPARSE_TENSORSSUPPORTS_RAGGED_TENSORSIS_THREAD_SAFEr   r    r8   r-   r=   r?   rD   rQ   r|   rg   r   r   r   r   r   r   r   r   r  r  r  r  r  contextmanagerr  r  r'   r   r   <module>r,     s          2 6 C 7 = C A  } $,-&:z.bk/\  
& 	3,-
 ( 
 
r   