return *this;
}
+uint64_t num_elements(const Shape &shape)
+{
+ if (shape.rank() == 0)
+ {
+ return 0;
+ }
+
+ uint64_t res = 1;
+
+ for (uint32_t axis = 0; axis < shape.rank(); ++axis)
+ {
+ res *= shape.dim(axis);
+ }
+
+ return res;
+}
+
Shape squeeze(const Shape &shape)
{
Shape res{shape};
}
}
+TEST(ADT_TENSOR_SHAPE, num_elements_zero)
+{
+ using nncc::core::ADT::tensor::Shape;
+ using nncc::core::ADT::tensor::num_elements;
+
+ ASSERT_EQ(num_elements(Shape{0, 0, 0, 0}), 0);
+}
+
+TEST(ADT_TENSOR_SHAPE, num_elements_nonzero)
+{
+ using nncc::core::ADT::tensor::Shape;
+ using nncc::core::ADT::tensor::num_elements;
+
+ ASSERT_EQ(num_elements(Shape{2, 3}), 6);
+}
+
+TEST(ADT_TENSOR_SHAPE, num_elements_nulldim)
+{
+ using nncc::core::ADT::tensor::Shape;
+ using nncc::core::ADT::tensor::num_elements;
+
+ ASSERT_EQ(num_elements(Shape{2, 0, 3}), 0);
+}
+
TEST(ADT_TENSOR_SHAPE, squeeze_neg)
{
using nncc::core::ADT::tensor::Shape;