
    Si                       S SK Jr  S SKrS SKJr  S SKrS SKJrJ	r	J
r
JrJrJrJrJrJrJrJrJr  \(       a  S SKJrJr  SS jrSS jrSS jrSS	 jrS
rSr " S S\R:                  5      r\S:X  a  \R@                  " 5         gg)    )annotationsN)TYPE_CHECKING)FunctionProto
GraphProto
ModelProto	NodeProtoSparseTensorProtoTensorProtoValueInfoProtocheckercomposehelperparserversion_converter)CallableSequencec                ^    [         R                  " U 5      n[        R                  " U5        U$ )zYParses a model from a string representation, including checking the model for correctness)r   parse_modelr   check_model)m_defms     U/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/onnx/test/compose_test.py_load_modelr      s%    5!AH    c                ,    [        U5      S:  a  X-   $ U$ )z Prefixes a string (if not empty)r   )len)prefixss     r   	_prefixedr   %   s    Q!6:**r   c                   [        [        U R                  R                  R                  R
                  5      5       Vs/ s H:  nU R                  R                  R                  R
                  U   R                  PM<     sn$ s  snf )zPReturns a list of integers representing the shape of the provided ValueInfoProto)ranger   typetensor_typeshapedim	dim_value)
value_infods     r   
_get_shaper)   *   sj     s:??66<<@@ABBA 	##))--a0::B  s   ABc                   SS/n/ SQn/ SQn[         R                  " U S-   [        R                  [	        U5      /[
        R                  " U5      R                  [
        R                  5      SS9n[         R                  " U S-   [        R                  [	        U5      /[
        R                  " U5      R                  [
        R                  5      SS9n[         R                  " XEU5      $ )N   )   r+      )g333333?g?g?_valuesF)name	data_typedimsvalsraw_idx)r   make_tensorr
   FLOATr   nparrayastypefloat32INT64int64make_sparse_tensor)r/   dense_shapelinear_indicessparse_valuesvalues_tensorindices_tensors         r   _make_sparse_tensorrC   2   s    a&KN#M&&I##- !XXm$++BJJ7M ''F]##.!"XXn%,,RXX6N $$]KPPr   a)  
    <
        ir_version: 7,
        opset_import: [ "": 10, "com.microsoft": 1]
    >
    agraph (float[N, M] A0, float[N, M] A1, float[N, M] _A) => (float[N, M] B00, float[N, M] B10, float[N, M] B20)
    {
        B00 = Add(A0, A1)
        B10 = Sub(A0, A1)
        B20 = Mul(A0, A1)
    }
    a
  
    <
        ir_version: 7,
        opset_import: [ "": 10, "com.microsoft": 1]
    >
    agraph (float[N, M] B01, float[N, M] B11, float[N, M] B21) => (float[N, M] D0)
    {
        C0 = Add(B01, B11)
        C1 = Sub(B11, B21)
        D0 = Mul(C0, C1)
    }
    c                     \ rS rSr    S%                 S&S jjrS'S jrS'S jrS'S jrS'S jrS'S jr	S'S	 jr
S'S
 jrS'S jrS'S jrS'S jrS'S jrS'S jrS'S jrS'S jr       S(               S)S jjrS'S jrS'S jrS'S jrS'S jrS'S jrS'S jrS'S jrS'S jr          S*                     S+S jjrS'S jrS'S jrS'S jrS'S jr S'S  jr!S'S! jr"S'S" jr#S'S# jr$S$r%g),TestComposeFunctionsc   Nc	           
        [        U5      [        U5      p[        R                  " U	R                  U
R                  UUUUUS9n[        R
                  " U5        U" U	R                  U
R                  U5        [        R                  " U	U
UUUUUS9n[        R                  " U5        U" U	R                  U
R                  UR                  5        g )N)io_mapinputsoutputsprefix1prefix2)r   r   merge_graphsgraphr   check_graphmerge_modelsr   )selfm1defm2defrH   check_expectationsrI   rJ   rK   rL   m1m2g3m3s                r   _test_merge_models'TestComposeFunctions._test_merge_modelsd   s     U#[%7B!!HHHH
 	B288RXXr2!!
 	B288RXXrxx8r   c                T   ^  SU 4S jjn/ SQnT R                  [        [        X!5        g)zTests a simple scenario where two models without overlapping names are merged by
connecting all the outputs in the first models to all the inputs in the second model
c                  > TR                  UR                  U R                  5        TR                  UR                  UR                  5        TR                  / SQUR                   Vs/ s H  o3R                  PM     sn5        g s  snf )NAddSubMulr^   r_   r`   )assertEqualinputoutputnodeop_type)g1g2rW   itemrQ   s       r   rT   XTestComposeFunctions.test_case_connect_all_no_name_collision.<locals>.check_expectations   s_    RXXrxx0RYY		2:*,''2'$'22s   *B
B00B01B10B11B20B21Nrf   r   rg   r   rW   r   returnNonerY   M1_DEFM2_DEFrQ   rT   rH   s   `  r   'test_case_connect_all_no_name_collision<TestComposeFunctions.test_case_connect_all_no_name_collision   s"    
	 BKr   c                T   ^  SU 4S jjn/ SQnT R                  [        [        X!5        g)z|Tests a scenario where we merge two models by connecting a single output in the first model
to all the inputs in the second
c                H  > ATR                  UR                  U R                  5        TR                  / SQUR                   Vs/ s H  o3R                  PM     sn5        TR                  / SQUR                   Vs/ s H  oDR
                  PM     sn5        g s  snf s  snf )N)ro   rr   D0r]   ra   rb   rc   r/   rd   re   rf   rg   rW   elemrh   rQ   s        r   rT   TTestComposeFunctions.test_case_connect_same_output_twice.<locals>.check_expectations   sx    RXXrxx01"))3T)$II)3TU:*,''2'$'2 4U 3s   B
=B
rk   )rl   rp   )rl   rs   Nrt   rw   rz   s   `  r   #test_case_connect_same_output_twice8TestComposeFunctions.test_case_connect_same_output_twice   s"    
	 BKr   c                X   ^  SU 4S jjn/ SQnS/nT R                  [        [        X!US9  g)zTests a scenario where we merge two models by connecting a single output in the first model
to all the inputs in the second, while dropping the rest of the outputs in the first model
c                F  > ATR                  UR                  U R                  5        TR                  S/UR                   Vs/ s H  o3R                  PM     sn5        TR                  / SQUR                   Vs/ s H  oDR
                  PM     sn5        g s  snf s  snf )Nr   )r^   r^   r_   r`   r   r   s        r   rT   [TestComposeFunctions.test_case_connect_same_output_drop_outputs.<locals>.check_expectations   sv    RXXrxx0dVBII%FIDiiI%FG,.P||.P &G.Ps   B
<B
r   r   )rJ   Nrt   rw   )rQ   rT   rH   rJ   s   `   r   *test_case_connect_same_output_drop_outputs?TestComposeFunctions.test_case_connect_same_output_drop_outputs   s3    
	 B&FF 	  	
r   c                H   ^  SnSnS/nSU 4S jjnT R                  XX45        g)zjTests a scenario where we merge two models, where the inputs/outputs connected
are named exactly the same
z
            <
                ir_version: 7,
                opset_import: [ "": 10]
            >
            agraph (float[N, M] A) => (float[N, M] B)
            {
                B = Add(A, A)
            }
            z
            <
                ir_version: 7,
                opset_import: [ "": 10]
            >
            agraph (float[N, M] B) => (float[N, M] C)
            {
                C = Add(B, B)
            }
            )Br   c                   > A ATR                  S/UR                   Vs/ s H  o3R                  PM     sn5        TR                  S/UR                   Vs/ s H  o3R                  PM     sn5        g s  snf s  snf )NACra   rb   r/   rc   rf   rg   rW   r   rQ   s       r   rT   YTestComposeFunctions.test_case_connect_same_input_output_name.<locals>.check_expectations   s_    BcU288$D84YY8$DEcU299$E94YY9$EF %E$Es   A3
A8
Nrt   rY   )rQ   m1_defm2_defrH   rT   s   `    r   (test_case_connect_same_input_output_name=TestComposeFunctions.test_case_connect_same_input_output_name   s2    		 	G 	Kr   c           	     R   ^  SnSnS/nS	U 4S jjnS/nS/nT R                  XX4XVS9  g)
zTTests a scenario where we merge two models, not including some of the inputs/outputsa  
            <
                ir_version: 7,
                opset_import: [ "": 10]
            >
            agraph (float[N] A0, float[N] B0) => (float[N] A1, float[N] B1)
            {
                A1 = Add(A0, A0)
                B1 = Sub(B0, B0)
            }
            a  
            <
                ir_version: 7,
                opset_import: [ "": 10]
            >
            agraph (float[N] A2, float[N] B2) => (float[N] A3, float[N] B3)
            {
                A3 = Add(A2, A2)
                B3 = Sub(B2, B2)
            }
            )A1B2c                t  > A ATR                  S/UR                   Vs/ s H  o3R                  PM     sn5        TR                  S/UR                   Vs/ s H  o3R                  PM     sn5        TR                  SS/UR                   Vs/ s H  o3R
                  PM     sn5        g s  snf s  snf s  snf )NA0B3r^   r_   ra   rb   r/   rc   rd   re   r   s       r   rT   NTestComposeFunctions.test_case_drop_inputs_outputs.<locals>.check_expectations   s    BdVBHH%EHDiiH%EFdVBII%FIDiiI%FGeU^rww-Owtllw-OP &F%F-Os   B+
