B
    d<                 @   s   d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ G dd dej	Z
edd	d
gZG dd dej	ZG dd deZejfddZdS )z(Utilities for collecting TFLite metrics.    N)Text)converter_error_data_pb2)metricsc               @   s   e Zd ZdZdZdZdZdS )	Componentz5Enum class defining name of the converter components.PREPARE_TF_MODELCONVERT_TF_TO_TFLITE_MODELOPTIMIZE_TFLITE_MODELN)__name__
__module____qualname____doc__r   r   r    r   r   V/var/www/html/venv/lib/python3.7/site-packages/tensorflow/lite/python/convert_phase.pyr      s   r   SubComponentItemname	componentc               @   s   e Zd ZdZdd Zedd Zedd Zedd	Z	ed
e
jZede
jZede
jZede
jZede
jZede
jZede
jZede
jZede
jZede
jZede
jZede
jZede
jZede
jZede
jZede
jZd	S )SubComponentzEnum class defining name of the converter subcomponents.

  This enum only defines the subcomponents in Python, there might be more
  subcomponents defined in C++.
  c             C   s   | j jS )N)valuer   )selfr   r   r   __str__1   s    zSubComponent.__str__c             C   s   | j jS )N)r   r   )r   r   r   r   r   4   s    zSubComponent.namec             C   s   | j jS )N)r   r   )r   r   r   r   r   8   s    zSubComponent.componentUNSPECIFIEDNVALIDATE_INPUTSLOAD_SAVED_MODELFREEZE_SAVED_MODELCONVERT_KERAS_TO_SAVED_MODEL)CONVERT_CONCRETE_FUNCTIONS_TO_SAVED_MODELFREEZE_KERAS_MODELFREEZE_CONCRETE_FUNCTIONOPTIMIZE_TF_MODEL+CONVERT_GRAPHDEF_USING_DEPRECATED_CONVERTERCONVERT_GRAPHDEFCONVERT_SAVED_MODELCONVERT_JAX_HLO#QUANTIZE_USING_DEPRECATED_QUANTIZER	CALIBRATEQUANTIZESPARSIFY)r	   r
   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r   r#   r$   r%   r&   r   r   r   r   r   *   sF   



r   c                   s8   e Zd ZdZ fddZejdddZdd Z  Z	S )	ConverterErrorz4Raised when an error occurs during model conversion.c                s$   t t| | g | _| | d S )N)superr(   __init__errors_parse_error_message)r   message)	__class__r   r   r*      s    zConverterError.__init__)
error_datac             C   s   | j | d S )N)r+   append)r   r/   r   r   r   append_error   s    zConverterError.append_errorc             C   sP   dt jji}x>| D ]2\}}||krt  }||_||_| | dS qW dS )a  If the message matches a pattern, assigns the associated error code.

    It is difficult to assign an error code to some errrors in MLIR side, Ex:
    errors thrown by other components than TFLite or not using mlir::emitError.
    This function try to detect them by the error message and assign the
    corresponding error code.

    Args:
      message: The error message of this exception.
    zFailed to functionalize Control Flow V1 ops. Consider using Control Flow V2 ops instead. See https://www.tensorflow.org/api_docs/python/tf/compat/v1/enable_control_flow_v2.N)r   ConverterErrorDataZ!ERROR_UNSUPPORTED_CONTROL_FLOW_V1itemserror_message
error_coder1   )r   r-   Zerror_code_mappingpatternr5   r/   r   r   r   r,      s    

z#ConverterError._parse_error_message)
r	   r
   r   r   r*   r   r2   r1   r,   __classcell__r   r   )r.   r   r(   ~   s   r(   c                sv    t krtdtkr tdtjkr<j kr<tdtjd fddtdfdd	fd
d}|S )a-  The decorator to identify converter component and subcomponent.

  Args:
    component: Converter component name.
    subcomponent: Converter subcomponent name.

  Returns:
    Forward the result from the wrapped function.

  Raises:
    ValueError: if component and subcomponent name is not valid.
  zGiven component name not foundz!Given subcomponent name not foundz+component and subcomponent name don't match)r/   c                s,    j | _| jsj| _t }||  d S )N)r   r   subcomponentr   r   ZTFLiteConverterMetricsZset_converter_error)r/   Ztflite_metrics)r   r8   r   r   report_error   s
    z#convert_phase.<locals>.report_error)r4   c                s   t  }| |_ | d S )N)r   r2   r4   )r4   r/   )r9   r   r   report_error_message   s    z+convert_phase.<locals>.report_error_messagec                s   t   fdd}|S )Nc           
      s   y
 | |S  t k
r^ } z6|jr<x$|jD ]}| q*W nt| |d W d d }~X Y n4 tk
r } zt| |d W d d }~X Y nX d S )N)r(   r+   str	Exception)argskwargsZconverter_errorr/   error)funcr9   r:   r   r   wrapper   s    
z8convert_phase.<locals>.actual_decorator.<locals>.wrapper)	functoolswraps)r@   rA   )r9   r:   )r@   r   actual_decorator   s    z'convert_phase.<locals>.actual_decorator)r   
ValueErrorr   r   r   r   r2   r   )r   r8   rD   r   )r   r9   r:   r8   r   convert_phase   s    

	rF   )r   collectionsenumrB   typingr   Ztensorflow.lite.python.metricsr   r   Enumr   
namedtupler   r   r<   r(   r   rF   r   r   r   r   <module>   s   
T'