• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

daisytuner / sdfglib / 16371864526

18 Jul 2025 01:32PM UTC coverage: 65.106% (+0.1%) from 65.002%
16371864526

push

github

web-flow
Merge pull request #152 from daisytuner/verify

adds validate method to all elements

87 of 97 new or added lines in 24 files covered. (89.69%)

10 existing lines in 7 files now uncovered.

8790 of 13501 relevant lines covered (65.11%)

176.82 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

37.8
/src/data_flow/data_flow_graph.cpp
1
#include "sdfg/data_flow/data_flow_graph.h"
2

3
namespace sdfg {
4
namespace data_flow {
5

6
void DataFlowGraph::validate() const {
627✔
7
    for (auto& node : this->nodes_) {
1,423✔
8
        node.second->validate();
796✔
9
    }
10
    for (auto& edge : this->edges_) {
1,115✔
11
        edge.second->validate();
488✔
12
    }
13
};
627✔
14

UNCOV
15
const Element* DataFlowGraph::get_parent() const { return this->parent_; };
×
16

17
Element* DataFlowGraph::get_parent() { return this->parent_; };
276✔
18

19
size_t DataFlowGraph::in_degree(const data_flow::DataFlowNode& node) const {
502✔
20
    return boost::in_degree(node.vertex(), this->graph_);
502✔
21
};
22

23
size_t DataFlowGraph::out_degree(const data_flow::DataFlowNode& node) const {
492✔
24
    return boost::out_degree(node.vertex(), this->graph_);
492✔
25
};
26

27
void DataFlowGraph::replace(const symbolic::Expression& old_expression, const symbolic::Expression& new_expression) {
2✔
28
    for (auto& node : this->nodes_) {
10✔
29
        node.second->replace(old_expression, new_expression);
8✔
30
    }
31

32
    for (auto& edge : this->edges_) {
8✔
33
        edge.second->replace(old_expression, new_expression);
6✔
34
    }
35
};
2✔
36

37
/***** Section: Analysis *****/
38

39
std::unordered_set<const data_flow::Tasklet*> DataFlowGraph::tasklets() const {
25✔
40
    std::unordered_set<const data_flow::Tasklet*> ts;
25✔
41
    for (auto& node : this->nodes_) {
97✔
42
        if (auto tasklet = dynamic_cast<const data_flow::Tasklet*>(node.second.get())) {
72✔
43
            ts.insert(tasklet);
25✔
44
        }
25✔
45
    }
46

47
    return ts;
25✔
48
};
25✔
49

50
std::unordered_set<const data_flow::AccessNode*> DataFlowGraph::data_nodes() const {
×
51
    std::unordered_set<const data_flow::AccessNode*> dnodes;
×
52
    for (auto& node : this->nodes_) {
×
53
        if (auto access_node = dynamic_cast<const data_flow::AccessNode*>(node.second.get())) {
×
54
            dnodes.insert(access_node);
×
55
        }
×
56
    }
57

58
    return dnodes;
×
59
};
×
60

61
std::unordered_set<data_flow::AccessNode*> DataFlowGraph::data_nodes() {
2✔
62
    std::unordered_set<data_flow::AccessNode*> dnodes;
2✔
63
    for (auto& node : this->nodes_) {
10✔
64
        if (auto access_node = dynamic_cast<data_flow::AccessNode*>(node.second.get())) {
8✔
65
            dnodes.insert(access_node);
6✔
66
        }
6✔
67
    }
68

69
    return dnodes;
2✔
70
};
2✔
71

72
std::unordered_set<const data_flow::AccessNode*> DataFlowGraph::reads() const {
×
73
    std::unordered_set<const data_flow::AccessNode*> rs;
×
74
    for (auto& node : this->nodes_) {
×
75
        if (auto access_node = dynamic_cast<const data_flow::AccessNode*>(node.second.get())) {
×
76
            if (this->out_degree(*access_node) > 0) {
×
77
                rs.insert(access_node);
×
78
            }
×
79
        }
×
80
    }
81

82
    return rs;
×
83
};
×
84

85
std::unordered_set<const data_flow::AccessNode*> DataFlowGraph::writes() const {
×
86
    std::unordered_set<const data_flow::AccessNode*> ws;
×
87
    for (auto& node : this->nodes_) {
×
88
        if (auto access_node = dynamic_cast<const data_flow::AccessNode*>(node.second.get())) {
×
89
            if (this->in_degree(*access_node) > 0) {
×
90
                ws.insert(access_node);
×
91
            }
×
92
        }
×
93
    }
94

95
    return ws;
×
96
};
×
97

98
std::unordered_set<const data_flow::DataFlowNode*> DataFlowGraph::sources() const {
×
99
    std::unordered_set<const data_flow::DataFlowNode*> ss;
×
100
    for (auto& node : this->nodes_) {
×
101
        if (this->in_degree(*node.second) == 0) {
×
102
            ss.insert(node.second.get());
×
103
        }
×
104
    }
105

106
    return ss;
×
107
};
×
108

109
std::unordered_set<data_flow::DataFlowNode*> DataFlowGraph::sources() {
×
110
    std::unordered_set<data_flow::DataFlowNode*> ss;
×
111
    for (auto& node : this->nodes_) {
×
112
        if (this->in_degree(*node.second) == 0) {
×
113
            ss.insert(node.second.get());
×
114
        }
×
115
    }
116

117
    return ss;
×
118
};
×
119

120
std::unordered_set<const data_flow::DataFlowNode*> DataFlowGraph::sinks() const {
×
121
    std::unordered_set<const data_flow::DataFlowNode*> ss;
×
122
    for (auto& node : this->nodes_) {
×
123
        if (this->out_degree(*node.second) == 0) {
×
124
            ss.insert(node.second.get());
×
125
        }
×
126
    }
127

128
    return ss;
×
129
};
×
130

131
std::unordered_set<data_flow::DataFlowNode*> DataFlowGraph::sinks() {
×
132
    std::unordered_set<data_flow::DataFlowNode*> ss;
×
133
    for (auto& node : this->nodes_) {
×
134
        if (this->out_degree(*node.second) == 0) {
×
135
            ss.insert(node.second.get());
×
136
        }
×
137
    }
138

139
    return ss;
×
140
};
×
141

142
std::unordered_set<const data_flow::DataFlowNode*> DataFlowGraph::predecessors(const data_flow::DataFlowNode& node
×
143
) const {
144
    std::unordered_set<const data_flow::DataFlowNode*> ss;
×
145
    for (auto& edge : this->in_edges(node)) {
×
146
        ss.insert(&edge.src());
×
147
    }
148

149
    return ss;
×
150
};
×
151

152
std::unordered_set<const data_flow::DataFlowNode*> DataFlowGraph::successors(const data_flow::DataFlowNode& node
×
153
) const {
154
    std::unordered_set<const data_flow::DataFlowNode*> ss;
×
155
    for (auto& edge : this->out_edges(node)) {
×
156
        ss.insert(&edge.dst());
×
157
    }
158

159
    return ss;
×
160
};
×
161

162
std::list<const data_flow::DataFlowNode*> DataFlowGraph::topological_sort() const {
182✔
163
    std::list<graph::Vertex> order = graph::topological_sort(this->graph_);
182✔
164

165
    std::list<const data_flow::DataFlowNode*> topo_nodes;
182✔
166
    for (auto& vertex : order) {
569✔
167
        topo_nodes.push_back(this->nodes_.at(vertex).get());
387✔
168
    }
169

170
    return topo_nodes;
182✔
171
};
182✔
172

173
std::list<data_flow::DataFlowNode*> DataFlowGraph::topological_sort() {
413✔
174
    std::list<graph::Vertex> order = graph::topological_sort(this->graph_);
413✔
175

176
    std::list<data_flow::DataFlowNode*> topo_nodes;
413✔
177
    for (auto& vertex : order) {
1,151✔
178
        topo_nodes.push_back(this->nodes_.at(vertex).get());
738✔
179
    }
180

181
    return topo_nodes;
413✔
182
};
413✔
183

184
std::unordered_map<std::string, const data_flow::AccessNode*> DataFlowGraph::dominators() const {
×
185
    std::unordered_map<std::string, const data_flow::AccessNode*> frontier;
×
186
    for (auto& node : this->topological_sort()) {
×
187
        if (auto access_node = dynamic_cast<const data_flow::AccessNode*>(node)) {
×
188
            if (frontier.find(access_node->data()) == frontier.end()) {
×
189
                frontier[access_node->data()] = access_node;
×
190
            }
×
191
        }
×
192
    }
193

194
    return frontier;
×
195
};
×
196

197
std::unordered_map<std::string, const data_flow::AccessNode*> DataFlowGraph::post_dominators() const {
×
198
    std::unordered_map<std::string, const data_flow::AccessNode*> frontier;
×
199
    for (auto& node : this->topological_sort()) {
×
200
        if (auto access_node = dynamic_cast<const data_flow::AccessNode*>(node)) {
×
201
            frontier[access_node->data()] = access_node;
×
202
        }
×
203
    }
204

205
    return frontier;
×
206
};
×
207

208
std::unordered_map<std::string, data_flow::AccessNode*> DataFlowGraph::post_dominators() {
6✔
209
    std::unordered_map<std::string, data_flow::AccessNode*> frontier;
6✔
210
    for (auto& node : this->topological_sort()) {
24✔
211
        if (auto access_node = dynamic_cast<data_flow::AccessNode*>(node)) {
18✔
212
            frontier[access_node->data()] = access_node;
12✔
213
        }
12✔
214
    }
215

216
    return frontier;
6✔
217
};
6✔
218

219
auto DataFlowGraph::all_simple_paths(const data_flow::DataFlowNode& src, const data_flow::DataFlowNode& dst) const {
×
220
    std::list<std::list<graph::Edge>> all_paths_raw = graph::all_simple_paths(this->graph_, src.vertex(), dst.vertex());
×
221

222
    std::list<std::list<std::reference_wrapper<data_flow::Memlet>>> all_paths;
×
223
    for (auto& path_raw : all_paths_raw) {
×
224
        std::list<std::reference_wrapper<data_flow::Memlet>> path;
×
225
        for (auto& edge : path_raw) {
×
226
            path.push_back(*this->edges_.at(edge));
×
227
        }
228
        all_paths.push_back(path);
×
229
    }
×
230

231
    return all_paths;
×
232
};
×
233

234
const std::pair<size_t, const std::unordered_map<const data_flow::DataFlowNode*, size_t>> DataFlowGraph::
235
    weakly_connected_components() const {
2✔
236
    auto ccs_vertex = graph::weakly_connected_components(this->graph_);
2✔
237

238
    std::unordered_map<const data_flow::DataFlowNode*, size_t> ccs;
2✔
239
    for (auto& entry : ccs_vertex.second) {
13✔
240
        ccs[this->nodes_.at(entry.first).get()] = entry.second;
11✔
241
    }
242

243
    return {ccs_vertex.first, ccs};
2✔
244
};
2✔
245

246
} // namespace data_flow
247
} // namespace sdfg
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc