
    ij<                     `    d 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dlm	Z	 	 	 d
dZ
d Zd	 Zy)z)PyTorch ExportedProgram export utilities.    N)treeconvert_spec_to_tensor)get_input_signature)io_utilsc                    ddl }t        |      }|j                  d      st        d|       t	        |      }|j                  d      }|t        |       }|dndt        j                  fd|      }t        |      }|t        ||      |d<   t        j                         5  t        j                  d	d
       	  |j                  j                  | |fi |}		 ddd       |j                  j#                  	|       ||nd}|rt%        j&                  d| d       |S # t        $ r}
t!        d|
       |
d}
~
ww xY w# 1 sw Y   hxY w)ab  Export the model as a PyTorch ExportedProgram (`.pt2`) artifact.

    Uses `torch.export.export` to capture the model's computation graph
    in an Ahead-of-Time (AOT) fashion. The resulting artifact contains
    only ATen-level operations and can be loaded via `torch.export.load`,
    run with `ExportedProgram.module()`, or compiled further with
    `torch.compile`.

    Args:
        model: The Keras model to export.
        filepath: `str` or `pathlib.Path` object. Path to save the
            exported artifact. Must end with `.pt2`.
        input_signature: Optional input signature. If `None`, inferred
            from the model's built input spec.
        verbose: `bool`. Whether to print a message after export.
            Defaults to `True`.
        **kwargs: Additional keyword arguments forwarded to
            `torch.export.export`, including `strict`, `dynamic_shapes`,
            `prefer_deferred_runtime_asserts_over_guards`, and
            `preserve_module_call_signature`. For a single-input model,
            `dynamic_shapes` can be a dict such as
            `{0: torch.export.Dim("batch", min=1, max=128)}`.
            Note: when `dynamic_shapes` is provided, the sample input used
            for tracing uses a batch size of 2 instead of 1. This avoids a
            PyTorch limitation where dimensions of size 1 are specialized
            to constants during export.

    Example:

    ```python
    model.export("path/to/model.pt2", format="torch")

    import torch
    loaded_program = torch.export.load("path/to/model.pt2")
    output = loaded_program.module()(torch.randn(1, 10))
    ```
    r   Nz.pt2zBThe PyTorch export requires the filepath to end with '.pt2'. Got: dynamic_shapes      c                     t        |       S )N)replace_none_numberr   )xr   s    k/var/www/html/emotional.easysim.app/public_html/venv/lib/python3.12/site-packages/keras/src/export/torch.py<lambda>zexport_torch.<locals>.<lambda>N   s    (#6
     ignorez*.*not properly registered as a submodule.*)messagezFailed to export model to PyTorch format. Common causes: unsupported operations, data-dependent control flow, or shape constraints not satisfied. Original error: Tz"Saved PyTorch ExportedProgram at 'z'.)torchstrendswith
ValueError_get_export_kwargsgetr   r   map_structuretuple_normalize_dynamic_shapeswarningscatch_warningsfilterwarningsexport	ExceptionRuntimeErrorsaver   	print_msg)modelfilepathinput_signatureverbosekwargsr   export_kwargsr	   sample_inputsexported_programeactual_verboser   s               @r   export_torchr/      s   X 8}HV$$:'
 	

 'v.M"&&'78N-e4  .9!q&&	
 		M -(M!*CM+
&' 
	 	 	" A	
	2u||22    & 
LL&1 ' 3WN?zLMO  	# $%#'
 	 s*   (ED''	E0D??EEEc                    dd l }t        j                  |j                  j                        j                  D ch c]  }|dvr|
 }}t        t        |       j                  |            }|r=dj                  t        |            }dj                  |      }t        d| d| d      | j                         D ci c]  \  }}||v r|| }}}|j                  dd       |S c c}w c c}}w )	Nr   >   modargsr)   z, z,Unsupported arguments for `format="torch"`: z. Supported arguments are: .strictF)r   inspect	signaturer    
parameterssortedset
differencejoinr   items
setdefault)	user_kwargsr   namesupported_arg_namesunknown_arg_namessupported_argsunknown_argsvaluer*   s	            r   r   r   t   s    %%ell&9&9:EE00 	 
 s;/::;NOP6*=#>?yy!23:n77GqJ
 	
 ',,.D%&& 	eM  Xu-/s   C&>C+c                 &   t        | t              rd| v sd| v r| S t        |      dk(  r| fgS | S t        | t        t        f      rLt        |       dk(  rt        | d   t        t        f      r| S t        |       t        |      k(  rt	        |       gS | S )Nr2   r)   r   r   )
isinstancedictlenlistr   )r	   r+   s     r   r   r      s    .$'^#x>'A!! }"#%&&.4-0~!#
1e})
 "! ~#m"44.)**r   )NN)__doc__r5   r   	keras.srcr   keras.src.export.export_utilsr   r   keras.src.utilsr   r/   r   r    r   r   <module>rO      s3    /    @ = $ 	eP:r   