
    {-j9#                         d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZ ddlZddlmZmZmZ ddlmZ d	d
lmZ ddlmZ ddlmZ ddgZ G d de          Z ed           G d de                      ZdS )zONNX Runtime runner.    )PathLike)Path)AnyDictListOptionalSequenceUnionN)	BaseModel
ConfigDictmodel_validator   )class_requires_deps   )get_model_paths   )InferenceRunner)sort_inputsONNXRuntimeRunnerConfigONNXRuntimeRunnerc                      e Zd ZU dZ ed          ZdZee         e	d<   dZ
ee         e	d<   dZeee                  e	d<   dZeeeeeef                  eeef         f                  e	d<   dZee         e	d	<   dZee         e	d
<   dZee         e	d<   dZee         e	d<   dZee         e	d<   dZee         e	d<   dZee         e	d<   dZeeeef                  e	d<    ed          d             ZdS )r   z(Engine config for onnxruntime inference.forbid)extraNdevice_type	device_id	providersprovider_optionsgraph_optimization_levelintra_op_num_threadsinter_op_num_threadsexecution_modelog_severity_levelenable_mem_patternenable_cpu_mem_arenasession_optionsafter)modec                 J   | j         St          | j        t                    r9t	          | j                   t	          | j                  k    rt          d          | j         At          | j        t                    r't	          | j                   dk    rt          d          | S )Nz;Length mismatch between `providers` and `provider_options`.r   zQWhen `provider_options` is a dict, `providers` must contain exactly one provider.)r   
isinstancer   listlen
ValueErrordictselfs    s/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddlex/inference/models/runners/onnxruntime_runner.pycheck_provider_optionsz.ONNXRuntimeRunnerConfig.check_provider_options2   s     N&40$77 'DN##s4+@'A'AAAM   N&40$77 'DN##q((c       )__name__
__module____qualname____doc__r   model_configr   r   str__annotations__r   intr   r   r   r
   r   r   r   r   r    r!   r"   r#   boolr$   r%   r   r1    r2   r0   r   r       sz        22:H---L!%K#%%%#Ix}###%)IxS	")))NRhuT$sCx.%94S>%IJKRRR.2hsm222*.(3-...*.(3-...$(NHSM((((,,,,)----+/(4.///04OXd38n-444_'"""  #"  r2   onnxruntimec            
           e Zd ZdZ	 ddeeef         dedeeee	f                  ddf fdZ
	 ddeeej                 ej        df         d	e	deej                 fd
ZddZd ZdefdZd Zd Zd Zd Zd Zd Z xZS )r   zONNX Runtime inference runner.N	model_dirmodel_file_prefixconfigreturnc                    dd l }t                                                       t          |          | _        || _        t                              |pi                               d          | _	        || _
        |                                 | _        d | j                                        D             | _        d | j                                        D             | _        d S )Nr   T)exclude_nonec                     g | ]	}|j         
S r<   name.0metas     r0   
<listcomp>z.ONNXRuntimeRunner.__init__.<locals>.<listcomp>[   s    MMM4TYMMMr2   c                     g | ]	}|j         
S r<   rF   rH   s     r0   rK   z.ONNXRuntimeRunner.__init__.<locals>.<listcomp>\   s    OOODdiOOOr2   )r=   super__init__r   r?   r@   r   model_validate
model_dump_config_ort_create_sessionsession
get_inputs_input_namesget_outputs_output_names)r/   r?   r@   rA   ort	__class__s        r0   rN   zONNXRuntimeRunner.__init__K   s     	"!!!i!2.==flKKVV W 
 
 	++--MM4<3J3J3L3LMMMOODL4L4L4N4NOOOr2   xkwargsc                    |d|v r|d         }|t          d          t          |t          j                  r|g}t	          | j                  t	          |          k    r4t          dt	          | j                   dt	          |                     t          || j                  }d t          | j        |          D             }| j	        
                    | j        |          S )Nr[   z)`ONNXRuntimeRunner.__call__` requires `x`z/The number of inputs does not match the model: z vs c                 >    i | ]\  }}|t          j        |          S r<   )npascontiguousarray)rI   rG   input_s      r0   
<dictcomp>z.ONNXRuntimeRunner.__call__.<locals>.<dictcomp>q   s9     
 
 
f "&v..
 
 
r2   )	TypeErrorr)   r_   ndarrayr+   rV   r,   r   ziprT   runrX   )r/   r[   r\   feedss       r0   __call__zONNXRuntimeRunner.__call__^   s   
 9sA9GHHHa$$ 	At !!SVV++8t())8 8/21vv8 8  
 4,--
 
 #D$5q 9 9
 
 
 | 2E:::r2   c                     d S Nr<   r.   s    r0   closezONNXRuntimeRunner.closew   s    r2   c                     |                                  }|                                 }|                                 \  }}| j                            t          |          |||          S )N)sess_optionsr   r   )_get_model_path_build_session_options_resolve_providersrR   InferenceSessionr8   )r/   
