U
    Kc*                     @   s  d dl Z d dlZd dlmZm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ZdZG dd	 d	ZejejejejejejejejiZG d
d dZG dd dZejfddZejdejdfddZdd Z e!dddZ"ej#j$ee!ef dddZ%dS )    N)DictTuple)
TensorType)types)quantization_utilsz$com.github.apple.coremltools.versionz#com.github.apple.coremltools.sourcec                   @   s    e Zd ZdZdZdZdZdZdS )
ScalarTyper               N)__name__
__module____qualname__FloatDoubleIntLong	Undefined r   r   E/tmp/pip-unpacked-wheel-gikjz4vx/torch/backends/_coreml/preprocess.pyr      s
   r   c                   @   s   e Zd ZdZdZdZdS )CoreMLComputeUnitZcpuOnlyZ	cpuAndGPUallN)r   r   r   CPUZ	CPUAndGPUALLr   r   r   r   r       s   r   c                   @   s   e Zd ZdZdZdZdS )CoreMLQuantizationModeZlinearZlinear_symmetricnoneN)r   r   r   ZLINEARZLINEAR_SYMMETRICNONEr   r   r   r   r   %   s   r   c                 C   s   | |fS Nr   shapedtyper   r   r   
TensorSpec,   s    r!   Tc                 C   s   | |||||fS r   r   )inputsoutputsbackendallow_low_precisionquantization_modemlmodel_export_pathr   r   r   CompileSpec0   s    r(   c                 C   s"   | D ]}t |ttfs dS qdS )NFT)
isinstancelisttuple)r   sr   r   r   _check_enumerated_shape9   s    r-   )namec                 C   s0   | }t | rt| }t|t| d}||_|S )Nr   )r-   ctZEnumeratedShapesr   torch_to_mil_typesr.   )r   r    r.   Z	mil_shapeml_typer   r   r   _convert_to_mil_type@   s    
r2   )script_modulecompile_specc                 C   s  |d }|\}}}}}}g }	g }
t |D ]J\}}|\}}dt| }|
|t|t|g t|||}|	| q(tjj| dd }tj	||	d}|t
jkrtj|d|d}tj|}| }t|jjt|kstg }t |D ]6\}}|\}}|jj| j}||t|t|g qtjj|}t| |d k	rXtd|  || t|j|t|d	}|jt |jt d
}|
|||d}| }|tt|  t!"|dS )NZforwardZinput_c                 S   s   d S r   r   )xr   r   r   <lambda>T       zpreprocess.<locals>.<lambda>)r"      )nbitsr&   zSaving CoreML .mlmodel file to )Zspec_verr$   r%   )Zcoremltool_verZ	torch_ver)r"   r#   configmetadata)modelhashextra)#	enumeratestrappendr2   torchZjitZRecursiveScriptModuleZ
_constructr/   convertr   r   r   Zquantize_weightsmodelsZMLModelZget_speclendescriptionoutputAssertionErrorr.   r<   printsaveZspecificationVersionZuser_defined_metadataCT_METADATA_VERSIONCT_METADATA_SOURCEZSerializeToStringhashlibsha256	hexdigestjsondumps)r3   r4   specZinput_specsZoutput_specsr$   r%   r&   r'   Z
mil_inputsr"   indexinputr   r    r.   r1   r<   ZmlmodelZquant_model_specr#   rG   r:   r;   Zcoreml_compile_specr   r   r   
preprocessI   sX    


rU   )&rM   rP   typingr   r   Zcoremltoolsr/   rB   Z&coremltools.converters.mil.input_typesr   Zcoremltools.converters.mil.milr   Z!coremltools.models.neural_networkr   rK   rL   r   r   Zfp32r   Zfp64r   Zint32r   Zint64r0   r   r   r!   r   r   r(   r-   r@   r2   Z_CZScriptObjectrU   r   r   r   r   <module>   s<   
    
		