
    6bi&                         S r SSKJs  Jr  SSKJr  SSKJr  SSKJr	  SSK
Jr  SSK
Jr  SSK
Jr  SS	KJr  SS
KJr  SSKJr  \" SSS/S9\R*                  " S5       " S S\R,                  5      5       5       rg)z!Built-in WideNDeep model classes.    N)activations)backend)layers)
base_layer)data_adaptertraining)serialization_lib)deprecation)keras_exportz keras.experimental.WideDeepModelzkeras.models.WideDeepModel)v1c                   `   ^  \ rS rSrSrS
U 4S jjrS
S jrS rS rS r	\
S
S j5       rS	rU =r$ )WideDeepModel    a  Wide & Deep Model for regression and classification problems.

This model jointly train a linear and a dnn model.

Example:

```python
linear_model = LinearModel()
dnn_model = keras.Sequential([keras.layers.Dense(units=64),
                             keras.layers.Dense(units=1)])
combined_model = WideDeepModel(linear_model, dnn_model)
combined_model.compile(optimizer=['sgd', 'adam'],
                       loss='mse', metrics=['mse'])
# define dnn_inputs and linear_inputs as separate numpy arrays or
# a single numpy array if dnn_inputs is same as linear_inputs.
combined_model.fit([linear_inputs, dnn_inputs], y, epochs)
# or define a single `tf.data.Dataset` that contains a single tensor or
# separate tensors for dnn_inputs and linear_inputs.
dataset = tf.data.Dataset.from_tensors(([linear_inputs, dnn_inputs], y))
combined_model.fit(dataset, epochs)
```

Both linear and dnn model can be pre-compiled and trained separately
before jointly training:

Example:
```python
linear_model = LinearModel()
linear_model.compile('adagrad', 'mse')
linear_model.fit(linear_inputs, y, epochs)
dnn_model = keras.Sequential([keras.layers.Dense(units=1)])
dnn_model.compile('rmsprop', 'mse')
dnn_model.fit(dnn_inputs, y, epochs)
combined_model = WideDeepModel(linear_model, dnn_model)
combined_model.compile(optimizer=['sgd', 'adam'],
                       loss='mse', metrics=['mse'])
