from biodivine_aeon import *
from pathlib import Path
model_string = Path('buthanol_production.aeon').read_text()
model = BooleanNetwork.from_aeon(model_string)
model.num_vars()
assert model.num_parameters() == 0
graph = model.graph()
for v in graph.variables():
print(graph.get_variable_name(v), "=", model.get_update_function(v))
assert model.get_update_function(v) is not None
3_hydroxybutyryl_CoA = ((crt | hbd) | acetoacetyl_CoA)
AbrB = !spo0A_p
EtfAB = NADH
NADH = true
NAD_P_H = true
PTS = true
Rnf = true
acetaldehyde = (acetyl_CoA | ald)
acetate = (((pta & acetone) | (glucose___PTS & acetone)) | ack)
acetic_acid = ((acetyl_p & acetate) & !sporulation)
acetoacetate = ((ctfB | acetoacetyl_CoA) | ctfA)
acetoacetyl_CoA = (((ctfB | thlA) | hbd) | acetyl_CoA)
acetone = ((adc & !sporulation) | (acetoacetate & !sporulation))
acetyl_CoA = ((((acetate & acetoacetyl_CoA) | thlA) | pyruvate) | pfo)
acetyl_p = acetyl_CoA
ack = !(spo0A_p | sporulation)
adc = spo0A_p
adhA = spo0A_p
adhB = spo0A_p
ald = (spo0A_p | sigK)
bcd = !(sporulation | spo0A_p)
bdhAB = spo0A_p
buk1 = !(sporulation | spo0A_p)
butanal = ((ald | butyryl_CoA) | bdhAB)
butanol = (((((bdhAB & !sporulation) | (adhB & !sporulation)) | (butanal & !sporulation)) | (adhA & !sporulation)) | (NAD_P_H & !sporulation))
butyrate = (((buk1 & !butyrate) | (glucose___PTS & !butyrate)) | (ptb & !butyrate))
butyric_acid = ((butyryl_p & butyrate) & !sporulation)
butyryl_CoA = ((((bcd | crotonoyl_CoA) | (butyrate & acetoacetyl_CoA)) | EtfAB) | ald)
butyryl_p = butyryl_CoA
cell_membrane = ((glucose & !((acetone | butanol) | ethanol)) | (butyrate & !(acetone | ethanol)))
crotonoyl_CoA = ((crt | 3_hydroxybutyryl_CoA) | ferredoxin)
crt = !(spo0A_p | sporulation)
ctfA = spo0A_p
ctfB = spo0A_p
ethanol = (((adhA & !(ald | sporulation)) | (acetaldehyde & !(ald | sporulation))) | (adhB & !(ald | sporulation)))
fba = true
ferredoxin = Rnf
gap_pgk_tpi_pgm__X276_23705_eno = true
glucose = true
glucose___PTS = (((PTS & (glucose & cell_membrane)) & !(sporulation & !cell_membrane)) | ((glucose & (cell_membrane & PTS)) & !(sporulation & !cell_membrane)))
hbd = !(sporulation | spo0A_p)
lactate = (pyruvate & !ferredoxin)
lactic_acid = (lactate & !sporulation)
pfk = true
pfo = true
pgi = true
phosphorylation = true
pta = !(spo0A_p | sporulation)
ptb = !(spo0A_p | sporulation)
pyk = pfk
pyruvate = ((((pyk | glucose___PTS) | pgi) | fba) | gap_pgk_tpi_pgm__X276_23705_eno)
sigA = true
sigE = (sigF | spo0A_p)
sigF = ((spoIIE & !(spoIIAB & !spoIIE)) | (sigH & !(spoIIAB & !spoIIE)))
sigG = sigE
sigH = sigA
sigK = sigG
spo0A = (sigK | spo0A_p)
spo0A_p = ((((spo0A & phosphorylation) & !sporulation) | ((phosphorylation & spo0A) & !sporulation)) | ((sigA & (phosphorylation & spo0A)) & !sporulation))
spoIIAA = ((spo0A_p & sigH) | spoIIE)
spoIIAB = ((spo0A_p & sigH) & !(spoIIAA & spoIIE))
spoIIAB_p = ((spoIIAB & phosphorylation) | (phosphorylation & spoIIAB))
spoIIA_p = (spoIIAB & spoIIAA)
spoIIE = true
sporulation = (((((sigK & (!cell_membrane & sigA)) | (spo0A_p & !cell_membrane)) | (sigH & !cell_membrane)) | (sigG & (!cell_membrane & sigA))) | (sigE & (sigA & !cell_membrane)))
thlA = spo0A_p
stg = SymbolicAsyncGraph(model)
attractors = find_attractors(stg)
attractors
sporulation_on = stg.fix_variable("sporulation", True)
on_in_attractor = attractors[0].intersect(sporulation_on).vertices().cardinality()
off_in_attractor = attractors[0].minus(sporulation_on).vertices().cardinality()
print("Sporulation is ON in", on_in_attractor, "states.")
print("Sporulation is OFF in", off_in_attractor, "states.")
print("Sporulation is ON in", round((on_in_attractor / (on_in_attractor + off_in_attractor)) * 100.0, 2), "% of attractor states.")
Sporulation is ON in 12582912.0 states.
Sporulation is OFF in 14680064.0 states.
Sporulation is ON in 46.15 % of attractor states.
import graphviz
graphviz.Source(attractors[0].to_bdd().to_dot(stg.bdd_variables()))
for v in graph.variables():
if len(graph.regulators(v)) == 0:
model.set_update_function(v, None)
stg = SymbolicAsyncGraph(model)
stg.unit_colored_vertices()
attractors = find_attractors(stg)
attractors
shared_colors = attractors[0].colors().intersect(attractors[1].colors())
print("Number of colors in both attractors:", shared_colors.cardinality())
Number of colors in both attractors: 0.0
attractor = attractors[0].union(attractors[1])
classes = classify_attractor(stg, attractor)
classes
stable_attractor = attractor.intersect_colors(classes["stability"])
disordered_attractor = attractor.intersect_colors(classes["disorder"])
print(stable_attractor)
print(disordered_attractor)
ColoredVertexSet(2048, 2048x2048)
ColoredVertexSet(867734323007488, 867734323007488x6144)
sporulation_on = stg.fix_variable("sporulation", True)
on_in_stable_attractor = stable_attractor.intersect(sporulation_on).vertices().cardinality()
off_in_stable_attractor = stable_attractor.minus(sporulation_on).vertices().cardinality()
print("Sporulation is ON in", on_in_stable_attractor, "stable states.")
print("Sporulation is OFF in", off_in_stable_attractor, "stable states.")
print("Sporulation is ON in", round((on_in_stable_attractor / (on_in_stable_attractor + off_in_stable_attractor)) * 100.0, 2), "% of stable attractor states.")
on_in_disorder_attractor = disordered_attractor.intersect(sporulation_on).vertices().cardinality()
off_in_disorder_attractor = disordered_attractor.minus(sporulation_on).vertices().cardinality()
print("Sporulation is ON in", on_in_disorder_attractor, "disorder states.")
print("Sporulation is OFF in", off_in_disorder_attractor, "disorder states.")
print("Sporulation is ON in", round((on_in_disorder_attractor / (on_in_disorder_attractor + off_in_disorder_attractor)) * 100.0, 2), "% of disordered attractor states.")
Sporulation is ON in 2048.0 stable states.
Sporulation is OFF in 0.0 stable states.
Sporulation is ON in 100.0 % of stable attractor states.
Sporulation is ON in 335223420223488.0 disorder states.
Sporulation is OFF in 532510902784000.0 disorder states.
Sporulation is ON in 38.63 % of stable attractor states.
witness = stg.pick_witness(classes["stability"])
witness.to_aeon()
Path("stable_attractor.bdd").write_text(stable_attractor.to_bdd().to_raw_string())
Path("disordered_attractor.bdd").write_text(disordered_attractor.to_bdd().to_raw_string())
stable_reloaded = stg.empty_colored_vertices().copy_with_raw_string(Path("stable_attractor.bdd").read_text())
disordered_reloaded = stg.empty_colored_vertices().copy_with_raw_string(Path("disordered_attractor.bdd").read_text())
print(stable_reloaded)
print(disordered_reloaded)
ColoredVertexSet(2048, 2048x2048)
ColoredVertexSet(867734323007488, 867734323007488x6144)
vertex = stg.unit_colored_vertices().pick_vertex()
print("Vertex", vertex.vertices().vertices())
basin = reach_bwd(stg, vertex)
print("Basin", basin)
scc = reach_fwd(stg, vertex, basin)
print("SCC", scc)
Vertex [[False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]]
Basin ColoredVertexSet(11558771119839542000000, 63365787494591230000x8192)
SCC ColoredVertexSet(8192, 1x8192)