Skip to main content

bdd-plugin for the automated analysis of feature models

Project description

BDD plugin for Flama (UNED version)

Description

This plugin supports Binary Decision Diagrams (BDDs) representations for feature models.

The plugin is based on flamapy and thus, it follows the same architecture.

The BDD plugin relies on the bbd4va library to synthetize and manipulate BDDs.

Requirements and Installation

pip install flamapy-fw flamapy-fm flamapy-bdd

We have tested the plugin on Linux.

Functionality and usage

The executable script test_bdd_metamodel.py serves as an entry point to show the plugin in action.

The following functionality is provided:

Load a feature model and create the BDD

from flamapy.metamodels.fm_metamodel.transformations import UVLReader
from flamapy.metamodels.bdd_metamodel.transformations import FmToBDD

# Load the feature model from UVLReader
feature_model = UVLReader('models/uvl_models/Pizzas.uvl').transform() 

# Create the BDD from the feature model
bdd_model = FmToBDD(feature_model).transform()

Save and load a BDD to/from a file

from flamapy.metamodels.bdd_metamodel.transformations import DDDMPWriter, DDDMPReader
# Save the BDD to a .dddmp file
DDDMPWriter(path='path/to/save/my_bdd.dddmp', source_model=bdd_model).transform()
# Load a BDD from a .dddmp file
bdd_model = DDDMPReader(path='path/to/my_bdd.dddmp').transform()

Analysis operations

  • Satisfiable

    Return whether the model is satisfiable (valid):

    from flamapy.metamodels.bdd_metamodel.operations import BDDSatisfiable
    satisfiable = BDDSatisfiable().execute(bdd_model).get_result()
    print(f'Satisfiable? (valid?): {satisfiable}')
    
  • Configurations number

    Return the number of configurations:

    from flamapy.metamodels.bdd_metamodel.operations import BDDConfigurationsNumber
    n_configs = BDDConfigurationsNumber().execute(bdd_model).get_result()
    print(f'#Configurations: {n_configs}')
    
  • Configurations

    Enumerate the configurations of the model:

    from flamapy.metamodels.bdd_metamodel.operations import BDDConfigurations
    configurations = BDDConfigurations().execute(bdd_model).get_result()
    for i, config in enumerate(configurations, 1):
        print(f'Config {i}: {[feat for feat in config.elements if config.elements[feat]]}')
    
  • Sampling

    Return a sample of the given size of uniform random configurations with or without replacement:

    from flamapy.metamodels.bdd_metamodel.operations import BDDSampling
    sampling_op = BDDSampling()
    sampling_op.set_sample_size(5)
    sampling_op.set_with_replacement(False)  # Default False
    sample = sampling_op.execute(bdd_model).get_result()
    for i, config in enumerate(sample, 1):
        print(f'Config {i}: {[feat for feat in config.elements if config.elements[feat]]}')
    
  • Product Distribution

    Return the number of products (configurations) having a given number of features:

    from flamapy.metamodels.bdd_metamodel.operations import BDDProductDistribution
    dist = BDDProductDistribution().execute(bdd_model).get_result()
    print(f'Product Distribution: {dist}')
    
  • Feature Inclusion Probability

    Return the probability for a feature to be included in a valid configuration:

    from flamapy.metamodels.bdd_metamodel.operations import BDDFeatureInclusionProbability
    prob = BDDFeatureInclusionProbability().execute(bdd_model).get_result()
    for feat in prob.keys():
        print(f'{feat}: {prob[feat]}')
    
  • Core features

    Return the core features (those features that are present in all the configurations):

    from flamapy.metamodels.bdd_metamodel.operations import BDDCoreFeatures
    core_features = BDDCoreFeatures().execute(bdd_model).get_result()
    print(f'Core features: {core_features}')
    
  • Dead features

    Return the dead features (those features that are not present in any configuration):

    from flamapy.metamodels.bdd_metamodel.operations import BDDDeadFeatures
    dead_features = BDDDeadFeatures().execute(bdd_model).get_result()
    print(f'Dead features: {dead_features}')
    

Contributing to the BDD plugin

To contribute in the development of this plugin:

  1. Fork the repository into your GitHub account.
  2. Clone the repository: git@github.com:<<username>>/bdd_metamodel_colosal.git
  3. Create a virtual environment: python -m venv env
  4. Activate the virtual environment: source env/bin/activate
  5. Install the plugin dependencies: pip install flamapy flamapy-fm
  6. Install the BDD plugin from the source code: pip install -e bdd_metamodel_colosal

Please try to follow the standards code quality to contribute to this plugin before creating a Pull Request:

  • To analyze your Python code and output information about errors, potential problems, convention violations and complexity, pass the prospector with:

    make lint

  • To analyze the static type checker for Python and find bugs, pass the Mypy:

    make mypy

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flamapy-bdd-colosal-2.1.0.dev0.tar.gz (18.3 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

flamapy_bdd_colosal-2.1.0.dev0-py3-none-any.whl (18.4 MB view details)

Uploaded Python 3

File details

Details for the file flamapy-bdd-colosal-2.1.0.dev0.tar.gz.

File metadata

  • Download URL: flamapy-bdd-colosal-2.1.0.dev0.tar.gz
  • Upload date:
  • Size: 18.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.18

File hashes

Hashes for flamapy-bdd-colosal-2.1.0.dev0.tar.gz
Algorithm Hash digest
SHA256 630af4cc1f74b932152ee929e1fd43a5a8ab565d164b3ec4dd9db50b88e0186a
MD5 a6afc7093ed21f2c14115ff953796d57
BLAKE2b-256 67a085d10c441f884ab33a157e694544088b0e4f661a16d2355709cf126b889e

See more details on using hashes here.

File details

Details for the file flamapy_bdd_colosal-2.1.0.dev0-py3-none-any.whl.

File metadata

File hashes

Hashes for flamapy_bdd_colosal-2.1.0.dev0-py3-none-any.whl
Algorithm Hash digest
SHA256 2e4a9013607e67819ac51ac2ec3c3502505f96863501d618b8aaa5cab3b1e8ff
MD5 3c4ef51b89735fcd19781721ba3a6976
BLAKE2b-256 7c03a514ff1dc191f60d76e0467221b2bfcb17f832e5889a27bd0942337b35da

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page