B0
B5
r   r   rI   rJ   Nrt   r   )rQ   r   r   rH   rT   rI   rJ   s   `      r   test_case_drop_inputs_outputs2TestComposeFunctions.test_case_drop_inputs_outputs   sJ    

 	Q &Fv 	  	
r   c           	     D   ^  SnS/nSU 4S jjnT R                  XX#SSS9  g)	zzTests a scenario where we merge two models that have name collisions, but they
are avoided by prefixing the models model.
z
            <
                ir_version: 7,
                opset_import: [ "": 10]
            >
            agraph (float[N] A, float[N] B) => (float[N] C)
            {
                C = Add(A, B)
            }
            )r   r   c                v  > A ATR                  / SQUR                   Vs/ s H  o3R                  PM     sn5        TR                  S/UR                   Vs/ s H  o3R                  PM     sn5        TR                  SS/UR                   Vs/ s H  o3R
                  PM     sn5        g s  snf s  snf s  snf )N)zm1/Azm1/Bzm2/Bzm2/Cr^   r   r   s       r   rT   PTestComposeFunctions.test_case_name_collision_prefix.<locals>.check_expectations  s    B5bhh7Whd		h7WXfXbii'Hid		i'HIeU^rww-Owtllw-OP 8X'H-Os   B,
B1
B6
m1/m2/)rK   rL   Nrt   r   )rQ   r   rH   rT   s   `   r   test_case_name_collision_prefix4TestComposeFunctions.test_case_name_collision_prefix  s7    	 	Q 	Fu 	  	
r   c                T   ^  SU 4S jjnSS/nT R                  [        [        X!5        g)zTests a scenario where two models without overlapping names are merged by
connecting some outputs from the first model to some inputs in the second.
The remaining inputs/outputs should be present in the combined model
c                   > A ATR                  / SQUR                   Vs/ s H  o3R                  PM     sn5        TR                  SS/UR                   Vs/ s H  o3R                  PM     sn5        g s  snf s  snf )N)r   r   _Ars   rr   r   r   )rf   rg   g4r   rQ   s       r   rT   ^TestComposeFunctions.test_case_connect_partially_no_name_collision.<locals>.check_expectations%  sf    B )"((+K($II(+K eT]299,M94YY9,MN ,L,Ms   A5
A:
rk   rn   N)rf   r   rg   r   r   r   ru   rv   rw   rz   s   `  r   -test_case_connect_partially_no_name_collisionBTestComposeFunctions.test_case_connect_partially_no_name_collision  s'    	O !.1Kr   c                   [        [        5      n[        R                  " USSS.5        [        [        5      n[        R                  " USSS.5        S/n[
        R                  " XUS9n[        UR                  5      S	:X  d   e[        R                  " USSS
.5        [
        R                  " XUS9n[        UR                  5      S:X  d   e[        R                  " USSS
.5        U R                  [        [
        R                  XUS9  g )Nv1v2)p1p2v3v4)p3p4rk   rH      )r   r   r+   v5)r   rx   r   set_model_propsry   r   rP   r   metadata_propsassertRaises
ValueErrorrQ   rU   rV   rH   rX   s        r   %test_merge_models_with_metadata_props:TestComposeFunctions.test_merge_models_with_metadata_props2  s     r$d#;< r$d#;< !!!"82$$%*** 	r$d#;<!!"82$$%*** 	r$d#;<*g&:&:B6Rr   c                    [        [        5      [        [        5      p!U R                  [        [
        R                  UU/ SQS9  U R                  [        [
        R                  UU/ SQS9  g)z_Tests that providing a non existing output/input name in the io_map argument produces an error.))wrong_outnamerm   rn   rq   r   ))rl   wrong_inputrn   rq   N)r   rx   ry   r   r   r   rP   rQ   rU   rV   s      r   "test_error_wrong_input_output_name7TestComposeFunctions.test_error_wrong_input_output_nameF  se    V$k&&9B  M 	 	
 	  K 	 	
r   c                z    [        S5      n[        S5      nU R                  [        [        R                  XS/S9  g )Nz
    <
        ir_version: 7,
        opset_import: [ "": 13]
    >
    agraph (float[N, M] X0) => (float[N, M] Y0)
    {
        Y0 = Add(X0, X0)
    }
    z
    <
        ir_version: 6,
        opset_import: [ "": 13]
    >
    agraph (float[N, M] X1) => (float[N, M] Y1)
    {
        Y1 = Add(X1, X1)
    }
    )Y0X1r   )r   r   r   r   rP   r   s      r   test_error_ir_version_mismatch3TestComposeFunctions.test_error_ir_version_mismatch[  sH    	
 	
 	,,bl^ 	 	
r   c                   [        [        5      [        [        5      p![        R                  " UR
                  S[        R                  " SS5      /S9n[        R                  " UR
                  S[        R                  " SS5      /S9n/ SQnU R                  [        [        R                  XU5        [        R                  " US5      n[        R                  " XUS9n[        R                  " U5        g)	zSTests that providing models with different operator set imported produces an error.test 
   producer_nameopset_imports   rj   r   N)r   rx   ry   r   
make_modelrN   make_opsetidr   r   r   rP   r   convert_versionr   r   r   s        r    test_error_opset_import_mismatch5TestComposeFunctions.test_error_opset_import_mismatchz  s    V$k&&9BHHF6;N;NrSU;V:W
 HHF6;N;NrSU;V:W
 B*g&:&:BFK ..r26!!"8Br   c                   Sn[        U5      nSn[        R                  " UUSSSS9n[        R                  " UR
                  5        UR
                  R                   H-  nU R                  UR                  R                  U5      5        M/     UR
                  R                   H-  nU R                  UR                  R                  U5      5        M/     g)z)Tests prefixing inputs and outputs nodes.aB  
            <
                ir_version: 6,
                opset_import: [ "": 13]
            >
            agraph (float[N, 128] X, float[128, 10] W, float[10] B) => (float[N, 10] C)
            {
                T = MatMul(X, W)
                S = Add(T, B)
                C = Softmax(S)
            }
            pre_Tmodelr   rename_inputsrename_outputsrename_edgesNr   r   
add_prefixr   rO   rN   rb   
assertTruer/   
startswithrc   )rQ   input_graphinput_modelr   prefixed_modelios          r   !test_add_prefix_to_inputs_outputs6TestComposeFunctions.test_add_prefix_to_inputs_outputs  s     "+. ++
 	N001%%++AOOAFF--f56 ,%%,,AOOAFF--f56 -r   c                z   Sn[        U5      nSn[        R                  " UUSSSS9n[        R                  " UR
                  5        U R                  UR
                  R                  UR
                  R                  5        U R                  UR
                  R                  UR
                  R                  5        g)zWTests prefixing input and output nodes, when renaming of inputs/outputs is deactivated.z
            <
                ir_version: 6,
                opset_import: [ "": 13]
            >
            agraph (float[2,2] A) => (float[2,2] B)
            {
            B = Identity(A)
            }
            r   FTr   N)	r   r   r   r   rO   rN   ra   rb   rc   )rQ   r   r   r   r   s        r   !test_add_prefix_wo_inputs_outputs6TestComposeFunctions.test_add_prefix_wo_inputs_outputs  s    	 "+. ++ 
 	N001**00.2F2F2L2LM**11>3G3G3N3NOr   c                   Sn[        U5      nSn[        R                  " UUSSSS9n[        R                  " UR
                  5        UR
                  R                   H-  nU R                  UR                  R                  U5      5        M/     UR
                  R                   H-  nU R                  UR                  R                  U5      5        M/     g)z,Tests prefixing of graphs with loose inputs.a  
            <
                ir_version: 7,
                opset_import: [ "" : 13 ]
            >
            agraph (bool b, float[128] X, float[128] Y, bool unused_input) => (float[128] Z)
            {
            Z = If (b) <
                then_branch = g1 () => (float[128] z_then) { z_then = Add(X, X) },
                else_branch = g2 () => (float[128] z_else) { z_else = Sub(Y, Y) }
                >
            }
            r   Tr   Nr   )rQ   r   r   r   r   r   graph_outputs          r   )test_add_prefix_with_loose_inputs_outputs>TestComposeFunctions.test_add_prefix_with_loose_inputs_outputs  s     "+. ++
 	N001  %%++AOOAFF--f56 , +0077LOOL--88@A 8r   c                H   [        [        5      nSn	U(       a8  [        5       n
U
R                  U5        [        R
                  " U
U	UUUUUUSS9	  O[        R
                  " UU	UUUUUUS9n
UR                  nU
R                  nU(       d  U(       d  U(       d  U(       d  U(       Ga{  0 nU(       aS  UR                   HC  nUR                   H  n[        X5      X'   M     UR                   H  n[        X5      X'   M     ME     U(       a6  UR                   H&  n[        U	UR                  5      UUR                  '   M(     U(       a6  UR                   H&  n[        U	UR                  5      UUR                  '   M(     U(       a  UR                   H&  n[        U	UR                  5      UUR                  '   M(     UR                   Hq  n[        U	UR                  R                  5      UUR                  R                  '   [        U	UR                  R                  5      UUR                  R                  '   Ms     U(       a6  UR                   H&  n[        U	UR                  5      UUR                  '   M(     [!        UR                  UR                  SS9 H  u  nn[!        UR                  UR                  SS9 H(  u  nnU R#                  UR%                  UU5      U5        M*     [!        UR                  UR                  SS9 H(  u  nnU R#                  UR%                  UU5      U5        M*     M     [!        UR                  UR                  SS9 HF  u  nnU R#                  UR%                  UR                  UR                  5      UR                  5        MH     [!        UR                  UR                  SS9 HF  u  nnU R#                  UR%                  UR                  UR                  5      UR                  5        MH     [!        UR                  UR                  SS9 HF  u  nnU R#                  UR%                  UR                  UR                  5      UR                  5        MH     [!        UR                  UR                  SS9 H  u  nnU R#                  UR%                  UR                  R                  UR                  R                  5      UR                  R                  5        U R#                  UR%                  UR                  R                  UR                  R                  5      UR                  R                  5        M     [!        UR&                  UR&                  SS9 HF  u  n n!U R#                  UR%                  U!R                  U!R                  5      U R                  5        MH     U(       aZ  [!        UR                  UR                  SS9 H6  u  nnU R#                  [        U	UR                  5      UR                  5        M8     g g g )Nzpre/T)rename_nodesr   r   r   rename_initializersrename_value_infosinplace)r   r   r   r   r   r   strict)r   rx   r   CopyFromr   r   rN   rd   rb   r   rc   r/   initializersparse_initializervaluesindiceszipra   getr'   )"rQ   r   r   r   r   r   r   r   rU   r   rV   g_ing_outname_mappingner   initsparse_initr'   n1n0e1e0i1i0o1o0init1init0sparse_init1sparse_init0vi1vi0s"                                     r   _test_add_prefix%TestComposeFunctions._test_add_prefix  s     BKKO))+-$7#5
 ##))+-$7#5	B xx "!L AWW*3F*> %XX*3F*> & #
  JJD.7		.JL+ ' KKD.7		.JL+ ( # ,,D.7		.JL+ -#'#:#:K<E 2 2 7 7=L!3!3!8!89 >G 3 3 8 8>L!4!4!9!9:	 $; ""&++J4=fjoo4VL1 #. ejj$))DAB!"((BHHTBFB$$\%5%5b"%=rB C!"))RYYtDFB$$\%5%5b"%=rB E B
 ekk4::dCB  !1!1"''277!CRWWM DellDKKEB  !1!1"''277!CRWWM F !$E$5$5t7G7GPT Uu  !1!1%**ejj!I5::V !V /2(($*A*A$/*l    $$$++00,2E2E2J2J !'',,	    $$$,,11<3G3G3L3L !((--	/    0 0$//$OS  !1!1#((CHH!EsxxP P !%**diiEFB$$Yvrww%?I F C "r   c                "    U R                  SS9  g)zTests renaming nodes onlyT)r   Nr  rQ   s    r   test_add_prefix_nodes*TestComposeFunctions.test_add_prefix_nodesZ  s    40r   c                &    U R                  SSSS9  g)z]Tests prefixing nodes edges. This will also rename inputs/outputs, since the names are sharedT)r   r   r   Nr  r  s    r   test_add_prefix_edges*TestComposeFunctions.test_add_prefix_edges^  s    T$ 	 	
r   c                "    U R                  SS9  g)zPTests prefixing graph inputs only. Relevant node edges should be renamed as wellT)r   Nr  r  s    r   test_add_prefix_inputs+TestComposeFunctions.test_add_prefix_inputsd  s    D1r   c                "    U R                  SS9  g)zQTests prefixing graph outputs only. Relevant node edges should be renamed as wellT)r   Nr  r  s    r   test_add_prefix_outputs,TestComposeFunctions.test_add_prefix_outputsh  s    T2r   c                   [         R                  " S[        R                  S/5      n[         R                  " S[        R                  SS/5      n[         R                  " S[        R                  SS/5      n[         R                  " S[        R                  SS/5      n[         R                  " S[        R                  SS/5      n[         R
                  " SSS/S	/S
9n[         R
                  " SS	S/S/S
9n[         R
                  " SS	S/S/S
9n[         R
                  " SS/S/[         R                  " U/S/ U/S9[         R                  " U/S/ U/S9S9n	[         R                  " Xi/SXX4/U/S9n
Sn[        R                  " X5      n[        R                  " U5        [        UR                  U
R                  SS9 GH8  u  pU R                  [        XR                  5      UR                  5        [        UR                   UR                   SS9 H  u  nnUR"                  (       d  M  [        UR"                  R                  UR"                  R                  SS9 H  u  nn[        UR$                  UR$                  SS9 H"  u  nnU R                  [        UU5      U5        M$     [        UR&                  UR&                  SS9 H"  u  nnU R                  [        UU5      U5        M$     M     M     GM;     g)zQTests prefixing attribute's subgraph. Relevant subgraph should be renamed as wellr      XNYZOutr`   XYr   r^   r_   Ifthen)nodesr/   rI   rJ   else)rI   rJ   then_branchelse_branchrN   zprefix.Tr   )r   make_tensor_value_infor
   BOOLr6   	make_node
