Skip to content

Commit 3136e2c

Browse files
committed
use mpbn for BN encoding and non-monotone support
1 parent a50143c commit 3136e2c

File tree

2 files changed

+9
-73
lines changed

2 files changed

+9
-73
lines changed

bonesis/asp_encoding.py

+9-35
Original file line numberDiff line numberDiff line change
@@ -154,35 +154,6 @@ def encode_domain(self, domain):
154154
return self.encode_domain_InfluenceGraph(domain)
155155
raise TypeError(f"I don't know what to do with {type(domain)}")
156156

157-
def encode_BooleanFunction(self, n, f, ensure_dnf=True):
158-
def clauses_of_dnf(f):
159-
if f == self.ba.FALSE:
160-
return [False]
161-
if f == self.ba.TRUE:
162-
return [True]
163-
if isinstance(f, boolean.OR):
164-
return f.args
165-
else:
166-
return [f]
167-
def literals_of_clause(c):
168-
def make_literal(l):
169-
if isinstance(l, boolean.NOT):
170-
return (l.args[0].obj, -1)
171-
else:
172-
return (l.obj, 1)
173-
lits = c.args if isinstance(c, boolean.AND) else [c]
174-
return map(make_literal, lits)
175-
facts = []
176-
if ensure_dnf:
177-
f = self.ba.dnf(f).simplify()
178-
for cid, c in enumerate(clauses_of_dnf(f)):
179-
if isinstance(c, bool):
180-
facts.append(clingo.Function("constant", symbols(n, s2v(c))))
181-
else:
182-
for m, v in literals_of_clause(c):
183-
facts.append(clingo.Function("clause", symbols(n, cid+1, m, v)))
184-
return facts
185-
186157
def encode_domain_BooleanNetworksEnsemble(self, bns):
187158
preds = set()
188159
facts = []
@@ -199,12 +170,8 @@ def encode_domain_BooleanNetworksEnsemble(self, bns):
199170

200171
def encode_domain_BooleanNetwork(self, bn):
201172
self.ba = bn.ba
202-
facts = []
203-
facts.append(asp.Function("nbnode", symbols(len(bn))))
204-
for n, f in bn.items():
205-
facts.append(clingo.Function("node", symbols(n)))
206-
facts += self.encode_BooleanFunction(n, f, ensure_dnf=False)
207-
return facts
173+
return [bn.asp_of_bn() + "\n" +
174+
str(asp.Function("nbnode", symbols(len(bn))))]
208175

209176
def encode_domain_InfluenceGraph(self, pkn):
210177
self.load_template_domain()
@@ -273,6 +240,13 @@ def load_template_eval(self):
273240
"eval(X,N,-1) :- eval(X,N,C,-1): clause(N,C,_,_); clause(N,_,_,_), mcfg(X,_,_)",
274241
"eval(X,N,V) :- clamped(X,N,V)",
275242
"eval(X,N,V) :- constant(N,V), mcfg(X,_,_), not clamped(X,N,_)",
243+
244+
"eval(X,N,V) :- evalbdd(X,N,V), node(N), not clamped(X,N,_)",
245+
"evalbdd(X,V,V) :- mcfg(X,_,_), V=(-1;1)",
246+
"evalbdd(X,B,V) :- bdd(B,N,_,HI), mcfg(X,N,1), evalbdd(X,HI,V)",
247+
"evalbdd(X,B,V) :- bdd(B,N,LO,_), mcfg(X,N,-1), evalbdd(X,LO,V)",
248+
"evalbdd(X,B,V) :- mcfg(X,_,_), bdd(B,V)",
249+
276250
"mcfg(X,N,V) :- ext(X,N,V)",
277251
]
278252
self.push(rules)

bonesis/domains.py

-38
Original file line numberDiff line numberDiff line change
@@ -44,44 +44,6 @@
4444
class BonesisDomain(object):
4545
pass
4646

47-
def formula_well_formed(ba, f):
48-
pos_lits = set()
49-
neg_lits = set()
50-
def is_lit(f):
51-
if isinstance(f, ba.Symbol):
52-
pos_lits.add(f.obj)
53-
return True
54-
if isinstance(f, ba.NOT) \
55-
and isinstance(f.args[0], ba.Symbol):
56-
neg_lits.add(f.args[0].obj)
57-
return True
58-
return False
59-
60-
def is_clause(f):
61-
if is_lit(f):
62-
return True
63-
if isinstance(f, ba.AND):
64-
for g in f.args:
65-
if not is_lit(g):
66-
return False
67-
return True
68-
return False
69-
70-
def test_monotonicity():
71-
both = pos_lits.intersection(neg_lits)
72-
return not both
73-
74-
if f in [ba.TRUE, ba.FALSE]:
75-
return True
76-
if is_clause(f):
77-
return test_monotonicity()
78-
if isinstance(f, ba.OR):
79-
for g in f.args:
80-
if not is_clause(g):
81-
return False
82-
return test_monotonicity()
83-
return False
84-
8547
class BooleanNetwork(mpbn.MPBooleanNetwork, BonesisDomain):
8648
pass
8749

0 commit comments

Comments
 (0)