
    Vh                     V   d Z ddlZddlmZ ddlmZ ddlmZm	Z	  G d de      Z
	 	 	 ddej                  j                  d	eee      d
eee	      dedej                  j                   f
dZdej                  j                  fdZdej                  j                  d
ee   dee   fdZy)zKThis module contains utility method for mobile model optimization and lint.    N)Enum)_MobileOptimizerType)OptionalAnyStrc                       e Zd ZdZdZdZdZy)LintCode            N)__name__
__module____qualname__BUNDLED_INPUTREQUIRES_GRADDROPOUT	BATCHNORM     L/home/dcms/DCMS/lib/python3.12/site-packages/torch/utils/mobile_optimizer.pyr   r   	   s    MMGIr   r   script_moduleoptimization_blocklistpreserved_methodsbackendreturnc                 p    t         t        j                  j                        st	        dt                d      |
t               }|g }|D cg c]  }t        |       }}t         |      }t         fd|D              rt        t        ||z               }|D cg c]  }t         |      r| }}|rt        ddj                  |             |j                         }|dk(  r,t        j                  j!                   j"                  ||      }nl|dk(  r,t        j                  j%                   j"                  ||      }n;|dk(  r+t        j                  j'                   j"                  |      }nt	        d	      t        j                  j(                  j+                  |      S c c}w c c}w )
a  
    Optimize a torch script module for mobile deployment.

    Args:
        script_module: An instance of torch script module with type of ScriptModule.
        optimization_blocklist: A set with type of MobileOptimizerType. When set is not passed,
            optimization method will run all the optimizer pass; otherwise, optimizer
            method will run the optimization pass that is not included inside optimization_blocklist.
        preserved_methods: A list of methods that needed to be preserved when freeze_module pass is invoked
        backend: Device type to use for running the result model ('CPU'(default), 'Vulkan' or 'Metal').
    Returns:
        A new optimized torch script module
    Got , but ScriptModule is expected.c              3   6   K   | ]  }t        |        y w)N)hasattr).0methodr   s     r   	<genexpr>z&optimize_for_mobile.<locals>.<genexpr>1   s     
Rf7=&)
Rs   zAThe following methods to preserve do not exist in script_module: z, cpuvulkanmetalz:Unknown backend, must be one of 'CPU', 'Vulkan' or 'Metal')
isinstancetorchjitScriptModule	TypeErrortypesetstr(_get_bundled_inputs_preserved_attributesalllistr    AttributeErrorjoinlower_C_jit_pass_optimize_for_mobile_c$_jit_pass_vulkan_optimize_for_mobile#_jit_pass_metal_optimize_for_mobile
_recursivewrap_cpp_module)	r   r   r   r   r"   preserved_methods_strbundled_inputs_attributesnon_exist_methodsoptimized_cpp_modules	   `        r   optimize_for_mobiler@      s   $ mUYY%;%;<4&''FGI 	I %!$ 
 CT'TF'T'T HXm n

R8Q
RR $S)>AZ)Z%[ \.CjF7S`bhKijjOPTPYPYZkPlOmnp 	p mmoG%$xxEE"! # 
H	$xxLL"! # 
G	$xxKKML\L\^stTUU99//0DEE7 (U ks   F.!F33F3c                    t        | t        j                  j                        st	        dt        |        d      g }t        | d      s,|j                  t        j                  j                  dd       | j                         D ]B  \  }}|j                  s|j                  t        j                  j                  d| dd       D t        j                  j                  |       }|D ]k  }d|v r0|j                  t        j                  j                  d	| d
d       d|v s<|j                  t        j                   j                  d	| dd       m |S )z
    Generate a list of lints for a given torch script module.

    Args:
        script_module: An instance of torch script module with type of ScriptModule.

    Returns:
        lint_map: A list of dictionary that contains modules lints
    r   r   $_generate_bundled_inputs_for_forwardzNo bundled input for forward, please add bundled inputs before saving the module using torch.utils.bundled_inputs.augment_model_with_bundled_inputs.)namemessagezParam zw requires grad, please set torch.no_grad() to reduce memory usage and improve computation speed during inference phase.dropoutz	Operator z exists, remember to call eval() before saving the module.and call torch.utils.mobile_optimizer.optimize_for_mobile to drop dropout operator.
batch_normz exists, remember to call eval() before saving the module and call torch.utils.mobile_optimizer.optimize_for_mobile to drop batch_norm operator.)r'   r(   r)   r*   r+   r,   r    appendr   r   rC   named_parametersrequires_gradr   export_opnamesr   r   )r   	lint_listrC   paramop_namesop_names         r   generate_mobile_module_lintsrO   L   sv    mUYY%;%;<4&''FGI 	I I="HI("8"8"="= Ky z 	{ %557 3eh&<&<&A&APVW[V\ ]1 O1 2 33 yy''6H 
,h&6&6&;&;+4WI >* **+ , 7"h&8&8&=&=+4WI >* **+ ,
, r   c                 H   g }t        | d      r"|j                  d       |j                  d       t        | d      re|j                  d       | j                         }|D ]?  }||vr|j                  |       |j                  d|z          |j                  d|z          A |S )Nget_all_bundled_inputsget_num_bundled_inputs%get_bundled_inputs_functions_and_infoget_all_bundled_inputs_for__bundled_inputs_deflated_)r    rG   rS   )r   r   r=   all_infofunction_names        r   r/   r/   u   s     "}67!(()AB!(()AB }EF!(()PQ FFH% 	ZM$55)00?%,,-J]-Z[%,,-H=-XY		Z %$r   )NNCPU)__doc__r(   enumr   torch._Cr   MobileOptimizerTypetypingr   r   r   r)   r*   r-   r1   r.   RecursiveScriptModuler@   rO   r/   r   r   r   <module>r_      s    Q   @ #t  FJ48	:Fyy--:F (-@)A B:F $DL1:F 	:F "'!@!@	:Fz'		0F0F 'R%EII<R<R %gklogp %uyz}u~ %r   