o
    2h                     @   s   d Z 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ZG dd dejZd	d
 Zdd Z	dddZ	dddZdd ZdS )z<JSON utilities for legacy saving formats (h5 and SavedModel)    N)serialization)serialization_lib)
tensorflow_EXTENSION_TYPE_SPECc                       s(   e Zd ZdZdd Z fddZ  ZS )Encoderz>JSON encoder and decoder that handles TensorShapes and tuples.c                 C   s:   t jrt|t jr|jdur| nd}d|dS t|S )zMEncodes objects for types that aren't handled by the default
        encoder.NTensorShape
class_nameitems)tf	available
isinstancer   rankas_listget_json_type)selfobjr
    r   ]/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/legacy/saving/json_utils.pydefault   s   
zEncoder.defaultc                    s   t  t|S N)superencode_encode_tuple)r   r   	__class__r   r   r      s   zEncoder.encode)__name__
__module____qualname____doc__r   r   __classcell__r   r   r   r   r      s    r   c                 C   sZ   t | trdtdd | D dS t | trdd | D S t | tr+dd |  D S | S )	N	__tuple__c                 s       | ]}t |V  qd S r   r   .0ir   r   r   	<genexpr>$       z _encode_tuple.<locals>.<genexpr>r   c                 S   s   g | ]}t |qS r   r#   r$   r   r   r   
<listcomp>'   s    z!_encode_tuple.<locals>.<listcomp>c                 S   s   i | ]	\}}|t |qS r   r#   )r%   keyvaluer   r   r   
<dictcomp>)   s    z!_encode_tuple.<locals>.<dictcomp>)r   tuplelistdictr
   )xr   r   r   r       s   


r   c                 C   s   t j| tdS )Nobject_hook)jsonloads_decode_helper)json_stringr   r   r   decode.   s   r7   c                 C   s   t j| tjtd||ddS )zFDecodes the JSON and deserializes any Keras objects found in the dict.T)deserializemodule_objectscustom_objectsr1   )r3   r4   	functoolspartialr5   )r6   r9   r:   r   r   r   decode_and_deserialize2   s   r=   Fc           	      C   s`  t | trd| v rtjra| d dkrt| d S | d dkr3ddlm} || d t	| d S | d d	kra| d
 }g }| d D ]\}}|
tj|tj|d qCtjjt	||ddS | d dkrrtdd | d D S | d dkrztS |rd| v rzd| vrtj| ||dW S tj| ||dW S  ty   Y | S w | d dkr| d dS | S )aJ  A decoding helper that is TF-object aware.

    Args:
      obj: A decoded dictionary that may represent an object.
      deserialize: Boolean. When True, deserializes any Keras
        objects found in `obj`. Defaults to `False`.
      module_objects: A dictionary of built-in objects to look the name up in.
        Generally, `module_objects` is provided by midlevel library
        implementers.
      custom_objects: A dictionary of custom objects to look the name up in.
        Generally, `custom_objects` is provided by the end user.

    Returns:
      The decoded object.
    r	   r   r
   TypeSpecr   type_spec_registry	type_spec
serializedCompositeTensorspectensors)dtypeTexpand_compositesr!   c                 s   r"   r   )r5   r$   r   r   r   r'   i   r(   z!_decode_helper.<locals>.<genexpr>__ellipsis____passive_serialization__module)r9   r:   	__bytes__r+   utf-8)r   r/   r   r   r   tensorflow.python.frameworkr@   lookup_deserializer5   appendconstantdtypesas_dtypenestpack_sequence_asr-   Ellipsisr   deserialize_keras_objectr   
ValueErrorr   )	r   r8   r9   r:   r@   rD   rE   rF   tensorr   r   r   r5   A   sV   

r5   c              	   C   s  t | drt| }d|d< |S t| jtjkr&t| tjr"| 	 S | 
 S t| r-| jS t| jtjkr8| jS tjrFt| tjjjrF| jS tjrSt| tjrS|  S tjr_t| tjr_| jS t| tjjrjt| S | tu rrddiS tjrt| tjrddlm} z|t| }d||  d	W S  t y   t d
|  dt|  dw tjrt| tj!j"rt#| }g }tj$j%| ddD ]}|&|j'j|( 	 f qdt)||dS t| t*j+r| jS t| t,rd| -ddS t.d
|  dt|  d)zSerializes any object to a JSON-serializable structure.

    Args:
        obj: the object to serialize

    Returns:
        JSON-serializable structure representing `obj`.

    Raises:
        TypeError: if `obj` cannot be serialized.
    
get_configTrJ   r	   rI   r   r?   r>   )r	   rA   rB   zUnable to serialize z% to JSON, because the TypeSpec class z has not been registered.rG   rC   )r	   rD   rE   rL   rM   )r	   r+   z to JSON. Unrecognized type .)/hasattrr   serialize_keras_objecttyper   npr   r   ndarraytolistitemcallabler   r   compatv1	Dimensionr+   r   r   DTypenamecollectionsabcMappingr/   rW   r>   rN   r@   get_name
_serializerY   __internal__rC   type_spec_from_valuerU   flattenrQ   rF   numpyr   enumEnumbytesr7   	TypeError)r   rB   r@   type_spec_namerD   rE   rZ   r   r   r   r      sj   



r   )NN)FNN)r   rj   rs   r;   r3   rr   r`   keras.src.legacy.savingr   keras.src.savingr   keras.src.utils.module_utilsr   r   r   JSONEncoderr   r   r7   r=   r5   r   r   r   r   r   <module>   s$    

D