Skip to content

Commit 97f9eb1

Browse files
committed
annotate dependency types in basic graph
1 parent 43aec94 commit 97f9eb1

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

include/reactor-cpp/dependency_graph.hh

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,30 @@
77
#include <boost/graph/breadth_first_search.hpp>
88
#include <boost/graph/directed_graph.hpp>
99
#include <boost/graph/graph_selectors.hpp>
10+
#include <boost/graph/properties.hpp>
1011
#include <boost/pending/property.hpp>
1112
#include <vector>
1213

1314
namespace reactor {
1415

1516
class GroupedDependencyGraph;
1617

18+
enum class DependencyType { Undefined, Priority, Trigger, Effect };
19+
1720
class ReactionDependencyGraph {
1821
private:
1922
struct reaction_info_t {
2023
using kind = boost::vertex_property_tag;
2124
};
25+
struct dependency_info_t {
26+
using kind = boost::edge_property_tag;
27+
};
2228
using ReactionProperty = boost::property<reaction_info_t, const Reaction*>;
23-
using ReactionGraph = boost::directed_graph<ReactionProperty>;
29+
using DependencyProperty = boost::property<dependency_info_t, DependencyType>;
30+
using ReactionGraph = boost::directed_graph<ReactionProperty, DependencyProperty>;
2431
using ReactionToVertexMap = std::map<const Reaction*, ReactionGraph::vertex_descriptor>;
2532
using ReactionPropertyMap = boost::property_map<ReactionGraph, reaction_info_t>::type;
33+
using DependencyPropertyMap = boost::property_map<ReactionGraph, dependency_info_t>::type;
2634

2735
ReactionGraph graph{};
2836
ReactionToVertexMap vertex_map{};
@@ -33,6 +41,9 @@ private:
3341
void populate_graph_with_dependency_edges(const Reactor* reactor);
3442

3543
[[nodiscard]] auto get_reaction_property_map() -> ReactionPropertyMap { return boost::get(reaction_info_t{}, graph); }
44+
[[nodiscard]] auto get_dependency_property_map() -> DependencyPropertyMap {
45+
return boost::get(dependency_info_t{}, graph);
46+
}
3647

3748
ReactionDependencyGraph() = default;
3849

lib/dependency_graph.cc

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ void ReactionDependencyGraph::populate_graph_with_priority_edges(const Reactor*
4545
auto iterator = reactions.begin();
4646
auto next = std::next(iterator);
4747
while (next != reactions.end()) {
48-
graph.add_edge(vertex_map.at(*iterator), vertex_map.at(*next));
48+
auto edge = graph.add_edge(vertex_map.at(*iterator), vertex_map.at(*next)).first;
49+
put(get_dependency_property_map(), edge, DependencyType::Priority);
4950
iterator = next;
5051
next = std::next(iterator);
5152
}
@@ -64,7 +65,12 @@ void ReactionDependencyGraph::populate_graph_with_dependency_edges(const Reactor
6465
source = source->inward_binding();
6566
}
6667
for (auto* antidependency : source->antidependencies()) {
67-
graph.add_edge(vertex_map.at(antidependency), vertex_map.at(reaction));
68+
auto edge = graph.add_edge(vertex_map.at(antidependency), vertex_map.at(reaction)).first;
69+
if (reaction->port_triggers().count(dependency) == 0) {
70+
put(get_dependency_property_map(), edge, DependencyType::Effect);
71+
} else {
72+
put(get_dependency_property_map(), edge, DependencyType::Trigger);
73+
}
6874
}
6975
}
7076
}
@@ -114,6 +120,7 @@ auto ReactionDependencyGraph::transitive_reduction() -> ReactionDependencyGraph
114120

115121
void ReactionDependencyGraph::export_graphviz(const std::string& file_name) {
116122
auto reaction_proprty_map = get_reaction_property_map();
123+
auto dependency_proprty_map = get_dependency_property_map();
117124
dynamic_properties dp;
118125
dp.property("node_id", get(boost::vertex_index, graph));
119126
dp.property("label", make_function_property_map<ReactionGraph::vertex_descriptor, std::string>(
@@ -136,6 +143,21 @@ void ReactionDependencyGraph::export_graphviz(const std::string& file_name) {
136143
return ss.str();
137144
}));
138145
dp.property("style", make_constant_property<ReactionGraph::vertex_descriptor, std::string>("filled"));
146+
dp.property("style", make_function_property_map<ReactionGraph::edge_descriptor, std::string>(
147+
[&dependency_proprty_map](ReactionGraph::edge_descriptor edge) {
148+
auto dependency_type = boost::get(dependency_proprty_map, edge);
149+
switch (dependency_type) {
150+
case DependencyType::Undefined:
151+
return "solid";
152+
case DependencyType::Priority:
153+
return "dotted";
154+
case DependencyType::Effect:
155+
return "dashed";
156+
case DependencyType::Trigger:
157+
return "bold";
158+
}
159+
return "invis";
160+
}));
139161

140162
std::ofstream dot_file(file_name);
141163
write_graphviz_dp(dot_file, graph, dp);
@@ -150,7 +172,11 @@ GroupedDependencyGraph::GroupedDependencyGraph(ReactionDependencyGraph& reaction
150172
group.push_back(boost::get(reactionGraph.get_reaction_property_map(), in));
151173
boost::put(get_group_property_map(), out, group);
152174
vertex_map[group[0]] = out;
153-
}));
175+
})
176+
.edge_copy([]([[maybe_unused]] ReactionDependencyGraph::ReactionGraph::edge_descriptor in,
177+
[[maybe_unused]] GroupGraph::edge_descriptor out) {
178+
// do nothing; simply drop the edge descriptors
179+
}));
154180
}
155181

156182
void GroupedDependencyGraph::export_graphviz(const std::string& file_name) {

0 commit comments

Comments
 (0)