flamapy-sat 2.5.0.dev0__tar.gz → 2.6.0.dev0__tar.gz

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.
Files changed (56) hide show
  1. {flamapy_sat-2.5.0.dev0/flamapy_sat.egg-info → flamapy_sat-2.6.0.dev0}/PKG-INFO +13 -14
  2. flamapy_sat-2.6.0.dev0/README.md +15 -0
  3. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/operations/__init__.py +2 -0
  4. flamapy_sat-2.6.0.dev0/flamapy/metamodels/pysat_metamodel/operations/pysat_backbone.py +73 -0
  5. flamapy_sat-2.6.0.dev0/flamapy/metamodels/pysat_metamodel/operations/pysat_core_features.py +24 -0
  6. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/operations/pysat_dead_features.py +3 -13
  7. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/transformations/fm_to_pysat.py +1 -1
  8. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0/flamapy_sat.egg-info}/PKG-INFO +13 -14
  9. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy_sat.egg-info/SOURCES.txt +1 -0
  10. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy_sat.egg-info/requires.txt +2 -2
  11. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/pyproject.toml +3 -3
  12. flamapy_sat-2.5.0.dev0/README.md +0 -16
  13. flamapy_sat-2.5.0.dev0/flamapy/metamodels/pysat_metamodel/operations/pysat_core_features.py +0 -35
  14. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/LICENSE +0 -0
  15. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/__init__.py +0 -0
  16. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/models/__init__.py +0 -0
  17. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/models/pysat_diagnosis_model.py +0 -0
  18. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/__init__.py +0 -0
  19. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/diagnosis/__init__.py +0 -0
  20. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/diagnosis/checker.py +0 -0
  21. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/diagnosis/fastdiag.py +0 -0
  22. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/diagnosis/hsdag/__init__.py +0 -0
  23. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/diagnosis/hsdag/hsdag.py +0 -0
  24. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/diagnosis/hsdag/labeler/__init__.py +0 -0
  25. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/diagnosis/hsdag/labeler/fastdiag_labeler.py +0 -0
  26. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/diagnosis/hsdag/labeler/labeler.py +0 -0
  27. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/diagnosis/hsdag/labeler/quickxplain_labeler.py +0 -0
  28. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/diagnosis/hsdag/node.py +0 -0
  29. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/diagnosis/quickxplain.py +0 -0
  30. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/diagnosis/utils.py +0 -0
  31. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/pysat_abstract_identifier.py +0 -0
  32. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/pysat_conflict.py +0 -0
  33. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/operations/pysat_diagnosis.py +0 -0
  34. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/transformations/__init__.py +0 -0
  35. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_diagnosis_metamodel/transformations/fm_to_diag_pysat.py +0 -0
  36. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/__init__.py +0 -0
  37. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/models/__init__.py +0 -0
  38. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/models/pysat_model.py +0 -0
  39. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/models/txtcnf_model.py +0 -0
  40. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/operations/pysat_commonality.py +0 -0
  41. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/operations/pysat_configurations.py +0 -0
  42. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/operations/pysat_configurations_number.py +0 -0
  43. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/operations/pysat_false_optional_features.py +0 -0
  44. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/operations/pysat_filter.py +0 -0
  45. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/operations/pysat_metrics.py +0 -0
  46. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/operations/pysat_sampling.py +0 -0
  47. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/operations/pysat_satisfiable.py +0 -0
  48. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/operations/pysat_satisfiable_configuration.py +0 -0
  49. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/transformations/__init__.py +0 -0
  50. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/transformations/cnf_to_pysat.py +0 -0
  51. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/transformations/dimacs_reader.py +0 -0
  52. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy/metamodels/pysat_metamodel/transformations/dimacs_writer.py +0 -0
  53. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy_sat.egg-info/dependency_links.txt +0 -0
  54. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/flamapy_sat.egg-info/top_level.txt +0 -0
  55. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/setup.cfg +0 -0
  56. {flamapy_sat-2.5.0.dev0 → flamapy_sat-2.6.0.dev0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flamapy-sat
3
- Version: 2.5.0.dev0
3
+ Version: 2.6.0.dev0
4
4
  Summary: flamapy-sat is a plugin to flamapy module
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/pysat_metamodel
8
8
  Requires-Python: >=3.9
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
- Requires-Dist: flamapy-fw~=2.5.0.dev0
12
- Requires-Dist: flamapy-fm~=2.5.0.dev0
11
+ Requires-Dist: flamapy-fw~=2.6.0.dev0
12
+ Requires-Dist: flamapy-fm~=2.6.0.dev0
13
13
  Requires-Dist: python-sat~=0.1.7.dev1
14
14
  Provides-Extra: dev
15
15
  Requires-Dist: pytest; extra == "dev"
@@ -19,19 +19,18 @@ Requires-Dist: mypy; extra == "dev"
19
19
  Requires-Dist: coverage; extra == "dev"
20
20
  Dynamic: license-file
21
21
 
22
- # pysat_metamodel
22
+ # flamapy-sat
23
23
 
24
- This repository will host the pysat metamodel and its operation implementation
24
+ SAT-based analysis for [flamapy](https://flamapy.org) feature models (PySAT
25
+ backend, giving access to more than ten SAT solvers). Also ships the diagnosis
26
+ metamodel (conflict detection and diagnosis).
25
27
 
28
+ **Documentation:**
29
+ - SAT plugin: https://docs.flamapy.org/framework/plugins/sat_plugin
30
+ - Diagnosis plugin: https://docs.flamapy.org/framework/plugins/diagnosis_plugin
26
31
 
27
- ## Install for development
32
+ ## Installation
28
33
 
29
- ``` bash
30
- pip install -e .
31
- ```
32
-
33
- ## Make sure that you have installed python-dev
34
-
35
- ``` bash
36
- sudo apt install python-dev #python3-dev in Ubuntu derivatives
34
+ ```bash
35
+ pip install flamapy-sat
37
36
  ```
@@ -0,0 +1,15 @@
1
+ # flamapy-sat
2
+
3
+ SAT-based analysis for [flamapy](https://flamapy.org) feature models (PySAT
4
+ backend, giving access to more than ten SAT solvers). Also ships the diagnosis
5
+ metamodel (conflict detection and diagnosis).
6
+
7
+ **Documentation:**
8
+ - SAT plugin: https://docs.flamapy.org/framework/plugins/sat_plugin
9
+ - Diagnosis plugin: https://docs.flamapy.org/framework/plugins/diagnosis_plugin
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ pip install flamapy-sat
15
+ ```
@@ -4,6 +4,7 @@ from .pysat_configurations import PySATConfigurations
4
4
  from .pysat_configurations_number import PySATConfigurationsNumber
5
5
  from .pysat_commonality import PySATCommonality
6
6
  from .pysat_filter import PySATFilter
7
+ from .pysat_backbone import PySATBackbone
7
8
  from .pysat_core_features import PySATCoreFeatures
8
9
  from .pysat_dead_features import PySATDeadFeatures
9
10
  from .pysat_false_optional_features import PySATFalseOptionalFeatures
@@ -11,6 +12,7 @@ from .pysat_metrics import PySATMetrics
11
12
 
12
13
 
13
14
  __all__ = [
15
+ 'PySATBackbone',
14
16
  'PySATCommonality',
15
17
  'PySATConfigurations',
16
18
  'PySATConfigurationsNumber',
@@ -0,0 +1,73 @@
1
+ from typing import Any, cast
2
+
3
+ from pysat.solvers import Solver
4
+
5
+ from flamapy.core.operations import Operation
6
+ from flamapy.metamodels.pysat_metamodel.models.pysat_model import PySATModel
7
+ from flamapy.core.models import VariabilityModel
8
+
9
+
10
+ class PySATBackbone(Operation):
11
+
12
+ def __init__(self) -> None:
13
+ self._result: dict[str, list[Any]] = {"core": [], "dead": []}
14
+
15
+
16
+ def get_backbone(self) -> dict[str, list[Any]]:
17
+ return self.get_result()
18
+
19
+ def get_result(self) -> dict[str, list[Any]]:
20
+ return self._result
21
+
22
+ def execute(self, model: VariabilityModel) -> 'PySATBackbone':
23
+ sat_model = cast(PySATModel, model)
24
+ self._result = get_backbone(sat_model)
25
+ return self
26
+
27
+
28
+ def get_backbone(model: PySATModel) -> dict[str, list[Any]]:
29
+ # B <- Ø
30
+ backbone_core = []
31
+ backbone_dead = []
32
+
33
+ id_to_name = model.features
34
+ relevant_ids = set(id_to_name.keys())
35
+
36
+ solver = Solver(name='glucose3')
37
+ for clause in model.get_all_clauses().clauses:
38
+ solver.add_clause(clause)
39
+
40
+ # (out, C) <- SAT(phi)
41
+ if not solver.solve():
42
+ solver.delete()
43
+ return {"core": [], "dead": list(id_to_name.values())}
44
+
45
+ # 3. C <- filter(C)
46
+ initial_model = solver.get_model()
47
+ candidates = {lit for lit in initial_model if abs(lit) in relevant_ids}
48
+
49
+ # while C != Ø do
50
+ while candidates:
51
+ # l <- pick a literal from C
52
+ literal = next(iter(candidates))
53
+
54
+ # (out, S) <- SAT(phi U {not l})
55
+ if not solver.solve(assumptions=[-literal]):
56
+ # out = unsat -> l is in the backbone
57
+ name = id_to_name[abs(literal)]
58
+ if literal > 0:
59
+ backbone_core.append(name)
60
+ else:
61
+ backbone_dead.append(name)
62
+
63
+ # C <- C \ {l}
64
+ candidates.remove(literal)
65
+
66
+ # phi <- phi U {l}
67
+ solver.add_clause([literal])
68
+ else:
69
+ new_model_set = set(solver.get_model())
70
+ # C <- C ∩ S
71
+ candidates &= new_model_set
72
+ solver.delete()
73
+ return {"core": backbone_core, "dead": backbone_dead}
@@ -0,0 +1,24 @@
1
+ from typing import Any, cast
2
+
3
+
4
+ from flamapy.core.operations import CoreFeatures
5
+ from flamapy.metamodels.pysat_metamodel.operations import PySATBackbone
6
+ from flamapy.metamodels.pysat_metamodel.models.pysat_model import PySATModel
7
+ from flamapy.core.models import VariabilityModel
8
+
9
+
10
+ class PySATCoreFeatures(CoreFeatures):
11
+
12
+ def __init__(self) -> None:
13
+ self.core_features: list[Any] = []
14
+
15
+ def get_core_features(self) -> list[Any]:
16
+ return self.core_features
17
+
18
+ def get_result(self) -> list[Any]:
19
+ return self.get_core_features()
20
+
21
+ def execute(self, model: VariabilityModel) -> 'PySATCoreFeatures':
22
+ sat_model = cast(PySATModel, model)
23
+ self.core_features = PySATBackbone().execute(sat_model).get_result()["core"]
24
+ return self
@@ -1,8 +1,8 @@
1
1
  from typing import Any, cast
2
2
 
3
- from pysat.solvers import Solver
4
3
 
5
4
  from flamapy.core.operations import DeadFeatures
5
+ from flamapy.metamodels.pysat_metamodel.operations import PySATBackbone
6
6
  from flamapy.metamodels.pysat_metamodel.models.pysat_model import PySATModel
7
7
  from flamapy.core.models import VariabilityModel
8
8
 
@@ -11,7 +11,6 @@ class PySATDeadFeatures(DeadFeatures):
11
11
 
12
12
  def __init__(self) -> None:
13
13
  self.dead_features: list[Any] = []
14
- self.solver = Solver(name='glucose3')
15
14
 
16
15
  def get_dead_features(self) -> list[Any]:
17
16
  return self.dead_features
@@ -20,15 +19,6 @@ class PySATDeadFeatures(DeadFeatures):
20
19
  return self.get_dead_features()
21
20
 
22
21
  def execute(self, model: VariabilityModel) -> 'PySATDeadFeatures':
23
- model = cast(PySATModel, model)
24
-
25
- for clause in model.get_all_clauses(): # AC es conjunto de conjuntos
26
- self.solver.add_clause(clause) # añadimos la constraint
27
-
28
- dead_features = []
29
- for variable in model.variables.items():
30
- if not self.solver.solve(assumptions=[variable[1]]):
31
- dead_features.append(variable[0])
32
- self.dead_features = dead_features
33
- self.solver.delete()
22
+ sat_model = cast(PySATModel, model)
23
+ self.dead_features = PySATBackbone().execute(sat_model).get_result()["dead"]
34
24
  return self
@@ -96,7 +96,7 @@ class FmToPysat(ModelToModel):
96
96
 
97
97
  # This is a _min to _max relationship
98
98
  _min = relation.card_min
99
- _max = relation.card_max
99
+ _max = relation.card_max if relation.card_max != -1 else len(relation.children)
100
100
 
101
101
  clauses = []
102
102
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flamapy-sat
3
- Version: 2.5.0.dev0
3
+ Version: 2.6.0.dev0
4
4
  Summary: flamapy-sat is a plugin to flamapy module
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/pysat_metamodel
8
8
  Requires-Python: >=3.9
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
- Requires-Dist: flamapy-fw~=2.5.0.dev0
12
- Requires-Dist: flamapy-fm~=2.5.0.dev0
11
+ Requires-Dist: flamapy-fw~=2.6.0.dev0
12
+ Requires-Dist: flamapy-fm~=2.6.0.dev0
13
13
  Requires-Dist: python-sat~=0.1.7.dev1
14
14
  Provides-Extra: dev
15
15
  Requires-Dist: pytest; extra == "dev"
@@ -19,19 +19,18 @@ Requires-Dist: mypy; extra == "dev"
19
19
  Requires-Dist: coverage; extra == "dev"
20
20
  Dynamic: license-file
21
21
 
22
- # pysat_metamodel
22
+ # flamapy-sat
23
23
 
24
- This repository will host the pysat metamodel and its operation implementation
24
+ SAT-based analysis for [flamapy](https://flamapy.org) feature models (PySAT
25
+ backend, giving access to more than ten SAT solvers). Also ships the diagnosis
26
+ metamodel (conflict detection and diagnosis).
25
27
 
28
+ **Documentation:**
29
+ - SAT plugin: https://docs.flamapy.org/framework/plugins/sat_plugin
30
+ - Diagnosis plugin: https://docs.flamapy.org/framework/plugins/diagnosis_plugin
26
31
 
27
- ## Install for development
32
+ ## Installation
28
33
 
29
- ``` bash
30
- pip install -e .
31
- ```
32
-
33
- ## Make sure that you have installed python-dev
34
-
35
- ``` bash
36
- sudo apt install python-dev #python3-dev in Ubuntu derivatives
34
+ ```bash
35
+ pip install flamapy-sat
37
36
  ```
@@ -28,6 +28,7 @@ flamapy/metamodels/pysat_metamodel/models/__init__.py
28
28
  flamapy/metamodels/pysat_metamodel/models/pysat_model.py
29
29
  flamapy/metamodels/pysat_metamodel/models/txtcnf_model.py
30
30
  flamapy/metamodels/pysat_metamodel/operations/__init__.py
31
+ flamapy/metamodels/pysat_metamodel/operations/pysat_backbone.py
31
32
  flamapy/metamodels/pysat_metamodel/operations/pysat_commonality.py
32
33
  flamapy/metamodels/pysat_metamodel/operations/pysat_configurations.py
33
34
  flamapy/metamodels/pysat_metamodel/operations/pysat_configurations_number.py
@@ -1,5 +1,5 @@
1
- flamapy-fw~=2.5.0.dev0
2
- flamapy-fm~=2.5.0.dev0
1
+ flamapy-fw~=2.6.0.dev0
2
+ flamapy-fm~=2.6.0.dev0
3
3
  python-sat~=0.1.7.dev1
4
4
 
5
5
  [dev]
@@ -4,15 +4,15 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "flamapy-sat"
7
- version = "2.5.0.dev0"
7
+ version = "2.6.0.dev0"
8
8
  description = "flamapy-sat is a plugin to flamapy module"
9
9
  readme = "README.md"
10
10
  license = "GPL-3.0-or-later"
11
11
  authors = [{ name = "Flamapy", email = "flamapy@us.es" }]
12
12
  requires-python = ">=3.9"
13
13
  dependencies = [
14
- "flamapy-fw~=2.5.0.dev0",
15
- "flamapy-fm~=2.5.0.dev0",
14
+ "flamapy-fw~=2.6.0.dev0",
15
+ "flamapy-fm~=2.6.0.dev0",
16
16
  "python-sat~=0.1.7.dev1",
17
17
  ]
18
18
 
@@ -1,16 +0,0 @@
1
- # pysat_metamodel
2
-
3
- This repository will host the pysat metamodel and its operation implementation
4
-
5
-
6
- ## Install for development
7
-
8
- ``` bash
9
- pip install -e .
10
- ```
11
-
12
- ## Make sure that you have installed python-dev
13
-
14
- ``` bash
15
- sudo apt install python-dev #python3-dev in Ubuntu derivatives
16
- ```
@@ -1,35 +0,0 @@
1
- from typing import Any, cast
2
-
3
- from pysat.solvers import Solver
4
-
5
- from flamapy.core.operations import CoreFeatures
6
- from flamapy.metamodels.pysat_metamodel.models.pysat_model import PySATModel
7
- from flamapy.core.models import VariabilityModel
8
-
9
-
10
- class PySATCoreFeatures(CoreFeatures):
11
-
12
- def __init__(self) -> None:
13
- self.core_features: list[Any] = []
14
- self.solver = Solver(name='glucose3')
15
-
16
- def get_core_features(self) -> list[Any]:
17
- return self.core_features
18
-
19
- def get_result(self) -> list[Any]:
20
- return self.get_core_features()
21
-
22
- def execute(self, model: VariabilityModel) -> 'PySATCoreFeatures':
23
- model = cast(PySATModel, model)
24
- for clause in model.get_all_clauses(): # AC es conjunto de conjuntos
25
- self.solver.add_clause(clause) # añadimos la constraint
26
-
27
- core_features = []
28
- if self.solver.solve():
29
- for variable in model.variables.items():
30
- if not self.solver.solve(assumptions=[-variable[1]]):
31
- core_features.append(variable[0])
32
-
33
- self.core_features = core_features
34
- self.solver.delete()
35
- return self