o
    toih                     @  s>   d dl mZ d dlmZ d dlZd dlmZmZ dddZdS )    )annotations)AnyN)
ModelProtoValueInfoProtomodelr   
input_dimsdict[str, list[Any]]output_dimsreturnc                   s   t   ddd}| | jj | | jj | | jj d fdd}| jjD ]}|j}|| }t|D ]\}}	|||	|| q5q(| jjD ]}
|
j}|| }t|D ]\}}	||
|	|| qSqFtj	|  | S )aM  This function updates the dimension sizes of the model's inputs and outputs to the values
    provided in input_dims and output_dims. if the dim value provided is negative, a unique dim_param
    will be set for that dimension.

    Example. if we have the following shape for inputs and outputs:

    * shape(input_1) = ('b', 3, 'w', 'h')
    * shape(input_2) = ('b', 4)
    * shape(output)  = ('b', 'd', 5)

    The parameters can be provided as:

    ::

        input_dims = {
            "input_1": ['b', 3, 'w', 'h'],
            "input_2": ['b', 4],
        }
        output_dims = {
            "output": ['b', -1, 5]
        }

    Putting it together:

    ::

        model = onnx.load('model.onnx')
        updated_model = update_inputs_outputs_dims(model, input_dims, output_dims)
        onnx.save(updated_model, 'model.onnx')
    dim_param_setset[str]value_infoslist[ValueInfoProto]r
   Nonec                 S  s:   |D ]}|j jj}|jD ]}|dr| |j qqd S )N	dim_param)typetensor_typeshapedimHasFieldaddr   )r   r   infor   r    r   P/home/ubuntu/.local/lib/python3.10/site-packages/onnx/tools/update_model_dims.pyinit_dim_param_set1   s   


z6update_inputs_outputs_dims.<locals>.init_dim_param_settensorr   r   r   jintnamestrc              
     s   | j jjj| }t|trN|dkr2|dr-|j|kr-td| d| d| d|j d	||_d S |d t	| }| v rItd	| d| d
||_
d S t|t	rX||_
d S tdt | )Nr   	dim_valuez!Unable to set dimension value to z
 for axis z of z'. Contradicts existing dimension value ._z-Unable to generate unique dim_param for axis z,. Please manually provide a dim_param value.z@Only int or str is accepted as dimension value, incorrect type: )r   r   r   r   
isinstancer   r   r    
ValueErrorr   r   	TypeError)r   r   r   r   	dim_protogenerated_dim_paramr   r   r   
update_dim>   s&   




z.update_inputs_outputs_dims.<locals>.update_dimN)r   r   r   r   r
   r   )
r   r   r   r   r   r   r   r   r
   r   )
setgraphinputoutput
value_infor   	enumerateonnxcheckercheck_model)r   r   r	   r   r)   input_
input_nameinput_dim_arrr   r   r-   output_nameoutput_dim_arrr   r(   r   update_inputs_outputs_dims   s(   #
	r8   )r   r   r   r   r	   r   r
   r   )	
__future__r   typingr   onnx.checkerr0   r   r   r8   r   r   r   r   <module>   s
   