
    קg                         d dl mZmZ d dlZd dlmZ d ZdZdZ G d dej	        j
                  Zdddedfd	Z	 dd
ZdS )    )ListOptionalN)_NnapiSerializer      c                       e Zd ZU dZeej        j        j                 e	d<   e
ej                 e	d<   e
ej                 e	d<   dej        j        dej        de
ej                 de
e         de
e         d	ed
ef fdZej        j        de
ej                 fd            Zde
ej                 de
ej                 fdZ xZS )NnapiModulezTorch Module that wraps an NNAPI Compilation.

    This module handles preparing the weights, initializing the
    NNAPI TorchBind object, and adjusting the memory formats
    of all inputs and outputs.
    compweightsout_templatesshape_compute_module	ser_modelinp_mem_fmtsout_mem_fmtscompilation_preferencerelax_f32_to_f16c                     t                                                       || _        || _        || _        || _        || _        g | _        d | _        || _	        || _
        d S N)super__init__r   r   r   r   r   r   r
   r   r   )	selfr   r   r   r   r   r   r   	__class__s	           Y/var/www/html/ai-engine/env/lib/python3.11/site-packages/torch/backends/_nnapi/prepare.pyr   zNnapiModule.__init__   sf     	$8!"((	&<# 0    argsc                 :   | j         J | j                            | j        |          | _        d | j        D             | _        t          j        j        	                                }|
                    | j        | j        | j        | j                   || _         d S )Nc                 6    g | ]}|                                 S  )
contiguous).0ws     r   
<listcomp>z$NnapiModule.init.<locals>.<listcomp>4   s     ===1===r   )r
   r   preparer   r   r   torchclasses_nnapiCompilationinit2r   r   )r   r   r
   s      r   initzNnapiModule.init0   s    y   !6>>t~tTT=====}#//11

NL'!		
 	
 	
 			r   returnc           	         | j         |                     |           | j         }|J d | j        D             }t          |          t          | j                  k    sJ g }t          t          |                    D ]}| j        |         }|dk    r.|                    ||                                                    C|dk    rD|                    ||                             dddd                                                     t          d          |
                    ||           t          |          t          | j                  k    sJ t          t          | j                            D ]J}| j        |         }|dv r|dk    r"||                             dddd          ||<   <t          d          |S )Nc                 6    g | ]}t          j        |          S r   )r$   
empty_like)r    outs     r   r"   z'NnapiModule.forward.<locals>.<listcomp>D   s#    DDD# %%DDDr   r   r   r      zInvalid mem_fmt)r   r   )r
   r)   r   lenr   rangeappendr   permute
ValueErrorrunr   )r   r   r
   outs
fixed_argsidxfmts          r   forwardzNnapiModule.forward?   s   9IIdOOOyDD1CDDD4yyC 1222222
T## 		4 		4C#C(C axx!!$s)"6"6"8"89999!!$s)"3"3Aq!Q"?"?"J"J"L"LMMMM !2333T"""4yyC 1222222T/0011 		4 		4C#C(C f}} I--aAq99S		 !2333r   )__name__
__module____qualname____doc__r   r$   r%   r&   r'   __annotations__r   TensornnModuleintboolr   jitexportr)   r:   __classcell__r   s   @r   r	   r	      sG          5='3
4444%,%%%%1#ho1 <1 el#	1
 3i1 3i1 !$1 1 1 1 1 1 1* Yel+    D. 43E        r   r	   Fc           	         t          | ||||          \  }}}	}
}}t          |||	|
|||          } G d dt          j        j                  } ||          }t          j                            |          }d                    d t          t          |                    D                       }|dk     rd}n,d                    d t          |          D                       }|
                    d	| d
| d| d           |S )Nc                   "     e Zd ZdZ fdZ xZS )5convert_model_to_nnapi.<locals>.NnapiInterfaceWrappera0  NNAPI list-ifying and de-list-ifying wrapper.

        NNAPI always expects a list of inputs and provides a list of outputs.
        This module allows us to accept inputs as separate arguments.
        It returns results as either a single tensor or tuple,
        matching the original module.
        c                 V    t                                                       || _        d S r   )r   r   mod)r   rM   r   s     r   r   z>convert_model_to_nnapi.<locals>.NnapiInterfaceWrapper.__init__   s$    GGDHHHr   )r;   r<   r=   r>   r   rG   rH   s   @r   NnapiInterfaceWrapperrK      sB        	 		 	 	 	 	 	 	 	 	r   rN   z, c              3       K   | ]	}d | V  
dS )arg_Nr   r    r8   s     r   	<genexpr>z)convert_model_to_nnapi.<locals>.<genexpr>   s(      DD#DDDDDDr   r   z
retvals[0] c              3   "   K   | ]
}d | dV  dS )zretvals[z], Nr   rQ   s     r   rR   z)convert_model_to_nnapi.<locals>.<genexpr>   s.      NN3.c...NNNNNNr   zdef forward(self, z):
    retvals = self.mod([z])
    return 
)process_for_nnapir	   r$   rA   rB   rE   scriptjoinr1   r0   define)modelinputs
serializerreturn_shapesuse_int16_for_qint16r   r   r   ser_model_tensorused_weightsr   r   retval_countnnapi_modelrN   wrapper_model_pywrapper_modelarg_listret_exprs                      r   convert_model_to_nnapirg   a   si     	vz=2F	 	
  K        -,[99I$$%566MyyDDs6{{1C1CDDDDDHa77NN%:M:MNNNNN	#X 	# 	##+	# 	#	# 	# 	#  
 r   c                 $   t           j                            |           } t          |t           j                  r|g}|pt          d |          }|                    | ||          \  }}}}}	}
t          j        |t           j                  } G d dt           j	        j
                  }t           j                             |                      }dgd |	D             z   }|                    d                    |                     ||||||
fS )N)configr^   )dtypec                       e Zd ZdZdS )-process_for_nnapi.<locals>.ShapeComputeModulezCode-gen-ed module for tensor shape computation.

        module.prepare will mutate ser_model according to the computed operand
        shapes, based on the shapes of args.  Returns a list of output templates.
        N)r;   r<   r=   r>   r   r   r   ShapeComputeModulerl      s        	 	 	 	r   rm   z\def prepare(self, ser_model: torch.Tensor, args: List[torch.Tensor]) -> List[torch.Tensor]:
c                     g | ]}d | d	S )z    rU   r   )r    lines     r   r"   z%process_for_nnapi.<locals>.<listcomp>   s     999T999r   rS   )r$   rE   freeze
isinstancer@   r   serialize_modeltensorint32rA   rB   rW   rY   rX   )rZ   r[   r\   r]   r^   r   r`   r   r   shape_compute_linesra   r_   rm   r   real_shape_compute_liness                  r   rV   rV      sN    IU##E&%,''  /*>     J 	""5&-@@|IU[AAA    UX_    !9++,>,>,@,@AAg 99%8999 : (@ A ABBB 	 r   )NNF)typingr   r   r$    torch.backends._nnapi.serializerr    ANEURALNETWORKS_PREFER_LOW_POWER)ANEURALNETWORKS_PREFER_FAST_SINGLE_ANSWER&ANEURALNETWORKS_PREFER_SUSTAINED_SPEEDrA   rB   r	   rg   rV   r   r   r   <module>r|      s    " ! ! ! ! ! ! !  = = = = = = $%  ,- ))* &P P P P P%(/ P P Pl A8 8 8 8x NS+ + + + + +r   