o
    h                     @   s   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 deZ
			dd	ejjd
eee  deee	  dedejjf
ddZd	ejjfddZd	ejjdee dee fddZdS )zKThis module contains utility method for mobile model optimization and lint.    N)Enum)_MobileOptimizerType)Optional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   p/var/www/html/construction_image-detection-poc/venv/lib/python3.10/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|du rt }|du rg }dd |D }t |}t fdd|D r=t	t|| } fdd|D }|rRt
d	d
| | }|dkrdtj j||}n|dkrrtj j||}n|dkrtj j|}ntdtjj|S )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.Nc                 S   s   g | ]}t |qS r   )str.0methodr   r   r   
<listcomp>.   s    z'optimize_for_mobile.<locals>.<listcomp>c                 3   s    | ]}t  |V  qd S )Nhasattrr   r   r   r   	<genexpr>1   s    z&optimize_for_mobile.<locals>.<genexpr>c                    s   g | ]	}t  |s|qS r   r!   r   r#   r   r   r    4   s    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(_get_bundled_inputs_preserved_attributesalllist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   preserved_methods_strbundled_inputs_attributesnon_exist_methodsoptimized_cpp_moduler   r#   r   optimize_for_mobile   sD   
r@   c                 C   s   t | tjjstdt|  dg }t| ds"|tj	j
dd |  D ]\}}|jr;|tjj
d| dd q&tj| }|D ]&}d|v rX|tjj
d	| d
d d|v rj|tjj
d	| dd qD|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   rB   named_parametersrequires_gradr   export_opnamesr   r   )r   	lint_listrB   paramop_namesop_namer   r   r   generate_mobile_module_lintsL   s.   





rN   c                 C   sz   g }t | dr|d |d t | dr;|d |  }|D ]}||vr,|| |d|  |d|  q!|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"   rF   rQ   )r   r   r=   all_infofunction_namer   r   r   r/   u   s   





r/   )NNr   )__doc__r)   enumr   torch._Cr   MobileOptimizerTypetypingr   r   r   r*   r+   r.   r1   r   RecursiveScriptModuler@   rN   r/   r   r   r   r   <module>   s,   


=&)