@@ -304,3 +304,235 @@ TEST(ewlayer_onednn, initialization_failure_propagation) {
304304 FAIL () << " Expected std::invalid_argument exception" ;
305305 }
306306}
307+
308+ TEST (ewlayer_onednn, various_dimensions) {
309+ {
310+ EwLayerOneDnn layer (" relu" );
311+ Tensor input = make_tensor<float >({1 .0F , -1 .0F , 0 .0F });
312+ Tensor output;
313+ std::vector<Tensor> in{input};
314+ std::vector<Tensor> out{output};
315+
316+ EXPECT_NO_THROW (layer.run (in, out));
317+ auto result = *out[0 ].as <float >();
318+ EXPECT_EQ (result.size (), 3 );
319+ }
320+
321+ {
322+ EwLayerOneDnn layer (" relu" );
323+ Shape shape2d ({2 , 3 });
324+ std::vector<float > data2d = {1 , -1 , 2 , -2 , 0 , 3 };
325+ Tensor input = make_tensor (data2d, shape2d);
326+ Tensor output;
327+ std::vector<Tensor> in{input};
328+ std::vector<Tensor> out{output};
329+
330+ EXPECT_NO_THROW (layer.run (in, out));
331+ }
332+
333+ {
334+ EwLayerOneDnn layer (" relu" );
335+ Shape shape3d ({2 , 2 , 2 });
336+ std::vector<float > data3d (8 , 1 .0f );
337+ Tensor input = make_tensor (data3d, shape3d);
338+ Tensor output;
339+ std::vector<Tensor> in{input};
340+ std::vector<Tensor> out{output};
341+
342+ EXPECT_NO_THROW (layer.run (in, out));
343+ }
344+
345+ {
346+ EwLayerOneDnn layer (" relu" );
347+ Shape shape4d ({1 , 2 , 2 , 2 });
348+ std::vector<float > data4d (8 , -1 .0f );
349+ Tensor input = make_tensor (data4d, shape4d);
350+ Tensor output;
351+ std::vector<Tensor> in{input};
352+ std::vector<Tensor> out{output};
353+
354+ EXPECT_NO_THROW (layer.run (in, out));
355+ auto result = *out[0 ].as <float >();
356+ for (auto val : result) {
357+ EXPECT_EQ (val, 0 .0f );
358+ }
359+ }
360+
361+ {
362+ EwLayerOneDnn layer (" relu" );
363+ Shape shape5d ({1 , 1 , 2 , 2 , 2 });
364+ std::vector<float > data5d (8 , 2 .0f );
365+ Tensor input = make_tensor (data5d, shape5d);
366+ Tensor output;
367+ std::vector<Tensor> in{input};
368+ std::vector<Tensor> out{output};
369+
370+ EXPECT_NO_THROW (layer.run (in, out));
371+ }
372+ }
373+
374+ TEST (ewlayer_onednn, linear_various_alpha_beta) {
375+ {
376+ EwLayerOneDnn layer (" linear" , 0 .0f , 0 .0f );
377+ Tensor input = make_tensor<float >({1 .0F , 2 .0F , -1 .0F });
378+ Tensor output;
379+ std::vector<Tensor> in{input};
380+ std::vector<Tensor> out{output};
381+
382+ layer.run (in, out);
383+ auto result = *out[0 ].as <float >();
384+ for (auto val : result) {
385+ EXPECT_NEAR (val, 0 .0f , 1e-5 );
386+ }
387+ }
388+
389+ {
390+ EwLayerOneDnn layer (" linear" , 1 .0f , 0 .0f );
391+ Tensor input = make_tensor<float >({1 .0F , 2 .0F , -1 .0F });
392+ Tensor output;
393+ std::vector<Tensor> in{input};
394+ std::vector<Tensor> out{output};
395+
396+ layer.run (in, out);
397+ auto result = *out[0 ].as <float >();
398+ auto input_data = *input.as <float >();
399+ for (size_t i = 0 ; i < result.size (); i++) {
400+ EXPECT_NEAR (result[i], input_data[i], 1e-5 );
401+ }
402+ }
403+
404+ {
405+ EwLayerOneDnn layer (" linear" , 0 .0f , 5 .0f );
406+ Tensor input = make_tensor<float >({1 .0F , 2 .0F , -1 .0F });
407+ Tensor output;
408+ std::vector<Tensor> in{input};
409+ std::vector<Tensor> out{output};
410+
411+ layer.run (in, out);
412+ auto result = *out[0 ].as <float >();
413+ for (auto val : result) {
414+ EXPECT_NEAR (val, 5 .0f , 1e-5 );
415+ }
416+ }
417+
418+ {
419+ EwLayerOneDnn layer (" linear" , -2 .0f , 3 .0f );
420+ Tensor input = make_tensor<float >({1 .0F , 2 .0F , -1 .0F });
421+ Tensor output;
422+ std::vector<float > expected = {1 .0f , -1 .0f , 5 .0f };
423+
424+ std::vector<Tensor> in{input};
425+ std::vector<Tensor> out{output};
426+
427+ layer.run (in, out);
428+ auto result = *out[0 ].as <float >();
429+ for (size_t i = 0 ; i < result.size (); i++) {
430+ EXPECT_NEAR (result[i], expected[i], 1e-5 );
431+ }
432+ }
433+ }
434+
435+ TEST (ewlayer_onednn, reinitialization_for_int) {
436+ EwLayerOneDnn layer (" relu" );
437+
438+ {
439+ Tensor input = make_tensor<float >({1 .0F , -1 .0F });
440+ Tensor output;
441+ std::vector<Tensor> in{input};
442+ std::vector<Tensor> out{output};
443+
444+ layer.run (in, out);
445+ auto float_result = *out[0 ].as <float >();
446+ EXPECT_NEAR (float_result[0 ], 1 .0f , 1e-5 );
447+ EXPECT_NEAR (float_result[1 ], 0 .0f , 1e-5 );
448+ }
449+
450+ {
451+ Tensor input = make_tensor<int >({1 , -1 });
452+ Tensor output;
453+ std::vector<Tensor> in{input};
454+ std::vector<Tensor> out{output};
455+
456+ layer.run (in, out);
457+ auto int_result = *out[0 ].as <int >();
458+ EXPECT_EQ (int_result[0 ], 1 );
459+ EXPECT_EQ (int_result[1 ], 0 );
460+ }
461+
462+ {
463+ Tensor input = make_tensor<float >({2 .0F , -2 .0F });
464+ Tensor output;
465+ std::vector<Tensor> in{input};
466+ std::vector<Tensor> out{output};
467+
468+ layer.run (in, out);
469+ auto float_result = *out[0 ].as <float >();
470+ EXPECT_NEAR (float_result[0 ], 2 .0f , 1e-5 );
471+ EXPECT_NEAR (float_result[1 ], 0 .0f , 1e-5 );
472+ }
473+ }
474+
475+ TEST (ewlayer_onednn, edge_case_dimensions) {
476+ {
477+ EwLayerOneDnn layer (" relu" );
478+ Shape large_shape ({1000 });
479+ std::vector<float > large_data (1000 );
480+ for (size_t i = 0 ; i < large_data.size (); i++) {
481+ large_data[i] = static_cast <float >(i) - 500 .0f ;
482+ }
483+
484+ Tensor input = make_tensor (large_data, large_shape);
485+ Tensor output;
486+ std::vector<Tensor> in{input};
487+ std::vector<Tensor> out{output};
488+
489+ EXPECT_NO_THROW (layer.run (in, out));
490+ auto result = *out[0 ].as <float >();
491+ EXPECT_EQ (result.size (), 1000 );
492+ }
493+
494+ {
495+ EwLayerOneDnn layer (" relu" );
496+ Tensor input = make_tensor<float >({5 .0F });
497+ Tensor output;
498+ std::vector<Tensor> in{input};
499+ std::vector<Tensor> out{output};
500+
501+ EXPECT_NO_THROW (layer.run (in, out));
502+ auto result = *out[0 ].as <float >();
503+ EXPECT_EQ (result.size (), 1 );
504+ EXPECT_NEAR (result[0 ], 5 .0f , 1e-5 );
505+ }
506+ }
507+
508+ TEST (ewlayer_onednn, all_functions_int) {
509+ std::vector<std::pair<std::string, std::vector<int >>> test_cases = {
510+ {" relu" , {1 , 0 , 2 , 0 }},
511+ {" linear" , {3 , -1 , 5 , -9 }},
512+ };
513+
514+ for (const auto & [func, expected] : test_cases) {
515+ EwLayerOneDnn layer (func, 2 .0f , 1 .0f );
516+
517+ std::vector<int > input_data;
518+ if (func == " relu" ) {
519+ input_data = {1 , -1 , 2 , -2 };
520+ } else if (func == " linear" ) {
521+ input_data = {1 , -1 , 2 , -5 };
522+ }
523+
524+ Tensor input = make_tensor<int >(input_data);
525+ Tensor output;
526+ std::vector<Tensor> in{input};
527+ std::vector<Tensor> out{output};
528+
529+ EXPECT_NO_THROW (layer.run (in, out));
530+ auto result = *out[0 ].as <int >();
531+
532+ ASSERT_EQ (result.size (), expected.size ());
533+ for (size_t i = 0 ; i < result.size (); i++) {
534+ EXPECT_EQ (result[i], expected[i])
535+ << " Function: " << func << " , index: " << i;
536+ }
537+ }
538+ }
0 commit comments