o
    2h                     @   sL   d dl Zd dlmZ d dlmZ d dlmZ d dlmZ G dd deZ	dS )    N)tree)KerasAutoTrackable)tf_utils)trackingc                       sF   e Zd Zdd ZejjjdddZd fdd	Z	e
d	d
 Z  ZS )TFLayerc                 O   s   d | _ d | _g | _d S N)_saved_model_inputs_spec_saved_model_arg_spec_tracked)selfargskwargs r   ]/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/backend/tensorflow/layer.py__init__
   s   
zTFLayer.__init__Nc                 C   s   | j durdS ttj|}ttj|pg }i }| D ]"\}}t|}	dd |	D }
tdd |
D r7qt||
||< q|| _ |gt	| |f| _
dS )a  Defines the save spec so that serialization can trace layer calls.

        The TensorSpecs of the call function `inputs`, `args`, and `kwargs` are
        saved into a tuple of `([inputs] + args, kwargs)`.

        Args:
          inputs: possibly nested inputs passed into the call function.
          args: a list of positional arguments passed into call.
          kwargs: a dictionary of keyword arguments passed into call.
        Nc                 S   s   g | ]}t |qS r   )r   get_tensor_spec).0xr   r   r   
<listcomp>%   s    z*TFLayer._set_save_spec.<locals>.<listcomp>c                 s   s    | ]}|d u V  qd S r   r   )r   sr   r   r   	<genexpr>&   s    z)TFLayer._set_save_spec.<locals>.<genexpr>)r   r   map_structurer   r   itemsflattenanypack_sequence_aslistr	   )r   inputsr   r   inputs_spec	args_speckwargs_speckeykwarg
flat_kwarg
flat_specsr   r   r   _set_save_spec   s   


zTFLayer._set_save_spec
checkpointc           	         s   |dkrt | dd }t | dd }t | dd }d | _d | _d | _t j|fi |}|dkre|| _|| _|| _| jD ]+}t | |}t|tj	rLt
|||< t|tjrXt|||< t|tjrdt
|||< q9|S )N
savedmodeltrain_functiontest_functionpredict_function)getattrr(   r)   r*   super_trackable_childrenr
   
isinstancer   TrackedListr   TrackedDictdict
TrackedSet)	r   	save_typer   r(   r)   r*   childrentracked_attrtracked_item	__class__r   r   r-   0   s,   

zTFLayer._trackable_childrenc                    s   ddl m} ddlm} ddlm} t |sdS d}t |r-t dddur- jj	}nt |r5 j	}|durCt
dd |f}nt fd	d
 j D }tj|d fdd}|S )z>For SavedModel support: returns the default serving signature.r   )
Functional)Model)
SequentialN_functionalc                 S   s   t | j| jS r   )tf
TensorSpecshapedtype)r   r   r   r   <lambda>c   s    z1TFLayer._default_save_signature.<locals>.<lambda>c                 3   s$    | ]}t  fd d|V  qdS )c                    s   t |  jS r   )r=   r>   input_dtype)r   r   r   r   rA   i   s    z;TFLayer._default_save_signature.<locals>.<genexpr>.<lambda>N)r   map_shape_structure)r   valuerC   r   r   r   g   s    
z2TFLayer._default_save_signature.<locals>.<genexpr>)input_signaturec                    s    | S r   r   )r   rC   r   r   serving_defaultn   s   z8TFLayer._default_save_signature.<locals>.serving_default)keras.src.models.functionalr9   keras.src.models.modelr:   keras.src.models.sequentialr;   r.   r+   r<   inputr   r   tuple_build_shapes_dictvaluesr=   function)r   r9   r:   r;   r   rF   rG   r   rC   r   _default_save_signatureL   s.   



zTFLayer._default_save_signature)NN)r&   )__name__
__module____qualname__r   r=   __internal__r    no_automatic_dependency_trackingr%   r-   propertyrP   __classcell__r   r   r7   r   r   	   s    r   )

tensorflowr=   	keras.srcr   &keras.src.backend.tensorflow.trackabler   keras.src.utilsr   r   r   r   r   r   r   <module>   s    