| @@ -174,12 +174,12 @@ build_graphengine() | |||||
| elif [ "x${PLATFORM}" = "xinference" ] | elif [ "x${PLATFORM}" = "xinference" ] | ||||
| then | then | ||||
| TARGET="ge_compiler atc_atc.bin ge_executor_shared ${TARGET}" | TARGET="ge_compiler atc_atc.bin ge_executor_shared ${TARGET}" | ||||
| elif [ "X$ENABLE_GE_ST" = "Xon" ] | |||||
| then | |||||
| TARGET="ge_graph_dsl_test graph_engine_test" | |||||
| elif [ "X$ENABLE_GE_UT" = "Xon" ] | elif [ "X$ENABLE_GE_UT" = "Xon" ] | ||||
| then | then | ||||
| TARGET="ut_libgraph ut_libge_multiparts_utest ut_libge_others_utest ut_libge_kernel_utest ut_libge_distinct_load_utest" | TARGET="ut_libgraph ut_libge_multiparts_utest ut_libge_others_utest ut_libge_kernel_utest ut_libge_distinct_load_utest" | ||||
| elif [ "X$ENABLE_GE_ST" = "Xon" ] | |||||
| then | |||||
| TARGET="graph_engine_test" | |||||
| elif [ "X$MINDSPORE_MODE" = "Xon" ] | elif [ "X$MINDSPORE_MODE" = "Xon" ] | ||||
| then | then | ||||
| TARGET="ge_common graph" | TARGET="ge_common graph" | ||||
| @@ -242,15 +242,17 @@ if [[ "X$ENABLE_GE_ST" = "Xon" ]]; then | |||||
| mkdir -p ${OUTPUT_PATH}/plugin/nnengine | mkdir -p ${OUTPUT_PATH}/plugin/nnengine | ||||
| mkdir -p ${OUTPUT_PATH}/plugin/nnengine/ge_config | mkdir -p ${OUTPUT_PATH}/plugin/nnengine/ge_config | ||||
| mkdir -p ${OUTPUT_PATH}/plugin/opskernel | mkdir -p ${OUTPUT_PATH}/plugin/opskernel | ||||
| cp ${BUILD_PATH}/tests/st/libnnengine.so ${OUTPUT_PATH}/plugin/nnengine | |||||
| cp ${BUILD_PATH}/tests/framework/libnnengine.so ${OUTPUT_PATH}/plugin/nnengine | |||||
| cp ${BUILD_PATH}/engine_conf.json ${OUTPUT_PATH}/plugin/nnengine/ge_config | cp ${BUILD_PATH}/engine_conf.json ${OUTPUT_PATH}/plugin/nnengine/ge_config | ||||
| cp ${BUILD_PATH}/tests/st/libhost_cpu_engine.so ${OUTPUT_PATH}/plugin/opskernel | |||||
| cp ${BUILD_PATH}/tests/st/libge_local_engine.so ${OUTPUT_PATH}/plugin/opskernel | |||||
| cp ${BUILD_PATH}/tests/st/framework/libfe.so ${OUTPUT_PATH}/plugin/opskernel | |||||
| cp ${BUILD_PATH}/tests/framework/libhost_cpu_engine.so ${OUTPUT_PATH}/plugin/opskernel | |||||
| cp ${BUILD_PATH}/tests/framework/libge_local_engine.so ${OUTPUT_PATH}/plugin/opskernel | |||||
| cp ${BUILD_PATH}/tests/framework/stub_engine/libfe.so ${OUTPUT_PATH}/plugin/opskernel | |||||
| #prepare st execution bin | #prepare st execution bin | ||||
| cp ${BUILD_PATH}/tests/st/testcase/graph_engine_test ${OUTPUT_PATH} | cp ${BUILD_PATH}/tests/st/testcase/graph_engine_test ${OUTPUT_PATH} | ||||
| cp ${BUILD_PATH}/tests/framework/ge_graph_dsl/tests/ge_graph_dsl_test ${OUTPUT_PATH} | |||||
| #execute st testcase | #execute st testcase | ||||
| RUN_TEST_CASE=${OUTPUT_PATH}/graph_engine_test && ${RUN_TEST_CASE} | RUN_TEST_CASE=${OUTPUT_PATH}/graph_engine_test && ${RUN_TEST_CASE} | ||||
| RUN_TEST_CASE=${OUTPUT_PATH}/ge_graph_dsl_test && ${RUN_TEST_CASE} | |||||
| if [[ "$?" -ne 0 ]]; then | if [[ "$?" -ne 0 ]]; then | ||||
| echo "!!! ST FAILED, PLEASE CHECK YOUR CHANGES !!!" | echo "!!! ST FAILED, PLEASE CHECK YOUR CHANGES !!!" | ||||
| echo -e "\033[31m${RUN_TEST_CASE}\033[0m" | echo -e "\033[31m${RUN_TEST_CASE}\033[0m" | ||||
| @@ -28,5 +28,6 @@ if (ENABLE_GE_COV OR ENABLE_GE_UT) | |||||
| endif() | endif() | ||||
| if (ENABLE_GE_ST) | if (ENABLE_GE_ST) | ||||
| add_subdirectory(framework) | |||||
| add_subdirectory(st) | add_subdirectory(st) | ||||
| endif() | endif() | ||||
| @@ -0,0 +1,32 @@ | |||||
| # Copyright 2021 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(cmake/graphengine.cmake) | |||||
| add_subdirectory(easy_graph) | |||||
| add_subdirectory(stub_engine) | |||||
| add_subdirectory(ge_graph_dsl) | |||||
| file(GLOB_RECURSE UTILS_SRC CONFIGURE_DEPENDS | |||||
| "utils/*.cc" | |||||
| ) | |||||
| add_library(framework STATIC ${UTILS_SRC}) | |||||
| target_include_directories(framework | |||||
| PUBLIC utils/ | |||||
| ) | |||||
| set_target_properties(framework PROPERTIES CXX_STANDARD 11) | |||||
| target_link_libraries(framework PUBLIC ge_graph_dsl graphengine fe) | |||||
| @@ -0,0 +1,26 @@ | |||||
| # Copyright 2021 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. | |||||
| # ============================================================================ | |||||
| file(GLOB_RECURSE EASY_GRAPH_SRCS src/*.cc) | |||||
| add_library(easy_graph STATIC ${EASY_GRAPH_SRCS}) | |||||
| target_link_libraries(easy_graph PUBLIC | |||||
| $<BUILD_INTERFACE:intf_pub> ) | |||||
| set_target_properties(easy_graph PROPERTIES CXX_STANDARD 17) | |||||
| target_include_directories(easy_graph PUBLIC include | |||||
| PRIVATE src) | |||||
| @@ -0,0 +1,40 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HE7D53295_59F0_46B0_A881_D6A33B1F9C14 | |||||
| #define HE7D53295_59F0_46B0_A881_D6A33B1F9C14 | |||||
| #include <type_traits> | |||||
| #include "easy_graph/graph/box.h" | |||||
| EG_NS_BEGIN | |||||
| namespace detail { | |||||
| template<typename Anything> | |||||
| struct BoxWrapper : Anything, Box { | |||||
| using Anything::Anything; | |||||
| }; | |||||
| template<typename Anything> | |||||
| using BoxedAnything = std::conditional_t<std::is_base_of_v<Box, Anything>, Anything, BoxWrapper<Anything>>; | |||||
| } // namespace detail | |||||
| #define BOX_WRAPPER(Anything) ::EG_NS::detail::BoxedAnything<Anything> | |||||
| #define BOX_OF(Anything, ...) ::EG_NS::BoxPacking<Anything>(__VA_ARGS__) | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,81 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HDF50E564_F050_476A_A479_F82B20F35C84 | |||||
| #define HDF50E564_F050_476A_A479_F82B20F35C84 | |||||
| #include "easy_graph/builder/link.h" | |||||
| #include "easy_graph/graph/node_id.h" | |||||
| #include "easy_graph/graph/node.h" | |||||
| EG_NS_BEGIN | |||||
| struct GraphBuilder; | |||||
| struct Graph; | |||||
| struct Edge; | |||||
| struct ChainBuilder { | |||||
| ChainBuilder(GraphBuilder &graphBuilder, EdgeType defaultEdgeType); | |||||
| struct LinkBuilder { | |||||
| using NodeObj = ::EG_NS::Node; | |||||
| using EdgeObj = ::EG_NS::Edge; | |||||
| LinkBuilder(ChainBuilder &chain, EdgeType defaultEdgeType); | |||||
| ChainBuilder &Node(const NodeObj &node); | |||||
| template<typename... PARAMS> | |||||
| ChainBuilder &Node(const NodeId &id, const PARAMS &... params) { | |||||
| auto node = chain_.FindNode(id); | |||||
| if (node) { | |||||
| return this->Node(*node); | |||||
| } | |||||
| return this->Node(NodeObj(id, params...)); | |||||
| } | |||||
| ChainBuilder &Ctrl(const std::string &label = ""); | |||||
| ChainBuilder &Data(const std::string &label = ""); | |||||
| ChainBuilder &Data(PortId srcId = UNDEFINED_PORT_ID, PortId dstId = UNDEFINED_PORT_ID, | |||||
| const std::string &label = ""); | |||||
| ChainBuilder &Edge(EdgeType type, PortId srcId = UNDEFINED_PORT_ID, PortId dstId = UNDEFINED_PORT_ID, | |||||
| const std::string &label = ""); | |||||
| private: | |||||
| ChainBuilder &startLink(const Link &); | |||||
| private: | |||||
| ChainBuilder &chain_; | |||||
| EdgeType default_edge_type_; | |||||
| Link from_link_; | |||||
| } linker; | |||||
| LinkBuilder *operator->(); | |||||
| private: | |||||
| ChainBuilder &LinkTo(const Node &, const Link &); | |||||
| const Node *FindNode(const NodeId &) const; | |||||
| private: | |||||
| Node *prev_node_{nullptr}; | |||||
| GraphBuilder &graph_builder_; | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,64 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H5FED5F58_167D_4536_918A_D5FE8F28DD9C | |||||
| #define H5FED5F58_167D_4536_918A_D5FE8F28DD9C | |||||
| #include "easy_graph/graph/graph.h" | |||||
| EG_NS_BEGIN | |||||
| struct Link; | |||||
| struct GraphBuilder { | |||||
| GraphBuilder(const std::string &name); | |||||
| Node *BuildNode(const Node &); | |||||
| Edge *BuildEdge(const Node &src, const Node &dst, const Link &); | |||||
| Graph &operator*() { | |||||
| return graph_; | |||||
| } | |||||
| const Graph &operator*() const { | |||||
| return graph_; | |||||
| } | |||||
| Graph *operator->() { | |||||
| return &graph_; | |||||
| } | |||||
| const Graph *operator->() const { | |||||
| return &graph_; | |||||
| } | |||||
| private: | |||||
| struct NodeInfo { | |||||
| PortId inPortMax{0}; | |||||
| PortId outPortMax{0}; | |||||
| }; | |||||
| NodeInfo *FindNode(const NodeId &); | |||||
| const NodeInfo *FindNode(const NodeId &) const; | |||||
| private: | |||||
| std::map<NodeId, NodeInfo> nodes_; | |||||
| Graph graph_; | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,45 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H46D07001_D54E_497C_B1BA_878A47164DA5 | |||||
| #define H46D07001_D54E_497C_B1BA_878A47164DA5 | |||||
| #include "easy_graph/builder/graph_builder.h" | |||||
| #include "easy_graph/builder/chain_builder.h" | |||||
| #include "easy_graph/builder/box_builder.h" | |||||
| #include "easy_graph/infra/macro_traits.h" | |||||
| EG_NS_BEGIN | |||||
| //////////////////////////////////////////////////////////////// | |||||
| namespace detail { | |||||
| template<typename GRAPH_BUILDER> | |||||
| Graph BuildGraph(const char *name, GRAPH_BUILDER builderInDSL) { | |||||
| GraphBuilder builder(name); | |||||
| builderInDSL(builder); | |||||
| return std::move(*builder); | |||||
| } | |||||
| } // namespace detail | |||||
| #define HAS_NAME(...) NOT_EMPTY_SELECT(__VA_ARGS__) | |||||
| #define DEF_GRAPH(G, ...) ::EG_NS::Graph G = ::EG_NS::detail::BuildGraph(HAS_NAME(__VA_ARGS__)(__VA_ARGS__, #G), [&](::EG_NS::GraphBuilder& BUILDER) | |||||
| #define DATA_CHAIN(...) ::EG_NS::ChainBuilder(BUILDER, ::EG_NS::EdgeType::DATA)->__VA_ARGS__ | |||||
| #define CTRL_CHAIN(...) ::EG_NS::ChainBuilder(BUILDER, ::EG_NS::EdgeType::CTRL)->__VA_ARGS__ | |||||
| #define CHAIN(...) DATA_CHAIN(__VA_ARGS__) | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,49 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H35695B82_E9E5_419D_A6B4_C13FB0842C9F | |||||
| #define H35695B82_E9E5_419D_A6B4_C13FB0842C9F | |||||
| #include <string> | |||||
| #include "easy_graph/graph/edge_type.h" | |||||
| #include "easy_graph/graph/port_id.h" | |||||
| EG_NS_BEGIN | |||||
| struct Link { | |||||
| explicit Link(EdgeType type) : type_(type) { | |||||
| Reset(type); | |||||
| } | |||||
| Link(EdgeType type, const std::string &label, PortId srcPortId, PortId dstPortId) | |||||
| : type_(type), label_(label), src_port_id_(srcPortId), dst_port_id_(dstPortId) {} | |||||
| void Reset(EdgeType type) { | |||||
| this->type_ = type; | |||||
| this->label_ = ""; | |||||
| this->src_port_id_ = UNDEFINED_PORT_ID; | |||||
| this->dst_port_id_ = UNDEFINED_PORT_ID; | |||||
| } | |||||
| EdgeType type_; | |||||
| std::string label_; | |||||
| PortId src_port_id_; | |||||
| PortId dst_port_id_; | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,29 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H04F67145_86B2_4529_BC2E_EBDB2115687E | |||||
| #define H04F67145_86B2_4529_BC2E_EBDB2115687E | |||||
| #define EG_NS eg | |||||
| #define EG_NS_BEGIN namespace EG_NS { | |||||
| #define EG_NS_END } | |||||
| #define USING_EG_NS using namespace EG_NS; | |||||
| #define FWD_DECL_EG(type) \ | |||||
| namespace EG_NS { \ | |||||
| struct type; \ | |||||
| } | |||||
| #endif | |||||
| @@ -0,0 +1,41 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H4AA49861_3311_4114_8687_1C7D04FA43B9 | |||||
| #define H4AA49861_3311_4114_8687_1C7D04FA43B9 | |||||
| #include <memory> | |||||
| #include "easy_graph/infra/keywords.h" | |||||
| EG_NS_BEGIN | |||||
| INTERFACE(Box){}; | |||||
| using BoxPtr = std::shared_ptr<Box>; | |||||
| template<typename Anything, typename... Args> | |||||
| BoxPtr BoxPacking(Args &&... args) { | |||||
| return std::make_shared<Anything>(std::forward<Args>(args)...); | |||||
| } | |||||
| template<typename Anything> | |||||
| Anything *BoxUnpacking(const BoxPtr &box) { | |||||
| return dynamic_cast<Anything *>(box.get()); | |||||
| } | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,46 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HE62943BF_1F7C_4EF9_B306_D9C94634EA74 | |||||
| #define HE62943BF_1F7C_4EF9_B306_D9C94634EA74 | |||||
| #include <string> | |||||
| #include "easy_graph/graph/edge_type.h" | |||||
| #include "easy_graph/graph/endpoint.h" | |||||
| EG_NS_BEGIN | |||||
| struct Edge { | |||||
| Edge(const EdgeType type, const std::string &label, const Endpoint &src, const Endpoint &dst); | |||||
| __DECL_COMP(Edge); | |||||
| EdgeType GetType() const; | |||||
| std::string GetLabel() const; | |||||
| Endpoint GetSrc() const; | |||||
| Endpoint GetDst() const; | |||||
| private: | |||||
| std::string label_; | |||||
| EdgeType type_; | |||||
| Endpoint src_; | |||||
| Endpoint dst_; | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,31 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H19D3F004_119F_4E6A_ACFA_A635FD6FEA98 | |||||
| #define H19D3F004_119F_4E6A_ACFA_A635FD6FEA98 | |||||
| #include "easy_graph/eg.h" | |||||
| EG_NS_BEGIN | |||||
| enum class EdgeType { | |||||
| CTRL = 0, | |||||
| DATA, | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,41 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H8DB48A37_3257_4E15_8869_09E58221ADE8 | |||||
| #define H8DB48A37_3257_4E15_8869_09E58221ADE8 | |||||
| #include "easy_graph/graph/node_id.h" | |||||
| #include "easy_graph/graph/port_id.h" | |||||
| #include "easy_graph/infra/operator.h" | |||||
| EG_NS_BEGIN | |||||
| struct Endpoint { | |||||
| Endpoint(const NodeId &, const PortId &); | |||||
| __DECL_COMP(Endpoint); | |||||
| NodeId getNodeId() const; | |||||
| PortId getPortId() const; | |||||
| private: | |||||
| NodeId node_id_; | |||||
| PortId port_id_; | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,58 @@ | |||||
| #ifndef H813EC8C1_3850_4320_8AC0_CE071C89B871 | |||||
| #define H813EC8C1_3850_4320_8AC0_CE071C89B871 | |||||
| #include "easy_graph/graph/node.h" | |||||
| /** | |||||
| * Copyright 2021 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 "easy_graph/graph/edge.h" | |||||
| #include "easy_graph/infra/status.h" | |||||
| #include <string> | |||||
| #include <set> | |||||
| #include <map> | |||||
| EG_NS_BEGIN | |||||
| struct GraphVisitor; | |||||
| struct LayoutOption; | |||||
| struct Graph { | |||||
| explicit Graph(const std::string &name); | |||||
| std::string GetName() const; | |||||
| Node *AddNode(const Node &); | |||||
| Edge *AddEdge(const Edge &); | |||||
| Node *FindNode(const NodeId &); | |||||
| const Node *FindNode(const NodeId &) const; | |||||
| std::pair<const Node *, const Node *> FindNodePair(const Edge &) const; | |||||
| std::pair<Node *, Node *> FindNodePair(const Edge &); | |||||
| void Accept(GraphVisitor &) const; | |||||
| Status Layout(const LayoutOption *option = nullptr) const; | |||||
| private: | |||||
| std::string name_; | |||||
| std::map<NodeId, Node> nodes_; | |||||
| std::set<Edge> edges_; | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,37 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H13960AED_B5B1_45F9_A664_6CB6C15CA3C1 | |||||
| #define H13960AED_B5B1_45F9_A664_6CB6C15CA3C1 | |||||
| #include "easy_graph/infra/keywords.h" | |||||
| #include "easy_graph/infra/status.h" | |||||
| EG_NS_BEGIN | |||||
| struct Graph; | |||||
| struct Node; | |||||
| struct Edge; | |||||
| INTERFACE(GraphVisitor) { | |||||
| DEFAULT(Status, Visit(const Graph &)); | |||||
| DEFAULT(Status, Visit(const Node &)); | |||||
| DEFAULT(Status, Visit(const Edge &)); | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,62 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HF37ACE88_F726_4AA3_8599_ED7A888AA623 | |||||
| #define HF37ACE88_F726_4AA3_8599_ED7A888AA623 | |||||
| #include <vector> | |||||
| #include "easy_graph/graph/node_id.h" | |||||
| #include "easy_graph/infra/operator.h" | |||||
| #include "easy_graph/infra/ext_traits.h" | |||||
| #include "easy_graph/graph/box.h" | |||||
| EG_NS_BEGIN | |||||
| struct GraphVisitor; | |||||
| struct Graph; | |||||
| struct Node { | |||||
| template<typename... GRAPHS, SUBGRAPH_CONCEPT(GRAPHS, Graph)> | |||||
| Node(const NodeId &id, const GRAPHS &... graphs) : id_(id), subgraphs_{&graphs...} {} | |||||
| template<typename... GRAPHS, SUBGRAPH_CONCEPT(GRAPHS, Graph)> | |||||
| Node(const NodeId &id, const BoxPtr &box, const GRAPHS &... graphs) : id_(id), box_(box), subgraphs_{&graphs...} {} | |||||
| __DECL_COMP(Node); | |||||
| NodeId GetId() const; | |||||
| Node &Packing(const BoxPtr &); | |||||
| template<typename Anything> | |||||
| Anything *Unpacking() const { | |||||
| if (!box_) | |||||
| return nullptr; | |||||
| return BoxUnpacking<Anything>(box_); | |||||
| } | |||||
| Node &AddSubgraph(const Graph &); | |||||
| void Accept(GraphVisitor &) const; | |||||
| private: | |||||
| NodeId id_; | |||||
| BoxPtr box_; | |||||
| std::vector<const Graph *> subgraphs_; | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -1,22 +1,29 @@ | |||||
| /** | /** | ||||
| * Copyright 2021 Huawei Technologies Co., Ltd | * Copyright 2021 Huawei Technologies Co., Ltd | ||||
| * | |||||
| * Licensed under the Apache License, Version 2.0 (the "License"); | * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| * you may not use this file except in compliance with the License. | * you may not use this file except in compliance with the License. | ||||
| * You may obtain a copy of the License at | * You may obtain a copy of the License at | ||||
| * | |||||
| * http://www.apache.org/licenses/LICENSE-2.0 | * http://www.apache.org/licenses/LICENSE-2.0 | ||||
| * | |||||
| * Unless required by applicable law or agreed to in writing, software | * Unless required by applicable law or agreed to in writing, software | ||||
| * distributed under the License is distributed on an "AS IS" BASIS, | * distributed under the License is distributed on an "AS IS" BASIS, | ||||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| * See the License for the specific language governing permissions and | * See the License for the specific language governing permissions and | ||||
| * limitations under the License. | * limitations under the License. | ||||
| */ | |||||
| */ | |||||
| #ifndef HB53D0830_615F_4E4A_8531_77E2A177717D | |||||
| #define HB53D0830_615F_4E4A_8531_77E2A177717D | |||||
| #ifndef GRAPHENGINE_LLT_ST_FRAMEWORK_H_ | |||||
| #define GRAPHENGINE_LLT_ST_FRAMEWORK_H_ | |||||
| #include <string> | #include <string> | ||||
| #include "common/ge_inner_error_codes.h" | |||||
| #include "easy_graph/eg.h" | |||||
| EG_NS_BEGIN | |||||
| typedef std::string NodeId; | |||||
| EG_NS_END | |||||
| #endif // GRAPHENGINE_LLT_ST_FRAMEWORK_H_ | |||||
| #endif | |||||
| @@ -0,0 +1,30 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HC8732748_F658_4759_9284_CC13C0BFE6D4 | |||||
| #define HC8732748_F658_4759_9284_CC13C0BFE6D4 | |||||
| #include "easy_graph/eg.h" | |||||
| EG_NS_BEGIN | |||||
| typedef unsigned int PortId; | |||||
| static const PortId UNDEFINED_PORT_ID = 0xFFFFFFFF; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,59 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H05B2224D_B926_4FC0_A936_77B52B8A98DB | |||||
| #define H05B2224D_B926_4FC0_A936_77B52B8A98DB | |||||
| #include "easy_graph/eg.h" | |||||
| EG_NS_BEGIN | |||||
| namespace details { | |||||
| template<typename T> | |||||
| struct DefaultValue { | |||||
| static T value() { | |||||
| return T(); | |||||
| } | |||||
| }; | |||||
| template<typename T> | |||||
| struct DefaultValue<T *> { | |||||
| static T *value() { | |||||
| return 0; | |||||
| } | |||||
| }; | |||||
| template<typename T> | |||||
| struct DefaultValue<const T *> { | |||||
| static T *value() { | |||||
| return 0; | |||||
| } | |||||
| }; | |||||
| template<> | |||||
| struct DefaultValue<void> { | |||||
| static void value() {} | |||||
| }; | |||||
| } // namespace details | |||||
| #define DEFAULT(type, method) \ | |||||
| virtual type method { \ | |||||
| return ::EG_NS::details::DefaultValue<type>::value(); \ | |||||
| } | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,39 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HF25A2E8D_A775_44BF_88D1_166DFF56186A | |||||
| #define HF25A2E8D_A775_44BF_88D1_166DFF56186A | |||||
| #include <type_traits> | |||||
| #include "easy_graph/eg.h" | |||||
| EG_NS_BEGIN | |||||
| template<typename T, typename... TS> | |||||
| using all_same_traits = typename std::enable_if<std::conjunction<std::is_same<T, TS>...>::value>::type; | |||||
| template<typename T, typename... TS> | |||||
| using all_same_but_none_traits = typename std::enable_if< | |||||
| std::disjunction<std::bool_constant<not(sizeof...(TS))>, std::conjunction<std::is_same<T, TS>...>>::value>::type; | |||||
| #define ALL_SAME_CONCEPT(TS, T) all_same_traits<T, TS...> * = nullptr | |||||
| #define ALL_SAME_BUT_NONE_CONCEPT(TS, T) ::EG_NS::all_same_but_none_traits<T, TS...> * = nullptr | |||||
| #define SUBGRAPH_CONCEPT(GS, G) ALL_SAME_BUT_NONE_CONCEPT(GS, G) | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,42 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H05B2224D_B926_4FC0_A936_97B52B8A98DB | |||||
| #define H05B2224D_B926_4FC0_A936_97B52B8A98DB | |||||
| #include "easy_graph/infra/default.h" | |||||
| EG_NS_BEGIN | |||||
| namespace details { | |||||
| template<typename T> | |||||
| struct Interface { | |||||
| virtual ~Interface() {} | |||||
| }; | |||||
| } // namespace details | |||||
| #define INTERFACE(Intf) struct Intf : ::EG_NS::details::Interface<Intf> | |||||
| #define ABSTRACT(...) virtual __VA_ARGS__ = 0 | |||||
| #define OVERRIDE(...) virtual __VA_ARGS__ override | |||||
| #define EXTENDS(...) , ##__VA_ARGS__ | |||||
| #define IMPLEMENTS(...) EXTENDS(__VA_ARGS__) | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,64 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H38247538_297F_4A80_94D3_8A289788461B | |||||
| #define H38247538_297F_4A80_94D3_8A289788461B | |||||
| #include "easy_graph/eg.h" | |||||
| EG_NS_BEGIN | |||||
| enum EgLogLevel { | |||||
| EG_NONE_LEVEL = 0x0, | |||||
| EG_DEBUG_LEVEL = 0x01, | |||||
| EG_INFO_LEVEL = 0x02, | |||||
| EG_SUCC_LEVEL = 0x04, | |||||
| EG_WARN_LEVEL = 0x08, | |||||
| EG_ERR_LEVEL = 0x10, | |||||
| EG_FATAL_LEVEL = 0x20, | |||||
| EG_TOTAL_LEVEL = 0xFF | |||||
| }; | |||||
| #define EG_LOG_LEVELS (EG_FATAL_LEVEL | EG_ERR_LEVEL | EG_WARN_LEVEL | EG_INFO_LEVEL) | |||||
| ///////////////////////////////////////////////////////////////// | |||||
| void eg_log(int level, const char *levelstr, const char *file, unsigned int line, const char *fmt, ...); | |||||
| #define EG_LOG_OUTPUT eg_log | |||||
| #define __EG_LOG_TITLE(level, levelstr, fmt, ...) \ | |||||
| do { \ | |||||
| if (level & EG_LOG_LEVELS) { \ | |||||
| EG_LOG_OUTPUT(level, levelstr, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \ | |||||
| } \ | |||||
| } while (0) | |||||
| #define EG_FATAL(fmt, ...) __EG_LOG_TITLE(EG_FATAL_LEVEL, "FATAL", fmt, ##__VA_ARGS__) | |||||
| #define EG_ERR(fmt, ...) __EG_LOG_TITLE(EG_ERR_LEVEL, "ERROR", fmt, ##__VA_ARGS__) | |||||
| #define EG_WARN(fmt, ...) __EG_LOG_TITLE(EG_WARN_LEVEL, "WARN", fmt, ##__VA_ARGS__) | |||||
| #define EG_SUCC(fmt, ...) __EG_LOG_TITLE(EG_SUCC_LEVEL, "SUCC", fmt, ##__VA_ARGS__) | |||||
| #define EG_INFO(fmt, ...) __EG_LOG_TITLE(EG_INFO_LEVEL, "INFO", fmt, ##__VA_ARGS__) | |||||
| #define EG_DBG(fmt, ...) __EG_LOG_TITLE(EG_DEBUG_LEVEL, "DEBUG", fmt, ##__VA_ARGS__) | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,58 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H7DA4A075_246A_4DD6_B1BB_ECA3806C9483 | |||||
| #define H7DA4A075_246A_4DD6_B1BB_ECA3806C9483 | |||||
| #include "easy_graph/eg.h" | |||||
| EG_NS_BEGIN | |||||
| //////////////////////////////////////////////////////////////////////// | |||||
| #define VA_ARGS_NUM(...) \ | |||||
| VA_ARGS_NUM_PRIVATE(0, ##__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, \ | |||||
| 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, \ | |||||
| 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) | |||||
| #define VA_ARGS_NUM_PRIVATE(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \ | |||||
| _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, \ | |||||
| _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, \ | |||||
| _56, _57, _58, _59, _60, _61, _62, _63, _64, N, ...) \ | |||||
| N | |||||
| //////////////////////////////////////////////////////////////////////// | |||||
| #define __MACRO_CONCAT(x, y) x##y | |||||
| #define MACRO_CONCAT(x, y) __MACRO_CONCAT(x, y) | |||||
| #define __MACRO_SECOND(FIRST, SECOND, ...) SECOND | |||||
| #define MACRO_SECOND(...) __MACRO_SECOND(__VA_ARGS__) | |||||
| #define MACRO_VERIFY_FIRST(...) MACRO_SECOND(__VA_ARGS__, 1) | |||||
| #define MACRO_BOOL_0 MACRO_DUMMY, 0 | |||||
| #define MACRO_BOOL(N) MACRO_VERIFY_FIRST(__MACRO_CONCAT(MACRO_BOOL_, N)) | |||||
| #define MACRO_CONDITION_0(TRUE_BRANCH, FALSE_BRANCH) FALSE_BRANCH | |||||
| #define MACRO_CONDITION_1(TRUE_BRANCH, FALSE_BRANCH) TRUE_BRANCH | |||||
| #define MACRO_CONDITION(N) MACRO_CONCAT(MACRO_CONDITION_, MACRO_BOOL(N)) | |||||
| #define NOT_EMPTY_SELECT(...) MACRO_CONDITION(VA_ARGS_NUM(__VA_ARGS__)) | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,68 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H05B2224D_B927_4FC0_A936_97B52B8A99DB | |||||
| #define H05B2224D_B927_4FC0_A936_97B52B8A99DB | |||||
| ////////////////////////////////////////////////////////////// | |||||
| #define __DECL_EQUALS(cls) \ | |||||
| bool operator!=(const cls &rhs) const; \ | |||||
| bool operator==(const cls &rhs) const | |||||
| ////////////////////////////////////////////////////////////// | |||||
| #define __FIELD_EQ(name) this->name == rhs.name | |||||
| #define __FIELD_LT(name) this->name < rhs.name | |||||
| ////////////////////////////////////////////////////////////// | |||||
| #define __SUPER_EQ(super) static_cast<const super &>(*this) == rhs | |||||
| #define __SUPER_LT(super) static_cast<const super &>(*this) < rhs | |||||
| ////////////////////////////////////////////////////////////// | |||||
| #define __DEF_EQUALS(cls) \ | |||||
| bool cls::operator!=(const cls &rhs) const { \ | |||||
| return !(*this == rhs); \ | |||||
| } \ | |||||
| bool cls::operator==(const cls &rhs) const | |||||
| ///////////////////////////////////////////////////////////// | |||||
| #define __INLINE_EQUALS(cls) \ | |||||
| bool operator!=(const cls &rhs) const { \ | |||||
| return !(*this == rhs); \ | |||||
| } \ | |||||
| bool operator==(const cls &rhs) const | |||||
| ///////////////////////////////////////////////////////////// | |||||
| #define __DECL_COMP(cls) \ | |||||
| __DECL_EQUALS(cls); \ | |||||
| bool operator<(const cls &) const; \ | |||||
| bool operator>(const cls &) const; \ | |||||
| bool operator<=(const cls &) const; \ | |||||
| bool operator>=(const cls &) const | |||||
| ///////////////////////////////////////////////////////////// | |||||
| #define __DEF_COMP(cls) \ | |||||
| bool cls::operator>(const cls &rhs) const { \ | |||||
| return !(*this <= rhs); \ | |||||
| } \ | |||||
| bool cls::operator>=(const cls &rhs) const { \ | |||||
| return !(*this < rhs); \ | |||||
| } \ | |||||
| bool cls::operator<=(const cls &rhs) const { \ | |||||
| return (*this < rhs) || (*this == rhs); \ | |||||
| } \ | |||||
| bool cls::operator<(const cls &rhs) const | |||||
| #endif | |||||
| @@ -0,0 +1,41 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H187A4A00_BD91_4B9D_8DD9_3D6C9EA15854 | |||||
| #define H187A4A00_BD91_4B9D_8DD9_3D6C9EA15854 | |||||
| #include "easy_graph/eg.h" | |||||
| EG_NS_BEGIN | |||||
| template<typename BEGIN, typename END> | |||||
| struct ScopeGuard { | |||||
| ScopeGuard(BEGIN begin, END end) : begin(begin), end(end) { | |||||
| begin(); | |||||
| } | |||||
| ~ScopeGuard() { | |||||
| end(); | |||||
| } | |||||
| private: | |||||
| BEGIN begin; | |||||
| END end; | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,42 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HD18A3E42_2801_4BEB_B365_03633D1D81C4 | |||||
| #define HD18A3E42_2801_4BEB_B365_03633D1D81C4 | |||||
| #include "easy_graph/eg.h" | |||||
| EG_NS_BEGIN | |||||
| template<typename T> | |||||
| struct Singleton { | |||||
| static T &GetInstance() { | |||||
| static T instance; | |||||
| return instance; | |||||
| } | |||||
| Singleton(const Singleton &) = delete; | |||||
| Singleton &operator=(const Singleton &) = delete; | |||||
| protected: | |||||
| Singleton() {} | |||||
| }; | |||||
| #define SINGLETON(object) struct object : ::EG_NS::Singleton<object> | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,55 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HA25033D6_1564_4748_B2C8_4DE2C5A286DE | |||||
| #define HA25033D6_1564_4748_B2C8_4DE2C5A286DE | |||||
| #include <stdbool.h> | |||||
| #include <stdint.h> | |||||
| #include "easy_graph/eg.h" | |||||
| EG_NS_BEGIN | |||||
| typedef uint32_t Status; | |||||
| #define EG_SUCC_STATUS(status) (EG_NS::Status) status | |||||
| #define EG_FAIL_STATUS(status) (EG_NS::Status)(status | EG_RESERVED_FAIL) | |||||
| /* OK */ | |||||
| #define EG_SUCCESS EG_SUCC_STATUS(0) | |||||
| /* Error Status */ | |||||
| #define EG_RESERVED_FAIL (EG_NS::Status) 0x80000000 | |||||
| #define EG_FAILURE EG_FAIL_STATUS(1) | |||||
| #define EG_FATAL_BUG EG_FAIL_STATUS(2) | |||||
| #define EG_TIMEDOUT EG_FAIL_STATUS(3) | |||||
| #define EG_OUT_OF_RANGE EG_FAIL_STATUS(4) | |||||
| #define EG_UNIMPLEMENTED EG_FAIL_STATUS(5) | |||||
| static inline bool eg_status_is_ok(Status status) { | |||||
| return (status & EG_RESERVED_FAIL) == 0; | |||||
| } | |||||
| static inline bool eg_status_is_fail(Status status) { | |||||
| return !eg_status_is_ok(status); | |||||
| } | |||||
| #define __EG_FAILED(result) eg_status_is_fail(result) | |||||
| #define __EG_OK(result) eg_status_is_ok(result) | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,31 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HAC96EB3A_2169_4BB0_A8EB_7B966C262B2F | |||||
| #define HAC96EB3A_2169_4BB0_A8EB_7B966C262B2F | |||||
| #include "easy_graph/layout/layout_executor.h" | |||||
| EG_NS_BEGIN | |||||
| struct GraphEasyExecutor : LayoutExecutor { | |||||
| private: | |||||
| Status Layout(const Graph &, const LayoutOption *) override; | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,53 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HB8CC77BE_6A2E_4EB4_BE59_CA85DE56C027 | |||||
| #define HB8CC77BE_6A2E_4EB4_BE59_CA85DE56C027 | |||||
| #include "easy_graph/eg.h" | |||||
| #include <string> | |||||
| #include <deque> | |||||
| EG_NS_BEGIN | |||||
| struct GraphEasyOption; | |||||
| struct Graph; | |||||
| struct GraphEasyLayoutContext { | |||||
| GraphEasyLayoutContext(const GraphEasyOption &); | |||||
| const Graph *GetCurrentGraph() const; | |||||
| void EnterGraph(const Graph &); | |||||
| void ExitGraph(); | |||||
| void LinkBegin(); | |||||
| void LinkEnd(); | |||||
| bool InLinking() const; | |||||
| std::string GetGroupPath() const; | |||||
| const GraphEasyOption &GetOptions() const; | |||||
| private: | |||||
| std::deque<const Graph *> graphs_; | |||||
| const GraphEasyOption &options_; | |||||
| bool is_linking_{false}; | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,63 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H37156CC2_92BD_44DA_8DA7_A11629E762BE | |||||
| #define H37156CC2_92BD_44DA_8DA7_A11629E762BE | |||||
| #include "easy_graph/layout/layout_option.h" | |||||
| #include <string> | |||||
| EG_NS_BEGIN | |||||
| enum class FlowDir { | |||||
| LR = 0, | |||||
| TB, | |||||
| }; | |||||
| enum class LayoutType { | |||||
| FREE = 0, | |||||
| REGULAR, | |||||
| }; | |||||
| enum class LayoutFormat { | |||||
| ASCII = 0, | |||||
| BOXART, | |||||
| SVG, | |||||
| DOT, | |||||
| HTML, | |||||
| }; | |||||
| enum class LayoutOutput { | |||||
| CONSOLE = 0, | |||||
| FILE, | |||||
| }; | |||||
| struct GraphEasyOption : LayoutOption { | |||||
| static const GraphEasyOption &GetDefault(); | |||||
| std::string GetLayoutCmdArgs(const std::string &graphName) const; | |||||
| LayoutFormat format_{LayoutFormat::BOXART}; | |||||
| LayoutOutput output_{LayoutOutput::CONSOLE}; | |||||
| FlowDir dir_{FlowDir::LR}; | |||||
| LayoutType type_{LayoutType::FREE}; | |||||
| size_t scale_{1}; | |||||
| std::string output_path_{"./"}; | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,45 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HB6783151_C24E_4DA3_B969_46C2298FF43F | |||||
| #define HB6783151_C24E_4DA3_B969_46C2298FF43F | |||||
| #include <string> | |||||
| #include "easy_graph/graph/graph_visitor.h" | |||||
| #include "easy_graph/layout/engines/graph_easy/graph_easy_layout_context.h" | |||||
| EG_NS_BEGIN | |||||
| struct GraphEasyOption; | |||||
| struct GraphEasyVisitor : GraphVisitor { | |||||
| GraphEasyVisitor(const GraphEasyOption &); | |||||
| std::string GetLayout() const; | |||||
| private: | |||||
| Status Visit(const Graph &) override; | |||||
| Status Visit(const Node &) override; | |||||
| Status Visit(const Edge &) override; | |||||
| private: | |||||
| std::string layout_; | |||||
| GraphEasyLayoutContext ctxt_; | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,40 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H550E4ACB_BEC7_4E71_8C6F_CD7FA53662A9 | |||||
| #define H550E4ACB_BEC7_4E71_8C6F_CD7FA53662A9 | |||||
| #include "easy_graph/infra/status.h" | |||||
| #include "easy_graph/infra/singleton.h" | |||||
| EG_NS_BEGIN | |||||
| struct LayoutExecutor; | |||||
| struct LayoutOption; | |||||
| struct Graph; | |||||
| SINGLETON(GraphLayout) { | |||||
| void Config(LayoutExecutor &, const LayoutOption * = nullptr); | |||||
| Status Layout(const Graph &, const LayoutOption * = nullptr); | |||||
| private: | |||||
| LayoutExecutor *executor_{nullptr}; | |||||
| const LayoutOption *options_{nullptr}; | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,34 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HE4984335_C586_4533_A056_27F9F996DF50 | |||||
| #define HE4984335_C586_4533_A056_27F9F996DF50 | |||||
| #include "easy_graph/infra/status.h" | |||||
| #include "easy_graph/infra/keywords.h" | |||||
| EG_NS_BEGIN | |||||
| struct Graph; | |||||
| struct LayoutOption; | |||||
| INTERFACE(LayoutExecutor) { | |||||
| ABSTRACT(Status Layout(const Graph &, const LayoutOption *)); | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,28 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H9491820D_4371_4C88_804E_4C77613F80C1 | |||||
| #define H9491820D_4371_4C88_804E_4C77613F80C1 | |||||
| #include "easy_graph/infra/keywords.h" | |||||
| EG_NS_BEGIN | |||||
| INTERFACE(LayoutOption){}; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,72 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "easy_graph/builder/chain_builder.h" | |||||
| #include "easy_graph/builder/graph_builder.h" | |||||
| EG_NS_BEGIN | |||||
| ChainBuilder::ChainBuilder(GraphBuilder &graphBuilder, EdgeType defaultEdgeType) | |||||
| : linker(*this, defaultEdgeType), graph_builder_(graphBuilder) {} | |||||
| ChainBuilder::LinkBuilder *ChainBuilder::operator->() { | |||||
| return &linker; | |||||
| } | |||||
| ChainBuilder &ChainBuilder::LinkTo(const Node &node, const Link &link) { | |||||
| Node *currentNode = graph_builder_.BuildNode(node); | |||||
| if (prev_node_) { | |||||
| graph_builder_.BuildEdge(*prev_node_, *currentNode, link); | |||||
| } | |||||
| prev_node_ = currentNode; | |||||
| return *this; | |||||
| } | |||||
| const Node *ChainBuilder::FindNode(const NodeId &id) const { | |||||
| return graph_builder_->FindNode(id); | |||||
| } | |||||
| ChainBuilder::LinkBuilder::LinkBuilder(ChainBuilder &chain, EdgeType defaultEdgeType) | |||||
| : chain_(chain), default_edge_type_(defaultEdgeType), from_link_(defaultEdgeType) {} | |||||
| ChainBuilder &ChainBuilder::LinkBuilder::Node(const NodeObj &node) { | |||||
| chain_.LinkTo(node, from_link_); | |||||
| from_link_.Reset(default_edge_type_); | |||||
| return chain_; | |||||
| } | |||||
| ChainBuilder &ChainBuilder::LinkBuilder::startLink(const Link &link) { | |||||
| this->from_link_ = link; | |||||
| return chain_; | |||||
| } | |||||
| ChainBuilder &ChainBuilder::LinkBuilder::Ctrl(const std::string &label) { | |||||
| return this->Edge(EdgeType::CTRL, UNDEFINED_PORT_ID, UNDEFINED_PORT_ID, label); | |||||
| } | |||||
| ChainBuilder &ChainBuilder::LinkBuilder::Data(const std::string &label) { | |||||
| return this->Edge(EdgeType::DATA, UNDEFINED_PORT_ID, UNDEFINED_PORT_ID, label); | |||||
| } | |||||
| ChainBuilder &ChainBuilder::LinkBuilder::Data(PortId srcId, PortId dstId, const std::string &label) { | |||||
| return this->Edge(EdgeType::DATA, srcId, dstId, label); | |||||
| } | |||||
| ChainBuilder &ChainBuilder::LinkBuilder::Edge(EdgeType type, PortId srcPort, PortId dstPort, const std::string &label) { | |||||
| return this->startLink(Link(type, label, srcPort, dstPort)); | |||||
| } | |||||
| EG_NS_END | |||||
| @@ -0,0 +1,78 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "easy_graph/builder/graph_builder.h" | |||||
| #include "easy_graph/graph/endpoint.h" | |||||
| #include "easy_graph/builder/link.h" | |||||
| #include "easy_graph/infra/log.h" | |||||
| EG_NS_BEGIN | |||||
| namespace { | |||||
| PortId getPortIdBy(const EdgeType &type, const PortId &specifiedPortId, PortId &reservedPortId) { | |||||
| if (type == EdgeType::CTRL) | |||||
| return 0; | |||||
| if (specifiedPortId == UNDEFINED_PORT_ID) | |||||
| return reservedPortId++; | |||||
| if (specifiedPortId < reservedPortId) | |||||
| return specifiedPortId; | |||||
| reservedPortId = specifiedPortId; | |||||
| return reservedPortId++; | |||||
| } | |||||
| } // namespace | |||||
| GraphBuilder::GraphBuilder(const std::string &name) : graph_(name) {} | |||||
| GraphBuilder::NodeInfo *GraphBuilder::FindNode(const NodeId &id) { | |||||
| auto it = nodes_.find(id); | |||||
| if (it == nodes_.end()) { | |||||
| return nullptr; | |||||
| } | |||||
| return &(it->second); | |||||
| } | |||||
| const GraphBuilder::NodeInfo *GraphBuilder::FindNode(const NodeId &id) const { | |||||
| return const_cast<GraphBuilder &>(*this).FindNode(id); | |||||
| } | |||||
| Node *GraphBuilder::BuildNode(const Node &node) { | |||||
| auto it = nodes_.find(node.GetId()); | |||||
| if (it == nodes_.end()) { | |||||
| nodes_.emplace(std::make_pair(node.GetId(), NodeInfo())); | |||||
| } | |||||
| return graph_.AddNode(node); | |||||
| } | |||||
| Edge *GraphBuilder::BuildEdge(const Node &src, const Node &dst, const Link &link) { | |||||
| NodeInfo *srcInfo = FindNode(src.GetId()); | |||||
| NodeInfo *dstInfo = FindNode(dst.GetId()); | |||||
| if (!srcInfo || !dstInfo) { | |||||
| EG_ERR("link edge{%d : %s} error!", link.type_, link.label_.c_str()); | |||||
| return nullptr; | |||||
| } | |||||
| PortId srcPortId = getPortIdBy(link.type_, link.src_port_id_, srcInfo->outPortMax); | |||||
| PortId dstPortId = getPortIdBy(link.type_, link.dst_port_id_, dstInfo->inPortMax); | |||||
| EG_DBG("link edge(%d) from (%s:%d) to (%s:%d)", link.type_, src.GetId().c_str(), srcPortId, dst.GetId().c_str(), | |||||
| dstPortId); | |||||
| return graph_.AddEdge( | |||||
| Edge(link.type_, link.label_, Endpoint(src.GetId(), srcPortId), Endpoint(dst.GetId(), dstPortId))); | |||||
| } | |||||
| EG_NS_END | |||||
| @@ -0,0 +1,53 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "easy_graph/graph/edge.h" | |||||
| EG_NS_BEGIN | |||||
| Edge::Edge(const EdgeType type, const std::string &label, const Endpoint &src, const Endpoint &dst) | |||||
| : type_(type), label_(label), src_(src), dst_(dst) {} | |||||
| __DEF_EQUALS(Edge) { | |||||
| return (type_ == rhs.type_) && (src_ == rhs.src_) && (dst_ == rhs.dst_); | |||||
| } | |||||
| __DEF_COMP(Edge) { | |||||
| if (src_ < rhs.src_) | |||||
| return true; | |||||
| if ((src_ == rhs.src_) && (dst_ < rhs.dst_)) | |||||
| return true; | |||||
| if ((src_ == rhs.src_) && (dst_ < rhs.dst_) && (type_ < rhs.type_)) | |||||
| return true; | |||||
| return false; | |||||
| } | |||||
| EdgeType Edge::GetType() const { | |||||
| return type_; | |||||
| } | |||||
| std::string Edge::GetLabel() const { | |||||
| return label_; | |||||
| } | |||||
| Endpoint Edge::GetSrc() const { | |||||
| return src_; | |||||
| } | |||||
| Endpoint Edge::GetDst() const { | |||||
| return dst_; | |||||
| } | |||||
| EG_NS_END | |||||
| @@ -0,0 +1,43 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "easy_graph/graph/endpoint.h" | |||||
| EG_NS_BEGIN | |||||
| Endpoint::Endpoint(const NodeId &nodeId, const PortId &portId) : node_id_(nodeId), port_id_(portId) {} | |||||
| __DEF_EQUALS(Endpoint) { | |||||
| return (node_id_ == rhs.node_id_) && (port_id_ == rhs.port_id_); | |||||
| } | |||||
| __DEF_COMP(Endpoint) { | |||||
| if (node_id_ < rhs.node_id_) | |||||
| return true; | |||||
| if ((node_id_ == rhs.node_id_) && (port_id_ < rhs.port_id_)) | |||||
| return true; | |||||
| return false; | |||||
| } | |||||
| NodeId Endpoint::getNodeId() const { | |||||
| return node_id_; | |||||
| } | |||||
| PortId Endpoint::getPortId() const { | |||||
| return port_id_; | |||||
| } | |||||
| EG_NS_END | |||||
| @@ -0,0 +1,70 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "easy_graph/graph/graph.h" | |||||
| #include "easy_graph/graph/graph_visitor.h" | |||||
| #include "easy_graph/layout/graph_layout.h" | |||||
| #include <algorithm> | |||||
| EG_NS_BEGIN | |||||
| Graph::Graph(const std::string &name) : name_(name) {} | |||||
| std::string Graph::GetName() const { | |||||
| return name_; | |||||
| } | |||||
| Node *Graph::AddNode(const Node &node) { | |||||
| auto result = nodes_.emplace(node.GetId(), node); | |||||
| return &(result.first->second); | |||||
| } | |||||
| Edge *Graph::AddEdge(const Edge &edge) { | |||||
| auto result = edges_.emplace(edge); | |||||
| return &(const_cast<Edge &>(*(result.first))); | |||||
| } | |||||
| Node *Graph::FindNode(const NodeId &id) { | |||||
| auto it = nodes_.find(id); | |||||
| if (it == nodes_.end()) { | |||||
| return nullptr; | |||||
| } | |||||
| return &(it->second); | |||||
| } | |||||
| const Node *Graph::FindNode(const NodeId &id) const { | |||||
| return const_cast<Graph &>(*this).FindNode(id); | |||||
| } | |||||
| std::pair<const Node *, const Node *> Graph::FindNodePair(const Edge &edge) const { | |||||
| return std::make_pair(FindNode(edge.GetSrc().getNodeId()), FindNode(edge.GetDst().getNodeId())); | |||||
| } | |||||
| std::pair<Node *, Node *> Graph::FindNodePair(const Edge &edge) { | |||||
| return std::make_pair(FindNode(edge.GetSrc().getNodeId()), FindNode(edge.GetDst().getNodeId())); | |||||
| } | |||||
| void Graph::Accept(GraphVisitor &visitor) const { | |||||
| visitor.Visit(*this); | |||||
| std::for_each(nodes_.begin(), nodes_.end(), [&visitor](const auto &node) { visitor.Visit(node.second); }); | |||||
| std::for_each(edges_.begin(), edges_.end(), [&visitor](const auto &edge) { visitor.Visit(edge); }); | |||||
| } | |||||
| Status Graph::Layout(const LayoutOption *option) const { | |||||
| return GraphLayout::GetInstance().Layout(*this, option); | |||||
| } | |||||
| EG_NS_END | |||||
| @@ -0,0 +1,49 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "easy_graph/graph/node.h" | |||||
| #include "easy_graph/graph/graph_visitor.h" | |||||
| #include <algorithm> | |||||
| EG_NS_BEGIN | |||||
| __DEF_EQUALS(Node) { | |||||
| return id_ == rhs.id_; | |||||
| } | |||||
| __DEF_COMP(Node) { | |||||
| return id_ < rhs.id_; | |||||
| } | |||||
| NodeId Node::GetId() const { | |||||
| return id_; | |||||
| } | |||||
| Node &Node::Packing(const BoxPtr &box) { | |||||
| this->box_ = box; | |||||
| return *this; | |||||
| } | |||||
| Node &Node::AddSubgraph(const Graph &graph) { | |||||
| subgraphs_.push_back(&graph); | |||||
| return *this; | |||||
| } | |||||
| void Node::Accept(GraphVisitor &visitor) const { | |||||
| std::for_each(subgraphs_.begin(), subgraphs_.end(), [&visitor](const auto &graph) { visitor.Visit(*graph); }); | |||||
| } | |||||
| EG_NS_END | |||||
| @@ -0,0 +1,138 @@ | |||||
| /** | |||||
| * Copyright 2021 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 <iostream> | |||||
| #include <string.h> | |||||
| #include <stdarg.h> | |||||
| #include "easy_graph/infra/log.h" | |||||
| EG_NS_BEGIN | |||||
| namespace { | |||||
| struct ConsoleState { | |||||
| bool isColorful() const { | |||||
| return colorful; | |||||
| } | |||||
| protected: | |||||
| ConsoleState(bool c) : colorful(c) {} | |||||
| private: | |||||
| bool colorful; | |||||
| }; | |||||
| //////////////////////////////////////////////////////// | |||||
| #define DEF_COLOR_STATE(STATE, COLOR) \ | |||||
| struct STATE : ConsoleState { \ | |||||
| STATE(bool colorful) : ConsoleState(colorful) {} \ | |||||
| }; \ | |||||
| std::ostream &operator<<(std::ostream &os, const STATE &state) { \ | |||||
| if (state.isColorful()) \ | |||||
| os << COLOR; \ | |||||
| return os; \ | |||||
| } | |||||
| //////////////////////////////////////////////////////// | |||||
| #define __RED "\033[1;31m" | |||||
| #define __GREEN "\033[1;32m" | |||||
| #define __YELLOW "\033[1;33m" | |||||
| #define __BLUE "\033[1;34m" | |||||
| #define __MAGENTA "\033[1;35m" | |||||
| #define __CYAN "\033[1;36m" | |||||
| #define __WHITE "\033[0m" | |||||
| DEF_COLOR_STATE(DebugState, __BLUE) | |||||
| DEF_COLOR_STATE(InfoState, __CYAN) | |||||
| DEF_COLOR_STATE(NormalState, __WHITE) | |||||
| DEF_COLOR_STATE(SuccState, __GREEN) | |||||
| DEF_COLOR_STATE(WarnState, __YELLOW) | |||||
| DEF_COLOR_STATE(FailState, __RED) | |||||
| /////////////////////////////////////////////////////// | |||||
| struct StdoutListener; | |||||
| StdoutListener *inst = nullptr; | |||||
| struct StdoutListener { | |||||
| static StdoutListener &getInstance() { | |||||
| if (inst == 0) { | |||||
| inst = new StdoutListener(true); | |||||
| } | |||||
| return *inst; | |||||
| } | |||||
| void println(const uint8_t level, const char *msg) { | |||||
| #define ON_LEVEL(level, state) \ | |||||
| case level: \ | |||||
| doPrint(state, msg); \ | |||||
| break; | |||||
| switch (level) { | |||||
| ON_LEVEL(EG_FATAL_LEVEL, fail) | |||||
| ON_LEVEL(EG_ERR_LEVEL, fail) | |||||
| ON_LEVEL(EG_WARN_LEVEL, warn) | |||||
| ON_LEVEL(EG_SUCC_LEVEL, succ) | |||||
| ON_LEVEL(EG_INFO_LEVEL, info) | |||||
| ON_LEVEL(EG_DEBUG_LEVEL, debug) | |||||
| default: | |||||
| doPrint(normal, msg); | |||||
| } | |||||
| } | |||||
| private: | |||||
| StdoutListener(bool colorful) | |||||
| : succ(colorful), fail(colorful), normal(colorful), info(colorful), warn(colorful), debug(colorful) {} | |||||
| template<typename STATE> | |||||
| void doPrint(const STATE &state, const char *msg) { | |||||
| std::cout << state << msg << normal << std::endl; | |||||
| } | |||||
| private: | |||||
| SuccState succ; | |||||
| FailState fail; | |||||
| NormalState normal; | |||||
| InfoState info; | |||||
| WarnState warn; | |||||
| DebugState debug; | |||||
| }; | |||||
| const char *getBaseName(const char *absPath) { | |||||
| if (absPath == 0) | |||||
| return ""; | |||||
| const char *p = absPath + strlen(absPath); | |||||
| while ((p != absPath) && (*(p - 1) != '/')) { | |||||
| p--; | |||||
| } | |||||
| return p; | |||||
| } | |||||
| } // namespace | |||||
| void eg_log(int level, const char *levelstr, const char *file, unsigned int line, const char *fmt, ...) { | |||||
| const int FMT_BUFF_SIZE = 1024; | |||||
| char fmt_buff[FMT_BUFF_SIZE] = {0}; | |||||
| va_list valist; | |||||
| va_start(valist, fmt); | |||||
| vsnprintf(fmt_buff, FMT_BUFF_SIZE, fmt, valist); | |||||
| va_end(valist); | |||||
| char buff[1280] = {0}; | |||||
| sprintf(buff, "[%s]: %s:%u: %s", levelstr, getBaseName(file), line, fmt_buff); | |||||
| StdoutListener::getInstance().println(level, buff); | |||||
| } | |||||
| EG_NS_END | |||||
| @@ -0,0 +1,47 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "easy_graph/layout/engines/graph_easy/graph_easy_executor.h" | |||||
| #include "easy_graph/layout/engines/graph_easy/graph_easy_visitor.h" | |||||
| #include "easy_graph/layout/engines/graph_easy/graph_easy_option.h" | |||||
| #include "layout/engines/graph_easy/utils/shell_executor.h" | |||||
| #include "easy_graph/layout/layout_option.h" | |||||
| #include "easy_graph/graph/graph.h" | |||||
| EG_NS_BEGIN | |||||
| namespace { | |||||
| const GraphEasyOption *GraphEasyOptionCast(const LayoutOption *opts) { | |||||
| if (!opts) | |||||
| return &(GraphEasyOption::GetDefault()); | |||||
| auto options = dynamic_cast<const GraphEasyOption *>(opts); | |||||
| if (options) | |||||
| return options; | |||||
| return &(GraphEasyOption::GetDefault()); | |||||
| } | |||||
| } // namespace | |||||
| Status GraphEasyExecutor::Layout(const Graph &graph, const LayoutOption *opts) { | |||||
| auto options = GraphEasyOptionCast(opts); | |||||
| GraphEasyVisitor visitor(*options); | |||||
| graph.Accept(visitor); | |||||
| std::string script = | |||||
| std::string("echo \"") + visitor.GetLayout() + "\" | graph-easy " + options->GetLayoutCmdArgs(graph.GetName()); | |||||
| return ShellExecutor::execute(script); | |||||
| } | |||||
| EG_NS_END | |||||
| @@ -0,0 +1,65 @@ | |||||
| /** | |||||
| * Copyright 2021 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 <algorithm> | |||||
| #include "easy_graph/layout/engines/graph_easy/graph_easy_layout_context.h" | |||||
| #include "easy_graph/layout/engines/graph_easy/graph_easy_option.h" | |||||
| #include "easy_graph/graph/graph.h" | |||||
| EG_NS_BEGIN | |||||
| GraphEasyLayoutContext::GraphEasyLayoutContext(const GraphEasyOption &options) : options_(options) {} | |||||
| const Graph *GraphEasyLayoutContext::GetCurrentGraph() const { | |||||
| if (graphs_.empty()) | |||||
| return nullptr; | |||||
| return graphs_.back(); | |||||
| } | |||||
| void GraphEasyLayoutContext::EnterGraph(const Graph &graph) { | |||||
| graphs_.push_back(&graph); | |||||
| } | |||||
| void GraphEasyLayoutContext::ExitGraph() { | |||||
| graphs_.pop_back(); | |||||
| } | |||||
| void GraphEasyLayoutContext::LinkBegin() { | |||||
| is_linking_ = true; | |||||
| } | |||||
| void GraphEasyLayoutContext::LinkEnd() { | |||||
| is_linking_ = false; | |||||
| } | |||||
| bool GraphEasyLayoutContext::InLinking() const { | |||||
| return is_linking_; | |||||
| } | |||||
| std::string GraphEasyLayoutContext::GetGroupPath() const { | |||||
| if (graphs_.empty()) | |||||
| return ""; | |||||
| std::string result(""); | |||||
| std::for_each(graphs_.begin(), graphs_.end(), | |||||
| [&result](const auto &graph) { result += (std::string("/") + graph->GetName()); }); | |||||
| return (result + "/"); | |||||
| } | |||||
| const GraphEasyOption &GraphEasyLayoutContext::GetOptions() const { | |||||
| return options_; | |||||
| } | |||||
| EG_NS_END | |||||
| @@ -0,0 +1,54 @@ | |||||
| /** | |||||
| * Copyright 2021 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 <map> | |||||
| #include "easy_graph/layout/engines/graph_easy/graph_easy_option.h" | |||||
| EG_NS_BEGIN | |||||
| namespace { | |||||
| struct Format { | |||||
| const char *format; | |||||
| const char *postfix; | |||||
| }; | |||||
| std::map<LayoutFormat, Format> formats = {{LayoutFormat::ASCII, {"ascii", "txt"}}, | |||||
| {LayoutFormat::BOXART, {"boxart", "txt"}}, | |||||
| {LayoutFormat::SVG, {"svg", "svg"}}, | |||||
| {LayoutFormat::DOT, {"dot", "dot"}}, | |||||
| {LayoutFormat::HTML, {"html", "html"}}}; | |||||
| std::string GetLayoutOutputArg(const GraphEasyOption &options, const std::string &graphName) { | |||||
| if (options.output_ == LayoutOutput::CONSOLE) | |||||
| return ""; | |||||
| return std::string(" --output ") + options.output_path_ + graphName + "." + formats[options.format_].postfix; | |||||
| } | |||||
| std::string GetLayoutFomartArg(const GraphEasyOption &options) { | |||||
| return std::string(" --as=") + formats[options.format_].format; | |||||
| } | |||||
| } // namespace | |||||
| const GraphEasyOption &GraphEasyOption::GetDefault() { | |||||
| static GraphEasyOption option; | |||||
| return option; | |||||
| } | |||||
| std::string GraphEasyOption::GetLayoutCmdArgs(const std::string &graphName) const { | |||||
| return GetLayoutFomartArg(*this) + GetLayoutOutputArg(*this, graphName); | |||||
| } | |||||
| EG_NS_END | |||||
| @@ -0,0 +1,188 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "easy_graph/layout/engines/graph_easy/graph_easy_visitor.h" | |||||
| #include "layout/engines/graph_easy/utils/shell_executor.h" | |||||
| #include "easy_graph/layout/engines/graph_easy/graph_easy_option.h" | |||||
| #include "easy_graph/infra/scope_guard.h" | |||||
| #include "easy_graph/graph/graph.h" | |||||
| #include "easy_graph/graph/edge.h" | |||||
| #include "easy_graph/graph/node.h" | |||||
| #include "easy_graph/infra/log.h" | |||||
| EG_NS_BEGIN | |||||
| namespace { | |||||
| struct SubgraphLayoutVisitor : GraphVisitor { | |||||
| SubgraphLayoutVisitor(const NodeId &id, GraphEasyLayoutContext &ctxt) : id_(id), ctxt_(ctxt) {} | |||||
| std::string layout; | |||||
| bool hasSubgraph{false}; | |||||
| private: | |||||
| Status Visit(const Graph &graph) override { | |||||
| ScopeGuard guard([this, &graph]() { ctxt_.EnterGraph(graph); }, [this]() { ctxt_.ExitGraph(); }); | |||||
| layout += (std::string(" -- [") + id_ + "/" + graph.GetName() + "]" + | |||||
| "{class : subgraph; label : " + graph.GetName() + ";}"); | |||||
| hasSubgraph = true; | |||||
| return EG_SUCCESS; | |||||
| } | |||||
| private: | |||||
| NodeId id_; | |||||
| GraphEasyLayoutContext &ctxt_; | |||||
| }; | |||||
| ///////////////////////////////////////////////////////////////////////// | |||||
| std::string GetGraphLayoutTitle(const Graph &graph, const GraphEasyLayoutContext &ctxt) { | |||||
| std::string flowDirection = (ctxt.GetOptions().dir_ == FlowDir::LR) ? "east" : "down"; | |||||
| std::string graphTitle = std::string("graph { label : ") + graph.GetName() + "; flow : " + flowDirection + | |||||
| " ; } node.subgraph { border : double-dash; }"; | |||||
| return graphTitle; | |||||
| } | |||||
| ///////////////////////////////////////////////////////////////////////// | |||||
| std::string GetNodeLayout(const Node &node, GraphEasyLayoutContext &ctxt) { | |||||
| const auto &id = node.GetId(); | |||||
| std::string nodeBox = std::string("[") + id + "]"; | |||||
| SubgraphLayoutVisitor subgraphVisitor(id, ctxt); | |||||
| node.Accept(subgraphVisitor); | |||||
| if (!subgraphVisitor.hasSubgraph || ctxt.InLinking()) | |||||
| return nodeBox; | |||||
| return (std::string("( ") + id + ": " + nodeBox + subgraphVisitor.layout + ")"); | |||||
| } | |||||
| ///////////////////////////////////////////////////////////////////////// | |||||
| INTERFACE(EdgeLayout) { | |||||
| EdgeLayout(GraphEasyLayoutContext & ctxt, const Edge &edge) : ctxt_(ctxt), options_(ctxt.GetOptions()), edge_(edge) {} | |||||
| std::string GetLayout() const { | |||||
| auto graph = ctxt_.GetCurrentGraph(); | |||||
| if (!graph) { | |||||
| EG_FATAL("Layout context has no graph!"); | |||||
| return ""; | |||||
| } | |||||
| auto node_pair = graph->FindNodePair(edge_); | |||||
| if ((!node_pair.first) || (!node_pair.second)) { | |||||
| EG_FATAL("Layout context graph(%s) has not found node(%s, %s)!", graph->GetName().c_str(), | |||||
| edge_.GetSrc().getNodeId().c_str(), edge_.GetDst().getNodeId().c_str()); | |||||
| return ""; | |||||
| } | |||||
| std::string src_node_layout = GetNodeLayout(*node_pair.first, ctxt_); | |||||
| std::string dst_node_layout = GetNodeLayout(*node_pair.second, ctxt_); | |||||
| return src_node_layout + GetArrowLayout() + GetAttrLayout() + dst_node_layout; | |||||
| } | |||||
| private: | |||||
| ABSTRACT(std::string GetAttrLayout() const); | |||||
| ABSTRACT(std::string GetArrowLayout() const); | |||||
| protected: | |||||
| GraphEasyLayoutContext &ctxt_; | |||||
| const GraphEasyOption &options_; | |||||
| const Edge &edge_; | |||||
| }; | |||||
| ///////////////////////////////////////////////////////////////////////// | |||||
| struct CtrlEdgeLayout : EdgeLayout { | |||||
| using EdgeLayout::EdgeLayout; | |||||
| private: | |||||
| std::string GetAttrLayout() const override { | |||||
| if (edge_.GetLabel() == "") | |||||
| return ""; | |||||
| return std::string("{label : ") + edge_.GetLabel() + "}"; | |||||
| } | |||||
| std::string GetArrowLayout() const override { | |||||
| return " ..> "; | |||||
| } | |||||
| }; | |||||
| ///////////////////////////////////////////////////////////////////////// | |||||
| struct DataEdgeLayout : EdgeLayout { | |||||
| using EdgeLayout::EdgeLayout; | |||||
| private: | |||||
| std::string GetAttrLayout() const override { | |||||
| return std::string("{ ") + GetLabelAttr() + GetPortAttr() + " }"; | |||||
| } | |||||
| std::string GetArrowLayout() const override { | |||||
| return " --> "; | |||||
| } | |||||
| private: | |||||
| std::string GetPortPair() const { | |||||
| return std::string("(") + std::to_string(edge_.GetSrc().getPortId()) + "," + | |||||
| std::to_string(edge_.GetDst().getPortId()) + ")"; | |||||
| } | |||||
| std::string GetLabelAttr() const { | |||||
| return std::string("label :") + edge_.GetLabel() + GetPortPair() + "; "; | |||||
| } | |||||
| std::string GetPortAttr() const { | |||||
| return (options_.type_ == LayoutType::FREE) ? "" : GetOutPortAttr() + GetInPortAttr(); | |||||
| } | |||||
| std::string GetOutPortAttr() const { | |||||
| return std::string(" start : ") + "front" + ", " + std::to_string(edge_.GetSrc().getPortId() * options_.scale_) + | |||||
| "; "; | |||||
| } | |||||
| std::string GetInPortAttr() const { | |||||
| return std::string(" end : ") + "back" + ", " + std::to_string(edge_.GetDst().getPortId() * options_.scale_) + "; "; | |||||
| } | |||||
| }; | |||||
| } // namespace | |||||
| GraphEasyVisitor::GraphEasyVisitor(const GraphEasyOption &options) : ctxt_(options) {} | |||||
| Status GraphEasyVisitor::Visit(const Graph &graph) { | |||||
| ctxt_.EnterGraph(graph); | |||||
| layout_ += GetGraphLayoutTitle(graph, ctxt_); | |||||
| return EG_SUCCESS; | |||||
| } | |||||
| Status GraphEasyVisitor::Visit(const Node &node) { | |||||
| layout_ += GetNodeLayout(node, ctxt_); | |||||
| return EG_SUCCESS; | |||||
| } | |||||
| Status GraphEasyVisitor::Visit(const Edge &edge) { | |||||
| ScopeGuard guard([this]() { ctxt_.LinkBegin(); }, [this]() { ctxt_.LinkEnd(); }); | |||||
| auto makeEdgeLayout = [this, &edge]() -> const EdgeLayout * { | |||||
| if (edge.GetType() == EdgeType::CTRL) | |||||
| return new CtrlEdgeLayout(ctxt_, edge); | |||||
| return new DataEdgeLayout(ctxt_, edge); | |||||
| }; | |||||
| std::unique_ptr<const EdgeLayout> edgeLayout(makeEdgeLayout()); | |||||
| layout_ += edgeLayout->GetLayout(); | |||||
| return EG_SUCCESS; | |||||
| } | |||||
| std::string GraphEasyVisitor::GetLayout() const { | |||||
| return layout_; | |||||
| } | |||||
| EG_NS_END | |||||
| @@ -0,0 +1,43 @@ | |||||
| /** | |||||
| * Copyright 2021 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 <sys/types.h> | |||||
| #include <sys/wait.h> | |||||
| #include <cstdlib> | |||||
| #include <string> | |||||
| #include "easy_graph/infra/log.h" | |||||
| #include "layout/engines/graph_easy/utils/shell_executor.h" | |||||
| EG_NS_BEGIN | |||||
| Status ShellExecutor::execute(const std::string &script) { | |||||
| EG_DBG("%s", script.c_str()); | |||||
| pid_t status = system(script.c_str()); | |||||
| if (-1 == status) { | |||||
| EG_ERR("system execute return error!"); | |||||
| return EG_FAILURE; | |||||
| } | |||||
| if (WIFEXITED(status) && (0 == WEXITSTATUS(status))) | |||||
| return EG_SUCCESS; | |||||
| EG_ERR("system execute {%s} exit status value = [0x%x], exit code: %d\n", script.c_str(), status, | |||||
| WEXITSTATUS(status)); | |||||
| return EG_FAILURE; | |||||
| } | |||||
| EG_NS_END | |||||
| @@ -0,0 +1,32 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HB141A993_B14A_4A1D_A1DD_353D33AE77A2 | |||||
| #define HB141A993_B14A_4A1D_A1DD_353D33AE77A2 | |||||
| #include <string> | |||||
| #include "easy_graph/eg.h" | |||||
| #include "easy_graph/infra/status.h" | |||||
| EG_NS_BEGIN | |||||
| struct ShellExecutor { | |||||
| static Status execute(const std::string &script); | |||||
| }; | |||||
| EG_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,35 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "easy_graph/layout/graph_layout.h" | |||||
| #include "easy_graph/layout/layout_executor.h" | |||||
| #include "easy_graph/graph/graph.h" | |||||
| EG_NS_BEGIN | |||||
| void GraphLayout::Config(LayoutExecutor &executor, const LayoutOption *opts) { | |||||
| this->executor_ = &executor; | |||||
| options_ = opts; | |||||
| } | |||||
| Status GraphLayout::Layout(const Graph &graph, const LayoutOption *opts) { | |||||
| const LayoutOption *options = opts ? opts : this->options_; | |||||
| if (!executor_) | |||||
| return EG_UNIMPLEMENTED; | |||||
| return executor_->Layout(graph, options); | |||||
| } | |||||
| EG_NS_END | |||||
| @@ -0,0 +1,18 @@ | |||||
| # Copyright 2021 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. | |||||
| # ============================================================================ | |||||
| add_subdirectory(include) | |||||
| add_subdirectory(src) | |||||
| add_subdirectory(tests) | |||||
| @@ -0,0 +1,17 @@ | |||||
| # Copyright 2021 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. | |||||
| # ============================================================================ | |||||
| add_library(ge_graph_dsl_inc INTERFACE) | |||||
| target_include_directories(ge_graph_dsl_inc INTERFACE ./) | |||||
| @@ -0,0 +1,29 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H382C2083_01CC_43DF_8BBD_EF6714FF62B2 | |||||
| #define H382C2083_01CC_43DF_8BBD_EF6714FF62B2 | |||||
| #define GE_NS ge | |||||
| #define GE_NS_BEGIN namespace GE_NS { | |||||
| #define GE_NS_END } | |||||
| #define USING_GE_NS using namespace GE_NS; | |||||
| #define FWD_DECL_GE(type) \ | |||||
| namespace GE_NS { \ | |||||
| struct type; \ | |||||
| } | |||||
| #endif /* H382C2083_01CC_43DF_8BBD_EF6714FF62B2 */ | |||||
| @@ -1,34 +1,38 @@ | |||||
| /** | |||||
| * Copyright 2021 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 GRAPHENGINE_LLT_ST_GRAPH_ASSERTION_H | |||||
| #define GRAPHENGINE_LLT_ST_GRAPH_ASSERTION_H | |||||
| /* | |||||
| * Compare graph node size, node_attr | |||||
| */ | |||||
| #define ASSERT_GRAPH_EQUAL(g1,g2) \ | |||||
| do { \ | |||||
| } while (0) | |||||
| #define ASSERT_GRAPH_CORRECT(g) \ | |||||
| do { \ | |||||
| } while (0) | |||||
| #define ASSERT_GRAPH_SHAPE_CONTINOUS(g) \ | |||||
| do { \ | |||||
| } while (0) | |||||
| #endif // GRAPHENGINE_LLT_ST_GRAPH_ASSERTION_H | |||||
| /** | |||||
| * Copyright 2021 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 H7C82E219_BDEF_4480_A2D9_30F0590C8AC5 | |||||
| #define H7C82E219_BDEF_4480_A2D9_30F0590C8AC5 | |||||
| #include "easy_graph/graph/graph.h" | |||||
| #include "easy_graph/builder/graph_dsl.h" | |||||
| #include "ge_graph_dsl/ge.h" | |||||
| #include "ge_graph_dsl/op_desc/op_desc_node_builder.h" | |||||
| #include "external/graph/graph.h" | |||||
| GE_NS_BEGIN | |||||
| Graph ToGeGraph(const ::EG_NS::Graph &graph); | |||||
| ComputeGraphPtr ToComputeGraph(const ::EG_NS::Graph &graph); | |||||
| #define DATA_EDGE(...) Data(__VA_ARGS__) | |||||
| #define CTRL_EDGE(...) Ctrl(__VA_ARGS__) | |||||
| #define NODE(...) Node(::GE_NS::OpDescNodeBuild(__VA_ARGS__)) | |||||
| #define EDGE(...) DATA_EDGE(__VA_ARGS__) | |||||
| GE_NS_END | |||||
| #endif | |||||
| @@ -0,0 +1,33 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H6DCF6C61_7C9B_4048_BB5D_E748142FF7F8 | |||||
| #define H6DCF6C61_7C9B_4048_BB5D_E748142FF7F8 | |||||
| #include "ge_graph_dsl/ge.h" | |||||
| #include "easy_graph/graph/node_id.h" | |||||
| #include "easy_graph/graph/box.h" | |||||
| #include "external/graph/gnode.h" | |||||
| GE_NS_BEGIN | |||||
| struct OpBox : ::EG_NS::Box { | |||||
| ABSTRACT(OpDescPtr Build(const ::EG_NS::NodeId &) const); | |||||
| }; | |||||
| GE_NS_END | |||||
| #endif /* H6DCF6C61_7C9B_4048_BB5D_E748142FF7F8 */ | |||||
| @@ -0,0 +1,52 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H77F0BD09_6C00_4E45_8DED_38A676D6B20A | |||||
| #define H77F0BD09_6C00_4E45_8DED_38A676D6B20A | |||||
| #include <string> | |||||
| #include "ge_graph_dsl/ge.h" | |||||
| #include "graph/types.h" | |||||
| #include "ge_graph_dsl/op_desc/op_type.h" | |||||
| GE_NS_BEGIN | |||||
| struct OpDescCfg { | |||||
| struct TensorCfg { | |||||
| TensorCfg(Format format = FORMAT_NCHW, DataType data_type = DT_FLOAT, std::vector<int64_t> shape = {1, 1, 224, 224}) | |||||
| : format_(format), data_type_(data_type), shape_(shape) {} | |||||
| Format format_; | |||||
| DataType data_type_; | |||||
| std::vector<int64_t> shape_; | |||||
| }; | |||||
| OpDescCfg(const OpType &type, int in_cnt = 0, int out_cnt = 0, Format format = FORMAT_NCHW, | |||||
| DataType data_type = DT_FLOAT, std::vector<int64_t> shape = {1, 1, 224, 224}) | |||||
| : type_(type), in_cnt_(in_cnt), out_cnt_(out_cnt), default_tensor_(format, data_type, shape) {} | |||||
| protected: | |||||
| OpType GetType() const { | |||||
| return type_; | |||||
| } | |||||
| OpType type_; | |||||
| int in_cnt_; | |||||
| int out_cnt_; | |||||
| TensorCfg default_tensor_; | |||||
| }; | |||||
| GE_NS_END | |||||
| #endif /* H77F0BD09_6C00_4E45_8DED_38A676D6B20A */ | |||||
| @@ -0,0 +1,51 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HF55B1FFE_C64C_4671_8A25_A57DDD5D1280 | |||||
| #define HF55B1FFE_C64C_4671_8A25_A57DDD5D1280 | |||||
| #include "easy_graph/graph/node_id.h" | |||||
| #include "ge_graph_dsl/ge.h" | |||||
| #include "ge_graph_dsl/op_desc/op_box.h" | |||||
| #include "ge_graph_dsl/op_desc/op_desc_cfg.h" | |||||
| #include "graph/op_desc.h" | |||||
| GE_NS_BEGIN | |||||
| struct OpDescCfgBox : OpBox, private OpDescCfg { | |||||
| OpDescCfgBox(const OpType &opType); | |||||
| OpDescCfgBox &InCnt(int in_cnt); | |||||
| OpDescCfgBox &OutCnt(int out_cnt); | |||||
| OpDescCfgBox &TensorDesc(Format format = FORMAT_NCHW, DataType data_type = DT_FLOAT, | |||||
| std::vector<int64_t> shape = {1, 1, 224, 224}); | |||||
| template<typename Type> | |||||
| OpDescCfgBox& Attr(const std::string &name, Type value) { | |||||
| auto attrvalue = ge::GeAttrValue::CreateFrom<Type>(value); | |||||
| attrs_.emplace(std::make_pair(name, attrvalue)); | |||||
| return *this; | |||||
| } | |||||
| private: | |||||
| OpDescPtr Build(const ::EG_NS::NodeId &id) const override; | |||||
| void UpdateAttrs(OpDescPtr&) const; | |||||
| std::map<std::string, GeAttrValue> attrs_; | |||||
| }; | |||||
| #define OP_CFG(optype) ::GE_NS::OpDescCfgBox(optype) | |||||
| GE_NS_END | |||||
| #endif /* HF55B1FFE_C64C_4671_8A25_A57DDD5D1280 */ | |||||
| @@ -0,0 +1,34 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H600DEDD4_D5B9_4803_AF48_262B2C4FBA94d | |||||
| #define H600DEDD4_D5B9_4803_AF48_262B2C4FBA94c | |||||
| #include "easy_graph/infra/singleton.h" | |||||
| #include "ge_graph_dsl/ge.h" | |||||
| #include "ge_graph_dsl/op_desc/op_type.h" | |||||
| GE_NS_BEGIN | |||||
| struct OpDescCfg; | |||||
| SINGLETON(OpDescCfgRepo) { | |||||
| const OpDescCfg *FindBy(const OpType &); | |||||
| }; | |||||
| GE_NS_END | |||||
| #endif /* H600DEDD4_D5B9_4803_AF48_262B2C4FBA94 */ | |||||
| @@ -0,0 +1,57 @@ | |||||
| /** | |||||
| * Copyright 2021 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 H53F1A984_1D06_4458_9595_0A6DC60EA9CE | |||||
| #define H53F1A984_1D06_4458_9595_0A6DC60EA9CE | |||||
| #include "easy_graph/graph/node.h" | |||||
| #include "ge_graph_dsl/ge.h" | |||||
| #include "ge_graph_dsl/op_desc/op_desc_ptr_box.h" | |||||
| #include "ge_graph_dsl/op_desc/op_desc_cfg_box.h" | |||||
| #include "graph/op_desc.h" | |||||
| using ::EG_NS::Node; | |||||
| using ::EG_NS::NodeId; | |||||
| GE_NS_BEGIN | |||||
| inline const ::EG_NS::NodeId OpDescNodeBuild(const ::EG_NS::NodeId &id) { | |||||
| return id; | |||||
| } | |||||
| template<typename... GRAPHS, SUBGRAPH_CONCEPT(GRAPHS, ::EG_NS::Graph)> | |||||
| inline ::EG_NS::Node OpDescNodeBuild(const ::EG_NS::NodeId &id, const GRAPHS &... graphs) { | |||||
| return ::EG_NS::Node(id, graphs...); | |||||
| } | |||||
| template<typename... GRAPHS, SUBGRAPH_CONCEPT(GRAPHS, ::EG_NS::Graph)> | |||||
| inline ::EG_NS::Node OpDescNodeBuild(const OpDescPtr &op, const GRAPHS &... graphs) { | |||||
| return ::EG_NS::Node(op->GetName(), BOX_OF(::GE_NS::OpDescPtrBox, op), graphs...); | |||||
| } | |||||
| template<typename... GRAPHS, SUBGRAPH_CONCEPT(GRAPHS, ::EG_NS::Graph)> | |||||
| inline ::EG_NS::Node OpDescNodeBuild(const ::EG_NS::NodeId &id, const OpType &opType, const GRAPHS &... graphs) { | |||||
| return ::EG_NS::Node(id, BOX_OF(OpDescCfgBox, opType), graphs...); | |||||
| } | |||||
| template<typename... GRAPHS, SUBGRAPH_CONCEPT(GRAPHS, ::EG_NS::Graph)> | |||||
| inline ::EG_NS::Node OpDescNodeBuild(const ::EG_NS::NodeId &id, const OpDescCfgBox &opBox, const GRAPHS &... graphs) { | |||||
| return ::EG_NS::Node(id, BOX_OF(OpDescCfgBox, opBox), graphs...); | |||||
| } | |||||
| GE_NS_END | |||||
| #endif /* H53F1A984_1D06_4458_9595_0A6DC60EA9CE */ | |||||
| @@ -0,0 +1,38 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HCFDD0816_CC46_4264_9363_9E8C6934F43E | |||||
| #define HCFDD0816_CC46_4264_9363_9E8C6934F43E | |||||
| #include "easy_graph/eg.h" | |||||
| #include "easy_graph/graph/node_id.h" | |||||
| #include "graph/op_desc.h" | |||||
| #include "ge_graph_dsl/ge.h" | |||||
| #include "ge_graph_dsl/op_desc/op_box.h" | |||||
| GE_NS_BEGIN | |||||
| struct OpDescPtrBox : OpBox { | |||||
| OpDescPtrBox(const OpDescPtr &op) : op_(op) {} | |||||
| private: | |||||
| OpDescPtr Build(const ::EG_NS::NodeId &id) const override; | |||||
| const OpDescPtr op_; | |||||
| }; | |||||
| GE_NS_END | |||||
| #endif /* HCFDD0816_CC46_4264_9363_9E8C6934F43E */ | |||||
| @@ -0,0 +1,28 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HAA2D4486_DB43_4ED2_BCF8_F41AD8267A85 | |||||
| #define HAA2D4486_DB43_4ED2_BCF8_F41AD8267A85 | |||||
| #include <string> | |||||
| #include "ge_graph_dsl/ge.h" | |||||
| GE_NS_BEGIN | |||||
| using OpType = std::string; | |||||
| GE_NS_END | |||||
| #endif /* HAA2D4486_DB43_4ED2_BCF8_F41AD8267A85 */ | |||||
| @@ -0,0 +1,44 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HD31125D4_0EB8_494C_B83D_3B8B923A914D | |||||
| #define HD31125D4_0EB8_494C_B83D_3B8B923A914D | |||||
| #include "easy_graph/graph/graph_visitor.h" | |||||
| #include "graph/compute_graph.h" | |||||
| #include "external/graph/graph.h" | |||||
| #include "ge_graph_dsl/ge.h" | |||||
| GE_NS_BEGIN | |||||
| struct GeGraphVisitor : ::EG_NS::GraphVisitor { | |||||
| GeGraphVisitor(); | |||||
| void reset(const ComputeGraphPtr &graph); | |||||
| Graph BuildGeGraph() const; | |||||
| ComputeGraphPtr BuildComputeGraph() const; | |||||
| private: | |||||
| ::EG_NS::Status Visit(const ::EG_NS::Graph &) override; | |||||
| ::EG_NS::Status Visit(const ::EG_NS::Node &) override; | |||||
| ::EG_NS::Status Visit(const ::EG_NS::Edge &) override; | |||||
| private: | |||||
| ComputeGraphPtr build_graph_; | |||||
| }; | |||||
| GE_NS_END | |||||
| #endif /* TESTS_ST_EASY_GRAPH_GELAYOUT_GRAPH_GE_VISTOR_H_ */ | |||||
| @@ -0,0 +1,47 @@ | |||||
| /** | |||||
| * Copyright 2021 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 HF900DC04_D202_42ED_992A_35DD7C940CE6 | |||||
| #define HF900DC04_D202_42ED_992A_35DD7C940CE6 | |||||
| #include "easy_graph/infra/status.h" | |||||
| #include "external/graph/gnode.h" | |||||
| #include "ge_graph_dsl/ge.h" | |||||
| #include "ge_graph_dsl/vistor/ge_graph_vistor.h" | |||||
| GE_NS_BEGIN | |||||
| struct GeSubgraphVisitor : ::EG_NS::GraphVisitor { | |||||
| GeSubgraphVisitor(ComputeGraphPtr &, const ::EG_NS::Node &); | |||||
| ::EG_NS::Status BuildGraphRelations(); | |||||
| private: | |||||
| ::EG_NS::Status Visit(const ::EG_NS::Graph &) override; | |||||
| ::EG_NS::Status Visit(const ::EG_NS::Node &) override; | |||||
| ::EG_NS::Status Visit(const ::EG_NS::Edge &) override; | |||||
| private: | |||||
| ::EG_NS::Status BuildGraphRelations(OpDescPtr &); | |||||
| private: | |||||
| ComputeGraphPtr &root_graph_; | |||||
| const ::EG_NS::Node &node_; | |||||
| GeGraphVisitor cur_graph_vistor_; | |||||
| std::vector<ComputeGraphPtr> subgraphs_; | |||||
| }; | |||||
| GE_NS_END | |||||
| #endif /* HF900DC04_D202_42ED_992A_35DD7C940CE6 */ | |||||
| @@ -0,0 +1,28 @@ | |||||
| # Copyright 2021 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. | |||||
| # ============================================================================ | |||||
| file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS "*.cc" "*.CC" "*.cpp" "*.CPP") | |||||
| add_library(ge_graph_dsl STATIC ${SOURCES}) | |||||
| target_include_directories(ge_graph_dsl | |||||
| PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} | |||||
| ) | |||||
| target_link_libraries(ge_graph_dsl PUBLIC | |||||
| $<BUILD_INTERFACE:intf_pub>) | |||||
| set_target_properties(ge_graph_dsl PROPERTIES CXX_STANDARD 17) | |||||
| target_link_libraries(ge_graph_dsl PUBLIC ge_graph_dsl_inc easy_graph metadef_graph) | |||||
| @@ -0,0 +1,79 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "easy_graph/graph/edge.h" | |||||
| #include "easy_graph/graph/graph.h" | |||||
| #include "easy_graph/graph/node.h" | |||||
| #include "easy_graph/graph/edge_type.h" | |||||
| #include "easy_graph/builder/box_builder.h" | |||||
| #include "external/graph/types.h" | |||||
| #include "graph/utils/graph_utils.h" | |||||
| #include "graph/compute_graph.h" | |||||
| #include "graph/ge_tensor.h" | |||||
| #include "framework/common/types.h" | |||||
| #include "ge_graph_dsl/op_desc/op_box.h" | |||||
| #include "ge_graph_dsl/op_desc/op_desc_cfg_box.h" | |||||
| #include "ge_graph_dsl/vistor/ge_graph_vistor.h" | |||||
| #include "ge_graph_dsl/vistor/ge_subgraph_vistor.h" | |||||
| using ::EG_NS::Status; | |||||
| GE_NS_BEGIN | |||||
| GeGraphVisitor::GeGraphVisitor() : build_graph_(std::make_shared<ComputeGraph>("")) {} | |||||
| void GeGraphVisitor::reset(const ComputeGraphPtr &graph) { | |||||
| build_graph_ = graph; | |||||
| } | |||||
| Graph GeGraphVisitor::BuildGeGraph() const { | |||||
| return GraphUtils::CreateGraphFromComputeGraph(build_graph_); | |||||
| } | |||||
| ComputeGraphPtr GeGraphVisitor::BuildComputeGraph() const { | |||||
| return build_graph_; | |||||
| } | |||||
| Status GeGraphVisitor::Visit(const ::EG_NS::Graph &graph) { | |||||
| build_graph_->SetName(graph.GetName()); | |||||
| return EG_SUCCESS; | |||||
| } | |||||
| Status GeGraphVisitor::Visit(const ::EG_NS::Node &node) { | |||||
| GeSubgraphVisitor vistor(build_graph_, node); | |||||
| return vistor.BuildGraphRelations(); | |||||
| } | |||||
| Status GeGraphVisitor::Visit(const ::EG_NS::Edge &edge) { | |||||
| auto src_node = build_graph_->FindNode(edge.GetSrc().getNodeId()); | |||||
| auto dst_node = build_graph_->FindNode(edge.GetDst().getNodeId()); | |||||
| if (edge.GetType() == ::EG_NS::EdgeType::CTRL) { | |||||
| GraphUtils::AddEdge(src_node->GetOutControlAnchor(), dst_node->GetInControlAnchor()); | |||||
| return EG_SUCCESS; | |||||
| } | |||||
| if (src_node->GetAllOutDataAnchorsSize() <= edge.GetSrc().getPortId() || | |||||
| dst_node->GetAllInDataAnchorsSize() <= edge.GetDst().getPortId()) { | |||||
| return EG_FAILURE; | |||||
| } | |||||
| GraphUtils::AddEdge(src_node->GetOutDataAnchor(edge.GetSrc().getPortId()), | |||||
| dst_node->GetInDataAnchor(edge.GetDst().getPortId())); | |||||
| return EG_SUCCESS; | |||||
| } | |||||
| GE_NS_END | |||||
| @@ -0,0 +1,70 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "easy_graph/graph/node.h" | |||||
| #include "easy_graph/graph/graph.h" | |||||
| #include "easy_graph/graph/edge.h" | |||||
| #include "ge_graph_dsl/op_desc/op_box.h" | |||||
| #include "ge_graph_dsl/vistor/ge_subgraph_vistor.h" | |||||
| GE_NS_BEGIN | |||||
| GeSubgraphVisitor::GeSubgraphVisitor(ComputeGraphPtr &rootGraph, const ::EG_NS::Node &node) | |||||
| : root_graph_(rootGraph), node_(node) {} | |||||
| ::EG_NS::Status GeSubgraphVisitor::BuildGraphRelations() { | |||||
| node_.Accept(*this); | |||||
| auto nod_builder = node_.Unpacking<OpBox>(); | |||||
| if (nod_builder == nullptr) { | |||||
| return EG_FAILURE; | |||||
| } else { | |||||
| auto opPtr = nod_builder->Build(node_.GetId()); | |||||
| return BuildGraphRelations(opPtr); | |||||
| } | |||||
| } | |||||
| ::EG_NS::Status GeSubgraphVisitor::BuildGraphRelations(OpDescPtr &opPtr) { | |||||
| auto node = root_graph_->AddNode(opPtr); | |||||
| int graph_index = 0; | |||||
| for (auto subGraph : subgraphs_) { | |||||
| opPtr->AddSubgraphName(subGraph->GetName()); | |||||
| opPtr->SetSubgraphInstanceName(graph_index++, subGraph->GetName()); | |||||
| subGraph->SetParentNode(node); | |||||
| subGraph->SetParentGraph(root_graph_); | |||||
| root_graph_->AddSubgraph(subGraph); | |||||
| } | |||||
| return EG_SUCCESS; | |||||
| } | |||||
| ::EG_NS::Status GeSubgraphVisitor::Visit(const ::EG_NS::Graph &graph) { | |||||
| auto subgraph = std::make_shared<ComputeGraph>(graph.GetName()); | |||||
| cur_graph_vistor_.reset(subgraph); | |||||
| graph.Accept(cur_graph_vistor_); | |||||
| subgraphs_.push_back(subgraph); | |||||
| return EG_SUCCESS; | |||||
| } | |||||
| ::EG_NS::Status GeSubgraphVisitor::Visit(const ::EG_NS::Node &node) { | |||||
| ::EG_NS::GraphVisitor &vistor = cur_graph_vistor_; | |||||
| return vistor.Visit(node); | |||||
| } | |||||
| ::EG_NS::Status GeSubgraphVisitor::Visit(const ::EG_NS::Edge &edge) { | |||||
| ::EG_NS::GraphVisitor &vistor = cur_graph_vistor_; | |||||
| return vistor.Visit(edge); | |||||
| } | |||||
| GE_NS_END | |||||
| @@ -0,0 +1,39 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "easy_graph/builder/graph_dsl.h" | |||||
| #include "easy_graph/graph/graph.h" | |||||
| #include "external/graph/graph.h" | |||||
| #include "ge_graph_dsl/graph_dsl.h" | |||||
| #include "ge_graph_dsl/vistor/ge_graph_vistor.h" | |||||
| GE_NS_BEGIN | |||||
| Graph ToGeGraph(const ::EG_NS::Graph &graph) { | |||||
| graph.Layout(); | |||||
| GeGraphVisitor geVistor; | |||||
| graph.Accept(geVistor); | |||||
| return geVistor.BuildGeGraph(); | |||||
| } | |||||
| ComputeGraphPtr ToComputeGraph(const ::EG_NS::Graph &graph) { | |||||
| graph.Layout(); | |||||
| GeGraphVisitor geVistor; | |||||
| graph.Accept(geVistor); | |||||
| return geVistor.BuildComputeGraph(); | |||||
| } | |||||
| GE_NS_END | |||||
| @@ -0,0 +1,75 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "ge_graph_dsl/op_desc/op_desc_cfg_box.h" | |||||
| #include "easy_graph/infra/status.h" | |||||
| #include "ge_graph_dsl/op_desc/op_desc_cfg_repo.h" | |||||
| #include "ge_graph_dsl/op_desc/op_desc_cfg.h" | |||||
| #include "external/graph/gnode.h" | |||||
| #include "graph/ge_tensor.h" | |||||
| using ::EG_NS::Status; | |||||
| using ::GE_NS::OpDescCfg; | |||||
| GE_NS_BEGIN | |||||
| OpDescCfgBox::OpDescCfgBox(const OpType &opType) : OpDescCfg(opType) { | |||||
| auto opCfg = OpDescCfgRepo::GetInstance().FindBy(opType); | |||||
| if (opCfg != nullptr) { | |||||
| ::OpDescCfg &base = *this; | |||||
| base = (*opCfg); | |||||
| } | |||||
| } | |||||
| OpDescCfgBox &OpDescCfgBox::InCnt(int in_cnt) { | |||||
| this->in_cnt_ = in_cnt; | |||||
| return *this; | |||||
| } | |||||
| OpDescCfgBox &OpDescCfgBox::OutCnt(int out_cnt) { | |||||
| this->out_cnt_ = out_cnt; | |||||
| return *this; | |||||
| } | |||||
| OpDescCfgBox &OpDescCfgBox::TensorDesc(Format format, DataType data_type, std::vector<int64_t> shape) { | |||||
| default_tensor_.format_ = format; | |||||
| default_tensor_.data_type_ = data_type; | |||||
| default_tensor_.shape_ = shape; | |||||
| return *this; | |||||
| } | |||||
| void OpDescCfgBox::UpdateAttrs(OpDescPtr& op_desc) const { | |||||
| std::for_each(attrs_.begin(), attrs_.end(), [&op_desc](const auto &attr){ | |||||
| op_desc->SetAttr(attr.first, attr.second); | |||||
| }); | |||||
| } | |||||
| OpDescPtr OpDescCfgBox::Build(const ::EG_NS::NodeId &id) const { | |||||
| auto opPtr = std::make_shared<OpDesc>(id, GetType()); | |||||
| GeTensorDesc tensor_desc(ge::GeShape(default_tensor_.shape_), default_tensor_.format_, default_tensor_.data_type_); | |||||
| for (int i = 0; i < in_cnt_; i++) { | |||||
| opPtr->AddInputDesc(tensor_desc); | |||||
| } | |||||
| for (int i = 0; i < out_cnt_; i++) { | |||||
| opPtr->AddOutputDesc(tensor_desc); | |||||
| } | |||||
| UpdateAttrs(opPtr); | |||||
| return opPtr; | |||||
| } | |||||
| GE_NS_END | |||||
| @@ -0,0 +1,46 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "ge_graph_dsl/op_desc/op_desc_cfg_repo.h" | |||||
| #include "framework/common/types.h" | |||||
| #include "graph/debug/ge_attr_define.h" | |||||
| #include "ge_graph_dsl/op_desc/op_desc_cfg.h" | |||||
| GE_NS_BEGIN | |||||
| namespace { | |||||
| #define OP_CFG(optype, ...) \ | |||||
| { \ | |||||
| optype, OpDescCfg { \ | |||||
| optype, __VA_ARGS__ \ | |||||
| } \ | |||||
| } | |||||
| static std::map<OpType, OpDescCfg> cfg_repo{OP_CFG(DATA, 1, 1, FORMAT_NCHW, DT_FLOAT, {1, 1, 224, 224}), | |||||
| OP_CFG(ADD, 2, 1, FORMAT_NCHW, DT_FLOAT, {1, 1, 224, 224}), | |||||
| OP_CFG(VARIABLE, 1, 1)}; | |||||
| } // namespace | |||||
| const OpDescCfg *OpDescCfgRepo::FindBy(const OpType &id) { | |||||
| auto it = cfg_repo.find(id); | |||||
| if (it == cfg_repo.end()) { | |||||
| return nullptr; | |||||
| } | |||||
| return &(it->second); | |||||
| } | |||||
| GE_NS_END | |||||
| @@ -1,17 +1,24 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "graph_assertion.h" | |||||
| /** | |||||
| * Copyright 2021 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 "ge_graph_dsl/op_desc/op_desc_ptr_box.h" | |||||
| #include "external/graph/gnode.h" | |||||
| USING_GE_NS | |||||
| OpDescPtr OpDescPtrBox::Build(const ::EG_NS::NodeId &id) const { | |||||
| return op_; | |||||
| } | |||||
| @@ -0,0 +1,33 @@ | |||||
| # Copyright 2021 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. | |||||
| # ============================================================================ | |||||
| file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS "*.cc" "*.CC" "*.cpp" "*.CPP") | |||||
| add_executable(ge_graph_dsl_test ${SOURCES}) | |||||
| target_include_directories(ge_graph_dsl_test | |||||
| PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} | |||||
| ) | |||||
| target_compile_options(ge_graph_dsl_test PRIVATE | |||||
| -g | |||||
| ) | |||||
| set_target_properties(ge_graph_dsl_test PROPERTIES CXX_STANDARD 17) | |||||
| target_link_libraries(ge_graph_dsl_test PUBLIC gtest gtest_main ge_graph_dsl) | |||||
| include(CTest) | |||||
| enable_testing() | |||||
| add_test(NAME test COMMAND ge_graph_dsl_test) | |||||
| @@ -0,0 +1,218 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "gtest/gtest.h" | |||||
| #include <string> | |||||
| #include "easy_graph/graph/box.h" | |||||
| #include "easy_graph/graph/node.h" | |||||
| #include "easy_graph/builder/graph_dsl.h" | |||||
| #include "easy_graph/builder/box_builder.h" | |||||
| #include "easy_graph/layout/graph_layout.h" | |||||
| #include "easy_graph/layout/engines/graph_easy/graph_easy_option.h" | |||||
| #include "easy_graph/layout/engines/graph_easy/graph_easy_executor.h" | |||||
| #include "graph/graph.h" | |||||
| #include "graph/compute_graph.h" | |||||
| #include "framework/common/types.h" | |||||
| #include "graph/debug/ge_attr_define.h" | |||||
| #include "ge_graph_dsl/graph_dsl.h" | |||||
| #include "ge_graph_dsl/op_desc/op_desc_cfg_box.h" | |||||
| USING_GE_NS | |||||
| class GraphDslTest : public testing::Test { | |||||
| private: | |||||
| EG_NS::GraphEasyExecutor executor; | |||||
| protected: | |||||
| void SetUp() { | |||||
| EG_NS::GraphLayout::GetInstance().Config(executor, nullptr); | |||||
| } | |||||
| void TearDown() {} | |||||
| }; | |||||
| TEST_F(GraphDslTest, test_build_graph_from_optype_with_name) { | |||||
| DEF_GRAPH(g1) { | |||||
| CHAIN(NODE("data1", DATA)->NODE("add", ADD)); | |||||
| }); | |||||
| auto geGraph = ToGeGraph(g1); | |||||
| auto computeGraph = ToComputeGraph(g1); | |||||
| ASSERT_EQ(geGraph.GetAllNodes().size(), 2); | |||||
| ASSERT_EQ(computeGraph->GetAllNodesSize(), 2); | |||||
| } | |||||
| TEST_F(GraphDslTest, test_build_graph_with_name) { | |||||
| DEF_GRAPH(g1, "sample_graph") { | |||||
| CHAIN(NODE("data1", DATA)->NODE("add", ADD)); | |||||
| }); | |||||
| auto geGraph = ToGeGraph(g1); | |||||
| ASSERT_EQ(geGraph.GetAllNodes().size(), 2); | |||||
| ASSERT_EQ(geGraph.GetName(), "sample_graph"); | |||||
| } | |||||
| TEST_F(GraphDslTest, test_build_from_from_op_desc_ptr) { | |||||
| DEF_GRAPH(g1) { | |||||
| auto data = std::make_shared<OpDesc>("data1", DATA); | |||||
| auto add = std::make_shared<OpDesc>("Add", ADD); | |||||
| CHAIN(NODE(data)->NODE(add)); | |||||
| }); | |||||
| auto geGraph = ToGeGraph(g1); | |||||
| ASSERT_EQ(geGraph.GetAllNodes().size(), 2); | |||||
| } | |||||
| TEST_F(GraphDslTest, test_build_from_op_desc_cfg) { | |||||
| DEF_GRAPH(g1) { | |||||
| auto datCfg = OP_CFG(DATA).InCnt(1).OutCnt(1); | |||||
| auto addCfg = OP_CFG(DATA).InCnt(1).OutCnt(1); | |||||
| CHAIN(NODE("data1", datCfg)->NODE("add", addCfg)); | |||||
| }); | |||||
| auto geGraph = ToGeGraph(g1); | |||||
| ASSERT_EQ(geGraph.GetAllNodes().size(), 2); | |||||
| } | |||||
| TEST_F(GraphDslTest, test_build_from_op_desc_cfg_inline) { | |||||
| DEF_GRAPH(g1) { | |||||
| CHAIN(NODE("data1", OP_CFG(DATA).InCnt(1).OutCnt(1))->NODE("add", OP_CFG(ADD).InCnt(2).OutCnt(1))); | |||||
| }); | |||||
| auto geGraph = ToGeGraph(g1); | |||||
| ASSERT_EQ(geGraph.GetAllNodes().size(), 2); | |||||
| } | |||||
| TEST_F(GraphDslTest, test_build_from_control_chain) { | |||||
| DEF_GRAPH(g1) { | |||||
| CTRL_CHAIN(NODE("data1", DATA)->NODE("add", ADD)); | |||||
| }); | |||||
| auto geGraph = ToGeGraph(g1); | |||||
| ASSERT_EQ(geGraph.GetAllNodes().size(), 2); | |||||
| } | |||||
| TEST_F(GraphDslTest, test_build_from_data_chain) { | |||||
| DEF_GRAPH(g1) { | |||||
| DATA_CHAIN(NODE("data1", DATA)->NODE("add", ADD)); | |||||
| }); | |||||
| auto geGraph = ToGeGraph(g1); | |||||
| ASSERT_EQ(geGraph.GetAllNodes().size(), 2); | |||||
| } | |||||
| TEST_F(GraphDslTest, test_build_from_data_chain_with_edge) { | |||||
| DEF_GRAPH(g1) { | |||||
| CTRL_CHAIN(NODE("data1", DATA)->NODE("add", ADD)); | |||||
| CHAIN(NODE("data1", DATA)->EDGE(2, 2)->NODE("add")); | |||||
| }); | |||||
| auto geGraph = ToGeGraph(g1); | |||||
| ASSERT_EQ(geGraph.GetAllNodes().size(), 2); | |||||
| } | |||||
| TEST_F(GraphDslTest, test_build_graph_reused_before_node) { | |||||
| DEF_GRAPH(g1) { | |||||
| CTRL_CHAIN(NODE("data1", DATA)->NODE("add", ADD)); | |||||
| CHAIN(NODE("data1")->EDGE(2, 2)->NODE("add")); | |||||
| }); | |||||
| auto geGraph = ToGeGraph(g1); | |||||
| ASSERT_EQ(geGraph.GetAllNodes().size(), 2); | |||||
| } | |||||
| TEST_F(GraphDslTest, test_build_graph_with_constant_folding) { | |||||
| DEF_GRAPH(g1) { | |||||
| CHAIN(NODE("data1", DATA)->NODE("add", ADD)); | |||||
| CHAIN(NODE("data2", DATA)->NODE("add")); | |||||
| }); | |||||
| auto geGraph = ToGeGraph(g1); | |||||
| ASSERT_EQ(geGraph.GetAllNodes().size(), 3); | |||||
| } | |||||
| TEST_F(GraphDslTest, test_build_complex_normal_graph_build_suggested) { | |||||
| DEF_GRAPH(g1) { | |||||
| CHAIN(NODE("w1", VARIABLE)->NODE("prefetch1", HCOMALLGATHER)->NODE("Add1", ADD)); | |||||
| CHAIN(NODE("w2", VARIABLE)->NODE("prefetch2", HCOMALLGATHER)->NODE("Add2", ADD)); | |||||
| CHAIN(NODE("w3", VARIABLE)->NODE("prefetch3", HCOMALLGATHER)->NODE("Add3", ADD)); | |||||
| CHAIN(NODE("w4", VARIABLE)->NODE("prefetch4", HCOMALLGATHER)->NODE("Add4", ADD)); | |||||
| CHAIN(NODE("w5", VARIABLE)->NODE("prefetch5", HCOMALLGATHER)->NODE("Add5", ADD)); | |||||
| CHAIN(NODE("const1", CONSTANTOP) | |||||
| ->NODE("Add1") | |||||
| ->NODE("Add2") | |||||
| ->NODE("Add3") | |||||
| ->NODE("Add4") | |||||
| ->NODE("Add5") | |||||
| ->NODE("net_output", NETOUTPUT)); | |||||
| }); | |||||
| auto geGraph = ToGeGraph(g1); | |||||
| ASSERT_EQ(geGraph.GetAllNodes().size(), 17); | |||||
| } | |||||
| TEST_F(GraphDslTest, test_build_complex_mult_normal_graph_build) { | |||||
| DEF_GRAPH(g1) { | |||||
| CHAIN(NODE("w1", VARIABLE)->NODE("prefetch1", HCOMALLGATHER)->NODE("add1", ADD)); | |||||
| CHAIN(NODE("w2", VARIABLE)->NODE("prefetch2", HCOMALLGATHER)->NODE("add1")); | |||||
| CHAIN(NODE("w3", VARIABLE)->NODE("prefetch3", HCOMALLGATHER)->NODE("add2", ADD)); | |||||
| CHAIN(NODE("w4", VARIABLE)->NODE("prefetch4", HCOMALLGATHER)->NODE("add2")); | |||||
| CHAIN(NODE("w5", VARIABLE)->NODE("prefetch5", HCOMALLGATHER)->NODE("add3", ADD)); | |||||
| CHAIN(NODE("const1", CONSTANTOP)->NODE("add3")); | |||||
| CHAIN(NODE("add1")->NODE("net_output", NETOUTPUT)); | |||||
| CHAIN(NODE("add2")->NODE("net_output")); | |||||
| CHAIN(NODE("add3")->NODE("net_output")); | |||||
| CTRL_CHAIN(NODE("add1")->NODE("add2")->NODE("add3")); | |||||
| }); | |||||
| auto geGraph = ToGeGraph(g1); | |||||
| ASSERT_EQ(geGraph.GetAllNodes().size(), 15); | |||||
| } | |||||
| TEST_F(GraphDslTest, test_build_graph_with_sub_graph) { | |||||
| DEF_GRAPH(sub_1) { | |||||
| CHAIN(NODE("data_i", DATA)->NODE("less", LESS)->NODE("netoutput", NETOUTPUT)); | |||||
| CHAIN(NODE("const_5", CONSTANTOP)->NODE("less")); | |||||
| }); | |||||
| DEF_GRAPH(sub_2) { | |||||
| CHAIN(NODE("data_a", DATA)->NODE("mul", MUL)->NODE("netoutput", NETOUTPUT)); | |||||
| CHAIN(NODE("const_2", CONSTANTOP)->NODE("mul")); | |||||
| }); | |||||
| DEF_GRAPH(g1) { | |||||
| CHAIN(NODE("data_a", DATA)->NODE("while", WHILE, sub_1, sub_2)->NODE("netoutput", NETOUTPUT)); | |||||
| CHAIN(NODE("data_i", DATA)->NODE("while")); | |||||
| }); | |||||
| sub_1.Layout(); | |||||
| sub_2.Layout(); | |||||
| auto geGraph = ToGeGraph(g1); | |||||
| ASSERT_EQ(geGraph.GetAllNodes().size(), 12); | |||||
| } | |||||
| @@ -0,0 +1,33 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "framework/common/types.h" | |||||
| #include "graph/debug/ge_attr_define.h" | |||||
| #include "ge_graph_dsl/ge.h" | |||||
| GE_NS_BEGIN | |||||
| REGISTER_OPTYPE_DEFINE(DATA, "Data"); | |||||
| REGISTER_OPTYPE_DEFINE(HCOMALLGATHER, "HcomAllGather"); | |||||
| REGISTER_OPTYPE_DEFINE(VARIABLE, "Variable"); | |||||
| REGISTER_OPTYPE_DEFINE(CONSTANTOP, "Constant"); | |||||
| REGISTER_OPTYPE_DEFINE(LESS, "Less"); | |||||
| REGISTER_OPTYPE_DEFINE(MUL, "Mul"); | |||||
| REGISTER_OPTYPE_DEFINE(NETOUTPUT, "NetOutput"); | |||||
| REGISTER_OPTYPE_DEFINE(ADD, "Add"); | |||||
| REGISTER_OPTYPE_DEFINE(WHILE, "While"); | |||||
| GE_NS_END | |||||
| @@ -31,20 +31,14 @@ list(APPEND INCLUDE_DIRECTORIES | |||||
| ) | ) | ||||
| file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS "*.cc" "*.CC" "*.cpp" "*.CPP" "*.c++") | file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS "*.cc" "*.CC" "*.cpp" "*.CPP" "*.c++") | ||||
| #todo | |||||
| file(GLOB_RECURSE STUB_ENGINE_SRC CONFIGURE_DEPENDS | |||||
| "stub_engine/*.cc" | |||||
| ) | |||||
| # ---- Target : stub Host engine ---- | |||||
| add_library(fe SHARED ${STUB_ENGINE_SRC}) | |||||
| # ---- Target : stub Host engine ---- | |||||
| add_library(fe SHARED ${SOURCES}) | |||||
| target_include_directories(fe | target_include_directories(fe | ||||
| PUBLIC | PUBLIC | ||||
| ${INCLUDE_DIRECTORIES} | ${INCLUDE_DIRECTORIES} | ||||
| ${GE_CODE_DIR}/tests/st/framework | |||||
| ${CMAKE_CURRENT_SOURCE_DIR} | ${CMAKE_CURRENT_SOURCE_DIR} | ||||
| ${CMAKE_CURRENT_SOURCE_DIR}/stub_engine | |||||
| ) | ) | ||||
| target_compile_definitions(fe PRIVATE | target_compile_definitions(fe PRIVATE | ||||
| @@ -62,16 +56,3 @@ target_link_libraries(fe PUBLIC | |||||
| ) | ) | ||||
| set_target_properties(fe PROPERTIES CXX_STANDARD 11) | set_target_properties(fe PROPERTIES CXX_STANDARD 11) | ||||
| # ---- Target : framework ---- | |||||
| list(REMOVE_ITEM SOURCES ${STUB_ENGINE_SRC}) | |||||
| add_library(framework STATIC ${SOURCES}) | |||||
| target_include_directories(framework | |||||
| PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} | |||||
| ) | |||||
| set_target_properties(framework PROPERTIES CXX_STANDARD 11) | |||||
| target_link_libraries(framework PUBLIC graphengine fe) | |||||
| @@ -51,7 +51,9 @@ void StubEngine::GetGraphOptimizerObjs(std::map<std::string, GraphOptimizerPtr> | |||||
| // no optimizer for host cpu engine | // no optimizer for host cpu engine | ||||
| } | } | ||||
| Status StubEngine::Finalize() { return SUCCESS; } | |||||
| Status StubEngine::Finalize() { | |||||
| return SUCCESS; | |||||
| } | |||||
| } // namespace st | } // namespace st | ||||
| } // namespace ge | } // namespace ge | ||||
| @@ -67,4 +69,6 @@ void GetGraphOptimizerObjs(std::map<std::string, GraphOptimizerPtr> &graph_optim | |||||
| ge::st::StubEngine::Instance().GetGraphOptimizerObjs(graph_optimizers); | ge::st::StubEngine::Instance().GetGraphOptimizerObjs(graph_optimizers); | ||||
| } | } | ||||
| ge::Status Finalize() { return ge::st::StubEngine::Instance().Finalize(); } | |||||
| ge::Status Finalize() { | |||||
| return ge::st::StubEngine::Instance().Finalize(); | |||||
| } | |||||
| @@ -25,9 +25,9 @@ const std::string kAicpuAscendLibName = "AicpuAscendLib"; | |||||
| const std::string kHcclLibName = "HcclLib"; | const std::string kHcclLibName = "HcclLib"; | ||||
| const std::string kRTSLibName = "RTSLib"; | const std::string kRTSLibName = "RTSLib"; | ||||
| const std::map<std::string, std::string> kStubEngine2KernelLib = { | const std::map<std::string, std::string> kStubEngine2KernelLib = { | ||||
| {"AIcoreEngine", "AiCoreLib"}, {"VectorEngine", "VectorLib"}, | |||||
| {"DNN_VM_AICPU", "AicpuLib"}, {"DNN_VM_AICPU_ASCEND", "AicpuAscendLib"}, | |||||
| {"DNN_HCCL", "HcclLib"}, {"DNN_VM_RTS", "RTSLib"}}; | |||||
| {"AIcoreEngine", "AiCoreLib"}, {"VectorEngine", "VectorLib"}, | |||||
| {"DNN_VM_AICPU", "AicpuLib"}, {"DNN_VM_AICPU_ASCEND", "AicpuAscendLib"}, | |||||
| {"DNN_HCCL", "HcclLib"}, {"DNN_VM_RTS", "RTSLib"}}; | |||||
| } // namespace st | } // namespace st | ||||
| } // namespace ge | } // namespace ge | ||||
| #endif // GRAPHENGINE_ST_TYPES_H | #endif // GRAPHENGINE_ST_TYPES_H | ||||
| @@ -19,7 +19,6 @@ | |||||
| #include "framework/common/util.h" | #include "framework/common/util.h" | ||||
| #include "stub_engine/ops_kernel_store/op/stub_op_factory.h" | #include "stub_engine/ops_kernel_store/op/stub_op_factory.h" | ||||
| namespace ge { | namespace ge { | ||||
| namespace st { | namespace st { | ||||
| Status HostOp::Run() { | Status HostOp::Run() { | ||||
| @@ -53,17 +53,21 @@ class GE_FUNC_VISIBILITY OpFactory { | |||||
| */ | */ | ||||
| void RegisterCreator(const std::string &type, const std::string &lib_name, const OP_CREATOR_FUNC &func); | void RegisterCreator(const std::string &type, const std::string &lib_name, const OP_CREATOR_FUNC &func); | ||||
| const std::vector<std::string> &GetAllOps() const { return all_ops_; } | |||||
| const std::vector<std::string> &GetAllOps() const { | |||||
| return all_ops_; | |||||
| } | |||||
| const std::vector<std::string> &GetAllOps(std::string lib_name) const { | const std::vector<std::string> &GetAllOps(std::string lib_name) const { | ||||
| auto iter = all_store_ops_.find(lib_name); | auto iter = all_store_ops_.find(lib_name); | ||||
| if(iter == all_store_ops_.end()){ | |||||
| if (iter == all_store_ops_.end()) { | |||||
| return all_ops_; | return all_ops_; | ||||
| } | } | ||||
| return iter->second; | return iter->second; | ||||
| } | } | ||||
| bool CheckSupported(const std::string &type) { return op_creator_map_.find(type) != op_creator_map_.end(); } | |||||
| bool CheckSupported(const std::string &type) { | |||||
| return op_creator_map_.find(type) != op_creator_map_.end(); | |||||
| } | |||||
| OpFactory(const OpFactory &) = delete; | OpFactory(const OpFactory &) = delete; | ||||
| OpFactory &operator=(const OpFactory &) = delete; | OpFactory &operator=(const OpFactory &) = delete; | ||||
| @@ -94,10 +98,10 @@ class GE_FUNC_VISIBILITY OpRegistrar { | |||||
| OpRegistrar &operator=(OpRegistrar &&) = delete; | OpRegistrar &operator=(OpRegistrar &&) = delete; | ||||
| }; | }; | ||||
| #define REGISTER_OP_CREATOR(type, lib_name, clazz) \ | |||||
| std::shared_ptr<Op> Creator_##type##Op(const Node &node, RunContext &run_context) { \ | |||||
| return MakeShared<clazz>(node, run_context); \ | |||||
| } \ | |||||
| #define REGISTER_OP_CREATOR(type, lib_name, clazz) \ | |||||
| std::shared_ptr<Op> Creator_##type##Op(const Node &node, RunContext &run_context) { \ | |||||
| return MakeShared<clazz>(node, run_context); \ | |||||
| } \ | |||||
| OpRegistrar g_##type##Op_creator(#type, #lib_name, Creator_##type##Op) | OpRegistrar g_##type##Op_creator(#type, #lib_name, Creator_##type##Op) | ||||
| } // namespace st | } // namespace st | ||||
| } // namespace ge | } // namespace ge | ||||
| @@ -36,8 +36,12 @@ REGISTER_OPS_KERNEL_BUILDER(kAicpuAscendLibName, StubOpsKernelBuilder); | |||||
| REGISTER_OPS_KERNEL_BUILDER(kHcclLibName, StubOpsKernelBuilder); | REGISTER_OPS_KERNEL_BUILDER(kHcclLibName, StubOpsKernelBuilder); | ||||
| REGISTER_OPS_KERNEL_BUILDER(kRTSLibName, StubOpsKernelBuilder); | REGISTER_OPS_KERNEL_BUILDER(kRTSLibName, StubOpsKernelBuilder); | ||||
| Status StubOpsKernelBuilder::Finalize() { return SUCCESS; } | |||||
| Status StubOpsKernelBuilder::Initialize(const map<std::string, std::string> &options) { return SUCCESS; } | |||||
| Status StubOpsKernelBuilder::Finalize() { | |||||
| return SUCCESS; | |||||
| } | |||||
| Status StubOpsKernelBuilder::Initialize(const map<std::string, std::string> &options) { | |||||
| return SUCCESS; | |||||
| } | |||||
| Status StubOpsKernelBuilder::CalcOpRunningParam(Node &ge_node) { | Status StubOpsKernelBuilder::CalcOpRunningParam(Node &ge_node) { | ||||
| OpDescPtr op_desc = ge_node.GetOpDesc(); | OpDescPtr op_desc = ge_node.GetOpDesc(); | ||||
| @@ -82,9 +86,9 @@ Status StubOpsKernelBuilder::CalcOpRunningParam(Node &ge_node) { | |||||
| name.c_str(), type.c_str(), i, output_mem_size, TypeUtils::FormatToSerialString(format).c_str(), | name.c_str(), type.c_str(), i, output_mem_size, TypeUtils::FormatToSerialString(format).c_str(), | ||||
| TypeUtils::DataTypeToSerialString(data_type).c_str()); | TypeUtils::DataTypeToSerialString(data_type).c_str()); | ||||
| REPORT_CALL_ERROR( | REPORT_CALL_ERROR( | ||||
| "E19999", "CalcTensorMemSize failed for op[%s:%s] out[%zu] mem size, mem_size=%ld, format=%s, data_type=%s.", | |||||
| name.c_str(), type.c_str(), i, output_mem_size, TypeUtils::FormatToSerialString(format).c_str(), | |||||
| TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
| "E19999", "CalcTensorMemSize failed for op[%s:%s] out[%zu] mem size, mem_size=%ld, format=%s, data_type=%s.", | |||||
| name.c_str(), type.c_str(), i, output_mem_size, TypeUtils::FormatToSerialString(format).c_str(), | |||||
| TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
| return FAILED; | return FAILED; | ||||
| } | } | ||||
| GELOGI("Calc op[%s:%s] out[%zu] mem size is %ld, format=%s, data_type=%s.", name.c_str(), type.c_str(), i, | GELOGI("Calc op[%s:%s] out[%zu] mem size is %ld, format=%s, data_type=%s.", name.c_str(), type.c_str(), i, | ||||
| @@ -63,7 +63,9 @@ Status StubOpsKernelInfoStore::Finalize() { | |||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| void StubOpsKernelInfoStore::GetAllOpsKernelInfo(map<string, OpInfo> &infos) const { infos = op_info_map_; } | |||||
| void StubOpsKernelInfoStore::GetAllOpsKernelInfo(map<string, OpInfo> &infos) const { | |||||
| infos = op_info_map_; | |||||
| } | |||||
| bool StubOpsKernelInfoStore::CheckSupported(const OpDescPtr &op_desc, std::string &) const { | bool StubOpsKernelInfoStore::CheckSupported(const OpDescPtr &op_desc, std::string &) const { | ||||
| if (op_desc == nullptr) { | if (op_desc == nullptr) { | ||||
| @@ -53,7 +53,9 @@ class GE_FUNC_VISIBILITY StubOpsKernelInfoStore : public OpsKernelInfoStore { | |||||
| Status Finalize() override; | Status Finalize() override; | ||||
| bool CheckSupported(const OpDescPtr &op_desc, std::string &reason) const override; | bool CheckSupported(const OpDescPtr &op_desc, std::string &reason) const override; | ||||
| void GetAllOpsKernelInfo(std::map<std::string, ge::OpInfo> &infos) const override; | void GetAllOpsKernelInfo(std::map<std::string, ge::OpInfo> &infos) const override; | ||||
| std::string GetOpsKernelStoreName() const { return store_name_; } | |||||
| std::string GetOpsKernelStoreName() const { | |||||
| return store_name_; | |||||
| } | |||||
| StubOpsKernelInfoStore(const StubOpsKernelInfoStore &ops_kernel_store) = delete; | StubOpsKernelInfoStore(const StubOpsKernelInfoStore &ops_kernel_store) = delete; | ||||
| StubOpsKernelInfoStore(const StubOpsKernelInfoStore &&ops_kernel_store) = delete; | StubOpsKernelInfoStore(const StubOpsKernelInfoStore &&ops_kernel_store) = delete; | ||||
| @@ -29,7 +29,9 @@ namespace ge { | |||||
| namespace st { | namespace st { | ||||
| class ComputeGraphBuilder { | class ComputeGraphBuilder { | ||||
| public: | public: | ||||
| explicit ComputeGraphBuilder(const std::string &name) { graph_ = std::make_shared<ComputeGraph>(name); } | |||||
| explicit ComputeGraphBuilder(const std::string &name) { | |||||
| graph_ = std::make_shared<ComputeGraph>(name); | |||||
| } | |||||
| NodePtr AddNode(const std::string &name, const std::string &type, int in_cnt, int out_cnt, | NodePtr AddNode(const std::string &name, const std::string &type, int in_cnt, int out_cnt, | ||||
| Format format = FORMAT_NCHW, DataType data_type = DT_FLOAT, | Format format = FORMAT_NCHW, DataType data_type = DT_FLOAT, | ||||
| std::vector<int64_t> shape = {1, 1, 224, 224}); | std::vector<int64_t> shape = {1, 1, 224, 224}); | ||||
| @@ -1,6 +1,2 @@ | |||||
| project(graphengine_st) | project(graphengine_st) | ||||
| include(cmake/graphengine.cmake) | |||||
| add_subdirectory(framework) | |||||
| add_subdirectory(testcase) | add_subdirectory(testcase) | ||||
| @@ -1,17 +0,0 @@ | |||||
| /** | |||||
| * Copyright 2021 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 "framework.h" | |||||
| @@ -6,7 +6,7 @@ target_include_directories(graph_engine_test | |||||
| PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} | PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} | ||||
| ) | ) | ||||
| set_target_properties(graph_engine_test PROPERTIES CXX_STANDARD 11) | |||||
| set_target_properties(graph_engine_test PROPERTIES CXX_STANDARD 17) | |||||
| target_link_libraries(graph_engine_test PRIVATE gtest gtest_main framework) | target_link_libraries(graph_engine_test PRIVATE gtest gtest_main framework) | ||||
| @@ -19,13 +19,13 @@ | |||||
| #include "external/ge/ge_api.h" | #include "external/ge/ge_api.h" | ||||
| #include "graph/debug/ge_attr_define.h" | #include "graph/debug/ge_attr_define.h" | ||||
| #include "framework/common/types.h" | #include "framework/common/types.h" | ||||
| #include "framework.h" | |||||
| #include "framework/utils/builder/graph_builder_utils.h" | |||||
| #include "builder/graph_builder_utils.h" | |||||
| #include "graph/operator_reg.h" | #include "graph/operator_reg.h" | ||||
| #include "graph/operator.h" | #include "graph/operator.h" | ||||
| #define protected public | #define protected public | ||||
| #define private public | #define private public | ||||
| #include "graph/utils/op_desc_utils.h" | #include "graph/utils/op_desc_utils.h" | ||||
| #include "ge_graph_dsl/graph_dsl.h" | |||||
| #undef protected | #undef protected | ||||
| #undef private | #undef private | ||||
| @@ -33,83 +33,83 @@ using namespace std; | |||||
| using namespace ge; | using namespace ge; | ||||
| namespace { | namespace { | ||||
| /** data a = 2; | /** data a = 2; | ||||
| * for(int i =0; i<5; ++i){ | |||||
| * a=a * 2; | |||||
| * } | |||||
| * return a; | |||||
| * ----------------------------------------------| | |||||
| * | const(5) exit const(1) | | |||||
| * | \ / \ | | |||||
| * data(i)--Enter--merge--less--loopcond--switch-----add-----nextiteration | |||||
| * \________________\___/ | |||||
| * ------\------------------------| | |||||
| * | \ const(2) | | |||||
| * | \ \ | | |||||
| * data(a)--Enter--merge--switch------mul-----nextiteration | |||||
| * \ | |||||
| * exit | |||||
| * \ | |||||
| * netoutput | |||||
| * | |||||
| **/ | |||||
| Graph BuildV1ControlFlowGraph(){ | |||||
| * for(int i =0; i<5; ++i){ | |||||
| * a=a * 2; | |||||
| * } | |||||
| * return a; | |||||
| * ----------------------------------------------| | |||||
| * | const(5) exit const(1) | | |||||
| * | \ / \ | | |||||
| * data(i)--Enter--merge--less--loopcond--switch-----add-----nextiteration | |||||
| * \________________\___/ | |||||
| * ------\------------------------| | |||||
| * | \ const(2) | | |||||
| * | \ \ | | |||||
| * data(a)--Enter--merge--switch------mul-----nextiteration | |||||
| * \ | |||||
| * exit | |||||
| * \ | |||||
| * netoutput | |||||
| * | |||||
| **/ | |||||
| Graph BuildV1ControlFlowGraph() { | |||||
| // build graph | // build graph | ||||
| st::ComputeGraphBuilder graphBuilder("g1"); | st::ComputeGraphBuilder graphBuilder("g1"); | ||||
| auto data_i = graphBuilder.AddNode("data_i",DATA,1,1); | |||||
| auto enter_i = graphBuilder.AddNode("enter_i",ENTER,1,1); | |||||
| auto data_i = graphBuilder.AddNode("data_i", DATA, 1, 1); | |||||
| auto enter_i = graphBuilder.AddNode("enter_i", ENTER, 1, 1); | |||||
| ge::AttrUtils::SetStr(enter_i->GetOpDesc(), ENTER_ATTR_FRAME_NAME, "1"); | ge::AttrUtils::SetStr(enter_i->GetOpDesc(), ENTER_ATTR_FRAME_NAME, "1"); | ||||
| auto merge_i = graphBuilder.AddNode("merge_i",MERGE,2,1); | |||||
| auto const_5 = graphBuilder.AddNode("const_5",CONSTANT,0,1); | |||||
| auto less = graphBuilder.AddNode("less",LESS,2,1); | |||||
| auto loopcond = graphBuilder.AddNode("loopcond",LOOPCOND,1,1,FORMAT_NCHW,DT_BOOL); | |||||
| auto switch_i = graphBuilder.AddNode("switch_i",SWITCH,2,2); | |||||
| auto exit_i = graphBuilder.AddNode("switch_i",EXIT,1,1); | |||||
| auto const_1 = graphBuilder.AddNode("const_1",CONSTANT,0,1); | |||||
| auto add = graphBuilder.AddNode("add",ADD,2,1); | |||||
| auto next_iteration_i = graphBuilder.AddNode("next_iteration_i",NEXTITERATION,1,1); | |||||
| auto merge_i = graphBuilder.AddNode("merge_i", MERGE, 2, 1); | |||||
| auto const_5 = graphBuilder.AddNode("const_5", CONSTANT, 0, 1); | |||||
| auto less = graphBuilder.AddNode("less", LESS, 2, 1); | |||||
| auto loopcond = graphBuilder.AddNode("loopcond", LOOPCOND, 1, 1, FORMAT_NCHW, DT_BOOL); | |||||
| auto switch_i = graphBuilder.AddNode("switch_i", SWITCH, 2, 2); | |||||
| auto exit_i = graphBuilder.AddNode("switch_i", EXIT, 1, 1); | |||||
| auto const_1 = graphBuilder.AddNode("const_1", CONSTANT, 0, 1); | |||||
| auto add = graphBuilder.AddNode("add", ADD, 2, 1); | |||||
| auto next_iteration_i = graphBuilder.AddNode("next_iteration_i", NEXTITERATION, 1, 1); | |||||
| auto data_a = graphBuilder.AddNode("data_a",DATA,1,1); | |||||
| auto enter_a = graphBuilder.AddNode("enter_a",ENTER,1,1); | |||||
| auto data_a = graphBuilder.AddNode("data_a", DATA, 1, 1); | |||||
| auto enter_a = graphBuilder.AddNode("enter_a", ENTER, 1, 1); | |||||
| ge::AttrUtils::SetStr(enter_a->GetOpDesc(), ENTER_ATTR_FRAME_NAME, "1"); | ge::AttrUtils::SetStr(enter_a->GetOpDesc(), ENTER_ATTR_FRAME_NAME, "1"); | ||||
| auto merge_a = graphBuilder.AddNode("merge_a",MERGE,2,1); | |||||
| auto switch_a = graphBuilder.AddNode("switch_a",SWITCH,2,2); | |||||
| auto exit_a = graphBuilder.AddNode("exit_a",EXIT,1,1); | |||||
| auto mul = graphBuilder.AddNode("mul",MUL,2,1); | |||||
| auto const_2 = graphBuilder.AddNode("const_2",CONSTANT,0,1); | |||||
| auto next_iteration_a = graphBuilder.AddNode("next_iteration_a",NEXTITERATION,1,1); | |||||
| auto netoutput = graphBuilder.AddNode("netoutput",NETOUTPUT,2,2); | |||||
| auto merge_a = graphBuilder.AddNode("merge_a", MERGE, 2, 1); | |||||
| auto switch_a = graphBuilder.AddNode("switch_a", SWITCH, 2, 2); | |||||
| auto exit_a = graphBuilder.AddNode("exit_a", EXIT, 1, 1); | |||||
| auto mul = graphBuilder.AddNode("mul", MUL, 2, 1); | |||||
| auto const_2 = graphBuilder.AddNode("const_2", CONSTANT, 0, 1); | |||||
| auto next_iteration_a = graphBuilder.AddNode("next_iteration_a", NEXTITERATION, 1, 1); | |||||
| auto netoutput = graphBuilder.AddNode("netoutput", NETOUTPUT, 2, 2); | |||||
| // i = i+1 | // i = i+1 | ||||
| graphBuilder.AddDataEdge(data_i, 0, enter_i,0); | |||||
| graphBuilder.AddDataEdge(enter_i, 0, merge_i,0); | |||||
| graphBuilder.AddDataEdge(next_iteration_i, 0, merge_i,1); | |||||
| graphBuilder.AddDataEdge(merge_i, 0, less,0); | |||||
| graphBuilder.AddDataEdge(const_5, 0, less,1); | |||||
| graphBuilder.AddDataEdge(less, 0, loopcond,0); | |||||
| graphBuilder.AddDataEdge(loopcond, 0, switch_i,1); | |||||
| graphBuilder.AddDataEdge(merge_i, 0, switch_i,0); | |||||
| graphBuilder.AddDataEdge(switch_i, 0, exit_i,0); | |||||
| graphBuilder.AddDataEdge(switch_i, 1, add,0); | |||||
| graphBuilder.AddDataEdge(const_1, 0, add,1); | |||||
| graphBuilder.AddDataEdge(add, 0, next_iteration_i,0); | |||||
| graphBuilder.AddDataEdge(exit_i, 0, netoutput,1); | |||||
| graphBuilder.AddDataEdge(data_i, 0, enter_i, 0); | |||||
| graphBuilder.AddDataEdge(enter_i, 0, merge_i, 0); | |||||
| graphBuilder.AddDataEdge(next_iteration_i, 0, merge_i, 1); | |||||
| graphBuilder.AddDataEdge(merge_i, 0, less, 0); | |||||
| graphBuilder.AddDataEdge(const_5, 0, less, 1); | |||||
| graphBuilder.AddDataEdge(less, 0, loopcond, 0); | |||||
| graphBuilder.AddDataEdge(loopcond, 0, switch_i, 1); | |||||
| graphBuilder.AddDataEdge(merge_i, 0, switch_i, 0); | |||||
| graphBuilder.AddDataEdge(switch_i, 0, exit_i, 0); | |||||
| graphBuilder.AddDataEdge(switch_i, 1, add, 0); | |||||
| graphBuilder.AddDataEdge(const_1, 0, add, 1); | |||||
| graphBuilder.AddDataEdge(add, 0, next_iteration_i, 0); | |||||
| graphBuilder.AddDataEdge(exit_i, 0, netoutput, 1); | |||||
| // a=a*2 | // a=a*2 | ||||
| graphBuilder.AddDataEdge(data_a, 0, enter_a,0); | |||||
| graphBuilder.AddDataEdge(enter_a, 0, merge_a,0); | |||||
| graphBuilder.AddDataEdge(next_iteration_a, 0, merge_a,1); | |||||
| graphBuilder.AddDataEdge(loopcond, 0, switch_a,1); | |||||
| graphBuilder.AddDataEdge(merge_a, 0, switch_a,0); | |||||
| graphBuilder.AddDataEdge(switch_a, 0, exit_a,0); | |||||
| graphBuilder.AddDataEdge(switch_a, 1, mul,0); | |||||
| graphBuilder.AddDataEdge(const_2, 0, mul,1); | |||||
| graphBuilder.AddDataEdge(mul, 0, next_iteration_a,0); | |||||
| graphBuilder.AddDataEdge(exit_a, 0, netoutput,0); | |||||
| graphBuilder.AddDataEdge(data_a, 0, enter_a, 0); | |||||
| graphBuilder.AddDataEdge(enter_a, 0, merge_a, 0); | |||||
| graphBuilder.AddDataEdge(next_iteration_a, 0, merge_a, 1); | |||||
| graphBuilder.AddDataEdge(loopcond, 0, switch_a, 1); | |||||
| graphBuilder.AddDataEdge(merge_a, 0, switch_a, 0); | |||||
| graphBuilder.AddDataEdge(switch_a, 0, exit_a, 0); | |||||
| graphBuilder.AddDataEdge(switch_a, 1, mul, 0); | |||||
| graphBuilder.AddDataEdge(const_2, 0, mul, 1); | |||||
| graphBuilder.AddDataEdge(mul, 0, next_iteration_a, 0); | |||||
| graphBuilder.AddDataEdge(exit_a, 0, netoutput, 0); | |||||
| // set const weight | // set const weight | ||||
| int64_t dims_size = 1; | int64_t dims_size = 1; | ||||
| vector<int64_t> data_vec = {5}; | vector<int64_t> data_vec = {5}; | ||||
| for_each(data_vec.begin(), data_vec.end(), [&](int64_t &data) { dims_size *= data; }); | for_each(data_vec.begin(), data_vec.end(), [&](int64_t &data) { dims_size *= data; }); | ||||
| vector<int32_t> data_value_vec(dims_size, 1); | vector<int32_t> data_value_vec(dims_size, 1); | ||||
| GeTensorDesc data_tensor_desc(GeShape(data_vec), FORMAT_NCHW, DT_INT32); | GeTensorDesc data_tensor_desc(GeShape(data_vec), FORMAT_NCHW, DT_INT32); | ||||
| GeTensorPtr data_tensor = make_shared<GeTensor>(data_tensor_desc, (uint8_t *)data_value_vec.data(), | |||||
| GeTensorPtr data_tensor = make_shared<GeTensor>(data_tensor_desc, (uint8_t *) data_value_vec.data(), | |||||
| data_value_vec.size() * sizeof(int32_t)); | data_value_vec.size() * sizeof(int32_t)); | ||||
| OpDescUtils::SetWeights(const_5->GetOpDesc(), data_tensor); | OpDescUtils::SetWeights(const_5->GetOpDesc(), data_tensor); | ||||
| OpDescUtils::SetWeights(const_2->GetOpDesc(), data_tensor); | OpDescUtils::SetWeights(const_2->GetOpDesc(), data_tensor); | ||||
| @@ -117,7 +117,7 @@ Graph BuildV1ControlFlowGraph(){ | |||||
| return graphBuilder.GetGraph(); | return graphBuilder.GetGraph(); | ||||
| } | } | ||||
| } | |||||
| } // namespace | |||||
| class FrameworkTest : public testing::Test { | class FrameworkTest : public testing::Test { | ||||
| protected: | protected: | ||||
| void SetUp() { | void SetUp() { | ||||
| @@ -126,23 +126,19 @@ class FrameworkTest : public testing::Test { | |||||
| auto ret = ge::GEInitialize(options); | auto ret = ge::GEInitialize(options); | ||||
| EXPECT_EQ(ret, SUCCESS); | EXPECT_EQ(ret, SUCCESS); | ||||
| } | } | ||||
| void TearDown() { | |||||
| } | |||||
| void TearDown() {} | |||||
| }; | }; | ||||
| /// data data | /// data data | ||||
| /// \ / | /// \ / | ||||
| /// add | /// add | ||||
| TEST_F(FrameworkTest, test_framework_add) { | TEST_F(FrameworkTest, test_framework_add) { | ||||
| // build graph | |||||
| st::ComputeGraphBuilder graphBuilder("g1"); | |||||
| auto data1 = graphBuilder.AddNode("data1",DATA,1,1); | |||||
| auto data2 = graphBuilder.AddNode("data2",DATA,1,1); | |||||
| auto add = graphBuilder.AddNode("add",ADD,2,1); | |||||
| graphBuilder.AddDataEdge(data1, 0, add,0); | |||||
| graphBuilder.AddDataEdge(data2, 0, add,1); | |||||
| Graph graph = graphBuilder.GetGraph(); | |||||
| DEF_GRAPH(g1) { | |||||
| CHAIN(NODE("data1", DATA)->NODE("add", ADD)); | |||||
| CHAIN(NODE("data2", DATA)->NODE("add")); | |||||
| }); | |||||
| auto graph = ToGeGraph(g1); | |||||
| // new session & add graph | // new session & add graph | ||||
| map<AscendString, AscendString> options; | map<AscendString, AscendString> options; | ||||
| Session session(options); | Session session(options); | ||||
| @@ -174,7 +170,7 @@ TEST_F(FrameworkTest, test_framework_add) { | |||||
| * \ | * \ | ||||
| * netoutput | * netoutput | ||||
| * | * | ||||
| **/ | |||||
| **/ | |||||
| TEST_F(FrameworkTest, test_framework_v1_control_flow) { | TEST_F(FrameworkTest, test_framework_v1_control_flow) { | ||||
| // build graph | // build graph | ||||
| Graph graph = BuildV1ControlFlowGraph(); | Graph graph = BuildV1ControlFlowGraph(); | ||||