GitOrigin-RevId: 1a71ad3ede
tags/v1.0.0-rc1
@@ -336,6 +336,23 @@ TEST(TestOprIndexing, MultiAxisVec) { | |||||
checker.run({TensorShape{12, 1, 2, 9}, {23}}, opt); | 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) { | TEST(TestOprIndexing, IncrMultiAxisVec) { | ||||
using Checker = AutoOprChecker<3, 1>; | using Checker = AutoOprChecker<3, 1>; | ||||
using AIdx = opr::indexing::AxisIndexer; | 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); | 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) { | TEST(TestOprIndexing, MultiAxisVecDegenerate) { | ||||
auto graph = ComputingGraph::make(); | auto graph = ComputingGraph::make(); | ||||
auto host_x = HostTensorGenerator<>{}({2, 3}), | auto host_x = HostTensorGenerator<>{}({2, 3}), | ||||
@@ -602,6 +602,32 @@ TEST(TestTensorManip, SubtensorNegativeAxis) { | |||||
run({TensorShape{2, 3, 4, 5}}); | 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) { | TEST(TestTensorManip, SubtensorShapeInferForDynAxisIdx) { | ||||
HostTensorGenerator<> gen; | HostTensorGenerator<> gen; | ||||
auto host_x = gen({5, 6, 3}); | auto host_x = gen({5, 6, 3}); | ||||
@@ -1106,6 +1132,24 @@ TEST(TestTensorManip, SetSubtensorDynIdx) { | |||||
MGB_ASSERT_TENSOR_EQ(*host_x, host_y); | 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) { | TEST(TestTensorManip, IncrSubtensor) { | ||||
using Checker = AutoOprChecker<2, 1>; | using Checker = AutoOprChecker<2, 1>; | ||||
auto make_graph = [](const Checker::SymInpArray &inputs) -> | auto make_graph = [](const Checker::SymInpArray &inputs) -> | ||||