
    ~Wh[                     >   d Z ddlZddlmc 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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 edd           G d dej                              Z d Z!d Z"d Z#d Z$dS )zHome of the `Sequential` model.    N)layers)
base_layer)
functional)input_layer)training)training_utils)serialization)model_serialization)generic_utils)layer_utils)
tf_inspect)tf_utils)traceback_utils)
tf_logging)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                       e Zd ZdZej        j        j        ej	        d fd	                        Z
e fd            Zej        j        j        ej	        d                         Zej        j        j        ej	        d                         Zej        j        j        	 dd            Zej        d fd	            Zd fd		Zd
 Zd Z fdZedd            Ze fd            Zej        d             Zed             Zd Z fdZ xZS )
Sequentiala  `Sequential` groups a linear stack of layers into a `tf.keras.Model`.

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

    Examples:

    ```python
    # Optionally, the first layer can receive an `input_shape` argument:
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Dense(8, input_shape=(16,)))
    # Afterwards, we do automatic shape inference:
    model.add(tf.keras.layers.Dense(4))

    # This is identical to the following:
    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 `input_shape` argument.
    # 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 the input shape, the model gets built
    # continuously as you are adding layers:
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Dense(8, input_shape=(16,)))
    model.add(tf.keras.layers.Dense(4))
    len(model.weights)
    # Returns "4"

    # 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)
    ```
    Nc                    t          t          j        |                               |d           t          j                            d                              d           d| _        d| _	        d| _
        d| _        d| _        d| _        i | _        t                      | _        d| _        d| _        |r9t%          |t&          t(          f          s|g}|D ]}|                     |           dS dS )zCreates a `Sequential` model instance.

        Args:
          layers: Optional list of layers to add to the model.
          name: Optional name for the model.
        F)nameautocastr   TN)superr   
Functional__init__r   keras_api_gaugeget_cellsetsupports_masking _compute_output_and_mask_jointly_auto_track_sub_layers_inferred_input_shape_has_explicit_input_shape_input_dtype_layer_call_argspecs_created_nodes_graph_initialized_use_legacy_deferred_behavior
isinstancelisttupleadd)selfr   r   layer	__class__s       ]/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/keras/engine/sequential.pyr   zSequential.__init__i   s    	j#T**333NNN"++L99==dCCC $04-&+#%)").& $&!!ee #( .3*  	 ftUm44 "     		  	        c                     t                      j        }|r*t          |d         t          j                  r
|dd          S |d d          S )Nr      )r   r   r'   r   
InputLayer)r+   r   r-   s     r.   r   zSequential.layers   sL      	jK,BCC 	!"":aaayr/   c                    t          |d          r)|j        d         }t          |t          j                  r|}t          |t
          j                  r/t          |t          j                  st          j
        |          }n#t          d| dt          |           d          t          j        |g           |                     |          st!          d|j         d          d| _        d}|                     d	g            | j        st          |t          j                  rd
}nEt+          j        |          \  }}|r,t          j        |||j        dz             } ||           d
}|rt
          j                            |j        d         j                  }t9          |          dk    rt!          t:                    || _        t=          j        | j        d                   | _         d
| _        d
| _!        np| j        ri || j        d                   }t9          t
          j                            |                    dk    rt!          t:                    |g| _        d
| _        |s| j"        r(| #                    | j         | j                   d
| _"        n0| j        $                    |           | %                    |g           tM          j'        |j(                  | j)        |<   dS )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)*hasattrr4   r'   r   r2   tfModuler   Layerr   ModuleWrapper	TypeErrortyper   assert_no_legacy_layers_is_layer_name_unique
ValueErrorr   built_maybe_create_attributer6   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_inputsr9   r:   xrM   output_tensors	            r.   r*   zSequential.add   s   ( 5*++ 	% /2L,(>?? %$eRY'' 	eZ%566 8"077B#(B B37;;B B B  
 	(%111))%00 	)38:) ) )   

$$%?DDD, &	%!788 & "

%3%M& &"U  &#)$/#"Z(2  A E!HHH!%J 6'//%*>r*B*JKKw<<1$$$%BCCC&);DLOLL!
15.\ 	 "E$,q/22M27??=1122a77 !>???)?DLDJ 	>0 	>$$T[$,???&*D##)0077744eW===+5+DUZ+P+P!%(((r/   c                    | j         st          d          | j                                        }| j                            |           | j         s,d| _        d| _        d| _        d| _        d| _	        d| _
        dS | j
        rSg | j         d         _        | j         d         j        g| _        |                     | j        | j                   d| _        dS dS )zzRemoves 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   rA   r6   popr#   rM   rQ   rF   r    r!   r%   _outbound_nodesoutputrR   )r+   r,   s     r.   r\   zSequential.pop   s     { 	A?@@@-1133!%%e,,,{ 	DLDKDJ)-D&-2D*&+D###$ 	.0DKO+ KO23DL$$T[$,???DJJJ		 	r/   c                    || j         sd S t          j        j                                        r#t          j        j                                        sd S | j        s| j	        st          |          }| j        |}nt          | j        |          }|Q|| j        k    rGt          j                    5  t          j        ||| j         d         j        dz             }|}t#                      }| j         D ]}t%          || j                   	  ||          }n#  d| _	        Y  d d d            d S xY wt)          t          j                            |                    dk    rt/          t0                    t3          ||           |}|}	|| _        	 |                     ||	           d| _        n#  d| _	        Y nxY wd d d            n# 1 swxY w Y   || _        d S d S d S d S d S )Nr   r7   r8   Tr1   )r   r=   __internal__tf2enabledcompatv1#executing_eagerly_outside_functionsr!   r&   r)   r    relax_input_shape
