o
    ei/                     @   sd   d dl mZ d dlZd dlmZ d ZdZdZG dd dejj	Z
dddedfd	d
Z	dddZdS )    )OptionalN)_NnapiSerializer      c                       s   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dZejjde
ej fddZde
ej de
ej fddZ  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                    sD   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__ g/var/www/addictedbytheproject.nl/epg/venv/lib/python3.10/site-packages/torch/backends/_nnapi/prepare.pyr      s   


zNnapiModule.__init__argsc                 C   sd   | j d ur	td| j| j|| _dd | jD | _tjj	
 }|| j| j| j| j || _ d S )Nz'comp must be None before initializationc                 S   s   g | ]}|  qS r   )
contiguous).0wr   r   r   
<listcomp>5   s    z$NnapiModule.init.<locals>.<listcomp>)r   AssertionErrorr
   preparer   r	   r   torchclasses_nnapiCompilationinit2r   r   )r   r   r   r   r   r   init0   s   

zNnapiModule.initreturnc              	   C   sd  | j d u r
| | | j }|d u rtddd | jD }t|t| jkr5tdt| dt| j g }tt|D ],}| j| }|dkrR|||   q=|dkrf||| 	ddd	d  q=t
d
||| t|t| jkrtdt| dt| j tt| jD ] }| j| }|dv rq|dkr|| 	dd	dd||< qt
d
|S )Nzcomp must not be Nonec                 S   s   g | ]}t |qS r   )r   
empty_like)r   outr   r   r   r   F   s    z'NnapiModule.forward.<locals>.<listcomp>zargs length z != inp_mem_fmts length r   r   r      zInvalid mem_fmtzouts length z != out_mem_fmts length )r   r   )r   r$   r   r	   lenr   rangeappendr   permute
ValueErrorrunr   )r   r   r   outs
fixed_argsidxfmtr   r   r   forward@   s>   


 
zNnapiModule.forward)__name__
__module____qualname____doc__r   r   r    r!   r"   __annotations__listTensornnModuleintboolr   jitexportr$   r3   __classcell__r   r   r   r   r      s.   
 &r   Fc              	   C   s   t | ||||\}}}	}
}}t|||	|
|||}G dd dtjj}||}tj|}ddd tt	|D }|dk rAd}ndd	d t|D }|
d
| d| d| d |S )Nc                       s    e Zd ZdZ fddZ  ZS )z5convert_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                    s   t    || _d S r   )r   r   mod)r   rB   r   r   r   r      s   

z>convert_model_to_nnapi.<locals>.NnapiInterfaceWrapper.__init__)r4   r5   r6   r7   r   rA   r   r   r   r   NnapiInterfaceWrapper   s    rC   z, c                 s   s    | ]}d | V  qdS )arg_Nr   r   r1   r   r   r   	<genexpr>   s    z)convert_model_to_nnapi.<locals>.<genexpr>r   z
retvals[0] c                 s   s    | ]	}d | dV  qdS )zretvals[z], Nr   rE   r   r   r   rF      s    zdef forward(self, z):
    retvals = self.mod([z])
    return 
)process_for_nnapir   r   r;   r<   r?   scriptjoinr*   r)   define)modelinputs
serializerreturn_shapesuse_int16_for_qint16r   r   r
   ser_model_tensorused_weightsr   r   retval_countnnapi_modelrC   wrapper_model_pywrapper_modelarg_listret_exprr   r   r   convert_model_to_nnapii   sD   

rZ   c                 C   s   t j| } t|t jr|g}|ptd |d}|| ||\}}}}}	}
t j|t jd}G dd dt j	j
}t j| }dgdd |	D  }|d| ||||||
fS )	N)configrQ   )dtypec                   @   s   e Zd ZdZdS )z-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)r4   r5   r6   r7   r   r   r   r   ShapeComputeModule   s    r]   z\def prepare(self, ser_model: torch.Tensor, args: List[torch.Tensor]) -> List[torch.Tensor]:
c                 S   s   g | ]}d | dqS )z    rH   r   )r   liner   r   r   r      s    z%process_for_nnapi.<locals>.<listcomp>rG   )r   r?   freeze
isinstancer:   r   serialize_modeltensorint32r;   r<   rJ   rL   rK   )rM   rN   rO   rP   rQ   r   rS   r   r   shape_compute_linesrT   rR   r]   r
   real_shape_compute_linesr   r   r   rI      s:   
rI   )NNF)typingr   r    torch.backends._nnapi.serializerr    ANEURALNETWORKS_PREFER_LOW_POWER)ANEURALNETWORKS_PREFER_FAST_SINGLE_ANSWER&ANEURALNETWORKS_PREFER_SUSTAINED_SPEEDr;   r<   r   rZ   rI   r   r   r   r   <module>   s   ^
<