Skip to content

Commit b1fce5a

Browse files
authored
Merge pull request #131 from stdgraph/bfs
Additional std:: types and functions to graph_using.hpp
2 parents 2ae7e97 + a556d38 commit b1fce5a

16 files changed

+155
-149
lines changed

include/graph/algorithm/bellman_ford_shortest_paths.hpp

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,12 @@ class bellman_visitor_base {
3737

3838
// Visitor Functions
3939
public:
40-
// vertex visitor functions
41-
//constexpr void on_initialize_vertex(vertex_desc_type&& vdesc) {}
42-
//constexpr void on_discover_vertex(vertex_desc_type&& vdesc) {}
43-
//constexpr void on_examine_vertex(vertex_desc_type&& vdesc) {}
44-
//constexpr void on_finish_vertex(vertex_desc_type&& vdesc) {}
45-
4640
// edge visitor functions
47-
constexpr void on_examine_edge(sourced_edge_desc_type&& edesc) {}
48-
constexpr void on_edge_relaxed(sourced_edge_desc_type&& edesc) {}
49-
constexpr void on_edge_not_relaxed(sourced_edge_desc_type&& edesc) {}
50-
constexpr void on_edge_minimized(sourced_edge_desc_type&& edesc) {}
51-
constexpr void on_edge_not_minimized(sourced_edge_desc_type&& edesc) {}
41+
constexpr void on_examine_edge(const sourced_edge_desc_type& edesc) {}
42+
constexpr void on_edge_relaxed(const sourced_edge_desc_type& edesc) {}
43+
constexpr void on_edge_not_relaxed(const sourced_edge_desc_type& edesc) {}
44+
constexpr void on_edge_minimized(const sourced_edge_desc_type& edesc) {}
45+
constexpr void on_edge_not_minimized(const sourced_edge_desc_type& edesc) {}
5246
};
5347

