@@ -174,12 +174,12 @@ build_graphengine() | |||
elif [ "x${PLATFORM}" = "xinference" ] | |||
then | |||
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" ] | |||
then | |||
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" ] | |||
then | |||
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/ge_config | |||
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}/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 | |||
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 | |||
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 | |||
echo "!!! ST FAILED, PLEASE CHECK YOUR CHANGES !!!" | |||
echo -e "\033[31m${RUN_TEST_CASE}\033[0m" | |||
@@ -28,5 +28,6 @@ if (ENABLE_GE_COV OR ENABLE_GE_UT) | |||
endif() | |||
if (ENABLE_GE_ST) | |||
add_subdirectory(framework) | |||
add_subdirectory(st) | |||
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 | |||
* | |||
* 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 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 "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++") | |||
#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 | |||
PUBLIC | |||
${INCLUDE_DIRECTORIES} | |||
${GE_CODE_DIR}/tests/st/framework | |||
${CMAKE_CURRENT_SOURCE_DIR} | |||
${CMAKE_CURRENT_SOURCE_DIR}/stub_engine | |||
) | |||
target_compile_definitions(fe PRIVATE | |||
@@ -62,16 +56,3 @@ target_link_libraries(fe PUBLIC | |||
) | |||
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 | |||
} | |||
Status StubEngine::Finalize() { return SUCCESS; } | |||
Status StubEngine::Finalize() { | |||
return SUCCESS; | |||
} | |||
} // namespace st | |||
} // namespace ge | |||
@@ -67,4 +69,6 @@ void GetGraphOptimizerObjs(std::map<std::string, GraphOptimizerPtr> &graph_optim | |||
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 kRTSLibName = "RTSLib"; | |||
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 ge | |||
#endif // GRAPHENGINE_ST_TYPES_H |
@@ -19,7 +19,6 @@ | |||
#include "framework/common/util.h" | |||
#include "stub_engine/ops_kernel_store/op/stub_op_factory.h" | |||
namespace ge { | |||
namespace st { | |||
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); | |||
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 { | |||
auto iter = all_store_ops_.find(lib_name); | |||
if(iter == all_store_ops_.end()){ | |||
if (iter == all_store_ops_.end()) { | |||
return all_ops_; | |||
} | |||
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 &operator=(const OpFactory &) = delete; | |||
@@ -94,10 +98,10 @@ class GE_FUNC_VISIBILITY OpRegistrar { | |||
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) | |||
} // namespace st | |||
} // namespace ge |
@@ -36,8 +36,12 @@ REGISTER_OPS_KERNEL_BUILDER(kAicpuAscendLibName, StubOpsKernelBuilder); | |||
REGISTER_OPS_KERNEL_BUILDER(kHcclLibName, 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) { | |||
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(), | |||
TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||
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; | |||
} | |||
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; | |||
} | |||
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 { | |||
if (op_desc == nullptr) { |
@@ -53,7 +53,9 @@ class GE_FUNC_VISIBILITY StubOpsKernelInfoStore : public OpsKernelInfoStore { | |||
Status Finalize() override; | |||
bool CheckSupported(const OpDescPtr &op_desc, std::string &reason) 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; |
@@ -29,7 +29,9 @@ namespace ge { | |||
namespace st { | |||
class ComputeGraphBuilder { | |||
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, | |||
Format format = FORMAT_NCHW, DataType data_type = DT_FLOAT, | |||
std::vector<int64_t> shape = {1, 1, 224, 224}); |
@@ -1,6 +1,2 @@ | |||
project(graphengine_st) | |||
include(cmake/graphengine.cmake) | |||
add_subdirectory(framework) | |||
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} | |||
) | |||
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) | |||
@@ -19,13 +19,13 @@ | |||
#include "external/ge/ge_api.h" | |||
#include "graph/debug/ge_attr_define.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.h" | |||
#define protected public | |||
#define private public | |||
#include "graph/utils/op_desc_utils.h" | |||
#include "ge_graph_dsl/graph_dsl.h" | |||
#undef protected | |||
#undef private | |||
@@ -33,83 +33,83 @@ using namespace std; | |||
using namespace ge; | |||
namespace { | |||
/** 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 | |||
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"); | |||
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"); | |||
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 | |||
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 | |||
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 | |||
int64_t dims_size = 1; | |||
vector<int64_t> data_vec = {5}; | |||
for_each(data_vec.begin(), data_vec.end(), [&](int64_t &data) { dims_size *= data; }); | |||
vector<int32_t> data_value_vec(dims_size, 1); | |||
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)); | |||
OpDescUtils::SetWeights(const_5->GetOpDesc(), data_tensor); | |||
OpDescUtils::SetWeights(const_2->GetOpDesc(), data_tensor); | |||
@@ -117,7 +117,7 @@ Graph BuildV1ControlFlowGraph(){ | |||
return graphBuilder.GetGraph(); | |||
} | |||
} | |||
} // namespace | |||
class FrameworkTest : public testing::Test { | |||
protected: | |||
void SetUp() { | |||
@@ -126,23 +126,19 @@ class FrameworkTest : public testing::Test { | |||
auto ret = ge::GEInitialize(options); | |||
EXPECT_EQ(ret, SUCCESS); | |||
} | |||
void TearDown() { | |||
} | |||
void TearDown() {} | |||
}; | |||
/// data data | |||
/// \ / | |||
/// 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 | |||
map<AscendString, AscendString> options; | |||
Session session(options); | |||
@@ -174,7 +170,7 @@ TEST_F(FrameworkTest, test_framework_add) { | |||
* \ | |||
* netoutput | |||
* | |||
**/ | |||
**/ | |||
TEST_F(FrameworkTest, test_framework_v1_control_flow) { | |||
// build graph | |||
Graph graph = BuildV1ControlFlowGraph(); | |||