combined_model.fit([linear_inputs, dnn_inputs], y, epochs)
```

c                 t   > [         TU ]  " S0 UD6  Xl        X l        [        R
                  " U5      U l        g)a  Create a Wide & Deep Model.

Args:
  linear_model: a premade LinearModel, its output must match the output
    of the dnn model.
  dnn_model: a `tf.keras.Model`, its output must match the output of the
    linear model.
  activation: Activation function. Set it to None to maintain a linear
    activation.
  **kwargs: The keyword arguments that are passed on to
    BaseLayer.__init__. Allowed keyword arguments include `name`.
N )super__init__linear_model	dnn_modelr   get
activation)selfr   r   r   kwargs	__class__s        _/home/james-whalen/.local/lib/python3.13/site-packages/tf_keras/src/premade_models/wide_deep.pyr   WideDeepModel.__init__O   s0     	"6"("%//*5    c                    [        U[        [        45      (       a  [        U5      S:w  a  U=p4OUu  p4U R	                  U5      nU R
                  R                  (       a(  Uc  [        R                  " 5       nU R                  XBS9nOU R                  U5      n[        R                  R                  S XV5      nU R                  (       a*  [        R                  R                  U R                  U5      $ U$ )N   r   c                 
    X-   $ Nr   )xys     r   <lambda>$WideDeepModel.call.<locals>.<lambda>o   s    !%r   )
isinstancetuplelistlenr   r   _expects_training_argr   learning_phasetfnestmap_structurer   )r   inputsr	   linear_inputs
dnn_inputslinear_output
dnn_outputoutputs           r   callWideDeepModel.calla   s    &5$-00CK14D)//MJ(.%M))-8>>//"113
FJ
3J&& -
 ??77((&AAr   c                 |   [         R                  " U5      u  p#n[        R                  " 5        nU " USS9nU R	                  X6X@R
                  S9nS S S 5        U R                  R                  UWU5        [        U R                  [        [        45      (       a  U R                  R                  nU R                  R                  n	WR                  WX45      u  pU R                  S   nU R                  S   nUR!                  [#        X5      5        UR!                  [#        X5      5        OBU R                  nWR                  WU5      nU R                  R!                  [#        X5      5        U R$                   Vs0 s H  nUR&                  UR)                  5       _M      sn$ ! , (       d  f       GN]= fs  snf )NTr   )regularization_lossesr      )r   unpack_x_y_sample_weightr-   GradientTapecompiled_losslossescompiled_metricsupdate_stater'   	optimizerr)   r(   r   trainable_variablesr   gradientapply_gradientszipmetricsnameresult)r   datar#   r$   sample_weighttapey_predlosslinear_varsdnn_varslinear_grads	dnn_gradslinear_optimizerdnn_optimizerrB   gradsms                    r   
train_stepWideDeepModel.train_stepv   sh   *CCDIm__$!d+F%%= & D 
 	**1fmDdnntUm44++??K~~99H&*mm{-'#L  $~~a0 NN1-M,,S-KL))#i*BC"&":":MM$(;<ENN**3u+JK,0LL9Lq
"L99/ . :s   "F'?%F9'
F6c                    U R                  5       nU R                  5         [        U SS 5      b  U(       Ga  U R                  5       nU R	                  U R
                  5        U R                  U R                  -   U R                  -   n[        [        R                  " 5       [        5      (       d  U[        R                  " 5       /-  n[        U R                  [        [        45      (       a  U R                  S   nU R                  S   nOU R                  nU R                  n[        R                   " 5       R#                  5          [        R$                  " S5         / nUR'                  U R(                  R*                  U R,                  S9nXg-  nUR'                  U R.                  R*                  U R,                  S9nXh-  nX`R1                  S 5      -  nX`R1                  U R2                  5      -  nS S S 5        U R5                  5       n	U	 V
s/ s H"  n
[7        U
S5      (       d  M  U
R8                  PM$     nn
S S S 5        [        R$                  " S5         [        R:                  " UU R,                  /W-   4WSS.U R<                  D6n[?        U SU5        S S S 5        U R	                  U5        g g ! , (       d  f       N= fs  sn
f ! , (       d  f       N= f! , (       d  f       NH= f)Ntrain_functionr   r:   r	   )paramsrM   _call_result)updatesrG   ) ,_recompile_weights_loss_and_weighted_metrics$_check_trainable_weights_consistencygetattr_get_trainable_state_set_trainable_state_compiled_trainable_state_feed_inputs_feed_targets_feed_sample_weightsr'   r   symbolic_learning_phaseintrA   r)   r(   	get_graph
as_default
name_scopeget_updatesr   trainable_weights
total_lossr   get_updates_forr0   _get_training_eval_metricshasattrr[   function_function_kwargssetattr)r   has_recompiledcurrent_trainable_stater0   rR   rS   r\   linear_updatesdnn_updatesrF   rU   metrics_tensorsfns                r   _make_train_function"WideDeepModel._make_train_function   s   JJL113 4)408N&*&?&?&A#%%d&D&DE !!$$%++, 
 g==?EE7::<==$..4-88#'>>!#4  $q 1#'>>  $""$//1''
3 G%5%A%A#00BB!__ &B &N -G"/";";#~~??!__ #< #K *G33D99G33DKK@@G! 4$ 99; %#$q.1 #ANN$   #) 24 ##J/%%__%7 $)	
 ++ .3 0 %%&=>u =K* 43&#) 214 0/sD   KBJ76KK+K;KAK7
K	K
K
K,c                    [         R                  " U R                  5      n[         R                  " U R                  5      nUU[        R
                  " U R                  5      S.n[        R                  R                  U 5      n[        [        UR                  5       5      [        UR                  5       5      -   5      $ )Nr   r   r   )r
   serialize_keras_objectr   r   r   	serializer   r   Layer
get_configdictr)   items)r   linear_config
dnn_configconfigbase_configs        r   r   WideDeepModel.get_config   s    )@@
 '==dnnM
)#%//@

 !&&11$7D**,-V\\^0DDEEr   c                     UR                  S5      n[        R                  " X25      nUR                  S5      n[        R                  " XR5      n[        R                  " UR                  SS 5      US9nU " SUUUS.UD6$ )Nr   r   r   )custom_objectsr}   r   )poplayer_moduledeserializer   )clsr   r   r   r   r   r   r   s           r   from_configWideDeepModel.from_config   s    

>2#//NZZ,
 ,,ZH	 ,,JJ|T*>

  
%!
 	
 	
r   )r   r   r   r"   )__name__
__module____qualname____firstlineno____doc__r   r6   rV   rz   r   classmethodr   __static_attributes____classcell__)r   s   @r   r   r       s9    'R6$*:6A?FF 
 
r   r   )r   tensorflow.compat.v2compatv2r-   tf_keras.srcr   r   r   r   tf_keras.src.enginer   r   r	   keras_trainingtf_keras.src.savingr
   tensorflow.python.utilr    tensorflow.python.util.tf_exportr   deprecated_endpointsModelr   r   r   r   <module>r      sy    ( ! ! $   / * , : 1 / 9 &*,HI !!"DEJ
N(( J
 F	
J
r   