Added the enc_state_with_blocking() function

This allows to specify reactants and inhibitors in the provided state.
This commit is contained in:
Artur Meski
2016-03-03 12:31:12 +01:00
parent a869ed25cb
commit 7907c0216b

View File

@@ -295,6 +295,22 @@ class SmtCheckerRSC(object):
return simplify(enc) return simplify(enc)
def enc_state_with_blocking(self, level, prop):
"""Encodes the state at the given level with blocking certain concentrations"""
required,blocked = prop
enc = True
for ent,conc in required:
e_id = self.rs.get_entity_id(ent)
enc = And(enc, self.v[level][e_id] >= conc)
for ent,conc in blocked:
e_id = self.rs.get_entity_id(ent)
enc = And(enc, self.v[level][e_id] < conc)
return simplify(enc)
def decode_witness(self, max_level, print_model=False): def decode_witness(self, max_level, print_model=False):
m = self.solver.model() m = self.solver.model()
@@ -351,7 +367,7 @@ class SmtCheckerRSC(object):
print("[i] Adding the reachability test...") print("[i] Adding the reachability test...")
self.solver.push() self.solver.push()
self.solver.add(self.enc_min_state(current_level,state)) self.solver.add(self.enc_state_with_blocking(current_level,state))
result = self.solver.check() result = self.solver.check()
if result == sat: if result == sat: