Today, we released the new version v2025.10 (Foxglove) of OGDF.
This release contains many significant improvements to core functionality, including a unified Graph::insert and NodeArrays/EdgeArrays that store their data in std::vectors. Moreover, we enhanced the build process by, e.g., properly enabling multi-config builds and packaging via CPack. However, as a result, this release also comes with several notable breaking changes. For example, OGDF now requires C++17. Thus, we strongly suggest to read the porting guide.
Note that to simplify access to the OGDF, we also plan to publish an OGDF docker image and to improve support of C++ package managers in the future.
Noteworthy Changes
- build:
- OGDF now requires C++17 features
- improved compatibility with Windows MinGW, Apple silicon, and CGAL 6
- fixes for linking user code with out-of-source OGDF builds
- aligned symbol visibility on Windows and Unix
- updated install declaration using GNUInstallDirs
- enabled multi-config builds (i.e., parallel debug and release builds)
- debug binaries and libs are now marked with
-debug
- debug binaries and libs are now marked with
- enabled packaging via CPack
- core functionality:
- new unified and versatile
Graph::insertimplementation:- variants to insert subgraphs via iterators, lists, filter functions
- options for notifying observers and keeping embedding or node/edge IDs
- replaces
Graph::copy(),Graph::construct*(),Graph::assign(),
andGraphCopy(Simple)::init*()
- new
RegisteredArray:- as underlying class for
NodeArray,EdgeArray,FaceArrayetc. - now uses
std::vectorinstead ofogdf::Arrayfor data storage - new
NodeArrayPetc. to wrap non-movable objects instd::unique_ptr - new
invertRegisteredArrayto transferXArray<Y>intoYArray<X>
- as underlying class for
- new
RegisteredSet:- as underlying class for
NodeSet,FaceSet,ClusterSet - automatically removes members that are deleted from the resp. registry
- always allows for efficient
size() - new
EdgeSetandAdjEntrySet
- as underlying class for
- new
ObserverandObservable:- as underlying class for
GraphObserver,RegisteredSets etc. - new (
Graph)Observer::registrationChanged() - new
ClusterGraphObserver::clustersCleared()
- as underlying class for
GraphCopyandGraphCopySimple:- now with common superclass
GraphCopyBase - new
GraphCopyBase::setOriginalGraph()replacingcreateEmpty() - new
GraphCopySimple::copyEmbeddingToOriginal() - new generic
copyEmbedding()
- now with common superclass
ClusterGraph:- new
ClusterGraph::representsConnectedCombEmbedding() - new
ClusterGraph::planarizeClusterBorderCrossings() - new
ClusterGraph::adjAvailable() - new
cluster->isDescendant()
- new
- new unified and versatile
- graph algorithms:
- new algorithms for Min-Weight Perfect Matching (MWPM):
MatchingModuleMatchingBlossomMatchingBlossomVMatchingImplementationas the current best OGDF MWPM algorithm
- new node coloring heuristics:
NodeColoringModuleNodeColoringBergerRompelNodeColoringBoppanaHalldorssonNodeColoringHalldorssonNodeColoringJohnsonNodeColoringRecursiveLargestFirstNodeColoringSequentialNodeColoringSimpleNodeColoringWigderson
- new
PCTreefor planarity testing - new Synchronized Planarity functionality:
SyncPlanfor modeling and solving SyncPlan instancesClusterPlanarityModulefor computing cluster-planar embeddingsSyncPlanClusterPlanarityModulerandomSyncPlanInstance()generatorrandomSEFEInstanceBy...()generators
- new algorithms for Min-Weight Perfect Matching (MWPM):
- graph decomposition:
- new
FourBlockTreefor construction and traversal of 4-block trees - new parameter for
connectedComponents()to get comp representatives - new
CCsInfo::nodes(int cc)andCCsInfo::edges(int cc) - new access methods for member vars of
BCTreeandDynamicSPQRForest - new
operator<<for nodes ofBCTreeandDynamicSPQRForest
- new
- graph generators:
- new
randomProperMaximalLevelPlaneGraph() - new
pruneEdges()to enforce a maximum edge number - new graph operations
join(),intersection(), andcomplement() - reworked cluster generators:
- old
randomClusterPlanarGraphrenamedrandomCConnectedClustering() - old
randomClusterGraphrenamedrandomClustering() - new
randomClusterPlanarGraph - new
randomPlanarClustering
- old
- new
- layouts:
TreeLayoutnow works on non-arborescence forestsSimpleCCPackernow correctly preserves edge bendsComponentSplitterLayoutnow correctly preserves edge bends
- memory allocation:
PoolMemoryAllocator::defrag()renameddefragGlobal()- new
PoolMemoryAllocator::defragThread() - new
PoolMemoryAllocator::get{Global,Thread}FreeListSizes() - new
OGDFAllocatorfor use with containers of the C++ standard lib
- miscellaneous:
HiddenEdgeSetnow hasbegin(),end(), andempty()- new
Graph::sort(node v, ITER begin, ITER end)to adapt rotation systems - new indent parameter for
Logger::lout()- new
Logger::setIndent(),Logger::indent(),Logger::dedent()
- new
SvgPrinternow correctly connects arrow heads to the edge’s target
- OGDF development:
- documentation now powered by Netlify
- new
CODE_OF_CONDUCT.md - new utility
OGDF_-macros for declaring c’tors and assignment operators - new
OGDF_IF_DBGmacro for single-line statements in debug mode - new
indent_comments.pyfor formatting comments - new
style/test_all.shfor unified style check - usage of include-what-you-use
- new
make_release.shfor easier release management
Contributors
This release contains (big and small) contributions by Antoine Lambert, Dominik
Potulski, Felix F Xu, Gregor Diatzko, Jan-Niklas Buckow, Joshua Sangmeister,
Lily Wang, Max Ilsen, Simon Dominik “Niko” Fink, and Sven Strickroth.
Thanks a lot to all contributors!

