/** * This is the C++ adaptation and derivative work of Myia (https://github.com/mila-iqia/myia/). * * Copyright 2019 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. */ #ifndef PIPELINE_PARSE_FUNCTION_BLOCK_H_ #define PIPELINE_PARSE_FUNCTION_BLOCK_H_ #include #include #include #include #include #include #include #include "pipeline/parse/parse_base.h" #include "utils/log_adapter.h" #include "utils/ordered_map.h" namespace mindspore { namespace parse { class Parser; class NameSpace; class Symbol; class FunctionBlock; using FunctionBlockPtr = std::shared_ptr; // A function block is a straight-line code sequence with no branches, every block has one one exit point // which is return. When parsing function, loop or branch , we use function block to track the structure of // the original source code. class FunctionBlock : public std::enable_shared_from_this { public: explicit FunctionBlock(const Parser &parser); virtual ~FunctionBlock() {} FuncGraphPtr func_graph() { return func_graph_; } void WriteVariable(const std::string &var_name, const AnfNodePtr &node); AnfNodePtr ReadVariable(const std::string &var_name); void AddPrevBlock(const FunctionBlockPtr &block); void SetPhiArgument(const ParameterPtr &phi); void CollectRemovablePhi(const ParameterPtr &phi); // A block is matured if all its predecessors is generated void Mature(); CNodePtr ForceToBoolNode(const AnfNodePtr &cond); void Jump(const FunctionBlockPtr &block, AnfNodePtr node); AnfNodePtr SearchReplaceNode(const std::string &var, const ParameterPtr &phi); void ConditionalJump(AnfNodePtr condNode, const FunctionBlockPtr &trueBlock, const FunctionBlockPtr &falseBlock); // record the assign statement of self.xx weight parameter ,which will use state_setitem op void SetStateAssgin(const AnfNodePtr &target, const std::string &readid); void AddAutoDepend(const AnfNodePtr &target); void InsertDependItemsBeforeReturn(); void AddGlobalVar(const std::string &var_name) { (void)global_vars_.insert(var_name); } bool IsGlobalVar(const std::string &var_name) { return global_vars_.find(var_name) != global_vars_.end(); } AnfNodePtr MakeResolveAstOp(const py::object &op); AnfNodePtr MakeResolveClassMember(std::string attr); AnfNodePtr MakeResolveSymbol(const std::string &value); AnfNodePtr MakeResolveOperation(const std::string &value); AnfNodePtr MakeResolve(const std::shared_ptr &name_space, const std::shared_ptr &resolve_symbol); const std::unordered_map &removable_phis() const { return removable_phis_; } private: // block graph FuncGraphPtr func_graph_; // the block's parser const Parser &parser_; // A block is matured if all its prev_blocks is processed bool matured_; // store the nest-level block // refer to comments in Parser::func_block_list_; std::vector prev_blocks_; // store args and variable's node std::map vars_; // phi_nodes map the parameter node to variable, it can be resolved if the block's predecessors are processed std::map phi_nodes_; // jumps map the successor block and the function call that perform jump // refer to comments in Parser::func_block_list_ that how to break the cyclic reference std::map jumps_; // keeps all removable phis which will be removed in one pass. std::unordered_map removable_phis_; // set state nodes need to insert before function return nodes. OrderedMap state_assign_; // hold declared global variables in function std::set global_vars_; // other depend need to insert before function return nodes. // summary or some other node std::vector auto_depends_; }; } // namespace parse } // namespace mindspore #endif // PIPELINE_PARSE_FUNCTION_BLOCK_H_