o
    0jt                     @  s   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mZ ddlZddlmZmZ ddlmZ dd	lmZmZ d
dlmZ G dd deZedef Zeg ef Zd1ddZd2ddZd3d d!Zd4d%d&Zd5d(d)Z d6d,d-Z!ed.G d/d0 d0eZ"dS )7z0Paddle dynamic graph runner and builder helpers.    )annotations)Path)AnyCallableDictListOptionalSequenceUnionN)	BaseModel
ConfigDict   )class_requires_deps)TemporaryDeviceChangerconstr_device   )InferenceRunnerc                   @  s4   e Zd ZU dZeddZdZded< dZded< dS )	PaddleDynamicRunnerConfigz+Engine config for paddle_dynamic inference.Zforbid)extraNOptional[str]device_typezOptional[int]	device_id)	__name__
__module____qualname____doc__r   model_configr   __annotations__r    r   r   w/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddlex/inference/models/runners/paddle_dynamic_runner.pyr      s
   
 
r   .engine_configDict[str, Any]returnr   c                 C  s8   |  d}|s	dS |  d}|dur|gnd}t||S )zAResolve the device string for Paddle dynamic runner construction.r   Nr   )getr   )r    r   r   
device_idsr   r   r   resolve_paddle_runner_device+   s   


r%   	model_dirr   	model_clsr   kwargs'PaddleDynamicRunner'c                 K  sR   t t| |j| fi |}W d   n1 sw   Y  |  t||dS )z;Build a PaddleDynamicRunner from a pretrained Paddle model.N)config)r   r%   Zfrom_pretrainedevalPaddleDynamicRunner)r&   r    r'   r(   modelr   r   r   &build_paddle_dynamic_pretrained_runner5   s
   r.   model_cls_loaderModelClassLoaderPaddleDynamicRunnerBuilderc                   s   ddd fdd}|S )z>Create a runner_builder callable for pretrained Paddle models.N)default_builder
model_namestrr&   r   r   Optional[Dict[str, Any]]r    r!   r2   $Optional[PaddleDynamicRunnerBuilder]r"   r   c                   s"   ~ ~~ }t d|||d S )N)r&   r    r'   r   )r.   )r3   r&   r   r    r2   r'   r(   r/   r   r   runner_builderI   s   z@create_pretrained_dynamic_runner_builder.<locals>.runner_builder)r3   r4   r&   r   r   r5   r    r!   r2   r6   r"   r   r   )r/   r(   r8   r   r7   r   (create_pretrained_dynamic_runner_builderC   s   r9   xDUnion[Sequence[np.ndarray], np.ndarray, Dict[str, np.ndarray], None]2Union[Sequence[np.ndarray], Dict[str, np.ndarray]]c                 C  s>   | du rd|v r|d } | du rt dt| tjr| gS | S )zENormalize input from __call__(x=..., **kwargs) to a sequence or dict.Nr:   z'PaddleDynamicRunner.__call__ requires x)	TypeError
isinstancenpndarray)r:   r(   r   r   r   _normalize_input]   s   rA   
np.ndarrayc                 C  s,   t | tjr| S t| dr|  S t| S )z!Convert tensor or array to numpy.numpy)r>   r?   r@   hasattrrC   Zasarray)r:   r   r   r   	_to_numpyk   s
   

rE   outputList[np.ndarray]c                 C  s2   | du rg S t | ttfrdd | D S t| gS )z)Convert model output to List[np.ndarray].Nc                 S  s   g | ]}t |qS r   )rE   ).0vr   r   r   
<listcomp>y   s    z#_output_to_list.<locals>.<listcomp>)r>   listtuplerE   )rF   r   r   r   _output_to_listt   s
   
rM   Zpaddlepaddlec                   @  s8   e Zd ZdZ		ddddZ	ddddZdddZdS )r,   z8InferenceRunner that wraps a Paddle dynamic graph model.Nr-   r   r*   r5   infer_fn#Optional[Callable[[Any, Any], Any]]r"   Nonec                 C  sX   || _ || _|p	i }|d}|r'|d}|dur|gnd}t||| _dS d| _dS )a  Wrap a dynamic model as an InferenceRunner.

        Args:
            model: The loaded model (eval mode).
            config: Engine config dict with device_type, device_id (like PaddleStaticRunner).
                Device is derived from config for inference.
            infer_fn: Optional custom inference function (model, x) -> output.
                Default: for Sequence (list/tuple) passes model(x); for dict passes model(**x).
        r   r   N)_model	_infer_fnr#   r   _device)selfr-   r*   rN   cfgr   r   r$   r   r   r   __init__   s   


zPaddleDynamicRunner.__init__r:   r;   r(   rG   c                 K  s   t ||}t| j? | jd ur| | j|}nt|tr&| jdi |}n| |}W d    t|S W d    t|S W d    t|S 1 sLw   Y  t|S )Nr   )rA   r   rS   rR   rQ   r>   dictrM   )rT   r:   r(   Zinputsoutr   r   r   __call__   s"   





zPaddleDynamicRunner.__call__c                 C  s   d S Nr   )rT   r   r   r   close   s   zPaddleDynamicRunner.close)NN)r-   r   r*   r5   rN   rO   r"   rP   rZ   )r:   r;   r(   r   r"   rG   )r"   rP   )r   r   r   r   rV   rY   r[   r   r   r   r   r,   }   s    r,   )r    r!   r"   r   )
r&   r   r    r!   r'   r   r(   r   r"   r)   )r/   r0   r(   r   r"   r1   )r:   r;   r(   r!   r"   r<   )r:   r   r"   rB   )rF   r   r"   rG   )#r   
__future__r   pathlibr   typingr   r   r   r   r   r	   r
   rC   r?   Zpydanticr   r   Z
utils.depsr   Zutils.devicer   r   Zinference_runnerr   r   r1   r0   r%   r.   r9   rA   rE   rM   r,   r   r   r   r   <module>   s(   $	






		