o
    di                  	   @   s   d dl mZ d dlmZmZmZ d dlZd dlmZm	Z	 dej
dee fddZdej
dee fd	d
Zdee dee deee ee f fddZdedee fddZdej
defddZdeej
eef dedefddZdS )    )Path)ListTupleUnionN)ExternalDataInfo_get_initializer_tensorsmodelreturnc                 C   sJ   g }| j jD ]}|jdkr"|jD ]}|jj}|D ]}||j qqq|S )NConstant)graphnodeop_type	attributetexternal_dataappendvalue)r   external_constantsr   r   external_datasr    r   `/lsinfo/ai/hellotax_ai/llm_service/venv_embed/lib/python3.10/site-packages/optimum/onnx/utils.py_get_onnx_external_constants   s   

r   c                 C   s   t | }dd |D }|S )z
    Gets the paths of the external data tensors in the model.
    Note: make sure you load the model with load_external_data=False.
    c                 S   .   g | ]}| d r|jtjjkrt|jqS data_locationHasFieldr   onnxTensorProtoEXTERNALr   location.0tensorr   r   r   
<listcomp>)       z3_get_onnx_external_data_tensors.<locals>.<listcomp>)r   )r   model_tensorsmodel_tensors_extr   r   r   _get_onnx_external_data_tensors#   s
   r(   	src_paths	dst_pathsc                    s   |   }t|D ]P\tjtdd}t|}dd |D }tt|dkr?| j	|d      j	|d   q| 
fdd|D   
 fdd	|D  q|  fS )
z\
    Gets external data paths from the model and add them to the list of files to copy.
    Fload_external_datac                 S   r   r   r   r!   r   r   r   r$   :   r%   z,_get_external_data_paths.<locals>.<listcomp>   r   c                    s   g | ]} j | qS r   parentr"   tensor_name
model_pathr   r   r$   E       c                 3   s    | ]
}  j | V  qd S )Nr.   r0   )r*   idxr   r   	<genexpr>F   s    z+_get_external_data_paths.<locals>.<genexpr>)copy	enumerater   loadstrr   lensetr   r/   extend)r)   r*   model_pathsr   r&   r'   r   )r*   r5   r3   r   _get_external_data_paths1   s   r?   r3   c                    s>   t jt dd}t|}dd |D }t fdd|D S )z2
    Gets external data paths from the model.
    Fr+   c                 S   r   r   r   r!   r   r   r   r$   R   r%   z2_get_model_external_data_paths.<locals>.<listcomp>c                    s   h | ]} j | qS r   r.   r0   r2   r   r   	<setcomp>W   r4   z1_get_model_external_data_paths.<locals>.<setcomp>)r   r9   r:   r   list)r3   
onnx_modelr&   r'   r   r2   r   _get_model_external_data_pathsJ   s   rC   c                 C   s   t | }tdd |D S )z1
    Checks if the model uses external data.
    c                 s   s(    | ]}| d o|jtjjkV  qdS )r   N)r   r   r   r   r   r!   r   r   r   r6   _   s
    
z1check_model_uses_external_data.<locals>.<genexpr>)r   any)r   r&   r   r   r   check_model_uses_external_dataZ   s   rE   
input_namec                 C   sJ   t | ttfrt|  } tj| dd} | jjD ]
}|j|kr" dS qdS )z3
    Checks if the model has a specific input.
    Fr+   T)	
isinstancer:   r   as_posixr   r9   r   inputname)r   rF   rI   r   r   r   has_onnx_inpute   s   
rK   )pathlibr   typingr   r   r   r   onnx.external_data_helperr   r   
ModelProtor:   r   r(   r?   rC   boolrE   rK   r   r   r   r   <module>   s   .&