model_pathr%   r   r   s        r0   rS   z!ONNXRuntimeRunner._create_sessionz   sl    ))++
5577&*&=&=&?&?#	#y))
OO(-	 * 
 
 	
r2   c                 l    t          | j        | j                  }d|vrt          d          |d         S )NonnxzNo valid ONNX model found)r   r?   r@   RuntimeError)r/   model_pathss     r0   rn   z!ONNXRuntimeRunner._get_model_path   s;    %dnd6LMM$$:;;;6""r2   c                 J   | j                                         }| j                            d          }|| j                             |          |_        | j                            d          }||                     |          |_        dD ]/}| j                            |          }|t          |||           0| j                            di           	                                D ]8\  }}t          ||          st          d|          t          |||           9|S )Nr   r!   )r   r    r"   r#   r$   r%   z%Invalid ONNX Runtime session option: )rR   SessionOptionsrQ   getGraphOptimizationLevelr   _resolve_execution_moder!   setattritemshasattrr,   )r/   rm   graph_levelr!   keyvalues         r0   ro   z(ONNXRuntimeRunner._build_session_options   s:   y//11l&&'ABB"48I4T4T5 5L1 ))*:;;%*.*F*F~*V*VL'
 		2 		2C L$$S))E c5111,**+<bAAGGII 	. 	.JC<-- R !P!P!PQQQL#u----r2   c                     t          |t                    r| j                            |          S |                                }|dv r| j        j        j        S |dv r| j        j        j        S t          d          )N>   
sequentialort_sequential>   parallelort_parallelzeInvalid `execution_mode`, expected one of 'sequential', 'parallel', 'ORT_SEQUENTIAL', 'ORT_PARALLEL'.)r)   r:   rR   ExecutionModelowerORT_SEQUENTIALORT_PARALLELr,   )r/   r!   r'   s      r0   r{   z)ONNXRuntimeRunner._resolve_execution_mode   s    nc** 	;9**>:::##%%3339*99///9*77J
 
 	
r2   c                 z   | j                             d          }| j                             d          }|?|                                 \  }}||}n;t          |t                    r|g|dd          }nt          |t                    r|g}|                     ||          }|                     |           ||fS )Nr   r   r   )rQ   ry   _default_providersr)   r-    _inject_default_provider_options_validate_providers)r/   r   r   default_provider_optionss       r0   rp   z$ONNXRuntimeRunner._resolve_providers   s    L$$[11	<++,>??262I2I2K2K/I/'#;  ,d33 U$4#T7OPQPRPR7S#T ($// 	2 01@@'
 
 	  +++***r2   c                     | j                             d          pd                                }| j                             d          }|dk    rdgd fS |dk    r|d}ddgd|ii gfS t          d          )	Nr   cpur   CPUExecutionProvidergpur   CUDAExecutionProviderzp`engine='onnxruntime'` only supports `device_type` of 'cpu' or 'gpu' unless `providers` is specified explicitly.)rQ   ry   r   r,   )r/   r   r   s      r0   r   z$ONNXRuntimeRunner._default_providers   s    |''66?%FFHHL$$[11	%*+T11% 	'& i("-. .
 I
 
 	
r2   c                     t          | j                                                  fd|D             }|r#t          d|dt	                    d          d S )Nc                     g | ]}|v|	S r<   r<   )rI   provider	availables     r0   rK   z9ONNXRuntimeRunner._validate_providers.<locals>.<listcomp>   s#    SSS9R9R89R9R9Rr2   z2Requested ONNX Runtime providers are unavailable: z. Available providers: .)setrR   get_available_providersru   sorted)r/   r   missingr   s      @r0   r   z%ONNXRuntimeRunner._validate_providers   s    	99;;<<	SSSSISSS 	?W ? ?(.y(9(9? ? ?  	 	r2   c                     |d |D             }nt          |          }| j                            d          }||S t          |          D ]\  }}|dk    rd|i||         ||<   |S )Nc                     g | ]}i S r<   r<   )rI   _s     r0   rK   zFONNXRuntimeRunner._inject_default_provider_options.<locals>.<listcomp>   s    666q666r2   r   r   )r*   rQ   ry   	enumerate)r/   r   r   r   idxr   s         r0   r   z2ONNXRuntimeRunner._inject_default_provider_options   s    #66I666#$455L$$[11	##&y11 	 	MC222)&s+) %
  r2   rj   )rB   N)r3   r4   r5   r6   r
   r8   r   r   r   r   rN   r	   r_   rd   r   rh   rk   rS   r   rn   ro   r{   rp   r   r   r   __classcell__)rZ   s   @r0   r   r   G   s       (( ,0	P Ph'P P c3h(	P
 
P P P P P P* <@; ;"*%rz478; ; 
bj		; ; ; ;2   	
 	
 	
# # # # #  >
 
 
+ + +&
 
 
(               r2   )r6   osr   pathlibr   typingr   r   r   r   r	   r
   numpyr_   pydanticr   r   r   
utils.depsr   utils.model_pathsr   inference_runnerr   utilsr   __all__r   r   r<   r2   r0   <module>r      s_                 = = = = = = = = = = = = = = = =     ; ; ; ; ; ; ; ; ; ; . . . . . . / / / / / / - - - - - -      $&9
:$ $ $ $ $i $ $ $N ]##q  q  q  q  q  q  q  $#q  q  q r2   