}
}
+TEST(nntrainer_Tensor, dot_shortcuts_p) {
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3), a_data);
+ float b_data[] = {0, 1, 2};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 1), b_data);
+ float answer_data[] = {5};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 1), answer_data);
+ nntrainer::Tensor ret = a.dot(b, false, false);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1), a_data);
+ float b_data[] = {0, 1, 2};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 1), b_data);
+ float answer_data[] = {5};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 1), answer_data);
+ nntrainer::Tensor ret = a.dot(b, true, false);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3), a_data);
+ float b_data[] = {0, 1, 2};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 1, 3), b_data);
+ float answer_data[] = {5};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 1), answer_data);
+ nntrainer::Tensor ret = a.dot(b, false, true);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1), a_data);
+ float b_data[] = {0, 1, 2};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 1, 3), b_data);
+ float answer_data[] = {5};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 1), answer_data);
+ nntrainer::Tensor ret = a.dot(b, true, true);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2, 3, 4, 5};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 2, 3), a_data);
+ float b_data[] = {0, 1, 2};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 1), b_data);
+ float answer_data[] = {5, 14};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 1), answer_data);
+ nntrainer::Tensor ret = a.dot(b, false, false);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 3, 1, 4, 2, 5};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 2), a_data);
+ float b_data[] = {0, 1, 2};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 1), b_data);
+ float answer_data[] = {5, 14};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 1), answer_data);
+ nntrainer::Tensor ret = a.dot(b, true, false);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2, 3, 4, 5};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 2, 3), a_data);
+ float b_data[] = {0, 1, 2};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 1, 3), b_data);
+ float answer_data[] = {5, 14};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 1), answer_data);
+ nntrainer::Tensor ret = a.dot(b, false, true);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 3, 1, 4, 2, 5};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 2), a_data);
+ float b_data[] = {0, 1, 2};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 1, 3), b_data);
+ float answer_data[] = {5, 14};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 1), answer_data);
+ nntrainer::Tensor ret = a.dot(b, true, true);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 4, 3), a_data);
+ float b_data[] = {0, 1, 2};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 1), b_data);
+ float answer_data[] = {5, 14, 23, 32};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 1), answer_data);
+ nntrainer::Tensor ret = a.dot(b, false, false);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 4), a_data);
+ float b_data[] = {0, 1, 2};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 1), b_data);
+ float answer_data[] = {5, 14, 23, 32};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 1), answer_data);
+ nntrainer::Tensor ret = a.dot(b, true, false);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 4, 3), a_data);
+ float b_data[] = {0, 1, 2};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 1, 3), b_data);
+ float answer_data[] = {5, 14, 23, 32};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 1), answer_data);
+ nntrainer::Tensor ret = a.dot(b, false, true);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 4), a_data);
+ float b_data[] = {0, 1, 2};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 1, 3), b_data);
+ float answer_data[] = {5, 14, 23, 32};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 1), answer_data);
+ nntrainer::Tensor ret = a.dot(b, true, true);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3), a_data);
+ float b_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 4), b_data);
+ float answer_data[] = {20, 23, 26, 29};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4), answer_data);
+ nntrainer::Tensor ret = a.dot(b, false, false);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1), a_data);
+ float b_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 4), b_data);
+ float answer_data[] = {20, 23, 26, 29};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4), answer_data);
+ nntrainer::Tensor ret = a.dot(b, true, false);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3), a_data);
+ float b_data[] = {0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 4, 3), b_data);
+ float answer_data[] = {20, 23, 26, 29};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4), answer_data);
+ nntrainer::Tensor ret = a.dot(b, false, true);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1), a_data);
+ float b_data[] = {0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 4, 3), b_data);
+ float answer_data[] = {20, 23, 26, 29};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4), answer_data);
+ nntrainer::Tensor ret = a.dot(b, true, true);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3), a_data);
+ float b_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 4), b_data);
+ float answer_data[] = {20, 23, 26, 29};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4), answer_data);
+ nntrainer::Tensor ret = a.dot(b, false, false);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1), a_data);
+ float b_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 4), b_data);
+ float answer_data[] = {20, 23, 26, 29};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4), answer_data);
+ nntrainer::Tensor ret = a.dot(b, true, false);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3), a_data);
+ float b_data[] = {0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 4, 3), b_data);
+ float answer_data[] = {20, 23, 26, 29};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4), answer_data);
+ nntrainer::Tensor ret = a.dot(b, false, true);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1), a_data);
+ float b_data[] = {0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 4, 3), b_data);
+ float answer_data[] = {20, 23, 26, 29};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4), answer_data);
+ nntrainer::Tensor ret = a.dot(b, true, true);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3), a_data);
+ float b_data[] = {0, 1, 2, 3, 4, 5};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 2), b_data);
+ float answer_data[] = {10, 13};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 2), answer_data);
+ nntrainer::Tensor ret = a.dot(b, false, false);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1), a_data);
+ float b_data[] = {0, 1, 2, 3, 4, 5};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 2), b_data);
+ float answer_data[] = {10, 13};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 2), answer_data);
+ nntrainer::Tensor ret = a.dot(b, true, false);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3), a_data);
+ float b_data[] = {0, 2, 4, 1, 3, 5};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 2, 3), b_data);
+ float answer_data[] = {10, 13};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 2), answer_data);
+ nntrainer::Tensor ret = a.dot(b, false, true);
+ EXPECT_EQ(ret, answer);
+ }
+ {
+ float a_data[] = {0, 1, 2};
+ nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1), a_data);
+ float b_data[] = {0, 2, 4, 1, 3, 5};
+ nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 2, 3), b_data);
+ float answer_data[] = {10, 13};
+ nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 2), answer_data);
+ nntrainer::Tensor ret = a.dot(b, true, true);
+ EXPECT_EQ(ret, answer);
+ }
+}
+
TEST(nntrainer_Tensor, transpose_01_p) {
int status = ML_ERROR_NONE;
int batch = 3;