67 lines
2.3 KiB
Python
67 lines
2.3 KiB
Python
from sys import exit
|
|
from colour import *
|
|
|
|
from rs.context_automaton import ContextAutomaton
|
|
|
|
class ContextAutomatonWithConcentrations(ContextAutomaton):
|
|
|
|
def __init__(self, reaction_system):
|
|
self._states = []
|
|
self._transitions = []
|
|
self._init_state = None
|
|
self._reaction_system = reaction_system
|
|
|
|
def is_valid_context(self, context):
|
|
if set([e for e,lvl in context]).issubset(self._reaction_system.background_set):
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def context2str(self, ctx):
|
|
if len(ctx) == 0:
|
|
return "0"
|
|
s = "{"
|
|
for ent,lvl in ctx:
|
|
s += " " + str((self._reaction_system.get_entity_name(ent),lvl))
|
|
s += " }"
|
|
return s
|
|
|
|
def add_transition(self, src, context_set, dst):
|
|
if not type(context_set) is set and not type(context_set) is list:
|
|
print("Contexts set must be of type set or list")
|
|
|
|
if not self.is_valid_context(context_set):
|
|
raise RuntimeError("one of the entities in the context set is unknown (undefined)!")
|
|
|
|
if not self.is_state(src):
|
|
raise RuntimeError("\"" + src + "\" is an unknown (undefined) state")
|
|
|
|
if not self.is_state(dst):
|
|
raise RuntimeError("\"" + dst + "\" is an unknown (undefined) state")
|
|
|
|
new_context_set = set()
|
|
for ent,lvl in set(context_set):
|
|
new_context_set.add((self._reaction_system.get_entity_id(ent),lvl))
|
|
|
|
self._transitions.append((self.get_state_id(src),new_context_set,self.get_state_id(dst)))
|
|
|
|
def get_automaton_with_flat_contexts(self, ordinary_reaction_system):
|
|
|
|
ca = ContextAutomaton(ordinary_reaction_system)
|
|
ca._states = self._states
|
|
ca._init_state = self._init_state
|
|
|
|
for src,ctx,dst in self._transitions:
|
|
|
|
new_ctx = set()
|
|
|
|
for ent,conc in ctx:
|
|
for i in range(1,conc+1):
|
|
n = self._reaction_system.get_entity_name(ent) + "#" + str(i)
|
|
ca._reaction_system.ensure_bg_set_entity(n)
|
|
new_ctx.add(n)
|
|
|
|
ca.add_transition(ca.get_state_name(src),new_ctx,ca.get_state_name(dst))
|
|
|
|
return ca
|