Ë
    cQêjY  ã                   ó8  — 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
 d dlmZ de	dededed	ej                  f
d
„Zde	deded	ej                  fd„Zdedefd„Z	 d,de	dededededed	ej                  fd„Zdedeeej                  f   fd„Zdedededededede	de	de	dededefd„Z	 d-dededededede	de	de	dedededefd„Zd„ Z	 	 	 d.dededz  d edz  d!edz  d	eej                  dz  ej                  dz  ej                  dz  f   f
d"„Z	 	 	 d.d#ededz  d edz  d!edz  d	eej                  dz  ej                  dz  ej                  dz  f   f
d$„Zd%„ Zd&ed'edededededededz  d edz  d!edz  d(edededefd)„Zd*„ Ze d+k(  r e«        yy)/é    N)ÚPath)Ú
ModelProtoÚTensorProtoÚnumpy_helper)Ú	OnnxModelÚ	input_idsÚ
batch_sizeÚsequence_lengthÚdictionary_sizeÚreturnc                 ó(  — | j                   j                  j                  t        j                  t        j
                  t        j                  fv sJ ‚t        j                  j                  |||ft        j                  ¬«      }| j                   j                  j                  t        j                  k(  rt        j                  |«      }|S | j                   j                  j                  t        j                  k(  rt        j                  |«      }|S )a`  Create input tensor based on the graph input of input_ids

    Args:
        input_ids (TensorProto): graph input of the input_ids input tensor
        batch_size (int): batch size
        sequence_length (int): sequence length
        dictionary_size (int): vocabulary size of dictionary

    Returns:
        np.ndarray: the input tensor created
    )ÚsizeÚdtype)ÚtypeÚtensor_typeÚ	elem_typer   ÚFLOATÚINT32ÚINT64ÚnpÚrandomÚrandintÚint32Úfloat32Úint64)r   r	   r
   r   Údatas        úl/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/bert_test_data.pyÚfake_input_ids_datar      sÔ   € ð �>‰>×%Ñ%×/Ñ/Ü×ÑÜ×ÑÜ×Ñð4ñ ð ð ô �9‰9×Ñ˜_°JÀÐ3PÔXZ×X`ÑX`ÐÓa€Dà‡~�~×!Ñ!×+Ñ+¬{×/@Ñ/@Ò@Ü�z‰z˜$Óˆð €Kð 
�‰×	#Ñ	#×	-Ñ	-´×1BÑ1BÒ	BÜ�x‰x˜‹~ˆà€Kó    Úsegment_idsc                 ó  — | j                   j                  j                  t        j                  t        j
                  t        j                  fv sJ ‚t        j                  ||ft        j                  ¬«      }| j                   j                  j                  t        j                  k(  rt        j                  |«      }|S | j                   j                  j                  t        j                  k(  rt        j                  |«      }|S )a,  Create input tensor based on the graph input of segment_ids

    Args:
        segment_ids (TensorProto): graph input of the token_type_ids input tensor
        batch_size (int): batch size
        sequence_length (int): sequence length

    Returns:
        np.ndarray: the input tensor created
    ©r   )r   r   r   r   r   r   r   r   Úzerosr   r   r   )r    r	   r
   r   s       r   Úfake_segment_ids_datar$   1   sÌ   € ð ×Ñ×'Ñ'×1Ñ1Ü×ÑÜ×ÑÜ×Ñð6ñ ð ð ô �8‰8�Z Ð1¼¿¹ÔB€Dà×Ñ×#Ñ#×-Ñ-´×1BÑ1BÒBÜ�z‰z˜$Óˆð €Kð 
×	Ñ	×	%Ñ	%×	/Ñ	/´;×3DÑ3DÒ	DÜ�x‰x˜‹~ˆà€Kr   Úmax_sequence_lengthÚaverage_sequence_lengthc                 óš   — |dk\  r|| k  sJ ‚d|z  | kD  rt        j                  d|z  | z
  | «      S t        j                  dd|z  dz
  «      S )Né   é   )r   r   )r%   r&   s     r   Úget_random_lengthr*   L   sd   € Ø" aÒ'Ð,CÐGZÒ,ZÐZÐZð 	Ð"Ñ"Ð%8Ò8Ü�~‰~˜aÐ"9Ñ9Ð<OÑOÐQdÓeÐeä�~‰~˜a Ð%<Ñ!<¸qÑ!@ÓAÐAr   Ú
input_maskÚrandom_sequence_lengthÚ	mask_typec                 óÒ  — | j                   j                  j                  t        j                  t        j
                  t        j                  fv sJ ‚|dk(  r_t        j                  |t        j                  ¬«      }|r!t        |«      D ]  }t        ||«      ||<   Œ �nºt        |«      D ]  }|||<   Œ	 �n£|dk(  r«t        j                  ||ft        j                  ¬«      }|r5t        |«      D ]%  }t        ||«      }t        |«      D ]	  }	d|||	f<   Œ Œ' �n@t        j                  ||ft        j                  ¬«      }
|
|d|
j                  d   …d|
j                  d   …f<   nó|dk(  sJ ‚t        j                  |dz  dz   t        j                  ¬«      }|r{t        |«      D ]  }t        ||«      ||<   Œ t        |dz   «      D ]J  }|dkD  r|||z   dz
     ||dz
     z   nd|||z   <   |dkD  r|||z   dz
     ||dz
     z   nd|d|z  dz   |z   <   ŒL nDt        |«      D ]  }|||<   Œ	 t        |dz   «      D ]  }||z  |||z   <   ||z  |d|z  dz   |z   <   Œ  | j                   j                  j                  t        j                  k(  rt        j                  |«      }|S | j                   j                  j                  t        j                  k(  rt        j                  |«      }|S )a"  Create input tensor based on the graph input of segment_ids.

    Args:
        input_mask (TensorProto): graph input of the attention mask input tensor
        batch_size (int): batch size
        sequence_length (int): sequence length
        average_sequence_length (int): average sequence length excluding paddings
        random_sequence_length (bool): whether use uniform random number for sequence length
        mask_type (int): mask type - 1: mask index (sequence length excluding paddings). Shape is (batch_size).
                                     2: 2D attention mask. Shape is (batch_size, sequence_length).
                                     3: key len, cumulated lengths of query and key. Shape is (3 * batch_size + 2).

    Returns:
        np.ndarray: the input tensor created
    r(   r"   r)   Nr   é   )r   r   r   r   r   r   r   r   Úonesr   Úranger*   r#   Úshaper   r   )r+   r	   r
   r&   r,   r-   r   ÚiÚactual_seq_lenÚjÚtemps              r   Úfake_input_mask_datar7   V   s  € ð0 �?‰?×&Ñ&×0Ñ0Ü×ÑÜ×ÑÜ×Ñð5ñ ð ð ð �A‚~Ü�w‰w˜
¬2¯8©8Ô4ˆÙ!Ü˜:Ó&ò V�Ü+¨OÐ=TÓU��Q’òVô ˜:Ó&ò 2�Ø1��Q’ò2à	�aŠÜ�x‰x˜ _Ð5¼R¿X¹XÔFˆÙ!Ü˜:Ó&ò #�Ü!2°?ÐD[Ó!\�Ü˜~Ó.ò #�AØ!"�D˜˜A˜’Jñ#ò#ô
 —7‘7˜JÐ(?Ð@ÌÏÉÔQˆDØ59ˆD��4—:‘:˜a‘=� / D§J¡J¨q¡M /Ð1Ò2à˜AŠ~Ðˆ~Ü�x‰x˜ a™¨!Ñ+´B·H±HÔ=ˆÙ!Ü˜:Ó&ò V�Ü+¨OÐ=TÓU��Q’ðVô ˜:¨™>Ó*ò f�ØQRÐUVÒQV t¨J¸©N¸QÑ,>Ñ'?À$ÀqÈ1ÁuÁ+Ò'MÐ\]��Z !‘^Ñ$ØYZÐ]^ÒY^¨t°JÀ±NÀQÑ4FÑ/GÈ$ÈqÐSTÉuÉ+Ò/UÐde��Q˜‘^ aÑ'¨!Ñ+Ò,ñfô ˜:Ó&ò 2�Ø1��Q’ð2ä˜:¨™>Ó*ò K�Ø'(Ð+BÑ'B��Z !‘^Ñ$Ø/0Ð3JÑ/J��Q˜‘^ aÑ'¨!Ñ+Ò,ðKð ‡�×"Ñ"×,Ñ,´×0AÑ0AÒAÜ�z‰z˜$Óˆð €Kð 
�‰×	$Ñ	$×	.Ñ	.´+×2CÑ2CÒ	CÜ�x‰x˜‹~ˆà€Kr   Ú	directoryÚinputsc           	      ó   — t         j                  j                  | «      s&	 t        j                  | «       t	        d| › d�«       nt	        d| › d�«       t        |j                  «       «      D ]t  \  }\  }}t        j                  ||«      }t        t         j                  j                  | d|› d�«      d	«      5 }|j                  |j                  «       «       d
d
d
«       Œv y
# t
        $ r t	        d| › d�«       Y Œ«w xY w# 1 sw Y   ŒŸxY w)z²Output input tensors of test data to a directory

    Args:
        directory (str): path of a directory
        inputs (Dict[str, np.ndarray]): map from input name to value
    z#Successfully created the directory ú zCreation of the directory z failedzWarning: directory z$ existed. Files will be overwritten.Úinput_ú.pbÚwbN)ÚosÚpathÚexistsÚmkdirÚprintÚOSErrorÚ	enumerateÚitemsr   Ú
from_arrayÚopenÚjoinÚwriteÚSerializeToString)r8   r9   ÚindexÚnamer   ÚtensorÚfiles          r   Úoutput_test_datarP   Ÿ   sú   € ô �7‰7�>‰>˜)Ô$ð	FÜ�H‰H�YÔô Ð7¸	°{À!ÐDÕEäÐ# I ;Ð.RÐSÔTä(¨¯©«Ó8ò 3Ñˆ‰|��dÜ×(Ñ(¨¨tÓ4ˆÜ”"—'‘'—,‘,˜y¨F°5°'¸Ð*=Ó>ÀÓEð 	3ÈØ�J‰J�v×/Ñ/Ó1Ô2÷	3ð 	3ñ3øô ò 	CÜÐ.¨y¨k¸ÐAÖBð	Cú÷	3ð 	3ús   ¡C& Â; DÃ&DÄ DÄD	Ú
test_casesÚverboseÚrandom_seedc           	      ó¢  — |€J ‚t         j                  j                  |«       t        j                  |«       g }t        |«      D ]†  }t	        || ||«      }|j
                  |i}|rt        || |«      ||j
                  <   |rt        || ||	|
|«      ||j
                  <   |rt        |«      dk(  rt        d|«       |j                  |«       Œˆ |S )a  Create given number of input data for testing

    Args:
        batch_size (int): batch size
        sequence_length (int): sequence length
        test_cases (int): number of test cases
        dictionary_size (int): vocabulary size of dictionary for input_ids
        verbose (bool): print more information or not
        random_seed (int): random seed
        input_ids (TensorProto): graph input of input IDs
        segment_ids (TensorProto): graph input of token type IDs
        input_mask (TensorProto): graph input of attention mask
        average_sequence_length (int): average sequence length excluding paddings
        random_sequence_length (bool): whether use uniform random number for sequence length
        mask_type (int): mask type 1 is mask index; 2 is 2D mask; 3 is key len, cumulated lengths of query and key

    Returns:
        List[Dict[str,numpy.ndarray]]: list of test cases, where each test case is a dictionary
                                       with input name as key and a tensor as value
    r   zExample inputs)r   r   Úseedr1   r   rM   r$   r7   ÚlenrC   Úappend)r	   r
   rQ   r   rR   rS   r   r    r+   r&   r,   r-   Ú
all_inputsÚ
_test_caseÚinput_1r9   s                   r   Úfake_test_datar[   ¶   sØ   € ðD Ð Ð Ð ä‡I�I‡N�N�;ÔÜ
‡K�K�Ôà€JÜ˜JÓ'ò "ˆ
Ü% i°¸_ÈoÓ^ˆØ—.‘. 'Ð*ˆáÜ'<¸[È*ÐVeÓ'fˆF�;×#Ñ#Ñ$áÜ&:Ø˜J¨Ð9PÐRhÐjsó'ˆF�:—?‘?Ñ#ñ ”s˜:“¨!Ò+ÜÐ" FÔ+Ø×Ñ˜&Õ!ð"ð Ðr   rU   c                 ód   — t        | ||||||||||	|
«      }t        |«      |k7  rt        d«       |S )aµ  Create given number of input data for testing

    Args:
        batch_size (int): batch size
        sequence_length (int): sequence length
        test_cases (int): number of test cases
        seed (int): random seed
        verbose (bool): print more information or not
        input_ids (TensorProto): graph input of input IDs
        segment_ids (TensorProto): graph input of token type IDs
        input_mask (TensorProto): graph input of attention mask
        average_sequence_length (int): average sequence length excluding paddings
        random_sequence_length (bool): whether use uniform random number for sequence length
        mask_type (int): mask type 1 is mask index; 2 is 2D mask; 3 is key len, cumulated lengths of query and key

    Returns:
        List[Dict[str,numpy.ndarray]]: list of test cases, where each test case is a dictionary
                                       with input name as key and a tensor as value
    z$Failed to create test data for test.)r[   rV   rC   )r	   r
   rQ   rU   rR   r   r    r+   r&   r,   r-   r   rX   s                r   Úgenerate_test_datar]   ð   sP   € ôB  ØØØØØØØØØØØØó€Jô ˆ:ƒ˜*Ò$ÜÐ4Ô5ØÐr   c                 óþ   — |t        |j                  «      k\  ry |j                  |   }| j                  |«      }|€A| j                  ||«      }|�-|j                  dk(  r| j                  |j                  d   «      }|S )NÚCastr   )rV   ÚinputÚfind_graph_inputÚ
get_parentÚop_type)Ú
onnx_modelÚ
embed_nodeÚinput_indexr`   Úgraph_inputÚparent_nodes         r   Úget_graph_input_from_embed_noderi   $  s„   € Ø”c˜*×*Ñ*Ó+Ò+Øà×Ñ˜[Ñ)€EØ×-Ñ-¨eÓ4€KØÐØ ×+Ñ+¨J¸ÓDˆØÐ" {×':Ñ':¸fÒ'DØ$×5Ñ5°k×6GÑ6GÈÑ6JÓKˆKØÐr   rd   Úinput_ids_nameÚsegment_ids_nameÚinput_mask_namec                 óp  — | j                  «       }|�¨| j                  |«      }|€t        d|› �«      ‚d}|r!| j                  |«      }|€t        d|› �«      ‚d}|r!| j                  |«      }|€t        d|› �«      ‚d|rdndz   |rdndz   }t        |«      |k7  rt        d|› dt        |«      › �«      ‚|||fS t        |«      dk7  rt        dt        |«      › �«      ‚| j	                  d	«      }	t        |	«      dk(  rh|	d   }
t        | |
d«      }t        | |
d«      }t        | |
d
«      }|€(|D ]#  }|j                  j                  «       }d|v sŒ"|}Œ% |€t        d«      ‚|||fS d}d}d}|D ]0  }|j                  j                  «       }d|v r|}Œ$d|v sd|v r|}Œ/|}Œ2 |r	|r|r|||fS t        d«      ‚)a  Find graph inputs for BERT model.
    First, we will deduce inputs from EmbedLayerNormalization node.
    If not found, we will guess the meaning of graph inputs based on naming.

    Args:
        onnx_model (OnnxModel): onnx model object
        input_ids_name (str, optional): Name of graph input for input IDs. Defaults to None.
        segment_ids_name (str, optional): Name of graph input for segment IDs. Defaults to None.
        input_mask_name (str, optional): Name of graph input for attention mask. Defaults to None.

    Raises:
        ValueError: Graph does not have input named of input_ids_name or segment_ids_name or input_mask_name
        ValueError: Expected graph input number does not match with specified input_ids_name, segment_ids_name
                    and input_mask_name

    Returns:
        Tuple[Optional[np.ndarray], Optional[np.ndarray], Optional[np.ndarray]]: input tensors of input_ids,
                                                                                 segment_ids and input_mask
    Nz 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 ÚEmbedLayerNormalizationé   Úmaskz#Failed to find attention mask inputÚtokenÚsegmentz?Fail to assign 3 inputs. You might try rename the graph inputs.)Ú'get_graph_inputs_excluding_initializersra   Ú
