flamapy-bdd 2.6.0.dev4__py3-none-any.whl → 2.6.0.dev11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -55,7 +55,7 @@ class BDDModel(VariabilityModel):
55
55
 
56
56
  def count_solutions(self) -> int:
57
57
  """Count the number of valid configurations (SAT)."""
58
- return self.bdd.count(self.root, len(self.vars)) # count(node, n_vars)
58
+ return self.bdd.count(self.root, len(self.vars_order)) # count(node, n_vars)
59
59
 
60
60
  def dump_structure(self) -> None:
61
61
  """Prints the structure of the BDD for debugging purposes."""
@@ -2,14 +2,30 @@ from typing import cast, Any, Generator
2
2
 
3
3
  from flamapy.core.models import VariabilityModel
4
4
  from flamapy.core.operations import Operation
5
+ from flamapy.core.operations.descriptor import OperationDescriptor, Input
5
6
  from flamapy.metamodels.configuration_metamodel.models import Configuration
6
7
  from flamapy.metamodels.bdd_metamodel.models import BDDModel
7
8
  from flamapy.metamodels.bdd_metamodel.operations.bdd_product_distribution import DistributionEngine
8
9
 
9
10
 
11
+ def _configurations_with_n_features_result(result: Any) -> Any:
12
+ return list(result)
13
+
14
+
10
15
  class BDDConfigurationsWithNFeatures(Operation):
11
16
  """Operation to get all configurations with exactly n selected features from a BDD model."""
12
17
 
18
+ facade = OperationDescriptor(
19
+ doc=(
20
+ 'Returns all valid configurations that have exactly n features selected.'
21
+ ),
22
+ returns='Union[None, List[Configuration]]',
23
+ name='configurations_with_n_features', operation='BDDConfigurationsWithNFeatures',
24
+ default_backend='bdd',
25
+ inputs=(Input('n', int, required=True, setter='set_n_features'),),
26
+ result_adapter=_configurations_with_n_features_result,
27
+ )
28
+
13
29
  def __init__(self) -> None:
14
30
  self._result: Generator[Configuration, None, None]
15
31
  self.n_features: int = 0
@@ -9,7 +9,7 @@ from flamapy.metamodels.fm_metamodel.models import FeatureModel
9
9
  from flamapy.metamodels.bdd_metamodel.models import BDDModel
10
10
 
11
11
 
12
- LOGGER = logging.getLogger('PySATFalseOptionalFeatures')
12
+ LOGGER = logging.getLogger('BDDFalseOptionalFeatures')
13
13
 
14
14
 
15
15
  class BDDFalseOptionalFeatures(FalseOptionalFeatures):
@@ -25,11 +25,11 @@ class BDDFalseOptionalFeatures(FalseOptionalFeatures):
25
25
 
26
26
  def execute(self, model: VariabilityModel) -> 'BDDFalseOptionalFeatures':
27
27
  bdd_model = cast(BDDModel, model)
28
- try:
29
- feature_model = cast(FeatureModel, model.original_model)
30
- except FlamaException:
31
- LOGGER.exception("The transformation didn't attach the source model, "
32
- "which is required for this operation.")
28
+ original_model = getattr(model, 'original_model', None)
29
+ if original_model is None:
30
+ raise FlamaException("The transformation didn't attach the source model, "
31
+ "which is required for this operation.")
32
+ feature_model = cast(FeatureModel, original_model)
33
33
  self._result = get_false_optional_features(bdd_model, feature_model)
34
34
  return self
35
35
 
@@ -1,6 +1,7 @@
1
1
  from typing import Any, Optional, cast
2
2
 
3
3
  from flamapy.core.models import VariabilityModel
4
+ from flamapy.core.operations.descriptor import OperationDescriptor
4
5
  from flamapy.metamodels.configuration_metamodel.models.configuration import Configuration
5
6
  from flamapy.metamodels.bdd_metamodel.models import BDDModel
