From 111cb67843f587ffdfb2dacefed0906acbc81e66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Miguel=20Horcas?= Date: Sun, 12 May 2024 20:41:09 +0200 Subject: [PATCH] Update BDD plugin --- .../bdd_metamodel/models/bdd_model.py | 104 +++-- .../operations/bdd_configurations.py | 9 +- .../operations/bdd_configurations_number.py | 10 +- .../bdd_feature_inclusion_probability.py | 211 +++++---- .../bdd_metamodel/operations/bdd_metrics.py | 47 +- .../operations/bdd_product_distribution.py | 36 +- .../bdd_metamodel/operations/bdd_sampling.py | 2 +- .../operations/bdd_satisfiable.py | 11 +- .../bdd_metamodel/transformations/__init__.py | 23 +- .../transformations/_bdd_writer.py | 27 ++ .../transformations/bdd_writer.py | 79 ---- .../transformations/dddmp_reader.py | 19 + .../transformations/dddmpv2_writer.py | 19 + .../transformations/dddmpv3_writer.py | 36 ++ .../transformations/fm_to_bdd.py | 10 +- .../transformations/json_reader.py | 36 ++ .../transformations/json_writer.py | 19 + .../transformations/pdf_writer.py | 8 + .../transformations/pickle_reader.py | 19 + .../transformations/pickle_writer.py | 17 + .../transformations/png_writer.py | 8 + .../transformations/sat_to_bdd.py | 13 +- .../transformations/svg_writer.py | 8 + setup.py | 2 +- test_bdd_metamodel.py | 154 ++++++ test_uned.py | 69 +++ .../input_fms/featureide_models/jHipster.xml | 224 --------- tests/input_fms/featureide_models/pizzas.xml | 29 -- tests/models/bdd_models/Pizzas.dddmp | 33 ++ tests/models/bdd_models/Pizzas.json | 21 + tests/models/bdd_models/Pizzas.p | Bin 0 -> 1514 bytes tests/models/bdd_models/Pizzas.pdf | Bin 0 -> 15365 bytes tests/models/bdd_models/Pizzas.png | Bin 0 -> 169046 bytes tests/models/bdd_models/Pizzas.svg | 438 ++++++++++++++++++ tests/models/bdd_models/Pizzas_uned.dddmp | 34 ++ tests/models/bdd_models/Pizzas_v2.dddmp | 32 ++ .../uvl_models/JHipster.uvl | 0 .../uvl_models/Pizzas.uvl | 0 .../uvl_models/Pizzas_complex.uvl | 0 39 files changed, 1290 insertions(+), 517 deletions(-) create mode 100644 flamapy/metamodels/bdd_metamodel/transformations/_bdd_writer.py delete mode 100644 flamapy/metamodels/bdd_metamodel/transformations/bdd_writer.py create mode 100644 flamapy/metamodels/bdd_metamodel/transformations/dddmp_reader.py create mode 100644 flamapy/metamodels/bdd_metamodel/transformations/dddmpv2_writer.py create mode 100644 flamapy/metamodels/bdd_metamodel/transformations/dddmpv3_writer.py create mode 100644 flamapy/metamodels/bdd_metamodel/transformations/json_reader.py create mode 100644 flamapy/metamodels/bdd_metamodel/transformations/json_writer.py create mode 100644 flamapy/metamodels/bdd_metamodel/transformations/pdf_writer.py create mode 100644 flamapy/metamodels/bdd_metamodel/transformations/pickle_reader.py create mode 100644 flamapy/metamodels/bdd_metamodel/transformations/pickle_writer.py create mode 100644 flamapy/metamodels/bdd_metamodel/transformations/png_writer.py create mode 100644 flamapy/metamodels/bdd_metamodel/transformations/svg_writer.py create mode 100644 test_bdd_metamodel.py create mode 100644 test_uned.py delete mode 100644 tests/input_fms/featureide_models/jHipster.xml delete mode 100644 tests/input_fms/featureide_models/pizzas.xml create mode 100644 tests/models/bdd_models/Pizzas.dddmp create mode 100644 tests/models/bdd_models/Pizzas.json create mode 100644 tests/models/bdd_models/Pizzas.p create mode 100644 tests/models/bdd_models/Pizzas.pdf create mode 100644 tests/models/bdd_models/Pizzas.png create mode 100644 tests/models/bdd_models/Pizzas.svg create mode 100644 tests/models/bdd_models/Pizzas_uned.dddmp create mode 100644 tests/models/bdd_models/Pizzas_v2.dddmp rename tests/{input_fms => models}/uvl_models/JHipster.uvl (100%) rename tests/{input_fms => models}/uvl_models/Pizzas.uvl (100%) rename tests/{input_fms => models}/uvl_models/Pizzas_complex.uvl (100%) diff --git a/flamapy/metamodels/bdd_metamodel/models/bdd_model.py b/flamapy/metamodels/bdd_metamodel/models/bdd_model.py index ed105cc..616ad6f 100644 --- a/flamapy/metamodels/bdd_metamodel/models/bdd_model.py +++ b/flamapy/metamodels/bdd_metamodel/models/bdd_model.py @@ -1,9 +1,11 @@ -from typing import Optional +from typing import Optional, Any -from dd.autoref import BDD, Function +try: + import dd.cudd as _bdd +except ImportError: + import dd.autoref as _bdd from flamapy.core.models import VariabilityModel - from flamapy.metamodels.bdd_metamodel.models.utils.txtcnf import ( CNFLogicConnective, TextCNFNotation, @@ -26,43 +28,41 @@ def get_extension() -> str: return 'bdd' def __init__(self) -> None: - self.bdd = BDD() # BDD manager - self.cnf_formula: Optional[str] = None - self.root: Optional[Function] = None - self.variables: list[str] = [] + self.bdd = _bdd.BDD() # BDD manager + self.root: Optional[_bdd.Function] = None + self.variables: dict[str, int] = {} - def from_textual_cnf(self, textual_cnf_formula: str, variables: list[str]) -> None: + @classmethod + def from_textual_cnf(cls, cnf_formula: str, variables: list[str]) -> 'BDDModel': """Build the BDD from a textual representation of the CNF formula, and the list of variables.""" - self.cnf_formula = textual_cnf_formula - self.variables = variables - + bdd_model = cls() # Declare variables - for var in self.variables: - self.bdd.declare(var) - + for var in variables: + bdd_model.bdd.declare(var) # Build the BDD - self.root = self.bdd.add_expr(self.cnf_formula) + bdd_model.root = bdd_model.bdd.add_expr(cnf_formula) + # Store variables + bdd_model.variables = bdd_model.bdd.vars + return bdd_model def nof_nodes(self) -> int: """Return number of nodes in the BDD.""" return len(self.bdd) - def get_node(self, index: int) -> Function: - """Return the node at the given position (index).""" - return self.bdd.var(self.bdd.var_at_level(index)) + def get_node(self, var: Any) -> _bdd.Function: + """Return the node of the named var 'var'.""" + return self.bdd.var(var) - @staticmethod - def level(node: Function) -> int: + def level(self, node: _bdd.Function) -> int: """Return the level of the node. Non-terminal nodes start at 0. Terminal nodes have level `s' being the `s' the number of variables. """ - return node.level + return node.level if not self.is_terminal_node(node) else len(self.bdd.vars) - @staticmethod - def index(node: Function) -> int: + def index(self, node: _bdd.Function) -> int: """Position (index) of the variable that labels the node `n` in the ordering. Indexes start at 1. @@ -72,42 +72,62 @@ def index(node: Function) -> int: Example: node `n4` is labeled `B`, and `B` is in the 2nd position in ordering `[A,B,C]`, thus level(n4) = 2. """ - return node.level + 1 + return self.level(node) + 1 - @staticmethod - def is_terminal_node(node: Function) -> bool: + def is_terminal_node(self, node: Any) -> bool: """Check if the node is a terminal node.""" - return node.var is None + #return node.var is None + return self.is_terminal_n0(node) or self.is_terminal_n1(node) - @staticmethod - def is_terminal_n1(node: Function) -> bool: + def is_terminal_n1(self, node: Any) -> bool: """Check if the node is the terminal node 1 (n1).""" - return node.var is None and node.node == 1 + return node == self.bdd.true - @staticmethod - def is_terminal_n0(node: Function) -> bool: + def is_terminal_n0(self, node: Any) -> bool: """Check if the node is the terminal node 0 (n0).""" - return node.var is None and node.node == -1 + return node == self.bdd.false - @staticmethod - def get_high_node(node: Function) -> Optional[Function]: + def get_high_node(self, node: _bdd.Function) -> Optional[_bdd.Function]: """Return the high (right, solid) node.""" return node.high - @staticmethod - def get_low_node(node: Function) -> Optional[Function]: + def get_low_node(self, node: _bdd.Function) -> Optional[_bdd.Function]: """Return the low (left, dashed) node. If the arc is complemented it returns the negation of the left node. """ return node.low - @staticmethod - def get_value(node: Function, complemented: bool = False) -> int: + def get_value(self, node: _bdd.Function, complemented: bool = False) -> int: """Return the value (id) of the node considering complemented arcs.""" - value = node.node - if BDDModel.is_terminal_n0(node): + value = int(node) + if self.is_terminal_n0(node): value = 1 if complemented else 0 - elif BDDModel.is_terminal_n1(node): + elif self.is_terminal_n1(node): value = 0 if complemented else 1 return value + + def __str__(self) -> str: + result = f'Root: {self.root.var} ' \ + f'(id: {int(self.root)}) ' \ + f'(level: {self.level(self.root)}) ' \ + f'(index: {self.index(self.root)})\n' + result += f'Vars: ({len(self.bdd.vars)})\n' + var_levels = dict(sorted(self.bdd.var_levels.items(), key=lambda item: item[1])) + for var in var_levels: + node = self.get_node(var) + result += f' |-{node.var} ' \ + f'(id: {int(node)}) ' \ + f'(level: {self.level(node)}) ' \ + f'(index: {self.index(node)})\n' + node = self.bdd.false + result += f'Terminal node (n0): {node.var} ' \ + f'(id: {int(node)}) ' \ + f'(level: {self.level(node)}) ' \ + f'(index: {self.index(node)})\n' + node = self.bdd.true + result += f'Terminal node (n1): {node.var} ' \ + f'(id: {int(node)}) ' \ + f'(level: {self.level(node)}) ' \ + f'(index: {self.index(node)})\n' + return result diff --git a/flamapy/metamodels/bdd_metamodel/operations/bdd_configurations.py b/flamapy/metamodels/bdd_metamodel/operations/bdd_configurations.py index 9895a60..d3d7977 100644 --- a/flamapy/metamodels/bdd_metamodel/operations/bdd_configurations.py +++ b/flamapy/metamodels/bdd_metamodel/operations/bdd_configurations.py @@ -1,9 +1,9 @@ from typing import Optional, cast from flamapy.core.models import VariabilityModel -from flamapy.metamodels.configuration_metamodel.models.configuration import Configuration from flamapy.core.operations import Configurations -from flamapy.metamodels.bdd_metamodel.models.bdd_model import BDDModel +from flamapy.metamodels.configuration_metamodel.models import Configuration +from flamapy.metamodels.bdd_metamodel.models import BDDModel class BDDConfigurations(Configurations): @@ -12,8 +12,11 @@ class BDDConfigurations(Configurations): It also supports the computation of all solutions from a partial configuration. """ - def __init__(self, partial_configuration: Optional[Configuration] = None) -> None: + def __init__(self) -> None: self.result: list[Configuration] = [] + self.partial_configuration: Optional[Configuration] = None + + def set_partial_configuration(self, partial_configuration: Configuration) -> None: self.partial_configuration = partial_configuration def execute(self, model: VariabilityModel) -> 'BDDConfigurations': diff --git a/flamapy/metamodels/bdd_metamodel/operations/bdd_configurations_number.py b/flamapy/metamodels/bdd_metamodel/operations/bdd_configurations_number.py index cd36e41..5399947 100644 --- a/flamapy/metamodels/bdd_metamodel/operations/bdd_configurations_number.py +++ b/flamapy/metamodels/bdd_metamodel/operations/bdd_configurations_number.py @@ -1,9 +1,9 @@ from typing import Optional, cast from flamapy.core.models import VariabilityModel -from flamapy.metamodels.configuration_metamodel.models.configuration import Configuration from flamapy.core.operations import ConfigurationsNumber -from flamapy.metamodels.bdd_metamodel.models.bdd_model import BDDModel +from flamapy.metamodels.configuration_metamodel.models import Configuration +from flamapy.metamodels.bdd_metamodel.models import BDDModel class BDDConfigurationsNumber(ConfigurationsNumber): @@ -12,8 +12,11 @@ class BDDConfigurationsNumber(ConfigurationsNumber): It also supports counting the solutions from a given partial configuration. """ - def __init__(self, partial_configuration: Optional[Configuration] = None) -> None: + def __init__(self) -> None: self.result = 0 + self.partial_configuration: Optional[Configuration] = None + + def set_partial_configuration(self, partial_configuration: Optional[Configuration]) -> None: self.partial_configuration = partial_configuration def execute(self, model: VariabilityModel) -> 'BDDConfigurationsNumber': @@ -37,5 +40,4 @@ def configurations_number(bdd_model: BDDModel, values = dict(partial_configuration.elements.items()) u_func = bdd_model.bdd.let(values, bdd_model.root) n_vars = len(bdd_model.variables) - len(values) - return bdd_model.bdd.count(u_func, nvars=n_vars) diff --git a/flamapy/metamodels/bdd_metamodel/operations/bdd_feature_inclusion_probability.py b/flamapy/metamodels/bdd_metamodel/operations/bdd_feature_inclusion_probability.py index d0f5f59..f2797f0 100644 --- a/flamapy/metamodels/bdd_metamodel/operations/bdd_feature_inclusion_probability.py +++ b/flamapy/metamodels/bdd_metamodel/operations/bdd_feature_inclusion_probability.py @@ -1,22 +1,19 @@ from typing import Any, Optional, cast from collections import defaultdict -from dd.autoref import Function +#from dd.autoref import Function from flamapy.core.models import VariabilityModel from flamapy.metamodels.configuration_metamodel.models.configuration import Configuration from flamapy.metamodels.bdd_metamodel.models import BDDModel from flamapy.metamodels.bdd_metamodel.operations.interfaces import FeatureInclusionProbability -from flamapy.metamodels.bdd_metamodel.operations import BDDConfigurations +from flamapy.metamodels.bdd_metamodel.operations import BDDConfigurationsNumber class BDDFeatureInclusionProbability(FeatureInclusionProbability): """The Feature Inclusion Probability (FIP) operation determines the probability for a variable to be included in a valid solution. - This is a brute-force implementation that enumerates all solutions - for calculating the probabilities. - Ref.: [Heradio et al. 2019. Supporting the Statistical Analysis of Variability Models. SPLC. (https://doi.org/10.1109/ICSE.2019.00091)] """ @@ -28,6 +25,7 @@ def __init__(self, partial_configuration: Optional[Configuration] = None) -> Non def execute(self, model: VariabilityModel) -> 'BDDFeatureInclusionProbability': bdd_model = cast(BDDModel, model) self.result = feature_inclusion_probability(bdd_model, self.partial_configuration) + #self.result = variable_probabilities_single_traverse(bdd_model) return self def get_result(self) -> dict[Any, float]: @@ -39,98 +37,133 @@ def feature_inclusion_probability(self) -> dict[Any, float]: def feature_inclusion_probability(bdd_model: BDDModel, config: Optional[Configuration] = None) -> dict[Any, float]: - products = BDDConfigurations(config).execute(bdd_model).get_result() - n_products = len(products) - if n_products == 0: - return {feature: 0.0 for feature in bdd_model.variables} - - prob = {} - for feature in bdd_model.variables: - prob[feature] = sum(feature in p.elements for p in products) / n_products + n_configs_op = BDDConfigurationsNumber() + n_configs_op.set_partial_configuration(config) + total_configs = n_configs_op.execute(bdd_model).get_result() + + prob: dict[Any, float] = defaultdict(float) + if config is None: + for feature in bdd_model.variables: + values = {feature: True} + u_func = bdd_model.bdd.let(values, bdd_model.root) + n_vars = len(bdd_model.variables) - len(values) + prob[feature] = bdd_model.bdd.count(u_func, nvars=n_vars) / total_configs + else: + values = dict(config.elements.items()) + for feature in bdd_model.variables: + feature_selected = values.get(feature, None) + values = {feature: True} + u_func = bdd_model.bdd.let(values, bdd_model.root) + n_vars = len(bdd_model.variables) - len(values) + prob[feature] = bdd_model.bdd.count(u_func, nvars=n_vars) / total_configs + if feature_selected is None: + values.pop(feature) + else: + values[feature] = feature_selected return prob +## TODO: The following is the optimized implementation from UNED +## Algoritm available in the paper: https://doi.org/10.1109/ICSE.2019.00091 +## Currently, the implementation is not correct at all. + # def feature_inclusion_probability(bdd_model: BDDModel, # config: Optional[Configuration] = None) -> dict[Any, float]: # root = bdd_model.root -# id_root = BDDModel.get_value(root, root.negated) +# id_root = bdd_model.get_value(root, root.negated) # prob: dict[int, float] = defaultdict(float) # prob[id_root] = 1/2 # mark: dict[int, bool] = defaultdict(bool) -# get_node_pr(root, prob, mark, root.negated) +# get_node_pr(bdd_model, root, prob, mark, root.negated) -# prob_n_phi: dict[int, float] = defaultdict(float) +# prob_n_phi: dict[tuple[int, Any], float] = defaultdict(float) +# prob_phi_n: dict[tuple[int, Any], float] = defaultdict(float) # mark: dict[int, bool] = defaultdict(bool) -# get_join_pr(root, prob, prob_n_phi, mark, root.negated) -# # prob_phi = BDDModel. -# # return dist[id_root] - - -def get_node_pr(node: Function, - prob: dict[int, float], - mark: dict[int, bool], - complemented: bool) -> float: - id_node = BDDModel.get_value(node, complemented) - mark[id_node] = mark[id_node] - - if not BDDModel.is_terminal_node(node): - - # explore low - low = BDDModel.get_low_node(node) - id_low = BDDModel.get_value(low, complemented) - if BDDModel.is_terminal_node(low): - prob[id_low] = prob[id_low] + prob[id_node] - else: - prob[id_low] = prob[id_low] + prob[id_node]/2 - - if mark[id_node] != mark[id_low]: - get_node_pr(low, prob, mark, complemented ^ low.negated) - - # explore high - high = BDDModel.get_high_node(node) - id_high = BDDModel.get_value(high, complemented) - if BDDModel.is_terminal_node(high): - prob[id_high] = prob[id_high] + prob[id_node] - else: - prob[id_high] = prob[id_high] + prob[id_node]/2 - - if mark[id_node] != mark[id_high]: - get_node_pr(high, prob, mark, complemented ^ high.negated) - - -def get_join_pr(node: Function, - prob: dict[int, float], - prob_n_phi: dict[int, float], - mark: dict[int, bool], - complemented: bool) -> float: - id_node = BDDModel.get_value(node, complemented) - mark[id_node] = mark[id_node] - - if not BDDModel.is_terminal_node(node): - - # explore low - low = BDDModel.get_low_node(node) - id_low = BDDModel.get_value(low, complemented) - if low == node: - pass - - - # if BDDModel.is_terminal_node(low): - # prob[id_low] = prob[id_low] + prob[id_node] - # else: - # prob[id_low] = prob[id_low] + prob[id_node]/2 - - # if mark[id_node] != mark[id_low]: - # get_node_pr(low, prob, mark, complemented ^ low.negated) - - # # explore high - # high = BDDModel.get_high_node(node) - # id_high = BDDModel.get_value(high, complemented) - # if BDDModel.is_terminal_node(high): - # prob[id_high] = prob[id_high] + prob[id_node] - # else: - # prob[id_high] = prob[id_high] + prob[id_node]/2 - - # if mark[id_node] != mark[id_high]: - # get_node_pr(high, prob, mark, complemented ^ high.negated) - \ No newline at end of file +# get_joint_pr(bdd_model, root, prob, prob_n_phi, prob_phi_n, mark, root.negated) + +# fip = {} +# for xj in bdd_model.variables: +# xj_node = bdd_model.get_node(xj) +# xj_id = bdd_model.get_value(xj_node) +# fip[xj] = prob_n_phi[xj_id] / prob[1] +# return fip + + +# def get_node_pr(bdd_model: BDDModel, +# node: Function, +# prob: dict[int, float], +# mark: dict[int, bool], +# complemented: bool) -> None: +# id_node = bdd_model.get_value(node, complemented) +# mark[id_node] = not mark[id_node] + +# if not bdd_model.is_terminal_node(node): + +# # explore low +# low = bdd_model.get_low_node(node) +# id_low = bdd_model.get_value(low, complemented) +# if bdd_model.is_terminal_node(low): +# prob[id_low] = prob[id_low] + prob[id_node] +# else: +# prob[id_low] = prob[id_low] + (prob[id_node] / 2) +# if mark[id_node] != mark[id_low]: +# get_node_pr(bdd_model, low, prob, mark, complemented ^ low.negated) + +# # explore high +# high = bdd_model.get_high_node(node) +# id_high = bdd_model.get_value(high, complemented) +# if bdd_model.is_terminal_node(high): +# prob[id_high] = prob[id_high] + prob[id_node] +# else: +# prob[id_high] = prob[id_high] + (prob[id_node] / 2) +# if mark[id_node] != mark[id_high]: +# get_node_pr(bdd_model, high, prob, mark, complemented ^ high.negated) + + +# def get_joint_pr(bdd_model: BDDModel, +# node: Function, +# prob: dict[int, float], +# prob_n_phi: dict[tuple[int, Any], float], +# prob_phi_n: dict[tuple[int, Any], float], +# mark: dict[int, bool], +# complemented: bool) -> None: +# id_node = bdd_model.get_value(node, complemented) +# mark[id_node] = not mark[id_node] + +# if not bdd_model.is_terminal_node(node): + +# # explore low +# low = bdd_model.get_low_node(node) +# id_low = bdd_model.get_value(low, complemented) +# if bdd_model.is_terminal_n0(low): +# prob_phi_n[(id_node, False)] = 0.0 +# elif bdd_model.is_terminal_n1(low): +# prob_phi_n[(id_node, False)] = 1.0 +# else: +# if mark[id_node] != mark[id_low]: +# get_joint_pr(bdd_model, low, prob, prob_n_phi, prob_phi_n, mark, complemented ^ low.negated) +# prob_phi_n[(id_node, False)] = prob_phi_n[(id_low, None)] / (2 * prob[id_low]) +# prob_n_phi[(id_node, False)] = prob_phi_n[(id_node, False)] * prob[id_node] + +# # explore high +# high = bdd_model.get_high_node(node) +# id_high = bdd_model.get_value(high, complemented) +# if bdd_model.is_terminal_n0(high): +# prob_phi_n[(id_node, True)] = 0.0 +# elif bdd_model.is_terminal_n1(high): +# prob_phi_n[(id_node, True)] = 1.0 +# else: +# if mark[id_node] != mark[id_high]: +# get_joint_pr(bdd_model, high, prob, prob_n_phi, prob_phi_n, mark, complemented ^ high.negated) +# prob_phi_n[(id_node, True)] = prob_phi_n[(id_high, None)] / (2 * prob[id_high]) +# prob_n_phi[(id_node, True)] = prob_phi_n[(id_node, True)] * prob[id_node] + +# # Combine both low and high +# prob_phi_n[(id_node, None)] = prob_phi_n[(id_node, True)] + prob_phi_n[(id_node, False)] +# prob_n_phi[bdd_model.index(node)] = prob[bdd_model.index(node)] + prob_n_phi[id_node] + +# # Add joint probabilities of the removed nodes +# for xj in range(bdd_model.index(node) + 1, bdd_model.index(high)): +# prob_n_phi[xj] = prob_n_phi[xj] + (prob_n_phi[(id_node, True)] / 2) +# for xj in range(bdd_model.index(node) + 1, bdd_model.index(low)): +# prob_n_phi[xj] = prob_n_phi[xj] + (prob_n_phi[(id_node, False)] / 2) diff --git a/flamapy/metamodels/bdd_metamodel/operations/bdd_metrics.py b/flamapy/metamodels/bdd_metamodel/operations/bdd_metrics.py index 0d00139..5a91a45 100644 --- a/flamapy/metamodels/bdd_metamodel/operations/bdd_metrics.py +++ b/flamapy/metamodels/bdd_metamodel/operations/bdd_metrics.py @@ -30,9 +30,7 @@ def __init__(self) -> None: self.model: Optional[VariabilityModel] = None self.result: list[dict[str, Any]] = [] self.model_type_extension = "bdd" - self._features: dict[int, str] = {} - self._common_features: list[Any] = [] - self._dead_features: list[Any] = [] + self._features: list[Any] = [] def get_result(self) -> list[dict[str, Any]]: return self.result @@ -41,6 +39,7 @@ def calculate_metamodel_metrics(self, model: VariabilityModel) -> list[dict[str, self.model = cast(BDDModel, model) #Do some basic calculations to speedup the rest + self._features = self.model.variables # Get all methods that are marked with the metric_method decorator metric_methods = [getattr(self, method_name) for method_name in dir(self) @@ -53,13 +52,13 @@ def calculate_metamodel_metrics(self, model: VariabilityModel) -> list[dict[str, return [method() for method in metric_methods] @metric_method - def valid(self) -> dict[str, Any]: - """A feature model is valid if it represents at least one configuration.""" + def satisfiable(self) -> dict[str, Any]: + """A feature model is satisfiable if it represents at least one configuration.""" if self.model is None: raise FlamaException('Model not initialized.') - name = "Valid (not void)" - _valid = bdd_operations.BDDValid().execute(self.model).get_result() - result = self.construct_result(name=name, doc=self.valid.__doc__, result=_valid) + name = "satisfiable (valid) (not void)" + _satisfiable = bdd_operations.BDDSatisfiable().execute(self.model).get_result() + result = self.construct_result(name=name, doc=self.satisfiable.__doc__, result=_satisfiable) return result @metric_method @@ -94,7 +93,7 @@ def configurations(self) -> dict[str, Any]: if self.model is None: raise FlamaException('Model not initialized.') name = "Configurations" - _configurations = bdd_operations.BDDProducts().execute(self.model).get_result() + _configurations = bdd_operations.BDDConfigurations().execute(self.model).get_result() result = self.construct_result(name=name, doc=self.configurations.__doc__, result=_configurations, @@ -107,9 +106,35 @@ def number_of_configurations(self) -> dict[str, Any]: if self.model is None: raise FlamaException('Model not initialized.') name = "Configurations" - _configurations = bdd_operations.BDDProductsNumber().execute(self.model).get_result() + _configurations = bdd_operations.BDDConfigurationsNumber().execute(self.model).get_result() result = self.construct_result(name=name, - doc=self.configurations.__doc__, + doc=self.number_of_configurations.__doc__, result=_configurations, size=None) return result + + @metric_method + def product_distribution(self) -> dict[str, Any]: + """Product distribution of the feature model.""" + if self.model is None: + raise FlamaException('Model not initialized.') + name = "Product distribution" + _dist = bdd_operations.BDDProductDistribution().execute(self.model).get_result() + result = self.construct_result(name=name, + doc=self.product_distribution.__doc__, + result=_dist, + size=None) + return result + + @metric_method + def feature_inclusion_probabilities(self) -> dict[str, Any]: + """Feature inclusion probabilities of the feature model.""" + if self.model is None: + raise FlamaException('Model not initialized.') + name = "Feature inclusion probabilities" + _prob = bdd_operations.BDDFeatureInclusionProbability().execute(self.model).get_result() + result = self.construct_result(name=name, + doc=self.feature_inclusion_probabilities.__doc__, + result=_prob, + size=None) + return result \ No newline at end of file diff --git a/flamapy/metamodels/bdd_metamodel/operations/bdd_product_distribution.py b/flamapy/metamodels/bdd_metamodel/operations/bdd_product_distribution.py index b735501..85a1c87 100644 --- a/flamapy/metamodels/bdd_metamodel/operations/bdd_product_distribution.py +++ b/flamapy/metamodels/bdd_metamodel/operations/bdd_product_distribution.py @@ -48,47 +48,49 @@ def product_distribution(bdd_model: BDDModel) -> list[int]: + In index n, the number of products with n features activated. """ root = bdd_model.root - id_root = BDDModel.get_value(root, root.negated) + id_root = bdd_model.get_value(root, root.negated) dist: dict[int, list[int]] = {0: [], 1: [1]} mark: dict[int, bool] = defaultdict(bool) - get_prod_dist(root, dist, mark, root.negated) - return dist[id_root] + get_prod_dist(bdd_model, root, dist, mark, root.negated) + # Complete distribution + distribution = dist[id_root] + [0] * (len(bdd_model.variables) + 1 - len(dist[id_root])) + return distribution -def get_prod_dist(node: Function, +def get_prod_dist(bdd_model: BDDModel, + node: Function, dist: dict[int, list[int]], mark: dict[int, bool], complemented: bool) -> None: - id_node = BDDModel.get_value(node, complemented) + id_node = bdd_model.get_value(node, complemented) mark[id_node] = not mark[id_node] - if not BDDModel.is_terminal_node(node): + if not bdd_model.is_terminal_node(node): # traverse - low = BDDModel.get_low_node(node) - id_low = BDDModel.get_value(low, complemented) - + low = bdd_model.get_low_node(node) + id_low = bdd_model.get_value(low, complemented) if mark[id_node] != mark[id_low]: - get_prod_dist(low, dist, mark, complemented ^ low.negated) + get_prod_dist(bdd_model, low, dist, mark, complemented ^ low.negated) # compute low_dist to account for the removed nodes through low - removed_nodes = BDDModel.index(low) - BDDModel.index(node) - 1 + removed_nodes = bdd_model.index(low) - bdd_model.index(node) - 1 low_dist = [0] * (removed_nodes + len(dist[id_low])) for i in range(removed_nodes + 1): for j in range(len(dist[id_low])): low_dist[i + j] = low_dist[i + j] + dist[id_low][j] * math.comb(removed_nodes, i) # traverse - high = BDDModel.get_high_node(node) - id_high = BDDModel.get_value(high, complemented) + high = bdd_model.get_high_node(node) + id_high = bdd_model.get_value(high, complemented) - high = BDDModel.get_high_node(node) - id_high = BDDModel.get_value(high, complemented) + high = bdd_model.get_high_node(node) + id_high = bdd_model.get_value(high, complemented) if mark[id_node] != mark[id_high]: - get_prod_dist(high, dist, mark, complemented ^ high.negated) + get_prod_dist(bdd_model, high, dist, mark, complemented ^ high.negated) # compute high_dist to account for the removed nodes through high - removed_nodes = BDDModel.index(high) - BDDModel.index(node) - 1 + removed_nodes = bdd_model.index(high) - bdd_model.index(node) - 1 high_dist = [0] * (removed_nodes + len(dist[id_high])) for i in range(removed_nodes + 1): for j in range(len(dist[id_high])): diff --git a/flamapy/metamodels/bdd_metamodel/operations/bdd_sampling.py b/flamapy/metamodels/bdd_metamodel/operations/bdd_sampling.py index 84e9de4..c737ad5 100644 --- a/flamapy/metamodels/bdd_metamodel/operations/bdd_sampling.py +++ b/flamapy/metamodels/bdd_metamodel/operations/bdd_sampling.py @@ -4,7 +4,7 @@ from flamapy.core.models import VariabilityModel from flamapy.core.exceptions import FlamaException from flamapy.core.operations import Sampling -from flamapy.metamodels.configuration_metamodel.models.configuration import Configuration +from flamapy.metamodels.configuration_metamodel.models import Configuration from flamapy.metamodels.bdd_metamodel.models import BDDModel diff --git a/flamapy/metamodels/bdd_metamodel/operations/bdd_satisfiable.py b/flamapy/metamodels/bdd_metamodel/operations/bdd_satisfiable.py index cdc2a58..6dc3adb 100644 --- a/flamapy/metamodels/bdd_metamodel/operations/bdd_satisfiable.py +++ b/flamapy/metamodels/bdd_metamodel/operations/bdd_satisfiable.py @@ -3,10 +3,16 @@ from flamapy.core.models import VariabilityModel from flamapy.core.operations import Satisfiable from flamapy.metamodels.bdd_metamodel.models import BDDModel -from flamapy.metamodels.bdd_metamodel.operations import BDDConfigurationsNumber class BDDSatisfiable(Satisfiable): + """Checks if the BDD is not equal to its false terminal node to determine satisfiability. + + If the BDD is not equal to the false node, it means there exists at least one valid assignment + of variables that satisfies the formula, indicating that the formula is satisfiable. + Otherwise, if the BDD is equal to the false node, it means no valid assignment of variables + satisfies the formula, indicating that the formula is not satisfiable. + """ def __init__(self) -> None: self.result: bool = False @@ -24,5 +30,4 @@ def execute(self, model: VariabilityModel) -> 'BDDSatisfiable': def is_satisfiable(bdd_model: BDDModel) -> bool: - n_configs = BDDConfigurationsNumber().execute(bdd_model).get_result() - return n_configs > 0 + return not bdd_model.is_terminal_n0(bdd_model.root) diff --git a/flamapy/metamodels/bdd_metamodel/transformations/__init__.py b/flamapy/metamodels/bdd_metamodel/transformations/__init__.py index 1e5d100..d31eda9 100644 --- a/flamapy/metamodels/bdd_metamodel/transformations/__init__.py +++ b/flamapy/metamodels/bdd_metamodel/transformations/__init__.py @@ -1,5 +1,24 @@ from .fm_to_bdd import FmToBDD -from .bdd_writer import BDDWriter +from .json_writer import JSONWriter +from .json_reader import JSONReader +from .pickle_writer import PickleWriter +from .pickle_reader import PickleReader +from .dddmpv2_writer import DDDMPv2Writer +from .dddmpv3_writer import DDDMPv3Writer +from .dddmp_reader import DDDMPReader +from .png_writer import PNGWriter +from .svg_writer import SVGWriter +from .pdf_writer import PDFWriter -__all__ = ['FmToBDD', 'BDDWriter'] \ No newline at end of file +__all__ = ['FmToBDD', + 'JSONWriter', + 'JSONReader', + 'PickleWriter', + 'PickleReader', + 'DDDMPv2Writer', + 'DDDMPv3Writer', + 'DDDMPReader', + 'PNGWriter', + 'SVGWriter', + 'PDFWriter'] diff --git a/flamapy/metamodels/bdd_metamodel/transformations/_bdd_writer.py b/flamapy/metamodels/bdd_metamodel/transformations/_bdd_writer.py new file mode 100644 index 0000000..ea74901 --- /dev/null +++ b/flamapy/metamodels/bdd_metamodel/transformations/_bdd_writer.py @@ -0,0 +1,27 @@ +from typing import Any + +from flamapy.core.transformations import ModelToText +from flamapy.metamodels.bdd_metamodel.models import BDDModel + + +class BDDWriter(ModelToText): + + def __init__(self, path: str, source_model: BDDModel) -> None: + self.path = path + self.source_model = source_model + self._roots = None + + def set_roots(self, roots: Any) -> None: + self._roots = roots + + def transform(self) -> str: + if self._roots is None: + try: + self.source_model.bdd.dump(filename=self.path, + filetype=self.get_destination_extension()) + except Exception: + self._roots = [self.source_model.root] + self.source_model.bdd.dump(filename=self.path, + roots=self._roots, + filetype=self.get_destination_extension()) + return '' diff --git a/flamapy/metamodels/bdd_metamodel/transformations/bdd_writer.py b/flamapy/metamodels/bdd_metamodel/transformations/bdd_writer.py deleted file mode 100644 index 1a96215..0000000 --- a/flamapy/metamodels/bdd_metamodel/transformations/bdd_writer.py +++ /dev/null @@ -1,79 +0,0 @@ -import os -from typing import Optional -from enum import Enum - -from dd.autoref import Function - -from flamapy.core.transformations import ModelToText - -from flamapy.metamodels.bdd_metamodel.models.bdd_model import BDDModel - - -class BDDDumpFormat(Enum): - """Possible output format for representing a BDD.""" - DDDMP_V3 = 'dddmp' - DDDMP_V2 = 'dddmp2' - PDF = 'pdf' - PNG = 'png' - SVG = 'svg' - - -class BDDWriter(ModelToText): - """Create the dump file representing the argument BDD. - - The format can be: - - dddmp v3: `'.dddmp'` (default) - - dddmp v2: `'.dddmp2'` - - PDF: `'.pdf'` - - PNG: `'.png'` - - SVG: `'.svg'` - """ - - @staticmethod - def get_destination_extension() -> str: - return BDDDumpFormat.DDDMP_V3.value - - def __init__(self, path: str, source_model: BDDModel, roots: Optional[list[Function]] = None, - output_format: BDDDumpFormat = BDDDumpFormat.DDDMP_V3) -> None: - self._path = path - self._source_model = source_model - self._output_format = output_format - self._roots = roots - - def set_format(self, output_format: BDDDumpFormat) -> None: - self._output_format = output_format - - def set_roots(self, roots: list[Function]) -> None: - self._roots = roots - - def transform(self) -> str: - self._source_model.bdd.dump(filename=self._path, roots=self._roots) - if self._output_format == BDDDumpFormat.DDDMP_V3: - # Convert to dddmp format version 3.0 (adding the '.varnames' field) - result = dddmp_v2_to_v3(self._path) - elif self._output_format == BDDDumpFormat.DDDMP_V2: - with open(self._path, 'r', encoding='utf-8') as file: - result = os.linesep.join(file.readlines()) - else: - result = '' - return result - - -def dddmp_v2_to_v3(filepath: str) -> str: - """Convert the file with the BDD dump in format dddmp version 2 to version 3. - - The difference between versions 2.0 and 3.0 is the addition of the '.varnames' field. - """ - with open(filepath, 'r', encoding='utf-8') as file: - lines = file.readlines() - # Change version from 2.0 to 3.0 - i, line = next((i, l) for i, l in enumerate(lines) if '.ver DDDMP-2.0' in l) - lines[i] = line.replace('2.0', '3.0') - - # Add '.varnames' field - i, line = next((i, l) for i, l in enumerate(lines) if '.orderedvarnames' in l) - lines.insert(i - 1, line.replace('.orderedvarnames', '.varnames')) - - with open(filepath, 'w', encoding='utf-8') as file: - file.writelines(lines) - return os.linesep.join(lines) diff --git a/flamapy/metamodels/bdd_metamodel/transformations/dddmp_reader.py b/flamapy/metamodels/bdd_metamodel/transformations/dddmp_reader.py new file mode 100644 index 0000000..b9ebc20 --- /dev/null +++ b/flamapy/metamodels/bdd_metamodel/transformations/dddmp_reader.py @@ -0,0 +1,19 @@ +from flamapy.core.transformations import TextToModel +from flamapy.metamodels.bdd_metamodel.models import BDDModel + + +class DDDMPReader(TextToModel): + + @staticmethod + def get_source_extension() -> str: + return 'dddmp' + + def __init__(self, path: str) -> None: + self.path: str = path + + def transform(self) -> BDDModel: + bdd_model = BDDModel() + bdd_model.root = bdd_model.bdd.load(self.path)[0] + + bdd_model.variables = list(bdd_model.bdd.vars) + return bdd_model diff --git a/flamapy/metamodels/bdd_metamodel/transformations/dddmpv2_writer.py b/flamapy/metamodels/bdd_metamodel/transformations/dddmpv2_writer.py new file mode 100644 index 0000000..19d3565 --- /dev/null +++ b/flamapy/metamodels/bdd_metamodel/transformations/dddmpv2_writer.py @@ -0,0 +1,19 @@ +import os +import tempfile + +from flamapy.metamodels.bdd_metamodel.transformations._bdd_writer import BDDWriter + + +class DDDMPv2Writer(BDDWriter): + + @staticmethod + def get_destination_extension() -> str: + return 'dddmp' + + def transform(self) -> str: + if self.path is None: + self.path = tempfile.NamedTemporaryFile(mode='w', encoding='utf8') + result = super().transform() + with open(self.path, 'r', encoding='utf8') as file: + result = os.linesep.join(file.readlines()) + return result diff --git a/flamapy/metamodels/bdd_metamodel/transformations/dddmpv3_writer.py b/flamapy/metamodels/bdd_metamodel/transformations/dddmpv3_writer.py new file mode 100644 index 0000000..908487e --- /dev/null +++ b/flamapy/metamodels/bdd_metamodel/transformations/dddmpv3_writer.py @@ -0,0 +1,36 @@ +import os +import tempfile + +from flamapy.metamodels.bdd_metamodel.transformations._bdd_writer import BDDWriter + + +class DDDMPv3Writer(BDDWriter): + """The difference between versions 2.0 and 3.0 is the addition of the '.varnames' field.""" + + @staticmethod + def get_destination_extension() -> str: + return 'dddmp' + + def transform(self) -> str: + if self.path is None: + self.path = tempfile.NamedTemporaryFile(mode='w', encoding='utf8') + result = super().transform() + result = dddmp_v2_to_v3(self.path) + return result + + +def dddmp_v2_to_v3(filepath: str) -> str: + """Convert the file with the BDD dump in format dddmp version 2 to version 3.""" + with open(filepath, 'r', encoding='utf8') as file: + lines = file.readlines() + # Change version from 2.0 to 3.0 + i, line = next((i, l) for i, l in enumerate(lines) if '.ver DDDMP-2.0' in l) + lines[i] = line.replace('2.0', '3.0') + + # Add '.varnames' field + i, line = next((i, l) for i, l in enumerate(lines) if '.orderedvarnames' in l) + lines.insert(i - 1, line.replace('.orderedvarnames', '.varnames')) + + with open(filepath, 'w', encoding='utf8') as file: + file.writelines(lines) + return os.linesep.join(lines) diff --git a/flamapy/metamodels/bdd_metamodel/transformations/fm_to_bdd.py b/flamapy/metamodels/bdd_metamodel/transformations/fm_to_bdd.py index 9b963be..b61f5cc 100644 --- a/flamapy/metamodels/bdd_metamodel/transformations/fm_to_bdd.py +++ b/flamapy/metamodels/bdd_metamodel/transformations/fm_to_bdd.py @@ -1,4 +1,5 @@ import itertools +from typing import Optional from flamapy.core.transformations import ModelToModel from flamapy.metamodels.fm_metamodel.models import ( @@ -22,7 +23,7 @@ def get_destination_extension() -> str: def __init__(self, source_model: FeatureModel) -> None: self.source_model = source_model self.counter = 1 - self.destination_model = BDDModel() + self.destination_model: Optional[BDDModel] = None self.variables: dict[str, int] = {} self.features: dict[int, str] = {} self.clauses: list[list[int]] = [] @@ -163,10 +164,7 @@ def transform(self) -> BDDModel: ) + ")" ) - cnf_formula = and_connective.join(cnf_list) - self.destination_model.from_textual_cnf( - cnf_formula, list(self.variables.keys()) - ) - + self.destination_model = BDDModel.from_textual_cnf(cnf_formula, + list(self.variables.keys())) return self.destination_model diff --git a/flamapy/metamodels/bdd_metamodel/transformations/json_reader.py b/flamapy/metamodels/bdd_metamodel/transformations/json_reader.py new file mode 100644 index 0000000..2dc9f27 --- /dev/null +++ b/flamapy/metamodels/bdd_metamodel/transformations/json_reader.py @@ -0,0 +1,36 @@ +import json + +try: + import dd.cudd as _bdd +except ImportError: + import dd.autoref as _bdd + +from flamapy.core.transformations import TextToModel +from flamapy.metamodels.bdd_metamodel.models import BDDModel + + +class JSONReader(TextToModel): + + @staticmethod + def get_source_extension() -> str: + return 'json' + + def __init__(self, path: str) -> None: + self.path: str = path + self.preserve_original_ordering: bool = False + + def set_preserve_original_ordering(self, preserve_original_ordering: bool) -> None: + self.preserve_original_ordering = preserve_original_ordering + + def transform(self) -> BDDModel: + bdd_model = BDDModel() + bdd_model.root = bdd_model.bdd.load(self.path)[0] + if self.preserve_original_ordering: + with open(self.path, 'r', encoding='utf8') as json_file: + data = json.load(json_file) + level_of_var = data['level_of_var'] + bdd_model.bdd.reorder(level_of_var) + else: + _bdd.reorder(bdd_model.bdd) + bdd_model.variables = list(bdd_model.bdd.vars) + return bdd_model diff --git a/flamapy/metamodels/bdd_metamodel/transformations/json_writer.py b/flamapy/metamodels/bdd_metamodel/transformations/json_writer.py new file mode 100644 index 0000000..49b2119 --- /dev/null +++ b/flamapy/metamodels/bdd_metamodel/transformations/json_writer.py @@ -0,0 +1,19 @@ +import os +import tempfile + +from flamapy.metamodels.bdd_metamodel.transformations._bdd_writer import BDDWriter + + +class JSONWriter(BDDWriter): + + @staticmethod + def get_destination_extension() -> str: + return 'json' + + def transform(self) -> str: + if self.path is None: + self.path = tempfile.NamedTemporaryFile(mode='w', encoding='utf8') + result = super().transform() + with open(self.path, 'r', encoding='utf8') as file: + result = os.linesep.join(file.readlines()) + return result diff --git a/flamapy/metamodels/bdd_metamodel/transformations/pdf_writer.py b/flamapy/metamodels/bdd_metamodel/transformations/pdf_writer.py new file mode 100644 index 0000000..67632e8 --- /dev/null +++ b/flamapy/metamodels/bdd_metamodel/transformations/pdf_writer.py @@ -0,0 +1,8 @@ +from flamapy.metamodels.bdd_metamodel.transformations._bdd_writer import BDDWriter + + +class PDFWriter(BDDWriter): + + @staticmethod + def get_destination_extension() -> str: + return 'pdf' diff --git a/flamapy/metamodels/bdd_metamodel/transformations/pickle_reader.py b/flamapy/metamodels/bdd_metamodel/transformations/pickle_reader.py new file mode 100644 index 0000000..b84d532 --- /dev/null +++ b/flamapy/metamodels/bdd_metamodel/transformations/pickle_reader.py @@ -0,0 +1,19 @@ +from flamapy.core.transformations import TextToModel +from flamapy.metamodels.bdd_metamodel.models import BDDModel + + +class PickleReader(TextToModel): + + @staticmethod + def get_source_extension() -> str: + return 'p' + + def __init__(self, path: str) -> None: + self.path: str = path + self.preserve_original_ordering: bool = False + + def transform(self) -> BDDModel: + bdd_model = BDDModel() + bdd_model.root = bdd_model.bdd.load(self.path)[0] + bdd_model.variables = list(bdd_model.bdd.vars) + return bdd_model diff --git a/flamapy/metamodels/bdd_metamodel/transformations/pickle_writer.py b/flamapy/metamodels/bdd_metamodel/transformations/pickle_writer.py new file mode 100644 index 0000000..f854c4f --- /dev/null +++ b/flamapy/metamodels/bdd_metamodel/transformations/pickle_writer.py @@ -0,0 +1,17 @@ +from flamapy.metamodels.bdd_metamodel.transformations._bdd_writer import BDDWriter + + +class PickleWriter(BDDWriter): + + @staticmethod + def get_destination_extension() -> str: + return 'p' + + def transform(self) -> str: + if self._roots is None: + try: + self.source_model.bdd.dump(filename=self.path) + except Exception: + self._roots = [self.source_model.root] + self.source_model.bdd.dump(filename=self.path, roots=self._roots) + return '' \ No newline at end of file diff --git a/flamapy/metamodels/bdd_metamodel/transformations/png_writer.py b/flamapy/metamodels/bdd_metamodel/transformations/png_writer.py new file mode 100644 index 0000000..6eb3694 --- /dev/null +++ b/flamapy/metamodels/bdd_metamodel/transformations/png_writer.py @@ -0,0 +1,8 @@ +from flamapy.metamodels.bdd_metamodel.transformations._bdd_writer import BDDWriter + + +class PNGWriter(BDDWriter): + + @staticmethod + def get_destination_extension() -> str: + return 'png' diff --git a/flamapy/metamodels/bdd_metamodel/transformations/sat_to_bdd.py b/flamapy/metamodels/bdd_metamodel/transformations/sat_to_bdd.py index a14abe4..ac89521 100644 --- a/flamapy/metamodels/bdd_metamodel/transformations/sat_to_bdd.py +++ b/flamapy/metamodels/bdd_metamodel/transformations/sat_to_bdd.py @@ -1,10 +1,12 @@ -from flamapy.core.transformations import ModelToModel +from typing import Optional +from flamapy.core.transformations import ModelToModel from flamapy.metamodels.bdd_metamodel.models import BDDModel from flamapy.metamodels.pysat_metamodel.models import PySATModel class SATToBDD(ModelToModel): + @staticmethod def get_source_extension() -> str: return "pysat" @@ -15,7 +17,7 @@ def get_destination_extension() -> str: def __init__(self, source_model: PySATModel) -> None: self.source_model = source_model - self.destination_model = BDDModel() + self.destination_model: Optional[BDDModel] = None def transform(self) -> BDDModel: # Transform clauses to textual CNF notation required by the BDD @@ -39,9 +41,8 @@ def transform(self) -> BDDModel: ) + ")" ) - cnf_formula = and_connective.join(cnf_list) - self.destination_model.from_textual_cnf(cnf_formula, - list(self.source_model.variables.keys())) - + bdd_model = BDDModel.from_textual_cnf(cnf_formula, + list(self.source_model.variables.keys())) + self.destination_model = bdd_model return self.destination_model diff --git a/flamapy/metamodels/bdd_metamodel/transformations/svg_writer.py b/flamapy/metamodels/bdd_metamodel/transformations/svg_writer.py new file mode 100644 index 0000000..ef38216 --- /dev/null +++ b/flamapy/metamodels/bdd_metamodel/transformations/svg_writer.py @@ -0,0 +1,8 @@ +from flamapy.metamodels.bdd_metamodel.transformations._bdd_writer import BDDWriter + + +class SVGWriter(BDDWriter): + + @staticmethod + def get_destination_extension() -> str: + return 'svg' diff --git a/setup.py b/setup.py index 5da95cd..540462e 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ install_requires=[ 'flamapy~=1.7.0.dev0', 'flamapy-fm~=1.6.0.dev0', - 'dd>=0.5.6', + 'dd~=0.5.7', 'graphviz~=0.20', ], extras_require={ diff --git a/test_bdd_metamodel.py b/test_bdd_metamodel.py new file mode 100644 index 0000000..c001e74 --- /dev/null +++ b/test_bdd_metamodel.py @@ -0,0 +1,154 @@ +""" +The BDD plugin relies on the dd library. +The representation depends on what you want and have installed. +For solving small to medium size problems, say for teaching, or prototyping new algorithms, +pure Python can be more convenient. +To work with larger problems, it works better if you install the C library CUDD. +Let's call these “backends”. + +The Flamapy BDD plugin imports the best available interface: +try: + import dd.cudd as _bdd +except ImportError: + import dd.autoref as _bdd + +The same user code can run with both the Python and C backends. +The interfaces are almost identical, some differences may have, and thus, +they are controlled with exceptions +(e.g., Using the PickleWriter is only supported with dd.autoref, +using the DDDMPv2Writer or DDDMPv3Writer is only supported with dd.cudd). +""" + +import os + +from flamapy.metamodels.fm_metamodel.transformations import UVLReader +from flamapy.metamodels.bdd_metamodel.models import BDDModel +from flamapy.metamodels.bdd_metamodel.transformations import ( + FmToBDD, + JSONWriter, + PNGWriter, + PickleWriter, + DDDMPv2Writer, + DDDMPv3Writer, + PDFWriter, + SVGWriter, + JSONReader, + PickleReader, + DDDMPReader +) +from flamapy.metamodels.bdd_metamodel.operations import ( + BDDProductDistribution, + BDDFeatureInclusionProbability, + BDDSampling, + BDDConfigurationsNumber, + BDDConfigurations, + BDDCoreFeatures, + BDDDeadFeatures, + BDDSatisfiable +) + + +FM_PATH = 'tests/models/uvl_models/Pizzas.uvl' +BDD_MODELS_PATH = 'tests/models/bdd_models/' + + +def analyze_bdd(bdd_model: BDDModel) -> None: + # Satisfiable (valid) + satisfiable = BDDSatisfiable().execute(bdd_model).get_result() + print(f'Satisfiable (valid)?: {satisfiable}') + + # Configurations numbers + n_configs = BDDConfigurationsNumber().execute(bdd_model).get_result() + print(f'#Configs: {n_configs}') + + assert n_configs > 0 if satisfiable else n_configs == 0 + + # Configurations + configs = BDDConfigurations().execute(bdd_model).get_result() + for i, config in enumerate(configs, 1): + print(f'Config {i}: {config.get_selected_elements()}') + + # BDD product distribution + dist = BDDProductDistribution().execute(bdd_model).get_result() + print(f'Product Distribution: {dist}') + print(f'#Products: {sum(dist)}') + + # BDD feature inclusion probabilities + probabilities = BDDFeatureInclusionProbability().execute(bdd_model).get_result() + print('Feature Inclusion Probabilities:') + for feat, prob in probabilities.items(): + print(f'{feat}: {prob}') + + # Core features + core_features = BDDCoreFeatures().execute(bdd_model).get_result() + print(f'Core features: {core_features}') + + # Dead features + dead_features = BDDDeadFeatures().execute(bdd_model).get_result() + print(f'Dead features: {dead_features}') + + # BDD Sampling + sample_op = BDDSampling() + sample_op.set_sample_size(5) + sample = sample_op.execute(bdd_model).get_result() + print('Uniform Random Sampling:') + for i, config in enumerate(sample, 1): + print(f'Config {i}: {config.get_selected_elements()}') + + +def main(): + path, filename = os.path.split(FM_PATH) + filename = ''.join(filename.split('.')[:-1]) + + # Load the feature model from UVLReader + feature_model = UVLReader(FM_PATH).transform() + + # Create the BDD from the FM + bdd_model = FmToBDD(feature_model).transform() + print(f'BDD model:\n{bdd_model}') + + # Save the BDD to different image formats + PNGWriter(f'{filename}.{PNGWriter.get_destination_extension()}', bdd_model).transform() + SVGWriter(f'{filename}.{SVGWriter.get_destination_extension()}', bdd_model).transform() + PDFWriter(f'{filename}.{PDFWriter.get_destination_extension()}', bdd_model).transform() + # Serialize the BDD to different formats + JSONWriter(f'{filename}.{JSONWriter.get_destination_extension()}', bdd_model).transform() + try: + DDDMPv2Writer(f'{filename}.{DDDMPv2Writer.get_destination_extension()}2', bdd_model).transform() + except: + print(f'Warning: DDDMPv2 serialization is not supported.') + try: + DDDMPv3Writer(f'{filename}.{DDDMPv3Writer.get_destination_extension()}', bdd_model).transform() + except: + print(f'Warning: DDDMPv3 serialization is not supported.') + try: + PickleWriter(f'{filename}.p', bdd_model).transform() + except: + print(f'Warning: Pickle serialization is not supported.') + + # Apply different analysis operations + analyze_bdd(bdd_model) + + # Load the BDD model from a .json file + reader = JSONReader(f'{os.path.join(BDD_MODELS_PATH, filename)}.json') + reader.set_preserve_original_ordering(True) + bdd_model = reader.transform() + print(f'BDD model:\n{bdd_model}') + analyze_bdd(bdd_model) + + # TODO: The following reader are not fully supported. + # Load the BDD model from a .dddmp file + # reader = DDDMPReader(f'{os.path.join(BDD_MODELS_PATH, filename)}.dddmp') + # bdd_model = reader.transform() + # print(f'BDD model:\n{bdd_model}') + # analyze_bdd(bdd_model) + + # Load the BDD model from a .p file + # reader = PickleReader(f'{os.path.join(BDD_MODELS_PATH, filename)}.p') + # bdd_model = reader.transform() + # print(f'BDD model:\n{bdd_model}') + # analyze_bdd(bdd_model) + + +if __name__ == '__main__': + main() diff --git a/test_uned.py b/test_uned.py new file mode 100644 index 0000000..18c30bc --- /dev/null +++ b/test_uned.py @@ -0,0 +1,69 @@ +from flamapy.metamodels.fm_metamodel.transformations import UVLReader + +from flamapy.metamodels.bdd_metamodel.transformations import FmToBDD, DDDMPWriter +from flamapy.metamodels.bdd_metamodel.operations import ( + BDDProductDistribution, + BDDFeatureInclusionProbability, + BDDSampling, + BDDConfigurationsNumber, + BDDConfigurations, + BDDCoreFeatures, + BDDDeadFeatures, + BDDSatisfiable +) + + +def main(): + # Load the feature model from UVLReader + feature_model = UVLReader('tests/input_fms/uvl_models/Pizzas.uvl').transform() + + # Create the BDD from the FM + bdd_model = FmToBDD(feature_model).transform() + + # Save the BDD as .dddmp file + DDDMPWriter(f'{feature_model.root.name}_bdd.{DDDMPWriter.get_destination_extension()}', + bdd_model).transform() + + # Satisfiable (valid) + satisfiable = BDDSatisfiable().execute(bdd_model).get_result() + print(f'Satisfiable (valid)?: {satisfiable}') + + # Configurations numbers + n_configs = BDDConfigurationsNumber().execute(bdd_model).get_result() + print(f'#Configs: {n_configs}') + + # Configurations + configs = BDDConfigurations().execute(bdd_model).get_result() + for i, config in enumerate(configs, 1): + print(f'Config {i}: {config.get_selected_elements()}') + + # BDD product distribution + dist = BDDProductDistribution().execute(bdd_model).get_result() + print(f'Product Distribution: {dist}') + print(f'#Products: {sum(dist)}') + + # BDD feature inclusion probabilities + probabilities = BDDFeatureInclusionProbability().execute(bdd_model).get_result() + print('Feature Inclusion Probabilities:') + for feat, prob in probabilities.items(): + print(f'{feat}: {prob}') + + # Core features + core_features = BDDCoreFeatures().execute(bdd_model).get_result() + print(f'Core features: {core_features}') + + # Dead features + dead_features = BDDDeadFeatures().execute(bdd_model).get_result() + print(f'Dead features: {dead_features}') + + # BDD Sampling + sample_op = BDDSampling() + sample_op.set_sample_size(5) + sample = sample_op.execute(bdd_model).get_result() + print('Uniform Random Sampling:') + for i, config in enumerate(sample, 1): + print(f'Config {i}: {config.get_selected_elements()}') + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/tests/input_fms/featureide_models/jHipster.xml b/tests/input_fms/featureide_models/jHipster.xml deleted file mode 100644 index 2138ace..0000000 --- a/tests/input_fms/featureide_models/jHipster.xml +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OAuth2 - - - SocialLogin - - - MicroserviceApplication - - - - - SQL - MongoDB - - - - - - SocialLogin - - - HTTPSession - JWT - - - Monolithic - - SQL - MongoDB - - - - - - - - UaaServer - Uaa - - - - - - - OAuth2 - - - - SocialLogin - - - MicroserviceApplication - - - - - SQL - - MongoDB - Cassandra - - - - - - - Server - - Protractor - - - - - - - Server - - Protractor - - - - - MySQL - - H2 - MySql - - - - - - - MicroserviceApplication - MicroserviceGateway - - - JWT - Uaa - - - - - - Monolithic - - JWT - - HTTPSession - OAuth2 - - - - - - - MariaDB - - H2 - MariaDBDev - - - - - - PostgreSQL - - H2 - PostgreeSQLDev - - - - - - - SpringWebSockets - ClusteredSession - - Application - - - - - Libsass - Application - - - - diff --git a/tests/input_fms/featureide_models/pizzas.xml b/tests/input_fms/featureide_models/pizzas.xml deleted file mode 100644 index bb2d5cd..0000000 --- a/tests/input_fms/featureide_models/pizzas.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - CheesyCrust - Big - - - - diff --git a/tests/models/bdd_models/Pizzas.dddmp b/tests/models/bdd_models/Pizzas.dddmp new file mode 100644 index 0000000..fa9589c --- /dev/null +++ b/tests/models/bdd_models/Pizzas.dddmp @@ -0,0 +1,33 @@ +.ver DDDMP-3.0 +.mode A +.varinfo 3 +.nnodes 18 +.nvars 12 +.nsuppvars 12 +.varnames Pizza Topping Salami Ham Mozzarella Size Normal Big Dough Neapolitan Sicilian CheesyCrust +.suppvarnames Pizza Topping Salami Ham Mozzarella Size Normal Big Dough Neapolitan Sicilian CheesyCrust +.orderedvarnames Pizza Topping Salami Ham Mozzarella Size Normal Big Dough Neapolitan Sicilian CheesyCrust +.ids 0 1 2 3 4 5 6 7 8 9 10 11 +.permids 0 1 2 3 4 5 6 7 8 9 10 11 +.nroots 1 +.rootids -18 +.nodes +1 T 1 0 0 +2 CheesyCrust 11 1 -1 +3 Sicilian 10 1 2 +4 Sicilian 10 2 1 +5 Neapolitan 9 3 4 +6 Dough 8 5 1 +7 Big 7 1 6 +8 Sicilian 10 1 -1 +9 Neapolitan 9 8 -8 +10 Dough 8 9 1 +11 Big 7 10 1 +12 Normal 6 7 11 +13 Size 5 12 1 +14 Mozzarella 4 13 1 +15 Ham 3 13 14 +16 Salami 2 13 15 +17 Topping 1 16 1 +18 Pizza 0 17 1 +.end diff --git a/tests/models/bdd_models/Pizzas.json b/tests/models/bdd_models/Pizzas.json new file mode 100644 index 0000000..1beca83 --- /dev/null +++ b/tests/models/bdd_models/Pizzas.json @@ -0,0 +1,21 @@ +{ +"level_of_var": {"Salami": 2, "Size": 5, "Sicilian": 10, "Pizza": 0, "Normal": 6, "Big": 7, "Dough": 8, "Ham": 3, "Topping": 1, "Neapolitan": 9, "Mozzarella": 4, "CheesyCrust": 11}, +"roots": [-94713387456898], +"94713387453922": [10, "F", "T"], +"94713387456066": [9, -94713387453922, 94713387453922], +"94713387456098": [8, "T", 94713387456066], +"94713387456162": [7, "T", 94713387456098], +"94713387453954": [11, "F", "T"], +"94713387456578": [10, "T", 94713387453954], +"94713387456546": [10, 94713387453954, "T"], +"94713387456610": [9, 94713387456578, 94713387456546], +"94713387456642": [8, "T", 94713387456610], +"94713387456674": [7, 94713387456642, "T"], +"94713387456706": [6, 94713387456162, 94713387456674], +"94713387456738": [5, "T", 94713387456706], +"94713387456770": [4, "T", 94713387456738], +"94713387456802": [3, 94713387456770, 94713387456738], +"94713387456834": [2, 94713387456802, 94713387456738], +"94713387456866": [1, "T", 94713387456834], +"94713387456898": [0, "T", 94713387456866] +} diff --git a/tests/models/bdd_models/Pizzas.p b/tests/models/bdd_models/Pizzas.p new file mode 100644 index 0000000000000000000000000000000000000000..95adde63eee145d61eeab72849f7019c9f43a591 GIT binary patch literal 1514 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 }E&AiQiS?w4qx3tL} ziWf=Q>#_6%(<-LbQHqZZVIP!atbW{$b++8gSPTaavGB<3i^d$eA04#G+u0n!bA0u* z!yS(yObkb#)hD$2Vlz3@nQe@JMKoBh@VqxXTA<$kr?%j#rI)P*u2D6Yn@ z4V|j>df#Rlcke#&u#zo|2^8fM*j_>__HB;tcXX*E%<9N;N7(&wX|l-X;3$Wq2yO_O zLw(X(3^MNQFcX*fLW3u++RKc6NU*xqxOk|)rf2K~^(YFv1n_~Ma_?Lt0p=KTW-}RTrzIIAa*^uOm z4i$f{_7D99@|#2@;uX@nA+;o_<4a6@E#{R?M7Afp^m^hV<|lVC+3_}lo$%DSDVBz(`AVFI`~_VNNw;q{yyD)LIjD;jb!D$Z3WcGso^;F=7gyhBxdo8Zt0 zDl~0pL#cjFpTzxvFD^m8aT>HA|c| zYAZ%`10sng8_|A)T#dWp$HoVaC9N@=W$d49yYVupttdOo*Z{ow^d)3DAMlh>&WYKhmJH(R1n1{{Gl9-1>Bw_UBWN=vU+nAUM z5Iy1&)zP#l5)!PMWu$$mnjb3Zj>v+pV;qCNj%Fv1jD7mNr&@ar3%1&(#Vl(82S!E& zx$7Elmoi!($N6=%kjz#EH(6|`40r_~Z~n@|=(nmX;Xswj89th`<0H@f!qFTPU!u?4 zC;0`7B;lOZA%S+NU6k3p3FyC?Prlt_q}3LVrz+JSJh&#jbJh^cWWt;_WtX2nR2+wC zqr`;6DYzr5F&Mh3VG}4GEM;NSlq7CJGUSmlysj)2TwStS6=rmROv~;BhQqAZgHRn$ zjLNMh1ZkY!EYM8mnG-g`mf%Oh%rE<>7(X{LY%D*`Fw=co8$TKwJW>}cr^|{p9V^$% z=RHS8y4GbJNpfh;_Hj*MTDI2Q9{1yz=yd6ll5>hwIXU%^%12``iC_sbO^KRb3cmvh z{rE-704e;>kG^`|%;Lx{0+OhZalY$a5DsA*rhCtdVMsRDsbR7P+seJi_IB%9TlVQ3 zF#&F$Yi-<8SArub=YS8t1p2Crs2u;!LNE}^BhQB%x1PzB|s0hRJbqbj$5g=*Df>^m0p75IelJmL( z_S{G`=od3-QFuk)3|8EPHv=szwRv3}nt}%ED zp@eG0!(af|RPhl=*5O?4zS0%=piJbGS6!VGXVGzByyDy>ropwdDicr1-dQS|FVv1a zlNJNiMS{r>8YD}knT1vjQ8J2J=em#4`}#~65lD?AlKb9-rZaa9k0a^H^{Xd66F{QF zkm`ArN^<$st0BI&PefHtO&>=nGpQ>Z*jh7XfHiBC`VYJrLn<`uCurxg$JRYHK9P+p zf(=vW^dx)@VUG76(XoEP?6+k}2ZIE_CWyU(+JKJ;?HbGXLd($6>MLAdy9B9&u}LyuEw zxIx~Ml_mTH!S987$lO6XpcU6esEabwgz}+WhPFnJ?BF_u!^tqR`^mlOd2{eh45>qv zZ`{ElNsNtQ3BQJOXwP0%=WMuV!!qXLq<3bsB4ZtcLx6K|(i~Ecfdd4pZ_*(SwCU9x z2O@Rp94BHy!L7}y%DKWQuTXlUwsSP1_~rp@&t#PMzeoSinEpNdKt|4gMxW`OW%&mS z`3pvQ$7O_#9St4K?VM~K-r15r1kGoC>o*+cvzoeyxEignv4y^hv!bzsxyio_MD?xB zt=s`rf8_!GWK#c?Yo%}c2Ba|m%T(|$WQLxdjT1o60%QX)zfm)9kO?E_-{g#hlfIR? zp@5C4l`(+v&uIdVhVSSNCo{*N>>r)1u-p#OHqU&T2aIQ>C_l-@X;cUS#U1@#?`{{Tk+ zzpgQNaC8zf(|7pC0n++^r*^D+d0Qc9Zet2yP&Ky^uyHj1NBC2< zs=1Mqnd2LJ#KQF6jsJURVfibMjfD;H|ML0wQkWPS-;?YtKma=%>zni5TlT(lu)l*+ zf9*_+%q(xhJH5sBx6H=D3SeV%YopWdj0Onc4oDJ8$%qt+I{z`_f9ldr|*B zy8k`d-|;TTKi-rwH+uKwd&d<1#cw&k(_a4uQ8E2HASUNvYvgSBww#m7P~Y6a7Qpn8 ziR~jJfXd9t$HRY zjI2z|Oiauy%$&50%#@6b)c;=T{~&PxP-#N?Zx@KI>7R!G>B8Sk+W(MjZVtvKu#5mE zAne;9{=EU%SXo(E0VaUIG$tTB+gs7^8^Gpojggg+?d?JFpBj*p_05z2sWCD#y$$() zYCz7nN%o%_6Oj3BGW@6Z2FP)|P0If`mx%?)@iv(MOJimH-|b^!;pF@;ySLf!Uv@wa z=KtLfCLky9-`e8jp#OFYaQL%OSJB+V_}y3UH#-Ge+qXe~_xWFsKnWX@x3T>*Fa9Fn W^c|f3c=xTmx5p?sxrnSN?EeSZffNn^ literal 0 HcmV?d00001 diff --git a/tests/models/bdd_models/Pizzas.png b/tests/models/bdd_models/Pizzas.png new file mode 100644 index 0000000000000000000000000000000000000000..09ae81ecc42fe5d408375ef7319a40065df7ac39 GIT binary patch literal 169046 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%0DYyAw*Yv?@B>iAY5lpe%SV$d$?5A`fUW^V)Y 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

2zX6IJpU-`0T{cFb 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 URilxO6#O%8%mnibW=?+p56I|Tw*UYD literal 0 HcmV?d00001 diff --git a/tests/models/bdd_models/Pizzas.svg b/tests/models/bdd_models/Pizzas.svg new file mode 100644 index 0000000..1176ba8 --- /dev/null +++ b/tests/models/bdd_models/Pizzas.svg @@ -0,0 +1,438 @@ + + + + + + +bdd + + + +L-1 +ref + + + +L0 +0 + + + + +ref-28 + +@-28 + + + +28 + +Pizza-28 + + + +ref-28->28 + + +-1 + + + +L1 +1 + + + + +26 + +Topping-26 + + + +28->26 + + + + + +1 + +True-1 + + + +28->1 + + + + + + +L2 +2 + + + + +24 + +Salami-24 + + + +26->24 + + + + + +26->1 + + + + + + +L3 +3 + + + + +22 + +Ham-22 + + + +24->22 + + + + + + +18 + +Size-18 + + + +24->18 + + + + + +L4 +4 + + + + +20 + +Mozzarella-20 + + + +22->20 + + + + + + +22->18 + + + + + +L5 +5 + + + + +20->18 + + + + + +20->1 + + + + + + +L6 +6 + + + + +16 + +Normal-16 + + + +18->16 + + + + + +18->1 + + + + + + +L7 +7 + + + + +8 + +Big-8 + + + +16->8 + + + + + + +14 + +Big-14 + + + +16->14 + + + + + +L8 +8 + + + + +6 + +Dough-6 + + + +8->6 + + + + + +8->1 + + + + + + +13 + +Dough-13 + + + +14->13 + + + + + + +14->1 + + + + + +L9 +9 + + + + +4 + +Neapolitan-4 + + + +6->4 + + + + + +6->1 + + + + + + +12 + +Neapolitan-12 + + + +13->12 + + + + + +13->1 + + + + + + +L10 +10 + + + + +2 + +Sicilian-2 + + + +4->2 + + +-1 + + + +4->2 + + + + + +10 + +Sicilian-10 + + + +12->10 + + + + + + +11 + +Sicilian-11 + + + +12->11 + + + + + +L11 +11 + + + + +2->1 + + +-1 + + + +2->1 + + + + + +9 + +CheesyCrust-9 + + + +10->9 + + + + + +10->1 + + + + + + +11->9 + + + + + + +11->1 + + + + + +L12 +12 + + + + +9->1 + + +-1 + + + +9->1 + + + + + diff --git a/tests/models/bdd_models/Pizzas_uned.dddmp b/tests/models/bdd_models/Pizzas_uned.dddmp new file mode 100644 index 0000000..2f1b4ac --- /dev/null +++ b/tests/models/bdd_models/Pizzas_uned.dddmp @@ -0,0 +1,34 @@ +.ver DDDMP-3.0 +.mode A +.varinfo 1 +.dd Pizzas_uned.dddmp +.nnodes 18 +.nvars 12 +.nsuppvars 12 +.varnames Pizza Topping Salami Ham Mozzarella Size Normal Big Dough Neapolitan Sicilian CheesyCrust +.suppvarnames Pizza Topping Salami Ham Mozzarella Size Normal Big Dough Neapolitan Sicilian CheesyCrust +.orderedvarnames Pizza Topping Salami Ham Mozzarella Size Normal Big Dough Neapolitan Sicilian CheesyCrust +.ids 0 1 2 3 4 5 6 7 8 9 10 11 +.permids 0 1 2 3 4 5 6 7 8 9 10 11 +.nroots 1 +.rootids -18 +.nodes +1 T 1 0 0 +2 11 11 1 -1 +3 10 10 1 2 +4 10 10 2 1 +5 9 9 3 4 +6 8 8 5 1 +7 7 7 1 6 +8 10 10 1 -1 +9 9 9 8 -8 +10 8 8 9 1 +11 7 7 10 1 +12 6 6 7 11 +13 5 5 12 1 +14 4 4 13 1 +15 3 3 13 14 +16 2 2 13 15 +17 1 1 16 1 +18 0 0 17 1 +.end diff --git a/tests/models/bdd_models/Pizzas_v2.dddmp b/tests/models/bdd_models/Pizzas_v2.dddmp new file mode 100644 index 0000000..8966e0e --- /dev/null +++ b/tests/models/bdd_models/Pizzas_v2.dddmp @@ -0,0 +1,32 @@ +.ver DDDMP-2.0 +.mode A +.varinfo 3 +.nnodes 18 +.nvars 12 +.nsuppvars 12 +.suppvarnames Pizza Topping Salami Ham Mozzarella Size Normal Big Dough Neapolitan Sicilian CheesyCrust +.orderedvarnames Pizza Topping Salami Ham Mozzarella Size Normal Big Dough Neapolitan Sicilian CheesyCrust +.ids 0 1 2 3 4 5 6 7 8 9 10 11 +.permids 0 1 2 3 4 5 6 7 8 9 10 11 +.nroots 1 +.rootids -18 +.nodes +1 T 1 0 0 +2 CheesyCrust 11 1 -1 +3 Sicilian 10 1 2 +4 Sicilian 10 2 1 +5 Neapolitan 9 3 4 +6 Dough 8 5 1 +7 Big 7 1 6 +8 Sicilian 10 1 -1 +9 Neapolitan 9 8 -8 +10 Dough 8 9 1 +11 Big 7 10 1 +12 Normal 6 7 11 +13 Size 5 12 1 +14 Mozzarella 4 13 1 +15 Ham 3 13 14 +16 Salami 2 13 15 +17 Topping 1 16 1 +18 Pizza 0 17 1 +.end diff --git a/tests/input_fms/uvl_models/JHipster.uvl b/tests/models/uvl_models/JHipster.uvl similarity index 100% rename from tests/input_fms/uvl_models/JHipster.uvl rename to tests/models/uvl_models/JHipster.uvl diff --git a/tests/input_fms/uvl_models/Pizzas.uvl b/tests/models/uvl_models/Pizzas.uvl similarity index 100% rename from tests/input_fms/uvl_models/Pizzas.uvl rename to tests/models/uvl_models/Pizzas.uvl diff --git a/tests/input_fms/uvl_models/Pizzas_complex.uvl b/tests/models/uvl_models/Pizzas_complex.uvl similarity index 100% rename from tests/input_fms/uvl_models/Pizzas_complex.uvl rename to tests/models/uvl_models/Pizzas_complex.uvl