@@ -1469,6 +1469,54 @@ TEST_F(GraphTransformationTests, FusePadWithConv) {
1469
1469
}
1470
1470
}
1471
1471
1472
+ TEST_F (GraphTransformationTests, FusePadWithNoPadsConv) {
1473
+ constexpr const ORTCHAR_T* model_uri = MODEL_FOLDER " fusion/fuse-pad-nopadsconv.onnx" ;
1474
+
1475
+ std::shared_ptr<Model> p_model;
1476
+ ASSERT_STATUS_OK (Model::Load (model_uri, p_model, nullptr , *logger_));
1477
+ Graph& graph = p_model->MainGraph ();
1478
+
1479
+ std::vector<int64_t > expected_pads;
1480
+ GraphViewer graphViewer (graph);
1481
+ for (auto & node_index : graphViewer.GetNodesInTopologicalOrder ()) {
1482
+ auto & node = *graph.GetNode (node_index);
1483
+ if (node.OpType () == " Pad" ) {
1484
+ const auto * pads_proto = graph_utils::GetConstantInitializer (graph, node.InputDefs ()[1 ]->Name ());
1485
+ Initializer pads{*pads_proto, graph.ModelPath ()};
1486
+ gsl::span<const int64_t > pads_values = pads.DataAsSpan <int64_t >();
1487
+ expected_pads.resize (pads_values.size () - 4 );
1488
+
1489
+ for (uint32_t pads_index = 2 , index = 0 ; pads_index < pads_values.size () / 2 ; pads_index++, index ++) {
1490
+ expected_pads[index ] = pads_values[pads_index];
1491
+ expected_pads[index + (expected_pads.size () / 2 )] = pads_values[pads_index + (pads_values.size () / 2 )];
1492
+ }
1493
+ }
1494
+ }
1495
+
1496
+ onnxruntime::GraphTransformerManager graph_transformation_mgr{5 };
1497
+ auto rule_transformer_L1 = std::make_unique<RuleBasedGraphTransformer>(" RuleTransformerL1" );
1498
+ ASSERT_STATUS_OK (rule_transformer_L1->Register (std::make_unique<PadFusion>()));
1499
+ ASSERT_STATUS_OK (graph_transformation_mgr.Register (std::move (rule_transformer_L1), TransformerLevel::Level1));
1500
+
1501
+ ASSERT_STATUS_OK (graph_transformation_mgr.ApplyTransformers (graph, TransformerLevel::Level1, *logger_));
1502
+
1503
+ std::map<std::string, int > op_to_count = CountOpsInGraph (graph);
1504
+ ASSERT_EQ (op_to_count[" Pad" ], 0 );
1505
+ ASSERT_EQ (op_to_count[" Conv" ], 1 );
1506
+
1507
+ for (auto & node : graph.Nodes ()) {
1508
+ if (node.OpType () == " Conv" ) {
1509
+ auto child_pads = node.GetMutableAttributes ()[" pads" ].mutable_ints ();
1510
+ ASSERT_EQ (child_pads->size (), static_cast <int32_t >(expected_pads.size ()))
1511
+ << " fusion should produce the same size of pads integer as the Conv node" ;
1512
+ for (uint32_t index = 0 ; index < expected_pads.size (); index ++) {
1513
+ ASSERT_EQ (expected_pads[index ], child_pads->Get (index ))
1514
+ << " fusion does not produce correct padding value" ;
1515
+ }
1516
+ }
1517
+ }
1518
+ }
1519
+
1472
1520
TEST_F (GraphTransformationTests, FusePadWithMaxPool) {
1473
1521
constexpr const ORTCHAR_T* model_uri = MODEL_FOLDER " fusion/fuse-pad-maxpool.onnx" ;
1474
1522
0 commit comments