flamapy-dnnf 2.6.0.dev6__tar.gz → 2.6.0.dev12__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.
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/PKG-INFO +3 -4
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy/metamodels/dnnf_metamodel/transformations/fm_to_dnnf.py +8 -12
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy_dnnf.egg-info/PKG-INFO +3 -4
- flamapy_dnnf-2.6.0.dev12/flamapy_dnnf.egg-info/requires.txt +9 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/pyproject.toml +3 -4
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/tests/test_dnnf.py +20 -7
- flamapy_dnnf-2.6.0.dev6/flamapy_dnnf.egg-info/requires.txt +0 -10
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/LICENSE +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/README.md +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy/metamodels/dnnf_metamodel/__init__.py +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy/metamodels/dnnf_metamodel/models/__init__.py +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy/metamodels/dnnf_metamodel/models/dnnf_model.py +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy/metamodels/dnnf_metamodel/operations/__init__.py +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy/metamodels/dnnf_metamodel/operations/d4_runner.py +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy/metamodels/dnnf_metamodel/operations/dnnf_configurations_number.py +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy/metamodels/dnnf_metamodel/operations/dnnf_satisfiable.py +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy/metamodels/dnnf_metamodel/transformations/__init__.py +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy_dnnf.egg-info/SOURCES.txt +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy_dnnf.egg-info/dependency_links.txt +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy_dnnf.egg-info/top_level.txt +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/setup.cfg +0 -0
- {flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flamapy-dnnf
|
|
3
|
-
Version: 2.6.0.
|
|
3
|
+
Version: 2.6.0.dev12
|
|
4
4
|
Summary: flamapy-dnnf is a plugin to flamapy providing exact analysis of feature models via d-DNNF knowledge compilation with the d4 compiler
|
|
5
5
|
Author-email: Flamapy <flamapy@us.es>
|
|
6
6
|
License-Expression: GPL-3.0-or-later
|
|
@@ -8,9 +8,8 @@ Project-URL: Homepage, https://github.com/flamapy/dnnf_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.
|
|
12
|
-
Requires-Dist: flamapy-fm~=2.6.0.
|
|
13
|
-
Requires-Dist: flamapy-sat~=2.6.0.dev5
|
|
11
|
+
Requires-Dist: flamapy-fw~=2.6.0.dev12
|
|
12
|
+
Requires-Dist: flamapy-fm~=2.6.0.dev12
|
|
14
13
|
Provides-Extra: dev
|
|
15
14
|
Requires-Dist: pytest; extra == "dev"
|
|
16
15
|
Requires-Dist: pytest-mock; extra == "dev"
|
|
@@ -3,16 +3,16 @@ import subprocess
|
|
|
3
3
|
import tempfile
|
|
4
4
|
|
|
5
5
|
from flamapy.core.transformations import ModelToModel
|
|
6
|
-
from flamapy.metamodels.fm_metamodel.models import FeatureModel
|
|
7
|
-
from flamapy.metamodels.pysat_metamodel.transformations import FmToPysat
|
|
6
|
+
from flamapy.metamodels.fm_metamodel.models import FeatureModel, ClauseSet
|
|
8
7
|
from flamapy.metamodels.dnnf_metamodel.models import DDNNFModel, locate_d4
|
|
9
8
|
|
|
10
9
|
|
|
11
10
|
class FmToDDNNF(ModelToModel):
|
|
12
11
|
"""Transform a feature model into a d-DNNF-backed model.
|
|
13
12
|
|
|
14
|
-
Builds the CNF
|
|
15
|
-
set — invokes d4 to dump the compiled d-DNNF artifact.
|
|
13
|
+
Builds the CNF via the feature-model ``ClauseSet`` (no SAT-solver dependency), writes it as
|
|
14
|
+
DIMACS, and — when ``compile`` is set — invokes d4 to dump the compiled d-DNNF artifact.
|
|
15
|
+
Exact queries run d4 on the DIMACS.
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
18
|
@staticmethod
|
|
@@ -35,12 +35,8 @@ class FmToDDNNF(ModelToModel):
|
|
|
35
35
|
self.destination_model = DDNNFModel()
|
|
36
36
|
|
|
37
37
|
def transform(self) -> DDNNFModel:
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
else:
|
|
41
|
-
sat_model = FmToPysat(self.source_model, cnf_method=self.cnf_method).transform()
|
|
42
|
-
|
|
43
|
-
clauses = [list(clause) for clause in sat_model.get_all_clauses().clauses]
|
|
38
|
+
clause_set = ClauseSet.from_feature_model(self.source_model, cnf_method=self.cnf_method)
|
|
39
|
+
clauses = [list(clause) for clause in clause_set.clauses]
|
|
44
40
|
var_count = max((abs(literal) for clause in clauses for literal in clause), default=1)
|
|
45
41
|
|
|
46
42
|
dimacs_fd, dimacs_path = tempfile.mkstemp(suffix='.cnf', prefix='flamapy_dnnf_')
|
|
@@ -52,8 +48,8 @@ class FmToDDNNF(ModelToModel):
|
|
|
52
48
|
model = self.destination_model
|
|
53
49
|
model.dimacs_path = dimacs_path
|
|
54
50
|
model.var_count = var_count
|
|
55
|
-
model.variables = dict(
|
|
56
|
-
model.features = dict(
|
|
51
|
+
model.variables = dict(clause_set.variables)
|
|
52
|
+
model.features = dict(clause_set.features)
|
|
57
53
|
model.original_model = self.source_model
|
|
58
54
|
|
|
59
55
|
if self.compile:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flamapy-dnnf
|
|
3
|
-
Version: 2.6.0.
|
|
3
|
+
Version: 2.6.0.dev12
|
|
4
4
|
Summary: flamapy-dnnf is a plugin to flamapy providing exact analysis of feature models via d-DNNF knowledge compilation with the d4 compiler
|
|
5
5
|
Author-email: Flamapy <flamapy@us.es>
|
|
6
6
|
License-Expression: GPL-3.0-or-later
|
|
@@ -8,9 +8,8 @@ Project-URL: Homepage, https://github.com/flamapy/dnnf_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.
|
|
12
|
-
Requires-Dist: flamapy-fm~=2.6.0.
|
|
13
|
-
Requires-Dist: flamapy-sat~=2.6.0.dev5
|
|
11
|
+
Requires-Dist: flamapy-fw~=2.6.0.dev12
|
|
12
|
+
Requires-Dist: flamapy-fm~=2.6.0.dev12
|
|
14
13
|
Provides-Extra: dev
|
|
15
14
|
Requires-Dist: pytest; extra == "dev"
|
|
16
15
|
Requires-Dist: pytest-mock; extra == "dev"
|
|
@@ -4,16 +4,15 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "flamapy-dnnf"
|
|
7
|
-
version = "2.6.0.
|
|
7
|
+
version = "2.6.0.dev12"
|
|
8
8
|
description = "flamapy-dnnf is a plugin to flamapy providing exact analysis of feature models via d-DNNF knowledge compilation with the d4 compiler"
|
|
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.11"
|
|
13
13
|
dependencies = [
|
|
14
|
-
"flamapy-fw~=2.6.0.
|
|
15
|
-
"flamapy-fm~=2.6.0.
|
|
16
|
-
"flamapy-sat~=2.6.0.dev5",
|
|
14
|
+
"flamapy-fw~=2.6.0.dev12",
|
|
15
|
+
"flamapy-fm~=2.6.0.dev12",
|
|
17
16
|
]
|
|
18
17
|
|
|
19
18
|
[project.optional-dependencies]
|
|
@@ -1,25 +1,38 @@
|
|
|
1
1
|
"""Tests for the d-DNNF (d4) metamodel.
|
|
2
2
|
|
|
3
3
|
d4 is a native binary with no PyPI distribution, so these tests are skipped unless d4 is
|
|
4
|
-
available (on PATH or via FLAMAPY_D4_PATH). When present, exact counts are checked against
|
|
5
|
-
SAT
|
|
4
|
+
available (on PATH or via FLAMAPY_D4_PATH). When present, exact counts are checked against an
|
|
5
|
+
oracle brute-forced from fm_metamodel's solver-agnostic ClauseSet (no SAT plugin needed).
|
|
6
6
|
"""
|
|
7
7
|
import os
|
|
8
8
|
import shutil
|
|
9
9
|
import tempfile
|
|
10
|
+
from itertools import product
|
|
10
11
|
|
|
11
12
|
import pytest
|
|
12
13
|
|
|
13
14
|
from flamapy.metamodels.fm_metamodel.transformations import UVLReader
|
|
15
|
+
from flamapy.metamodels.fm_metamodel.models import FeatureModel, ClauseSet
|
|
14
16
|
from flamapy.metamodels.dnnf_metamodel.transformations import FmToDDNNF
|
|
15
17
|
from flamapy.metamodels.dnnf_metamodel.operations import (
|
|
16
18
|
DDNNFConfigurationsNumber,
|
|
17
19
|
DDNNFSatisfiable,
|
|
18
20
|
)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _exact_count(fm: FeatureModel) -> int:
|
|
24
|
+
"""Exact configuration count by brute-forcing the ClauseSet CNF (no SAT backend)."""
|
|
25
|
+
clause_set = ClauseSet.from_feature_model(fm)
|
|
26
|
+
name_of = {vid: name for name, vid in clause_set.variables.items()}
|
|
27
|
+
var_ids = sorted({abs(lit) for clause in clause_set.clauses for lit in clause}
|
|
28
|
+
| set(clause_set.variables.values()))
|
|
29
|
+
configs = set()
|
|
30
|
+
for bits in product((False, True), repeat=len(var_ids)):
|
|
31
|
+
assignment = dict(zip(var_ids, bits))
|
|
32
|
+
if all(any((lit > 0) == assignment[abs(lit)] for lit in clause)
|
|
33
|
+
for clause in clause_set.clauses):
|
|
34
|
+
configs.add(frozenset(name_of[v] for v in var_ids if assignment[v] and v in name_of))
|
|
35
|
+
return len(configs)
|
|
23
36
|
|
|
24
37
|
_D4_AVAILABLE = bool(os.environ.get('FLAMAPY_D4_PATH') or shutil.which('d4'))
|
|
25
38
|
requires_d4 = pytest.mark.skipif(not _D4_AVAILABLE, reason='the d4 compiler is not installed')
|
|
@@ -51,7 +64,7 @@ def _fm(uvl):
|
|
|
51
64
|
@requires_d4
|
|
52
65
|
def test_count_matches_sat():
|
|
53
66
|
fm = _fm(_UVL)
|
|
54
|
-
exact =
|
|
67
|
+
exact = _exact_count(fm)
|
|
55
68
|
dnnf = DDNNFConfigurationsNumber().execute(FmToDDNNF(fm).transform()).get_result()
|
|
56
69
|
assert dnnf == exact
|
|
57
70
|
|
|
File without changes
|
|
File without changes
|
{flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy/metamodels/dnnf_metamodel/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{flamapy_dnnf-2.6.0.dev6 → flamapy_dnnf-2.6.0.dev12}/flamapy_dnnf.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|