forked from mindspore-Ecosystem/mindspore
!47659 Enhance ut test cast
Merge pull request !47659 from ZPaC/add-scalar-to-tensor-ut
This commit is contained in:
commit
be02f82a51
|
@ -134,6 +134,18 @@ AnfNodePtr CreateRealMakeTupleByTupleUnfoldInput(const FuncGraphPtr &func_graph,
|
||||||
KernelBuildInfoPtr real_make_tuple_build_info = AnfAlgo::GetSelectKernelBuildInfo(real_make_tuple);
|
KernelBuildInfoPtr real_make_tuple_build_info = AnfAlgo::GetSelectKernelBuildInfo(real_make_tuple);
|
||||||
MS_EXCEPTION_IF_NULL(real_make_tuple_build_info);
|
MS_EXCEPTION_IF_NULL(real_make_tuple_build_info);
|
||||||
real_make_tuple_build_info->SetInputsKernelObjectType({KernelObjectType::TUPLE_UNFOLD});
|
real_make_tuple_build_info->SetInputsKernelObjectType({KernelObjectType::TUPLE_UNFOLD});
|
||||||
|
|
||||||
|
// Extend tuple_unfold inputs.
|
||||||
|
abstract::AbstractTuplePtr tuple_unfold_abs =
|
||||||
|
node_with_tuple_unfold_output->abstract()->cast<abstract::AbstractTuplePtr>();
|
||||||
|
MS_EXCEPTION_IF_NULL(tuple_unfold_abs);
|
||||||
|
auto builder = AnfAlgo::GetSelectKernelBuildInfo(real_make_tuple);
|
||||||
|
MS_EXCEPTION_IF_NULL(builder);
|
||||||
|
std::vector<std::string> inputs_format{tuple_unfold_abs->size(), builder->GetInputFormat(kIndex0)};
|
||||||
|
std::vector<TypeId> inputs_type{tuple_unfold_abs->size(), builder->GetInputDeviceType(kIndex0)};
|
||||||
|
builder->SetInputsFormat(inputs_format);
|
||||||
|
builder->SetInputsDeviceType(inputs_type);
|
||||||
|
|
||||||
return real_make_tuple;
|
return real_make_tuple;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,16 +269,6 @@ abstract::AbstractBasePtr GenerateAbsByOpInfer(const PrimitivePtr &primitive, co
|
||||||
return abs;
|
return abs;
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract::AbstractBasePtr GenerateAbsByUserNodeInput(const CNodePtr &user_node, size_t input_index) {
|
|
||||||
MS_EXCEPTION_IF_NULL(user_node);
|
|
||||||
auto shape = AnfAlgo::GetInputDeviceShape(user_node, input_index);
|
|
||||||
auto type_id = AnfAlgo::GetInputDeviceDataType(user_node, input_index);
|
|
||||||
// Defaultly the input is a tensor. Other cases should be handled respectively.
|
|
||||||
auto abs = std::make_shared<abstract::AbstractTensor>(TypeIdToType(type_id), shape);
|
|
||||||
MS_EXCEPTION_IF_NULL(abs);
|
|
||||||
return abs;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string GenerateOutputFormatForNewCNode(const CNodePtr &cnode) {
|
std::string GenerateOutputFormatForNewCNode(const CNodePtr &cnode) {
|
||||||
MS_EXCEPTION_IF_NULL(cnode);
|
MS_EXCEPTION_IF_NULL(cnode);
|
||||||
if (IsPrimitiveCNode(cnode, prim::kPrimRealMakeTuple) || IsPrimitiveCNode(cnode, prim::kPrimTupleToTensor)) {
|
if (IsPrimitiveCNode(cnode, prim::kPrimRealMakeTuple) || IsPrimitiveCNode(cnode, prim::kPrimTupleToTensor)) {
|
||||||
|
@ -559,7 +561,7 @@ AnfNodePtrList InsertTypeTransformOp::ProcessTupleUnfoldToTensor(const FuncGraph
|
||||||
// Data type of the tensor should be set as an attr of TupleToTensor op.
|
// Data type of the tensor should be set as an attr of TupleToTensor op.
|
||||||
size_t input_index = GetInputNodeIndex(input, node);
|
size_t input_index = GetInputNodeIndex(input, node);
|
||||||
auto data_type = AnfAlgo::GetInputDeviceDataType(node, input_index);
|
auto data_type = AnfAlgo::GetInputDeviceDataType(node, input_index);
|
||||||
common::AnfAlgo::SetNodeAttr("dtype", TypeIdToType(data_type), tuple_to_tensor);
|
common::AnfAlgo::SetNodeAttr(kAttrDType, TypeIdToType(data_type), tuple_to_tensor);
|
||||||
|
|
||||||
// Set abstract for TupleToTensor op according to user node's input shape and type.
|
// Set abstract for TupleToTensor op according to user node's input shape and type.
|
||||||
auto abs = GenerateAbsByOpInfer(prim::kPrimTupleToTensor, {input});
|
auto abs = GenerateAbsByOpInfer(prim::kPrimTupleToTensor, {input});
|
||||||
|
@ -625,7 +627,7 @@ AnfNodePtrList InsertTypeTransformOp::ProcessTupleToTensor(const FuncGraphPtr &f
|
||||||
// Data type of the tensor should be set as an attr of TupleToTensor op.
|
// Data type of the tensor should be set as an attr of TupleToTensor op.
|
||||||
size_t input_index = GetInputNodeIndex(input, node);
|
size_t input_index = GetInputNodeIndex(input, node);
|
||||||
auto data_type = AnfAlgo::GetInputDeviceDataType(node, input_index);
|
auto data_type = AnfAlgo::GetInputDeviceDataType(node, input_index);
|
||||||
common::AnfAlgo::SetNodeAttr("dtype", TypeIdToType(data_type), tuple_to_tensor);
|
common::AnfAlgo::SetNodeAttr(kAttrDType, TypeIdToType(data_type), tuple_to_tensor);
|
||||||
|
|
||||||
// Set abstract for TupleToTensor op according to user node's input shape and type.
|
// Set abstract for TupleToTensor op according to user node's input shape and type.
|
||||||
auto abs = GenerateAbsByOpInfer(prim::kPrimTupleToTensor, {input});
|
auto abs = GenerateAbsByOpInfer(prim::kPrimTupleToTensor, {input});
|
||||||
|
|
|
@ -105,9 +105,6 @@ abstract::AbstractBasePtr GenerateAbsByOpInfer(const PrimitivePtr &primitive);
|
||||||
|
|
||||||
// Generate abstract, format and object type for newly created node.
|
// Generate abstract, format and object type for newly created node.
|
||||||
// They can be generated in multiple ways because new node is not processed by kernel selecting method.
|
// They can be generated in multiple ways because new node is not processed by kernel selecting method.
|
||||||
|
|
||||||
// Generate abstract according to input type and shape which is already set to the user node.
|
|
||||||
abstract::AbstractBasePtr GenerateAbsByUserNodeInput(const CNodePtr &user_node, size_t input_index);
|
|
||||||
std::string GenerateOutputFormatForNewCNode(const CNodePtr &cnode);
|
std::string GenerateOutputFormatForNewCNode(const CNodePtr &cnode);
|
||||||
void GenerateKernelObjectTypeForNewCNode(const CNodePtr &cnode, std::vector<KernelObjectType> *input_obj_type,
|
void GenerateKernelObjectTypeForNewCNode(const CNodePtr &cnode, std::vector<KernelObjectType> *input_obj_type,
|
||||||
std::vector<KernelObjectType> *output_obj_type);
|
std::vector<KernelObjectType> *output_obj_type);
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
#include "backend/common/optimizer/optimizer.h"
|
#include "backend/common/optimizer/optimizer.h"
|
||||||
#include "backend/common/optimizer/pass_manager.h"
|
#include "backend/common/optimizer/pass_manager.h"
|
||||||
#include "include/common/utils/utils.h"
|
#include "include/common/utils/utils.h"
|
||||||
|
#include "include/common/utils/anfalgo.h"
|
||||||
|
#include "kernel/kernel_build_info.h"
|
||||||
|
|
||||||
#define private public
|
#define private public
|
||||||
#define protected public
|
#define protected public
|
||||||
|
@ -45,9 +47,12 @@ class TestInsertTypeTransformOp : public BackendCommon {
|
||||||
AnfNodePtr *split2_ptr, AnfNodePtr *addn2_ptr);
|
AnfNodePtr *split2_ptr, AnfNodePtr *addn2_ptr);
|
||||||
void SetTupleUnfoldToTupleKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *make_tuple_ptr, AnfNodePtr *split_ptr,
|
void SetTupleUnfoldToTupleKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *make_tuple_ptr, AnfNodePtr *split_ptr,
|
||||||
AnfNodePtr *seq_add1_ptr, AnfNodePtr *seq_add2_ptr);
|
AnfNodePtr *seq_add1_ptr, AnfNodePtr *seq_add2_ptr);
|
||||||
void SetTupleUnfoldToTensorKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *make_tuple, AnfNodePtr *reshape);
|
void SetTupleUnfoldToTensorKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *make_tuple, AnfNodePtr *reshape_ptr);
|
||||||
|
void SetTupleToTupleUnfoldKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *shape_ptr);
|
||||||
void SetTupleToTensorKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *reshape_ptr);
|
void SetTupleToTensorKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *reshape_ptr);
|
||||||
void SetTensorToTupleKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *seq_add);
|
void SetScalarToTensorKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *add_ptr);
|
||||||
|
void SetTensorToTupleKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *seq_add_ptr);
|
||||||
|
void SetTensorToScalarKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *scalar_to_tensor_ptr);
|
||||||
|
|
||||||
void SetKernelBuildInfo(const AnfNodePtr &node, const std::vector<std::string> &input_formats,
|
void SetKernelBuildInfo(const AnfNodePtr &node, const std::vector<std::string> &input_formats,
|
||||||
const std::vector<TypeId> &input_types, const std::vector<std::string> &output_formats,
|
const std::vector<TypeId> &input_types, const std::vector<std::string> &output_formats,
|
||||||
|
@ -192,6 +197,20 @@ void TestInsertTypeTransformOp::SetTupleUnfoldToTensorKernelBuildInfo(const Func
|
||||||
{KernelObjectType::TENSOR}, {KernelObjectType::TENSOR});
|
{KernelObjectType::TENSOR}, {KernelObjectType::TENSOR});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TestInsertTypeTransformOp::SetTupleToTupleUnfoldKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *shape_ptr) {
|
||||||
|
auto ret = g->get_return();
|
||||||
|
EXPECT_NE(ret->input(1), nullptr);
|
||||||
|
auto tuple_get_item = ret->input(1)->cast<CNodePtr>();
|
||||||
|
SetKernelBuildInfo(tuple_get_item, {"NCHW", "NCHW"}, {kNumberTypeFloat32, kNumberTypeInt64}, {"NCHW"},
|
||||||
|
{kNumberTypeFloat32}, {KernelObjectType::TUPLE_UNFOLD, KernelObjectType::SCALAR},
|
||||||
|
{KernelObjectType::SCALAR});
|
||||||
|
|
||||||
|
auto shape = tuple_get_item->input(1)->cast<CNodePtr>();
|
||||||
|
*shape_ptr = shape;
|
||||||
|
SetKernelBuildInfo(shape, {"NCHW"}, {kNumberTypeFloat32}, {"NCHW"}, {kNumberTypeInt64}, {KernelObjectType::SCALAR},
|
||||||
|
{KernelObjectType::TUPLE});
|
||||||
|
}
|
||||||
|
|
||||||
void TestInsertTypeTransformOp::SetTupleToTensorKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *reshape_ptr) {
|
void TestInsertTypeTransformOp::SetTupleToTensorKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *reshape_ptr) {
|
||||||
auto ret = g->get_return();
|
auto ret = g->get_return();
|
||||||
EXPECT_NE(ret->input(1), nullptr);
|
EXPECT_NE(ret->input(1), nullptr);
|
||||||
|
@ -209,6 +228,15 @@ void TestInsertTypeTransformOp::SetTupleToTensorKernelBuildInfo(const FuncGraphP
|
||||||
{KernelObjectType::TENSOR});
|
{KernelObjectType::TENSOR});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TestInsertTypeTransformOp::SetScalarToTensorKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *add_ptr) {
|
||||||
|
auto ret = g->get_return();
|
||||||
|
EXPECT_NE(ret->input(1), nullptr);
|
||||||
|
auto add = ret->input(1)->cast<CNodePtr>();
|
||||||
|
*add_ptr = add;
|
||||||
|
SetKernelBuildInfo(add, {"NCHW", "NCHW"}, {kNumberTypeFloat32, kNumberTypeFloat32}, {"NCHW"}, {kNumberTypeFloat32},
|
||||||
|
{KernelObjectType::TENSOR, KernelObjectType::TENSOR}, {KernelObjectType::TENSOR});
|
||||||
|
}
|
||||||
|
|
||||||
void TestInsertTypeTransformOp::SetTensorToTupleKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *seq_add_ptr) {
|
void TestInsertTypeTransformOp::SetTensorToTupleKernelBuildInfo(const FuncGraphPtr &g, AnfNodePtr *seq_add_ptr) {
|
||||||
auto ret = g->get_return();
|
auto ret = g->get_return();
|
||||||
EXPECT_NE(ret->input(1), nullptr);
|
EXPECT_NE(ret->input(1), nullptr);
|
||||||
|
@ -226,6 +254,16 @@ void TestInsertTypeTransformOp::SetTensorToTupleKernelBuildInfo(const FuncGraphP
|
||||||
{KernelObjectType::TENSOR});
|
{KernelObjectType::TENSOR});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TestInsertTypeTransformOp::SetTensorToScalarKernelBuildInfo(const FuncGraphPtr &g,
|
||||||
|
AnfNodePtr *scalar_to_tensor_ptr) {
|
||||||
|
auto ret = g->get_return();
|
||||||
|
EXPECT_NE(ret->input(1), nullptr);
|
||||||
|
auto scalar_to_tensor = ret->input(1)->cast<CNodePtr>();
|
||||||
|
*scalar_to_tensor_ptr = scalar_to_tensor;
|
||||||
|
SetKernelBuildInfo(scalar_to_tensor, {"NCHW"}, {kNumberTypeFloat32}, {"NCHW"}, {kNumberTypeFloat32},
|
||||||
|
{KernelObjectType::SCALAR}, {KernelObjectType::TENSOR});
|
||||||
|
}
|
||||||
|
|
||||||
void TestInsertTypeTransformOp::SetKernelBuildInfo(
|
void TestInsertTypeTransformOp::SetKernelBuildInfo(
|
||||||
const AnfNodePtr &node, const std::vector<std::string> &input_formats, const std::vector<TypeId> &input_types,
|
const AnfNodePtr &node, const std::vector<std::string> &input_formats, const std::vector<TypeId> &input_types,
|
||||||
const std::vector<std::string> &output_formats, const std::vector<TypeId> &output_types,
|
const std::vector<std::string> &output_formats, const std::vector<TypeId> &output_types,
|
||||||
|
@ -318,6 +356,12 @@ TEST_F(TestInsertTypeTransformOp, test_tuple_unfold_to_tuple_transform) {
|
||||||
optimizer->AddPassManager(pm);
|
optimizer->AddPassManager(pm);
|
||||||
optimizer->Optimize(func_graph);
|
optimizer->Optimize(func_graph);
|
||||||
|
|
||||||
|
auto real_make_tuple2 = func_graph->get_return()->input(1)->cast<CNodePtr>()->input(1)->cast<CNodePtr>();
|
||||||
|
ASSERT_TRUE(IsPrimitiveCNode(real_make_tuple2, prim::kPrimRealMakeTuple));
|
||||||
|
ASSERT_TRUE(real_make_tuple2->abstract()->isa<abstract::AbstractTuple>());
|
||||||
|
auto obj_type = AnfAlgo::GetOutputKernelObjectType(real_make_tuple2, 0);
|
||||||
|
ASSERT_TRUE(obj_type == KernelObjectType::TUPLE);
|
||||||
|
|
||||||
FuncGraphPtr g_after = getPyFun_.CallAndParseRet("test_tuple_unfold_to_tuple_transform", "after");
|
FuncGraphPtr g_after = getPyFun_.CallAndParseRet("test_tuple_unfold_to_tuple_transform", "after");
|
||||||
ASSERT_TRUE(g_after != nullptr);
|
ASSERT_TRUE(g_after != nullptr);
|
||||||
EXPECT_TRUE(CheckEqualGraph(func_graph, g_after));
|
EXPECT_TRUE(CheckEqualGraph(func_graph, g_after));
|
||||||
|
@ -348,11 +392,51 @@ TEST_F(TestInsertTypeTransformOp, test_tuple_unfold_to_tensor_transform) {
|
||||||
optimizer->AddPassManager(pm);
|
optimizer->AddPassManager(pm);
|
||||||
optimizer->Optimize(func_graph);
|
optimizer->Optimize(func_graph);
|
||||||
|
|
||||||
|
auto tuple_to_tensor = func_graph->get_return()->input(1)->cast<CNodePtr>()->input(2)->cast<CNodePtr>();
|
||||||
|
ASSERT_TRUE(IsPrimitiveCNode(tuple_to_tensor, prim::kPrimTupleToTensor));
|
||||||
|
auto real_make_tuple = tuple_to_tensor->input(1);
|
||||||
|
ASSERT_TRUE(IsPrimitiveCNode(real_make_tuple, prim::kPrimRealMakeTuple));
|
||||||
|
ASSERT_TRUE(real_make_tuple->abstract()->isa<abstract::AbstractTuple>());
|
||||||
|
auto obj_type = AnfAlgo::GetOutputKernelObjectType(real_make_tuple, 0);
|
||||||
|
ASSERT_TRUE(obj_type == KernelObjectType::TUPLE);
|
||||||
|
|
||||||
FuncGraphPtr g_after = getPyFun_.CallAndParseRet("test_tuple_unfold_to_tensor_transform", "after");
|
FuncGraphPtr g_after = getPyFun_.CallAndParseRet("test_tuple_unfold_to_tensor_transform", "after");
|
||||||
ASSERT_TRUE(g_after != nullptr);
|
ASSERT_TRUE(g_after != nullptr);
|
||||||
EXPECT_TRUE(CheckEqualGraph(func_graph, g_after));
|
EXPECT_TRUE(CheckEqualGraph(func_graph, g_after));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Feature: Dynamic shape.
|
||||||
|
/// Description: Test Tuple to TupleUnfold type transforming pass.
|
||||||
|
/// Expectation: After InsertTypeTransformOp pass, the graph is identical to the expected graph expressed by python.
|
||||||
|
TEST_F(TestInsertTypeTransformOp, DISABLED_test_tuple_to_tuple_unfold_transform) {
|
||||||
|
FuncGraphPtr g = getPyFun_.CallAndParseRet("test_tuple_to_tuple_unfold_transform", "before");
|
||||||
|
ASSERT_TRUE(g != nullptr);
|
||||||
|
std::vector<int64_t> shp_x{4, 2};
|
||||||
|
auto x_abstract = std::make_shared<abstract::AbstractTensor>(kFloat32, shp_x);
|
||||||
|
AbstractBasePtrList args_spec_list{x_abstract};
|
||||||
|
auto func_graph = GetFuncGraph(g, args_spec_list);
|
||||||
|
ASSERT_TRUE(func_graph != nullptr);
|
||||||
|
AnfNodePtr shape;
|
||||||
|
SetTupleToTupleUnfoldKernelBuildInfo(func_graph, &shape);
|
||||||
|
|
||||||
|
auto optimizer = std::make_shared<opt::GraphOptimizer>();
|
||||||
|
auto pm = std::make_shared<opt::PassManager>();
|
||||||
|
pm->AddPass(std::make_shared<opt::InsertTypeTransformOp>());
|
||||||
|
optimizer->AddPassManager(pm);
|
||||||
|
optimizer->Optimize(func_graph);
|
||||||
|
|
||||||
|
auto ret = func_graph->get_return();
|
||||||
|
auto real_tuple_get_item = ret->input(1)->cast<CNodePtr>();
|
||||||
|
ASSERT_TRUE(IsPrimitiveCNode(real_tuple_get_item, prim::kPrimRealTupleGetItem));
|
||||||
|
ASSERT_TRUE(real_tuple_get_item->abstract()->isa<abstract::AbstractScalar>());
|
||||||
|
auto obj_type = AnfAlgo::GetOutputKernelObjectType(real_tuple_get_item, 0);
|
||||||
|
ASSERT_TRUE(obj_type == KernelObjectType::SCALAR);
|
||||||
|
|
||||||
|
FuncGraphPtr g_after = getPyFun_.CallAndParseRet("test_tuple_to_tuple_unfold_transform", "after");
|
||||||
|
ASSERT_TRUE(g_after != nullptr);
|
||||||
|
EXPECT_TRUE(CheckEqualGraph(func_graph, g_after));
|
||||||
|
}
|
||||||
|
|
||||||
/// Feature: Dynamic shape.
|
/// Feature: Dynamic shape.
|
||||||
/// Description: Test Tuple to Tensor type transforming pass.
|
/// Description: Test Tuple to Tensor type transforming pass.
|
||||||
/// Expectation: After InsertTypeTransformOp pass, the graph is identical to the expected graph expressed by python.
|
/// Expectation: After InsertTypeTransformOp pass, the graph is identical to the expected graph expressed by python.
|
||||||
|
@ -377,11 +461,52 @@ TEST_F(TestInsertTypeTransformOp, test_tuple_to_tensor_transform) {
|
||||||
optimizer->AddPassManager(pm);
|
optimizer->AddPassManager(pm);
|
||||||
optimizer->Optimize(func_graph);
|
optimizer->Optimize(func_graph);
|
||||||
|
|
||||||
|
auto tuple_to_tensor = func_graph->get_return()->input(1)->cast<CNodePtr>()->input(2)->cast<CNodePtr>();
|
||||||
|
ASSERT_TRUE(IsPrimitiveCNode(tuple_to_tensor, prim::kPrimTupleToTensor));
|
||||||
|
auto dtype = common::AnfAlgo::GetNodeAttr<TypePtr>(tuple_to_tensor, kAttrDType);
|
||||||
|
ASSERT_TRUE(dtype->type_id() == kNumberTypeFloat32);
|
||||||
|
ASSERT_TRUE(tuple_to_tensor->abstract()->isa<abstract::AbstractTensor>());
|
||||||
|
auto obj_type = AnfAlgo::GetOutputKernelObjectType(tuple_to_tensor, 0);
|
||||||
|
ASSERT_TRUE(obj_type == KernelObjectType::TENSOR);
|
||||||
|
|
||||||
FuncGraphPtr g_after = getPyFun_.CallAndParseRet("test_tuple_to_tensor_transform", "after");
|
FuncGraphPtr g_after = getPyFun_.CallAndParseRet("test_tuple_to_tensor_transform", "after");
|
||||||
ASSERT_TRUE(g_after != nullptr);
|
ASSERT_TRUE(g_after != nullptr);
|
||||||
EXPECT_TRUE(CheckEqualGraph(func_graph, g_after));
|
EXPECT_TRUE(CheckEqualGraph(func_graph, g_after));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Feature: Dynamic shape.
|
||||||
|
/// Description: Test Scalar to Tensor type transforming pass.
|
||||||
|
/// Expectation: After InsertTypeTransformOp pass, the graph is identical to the expected graph expressed by python.
|
||||||
|
TEST_F(TestInsertTypeTransformOp, DISABLED_test_scalar_to_tensor_transform) {
|
||||||
|
FuncGraphPtr g = getPyFun_.CallAndParseRet("test_scalar_to_tensor_transform", "before");
|
||||||
|
ASSERT_TRUE(g != nullptr);
|
||||||
|
auto x_abstract = std::make_shared<abstract::AbstractScalar>(3);
|
||||||
|
auto y_abstract = std::make_shared<abstract::AbstractScalar>(4);
|
||||||
|
AbstractBasePtrList args_spec_list{x_abstract, y_abstract};
|
||||||
|
auto func_graph = GetFuncGraph(g, args_spec_list);
|
||||||
|
ASSERT_TRUE(func_graph != nullptr);
|
||||||
|
AnfNodePtr add;
|
||||||
|
SetScalarToTensorKernelBuildInfo(func_graph, &add);
|
||||||
|
|
||||||
|
auto optimizer = std::make_shared<opt::GraphOptimizer>();
|
||||||
|
auto pm = std::make_shared<opt::PassManager>();
|
||||||
|
pm->AddPass(std::make_shared<opt::InsertTypeTransformOp>());
|
||||||
|
optimizer->AddPassManager(pm);
|
||||||
|
optimizer->Optimize(func_graph);
|
||||||
|
|
||||||
|
auto scalar_to_tensor1 = func_graph->get_return()->input(1)->cast<CNodePtr>()->input(1)->cast<CNodePtr>();
|
||||||
|
ASSERT_TRUE(IsPrimitiveCNode(scalar_to_tensor1, prim::kPrimScalarToTensor));
|
||||||
|
auto dtype = common::AnfAlgo::GetNodeAttr<TypePtr>(scalar_to_tensor1, kAttrDType);
|
||||||
|
ASSERT_TRUE(dtype->type_id() == kNumberTypeInt64);
|
||||||
|
ASSERT_TRUE(scalar_to_tensor1->abstract()->isa<abstract::AbstractTensor>());
|
||||||
|
auto obj_type = AnfAlgo::GetOutputKernelObjectType(scalar_to_tensor1, 0);
|
||||||
|
ASSERT_TRUE(obj_type == KernelObjectType::TENSOR);
|
||||||
|
|
||||||
|
FuncGraphPtr g_after = getPyFun_.CallAndParseRet("test_scalar_to_tensor_transform", "after");
|
||||||
|
ASSERT_TRUE(g_after != nullptr);
|
||||||
|
EXPECT_TRUE(CheckEqualGraph(func_graph, g_after));
|
||||||
|
}
|
||||||
|
|
||||||
/// Feature: Dynamic shape.
|
/// Feature: Dynamic shape.
|
||||||
/// Description: Test Tensor to Tuple type transforming pass.
|
/// Description: Test Tensor to Tuple type transforming pass.
|
||||||
/// Expectation: After InsertTypeTransformOp pass, the graph is identical to the expected graph expressed by python.
|
/// Expectation: After InsertTypeTransformOp pass, the graph is identical to the expected graph expressed by python.
|
||||||
|
@ -404,9 +529,46 @@ TEST_F(TestInsertTypeTransformOp, test_tensor_to_tuple_transform) {
|
||||||
optimizer->AddPassManager(pm);
|
optimizer->AddPassManager(pm);
|
||||||
optimizer->Optimize(func_graph);
|
optimizer->Optimize(func_graph);
|
||||||
|
|
||||||
|
auto tensor_to_tuple1 = func_graph->get_return()->input(1)->cast<CNodePtr>()->input(1)->cast<CNodePtr>();
|
||||||
|
ASSERT_TRUE(IsPrimitiveCNode(tensor_to_tuple1, prim::kPrimTensorToTuple));
|
||||||
|
ASSERT_TRUE(tensor_to_tuple1->abstract()->isa<abstract::AbstractTuple>());
|
||||||
|
auto obj_type = AnfAlgo::GetOutputKernelObjectType(tensor_to_tuple1, 0);
|
||||||
|
ASSERT_TRUE(obj_type == KernelObjectType::TUPLE);
|
||||||
|
|
||||||
FuncGraphPtr g_after = getPyFun_.CallAndParseRet("test_tensor_to_tuple_transform", "after");
|
FuncGraphPtr g_after = getPyFun_.CallAndParseRet("test_tensor_to_tuple_transform", "after");
|
||||||
ASSERT_TRUE(g_after != nullptr);
|
ASSERT_TRUE(g_after != nullptr);
|
||||||
EXPECT_TRUE(CheckEqualGraph(func_graph, g_after));
|
EXPECT_TRUE(CheckEqualGraph(func_graph, g_after));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Feature: Dynamic shape.
|
||||||
|
/// Description: Test Tensor to Scalar type transforming pass.
|
||||||
|
/// Expectation: After InsertTypeTransformOp pass, the graph is identical to the expected graph expressed by python.
|
||||||
|
TEST_F(TestInsertTypeTransformOp, DISABLED_test_tensor_to_scalar_transform) {
|
||||||
|
FuncGraphPtr g = getPyFun_.CallAndParseRet("test_tensor_to_scalar_transform", "before");
|
||||||
|
ASSERT_TRUE(g != nullptr);
|
||||||
|
std::vector<int64_t> shp_x{4};
|
||||||
|
auto x_abstract = std::make_shared<abstract::AbstractTensor>(kFloat32, shp_x);
|
||||||
|
AbstractBasePtrList args_spec_list{x_abstract};
|
||||||
|
auto func_graph = GetFuncGraph(g, args_spec_list);
|
||||||
|
ASSERT_TRUE(func_graph != nullptr);
|
||||||
|
AnfNodePtr scalar_to_tensor;
|
||||||
|
SetTensorToScalarKernelBuildInfo(func_graph, &scalar_to_tensor);
|
||||||
|
|
||||||
|
auto optimizer = std::make_shared<opt::GraphOptimizer>();
|
||||||
|
auto pm = std::make_shared<opt::PassManager>();
|
||||||
|
pm->AddPass(std::make_shared<opt::InsertTypeTransformOp>());
|
||||||
|
optimizer->AddPassManager(pm);
|
||||||
|
optimizer->Optimize(func_graph);
|
||||||
|
|
||||||
|
auto tensor_to_scalar = func_graph->get_return()->input(1)->cast<CNodePtr>()->input(1)->cast<CNodePtr>();
|
||||||
|
ASSERT_TRUE(IsPrimitiveCNode(tensor_to_scalar, prim::kPrimTensorToScalar));
|
||||||
|
ASSERT_TRUE(tensor_to_scalar->abstract()->isa<abstract::AbstractScalar>());
|
||||||
|
auto obj_type = AnfAlgo::GetOutputKernelObjectType(tensor_to_scalar, 0);
|
||||||
|
ASSERT_TRUE(obj_type == KernelObjectType::SCALAR);
|
||||||
|
|
||||||
|
FuncGraphPtr g_after = getPyFun_.CallAndParseRet("test_tensor_to_scalar_transform", "after");
|
||||||
|
ASSERT_TRUE(g_after != nullptr);
|
||||||
|
EXPECT_TRUE(CheckEqualGraph(func_graph, g_after));
|
||||||
|
}
|
||||||
} // namespace opt
|
} // namespace opt
|
||||||
} // namespace mindspore
|
} // namespace mindspore
|
||||||
|
|
|
@ -127,6 +127,31 @@ def test_tuple_unfold_to_tensor_transform(tag):
|
||||||
return fns[tag]
|
return fns[tag]
|
||||||
|
|
||||||
|
|
||||||
|
def test_tuple_to_tuple_unfold_transform(tag):
|
||||||
|
"""
|
||||||
|
Feature: Dynamic shape.
|
||||||
|
Description: Test Tuple to TupleUnfold transforming pass.
|
||||||
|
Expectation: The 'after' graph is identical to the graph after this pass.
|
||||||
|
"""
|
||||||
|
fns = FnDict()
|
||||||
|
shape = P.Shape()
|
||||||
|
real_tuple_get_item = Primitive('RealTupleGetItem')
|
||||||
|
|
||||||
|
@fns
|
||||||
|
def before(x):
|
||||||
|
res = shape(x)
|
||||||
|
res = res[0]
|
||||||
|
return res
|
||||||
|
|
||||||
|
@fns
|
||||||
|
def after(x):
|
||||||
|
res = shape(x, y)
|
||||||
|
res = real_tuple_get_item(res, 0)
|
||||||
|
return res
|
||||||
|
|
||||||
|
return fns[tag]
|
||||||
|
|
||||||
|
|
||||||
def test_tuple_to_tensor_transform(tag):
|
def test_tuple_to_tensor_transform(tag):
|
||||||
"""
|
"""
|
||||||
Feature: Dynamic shape.
|
Feature: Dynamic shape.
|
||||||
|
@ -151,6 +176,31 @@ def test_tuple_to_tensor_transform(tag):
|
||||||
return fns[tag]
|
return fns[tag]
|
||||||
|
|
||||||
|
|
||||||
|
def test_scalar_to_tensor_transform(tag):
|
||||||
|
"""
|
||||||
|
Feature: Dynamic shape.
|
||||||
|
Description: Test Scalar to Tensor transforming pass.
|
||||||
|
Expectation: The 'after' graph is identical to the graph after this pass.
|
||||||
|
"""
|
||||||
|
fns = FnDict()
|
||||||
|
add = P.Add()
|
||||||
|
scalar_to_tensor = Primitive('ScalarToTensor')
|
||||||
|
|
||||||
|
@fns
|
||||||
|
def before(x, y):
|
||||||
|
res = add(x, y)
|
||||||
|
return res
|
||||||
|
|
||||||
|
@fns
|
||||||
|
def after(x, y):
|
||||||
|
x = scalar_to_tensor(x)
|
||||||
|
y = scalar_to_tensor(y)
|
||||||
|
res = add(x, y)
|
||||||
|
return res
|
||||||
|
|
||||||
|
return fns[tag]
|
||||||
|
|
||||||
|
|
||||||
def test_tensor_to_tuple_transform(tag):
|
def test_tensor_to_tuple_transform(tag):
|
||||||
"""
|
"""
|
||||||
Feature: Dynamic shape.
|
Feature: Dynamic shape.
|
||||||
|
@ -175,3 +225,27 @@ def test_tensor_to_tuple_transform(tag):
|
||||||
return res
|
return res
|
||||||
|
|
||||||
return fns[tag]
|
return fns[tag]
|
||||||
|
|
||||||
|
|
||||||
|
def test_tensor_to_scalar_transform(tag):
|
||||||
|
"""
|
||||||
|
Feature: Dynamic shape.
|
||||||
|
Description: Test Tensor to Scalar transforming pass.
|
||||||
|
Expectation: The 'after' graph is identical to the graph after this pass.
|
||||||
|
"""
|
||||||
|
fns = FnDict()
|
||||||
|
scalar_to_tensor = P.ScalarToTensor()
|
||||||
|
tensor_to_scalar = Primitive('TensorToScalar')
|
||||||
|
|
||||||
|
@fns
|
||||||
|
def before(x):
|
||||||
|
res = scalar_to_tensor(x)
|
||||||
|
return res
|
||||||
|
|
||||||
|
@fns
|
||||||
|
def after(x):
|
||||||
|
res = tensor_to_scalar(x)
|
||||||
|
res = scalar_to_tensor(res)
|
||||||
|
return res
|
||||||
|
|
||||||
|
return fns[tag]
|
||||||
|
|
Loading…
Reference in New Issue