
    6biY                     4   S r SSK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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r\" SS5       " S S\R>                  5      5       r S r!S r"S r#S r$g)zHome of the `Sequential` model.    N)layers)
base_layer)
functional)input_layer)training)training_utils)serialization_lib)serialization)model_serialization)generic_utils)layer_utils)
tf_inspect)tf_utils)traceback_utils)keras_exportzuAll layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.zkeras.Sequentialzkeras.models.Sequentialc                     ^  \ rS rSrSr\R                  R                  R                  \	R                  SU 4S jj5       5       r\U 4S j5       r\R                  R                  R                  \	R                  S 5       5       r\R                  R                  R                  \	R                  S 5       5       r\R                  R                  R                   SS j5       r\R$                  SU 4S jj5       rSU 4S	 jjrS
 rS rU 4S jr\SS j5       r\U 4S j5       r\R6                  S 5       r\S 5       rS rU 4S jrSrU =r $ )
Sequential/   a2  `Sequential` groups a linear stack of layers into a `tf.keras.Model`.

`Sequential` provides training and inference features on this model.

Examples:

```python
model = tf.keras.Sequential()
model.add(tf.keras.Input(shape=(16,)))
model.add(tf.keras.layers.Dense(8))

# Note that you can also omit the initial `Input`.
# In that case the model doesn't have any weights until the first call
# to a training/evaluation method (since it isn't yet built):
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(8))
model.add(tf.keras.layers.Dense(4))
# model.weights not created yet

# Whereas if you specify an `Input`, the model gets built
# continuously as you are adding layers:
model = tf.keras.Sequential()
model.add(tf.keras.Input(shape=(16,)))
model.add(tf.keras.layers.Dense(4))
len(model.weights)
# Returns "2"

# When using the delayed-build pattern (no input shape specified), you can
# choose to manually build your model by calling
# `build(batch_input_shape)`:
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(8))
model.add(tf.keras.layers.Dense(4))
model.build((None, 16))
len(model.weights)
# Returns "4"

# Note that when using the delayed-build pattern (no input shape specified),
# the model gets built the first time you call `fit`, `eval`, or `predict`,
# or the first time you call the model on some input data.
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(8))
model.add(tf.keras.layers.Dense(1))
model.compile(optimizer='sgd', loss='mse')
# This builds the model for the first time:
model.fit(x, y, batch_size=32, epochs=10)
```
c                 Z  > [         [        R                  U ]  USS9  SU l        SU l        SU l        SU l        SU l        SU l	        0 U l
        [        5       U l        SU l        SU l        U(       a9  [        U[         ["        45      (       d  U/nU H  nU R%                  U5        M     gg)zCreates a `Sequential` model instance.

Args:
  layers: Optional list of layers to add to the model.
  name: Optional name for the model.
F)nameautocastTN)superr   
Functional__init__supports_masking _compute_output_and_mask_jointly_auto_track_sub_layers_inferred_input_shape_has_explicit_input_shape_input_dtype_layer_call_argspecsset_created_nodes_graph_initialized_use_legacy_deferred_behavior
isinstancelisttupleadd)selfr   r   layer	__class__s       X/home/james-whalen/.local/lib/python3.13/site-packages/tf_keras/src/engine/sequential.pyr   Sequential.__init__b   s     	j##T33N $04-&+#%)").& $&!!e #( .3* ftUm44        c                 ~   > [         TU ]  nU(       a'  [        US   [        R                  5      (       a  USS  $ US S  $ )Nr      )r   r   r&   r   
InputLayer)r*   r   r,   s     r-   r   Sequential.layers   s=     jK,B,BCC!":ayr/   c                 x   [        US5      (       a0  UR                  S   n[        U[        R                  5      (       a  Un[        U[
        R                  5      (       a6  [        U[        R                  5      (       d  [        R                  " U5      nO[        SU S[        U5       S35      e[        R                  " U/5        U R                  U5      (       d  [!        SUR"                   S35      eSU l        SnU R'                  S	/ 5        U R(                  (       Gd  [        U[        R                  5      (       a  S
nOL[*        R,                  " U5      u  pEU(       a-  [        R.                  " UUUR"                  S-   S9nU" U5        S
nU(       a  [
        R0                  R3                  UR4                  S   R6                  5      n[9        U5      S:w  a  [!        [:        5      eXpl        [<        R>                  " U R6                  S   5      U l         S
U l        S
U l!        OpU R6                  (       a_  U" U R6                  S   5      n[9        [
        R0                  R3                  U5      5      S:w  a  [!        [:        5      eU/U l        S
U l        U(       d  U RD                  (       a.  U RG                  U R@                  U R6                  5        S
U l"        O-U R(                  RI                  U5        U RK                  U/5        [L        RN                  " URP                  5      U RR                  U'   g)a  Adds a layer instance on top of the layer stack.

Args:
    layer: layer instance.

Raises:
    TypeError: If `layer` is not a layer instance.
    ValueError: In case the `layer` argument does not
        know its input shape.
    ValueError: In case the `layer` argument has
        multiple output tensors, or is already connected
        somewhere else (forbidden in `Sequential` models).
_keras_historyr   zDThe added layer must be an instance of class Layer. Received: layer=z	 of type .zGAll layers added to a Sequential model should have unique names. Name "za" is already the name of a layer in this model. Update the `name` argument to pass a unique name.F_self_tracked_trackablesT_inputbatch_shapedtyper   r1   N)*hasattrr5   r&   r   r2   tfModuler   Layerr   ModuleWrapper	TypeErrortyper   assert_no_legacy_layers_is_layer_name_unique
ValueErrorr   built_maybe_create_attributer7   r   get_input_shape_and_dtypeInputnestflatten_inbound_nodesoutputslenSINGLE_LAYER_OUTPUT_ERROR_MSGr   get_source_inputsinputsr   r$   _init_graph_networkappend#_handle_deferred_layer_dependenciesr   getfullargspeccallr!   )	r*   r+   origin_layer
set_inputsr:   r;   xrN   output_tensors	            r-   r)   Sequential.add   s   ( 5*++ //2L,(>(>??$eRYY''eZ%5%566"007##('4;-qB 
 	((%1))%00338::, ?))  

$$%?D,,,%!7!788 "
%3%M%M&" #))$/#"ZZ(2A !H!%J''//%*>*>r*B*J*JKw<1$$%BCC&);;DLLOL!
15.\\ "$,,q/2M277??=12a7 !>??)?DLDJ00$$T[[$,,?&*D#))00744eW=+5+D+DUZZ+P!!%(r/   c                    U R                   (       d  [        S5      eU R                  R                  5       nU R                  R                  U5        U R                   (       d+  SU l        SU l        SU l        SU l        SU l	        SU l
        gU R                  (       aa  / U R                   S   l        U R                   S   R                  /U l        U R                  U R                  U R
                  5        SU l        gg)zbRemoves the last layer in the model.

Raises:
    TypeError: if there are no layers in the model.
z!There are no layers in the model.NFr<   T)r   rB   r7   popr!   rN   rR   rG   r   r   r$   _outbound_nodesoutputrS   )r*   r+   s     r-   r^   Sequential.pop   s     {{?@@--113!!%%e,{{DLDKDJ)-D&-2D*&+D#$$.0DKKO+ KKO223DL$$T[[$,,?DJ	 %r/   c                    Ub  U R                   (       d  g [        R                  R                  R	                  5       (       a-  [        R
                  R                  R                  5       (       d  g U R                  (       GdU  U R                  (       GdB  [        U5      nU R                  c  UnO[        U R                  U5      nUGb  X0R                  :w  a  [        R                  " 5          [        R                  " UUU R                   S   R                   S-   S9nUn[#        5       nU R                    Hk  n[%        XpR&                  5         U" U5      n[)        [        R*                  R-                  U5      5      S:w  a  [/        [0        5      e[3        Xv5        UnUn	Mm     X`l         U R5                  UW	5        SU l        S S S 5        X0l        g g g g g !   SU l	           S S S 5        g = f!   SU l	         N5= f! , (       d  f       N>= f)Nr   r8   r9   Tr1   )r   r>   __internal__tf2enabledcompatv1#executing_eagerly_outside_functionsr   r%   r(   r   relax_input_shape
init_scoper   rJ   r   r"   clear_previously_created_nodesr#   rO   rK   rL   rF   rP    track_nodes_created_by_last_callrS   r$   )
r*   input_shapeinput_dtype	new_shaperR   layer_inputcreated_nodesr+   layer_outputrN   s
             r-   '_build_graph_network_for_inferred_shape2Sequential._build_graph_network_for_inferred_shape  s    dkk##++--99<<CCEE ...666  ,K))1'	-..	 %!;!;; ]]_(..$-)![[^008;F
 #)K$'EM!% 7!#6#6# ,1+=L" rww|<=B",-J"KK8N&2".M "-N +8'B 00A26/u %z .7*C < & 7 /V# BFD>"Q %_vB=A:y %_s>   .A!G>GAG>-G0	G-"G>-G>0	G;9G>>
Hc                 $  > U R                   (       a'  U R                  U R                  U R                  5        OPUc  [	        S5      eU R                  U5        U R                  (       d   [        U5      nXl        [        TU ])  U5        SU l        g )Nz+You must provide an `input_shape` argument.T)r$   rS   rR   rN   rF   rs   rG   r(   _build_input_shaper   build)r*   rm   r,   s     r-   rw   Sequential.buildl  sn    ""$$T[[$,,?" !NOO88E::#K0*5'k*
r/   c                   > U R                   (       d  [        R                  " U5      (       dP  [        U[        R                  5      (       d1  SU l        [        R                  R                  [        U5      U l	        O&U R                  UR                  UR                  5        U R                  (       aE  U R                  (       d&  U R                  U R                   U R"                  5        [$        T	U ]M  XUS9$ UnU R(                   H_  n0 nU R*                  U   R,                  nSU;   a  X6S'   SU;   a  X&S'   U" U40 UD6nUnS n[        R                  R                  X5      nMa     U$ )NT)r   maskrz   r   c                     [        U SS 5      $ )N_keras_mask)getattr)kts    r-   _get_mask_from_keras_tensor4Sequential.call.<locals>._get_mask_from_keras_tensor  s    r=$77r/   )r   r>   	is_tensorr&   Tensorr%   rK   map_structure_get_shape_tuplerv   rs   shaper;   r$   rG   rS   rR   rN   r   rW   r   r!   args)
r*   rR   r   rz   rN   r+   kwargsargspecr   r,   s
            r-   rW   Sequential.callz  s1   --<<''
62990M0M 6:2*,''*?*?$f+' <<LL&,, ""::((dllC7<<EE[[E
 F//6;;G !%vW$%-z"F-f-GF8 77(()DND' !( r/   c                 R    UnU R                    H  nUR                  U5      nM     U$ N)r   compute_output_shape)r*   rm   r   r+   s       r-   r   Sequential.compute_output_shape  s*    [[E..u5E !r/   c                 :    U R                  XS9n[        USS 5      $ )N)rz   r|   )rW   r}   )r*   rR   rz   rN   s       r-   compute_maskSequential.compute_mask  s#     ))F).wt44r/   c                   > / n[         R                  n[        U SS 5      (       a  [        R                  n[        TU ]   H  nUR                  U" U5      5        M     [        R                  R                  U 5      nU R                  US'   [        R                  " U5      US'   U R                  (       d  U R                  b  U R                  US'   U$ )Nuse_legacy_configr   r   build_input_shape)r	   serialize_keras_objectr}   legacy_serializationr   r   rT   r   Model
get_configr   copydeepcopy_is_graph_networkrv   )r*   layer_configsserialize_obj_fnr+   configr,   s        r-   r   Sequential.get_config  s    ,CC4,d333JJW^E
   !1%!89 $ **40v==7x%%$*A*A*M*.*A*AF&'r/   c                 P   SU;   a  US   nUR                  S5      nUS   nOS nUnU " US9nU H/  nSU;  n[        R                  " UUUS9n	UR                  U	5        M1     UR                  (       d3  W(       a,  [        U[        [        45      (       a  UR                  U5        U$ )Nr   r   r   )r   module)custom_objectsuse_legacy_format)	getlayer_moduledeserializer)   rR   r&   r(   r'   rw   )
clsr   r   r   r   r   modellayer_configr   r+   s
             r-   from_configSequential.from_config  s    V&>D &

+> ?"8,MD"M)L ( < ,,-"3E
 IIe * !,udm<<KK)*r/   c                 v   > [        U S5      (       a  U R                  $ U R                  (       a
  [        TU ]  $ g )N_manual_input_spec)r=   r   r   r   
input_specr*   r,   s    r-   r   Sequential.input_spec  s4    4-..***))7%%r/   c                     Xl         g r   )r   )r*   values     r-   r   r     s    "'r/   c                 .    [         R                  " U 5      $ r   )r   SequentialSavedModelSaver)r*   s    r-   _trackable_saved_model_saver'Sequential._trackable_saved_model_saver  s    "<<TBBr/   c                 n    U R                    H%  nUR                  UR                  :X  d  M  X!Ld  M%    g   g)NFT)r   r   )r*   r+   	ref_layers      r-   rE    Sequential._is_layer_name_unique  s-    IzzY^^+	0F % r/   c                 b   > U R                   (       a  g [        [        R                  U ]  5         g r   )r$   r   r   r   _assert_weights_createdr   s    r-   r   "Sequential._assert_weights_created  s$    "" 	j##TBDr/   )r   rv   r   r#   r$   r   r   r    r!   r   r%   rG   rR   rN   r   )NNr   )!__name__
__module____qualname____firstlineno____doc__r>   rc   tracking no_automatic_dependency_trackingr   filter_tracebackr   propertyr   r)   r^   rs   r   defaultrw   rW   r   r   r   classmethodr   r   setterr   rE   r   __static_attributes____classcell__)r,   s   @r-   r   r   /   s{   /b __>>%%"  & ?" H 	 	 __>>%%[Q & ?[Qz __>>%% & ?0 __>>'+\7 ?\7|  *X5$  6   ( ( C CE Er/   r   c                     [        U S5      (       aJ  U R                  n[        U[        5      (       a  U$ UR                  b  [        UR                  5       5      $ g g )Nr   )r=   r   r&   r(   rankas_list)tr   s     r-   r   r     sK    q'eU##L::!))r/   c                 x    U b  Uc  g [        U 5      [        U5      :w  a  g [        S [        X5       5       5      $ )Nc              3   8   #    U  H  u  pX:w  a  S OUv   M     g 7fr    ).0d1d2s      r-   	<genexpr>$relax_input_shape.<locals>.<genexpr>  s     N8Mfbr)8Ms   )rO   r(   zip)shape_1shape_2s     r-   ri   ri   
  s7    '/
7|s7|#NG8MNNNr/   c                 F   U R                    H^  nUR                  n[        R                  R	                  U5       H,  nUR
                   Vs/ s H  oUU;  d  M
  UPM     snUl        M.     M`     U R                    Vs/ s H  oUU;  d  M
  UPM     snU l         gs  snf s  snf )zARemove nodes from `created_nodes` from the layer's inbound_nodes.N)rM   inbound_layersr>   rK   rL   r_   )r+   rq   nodeprev_layers
prev_layerns         r-   rk   rk     s    $$))''//+6J%55*5a-9O5*J& 7 % '''aM+A'E*s   	BB=	B
Bc                 D   U R                   (       d  gUR                  U R                   S   5        U R                   S   R                  n[        R                  R                  U5       H4  nUR                  (       d  M  UR                  UR                  S   5        M6     g)zFAdds to `created_nodes` the nodes created by the last call to `layer`.Nr<   )rM   r)   r   r>   rK   rL   r_   )r+   rq   r   r   s       r-   rl   rl     sy    e**2./&&r*99Kggook2
%%%j88<= 3r/   )%r   r   tensorflow.compat.v2rf   v2r>   tf_keras.srcr   r   tf_keras.src.enginer   r   r   r   r   tf_keras.src.savingr	   tf_keras.src.saving.legacyr
   r   &tf_keras.src.saving.legacy.saved_modelr   tf_keras.src.utilsr   r   r   r   r    tensorflow.python.util.tf_exportr   rP   r   r   r   ri   rk   rl   r   r/   r-   <module>r      s     &  ! ! / * * + ( . 1 L F , * ) ' . :&   ";<LE&& LE =LE^O
>r/   