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