init_scoper   rI   r   r   clear_previously_created_nodesr$   rN   rJ   rK   rE   rO    track_nodes_created_by_last_callrR   r%   )
r+   input_shapeinput_dtype	new_shaperQ   layer_inputcreated_nodesr,   layer_outputrM   s
             r.   '_build_graph_network_for_inferred_shapez2Sequential._build_graph_network_for_inferred_shape  s    dkF#++--	9<CCEE	 F.P	76P	7  ,,K)1'		-. 	 %!;;; ]__ <B <B(.$-)![^08;  F
 #)K$'EEM!% &/ &/ 7!4#6  # ,15+=+=LL# BFD>"FQ<B <B <B <B <B <B <B <BR rw|<<==BB",-J"K"KK8NNN&2".*7D'B 00AAA26//B=A:::y<B <B <B <B <B <B <B <B <B <B <B <B <B <B <Bz .7***aP	7 P	7 P	7 P	7 &%;;sJ   4AGDG	D2#G2A#GF43G4	F?=GGGc                 .   | j         r!|                     | j        | j                   nd|t	          d          |                     |           | j        s7t          |          }|| _        t                      
                    |           d| _        d S )Nz+You must provide an `input_shape` argument.T)r%   rR   rQ   rM   rE   rp   rF   r)   _build_input_shaper   build)r+   rj   r-   s     r.   rs   zSequential.buildt  s    " 		+$$T[$,????" !NOOO88EEE: +#K00*5'k***


r/   c                    | j         st          j        |          st          |t          j                  smd| _        t          j                            t          |          | _	        t          j
        j                                        rt          j        d| d           n |                     |j        |j                   | j        rK| j        s |                     | j        | j                   t/                                          |||          S |}| j        D ]V}i }| j        |         j        }d|v r||d<   d|v r||d<    ||fi |}|}d }t          j                            ||          }W|S )NTzVLayers in a Sequential model should only have a single input tensor. Received: inputs=z8. Consider rewriting this model with the Functional API.)r   maskru   r   c                 $    t          | dd           S )N_keras_mask)getattr)kts    r.   _get_mask_from_keras_tensorz4Sequential.call.<locals>._get_mask_from_keras_tensor  s    r=$777r/   )r!   r=   	is_tensorr'   Tensorr&   rJ   map_structure_get_shape_tuplerr   r`   ra   rb   loggingwarningrp   shaper:   r%   rF   rR   rQ   rM   r   rV   r   r#   args)
r+   rQ   r   ru   rM   r,   kwargsargspecrz   r-   s
            r.   rV   zSequential.call  s   - 	<'' 
6290M0M  6:2*,'*?*?$f+ +' ?&..00 OAG     <<L&,   " 	F: D((dlCCC77<<<EEE[ 	O 	OE
 F/6;G  !%vW$$%-z"eF--f--GF8 8 8 7(()DgNNDDr/   c                 H    |}| j         D ]}|                    |          }|S N)r   compute_output_shape)r+   rj   r   r,   s       r.   r   zSequential.compute_output_shape  s2    [ 	6 	6E..u55EEr/   c                 R    |                      ||          }t          |dd           S )N)ru   rw   )rV   rx   )r+   rQ   ru   rM   s       r.   compute_maskzSequential.compute_mask  s+     ))F)..wt444r/   c                 6   g }t                      j        D ])}|                    t          j        |                     *t
          j                            |           }| j        |d<   t          j
        |          |d<   | j        s| j        
| j        |d<   |S )Nr   r   build_input_shape)r   r   rS   r	   serialize_keras_objectr   Model
get_configr   copydeepcopy_is_graph_networkrr   )r+   layer_configsr,   configr-   s       r.   r   zSequential.get_config  s    WW^ 	N 	NE
   !Ee!L!LMMMM**400v=77x% 	B$*A*M*.*AF&'r/   c                 N   d|v r&|d         }|                     d          }|d         }nd }|} | |          }|D ]-}t          j        ||          }|                    |           .|j        s3|r1t          |t          t          f          r|                    |           |S )Nr   r   r   )r   )custom_objects)	getlayer_moduledeserializer*   rQ   r'   r)   r(   rs   )	clsr   r   r   r   r   modellayer_configr,   s	            r.   from_configzSequential.from_config  s    V&>D &

