A tool for extracting Strong Transitive Dependency and Conflict Graphs from Variability Models
Variability Models are commonly used to represent the configuration space of software systems. These models specify the available configurable options or features, along with the constraints that govern these features (e.g., if feature A is enabled in a configuration, then feature B must also be enabled, while feature C must be disabled).
However, these constraints result in numerous additional indirect relationships due to their chaining. Reasoning about these relationships is extremely challenging in all but the most trivial variability models.
Strong4VM identifies all transitive strong relationships between features and represents them as graphs. The term transitive refers to relationships that can be formed by linking other relationships defined in the variability model, while strong indicates that these relationships are valid in all configurations that comply with the variability model.
β¨ Key Features:
-
π― Unified interface: Single tool for UVL or DIMACS inputs. The Universal Variability Language (UVL) is the standard notation for variability models; however, Strong4VM can also generate graphs for the Boolean translations of any variability model notation. This is made possible by its support for DIMACS files. For example, it can generate graphs using KconfigReader first to convert Kconfig files (used in Linux, BusyBox, axTLS, and more) into Boolean formulas.
-
β‘ High performance: Multi-threaded graph generation with configurable parallelism
-
π Comprehensive: Generates requires/excludes graphs and core/dead feature lists
-
β Well-tested: Validated against 5,709 real-world variability models.
Strong4VM runs natively on Linux and macOS. On Windows, use the Docker image instead β no native Windows build is supported.
# Navigate to the strong4vm
cd strong4vm
# Build the tool
make
# Optional: Install to ~/bin
make installFor input model.uvl or model.dimacs, Strong4VM generates:
-
model__requires.net- Strong transitive dependency graph (a directed graph in Pajek format) -
model__excludes.net- Strong transitive conflict graph (an undirected graph in Pajek format) -
model__core.txt- Core features (enabled in all configurations) -
model__dead.txt- Dead features (disabled in all configurations)
- C++17 compatible compiler (g++ 7+ or clang++ 5+)
- CMake 3.10+
- Make
- zlib (for MiniSat)
From the repository root:
make # Build strong4vm (builds all dependencies automatically)
make install # Install to ~/bin
make clean # Clean build artifacts
make clean-all # Deep clean (including all components)
make help # Show all available targetsOutput: bin/strong4vm
Strong4VM does not support native Windows builds. Docker is the recommended way to run it on Windows, and also works on Linux and macOS if you prefer not to install a local toolchain.
- Linux / macOS: Docker Engine must be installed and the daemon running.
- Windows: Docker Desktop must be installed and running before any
dockercommand will work. Start it from the Start menu and wait until the whale icon in the system tray shows "Docker Desktop is running".
docker build -t strong4vm .The image uses a two-stage build on Ubuntu 24.04: a builder stage that compiles all dependencies from scratch (ANTLR4 runtime, MiniSat, BoneDigger, strong4vm), and a slim runtime stage that contains only the resulting binaries. The first build takes around 5β10 minutes; subsequent builds are fast thanks to Docker layer caching.
The container's working directory is /data. The key idea is to mount the folder that holds your model files into that directory with -v, so the container can read your inputs and write its outputs back to your machine.
Say you want to analyze the BusyBox feature model included in the examples/ folder. Navigate to examples/ and run the command for your shell:
Linux / macOS (bash/zsh)
cd examples
docker run --rm -v $(pwd):/data strong4vm busybox_01.uvlWindows β Command Prompt
cd examples
docker run --rm -v %cd%:/data strong4vm busybox_01.uvlWindows β PowerShell
cd examples
$dir = $PWD.Path.Replace('\', '/')
docker run --rm -v "${dir}:/data" strong4vm busybox_01.uvlStrong4VM will read busybox_01.uvl from your local folder and write four files right next to it:
examples/
βββ busybox_01__requires.net β strong transitive dependency graph
βββ busybox_01__excludes.net β strong transitive conflict graph
βββ busybox_01__core.txt β features enabled in every valid configuration
βββ busybox_01__dead.txt β features disabled in every valid configuration
To send output to a separate folder, or to speed up analysis with multiple threads, add -o and -t:
Linux / macOS
docker run --rm -v $(pwd):/data strong4vm busybox_01.uvl -t 4 -o /data/resultsWindows β Command Prompt
docker run --rm -v %cd%:/data strong4vm busybox_01.uvl -t 4 -o /data/resultsWindows β PowerShell
$dir = $PWD.Path.Replace('\', '/')
docker run --rm -v "${dir}:/data" strong4vm busybox_01.uvl -t 4 -o /data/resultsDIMACS files work exactly the same way β just pass the .dimacs file instead of a .uvl file.
./bin/strong4vm model.uvl # Analyze a UVL feature model
./bin/strong4vm formula.dimacs # Analyze a DIMACS formula
./bin/strong4vm model.uvl -t 8 # Use 8 threads
./bin/strong4vm model.uvl -o ./output -k # Custom output dir + keep DIMACS
./bin/strong4vm model.uvl -e # Enable Tseitin transformationβοΈ Options:
-t, --threads N- Number of threads for graph generation (default: 1)-o, --output DIR- Output directory (default: same directory as input file)-k, --keep-dimacs- Keep intermediate DIMACS file (UVL input only)-e, --enable-tseitin- Enable Tseitin transformation for cross-tree constraints (see uvl2dimacs Architecture)-h, --help- Display help message
See API Documentation for usage details.
Build API examples:
make api-examplesThe resulting binaries will be generated in the ./bin folder.
As the following figure shows, Strong4VM consists of three main components: two compilers, one that translates UVL to DIMACS and another that converts DIMACS to Graphs, and a Backbone solver that detects all transitive strong dependencies and conflicts represented in the graphs.
Multi-layer design for converting UVL feature models to CNF format using ANTLR4 parser. Supports two conversion modes: Straightforward (default, direct conversion, fewer variables, potentially longer clauses) and Tseitin (introduces auxiliary variables for cross-tree constraint expressions to prevent exponential clause growth; feature tree relations are always encoded directly since they are already valid CNF disjunctions). An optional backbone simplification pass is available via the API (set_backbone_simplification(true)): BoneDigger identifies backbone literals and simplifies the DIMACS formula before graph analysis, reducing formula size by 30β50%. This pass is disabled by default in the strong4vm CLI and unified API.
For detailed architecture, see Doxygen Documentation
Analyzes SAT formulas using backbone detection to generate dependency graphs. Supports multi-threaded parallel processing. Auxiliary variables (aux_* and k!\d+) are automatically excluded from backbone iteration and graph output.
For detailed architecture, see Doxygen Documentation
High-performance backbone detection engine (BoneDigger) using MiniSat with three detection strategies: CheckCandidatesOneByOne (reliable, activity-bumping), FastOnCliffsSlowOnPlains (adaptive cliff/plain), and RushAndPray (fast rush-and-verify). BoneDigger is also available for optional backbone simplification in uvl2dimacs (disabled by default in the strong4vm pipeline).
For detailed architecture, see Doxygen Documentation
Universal Variability Language feature model format. See UVL specification.
Standard SAT solver input format:
p cnf <variables> <clauses>
<literal1> <literal2> ... 0
<literal1> <literal2> ... 0
...
- Lines starting with
care comments - For dimacs2graphs, comments like
c <var_number> <feature_name>map variables to feature names - Variables whose names start with
aux_or matchk!\d+are treated as Tseitin auxiliary variables and automatically excluded from the graph output. Thek!\d+pattern covers the naming convention used by KconfigReader
Generate comprehensive Doxygen documentation:
# Unified project documentation
make docs
# Output: docs/html/index.htmlRequirements: Doxygen 1.9.0+, Graphviz (optional, for diagrams)
strong4vm/
βββ bin/ # Built executables
βββ cli/ # Strong4VM CLI source
βββ api/ # Strong4VM Unified API
β βββ include/ # Public headers
β βββ src/ # Implementation
β βββ examples/ # Usage examples
β βββ docs/ # API documentation
βββ uvl2dimacs/ # UVL to DIMACS converter + BoneDigger backbone solver
β βββ cli/ # CLI tool
β βββ api/ # C++ API (include/, src/, examples/)
β βββ generator/ # Core conversion logic (BackboneSimplifier, FMToCNF, β¦)
β βββ parser/ # ANTLR4 UVL parser
β βββ backbone_solver/ # BoneDigger backbone detection engine
β β βββ src/
β β βββ api/ # BoneDiggerAPI
β β βββ detectors/ # CheckCandidatesOneByOne, FastOnCliffsSlowOnPlains, RushAndPray
β β βββ data_structures/ # LiteralSet
β β βββ io/ # DIMACS file reading
β β βββ minisat/ # MiniSat SAT solver
β β βββ minisat_interface/ # Extended MiniSat wrapper
β βββ build/ # CMake build artifacts (generated)
β βββ docs/ # Component documentation
β βββ third_party/ # ANTLR4 runtime source and build artifacts
βββ dimacs2graphs/ # DIMACS to graphs generator
β βββ cli/ # CLI tool
β βββ api/ # C++ API
β βββ bin/ # Component executables (generated)
β βββ docs/ # Component documentation
βββ backbone_solver/ # backbone_solver runtime binary (generated by make)
β βββ bin/ # Used by uvl2dimacs BackboneSimplifier as a subprocess
βββ examples/ # Sample models: 45+ UVL files + selected DIMACS files
βββ figures/ # Architecture diagrams (architecture.png, icon.svg)
βββ docs/ # Doxygen documentation source and generated HTML
βββ Dockerfile # Multi-stage Docker image (Ubuntu 24.04)
βββ .gitignore # Excludes build artifacts and generated files
βββ Makefile # Build system orchestration
βββ README.md # This file
- Feature Cardinality: UVL
cardinality [1..*]notation not expanded (requires indexed feature generation) - Arithmetic Constraints: Comparison and arithmetic operators filtered out (requires SMT solver, not pure SAT)
Clean and rebuild:
make clean-all
makeMissing dependencies:
# Linux (Ubuntu/Debian)
sudo apt-get install build-essential cmake zlib1g-dev
# macOS (Xcode CLT provides the compiler and make; Homebrew provides cmake)
xcode-select --install
brew install cmakeIf you use Strong4VM in your research, please cite:
@article{heradio2026strong4vm,
title = {{Strong4VM: From variability models to strong transitive dependency and conflict graphs}},
journal = {SoftwareX},
volume = {34},
pages = {102663},
year = {2026},
doi = {https://doi.org/10.1016/j.softx.2026.102663},
author = {Ruben Heradio and Luis Cambelo and Miguel A. Olivero and Jose M. Sanchez
and Alberto {Perez Garcia-Plaza} and David Fernandez-Amoros},
keywords = {Variability models, Strong relationships, SAT solving, Backbone detection,
Software product lines, Network analysis},
abstract = {This paper introduces Strong4VM, a C++ tool that extracts complete graphs
of strong transitive dependencies and conflicts from variability models using
multi-threaded SAT-based backbone detection. The resulting graphs, exported
in standard Pajek format, enable structural analysis with network analysis
tools such as Pajek, igraph, Neo4j, and Gephi. Strong4VM has been validated
on 5709 real-world models (within a range of 99-35,907 features), generating
a total of 3.2β
10β· nodes, 4.8β
10βΈ require arcs, and 3.1β
10βΈ exclude edges.
The analysis of the synthesized graphs reveals domain-specific architectural
patterns that provide practitioners with diagnostic indicators for quality
assessment and evolution planning. The tool and the graph dataset are publicly
available for reproducible research.}
}Strong4VM has a MIT License, and is built upon:
- MiniSat: MIT License
- ANTLR4: BSD License
- Ruben Heradio, rheradio@issi.uned.es
- Luis Cambelo, lcambelo1@alumno.uned.es
- Miguel A. Olivero, molivero@us.es
- JosΓ© Manuel SΓ‘nchez RuΓz, jsanchez7@us.es
- Alberto PΓ©rez GarcΓa-Plaza, alberto.perez@lsi.uned.es
- David FernΓ‘ndez AmorΓ³s, david@issi.uned.es
This work is funded by FEDER/Spanish Ministry of Science, Innovation and Universities (MCIN)/Agencia Estatal de Investigacion (AEI) under project COSY (PID2022-142043NB-I00).