make_graphr   add_prefix_graphr   rO   r  rd   ra   r   r/   	attributegrb   rc   )rQ   r   r+  r,  r-  r.  r/  addsubcondrN   r   prefixed_graphr  r  
attribute1
attribute0subgraph_n1subgraph_n0input_n1input_n0	output_n1	output_n0s                          r   "test_add_prefix_attribute_subgraph7TestComposeFunctions.test_add_prefix_attribute_subgraphl  s   ))#{/?/?!E))#{/@/@4)L))#{/@/@4)L))#{/@/@4)L++E;3D3DtQiPeS#JGudC[5'JudC[5'J5G))e&cU ))e&cU

 !!*7A!<#
  11%@N+.--uzz$GFBYvww7A*-bllBLLQU*V&
J<<<47")):<<+<+<T50[ 36'--{/@/@3.Hh !,,Yvx-H(S3 58'..0B0B450Iy !,,Yvy-I9U55 +W Hr   c                0    U R                  SSSSSS5        g)z&Tests prefixing all names in the graphTNr  r  s    r   test_add_prefix_all(TestComposeFunctions.test_add_prefix_all  s    dD$dDAr   c                "    U R                  SS9  g)zTests prefixing inplaceTr   Nr  r  s    r   test_add_prefix_inplace,TestComposeFunctions.test_add_prefix_inplace  s    d+r   c                   ^  [        [        5      nSU 4S jjnS H"  n[        R                  " X5      nU" XU5        M$     [	        5       nUR                  U5        Sn[        R                  " XCSS9  U" XU5        g)zTests expanding output dimensions. The resulting graph should have the same output names,
but with one more dimension at the specified index.
c                  > [        UR                  R                  U R                  R                  SS9 H  u  p4TR                  UR                  UR                  5        TR                  UR
                  R                  R                  UR
                  R                  R                  5        [        U5      nUR                  US5        TR                  [        U5      U5        M     g )NTr   r*  )
r  rN   rc   ra   r/   r"   r#   	elem_typer)   insert)rU   rV   dim_idxout_g2out_g1expected_out_shaperQ   s         r   _check_model>TestComposeFunctions.test_expand_out_dim.<locals>._check_model  s    "%bhhoorxxt"T  fkk:  KK++55v{{7N7N7X7X &0%7""))'15  F!35GH #Ur   )r   r,   r   TrO  N)rU   r   rV   r   rV  intru   rv   )r   rx   r   expand_out_dimr   r   )rQ   rU   rZ  rV  rV   s   `    r   test_expand_out_dim(TestComposeFunctions.test_expand_out_dim  sn      	I &G''4B) &
 \
BrD9RW%r   c                   [        [        U5      5       Vs/ s H  n[        R                  " SX   /X;   /S9PM!     nn[        [        U5      5       Vs/ s H+  n[        R                  " X   [
        R                  / 5      PM-     nn[        [        U5      5       Vs/ s H+  n[        R                  " X;   [
        R                  / 5      PM-     nn[        [        U5      5       Vs/ s H+  n[        R                  " X[   [
        R                  / 5      PM-     nn[        [        U5      5       Vs/ s H+  n[        R                  " X{   [
        R                  SS/S9PM-     nn[        [        U	5      5       Vs/ s H  n[        X   5      PM     nn[        [        U5      5       Vs/ s H  n[        R                  " SX+   /XK   /S9PM!     nn[        [        U5      5       Vs/ s H+  n[        R                  " X+   [
        R                  / 5      PM-     nn[        [        U5      5       Vs/ s H+  n[        R                  " XK   [
        R                  / 5      PM-     nn[        [        U5      5       Vs/ s H+  n[        R                  " Xk   [
        R                  / 5      PM-     nn[        [        U5      5       Vs/ s H+  n[        R                  " X   [
        R                  SS/S9PM-     nn[        [        U
5      5       Vs/ s H  n[        X   5      PM     nn[        R                  " SS5      /n[        R                  " [        R                  " USUUUUUS	9S
US9n[        R                  " [        R                  " USUUUUUS	9S
US9n[        R                  " UR                  UR                  5      nSn[!        [#        U5      [#        U5      -  5      n[!        [#        U5      [#        U5      -  5      n[!        [#        UU-   5      5      nU(       a  U R%                  UU   SU45        US-  n[!        [#        U5      [#        U5      -  5      nU(       a  U R%                  UU   SU45        US-  n[!        [#        U5      [#        U5      -  5      n U (       a  U R%                  UU   SU 45        US-  n[!        [#        U	5      [#        U
5      -  5      n!U!(       aO  / n"U! H+  n#U"R'                  U#S-   5        U"R'                  U#S-   5        M-     U R%                  UU   SU"45        US-  n[        R(                  " USS9n$[        R                  " U$R                  UR                  5      nU R%                  S[        U5      5        g s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf )NIdentityr    r*  r/   r0   r1   r2   r   r   g0)r2  r/   rI   rJ   r'   r   r   r   r   rf   r   edger'   r   r.   r4   r   zg0/)r   )r!   r   r   r8  r6  r
   r6   r5   r;   rC   r   r   r9  r   check_overlapping_namesrN   listsetra   appendr   )%rQ   inputs0inputs1outputs0outputs1value_info0value_info1initializer0initializer1sparse_initializer0sparse_initializer1r   r  r  r  r  r  r  r  r  r  r  r  r  opsm0rU   overlapoverlapping_inputsoverlapping_outputsoverlapping_edgesoverlapping_visoverlapping_initoverlapping_sparse_initexpected_overlapoverlapping_namem0_news%                                        r   _test_overlapping_names,TestComposeFunctions._test_overlapping_names  s    3w<(
( Zx{mT( 	 
 3w<(
( ))'*k6G6GL( 	 
 3x=)
) ))(+{7H7H"M) 	 
 3{+,
, ))+.+:K:KRP, 	 
 3|,-	
 . !_0A0ARSQT .	 	 
 3234
4   3 674 	 
 3w<(
( Zx{mT( 	 
 3w<(
( ))'*k6G6GL( 	 
 3x=)
) ))(+{7H7H"M) 	 
 3{+,
, ))+.+:K:KRP, 	 
 3|,-	
 . !_0A0ARSQT .	 	 
 3234
4   3 674 	 

 ""2r*+!#/ !
 !#/ !
 11"((BHHE!#g,W"=>"3x=3x=#@A %7:M%M!NOWQZ&2C)DEFAs;/#k2BBCWQZ,)HIFAL 1C4E EFWQZ-9I)JKFA"&#$s+>'??#
 #!$;  ''(89(DE ''(86(AB %< WQZ*>@P)QRFA##Bu511&,,ICL)i












sG   &V2V#2V()2V-32V2=V7,&V<*2W42W>2W2WWc                ,    U R                  SS/SS/S9  g)z9Tests error checking when the name of the inputs overlapsr  r  i2)rl  rm  Nr  r  s    r   test_overlapping_input_names1TestComposeFunctions.test_overlapping_input_names?  s    $$dD\D$<$Pr   c                ,    U R                  SS/SS/S9  g)z9Tests error checking when the name of the output overlapsr  r  o2)rn  ro  Nr  r  s    r   test_overlapping_output_names2TestComposeFunctions.test_overlapping_output_namesC  s    $$tTldD\$Rr   c                ,    U R                  SS/SS/S9  g)zATests error checking when the name of value_info entries overlapsr  r  vi2)rp  rq  Nr  r  s    r   !test_overlapping_value_info_names6TestComposeFunctions.test_overlapping_value_info_namesG  s"    $$UEN 	% 	
r   c                ,    U R                  SS/SS/S9  g)zBTests error checking when the name of initializer entries overlapsr  r  init2)rr  rs  Nr  r  s    r   "test_overlapping_initializer_names7TestComposeFunctions.test_overlapping_initializer_namesM  s$    $$!7+7G:L 	% 	
r   c                ,    U R                  SS/SS/S9  g)zITests error checking when the name of sparse_initializer entries overlapsr  r  sparse_init2)rt  ru  Nr  r  s    r   )test_overlapping_sparse_initializer_names>TestComposeFunctions.test_overlapping_sparse_initializer_namesS  s%    $$!/ @!/ @ 	% 	
r   c                  ^ [         R                  " SS5      [         R                  " SS5      /m            S%U4S jjn[         R                  " SS5      [         R                  " SS5      /m[        5       nUR                  R	                  [         R
                  " S[        R                  / 5      [         R
                  " S[        R                  / 5      /5        UR                  R	                  [         R
                  " S[        R                  / 5      /5        UR                  R	                  [         R                  " SSSS/S/S	9/5        [        5       nUR                  U5        S
Ul        [         R                  " USTS9nUR                  R	                  U" SSSS/S/[         R                  " SSS/S/S9/5      /5        [        R                   " U5        [        5       nUR                  U5        SUl        [         R                  " USTS9nUR                  R	                  U" SSSS/S/[         R                  " SSS/S/S9/5      /5        [        R                   " U5        ["        R$                  " XFSS/SSS9n[        R                   " U5        UR&                  R                   Vs/ s H  oR(                  PM     n	nU R+                  SS/U	5        UR                   V
s/ s H  oR                  PM     nn
U R+                  SS/U5        [        5       nUR                  U5        SUl        SUR                  S   l        [         R                  " USTS9nUR                  R	                  U" SSSS/S/[         R                  " SSS/S/S9[         R                  " SSS/S/S9[         R                  " SSS/S/S9/5      U" SSSS/S/[         R                  " SSSS/S/S	9[         R                  " SSS/S/S9[         R                  " SSS/S/S9/5      /5        [        R                   " U5        ["        R$                  " XMSS/SSS9n[        R                   " U5        UR&                  R                   Vs/ s H  oR(                  PM     n	nU R+                  SS/U	5        UR                   V
s/ s H  oR                  PM     nn
U R+                  / SQU5        U R+                  S/UR                  S   R                   Vs/ s H  oR(                  PM     sn5        U R+                  / S QUR                  S!   R                   Vs/ s H  oR(                  PM     sn5        U R+                  / S"QUR                  S#   R                   Vs/ s H  oR(                  PM     sn5        g$s  snf s  sn
f s  snf s  sn
f s  snf s  snf s  snf )&zETests error checking when the name of local function entries overlapsr   r   localc                  > [        5       nXl        Xl        UR                  R	                  U5        UR
                  R	                  U5        UR                  R	                  U5        UR                  R	                  T5        U$ )N)r   domainr/   rb   extendrc   rd   opset_import)r  fnamerI   rJ   r2  frv  s         r   _make_functionLTestComposeFunctions.test_overlapping_function_names.<locals>._make_function^  s]     AHFGGNN6"HHOOG$FFMM% NN!!#&Hr   x0x1yf1)r  rI   rJ   rf   r   r   r^   r   rg   r`   )r  r  )r  r  r   r   )rH   rK   rL   m1/f1zm2/f1rW   f2r   y0y1zm3/m3/f2)r  m3/f1r  )r^   r`   r^   r*  )r  r`   r^   r,   N)r  strr  r  rI   	list[str]rJ   r  r2  zlist[NodeProto]ru   r   )r   r   r   rb   r  r6  r
   r6   rc   rd   r8  r   r/   r   	functionsr   r   r   rP   rN   re   ra   )rQ   r  r<  rf   rU   rg   rV   r   r  r2  r  r  rW   rX   rv  s                 @r   test_overlapping_function_names4TestComposeFunctions.test_overlapping_function_namesZ  sd   ""2r*F,?,?,LM			 	 		
 #	 	  ""2r*F,?,?,LML	--dK4E4ErJ--dK4E4ErJ	
 	
--c;3D3DbI	

 	
d7D$<RUQVWX	
 \
ArsK
4LE%%eT4L3%PQ
	
 	B\
ArsK
4LE%%eT4L3%PQ
	
 	B  K5ue
 	A$%GGLL1LqL1'7+U3%&[[1[VV[	1'7+Y7\
A!
rsK
4LE((d|dVT((d|dVT((d|cUS
 4LE(( $PTv ((d|dVT((d|cUS	
8 	B  K5ue
 	A$%GGLL1LqL1'7+U3%&[[1[VV[	14i@%akk!n6I6I"J6I996I"JK!q{{1~7J7J#K7J!II7J#K	
 	#Q9L9L%M9LAii9L%M	
q 2 2V 2 2 #K#K &Ns*   :W3WWWW
 W
%W 
c           	     ^   [         R                  " SS5      /n[        5       nUR                  R	                  [         R
                  " S[        R                  / 5      /5        UR                  R	                  [         R
                  " S[        R                  / 5      /5        UR                  R	                  [         R                  " SS/S/S9/5        [        5       nUR                  U5        SUl        [         R                  " USUS	9n[        R                  " U5        [        5       nUR                  U5        S
Ul        UR                   R	                  [         R"                  " S[        R                  SS/S9/5        [         R                  " USUS	9n[        R                  " U5        [        5       nUR                  U5        SUl        UR$                  R	                  ['        S5      /5        [         R                  " USUS	9n[        R                  " U5        [        5       n	U	R                  U5        SU	l        U	R(                  R	                  [         R
                  " S[        R                  / 5      /5        [         R                  " U	SUS	9n
[        R                  " U
5        [*        R,                  " XFSS/S9nU R/                  S[1        UR2                  R                   5      5        [*        R,                  " XHSS/S9nU R/                  S[1        UR2                  R                   5      5        [*        R,                  " XJSS/S9nUR2                  R(                   Vs1 s H  oR                  iM     nnU R5                  SU5        U R/                  S1U5        gs  snf )z;Tests automatic removal of initializers when merging graphsr   r   xr  rc  r   rf   r   r   rg   rd  r   re  rW   r   )r  r  )rK   rH   zm1/yN)r   r   r   rb   r  r6  r
   r6   rc   rd   r8  r   r/   r   r   r   r   r5   r   rC   r'   r   rP   ra   r   rN   assertNotIn)rQ   rv  r<  rf   rU   rg   rV   rW   rX   r   m4out_m1out_m2out_m3vivalue_info_namess                   r   7test_merge_drop_unnecessary_initializers_and_value_infoLTestComposeFunctions.test_merge_drop_unnecessary_initializers_and_value_info  s   ""2r*+L	55c;;L;LbQRS	66sK<M<MrRST	v''
C53%PQR\
ArsKB\
A
""(9(9!	
 rsKB\
A
$$&9#&>%?@rsKB\
A
**30A0A2FG	
 rsKB %%beZLQC 8 89: %%beZLQC 8 89: %%beZLQ.4ll.E.EF.EGG.EF./&#34 Gs   -N*c                   SnSn[        U5      n[        U5      n[        R                  " X4S/S9nUR                  R                   Vs1 s H  ofR
                  iM     nnUR                  R                   Vs0 s H  oR
                  U_M     n	nU R                  SU5        U R                  SU	5        U R                  UR                  R                  S   R                  5       U	S   R                  5       5        gs  snf s  snf )zIMapped outputs should keep their type info as value_info in merged graph.z
            <
                ir_version: 7,
                opset_import: [ "": 10]
            >
            g1 (float[N, 32] X) => (float[N, 32] Y)
            {
                Y = Identity(X)
            }
            z
            <
                ir_version: 7,
                opset_import: [ "": 10]
            >
            g2 (float[N, 32] X) => (float[N, 32] Z)
            {
                Z = Relu(X)
            }
            )r,  r+  r   r,  r   N)r   r   rP   rN   rc   r/   r'   r  assertInra   SerializeToString)
rQ   r   r   rU   rV   mergedr   output_namesr  value_info_by_names
             r   -test_merge_preserves_mapped_output_value_infoBTestComposeFunctions.test_merge_preserves_mapped_output_value_info  s    		   %%bj\B(.(;(;<(;1(;<4:LL4K4KL4Kbggrk4KLl+c-.HHOOA002s#557	
 =Ls   	C=8Drd  )NNNN)rR   r  rS   r  rH   zlist[tuple[str, str]]rT   z4Callable[[GraphProto, GraphProto, GraphProto], None]rI   list[str] | NonerJ   r  rK   
str | NonerL   r  ru   rv   )ru   rv   )FFFFFFF)r   boolr   r  r   r  r   r  r   r  r   r  r   r  ru   rv   )
)r  r  )r  i3)r  r  )r  o3)v0r   )r   r   )r  r  )r  init3)r  r  )r  sparse_init3)rl  Sequence[str]rm  r  rn  r  ro  r  rp  r  rq  r  rr  r  rs  r  rt  r  ru  r  ru   rv   )&__name__
__module____qualname____firstlineno__rY   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r!  r$  r'  rI  rL  rP  r`  r  r  r  r  r  r  r  r  r  __static_attributes__rd  r   r   rE   rE   c   s2    $($(""!9!9 !9 &	!9
 Q!9 !!9 "!9 !9 !9 
!9FL L"
& LD%
N
6L&S(
*
> $7>P4BF #"#$$)#(rJrJ rJ 	rJ
 rJ "rJ !rJ rJ 
rJh1
23+VZB,&: ".!-".".%1%1&8&8-M-MA*A* A*  	A*
  A* #A* #A* $A* $A* +A* +A* 
A*FQS


G
R85t!
r   rE   __main__)r   r  ru   r   )r   r  r   r  ru   r  )r'   r   ru   z	list[int])r/   r  ru   r	   )!
__future__r   unittesttypingr   numpyr7   onnxr   r   r   r   r	   r
   r   r   r   r   r   r   collections.abcr   r   r   r   r)   rC   rx   ry   TestCaserE   r  mainrd  r   r   <module>r     s    #        2+
Q,

[
8,, [
| zMMO r   