Skip to content

Commit ee61d60

Browse files
committed
Fix complete_models() tests
1 parent 93ce84a commit ee61d60

File tree

2 files changed

+29
-16
lines changed

2 files changed

+29
-16
lines changed

nnf/__init__.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
Model = t.Dict[Name, bool]
3232

3333
__all__ = ('NNF', 'Internal', 'And', 'Or', 'Var', 'Aux', 'Builder',
34-
'all_models', 'decision', 'true', 'false', 'dsharp',
35-
'dimacs', 'amc', 'tseitin', 'operators')
34+
'all_models', 'complete_models', 'decision', 'true', 'false',
35+
'dsharp', 'dimacs', 'amc', 'tseitin', 'operators')
3636

3737

3838
def all_models(names: 't.Iterable[Name]') -> t.Iterator[Model]:
@@ -1569,8 +1569,9 @@ def map(self, func: t.Callable[[T_NNF_co], U_NNF]) -> 'Or[U_NNF]':
15691569

15701570
def complete_models(
15711571
models: t.Iterable[Model],
1572-
names: t.FrozenSet[Name]
1572+
names: t.Iterable[Name]
15731573
) -> t.Iterator[Model]:
1574+
names = frozenset(names)
15741575
diff = None
15751576
for model in models:
15761577
if diff is None:

test_nnf.py

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212

1313
import nnf
1414

15-
from nnf import Var, And, Or, amc, dimacs, dsharp, operators, \
16-
tseitin, complete_models
15+
from nnf import (Var, And, Or, amc, dimacs, dsharp, operators,
16+
tseitin, complete_models)
1717

1818
settings.register_profile('patient', deadline=2000,
1919
suppress_health_check=(HealthCheck.too_slow,))
@@ -121,8 +121,10 @@ def CNF(draw):
121121

122122
@st.composite
123123
def models(draw):
124-
return And(Var(name, draw(st.booleans()))
125-
for name in range(1, 9))
124+
return And(
125+
Var(name, draw(st.booleans()))
126+
for name in range(1, draw(st.integers(min_value=1, max_value=9)))
127+
)
126128

127129

128130
@st.composite
@@ -766,25 +768,35 @@ def test_tseitin(sentence: nnf.NNF):
766768
T = tseitin.to_CNF(sentence)
767769
assert T.is_CNF()
768770

769-
# Only do the following checks when we haven't simplified away some vars
770-
# assume(sentence.vars() <= T.vars())
771-
772771
# TODO: Once forgetting/projection is implemented,
773772
# do this more complete check
774773
# aux = filter(lambda x: 'aux' in str(x.name), T.vars())
775774
# assert T.forget(aux).equivalent(sentence)
776775

777776
models = list(complete_models(T.models(), sentence.vars() | T.vars()))
778777

779-
for mt in T.models():
778+
for mt in models:
780779
assert sentence.satisfied_by(mt)
781780

782-
assert T.model_count() == sentence.model_count()
781+
assert len(models) == sentence.model_count()
783782

784783
@given(models())
785784
def test_complete_models(model: nnf.And[nnf.Var]):
786-
t0, t1, t2 = [], ['test1'], ['test1', 'test2']
787785
m = {v.name: v.true for v in model}
788-
assert 1 == len(list(complete_models([m], list(m.keys())+t0)))
789-
assert 2 == len(list(complete_models([m], list(m.keys())+t1)))
790-
assert 4 == len(list(complete_models([m], list(m.keys())+t2)))
786+
neg = {v.name: not v.true for v in model}
787+
788+
zero = list(complete_models([m], model.vars()))
789+
assert len(zero) == 1
790+
791+
one = list(complete_models([m], model.vars() | {"test1"}))
792+
assert len(one) == 2
793+
794+
two = list(complete_models([m], model.vars() | {"test1", "test2"}))
795+
assert len(two) == 4
796+
assert all(x.keys() == m.keys() | {"test1", "test2"} for x in two)
797+
798+
if m:
799+
multi = list(complete_models([m, neg], model.vars() | {"test1", "test2"}))
800+
assert len(multi) == 8
801+
assert len({frozenset(x.items()) for x in multi}) == 8 # all unique
802+
assert all(x.keys() == m.keys() | {"test1", "test2"} for x in multi)

0 commit comments

Comments
 (0)