ValueErrorrV   Úget_nodes_by_op_typeri   rM   Úlower)rd   rj   rk   rl   Úgraph_inputsr   r    r+   Úexpected_inputsÚembed_nodesre   r`   Úinput_name_lowers                r   Úfind_bert_inputsr{   1  sH  € ð4 ×EÑEÓG€LàÐ!Ø×/Ñ/°Ó?ˆ	ØÐÜÐ?ÀÐ?OÐPÓQÐQàˆÙØ$×5Ñ5Ð6FÓGˆKØÐ"Ü Ð#CÐDTÐCUÐ!VÓWÐWàˆ
ÙØ#×4Ñ4°_ÓEˆJØÐ!Ü Ð#CÀOÐCTÐ!UÓVÐVà¡K™q°QÑ7Á
¹1ÐPQÑRˆÜˆ|Ó Ò/ÜÐ8¸Ð8IÈÔWZÐ[gÓWhÐViÐjÓkÐkà˜+ zÐ1Ð1ä
ˆ<Ó˜AÒÜÐBÄ3À|ÓCTÐBUÐVÓWÐWà×1Ñ1Ð2KÓL€KÜ
ˆ;Ó˜1ÒØ  ‘^ˆ
Ü3°JÀ
ÈAÓNˆ	Ü5°jÀ*ÈaÓPˆÜ4°ZÀÈQÓOˆ
àÐØ%ò '�Ø#(§:¡:×#3Ñ#3Ó#5Ð ØÐ-Ò-Ø!&‘Jð'ð ÐÜÐBÓCÐCà˜+ zÐ1Ð1ð €IØ€KØ€JØò 	ˆØ Ÿ:™:×+Ñ+Ó-ÐØÐ%Ñ%Ø‰JàÐ'Ñ'¨9Ð8HÑ+Hà‰Kà‰Ið	ñ ‘[¡ZØ˜+ zÐ1Ð1ä
ÐVÓ
WÐWr   Ú	onnx_filec                 óÈ   — t        «       }t        | d«      5 }|j                  |j                  «       «       ddd«       t	        |«      }t        ||||«      S # 1 sw Y   Œ"xY w)aó  Find graph inputs for BERT model.
    First, we will deduce inputs from EmbedLayerNormalization node.
    If not found, we will guess the meaning of graph inputs based on naming.

    Args:
        onnx_file (str): onnx model path
        input_ids_name (str, optional): Name of graph input for input IDs. Defaults to None.
        segment_ids_name (str, optional): Name of graph input for segment IDs. Defaults to None.
        input_mask_name (str, optional): Name of graph input for attention mask. Defaults to None.

    Returns:
        Tuple[Optional[np.ndarray], Optional[np.ndarray], Optional[np.ndarray]]: input tensors of input_ids,
                                                                                 segment_ids and input_mask
    ÚrbN)r   rH   ÚParseFromStringÚreadr   r{   )r|   rj   rk   rl   ÚmodelrO   rd   s          r   Úget_bert_inputsr‚   �  s^   € ô( ‹L€EÜ	ˆi˜Ó	ð + $Ø×Ñ˜dŸi™i›kÔ*÷+ô ˜5Ó!€JÜ˜J¨Ð8HÈ/ÓZÐZ÷	+ð +ús   — AÁA!c                  ót  — t        j                  «       } | j                  ddt        d¬«       | j                  ddt        d d¬«       | j                  d	dt        d
d¬«       | j                  ddt        dd¬«       | j                  ddt        d d¬«       | j                  ddt        d d¬«       | j                  ddt        d d¬«       | j                  ddt        d
d¬«       | j                  ddt        dd¬«       | j                  dddd¬«       | j                  d¬«       | j                  dddd ¬«       | j                  d¬!«       | j                  d"d#d$t        d%¬&«       | j                  d'd(ddd)¬«       | j                  d¬*«       | j                  d+dt        d,d-¬«       | j                  «       }|S ).Nz--modelTzbert onnx model path.)Úrequiredr   Úhelpz--output_dirFz4output test data path. Default is current directory.)r„   r   Údefaultr…   z--batch_sizer(   zbatch size of inputz--sequence_lengthé€   z maximum sequence length of inputz--input_ids_namezinput name for input idsz--segment_ids_namezinput name for segment idsz--input_mask_namezinput name for attention maskz	--samplesz$number of test cases to be generatedz--seedr/   zrandom seedz	--verboseÚ
store_truezprint verbose information)r„   Úactionr…   )rR   z--only_input_tensorsz-only save input tensors and no output tensors)Úonly_input_tensorsz-az--average_sequence_lengthéÿÿÿÿz)average sequence length excluding padding)r†   r   r…   z-rz--random_sequence_lengthz3use uniform random instead of fixed sequence length)r,   z--mask_typer)   z^mask type: (1: mask index, 2: raw 2D mask, 3: key lengths, cumulated lengths of query and key))ÚargparseÚArgumentParserÚadd_argumentÚstrÚintÚset_defaultsÚ
parse_args)ÚparserÚargss     r   Úparse_argumentsr•   ©  s'  € Ü×$Ñ$Ó&€Fà
×Ñ˜	¨D´sÐAXÐÔYà
×ÑØØÜØØCð ô ð ×Ñ˜°¼SÈ!ÐRgÐÔhà
×ÑØØÜØØ/ð ô ð ×ÑØØÜØØ'ð ô ð ×ÑØØÜØØ)ð ô ð ×ÑØØÜØØ,ð ô ð ×ÑØØÜØØ3ð ô ð ×Ñ˜¨5´sÀAÈMÐÔZà
×ÑØØØØ(ð	 ô ð ×Ñ ÐÔ&à
×ÑØØØØ<ð	 ô ð ×Ñ¨5ÐÔ1à
×ÑØØ#ØÜØ8ð ô ð ×ÑØØ"ØØØBð ô ð ×Ñ¨uÐÔ5à
×ÑØØÜØØmð ô ð ×ÑÓ€DØ€Kr   r�   Ú
output_dirrŠ   c                 óŠ  — t        | |||	«      \  }}}t        |||||||||||«      }t        |«      D ]=  \  }}t        j                  j                  |dt        |«      z   «      }t        ||«       Œ? |
ryddl}d|j                  «       v rddgndg}|j                  | |¬«      }|j                  «       D �cg c]  }|j                  ‘Œ }}t        |«      D ]Ø  \  }}t        j                  j                  |dt        |«      z   «      }|j                  ||«      }t        |«      D ]‡  \  }}t        j                  t!        j"                  ||   «      |«      }t%        t        j                  j                  |d|› d�«      d	«      5 }|j'                  |j)                  «       «       ddd«       Œ‰ ŒÚ yc c}w # 1 sw Y   Œ›xY w)
aI  Create test data for a model, and save test data to a directory.

    Args:
        model (str): path of ONNX bert model
        output_dir (str): output directory
        batch_size (int): batch size
        sequence_length (int): sequence length
        test_cases (int): number of test cases
        seed (int): random seed
        verbose (bool): whether print more information
        input_ids_name (str): graph input name of input_ids
        segment_ids_name (str): graph input name of segment_ids
        input_mask_name (str): graph input name of input_mask
        only_input_tensors (bool): only save input tensors,
        average_sequence_length (int): average sequence length excluding paddings
        random_sequence_length (bool): whether use uniform random number for sequence length
        mask_type(int): mask type
    Útest_data_set_Nr   ÚCUDAExecutionProviderÚCPUExecutionProvider)Ú	providersÚoutput_r=   r>   )r‚   r]   rE   r?   r@   rI   r�   rP   ÚonnxruntimeÚget_available_providersÚInferenceSessionÚget_outputsrM   Úrunr   rG   r   ÚasarrayrH   rJ   rK   )r�   r–   r	   r
   rQ   rU   rR   rj   rk   rl   rŠ   r&   r,   r-   r   r    r+   rX   r3   r9   r8   r�   r›   ÚsessionÚoutputÚoutput_namesÚresultÚoutput_nameÚtensor_resultrO   s                                 r   Úcreate_and_save_test_datar©     sÌ  € ôD *9¸ÀÐP`ÐbqÓ)rÑ&€Iˆ{˜Jä#ØØØØØØØØØØØó€Jô ˜zÓ*ò ,‰	ˆˆ6Ü—G‘G—L‘L Ð-=ÄÀAÃÑ-FÓGˆ	Ü˜ FÕ+ð,ñ Øãð # k×&IÑ&IÓ&KÑKð 
!Ð"8Ñ9à$Ð%ð ð
 ×*Ñ*¨5¸IÐ*ÓF€GØ.5×.AÑ.AÓ.CÖD F�F—K“KÐD€LÐDä˜zÓ*ò >‰	ˆˆ6Ü—G‘G—L‘L Ð-=ÄÀAÃÑ-FÓGˆ	Ø—‘˜\¨6Ó2ˆÜ'¨Ó5ò 	>‰NˆAˆ{Ü(×3Ñ3´B·J±J¸vÀa¹yÓ4IÈ;ÓWˆMÜ”b—g‘g—l‘l 9°¸°s¸#Ð.>Ó?ÀÓFð >È$Ø—
‘
˜=×:Ñ:Ó<Ô=÷>ð >ñ	>ñ>ùò E÷>ð >ús   Â8F4Æ F9Æ9Gc                  óÊ  — t        «       } | j                  dk  r| j                  | _        | j                  }|€Yt	        | j
                  «      }t        j                  j                  |j                  d| j                  › d| j                  › �«      }|�t	        |«      }|j                  dd¬«       nt        d«       t        | j
                  || j                  | j                  | j                  | j                  | j                   | j"                  | j$                  | j&                  | j(                  | j                  | j*                  | j,                  «       t        d|«       y )Nr   Úbatch_Ú_seq_T)ÚparentsÚexist_okz7Directory existed. test data files will be overwritten.z Test data is saved to directory:)r•   r&   r
   r–   r   r�   r?   r@   rI   Úparentr	   rB   rC   r©   ÚsamplesrU   rR   rj   rk   rl   rŠ   r,   r-   )r”   r–   Úpr@   s       r   Úmainr²   Y  s  € ÜÓ€Dà×#Ñ# qÒ(Ø'+×';Ñ';ˆÔ$à—‘€JØÐä�—‘ÓˆÜ—W‘W—\‘\ !§(¡(¨f°T·_±_Ð4EÀUÈ4×K_ÑK_ÐJ`Ð,aÓbˆ
