Boost.Graph Workshop Paris | May 6th, 2026 #466
Replies: 9 comments 19 replies
-
|
@andrea-cassioli-maersk @andreacassioli would you be interested joining us ? |
Beta Was this translation helpful? Give feedback.
-
|
I am from the CGAL Open Source project. Technically, CGAL does not depend on algorithms of the BGL, but we fully embraced the design idea of external adaption, that is making the representation of the graph independent from the graph algorithms. In the first step, we provided what it needs for CGAL data structures like polygonal meshes to become models of BGL Graph concepts (meshes have vertices and edges between them). Edges then may have weights associated, which can be the Euclidean distance between the points, which can be seen as a vertex property, This done it is possible to run any algorithm of the BGL on CGAL polygonal meshes. In the second step, we extended the hierarchy of graph concepts, introducing concepts such as At some point we thought about contributing this to the BGL, but didn’t bring up the necessary energy, and also felt that the BGL had reached a point of stability. We could revive this idea. Ideally there would be an industrial or institutional sponsor who finances this community effort. Concerning needs, in one of CGAL algorithms, we do have a dependency on a BGL algorithm, namely for the max flow (which is at the same time a min cut) So, we are definitively interested in participating in a BGL Workshop. |
Beta Was this translation helpful? Give feedback.
-
|
Hi all, I have been using boost.graph on and off for many years since my master thesis in 2005! Now I am working for Maersk, a large Danish logistic company and regularly use boost.graph as core component in optimization algorithms. Our focus is mostly on path finding algorithms, but we might also need other (recently I use max-flow for instance). On a personal level, I have made two small contributions, and helped a bit triage old issues or PR in order to familiarize more with the project. This renewed push to modernize and revitalize boost.graph is very welcome and I hope I can contribute somehow. |
Beta Was this translation helpful? Give feedback.
-
|
Hi Graphlings! I am a C++ software engineer and researcher working since January 2026 with the C++ Alliance on revitalizing the Boost Graph Library. My first instinct was to connect with same-minded people and have all of us sitting in same room, hence this workshop 😂 I am a mixed bag of sciences. I hold a PhD in computational genetics from Université Paris-Saclay, where my research focused on spatially explicit models of gene genealogies and ecological modeling/inference of population graphs. I authored Quetzal-CoaTL, a published open-source C++ template library for building geospatial population genetics simulators, designed around reusable generic components and the same generic programming philosophy that underpins Boost (and would need some revitalizing too after I'm done with BGL ahaha 🥲) I am hoping to get researchers and C++ graph people in the same room, have an honest conversation about what is missing, what is painful, and what Boost.Graph could realistically become. If that sounds like your kind of day, I would love to have you there ❤️ |
Beta Was this translation helpful? Give feedback.
-
|
This upcoming workshop looks terrific! Not sure if it belongs in the agenda, but one thing I'd be curious to know is how much of a pain the rather complex interface of BGL is for newcomers and seasoned practitioners. Some random notes on API improvement ideas I'd like to discuss, here or elsewhere:
dijkstra_shortest_paths(
g, vertex(0, g),
predecessor_map(make_iterator_property_map(
p.begin(), get(vertex_index, g))).
distance_map(make_iterator_property_map(
d.begin(), get(vertex_index, g))));Something more intuitive could be devised along these lines: dijkstra_shortest_paths(
g, vertex(0, g),
predecessor_map(g >> vertex_index >> p).
distance_map(g >> vertex_index >> d));(Crude proof of concept at https://godbolt.org/z/as6rxW6M8; C++20 concepts used, but this surely can be backported to C++14).
|
Beta Was this translation helpful? Give feedback.
-
|
Sadly, I won't be flying in for the workshop. One thing that should be considered for future developments is CUDA support. The CUDA API is very well industry standard, not particularly difficult to retrofit onto existing libraries, and brings with it massive parallelism. If you need assistance with this endeavor let me know. I have added at least partial CUDA support to 3 boost libraries so far, and the upcoming boost.multi has it. |
Beta Was this translation helpful? Give feedback.
-
|
Hi there! I find this discussion very interesting, and as a previous Boost.Graph user that, unfortunately, had to move to a self-implemented graph after having worked with Boost.Graph for about two years on my project, I think this is the first and best opportunity to explain my reasons behind this. First, I want to say thank you to Boost.Graph, because it gave me the possibility to initially try out my project and get it to work. I am doing high performance (in terms of accuracy and computational speed) offline map matching. For offline map matching, a road network (i.e., OpenStreetMap) needs to be imported in advance of mapping a GNSS-recorded track (i.e., GPS-track) to the road network. As such, I started to import huge road networks into graphs. When it is not known beforehand where a GPS-track is located, a large road network has to be made available so that the spatial extents of the GPS-tracks and the road network fit together, which is essential for map matching. I first used Boost.Graph for implementing my approach, but I encountered a few major issues along the way that required me to completely abandon Boost.Graph in favor of an own graph implementation. To this date, I keep an eye on the development of Boost.Graph, but for my personal project, it is very unlikely that I can revert. My own implementation is so specifically tuned towards my use-case that a general-purpose graph library probably won't improve the performance for me any further. However, future researchers may benefit from my points, which is the reason why I write this comment. What were the reasons that I had to abandon Boost.Graph:
These were the two major issues that I had with Boost.Graph and I could only solve them with an own implementation, unfortunately. I will not be able to attend the meeting and I know my use-case is special, but maybe my point of view and the reasons why I had to abandon Boost.Graph can help in the discussion. Thank you for listening! |
Beta Was this translation helpful? Give feedback.
-
|
Hi, I'm a developer working in CAD / CAE (mostly with computational geometry & meshing). Recently we had to implement a lot of graph functionality and Boost.Graph was heavily considered for the use case, however in the end we went with a custom implementation. Below I will outline the use case, why it didn't fit Boost.Graph and how it was solved. Algorithms of interest
Problem assumptions
Architectural preferences
Why BGL is desirableIt provides a very general "common language" for working with graph structures. Currently there is a lot of wheel re-invention - everyone implements their own graph structures and as a result their algorithms become non-reusable. Why we didn't go with BGLThe main reason is its lack of community finding & graph clustering algorithms, if those we present right off the bat other issues would likely be worked around just avoid having to manually implement them. Second significant reason is API complexity, although this is motivated by generality (which is understandable) and age (also understandable) it oftentimes results in algorithms being unwieldy and arcane. It feels like API could be significantly more convenient if it made use of C++20 concepts, ranges and better Custom indexations and allocator support were also somewhat awkward to not have, which further motivated going towards custom path. What internal solution ended up looking likeInternally I implemented a data structure based on a pair of dense slotmaps (one for verts and one for edges) with "keys" corresponding to columns of an AoS table storing interior vert / edge properties, also a few modifications to allow insertion / erasure at arbitrary indices. This resulted in a very cache-friendly representation with O(1) lookups, O(1) insertion / erasure (assuming a sparse graph) and pretty much entirely contiguous iteration: // Define graph
using weighted_oriented_multigraph = network_type<
type_list<>, // data attached to every vert
type_list<weight>, // data attached to every edge
network_policy::oriented_multigraph // topological policy
>;
auto graph = weighted_oriented_multigraph::with_slots(48, 36);
// Insert at specific indices
graph.insert_verts({ 3, 7, 12, 23, 47 });
graph.insert_edges({ 12, 23, 33, 35 }, { { 3, 7 }, { 7, 12 }, { 7, 23 }, { 7, 23 } });
// Iterate ranges
vert_id vert_0 = 23;
edge_id edge_0 = 12;
for (const auto vert : graph.verts()) {} // [contiguous] all verts
for (const auto edge : graph.edges()) {} // [contiguous] all edges
for (const auto vert : graph.verts(edge_0)) {} // [contiguous] verts of edge
for (const auto vert : graph.incoming_verts(vert_0)) {} // [random_access] adjacent verts
for (const auto edge : graph.incoming_edges(vert_0)) {} // [random_access] adjacent edges
for (const auto vert : graph.outgoing_edges(vert_0)) {} // [random_access] adjacent verts
for (const auto edge : graph.outgoing_verts(vert_0)) {} // [random_access] adjacent edges
for (const auto [root, edge] : graph.incoming_links(vert_0)) {} // [contiguous] adjacent verts & corresponding edges
for (const auto [dest, edge] : graph.outgoing_links(vert_0)) {} // [contiguous] adjacent verts & corresponding edges
for (const auto weight : graph.edge<weight>()) {} // [contiguous] all edge weights
for (const auto edge : graph.find_edges(3, 7)) {} // [random_access] all edges from vert 3 to vert 7
// Undirected graphs provide additional ranges
// for (const auto vert : graph.verts(vert_0)) {} // [random_access] adjacent verts
// for (const auto edge : graph.edges(vert_0)) {} // [random_access] adjacent edges
// for (const auto [root, edge] : graph.links(vert_0)) {} // [contiguous] adjacent verts & corresponding edgesNot aware of any C++ libraries doing the same, but the result ended up being rather convenient and performance-wise there's been no complaints, should probably do a few benchmarks against more traditional adjacency list representations some day. General allocator awareness was also attempted, however it ended up being too unwieldy to be practical so I went with a What would be nice to see in BGLBGL is already very good at solving general problems, but it could use some improvements in getting the usage across. I think it would greatly benefit from a documentation update like in Boost.Unordered so we can have an "easier on the eyes" navigation with sidebar T.O.C. and codeblock highlighting. It would also benefit from modernizing a lot of examples (e.g. prefer Lack of community detection / clustering is a big thing so its good to see it addressed in current priorities. SBM would be particularly great to see (especially the weighted version) as currently there doesn't seem to be any implementations in C++. In community finding there are generally 3 main approaches: spectral (k-means, recursive bisection), agglomerative (Louvain, Leiden and all the other partition -> aggregate schemes) and inference-based (SBM, WSBM and multiple others). They all have different quirks and trade-offs so the seemingly sensible choice would be to implement 1-2 "solid classics" from every approach. |
Beta Was this translation helpful? Give feedback.
-
|
heya! won't be able to make it to the workshop but here's some feedback! https://ossia.io has relied extensively on boost.graph for its dataflow pipeline for audio / video / media arts. It's been used in shows and art installations around the world since 2015 :)
In general, what would be absolutely incredible would be to have complete control over memory allocations and container implementations throughout the library. Maybe with an explicit allocator, maybe with std::pmr (although it can murder performance on frequent resizes), maybe with explicit container selection as template arguments through for instance a per-algorithm configuration struct... Having more low-level control over the containers and allocators would really allow the library to go places where no one can go today. Likewise there's lots of places using, say, std::map and such where today incredibly faster containers exist. Just swapping one for the other can yield double-digit performance improvements in some use cases.
Most common algorithms I reach for are very classic.
But there's been lot of state-of-the-art improvement to things such as transitive closure since the library was released. My use cases are generally pretty small graphs, on the order of hundreds, at most a few thousand of nodes ; at this scale, algorithmic complexity can be as influent as implementation quality when the best performance is needed, since I have always very small time budgets due to the nature of the software which allows live manipulation of graphs by the user : operations must be instant, with strict deadlines on the order of milliseconds (max 16 ms for something such as "indicating to the user that he cannot create this connection because this would create a cycle, max 2 ms for computing a transitive closure for instance). this has some good discussion on the tradeoffs: https://drops.dagstuhl.de/storage/00lipics/lipics-vol160-sea2020/LIPIcs.SEA.2020.14/LIPIcs.SEA.2020.14.pdf |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Boost.Graph Modernization Workshop – May 6th, 2026
Hi everyone,
I am organizing a small workshop in Paris, France on May 6th, 2026 focused on the future of Boost.Graph, and I wanted to open a discussion here so the broader community can follow along, contribute ideas, and join if interested.
Context
I have been working with the C++ Alliance on modernizing Boost.Graph: improving documentation, expanding algorithm coverage, and making the library more accessible to researchers and industrial users working with large-scale graphs. One concrete area of current work is community detection (Louvain, Leiden, SBM), but a broader question I share with @jeremy-murphy is what Boost.Graph should look like in 2026 and beyond.
What the workshop is about
The goal is to bring together a small group (~10-15 people) of researchers, open-source implementers, and industrial users for a focused day of honest conversation. Three questions will anchor the discussions:
The format is a mix of short lightning talks in the morning and structured discussions in the afternoon, ending with a concrete prioritized roadmap.
Agenda (draft)
Morning
Afternoon
Logistics
Who should attend
This workshop is aimed at anyone working at the intersection of graph algorithms and software:
How to get involved
If you are interested in attending, or if you have thoughts on what Boost.Graph should prioritize, please reply to this thread. You can also reach me directly at arnaud.becheler@gmail.com .
Even if you cannot attend on May 6th, this thread is a good place to share your use cases, algorithm wishlist, or feedback on the current state of BGL. All input will feed into the roadmap.
Looking forward to the conversation!
Arnaud Becheler, PhD
C++ Alliance / Boost.Graph
Beta Was this translation helpful? Give feedback.
All reactions