5448
template <class G, class Visitor>
@@ -86,10 +80,10 @@ concept bellman_visitor = //is_arithmetic<typename Visitor::distance_type> &&
8680
*/
8781
template <index_adjacency_list G, forward_range Predecessors, class OutputIterator>
8882
requires output_iterator<OutputIterator, vertex_id_t<G>>
89-
void find_negative_cycle(G& g,
90-
const Predecessors& predecessor,
91-
const std::optional<vertex_id_t<G>>& cycle_vertex_id,
92-
OutputIterator out_cycle) {
83+
void find_negative_cycle(G& g,
84+
const Predecessors& predecessor,
85+
const optional<vertex_id_t<G>>& cycle_vertex_id,
86+
OutputIterator out_cycle) {
9387
// Does a negative weight cycle exist?
9488
if (cycle_vertex_id.has_value()) {
9589
vertex_id_t<G> uid = cycle_vertex_id.value();
@@ -137,7 +131,7 @@ template <index_adjacency_list G,
137131
input_range Sources,
138132
random_access_range Distances,
139133
random_access_range Predecessors,
140-
class WF = std::function<range_value_t<Distances>(edge_reference_t<G>)>,
134+
class WF = function<range_value_t<Distances>(edge_reference_t<G>)>,
141135
class Visitor = bellman_visitor_base<G>,
142136
class Compare = less<range_value_t<Distances>>,
143137
class Combine = plus<range_value_t<Distances>>>
@@ -148,7 +142,7 @@ requires convertible_to<range_value_t<Sources>, vertex_id_t<G>> && //
148142
sized_range<Predecessors> && //
149143
basic_edge_weight_function<G, WF, range_value_t<Distances>, Compare, Combine>
150144
// && bellman_visitor<G, Visitor>
151-
[[nodiscard]] std::optional<vertex_id_t<G>> bellman_ford_shortest_paths(
145+
[[nodiscard]] optional<vertex_id_t<G>> bellman_ford_shortest_paths(
152146
G& g,
153147
const Sources& sources,
154148
Distances& distances,
@@ -160,7 +154,7 @@ requires convertible_to<range_value_t<Sources>, vertex_id_t<G>> && //
160154
using id_type = vertex_id_t<G>;
161155
using DistanceValue = range_value_t<Distances>;
162156
using weight_type = invoke_result_t<WF, edge_reference_t<G>>;
163-
using return_type = std::optional<vertex_id_t<G>>;
157+
using return_type = optional<vertex_id_t<G>>;
164158

165159
// relxing the target is the function of reducing the distance from the source to the target
166160
auto relax_target = [&g, &predecessor, &distances, &compare, &combine] //
@@ -240,7 +234,7 @@ requires convertible_to<range_value_t<Sources>, vertex_id_t<G>> && //
240234
template <index_adjacency_list G,
241235
random_access_range Distances,
242236
random_access_range Predecessors,
243-
class WF = std::function<range_value_t<Distances>(edge_reference_t<G>)>,
237+
class WF = function<range_value_t<Distances>(edge_reference_t<G>)>,
244238
class Visitor = bellman_visitor_base<G>,
245239
class Compare = less<range_value_t<Distances>>,
246240
class Combine = plus<range_value_t<Distances>>>
@@ -250,7 +244,7 @@ requires is_arithmetic_v<range_value_t<Distances>> && //
250244
sized_range<Predecessors> && //
251245
basic_edge_weight_function<G, WF, range_value_t<Distances>, Compare, Combine>
252246
// && bellman_visitor<G, Visitor>
253-
[[nodiscard]] std::optional<vertex_id_t<G>> bellman_ford_shortest_paths(
247+
[[nodiscard]] optional<vertex_id_t<G>> bellman_ford_shortest_paths(
254248
G& g,
255249
const vertex_id_t<G> source,
256250
Distances& distances,
@@ -265,7 +259,7 @@ requires is_arithmetic_v<range_value_t<Distances>> && //
265259

266260

267261
/**
268-
* @brief Shortest distnaces from a single source using Bellman-Ford's single-source shortest paths
262+
* @brief Shortest distances from a single source using Bellman-Ford's single-source shortest paths
269263
* algorithm with a visitor.
270264
*
271265
* This is identical to bellman_ford_shortest_paths() except that it does not require a predecessors range.
@@ -297,7 +291,7 @@ requires is_arithmetic_v<range_value_t<Distances>> && //
297291
template <index_adjacency_list G,
298292
input_range Sources,
299293
random_access_range Distances,
300-
class WF = std::function<range_value_t<Distances>(edge_reference_t<G>)>,
294+
class WF = function<range_value_t<Distances>(edge_reference_t<G>)>,
301295
class Visitor = bellman_visitor_base<G>,
302296
class Compare = less<range_value_t<Distances>>,
303297
class Combine = plus<range_value_t<Distances>>>
@@ -306,7 +300,7 @@ requires convertible_to<range_value_t<Sources>, vertex_id_t<G>> && //
306300
sized_range<Distances> && //
307301
basic_edge_weight_function<G, WF, range_value_t<Distances>, Compare, Combine>
308302
//&& bellman_visitor<G, Visitor>
309-
[[nodiscard]] std::optional<vertex_id_t<G>> bellman_ford_shortest_distances(
303+
[[nodiscard]] optional<vertex_id_t<G>> bellman_ford_shortest_distances(
310304
G& g,
311305
const Sources& sources,
312306
Distances& distances,
@@ -315,21 +309,20 @@ requires convertible_to<range_value_t<Sources>, vertex_id_t<G>> && //
315309
Compare&& compare = less<range_value_t<Distances>>(),
316310
Combine&& combine = plus<range_value_t<Distances>>()) {
317311
return bellman_ford_shortest_paths(g, sources, distances, _null_predecessors, forward<WF>(weight),
318-
std::forward<Visitor>(visitor), std::forward<Compare>(compare),
319-
std::forward<Combine>(combine));
312+
forward<Visitor>(visitor), forward<Compare>(compare), forward<Combine>(combine));
320313
}
321314

322315
template <index_adjacency_list G,
323316
random_access_range Distances,
324-
class WF = std::function<range_value_t<Distances>(edge_reference_t<G>)>,
317+
class WF = function<range_value_t<Distances>(edge_reference_t<G>)>,
325318
class Visitor = bellman_visitor_base<G>,
326319
class Compare = less<range_value_t<Distances>>,
327320
class Combine = plus<range_value_t<Distances>>>
328321
requires is_arithmetic_v<range_value_t<Distances>> && //
329322
sized_range<Distances> && //
330323
basic_edge_weight_function<G, WF, range_value_t<Distances>, Compare, Combine>
331324
//&& bellman_visitor<G, Visitor>
332-
[[nodiscard]] std::optional<vertex_id_t<G>> bellman_ford_shortest_distances(
325+
[[nodiscard]] optional<vertex_id_t<G>> bellman_ford_shortest_distances(
333326
G& g,
334327
const vertex_id_t<G> source,
335328
Distances& distances,
@@ -338,8 +331,8 @@ requires is_arithmetic_v<range_value_t<Distances>> && //
338331
Compare&& compare = less<range_value_t<Distances>>(),
339332
Combine&& combine = plus<range_value_t<Distances>>()) {
340333
return bellman_ford_shortest_paths(g, subrange(&source, (&source + 1)), distances, _null_predecessors,
341-
forward<WF>(weight), std::forward<Visitor>(visitor),
342-
std::forward<Compare>(compare), std::forward<Combine>(combine));
334+
forward<WF>(weight), forward<Visitor>(visitor), forward<Compare>(compare),
335+
forward<Combine>(combine));
343336
}
344337

345338
} // namespace graph

include/graph/algorithm/dijkstra_clrs.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ constexpr auto print_types(Ts...) {
8383
template <adjacency_list G,
8484
random_access_range Distance,
8585
random_access_range Predecessor,
86-
class WF = std::function<range_value_t<Distance>(edge_reference_t<G>)>>
86+
class WF = function<range_value_t<Distance>(edge_reference_t<G>)>>
8787
requires random_access_range<vertex_range_t<G>> && //
8888
integral<vertex_id_t<G>> && //
8989
is_arithmetic_v<range_value_t<Distance>> && //

include/graph/algorithm/dijkstra_shortest_paths.hpp

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ class dijkstra_visitor_base {
3737
// Visitor Functions
3838
public:
3939
// vertex visitor functions
40-
constexpr void on_initialize_vertex(vertex_desc_type&& vdesc) {}
41-
constexpr void on_discover_vertex(vertex_desc_type&& vdesc) {}
42-
constexpr void on_examine_vertex(vertex_desc_type&& vdesc) {}
43-
constexpr void on_finish_vertex(vertex_desc_type&& vdesc) {}
40+
constexpr void on_initialize_vertex(const vertex_desc_type& vdesc) {}
41+
constexpr void on_discover_vertex(const vertex_desc_type& vdesc) {}
42+
constexpr void on_examine_vertex(const vertex_desc_type& vdesc) {}
43+
constexpr void on_finish_vertex(const vertex_desc_type& vdesc) {}
4444

4545
// edge visitor functions
46-
constexpr void on_examine_edge(sourced_edge_desc_type&& edesc) {}
47-
constexpr void on_edge_relaxed(sourced_edge_desc_type&& edesc) {}
48-
constexpr void on_edge_not_relaxed(sourced_edge_desc_type&& edesc) {}
46+
constexpr void on_examine_edge(const sourced_edge_desc_type& edesc) {}
47+
constexpr void on_edge_relaxed(const sourced_edge_desc_type& edesc) {}
48+
constexpr void on_edge_not_relaxed(const sourced_edge_desc_type& edesc) {}
4949
};
5050

5151
template <class G, class Visitor>
@@ -97,7 +97,7 @@ template <index_adjacency_list G,
9797
input_range Sources,
9898
random_access_range Distances,
9999
random_access_range Predecessors,
100-
class WF = std::function<range_value_t<Distances>(edge_reference_t<G>)>,
100+
class WF = function<range_value_t<Distances>(edge_reference_t<G>)>,
101101
class Visitor = dijkstra_visitor_base<G>,
102102
class Compare = less<range_value_t<Distances>>,
103103
class Combine = plus<range_value_t<Distances>>>
@@ -188,7 +188,7 @@ void dijkstra_shortest_paths(
188188
visitor.on_examine_edge({uid, vid, uv});
189189

190190
// Negative weights are not allowed for Dijkstra's algorithm
191-
if constexpr (std::is_signed_v<weight_type>) {
191+
if constexpr (is_signed_v<weight_type>) {
192192
if (w < zero) {
193193
throw std::out_of_range(
194194
fmt::format("dijkstra_shortest_paths: invalid negative edge weight of '{}' encountered", w));
@@ -230,7 +230,7 @@ void dijkstra_shortest_paths(
230230
template <index_adjacency_list G,
231231
random_access_range Distances,
232232
random_access_range Predecessors,
233-
class WF = std::function<range_value_t<Distances>(edge_reference_t<G>)>,
233+
class WF = function<range_value_t<Distances>(edge_reference_t<G>)>,
234234
class Visitor = dijkstra_visitor_base<G>,
235235
class Compare = less<range_value_t<Distances>>,
236236
class Combine = plus<range_value_t<Distances>>>
@@ -282,7 +282,7 @@ void dijkstra_shortest_paths(
282282
template <index_adjacency_list G,
283283
input_range Sources,
284284
random_access_range Distances,
285-
class WF = std::function<range_value_t<Distances>(edge_reference_t<G>)>,
285+
class WF = function<range_value_t<Distances>(edge_reference_t<G>)>,
286286
class Visitor = dijkstra_visitor_base<G>,
287287
class Compare = less<range_value_t<Distances>>,
288288
class Combine = plus<range_value_t<Distances>>>
@@ -299,14 +299,13 @@ void dijkstra_shortest_distances(
299299
Visitor&& visitor = dijkstra_visitor_base<G>(),
300300
Compare&& compare = less<range_value_t<Distances>>(),
301301
Combine&& combine = plus<range_value_t<Distances>>()) {
302-
dijkstra_shortest_paths(g, sources, distances, _null_predecessors, forward<WF>(weight),
303-
std::forward<Visitor>(visitor), std::forward<Compare>(compare),
304-
std::forward<Combine>(combine));
302+
dijkstra_shortest_paths(g, sources, distances, _null_predecessors, forward<WF>(weight), forward<Visitor>(visitor),
303+
forward<Compare>(compare), forward<Combine>(combine));
305304
}
306305

307306
template <index_adjacency_list G,
308307
random_access_range Distances,
309-
class WF = std::function<range_value_t<Distances>(edge_reference_t<G>)>,
308+
class WF = function<range_value_t<Distances>(edge_reference_t<G>)>,
310309
class Visitor = dijkstra_visitor_base<G>,
311310
class Compare = less<range_value_t<Distances>>,
312311
class Combine = plus<range_value_t<Distances>>>
@@ -323,8 +322,7 @@ void dijkstra_shortest_distances(
323322
Compare&& compare = less<range_value_t<Distances>>(),
324323
Combine&& combine = plus<range_value_t<Distances>>()) {
325324
dijkstra_shortest_paths(g, subrange(&source, (&source + 1)), distances, _null_predecessors, forward<WF>(weight),
326-
std::forward<Visitor>(visitor), std::forward<Compare>(compare),
327-
std::forward<Combine>(combine));
325+
forward<Visitor>(visitor), forward<Compare>(compare), forward<Combine>(combine));
328326
}
329327

330328
} // namespace graph

include/graph/algorithm/experimental/co_dijkstra.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ template <index_adjacency_list G,
8282
random_access_range Predecessors,
8383
class Compare = less<range_value_t<Distances>>,
8484
class Combine = plus<range_value_t<Distances>>,
85-
class WF = std::function<range_value_t<Distances>(edge_reference_t<G>)>>
85+
class WF = function<range_value_t<Distances>(edge_reference_t<G>)>>
8686
requires convertible_to<range_value_t<Seeds>, vertex_id_t<G>> && //
8787
is_arithmetic_v<range_value_t<Distances>> && //
8888
convertible_to<vertex_id_t<G>, range_value_t<Predecessors>> && //
@@ -168,7 +168,7 @@ Generator<bfs_value_t<dijkstra_events, G>> co_dijkstra(
168168
dijkstra_yield_edge(dijkstra_events::examine_edge, uid, vid, uv);
169169

170170
// Negative weights are not allowed for Dijkstra's algorithm
171-
if constexpr (std::is_signed_v<weight_type>) {
171+
if constexpr (is_signed_v<weight_type>) {
172172
if (w < zero) {
173173
throw graph_error("co_dijkstra: negative edge weight");
174174
}
@@ -233,10 +233,10 @@ template <index_adjacency_list G,
233233
random_access_range Predecessors,
234234
class Compare = less<range_value_t<Distances>>,
235235
class Combine = plus<range_value_t<Distances>>,
236-
class WF = std::function<range_value_t<Distances>(edge_reference_t<G>)>,
236+
class WF = function<range_value_t<Distances>(edge_reference_t<G>)>,
237237
_queueable Queue = std::priority_queue<vertex_id_t<G>,
238238
std::vector<vertex_id_t<G>>,
239-
std::greater<vertex_id_t<G>>>>
239+
greater<vertex_id_t<G>>>>
240240
requires is_arithmetic_v<range_value_t<Distances>> && //
241241
convertible_to<vertex_id_t<G>, range_value_t<Predecessors>> && //
242242
basic_edge_weight_function<G, WF, range_value_t<Distances>, Compare, Combine>

include/graph/algorithm/experimental/visitor_dijkstra.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ template <index_adjacency_list G,
141141
input_range Sources,
142142
random_access_range Distances,
143143
random_access_range Predecessors,
144-
class WF = std::function<range_value_t<Distances>(edge_reference_t<G>)>,
144+
class WF = function<range_value_t<Distances>(edge_reference_t<G>)>,
145145
class Compare = less<range_value_t<Distances>>,
146146
class Combine = plus<range_value_t<Distances>>
147147
//queueable Que = _dijkstra_queue<G, Distances> // not used
@@ -241,7 +241,7 @@ void dijkstra_with_visitor(
241241
visitor.on_examine_edge({uid, vid, uv});
242242

243243
// Negative weights are not allowed for Dijkstra's algorithm
244-
if constexpr (std::is_signed_v<weight_type>) {
244+
if constexpr (is_signed_v<weight_type>) {
245245
if (w < zero) {
246246
throw graph_error("dijkstra_with_visitor: negative edge weight");
247247
}
@@ -303,7 +303,7 @@ template <index_adjacency_list G,
303303
class Visitor,
304304
random_access_range Distances,
305305
random_access_range Predecessors,
306-
class WF = std::function<range_value_t<Distances>(edge_reference_t<G>)>,
306+
class WF = function<range_value_t<Distances>(edge_reference_t<G>)>,
307307
class Compare = less<range_value_t<Distances>>,
308308
class Combine = plus<range_value_t<Distances>>,
309309
queueable Que = _dijkstra_queue<G, Distances>>

0 commit comments

Comments
 (0)