Skip to content

Commit c2d36ab

Browse files
committed
hypercube(): add {min,max}_dimension constraint
1 parent 385a991 commit c2d36ab

File tree

4 files changed

+40
-2
lines changed

4 files changed

+40
-2
lines changed

bonesis/asp_encoding.py

+12
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,18 @@ def encode_trapspace(self, cfg, mutant=None):
444444
] + self.apply_mutant_to_mcfg(mutant, myts)
445445
return rules
446446

447+
def encode_hypercube(self, h):
448+
self.load_template_hypercube()
449+
H = clingo_encode(h.name)
450+
rules = [f"hypercube({H})" ]
451+
if h.min_dimension >= 1:
452+
rules.append(f":- #count {{ N: hypercube({H},N,2) }}"
453+
f"{h.min_dimension-1}")
454+
if h.max_dimension:
455+
rules.append(f":- {max_dimension+1} #count {{ N: hypercube({H},N,2) }}")
456+
print(rules)
457+
return rules
458+
447459
def encode_in_attractor(self, cfg, mutant=None):
448460
self.load_template_eval()
449461

bonesis/language.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,14 @@ def __str__(self):
236236
__language_api__["obs"] = ObservationVar
237237

238238
class HypercubeVar(BonesisVar):
239-
def __init__(self, obs=None):
239+
def __init__(self, obs=None,
240+
min_dimension=0,
241+
max_dimension=None,
242+
dimension=None):
243+
if dimension is not None:
244+
min_dimension = max_dimension = dimension
245+
self.min_dimension = min_dimension
246+
self.max_dimension = max_dimension
240247
if isinstance(obs, dict):
241248
obs = self.iface.obs(obs)
242249
self.obs = obs

bonesis/manager.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def register_configuration(self, cfg):
102102
def register_hypercube(self, h):
103103
name = f"_h{len(self.hypercubes)}"
104104
h.name = name
105-
self.push_term("hypercube", name)
105+
self.push_term("hypercube", h)
106106
if h.obs:
107107
self.register_predicate("bind_hypercube", name, h.obs.name)
108108

tests/test_fixed.py

+19
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ def setUp(self):
99
"000": {"a": 0, "b": 0, "c": 0},
1010
"111": {"a": 1, "b": 1, "c": 1},
1111
}
12+
self.dom2 = bonesis.InfluenceGraph.complete("abc", -1)
1213

1314
def test_fixpoints(self):
1415
bo = bonesis.BoNesis(self.dom1, self.data1)
@@ -19,3 +20,21 @@ def test_trapspace(self):
1920
bo = bonesis.BoNesis(self.dom1, self.data1)
2021
bo.fixed(bo.obs("000"))
2122
self.assertEqual(bo.boolean_networks().count(), 6859)
23+
24+
def test_mintrap(self):
25+
bo = bonesis.BoNesis(self.dom1)
26+
h = bo.hypercube(min_dimension=1)
27+
bo.fixed(h)
28+
self.assertEqual(len(list(h.assignments(limit=1))), 0)
29+
30+
bo = bonesis.BoNesis(self.dom2)
31+
h = bo.hypercube(min_dimension=2)
32+
bo.fixed(h)
33+
val = next(iter(h.assignments()))
34+
self.assertGreaterEqual(sum((1 for v in val.values() if v == '*')), 2)
35+
36+
bo = bonesis.BoNesis(self.dom2)
37+
h = bo.hypercube(max_dimension=0)
38+
bo.fixed(h)
39+
val = next(iter(h.assignments()))
40+
self.assertEqual(sum((1 for v in val.values() if v == '*')), 0)

0 commit comments

Comments
 (0)