+> ? ?"8,MMD"M) 	 	L ,^  E IIe 	+!	+ ,udm<<	+
 KK)***r/   c                 j    t          | d          r| j        S | j        rt                      j        S d S )N_manual_input_spec)r<   r   r!   r   
input_specr+   r-   s    r.   r   zSequential.input_spec  s<    4-.. 	+**) 	&77%%tr/   c                     || _         d S r   )r   )r+   values     r.   r   zSequential.input_spec  s    "'r/   c                 *    t          j        |           S r   )r
   SequentialSavedModelSaver)r+   s    r.   _trackable_saved_model_saverz'Sequential._trackable_saved_model_saver  s    "<TBBBr/   c                 H    | j         D ]}|j        |j        k    r||ur dS dS )NFT)r   r   )r+   r,   	ref_layers      r.   rD   z Sequential._is_layer_name_unique  s9     	 	IzY^++	0F0Fuutr/   c                 r    | j         rd S t          t          j        |                                            d S r   )r%   r   r   r   _assert_weights_createdr   s    r.   r   z"Sequential._assert_weights_created   s:    " 	F 	j#T**BBDDDDDr/   )NNr   )__name__
__module____qualname____doc__r=   r`   tracking no_automatic_dependency_trackingr   filter_tracebackr   propertyr   r*   r\   rp   r   defaultrs   rV   r   r   r   classmethodr   r   setterr   rD   r   __classcell__)r-   s   @r.   r   r   /   sd       6 6p _>%#  #  #  #  #  &% ?># J 	 	 	 	 X	 _>%[Q [Q &% ?>[Qz _>%  &% ?>0 _>'+\7 \7 \7 ?>\7|      1 1 1 1 1 1f  5 5 5        [0     X ( ( ( C C XC  E E E E E E E E Er/   r   c                     t          | d          rH| j        }t          |t                    r|S |j        !t          |                                          S d S d S )Nr   )r<   r   r'   r)   rankas_list)tr   s     r.   r~   r~     sZ    q' eU## 	L:!)))t4r/   c                     | |d S t          |           t          |          k    rd S t          d t          | |          D                       S )Nc              3   0   K   | ]\  }}||k    rd n|V  d S r    ).0d1d2s      r.   	<genexpr>z$relax_input_shape.<locals>.<genexpr>  s2      NNfb"rrNNNNNNr/   )rN   r)   zip)shape_1shape_2s     r.   rf   rf     sS    '/t
7||s7||##tNNGW8M8MNNNNNNr/   c                     | j         D ]C}|j        }t          j                            |          D ]}fd|j        D             |_        Dfd| j         D             | _         dS )zARemove nodes from `created_nodes` from the layer's inbound_nodes.c                     g | ]}|v|	S r   r   r   nrn   s     r.   
<listcomp>z2clear_previously_created_nodes.<locals>.<listcomp>   s*     * * *-9O9O9O9O9Or/   c                     g | ]}|v|	S r   r   r   s     r.   r   z2clear_previously_created_nodes.<locals>.<listcomp>#  s*       1M+A+A+A+A+Ar/   N)rL   inbound_layersr=   rJ   rK   r]   )r,   rn   nodeprev_layers
prev_layers    `   r.   rh   rh     s    $  )'//+66 	 	J* * * *%5* * *J&&	   '  Er/   c                    | j         sdS |                    | j         d                    | j         d         j        }t          j                            |          D ])}|j        r |                    |j        d                    *dS )zFAdds to `created_nodes` the nodes created by the last call to `layer`.Nr;   )rL   r*   r   r=   rJ   rK   r]   )r,   rn   r   r   s       r.   ri   ri   (  s     e*2.///&r*9Kgook22 > >
% 	>j8<===> >r/   )%r   r   tensorflow.compat.v2rc   v2r=   kerasr   r   keras.enginer   r   r   r   r   keras.saving.legacyr	   keras.saving.legacy.saved_modelr
   keras.utilsr   r   r   r   r   tensorflow.python.platformr   r    tensorflow.python.util.tf_exportr   rO   r   r   r~   rf   rh   ri   r   r/   r.   <module>r      s    & %  ! ! ! ! ! ! ! ! ! ( ( ( ( ( ( # # # # # # # # # # # # $ $ $ $ $ $ ! ! ! ! ! ! ' ' ' ' ' ' - - - - - - ? ? ? ? ? ? % % % % % % # # # # # # " " " " " "             ' ' ' ' ' ' = < < < < < 9 9 9 9 9 9&   ";<<UE UE UE UE UE& UE UE =<UEp  O O O
 
 
> > > > >r/   