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
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.")
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())
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)
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.")
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)
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)