àÐä�JÓˆØ�
‰
˜4¨$ˆ
Õ/äÐGÔHäØ�
‰
ØØ�‰Ø×ÑØ�‰Ø�	‰	Ø�‰Ø×ÑØ×ÑØ×ÑØ×ÑØ×$Ñ$Ø×#Ñ#Ø�‰ôô" 
Ð
,¨jÕ9r   Ú__main__)r)   )i'  )NNN)!rŒ   r?   r   Úpathlibr   Únumpyr   Úonnxr   r   r   rd   r   r�   Úndarrayr   r$   r*   Úboolr7   r�   ÚdictrP   r[   r]   ri   Útupler{   r‚   r•   r©   r²   Ú__name__© r   r   ú<module>r½      sÅ  ðó Û 	Û Ý ã ß 6Ñ 6Ý  ðØðØ(+ðØ>AðØTWðà‡Z�Zóð< {ð Àð ÐVYð Ð^`×^hÑ^hó ð6B¨3ð BÈó Bð  ñFØðFàðFð ðFð !ð	Fð
 !ðFð ðFð ‡Z�ZóFðR3 ð 3¨T°#°r·z±z°/Ñ-Bó 3ð.7Øð7àð7ð ð7ð ð	7ð
 ð7ð ð7ð ð7ð ð7ð ð7ð !ð7ð !ð7ð ó7ðL !ñ1Øð1àð1ð ð1ð ð	1ð
 ð1ð ð1ð ð1ð ð1ð !ð1ð !ð1ð ð1ð ó1òh
ð "&Ø#'Ø"&ñ	YXØðYXà˜$‘JðYXð ˜D‘jðYXð ˜4‘Zð	YXð
 ˆ2�:‰:˜Ñ˜bŸj™j¨4Ñ/°·±¸dÑ1BÐBÑCóYXð| "&Ø#'Ø"&ñ	[Øð[à˜$‘Jð[ð ˜D‘jð[ð ˜4‘Zð	[ð
 ˆ2�:‰:˜Ñ˜bŸj™j¨4Ñ/°·±¸dÑ1BÐBÑCó[ò8aðHI>ØðI>àðI>ð ðI>ð ð	I>ð
 ðI>ð ðI>ð ðI>ð ˜$‘JðI>ð ˜D‘jðI>ð ˜4‘ZðI>ð ðI>ð !ðI>ð !ðI>ð óI>òX$:ðN ˆzÒÙ…Fð r   