Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/d-michail/parmcb
Parallel Minimum Cycle Basis
https://github.com/d-michail/parmcb
Last synced: 8 days ago
JSON representation
Parallel Minimum Cycle Basis
- Host: GitHub
- URL: https://github.com/d-michail/parmcb
- Owner: d-michail
- License: bsl-1.0
- Created: 2020-01-17T16:31:16.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2024-04-04T08:52:53.000Z (7 months ago)
- Last Synced: 2024-04-04T16:50:45.896Z (7 months ago)
- Language: C++
- Size: 312 KB
- Stars: 3
- Watchers: 2
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Parallel Minimum Cycle Basis Library
This project implements algorithms to compute exact and approximate *Minimum Cycle Bases* of weighted graphs.
The library is written in C++-14 using the [Boost Graph](https://www.boost.org/) libraries for the underlying
graph implementation. It supports parallel and distributed execution using the
[TBB (Intel Threading Building Blocks)](https://software.intel.com/en-us/tbb) library
and [MPI](https://www.mpi-forum.org/).An older package containing several sequential minimum cycle basis algorithms, using the LEDA library, can
be found at https://github.com/d-michail/mcb.## Cite
If you use this package please cite the following paper:
- K. Mehlhorn and D. Michail.
**Implementing Minimum Cycle Basis Algorithms.**
ACM Journal of Experimental Algorithmics, 11(2):1-14, 2006.
[pdf](https://d-michail.github.io/assets/papers/implMCBjournal.pdf),
[web](https://portal.acm.org/citation.cfm?id=1187436.1216582)Citing software is just as important as citing any other important sources in your research.
If you’re not sure whether or not to cite something, [Shouldacite](http://bit.ly/shouldacite) can help
you decide if you should.## Algorithms
### Undirected Graphs
The following functions are available which implement different algorithmic variants. All of them use a technique
called _support vector approach_ in order to establish linear independence. Their main differences are how they
compute the actual cycles.- signed graph
* `mcb_sva_signed`
* `mcb_sva_signed_tbb`
* `mcb_sva_signed_tbb_mpi`
- cycles collection from a feedback vertex set
* `mcb_sva_fvs_trees`
* `mcb_sva_fvs_trees_tbb`
* `mcb_sva_fvs_trees_mpi`
* `mcb_sva_fvs_trees_tbb_mpi`
- isometric cycles collection
* `mcb_sva_iso_trees`
* `mcb_sva_iso_trees_tbb`
* `mcb_sva_iso_trees_mpi`
* `mcb_sva_iso_trees_tbb_mpi`All these different implementations support weighted undirected graphs which (a) do not contain self-loops,
(b) do not contain multiple edges, and (c) all edge weights are positive. If your graph has self-loops,
multiple edges or zero weight edges, you need to handle those in a preprocessing step.### Undirected Graphs (approximation algorithms)
A (2k-1)-approximate algorithm for any integer k >= 1.
- signed graph
* `approx_mcb_sva_signed`
- cycles collection from a feedback vertex set
* `approx_mcb_sva_fvs_trees`
- isometric cycles collection
* `approx_mcb_sva_iso_trees`The signed graph variation `approx_mcb_sva_signed` has time complexity equal to
O( m n^{1+1/k} + min(m^3 + m n^2 \log n, n^{3+3/k}) ). The approximation algorithms support weighted
undirected graphs with positive edge weights. Multiple edges and self-loops are handled correctly by the
algorithm. If you have zero length edges you need to handle them in a preprocessing step.Two demos programs are included which read a graph in DIMACS format and compute a minimum cycle basis.
## Examples
See [examples/README](examples/README.md) for a few basic examples to get you started.
## Develop
In order to build the library you need to have CMake installed. A C++-14 compiler is required, such as
GCC or Clang.### Using Eclipse
Assume the source file is downloaded in a folder called `parmcb`. Create a folder called `parmcb-build`
parallel to the `parmcb` folder. This works best when using Eclipse.Switch to your new folder `parmcb-build` and issue
```
cmake ../parmcb/ -G"Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
```in order to build without debugging symbols. Use Debug if debugging symbols are required.
Open up Eclipse and import an existing project into the workspace.### Using Clang
Use
```
CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake ../parmcb/ -G"Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
```### Custom TBB location
See the following [guide](https://software.intel.com/en-us/articles/installing-intel-free-libs-and-python-apt-repo)
on how to install TBB in Ubuntu based systems.If cmake fails to locate TBB, try something like
```
TBBROOT=/apps/compilers/intel/19.0.1/tbb cmake ../parmcb/
```or
```
TBBROOT=/opt/intel/oneapi/tbb/2021.9.0 cmake ../parmcb/ -G"Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
```### Logging
The library has some log statements at various locations that can be helpful. To compile with these statements
use the parameter `PARMCB_LOGGING` as shown in the following:```
cmake ../parmcb/ -G"Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DPARMCB_LOGGING=ON
```### Linker errors
If you are experiencing any linker errors with the boost libraries, then you boost libraries
might have been compiled with an older ABI. In that case a possible workaround is to use```
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
```in the `CMakeLists.txt` file.
Happy coding!
## License
The library may be used under the terms of the [Boost Software License, Version 1.0](https://www.boost.org/LICENSE_1_0.txt).
Please note that the library is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.Please refer to the license for details.
SPDX-License-Identifier: BSL-1.0
## Author
(C) Copyright 2019-2023, by Dimitrios Michail