
    ¯wg^                     ^   d Z ddlZddlmZ ddlmZ ddlmZm	Z	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SetList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     a/home/mcse/projects/flask/flask-venv/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                 |    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               }g }|D ]   }t         |      r|j                  |       " |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 )
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"   append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_mobilerC      s   $ mUYY%;%;<4&''FGI 	I %!$ 
 CT'TF'T'T HXm n

R8Q
RR $S)>AZ)Z%[ \' -}f-$$V,- 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E= (Us   F9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"   r4   r
   r   rF   named_parametersrequires_gradr   export_opnamesr   r   )r   	lint_listrF   paramop_namesop_names         r   generate_mobile_module_lintsrQ   O   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"   r4   rU   )r   r   r@   all_infofunction_names        r   r1   r1   x   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+   r,   r0   RecursiveScriptModulerC   rQ   r1   r   r   r   <module>ra      s    Q   @ . .t  FJ48	=Fyy--=F (-@)A B=F $DL1=F 	=F "'!@!@	=F@'		0F0F 'R%EII<R<R %gklogp %uyz}u~ %r   