6
7
  from flamapy.metamodels.bdd_metamodel.operations.interfaces import FeatureInclusionProbability
@@ -14,6 +15,17 @@ class BDDFeatureInclusionProbability(FeatureInclusionProbability):
14
15
  (https://doi.org/10.1109/ICSE.2019.00091)]
15
16
  """
16
17
 
18
+ facade = OperationDescriptor(
19
+ doc=(
20
+ 'Returns a mapping from each feature name to its inclusion probability: the\n'
21
+ 'fraction of valid configurations in which that feature is selected. Core\n'
22
+ 'features have probability 1.0 and dead features have probability 0.0.'
23
+ ),
24
+ returns='Union[None, Dict[str, float]]',
25
+ name='feature_inclusion_probability', operation='BDDFeatureInclusionProbability',
26
+ default_backend='bdd',
27
+ )
28
+
17
29
  def __init__(self) -> None:
18
30
  self._result: dict[Any, float] = {}
19
31
  self._partial_configuration: Optional[Configuration] = None
@@ -1,6 +1,7 @@
1
1
  from typing import cast
2
2
 
3
3
  from flamapy.core.models import VariabilityModel
4
+ from flamapy.core.operations.descriptor import OperationDescriptor
4
5
  from flamapy.metamodels.configuration_metamodel.models.configuration import Configuration
5
6
  from flamapy.metamodels.bdd_metamodel.models import BDDModel
6
7
  from flamapy.metamodels.bdd_metamodel.operations.interfaces import Homogeneity
@@ -8,6 +9,16 @@ from flamapy.metamodels.bdd_metamodel.operations import BDDCommonalityFactor
8
9
 
9
10
 
10
11
  class BDDHomogeneity(Homogeneity):
12
+
13
+ facade = OperationDescriptor(
14
+ doc=(
15
+ 'Measures how similar the products of the feature model are to each other. It\n'
16
+ 'is computed as the average commonality factor across all features. A value of\n'
17
+ '1.0 means all products are identical; lower values indicate more diversity.'
18
+ ),
19
+ returns='Union[None, float]',
20
+ name='homogeneity', operation='BDDHomogeneity', default_backend='bdd'
21
+ )
11
22
  def __init__(self) -> None:
12
23
  self._result: float = 0.0
13
24
 
@@ -1,11 +1,22 @@
1
1
  from typing import cast, Any
2
2
 
3
3
  from flamapy.core.models import VariabilityModel
4
+ from flamapy.core.operations.descriptor import OperationDescriptor
4
5
  from flamapy.metamodels.bdd_metamodel.models import BDDModel
5
6
  from flamapy.metamodels.bdd_metamodel.operations.interfaces import ProductDistribution
6
7
 
7
8
 
8
9
  class BDDProductDistribution(ProductDistribution):
10
+
11
+ facade = OperationDescriptor(
12
+ doc=(
13
+ 'Returns the distribution of products by number of activated features. The\n'
14
+ 'value at index i is the count of valid configurations that have exactly i\n'
15
+ 'features selected.'
16
+ ),
17
+ returns='Union[None, List[int]]',
18
+ name='product_distribution', operation='BDDProductDistribution', default_backend='bdd'
19
+ )
9
20
  def __init__(self) -> None:
10
21
  self._result: list[int] = []
11
22
 
@@ -1,6 +1,7 @@
1
1
  from typing import Any, Optional, cast
2
2
 
3
3
  from flamapy.core.models import VariabilityModel
4
+ from flamapy.core.operations.descriptor import OperationDescriptor
4
5
  from flamapy.metamodels.configuration_metamodel.models.configuration import Configuration
5
6
  from flamapy.metamodels.bdd_metamodel.models import BDDModel
6
7
  from flamapy.metamodels.bdd_metamodel.operations.interfaces import PureOptionalFeatures
@@ -8,6 +9,16 @@ from flamapy.metamodels.bdd_metamodel.operations import BDDFeatureInclusionProba
8
9
 
9
10
 
10
11
  class BDDPureOptionalFeatures(PureOptionalFeatures):
12
+
13
+ facade = OperationDescriptor(
14
+ doc=(
15
+ 'Returns features with a feature inclusion probability of exactly 0.5, meaning\n'
16
+ 'they are selected in exactly half of the valid configurations. These are the\n'
17
+ 'most unconstrained optional features.'
18
+ ),
19
+ returns='Union[None, List[str]]',
20
+ name='pure_optional_features', operation='BDDPureOptionalFeatures', default_backend='bdd'
21
+ )
11
22
  def __init__(self) -> None:
12
23
  self._result: list[Any] = []
13
24
  self._partial_configuration: Optional[Configuration] = None
@@ -1,12 +1,22 @@
1
1
  from typing import Any, Optional, cast
2
2
 
3
3
  from flamapy.core.models import VariabilityModel
4
+ from flamapy.core.operations.descriptor import OperationDescriptor
4
5
  from flamapy.metamodels.configuration_metamodel.models.configuration import Configuration
5
6
  from flamapy.metamodels.bdd_metamodel.models import BDDModel
6
7
  from flamapy.metamodels.bdd_metamodel.operations.interfaces import UniqueFeatures
7
8
 
8
9
 
9
10
  class BDDUniqueFeatures(UniqueFeatures):
11
+
12
+ facade = OperationDescriptor(
13
+ doc=(
14
+ 'Returns features that appear in exactly one valid configuration. These\n'
15
+ 'features uniquely identify a single product in the product line.'
16
+ ),
17
+ returns='Union[None, List[str]]',
18
+ name='unique_features', operation='BDDUniqueFeatures', default_backend='bdd'
19
+ )
10
20
  def __init__(self) -> None:
11
21
  self._result: list[Any] = []
12
22
  self._partial_configuration: Optional[Configuration] = None
@@ -1,12 +1,23 @@
1
1
  from typing import cast
2
2
 
3
3
  from flamapy.core.models import VariabilityModel
4
+ from flamapy.core.operations.descriptor import OperationDescriptor
4
5
  from flamapy.metamodels.bdd_metamodel.models import BDDModel
5
6
  from flamapy.metamodels.bdd_metamodel.operations.interfaces import Variability
6
7
  from flamapy.metamodels.bdd_metamodel.operations import BDDConfigurationsNumber, BDDVariantFeatures
7
8
 
8
9
 
9
10
  class BDDVariability(Variability):
11
+
12
+ facade = OperationDescriptor(
13
+ doc=(
14
+ 'Returns a tuple of (total_variability, partial_variability). Total variability\n'
15
+ 'is the ratio of valid configurations to the theoretical maximum; partial\n'
16
+ 'variability is the ratio relative to only the variant features.'
17
+ ),
18
+ returns='Union[None, Tuple[float, float]]',
19
+ name='variability', operation='BDDVariability', default_backend='bdd'
20
+ )
10
21
  def __init__(self) -> None:
11
22
  self._result: tuple[float, float] = (0.0, 0.0)
12
23
 
@@ -1,6 +1,7 @@
1
1
  from typing import Any, Optional, cast
2
2
 
3
3
  from flamapy.core.models import VariabilityModel
4
+ from flamapy.core.operations.descriptor import OperationDescriptor
4
5
  from flamapy.metamodels.configuration_metamodel.models.configuration import Configuration
5
6
  from flamapy.metamodels.bdd_metamodel.models import BDDModel
6
7
  from flamapy.metamodels.bdd_metamodel.operations.interfaces import VariantFeatures
@@ -8,6 +9,16 @@ from flamapy.metamodels.bdd_metamodel.operations import BDDFeatureInclusionProba
8
9
 
9
10
 
10
11
  class BDDVariantFeatures(VariantFeatures):
12
+
13
+ facade = OperationDescriptor(
14
+ doc=(
15
+ 'Returns the features that are neither core nor dead — they appear in some but\n'
16
+ 'not all valid configurations. These are the features that actually vary across\n'
17
+ 'products.'
18
+ ),
19
+ returns='Union[None, List[str]]',
20
+ name='variant_features', operation='BDDVariantFeatures', default_backend='bdd'
21
+ )
11
22
  def __init__(self) -> None:
12
23
  self._result: list[Any] = []
13
24
  self._partial_configuration: Optional[Configuration] = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flamapy-bdd
3
- Version: 2.6.0.dev4
3
+ Version: 2.6.0.dev11
4
4
  Summary: bdd-plugin for the automated analysis of feature models
5
5
  Author-email: Flamapy <flamapy@us.es>
6
6
  License-Expression: GPL-3.0-or-later
@@ -8,8 +8,8 @@ Project-URL: Homepage, https://github.com/flamapy/bdd_metamodel
8
8
  Requires-Python: >=3.11
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
- Requires-Dist: flamapy-fw~=2.6.0.dev4
12
- Requires-Dist: flamapy-fm~=2.6.0.dev4
11
+ Requires-Dist: flamapy-fw~=2.6.0.dev11
12
+ Requires-Dist: flamapy-fm~=2.6.0.dev11
13
13
  Requires-Dist: dd~=0.6.0
14
14
  Requires-Dist: graphviz~=0.20
15
15
  Provides-Extra: dev
@@ -1,6 +1,6 @@
1
1
  flamapy/metamodels/bdd_metamodel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  flamapy/metamodels/bdd_metamodel/models/__init__.py,sha256=-BpGCtgHz2rZUgGcTEwxGZV1th2k_IZTzRMYS248dvc,57
3
- flamapy/metamodels/bdd_metamodel/models/bdd_model.py,sha256=ZewOZI2yZ7v-ldHbd5HrDwsk5zU5kLc8QjNBlIjtZKE,6543
3
+ flamapy/metamodels/bdd_metamodel/models/bdd_model.py,sha256=4rXy4fxFxLebm-bIjlNyhBrlUUMDiz5PLeL0wmsoAXM,6549
4
4
  flamapy/metamodels/bdd_metamodel/models/utils/__init__.py,sha256=H8u6unwMTgffAEHxKcLNTGo4w-VbIaVzaChbfqYVjdE,181
5
5
  flamapy/metamodels/bdd_metamodel/models/utils/pl_model.py,sha256=l59sx3nq3dqqBLPFAJNKSxS7ztw2fJTzeX2x_65LgQc,7936
6
6
  flamapy/metamodels/bdd_metamodel/models/utils/txtcnf.py,sha256=T4ZBkpelD84mOJhA6zjfEcki_gTMw17xQUjmjTlwwA8,8815
@@ -8,21 +8,21 @@ flamapy/metamodels/bdd_metamodel/operations/__init__.py,sha256=CYsYoGOJz8G_hQcdr
8
8
  flamapy/metamodels/bdd_metamodel/operations/bdd_commonality_factor.py,sha256=MtEIojr0OEOeEYQ0dZOwTY-ofqpLrp7jbv8Yb24RuVY,1449
9
9
  flamapy/metamodels/bdd_metamodel/operations/bdd_configurations.py,sha256=S1HUCizasn3yR-BDofGg0e96MnREUzw9Qe2tZL2n_A0,2022
10
10
  flamapy/metamodels/bdd_metamodel/operations/bdd_configurations_number.py,sha256=4TkTM5XxgarcE6kC1UikA7AE310UJAOaCUaTSvwrf1U,1927
11
- flamapy/metamodels/bdd_metamodel/operations/bdd_configurations_with_n_features.py,sha256=ur4Sh2idLpZf7Sx9mM7zjaKNRujb-CYeO6ddo_6Jays,4697
11
+ flamapy/metamodels/bdd_metamodel/operations/bdd_configurations_with_n_features.py,sha256=Kt3AdkrhiFaGcNlcyO1TDl27euu0nKqFG2gLKnSzBiw,5325
12
12
  flamapy/metamodels/bdd_metamodel/operations/bdd_core_features.py,sha256=zVd3HTS7CGiWGDZftKezXrKbys_Vtk4mVUg0uMt3VZQ,1355
13
13
  flamapy/metamodels/bdd_metamodel/operations/bdd_dead_features.py,sha256=OGXdPp9XDNVw5INslGf9n2FVoaLnpbvr1YAPG42n9vg,1355
14
- flamapy/metamodels/bdd_metamodel/operations/bdd_false_optional_features.py,sha256=ipfiSW27e6_XXU43-NL46VE5YOwRuSWZtg08FuR3RfA,1870
15
- flamapy/metamodels/bdd_metamodel/operations/bdd_feature_inclusion_probability.py,sha256=6woXkA7POunq15fbAbrAIO0KKJtl3rB2hgdACQBpSQI,8437
16
- flamapy/metamodels/bdd_metamodel/operations/bdd_homogeneity.py,sha256=8-78lxtoaNPn0PVxoU8FfzXpcXHfrAhAiMgyvgg3n-c,1205
14
+ flamapy/metamodels/bdd_metamodel/operations/bdd_false_optional_features.py,sha256=8vvNi6YDIFCcroYet_wbKPAPUhtehljto91UmbV0QzU,1921
15
+ flamapy/metamodels/bdd_metamodel/operations/bdd_feature_inclusion_probability.py,sha256=atJPyhiywU5gTtxbxwZPdyE9Ld7MgA_zmgzJYktIZCk,9004
16
+ flamapy/metamodels/bdd_metamodel/operations/bdd_homogeneity.py,sha256=Ye9Hna1jFzjf4_KsfxZZRThzwHu09ZtF_Xnz30-LauE,1731
17
17
  flamapy/metamodels/bdd_metamodel/operations/bdd_metrics.py,sha256=-3FgAeOr7mIcmv7T_jg3vxiGU0Pm0zKvdTsGEHA6mFA,11682
18
- flamapy/metamodels/bdd_metamodel/operations/bdd_product_distribution.py,sha256=RY-vK4BVpVQqrtiZvZoY1jiMlnrXugUlwcRSVzCkHoE,8780
19
- flamapy/metamodels/bdd_metamodel/operations/bdd_pure_optional_features.py,sha256=t0Vw8dR2Cvkm74bty6fDLWn4R-gpBU5LOx6e4CrxAFE,1477
18
+ flamapy/metamodels/bdd_metamodel/operations/bdd_product_distribution.py,sha256=K1y8xDkdvYz95CtLjKYx1o33QmM7Iw8xTcU3I2lG8VE,9263
19
+ flamapy/metamodels/bdd_metamodel/operations/bdd_pure_optional_features.py,sha256=pH-KdOTQdod5_ZzhmGBuE7qG58DedawhoRnYXV6psuE,1989
20
20
  flamapy/metamodels/bdd_metamodel/operations/bdd_sampling.py,sha256=HSmuPJieWuSJEW3XIngpO4ktS5aWM8_nEYgxUBDMVYk,7628
21
21
  flamapy/metamodels/bdd_metamodel/operations/bdd_satisfiable.py,sha256=Y0Jkrrndw-EkvOy-yvj10AqJKSs02-umZxq6jmpAZec,1217
22
22
  flamapy/metamodels/bdd_metamodel/operations/bdd_satisfiable_configuration.py,sha256=S3fZcchxDM_dxsJmqVQdbp295KdGqJOrJnf1NxA5uyo,1618
23
- flamapy/metamodels/bdd_metamodel/operations/bdd_unique_features.py,sha256=CkyG1FClPGTm30vAZ8Ein6-c1QudjymDBvs0Gmz_GVs,2497
24
- flamapy/metamodels/bdd_metamodel/operations/bdd_variability.py,sha256=lkGbEHcWeJS5c9yOdmATPp3xh6LO6DPpFzl9L--NamM,1262
25
- flamapy/metamodels/bdd_metamodel/operations/bdd_variant_features.py,sha256=9jMkWtrEfHiaPQqyigcy7rsltfFhvgWKHROOV038KmI,1422
23
+ flamapy/metamodels/bdd_metamodel/operations/bdd_unique_features.py,sha256=TIZ_Ka9S9o2HaiMGGJuhEgubUQkP_NLMvsz3xJCIIss,2923
24
+ flamapy/metamodels/bdd_metamodel/operations/bdd_variability.py,sha256=gaNWc4m5wXdJNSZMG9InvnvxDgqCBWdOf3aAdnFix6M,1787
25
+ flamapy/metamodels/bdd_metamodel/operations/bdd_variant_features.py,sha256=jBaHyjGYsWB1lSQkA6ojtdI4U-_N2B1J3tomgkPn9Fs,1899
26
26
  flamapy/metamodels/bdd_metamodel/operations/interfaces/__init__.py,sha256=rb81mxtnooERGqlAIvxFTKxu484W234tA4Aw-Jk5A5I,610
27
27
  flamapy/metamodels/bdd_metamodel/operations/interfaces/commonality_factor.py,sha256=iqzCeJZQG4v5Tav9dZCOg44SiUSsha-6YBvE6f4fZ_o,819
28
28
  flamapy/metamodels/bdd_metamodel/operations/interfaces/feature_inclusion_probability.py,sha256=UO4D34BY1TpamI7TB2204vBtLbp7Wbj1QhdA2jSEyt4,1122
@@ -41,8 +41,8 @@ flamapy/metamodels/bdd_metamodel/transformations/json_writer.py,sha256=V9WB2lZf3
41
41
  flamapy/metamodels/bdd_metamodel/transformations/pdf_writer.py,sha256=9gVPvsE7a5zrWs90Ga9zEFmZx8psDxGxArckEP6BytQ,618
42
42
  flamapy/metamodels/bdd_metamodel/transformations/png_writer.py,sha256=I9kzWHiiv2HH5xgReua6FlXLSUrTbFAoQYN8HPRN0fo,618
43
43
  flamapy/metamodels/bdd_metamodel/transformations/svg_writer.py,sha256=AOrP_nWyHTOFNZyfk93FQgYdax2wdG5ZU6j30cnU33U,618
44
- flamapy_bdd-2.6.0.dev4.dist-info/licenses/LICENSE,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
45
- flamapy_bdd-2.6.0.dev4.dist-info/METADATA,sha256=LWrWu-fasRC1uqykXBeVRWpIOhcv-POrP0Cs4JzlCWU,1000
46
- flamapy_bdd-2.6.0.dev4.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
47
- flamapy_bdd-2.6.0.dev4.dist-info/top_level.txt,sha256=2YBI9dg4GVk28AJuyNu6dldi5Riwt5SP0zpNe2lSU5M,8
48
- flamapy_bdd-2.6.0.dev4.dist-info/RECORD,,
44
+ flamapy_bdd-2.6.0.dev11.dist-info/licenses/LICENSE,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
45
+ flamapy_bdd-2.6.0.dev11.dist-info/METADATA,sha256=JJZQA47zPOpdfrFUvIvOorrqCfdtTfOD3HgbyaPKDog,1003
46
+ flamapy_bdd-2.6.0.dev11.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
47
+ flamapy_bdd-2.6.0.dev11.dist-info/top_level.txt,sha256=2YBI9dg4GVk28AJuyNu6dldi5Riwt5SP0zpNe2lSU5M,8
48
+ flamapy_bdd-2.6.0.dev11.dist-info/RECORD,,