o
    ;ήc"                     @   s   d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlm	Z	m
Z
mZ ejejejedd d dlmZmZmZ d dlmZ dd Zdd	d
Zdd Z	dddZ	dddZdd Zdd Zedkrne  dS dS )    N)Path)
ModelProtoTensorProtonumpy_helperz..)fake_input_ids_datafake_input_mask_dataoutput_test_data)	OnnxModelc                  C   s   t  } | jddtdd | jddtd dd | jd	dtd
dd | jddtddd | jddtddd | jddtd dd | jddtd dd | jddtd dd | jddtd
dd | jddtddd | jddddd  | jdd! |  }|S )"Nz--modelTzbert onnx model path.)requiredtypehelpz--output_dirFz*output test data path. If not specified, .)r
   r   defaultr   z--batch_size   zbatch size of inputz--sequence_length   z maximum sequence length of inputz--global_tokens
   znumber of global tokensz--input_ids_namezinput name for input idsz--input_mask_namezinput name for attention maskz--global_mask_namez$input name for global attention maskz	--samplesz$number of test cases to be generatedz--seed   zrandom seedz	--verbose
store_truezprint verbose information)r
   actionr   )verbose)argparseArgumentParseradd_argumentstrintset_defaults
parse_args)parserargs r   d/tmp/pip-target-vg8gfxp4/lib/python/onnxruntime/transformers/models/longformer/generate_test_data.pyparse_arguments   s|   r    c                 C   s  t  }t| d}||  W d   n1 sw   Y  t|}| }|dur||}|du r;td| d}	|rO||}	|	du rOtd| d}
|rc||}
|
du rctd| d|	rhdnd |
rndnd }t||krtd| dt| ||	|
fS t|dkrtd		t|d}d}	d}
|D ]}|j
 }d
|v r|}
qd|v r|}	q|}q|r|	r|
r||	|
fS td)z0
    Get graph inputs for longformer model.
    rbNz Graph does not have input named r   r   zExpect the graph to have z inputs. Got r   z)Expect the graph to have 3 inputs. Got {}globalmaskz?Fail to assign 3 inputs. You might try rename the graph inputs.)r   openParseFromStringreadr	   'get_graph_inputs_excluding_initializersfind_graph_input
ValueErrorlenformatnamelower)	onnx_fileinput_ids_nameinput_mask_nameglobal_mask_namemodelf
onnx_modelgraph_inputs	input_ids
input_maskglobal_maskexpected_inputsinputinput_name_lowerr   r   r   get_longformer_inputsc   sN   





r<   c                 C   s   | j jj}|tjtjtjfv sJ |dkr@||ksJ tj||ftj	d}tj
||ftj	d}||d|jd d|jd f< n
tj||ftj	d}|tjkrVt|}|S |tjkr`t|}|S )z
    Fake data based on the graph input of segment_ids.
    Args:
        segment_ids (TensorProto): graph input of input tensor.
    Returns:
        data (np.array): the data for input tensor
    r   )dtypeNr   )r   tensor_type	elem_typer   FLOATINT32INT64npzerosint32onesshapefloat32int64)r8   
batch_sizesequence_lengthnum_global_tokens	data_typedatatempr   r   r   fake_global_mask_data   s   
"



rP   Fc                 C   s   |dusJ t j| t| g }t|D ]8}t|| ||}|j|i}|r1t|| ||
||j< |r=t|| ||	||j< |rJt|dkrJt	d| |
| q|S )z,
    Generate fake input data for test.
    Nr   zExample inputs)rC   randomseedranger   r,   r   rP   r*   printappend)rJ   rK   
test_casesdictionary_sizer   random_seedr6   r7   r8   rL   random_mask_length
all_inputs_input_1inputsr   r   r   fake_test_data   s"   



r^   c
                 C   s8   d}
t | |||
|||||||	}t||krtd |S )Ni'  z$Failed to create test data for test.)r^   r*   rT   )rJ   rK   rV   rR   r   r6   r7   r8   rL   rY   rW   rZ   r   r   r   generate_test_data   s"   r_   c              
   C   sN   t | |||	\}}}t|||||||||
	}t|D ]
\}}t||| qd S )N)r<   r_   	enumerater   )r2   
output_dirrJ   rK   rV   rR   r   r/   r0   r1   rL   r6   r7   r8   rZ   ir]   r   r   r   create_longformer_test_data   s   rc   c                  C   s   t  } | j}|d u rtjt| jjd| j	| j
| j}|d ur-t|}|jddd ntd t| j|| j	| j
| j| j| j| j| j| j| j td| d S )Nzb{}_s{}_g{}T)parentsexist_okz7Directory existed. test data files will be overwritten.z Test data is saved to directory:)r    ra   ospathjoinr   r2   parentr+   rJ   rK   global_tokensmkdirrT   rc   samplesrR   r   r/   r0   r1   )r   ra   rg   r   r   r   main  s2   
rm   __main__)NNN)F)r   rf   rQ   syspathlibr   numpyrC   onnxr   r   r   rg   rU   rh   dirname__file__bert_test_datar   r   r   r4   r	   r    r<   rP   r^   r_   rc   rm   __name__r   r   r   r   <module>   s,    
M8&
3
#
