GitOrigin-RevId: 1a71ad3ede
tags/v1.0.0-rc1
| @@ -336,6 +336,23 @@ TEST(TestOprIndexing, MultiAxisVec) { | |||
| checker.run({TensorShape{12, 1, 2, 9}, {23}}, opt); | |||
| } | |||
| TEST(TestOprIndexing, MultiAxisVecWithEmptyIndexDesc) { | |||
| auto graph = ComputingGraph::make(); | |||
| auto host_x = HostTensorGenerator<>{}({2, 3}); | |||
| auto run_check = [&](SymbolVar y) { | |||
| HostTensorND host_y; | |||
| auto func = graph->compile({make_callback_copy(y, host_y)}); | |||
| func->execute(); | |||
| ASSERT_EQ(TensorShape({2, 3}), host_y.shape()); | |||
| func->execute(); | |||
| MGB_ASSERT_TENSOR_EQ(*host_x, host_y); | |||
| }; | |||
| auto x = opr::Host2DeviceCopy::make(*graph, host_x); | |||
| run_check(opr::IndexingMultiAxisVec::make(x, {})); | |||
| } | |||
| TEST(TestOprIndexing, IncrMultiAxisVec) { | |||
| using Checker = AutoOprChecker<3, 1>; | |||
| using AIdx = opr::indexing::AxisIndexer; | |||
| @@ -429,6 +446,26 @@ TEST(TestOprIndexing, SetMultiAxisVec) { | |||
| checker.run({TensorShape{12, 1, 2, 18}, {1}, {5, 1, 2, 1}}, opt); | |||
| } | |||
| TEST(TestOprIndexing, SetMultiAxisVecWithEmptyIndexDesc) { | |||
| auto graph = ComputingGraph::make(); | |||
| auto host_x = HostTensorGenerator<>{}({2, 3}), | |||
| host_y = HostTensorGenerator<>{}({2, 3}); | |||
| auto run_check = [&](SymbolVar z) { | |||
| HostTensorND host_z; | |||
| auto func = graph->compile({make_callback_copy(z, host_z)}); | |||
| // warning should be printed on the first execution | |||
| func->execute(); | |||
| ASSERT_EQ(TensorShape({2, 3}), host_z.shape()); | |||
| func->execute(); | |||
| MGB_ASSERT_TENSOR_EQ(host_z, *host_y); | |||
| }; | |||
| auto x = opr::Host2DeviceCopy::make(*graph, host_x), | |||
| y = opr::Host2DeviceCopy::make(*graph, host_y); | |||
| run_check(opr::IndexingSetMultiAxisVec::make(x, y, {})); | |||
| } | |||
| TEST(TestOprIndexing, MultiAxisVecDegenerate) { | |||
| auto graph = ComputingGraph::make(); | |||
| auto host_x = HostTensorGenerator<>{}({2, 3}), | |||
| @@ -602,6 +602,32 @@ TEST(TestTensorManip, SubtensorNegativeAxis) { | |||
| run({TensorShape{2, 3, 4, 5}}); | |||
| } | |||
| TEST(TestTensorManip, SubtensorWithEmptyIndexDesc) { | |||
| using Checker = AutoOprChecker<1, 1>; | |||
| auto make_graph = [&](const Checker::SymInpArray &inputs) -> | |||
| Checker::SymOutArray { | |||
| auto x = inputs[0]; | |||
| return {opr::Subtensor::make(x, {})}; | |||
| }; | |||
| auto fwd = [](Checker::NumOutArray &dest, Checker::NumInpArray inp) { | |||
| auto iptr = inp[0]->ptr<float>(); | |||
| auto oshp = inp[0]->shape(); | |||
| auto optr = dest[0].resize(oshp).ptr<float>(); | |||
| for (size_t i = 0, it = oshp.total_nr_elems(); i < it; ++i) { | |||
| optr[i] = iptr[i]; | |||
| } | |||
| }; | |||
| Checker checker(make_graph, fwd); | |||
| checker. | |||
| run({TensorShape{5}}). | |||
| run({TensorShape{2, 3}}). | |||
| run({TensorShape{2, 3, 4}}). | |||
| run({TensorShape{2, 3, 4, 5}}); | |||
| } | |||
| TEST(TestTensorManip, SubtensorShapeInferForDynAxisIdx) { | |||
| HostTensorGenerator<> gen; | |||
| auto host_x = gen({5, 6, 3}); | |||
| @@ -1106,6 +1132,24 @@ TEST(TestTensorManip, SetSubtensorDynIdx) { | |||
| MGB_ASSERT_TENSOR_EQ(*host_x, host_y); | |||
| } | |||
| TEST(TestTensorManip, SetSubtensorWithEmptyIndexDesc) { | |||
| HostTensorGenerator<> gen; | |||
| auto host_x = gen({12}), host_y = gen({12}); | |||
| auto graph = ComputingGraph::make(); | |||
| auto x = opr::Host2DeviceCopy::make(*graph, host_x), | |||
| y = opr::Host2DeviceCopy::make(*graph, host_y), | |||
| z = opr::SetSubtensor::make(x, y, {}); | |||
| ASSERT_TRUE(cg::is_static_var_storage(z.node())); | |||
| HostTensorND host_z; | |||
| auto func = graph->compile({make_callback_copy(z, host_z)}); | |||
| func->execute(); | |||
| MGB_ASSERT_TENSOR_EQ(*host_y, host_z); | |||
| } | |||
| TEST(TestTensorManip, IncrSubtensor) { | |||
| using Checker = AutoOprChecker<2, 1>; | |||
| auto make_graph = [](const Checker::SymInpArray &inputs) -> | |||