a
    7Sicx                     @   s   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 deZdejjeee  ee	e
  eejjd	d
dZejjdddZejje	e e	e dddZdS )zM
This module contains utility method for mobile model optimization and lint.
    N)Enum)MobileOptimizerType)OptionalSetListAnyStrc                   @   s   e Zd ZdZdZdZdZdS )LintCode            N)__name__
__module____qualname__BUNDLED_INPUTREQUIRES_GRADDROPOUT	BATCHNORM r   r   X/var/www/html/django/DPS/env/lib/python3.9/site-packages/torch/utils/mobile_optimizer.pyr   
   s   r   CPU)script_moduleoptimization_blocklistpreserved_methodsbackendreturnc           	         s"  t  tjjs tdt |du r.t }|du r:g }dd |D }t |}t	 fdd|D rxt
t|| }g }|D ]}t |s|| q|rtdd|| }|dkrtj j||}n>|d	krtj j|}n$|d
krtj j|}ntdtjj|S )a  
    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.Nc                 S   s   g | ]}t |qS r   )str.0methodr   r   r   
<listcomp>-       z'optimize_for_mobile.<locals>.<listcomp>c                    s   g | ]}t  |qS r   )hasattrr   r   r   r   r!   0   r"   zCThe following methods to preserve do not exist in script_module: {}z, cpuZvulkanZmetalz:Unknown backend, must be one of 'CPU', 'Vulkan' or 'Metal')
isinstancetorchjitScriptModule	TypeErrorformattypeset(_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   Zpreserved_methods_strbundled_inputs_attributesZnon_exist_methodsr    Zoptimized_cpp_moduler   r$   r   optimize_for_mobile   sF    


r=   r$   c                 C   s   t | tjjs tdt| g }t| dsB|t	j
jdd |  D ](\}}|jrJ|t	jjd|d qJtj| }|D ]H}d|v r|t	jjd|d d|v r|t	jjd	|d q|S )
z
    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   Z$_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 {} requires grad, please set torch.no_grad() to reduce memory usage and improve computation speed during inference phase.dropoutzOperator {} exists, remember to call eval() before saving the module.and call torch.utils.mobile_optimizer.optimize_for_mobile to drop dropout operator.
batch_normzOperator {} 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,   r#   r1   r   r   r>   named_parametersrequires_gradr   export_opnamesr   r   )r   Z	lint_listr>   paramop_namesop_namer   r   r   generate_mobile_module_lintsL   s.    

rH   )r   r   r   c                 C   sz   g }t | dr"|d |d t | drv|d |  }|D ]2}||vrX|| |d|  |d|  qB|S )NZget_all_bundled_inputsZget_num_bundled_inputs%get_bundled_inputs_functions_and_infoZget_all_bundled_inputs_for_Z_bundled_inputs_deflated_)r#   r1   rI   )r   r   r<   Zall_infofunction_namer   r   r   r.   q   s    





r.   )NNr   )__doc__r'   enumr   torch._Cr   typingr   r   r   r   r   r(   r)   r   RecursiveScriptModuler=   rH   r.   r   r   r   r   <module>   s       

<%