/** * Copyright 2020 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include "common/common_test.h" #include "common/py_func_graph_fetcher.h" #include "ir/func_graph_cloner.h" #include "utils/log_adapter.h" #include "pipeline/jit/parse/parse.h" #include "debug/draw.h" namespace mindspore { void CheckNoFreeVariables(FuncGraphPtr root) { auto mng = Manage(root); for (auto &iter : mng->func_graphs()) { auto g = iter; if (g == nullptr) { continue; } ASSERT_TRUE(g->parent() == nullptr); auto nodes = g->nodes(); for (auto &node : nodes) { ASSERT_EQ(node->func_graph(), g); auto cnode = node->cast(); if (cnode != nullptr) { for (auto &inp : cnode->inputs()) { ASSERT_TRUE(inp->func_graph() == nullptr || inp->func_graph() == g); } } } } } void CheckCconv(FuncGraphPtr g) { auto mng = Manage(g); auto new_g = LiftingClone(g); CheckNoFreeVariables(new_g); } class TestCconv : public UT::Common { public: TestCconv() : getPyFun("gtest_input.optimizer.cconv_test") {} virtual void SetUp(); virtual void TearDown(); public: UT::PyFuncGraphFetcher getPyFun; }; void TestCconv::SetUp() {} void TestCconv::TearDown() {} TEST_F(TestCconv, TestStraight) { FuncGraphPtr func_graph = getPyFun.CallAndParseRet("get_test_cconv_fn", "test_straight"); ASSERT_TRUE(nullptr != func_graph); CheckCconv(func_graph); } TEST_F(TestCconv, TestSimpleClosure) { FuncGraphPtr func_graph = getPyFun.CallAndParseRet("get_test_cconv_fn", "test_simple_closure"); ASSERT_TRUE(nullptr != func_graph); CheckCconv(func_graph); } TEST_F(TestCconv, TestMax) { FuncGraphPtr func_graph = getPyFun.CallAndParseRet("get_test_cconv_fn", "test_max"); ASSERT_TRUE(nullptr != func_graph); CheckCconv(func_graph); } TEST_F(TestCconv, TestDeepNesting) { FuncGraphPtr func_graph = getPyFun.CallAndParseRet("get_test_cconv_fn", "test_deep_nesting"); ASSERT_TRUE(nullptr != func_graph); CheckCconv(func_graph); } TEST_F(TestCconv, TestReturnInDoubleWhile) { FuncGraphPtr func_graph = getPyFun.CallAndParseRet("get_test_cconv_fn", "test_return_in_double_while"); ASSERT_TRUE(nullptr != func_graph); CheckCconv(func_graph); } TEST_F(TestCconv, TestPow10) { FuncGraphPtr func_graph = getPyFun.CallAndParseRet("get_test_cconv_fn", "test_pow10"); ASSERT_TRUE(nullptr != func_graph); CheckCconv(func_graph); } TEST_F(TestCconv, TestClosureAsSimpleFv) { FuncGraphPtr func_graph = getPyFun.CallAndParseRet("get_test_cconv_fn", "test_closure_as_simple_fv"); ASSERT_TRUE(nullptr != func_graph); CheckCconv(func_graph); } TEST_F(TestCconv, TestClosureAsFv) { FuncGraphPtr func_graph = getPyFun.CallAndParseRet("get_test_cconv_fn", "test_closure_as_fv"); ASSERT_TRUE(nullptr != func_graph); CheckCconv(func_graph); } TEST_F(TestCconv, TestClosureAsDoubleFv) { FuncGraphPtr func_graph = getPyFun.CallAndParseRet("get_test_cconv_fn", "test_closure_as_double_fv"); ASSERT_TRUE(nullptr != func_graph); CheckCconv(func_graph); } TEST_F(TestCconv, TestClosureLiftSameParam) { FuncGraphPtr func_graph = getPyFun.CallAndParseRet("get_test_cconv_fn", "test_closure_lift_same_param"); ASSERT_TRUE(nullptr != func_graph); CheckCconv(func_graph); } TEST_F(TestCconv, TestClosureAsLoop) { FuncGraphPtr func_graph = getPyFun.CallAndParseRet("get_test_cconv_fn", "test_closure_as_loop"); ASSERT_TRUE(nullptr != func_graph); CheckCconv(func_graph); } TEST_F(TestCconv, TestClosureLiftCNode) { FuncGraphPtr func_graph = getPyFun.CallAndParseRet("get_test_cconv_fn", "test_closure_lift_cnode"); ASSERT_TRUE(nullptr != func_graph); CheckCconv(func_graph); } } // namespace mindspore