• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright 2019-2024 Huawei Technologies Co., Ltd
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef MINDSPORE_CCSRC_PIPELINE_JIT_PARSE_PARSE_BASE_H_
18 #define MINDSPORE_CCSRC_PIPELINE_JIT_PARSE_PARSE_BASE_H_
19 #include <string>
20 #include <memory>
21 #include "pybind11/pybind11.h"
22 #include "ir/anf.h"
23 #include "ir/func_graph.h"
24 #include "ir/manager.h"
25 #include "pybind_api/export_flags.h"
26 
27 namespace py = pybind11;
28 namespace mindspore {
29 namespace parse {
30 // Define the node type.
31 enum AstMainType : int64_t {
32   AST_MAIN_TYPE_STMT = 0,       // ast.Stmt
33   AST_MAIN_TYPE_EXPR = 1,       // ast.Expr
34   AST_MAIN_TYPE_SLICE = 2,      // ast.Slice
35   AST_MAIN_TYPE_UNKNOWN = 0xFF  // Unknown type
36 };
37 
38 enum AstSubType : int64_t {
39   AST_SUB_TYPE_AND = 3,         // ast.And
40   AST_SUB_TYPE_OR = 4,          // ast.Or
41   AST_SUB_TYPE_NAME = 5,        // ast.Name
42   AST_SUB_TYPE_TUPLE = 6,       // ast.Tuple
43   AST_SUB_TYPE_LIST = 7,        // ast.List
44   AST_SUB_TYPE_SUBSCRIPT = 8,   // ast.Subscript
45   AST_SUB_TYPE_STARRED = 9,     // ast.Starred
46   AST_SUB_TYPE_ATTRIBUTE = 10,  // ast.Attribute
47   AST_SUB_TYPE_DICT = 11,       // ast.Dict
48   AST_SUB_TYPE_UNKNOWN = 0xFF   // Unknown type
49 };
50 
51 // Define the parse target type.
52 enum ParseTargetType {
53   PARSE_TARGET_FUNCTION = 0,         // Function
54   PARSE_TARGET_METHOD = 1,           // Method
55   PARSE_TARGET_OBJECT_INSTANCE = 2,  // Object instance
56   PARSE_TARGET_UNKNOW = 0xFF         // Unknown type
57 };
58 
59 // Define python module name.
60 const char PYTHON_MOD_MODULE[] = "mindspore";
61 const char PYTHON_MOD_PARSE_MODULE[] = "mindspore._extends.parse";
62 const char PYTHON_MOD_PRIMITIVE_ARG_HANDLER_MODULE[] = "mindspore.ops.auto_generate.gen_arg_handler";
63 const char PYTHON_MOD_PRIMITIVE_ARG_DTYPE_CAST_MODULE[] = "mindspore.ops.auto_generate.gen_arg_dtype_cast";
64 const char PYTHON_MOD_PRIMITIVE_OP_CREATE_INSTANCE_HELPER_MODULE[] =
65   "mindspore.ops.auto_generate.cpp_create_prim_instance_helper";
66 const char PYTHON_MOD_PRIMITIVE_OP_TYPE_CAST[] = "do_type_cast";
67 const char PYTHON_MOD_PRIMITIVE_OP_LABELS_DICT[] = "op_labels";
68 const char PYTHON_MOD_PRIMITIVE_OP_DEFAULT_VALUE_DICT[] = "op_args_default_value";
69 const char PYTHON_MOD_PARSE_OBJECT_FUNCTION[] = "parse_cb";
70 const char PYTHON_MOD_RESOLVE_FUNCTION[] = "resolve_symbol";
71 const char PYTHON_MOD_RESOLVE_GET_OBJ_KEY[] = "get_object_key";
72 const char PYTHON_MOD_PARSE_CHECK_IS_CLASS_MEMBER_OF_SELF[] = "is_class_member_of_self";
73 const char PYTHON_MOD_PARSE_CHECK_IS_CLASS_MEMBER_RECURSIVE[] = "is_class_member_recursive";
74 const char PYTHON_MOD_RESOLVE_GET_OBJ_TYPE[] = "get_obj_type";
75 const char PYTHON_MOD_GET_OBJ_ID[] = "get_obj_id";
76 const char PYTHON_MOD_GET_CLASS_INSTANCE_TYPE[] = "get_class_instance_type";
77 const char PYTHON_MOD_CREATE_INSTANCE[] = "create_instance";
78 const char PYTHON_MOD_IS_SUPPORTED_CREATE_INSTANCE_TYPE[] = "is_supported_create_instance_type";
79 const char PYTHON_MOD_IS_CLASS_TYPE[] = "is_class_type";
80 const char PYTHON_MOD_GET_ADAPTER_TENSOR_ATTR[] = "get_adapter_tensor_attr";
81 const char PYTHON_MOD_IS_ADAPTER_TENSOR_CLASS[] = "is_adapter_tensor_class";
82 const char PYTHON_MOD_IS_ADAPTER_PARAMETER_CLASS[] = "is_adapter_parameter_class";
83 const char PYTHON_MOD_GET_MS_CLASS_NAME[] = "get_ms_class_name";
84 const char PYTHON_MOD_GET_MODULE_NAMESPACE[] = "get_module_namespace";
85 const char PYTHON_MOD_GET_MEMBER_NAMESPACE_SYMBOL[] = "get_class_member_namespace_symbol";
86 const char PYTHON_MOD_GET_OBJ_DEFINED[] = "get_obj_defined_from_obj_type";
87 const char PYTHON_MOD_GET_ATTR_FROM_OBJ[] = "get_attr_from_object";
88 const char PYTHON_MOD_GET_PARSE_METHOD[] = "get_parse_method_of_class";
89 const char PYTHON_MOD_GET_BPROP_METHOD[] = "get_bprop_method_of_class";
90 const char PYTHON_MOD_GET_OBJECT_DESCRIPTION[] = "get_object_description";
91 const char PYTHON_MOD_IS_CELL_LIST[] = "is_cell_list";
92 const char PYTHON_MOD_CONVERT_CELL_LIST_TO_SEQUENCE[] = "convert_cell_list_to_sequence";
93 const char PYTHON_MOD_GET_ITEM_FROM_SEQUENCE[] = "get_obj_from_sequence";
94 const char PYTHON_MOD_CONVERT_TO_MS_TENSOR[] = "convert_to_ms_tensor";
95 const char PYTHON_MOD_CONVERT_TO_MS_CSRTENSOR[] = "convert_to_ms_csrtensor";
96 const char PYTHON_MOD_CONVERT_TO_MS_COOTENSOR[] = "convert_to_ms_cootensor";
97 const char PYTHON_MOD_CONVERT_TO_NAMEDTUPLE[] = "convert_to_namedtuple";
98 const char PYTHON_MOD_EVAL_PY_SCRIPT[] = "eval_script";
99 const char PYTHON_MOD_GET_SCRIPT_ID_ATTRS[] = "get_script_id_attrs";
100 const char PYTHON_MOD_PYTHON_ISINSTANCE[] = "python_isinstance";
101 const char PYTHON_MOD_MS_ISINSTANCE[] = "ms_isinstance";
102 const char PYTHON_MOD_CONVERT_CLASS_TO_FUNCTION[] = "convert_class_to_function";
103 const char PYTHON_MOD_GET_CONST_ABS[] = "get_const_abs";
104 const char PYTHON_MOD_GET_CONST_ROUND[] = "get_const_round";
105 const char PYTHON_MOD_GET_CONST_LEN[] = "get_const_len";
106 const char PYTHON_MOD_CHECK_ATTRS[] = "check_attrs";
107 const char PYTHON_MOD_CHECK_IS_SUBCLASS[] = "check_is_subclass";
108 const char PYTHON_MOD_GET_METHOD_INFO[] = "get_method_info";
109 const char PYTHON_MOD_IS_MS_TENSOR_METHOD[] = "is_ms_tensor_method";
110 const char PYTHON_MOD_CAN_CONSTANT_FOLD[] = "can_constant_fold";
111 
112 const char PYTHON_PARSE_GET_ARGS[] = "get_args";
113 const char PYTHON_PARSE_GET_ARGS_DEFAULT_VALUES[] = "get_args_default_values";
114 const char PYTHON_PARSE_GET_NODE_TYPE[] = "get_node_type";
115 const char PYTHON_PARSE_GET_AST_TYPE[] = "get_ast_type";
116 const char PYTHON_PARSE_GET_AST_NAMESPACE_SYMBOL[] = "get_ast_namespace_symbol";
117 const char PYTHON_PARSE_GET_OPERATION_SYMBOL[] = "get_operation_symbol";
118 const char PYTHON_PARSE_GET_OPERATION_NAMESPACE_SYMBOL[] = "get_operation_namespace_symbol";
119 const char PYTHON_PARSE_GET_CLASS_TENSOR_TYPE[] = "get_tensor_class_type";
120 const char PYTHON_PARSE_GET_NAMESPACE_SYMBOL[] = "get_namespace_symbol";
121 const char PYTHON_PARSE_IS_BUILTIN_FUNCTION_NAME[] = "is_builtin_function_name";
122 const char PYTHON_PARSE_GET_LOCATION[] = "get_location";
123 const char PYTHON_PARSE_EXPAND_EXPR_STATEMENT[] = "expand_expr_statement";
124 const char PYTHON_PARSE_GENERATE_SCOPE[] = "generate_scope";
125 const char PYTHON_PARSE_GET_SCOPE_NAME[] = "get_scope_name";
126 const char PYTHON_PARSE_GET_TYPE[] = "get_type";
127 const char PYTHON_PARSE_ANALYZE_SUPER[] = "analyze_super";
128 const char PYTHON_PARSE_CHECK_THIRD_PARTY_LIBRARY_SIDE_EFFECT[] = "check_third_party_library_side_effect";
129 const char PYTHON_PARSE_CHECK_ATTR_IS_PROPERTY[] = "check_attr_is_property";
130 
131 const char PYTHON_PARSE_CLASS_SLICE[] = "create_slice_obj";
132 const char PYTHON_PARSE_CLASS_ELLIPSIS[] = "create_ellipsis_obj";
133 
134 const char PYTHON_MOD_GET_MODULE_AND_NAME_INFO[] = "get_obj_module_and_name_info";
135 const char PYTHON_MOD_IS_JIT_FORBIDDEN_MODULE[] = "is_jit_forbidden_module";
136 const char PYTHON_MOD_IS_INVALID_METHOD[] = "is_invalid_or_jit_forbidden_method";
137 const char PYTHON_MOD_IS_FROM_THIRD_PARTY_LIBRARY[] = "is_from_third_party_library";
138 
139 // Define the common name.
140 const char NAMED_PRIMITIVE_LEN[] = "len";
141 const char NAMED_PRIMITIVE_BODY[] = "body";
142 const char NAMED_PRIMITIVE_ASSIGN[] = "Assign";
143 const char NAMED_PRIMITIVE_AUGASSIGN[] = "AugAssign";
144 const char NAMED_PRIMITIVE_FOR[] = "For";
145 const char NAMED_PRIMITIVE_IF[] = "If";
146 const char NAMED_PRIMITIVE_ORELSE[] = "orelse";
147 const char NAMED_PRIMITIVE_WHILE[] = "While";
148 const char NAMED_PRIMITIVE_VALUE[] = "value";
149 const char NAMED_PRIMITIVE_VALUES[] = "values";
150 const char NAMED_PRIMITIVE_FUNC[] = "func";
151 const char NAMED_PRIMITIVE_TEST[] = "test";
152 const char NAMED_PRIMITIVE_LEFT[] = "left";
153 const char NAMED_PRIMITIVE_ARGS[] = "args";
154 const char NAMED_PRIMITIVE_CALL[] = "Call";
155 const char NAMED_PRIMITIVE_SUBSCRIPT[] = "Subscript";
156 const char NAMED_PRIMITIVE_ATTRIBUTE[] = "Attribute";
157 const char NAMED_PRIMITIVE_COMPARE[] = "Compare";
158 const char NAMED_PRIMITIVE_BOOLOP[] = "BoolOp";
159 const char NAMED_PRIMITIVE_NAMECONSTANT[] = "NameConstant";
160 const char NAMED_PRIMITIVE_CONSTANT[] = "Constant";
161 const char NAMED_PRIMITIVE_COMPARATORS[] = "comparators";
162 const char NAMED_PRIMITIVE_TARGET[] = "target";
163 const char NAMED_PRIMITIVE_TARGETS[] = "targets";
164 const char NAMED_PRIMITIVE_SLICE[] = "slice";
165 const char NAMED_PRIMITIVE_NAME[] = "Name";
166 const char NAMED_PRIMITIVE_NUM[] = "Num";
167 const char NAMED_PRIMITIVE_STR[] = "Str";
168 const char NAMED_PRIMITIVE_ITER[] = "iter";
169 const char NAMED_PRIMITIVE_NEXT[] = "next";
170 const char NAMED_PRIMITIVE_GETITEM[] = "getitem";
171 const char NAMED_PRIMITIVE_SETITEM[] = "setitem";
172 const char NAMED_PRIMITIVE_HASNEXT[] = "hasnext";
173 const char NAMED_PRIMITIVE_BOOL[] = "bool_";
174 const char NAMED_PRIMITIVE_CHECK_LEN[] = "check_len_";
175 const char NAMED_PRIMITIVE_REAL_BOOL[] = "real_bool_";
176 const char NAMED_PRIMITIVE_MAKETUPLE[] = "MakeTuple";
177 const char NAMED_PRIMITIVE_MAKELIST[] = "make_list";
178 const char NAMED_PRIMITIVE_MAKESLICE[] = "make_slice";
179 const char NAMED_PRIMITIVE_MAKEDICT[] = "make_dict";
180 const char NAMED_METAGRAPH_UNPACKCALL[] = "unpack_call";
181 const char NAMED_METAGRAPH_STARRED_UNPACK[] = "starred_unpack";
182 const char NAMED_METAGRAPH_STARRED_GET_ITEM[] = "starred_get_item";
183 const char NAMED_METAGRAPH_STARRED_UNPACK_MERGE[] = "starred_unpack_merge";
184 
185 // Define NAMED_PRIMITIVE_GETATTR "getattr".
186 // Define python inline attr.
187 const char PYTHON_GET_METHOD_LEN[] = "__len__";
188 const char PYTHON_GET_METHOD_SELF_CLASS[] = "__self__";
189 const char PYTHON_GET_OBJ_DESC[] = "__str__";
190 
191 const char PYTHON_PARSE_METHOD[] = "__parse_method__";
192 const char PYTHON_FUNC_GRAPH_FLAGS[] = "_func_graph_flags";
193 
194 // Define the parse constant.
195 const char CUSTOM_BPROP_NAME[] = "bprop";
196 const char STAGE_NAME[] = "_pipeline_stage";
197 const char SEGMENT_NAME[] = "_pipeline_segment";
198 
199 // Define the Namespace name.
200 const char RESOLVE_NAMESPACE_NAME_AST[] = "Ast";                   // For ast type namespace.
201 const char RESOLVE_NAMESPACE_NAME_ENTRY[] = "Entry";               // For entry object namespace.
202 const char RESOLVE_NAMESPACE_NAME_CLASS_OBJECT[] = "ClassObject";  // For class object itself namespace.
203 const char RESOLVE_NAMESPACE_NAME_CLASS_MEMBER[] = "ClassMember";  // For class member namespace.
204 const char RESOLVE_NAMESPACE_NAME_SYMBOL_STR[] = "SymbolStr";      // For symbol str namespace.
205 const char RESOLVE_NAMESPACE_NAME_COMMON_OPS[] = "CommonOPS";      // For common ops, eg: hasnext, next.
206 const char RESOLVE_NAMESPACE_NAME_MODULE[] = "Module";             // For Module namespace.
207 
208 // Define Resolve type.
209 enum ResolveType : int64_t {
210   RESOLVE_TYPE_NONE = 0,                // Resolve None.
211   RESOLVE_TYPE_FUNCTION = 1,            // Resolve function.
212   RESOLVE_TYPE_METHOD = 2,              // Resolve class method.
213   RESOLVE_TYPE_CLASS_TYPE = 3,          // Resolve class type.
214   RESOLVE_TYPE_CLASS_INSTANCE = 4,      // Resolve the class instance of common class.
215   RESOLVE_TYPE_NAMESPACE_INSTANCE = 5,  // Resolve the namespace instance.
216   RESOLVE_TYPE_NUMPY_INT_NUMBER = 6,    // Resolve numpy number int type.
217   RESOLVE_TYPE_NUMPY_FLOAT_NUMBER = 7,  // Resolve numpy number float type.
218   RESOLVE_TYPE_NUMPY_BOOL_NUMBER = 8,   // Resolve numpy bool number.
219   RESOLVE_TYPE_TUPLE = 9,               // Resolve builtin tuple type.
220   RESOLVE_TYPE_LIST = 10,               // Resolve builtin list type.
221   RESOLVE_TYPE_INVALID = 0xFF           // Resolve invalid.
222 };
223 
224 // Define the class instance detail type When the type is RESOLVE_TYPE_CLASS_INSTANCE.
225 enum ClassInstanceType {
226   CLASS_INSTANCE_TYPE_CELL = 0,            // Class instance type is Cell.
227   CLASS_INSTANCE_TYPE_PRIMITIVE = 1,       // Class instance type is Primitive.
228   CLASS_INSTANCE_TYPE_NUMPY_ARRAY = 2,     // Class instance type is Numpy Array.
229   CLASS_INSTANCE_TYPE_TENSOR = 3,          // Class instance type is Tensor
230   CLASS_INSTANCE_TYPE_ADAPTER_TENSOR = 4,  // Class instance type is Adapter Tensor
231   CLASS_INSTANCE_TYPE_INVALID = 0xFF
232 };
233 
234 // Define syntax support type.
235 enum SyntaxSupportType : int {
236   SYNTAX_SUPPORTED = 0,                  // Supported syntax
237   SYNTAX_UNSUPPORTED_INTERNAL_TYPE = 1,  // Unsupported internal type
238   SYNTAX_UNSUPPORTED_EXTERNAL_TYPE = 2,  // Unsupported external type
239   SYNTAX_HYBRID_TYPE = 3,                // Hybrid type
240   SYNTAX_UNSUPPORTED_NAMESPACE = 4       // Unsupported namespace
241 };
242 
243 // Convert python object to ValuePtr.
244 bool ConvertData(const py::object &obj, ValuePtr *data, bool use_signature = false, const TypePtr &dtype = nullptr,
245                  bool forbid_reuse = false);
246 
247 bool ConvertStubData(const py::object &obj, ValuePtr *data, bool use_signature = false, const TypePtr &dtype = nullptr,
248                      bool forbid_reuse = false);
249 
250 // Convert python obj to graph.
251 FuncGraphPtr ConvertToFuncGraph(const py::object &obj, const ValuePtrList &args_value_list = {},
252                                 const std::string &python_mod_get_parse_method = PYTHON_MOD_GET_PARSE_METHOD,
253                                 bool forbid_reuse = false);
254 
255 // Parse the python object to graph.
256 FuncGraphPtr ParsePythonCode(const py::object &obj,
257                              const std::string &python_mod_get_parse_method = PYTHON_MOD_GET_PARSE_METHOD,
258                              const ValuePtrList &args_value_list = {});
259 ValuePtr GetArgDefaultValue(const std::string &prim_name, const std::string &arg_name);
260 AnfNodePtr TransPropertyToFunc(const FuncGraphPtr &fg, const AnfNodePtr &node, const py::object &property_net_obj,
261                                std::string attr_str);
262 void CleanParameterNameCache();
263 }  // namespace parse
264 }  // namespace mindspore
265 
266 #endif  // MINDSPORE_CCSRC_PIPELINE_JIT_PARSE_PARSE_BASE_H_
267