From 057beae78f518483a3f486a9d8b6e4bafd13ef9a Mon Sep 17 00:00:00 2001 From: Samuel Pastva Date: Fri, 23 Aug 2024 09:58:35 +0200 Subject: [PATCH] Custom bwd reachability with progress. --- .../_sd_attractors/attractor_candidates.py | 20 ++++++++++++++++++- biobalm/succession_diagram.py | 6 +++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/biobalm/_sd_attractors/attractor_candidates.py b/biobalm/_sd_attractors/attractor_candidates.py index 3d19865..83a3d73 100644 --- a/biobalm/_sd_attractors/attractor_candidates.py +++ b/biobalm/_sd_attractors/attractor_candidates.py @@ -16,7 +16,7 @@ import random import biobalm -from biodivine_aeon import Bdd, AsynchronousGraph, BddVariable, Attractors +from biodivine_aeon import Bdd, AsynchronousGraph, BddVariable, Attractors, Reachability from biobalm.trappist_core import compute_fixed_point_reduced_STG from biobalm.symbolic_utils import state_list_to_bdd, valuation_to_state, state_to_bdd @@ -62,9 +62,27 @@ def symbolic_attractor_candidates( ] candidate_states = sd.symbolic.mk_subspace(node_space) + avoid = sd.symbolic.mk_empty_colored_vertices() for child in child_motifs: candidate_states = candidate_states.minus(sd.symbolic.mk_subspace(child)) + avoid = avoid.union(sd.symbolic.mk_subspace(child)) + done = False + while not done: + done = True + for var in reversed(sd.symbolic.network_variables()): + if sd.network.get_variable_name(var) in node_space: + # Constant variable, no need to check. + continue + pre = sd.symbolic.var_pre_out(var, avoid) + if not pre.is_empty(): + avoid = avoid.union(pre) + print("BWD", avoid, "of", candidate_states) + done = False + break + + #avoid_bwd = Reachability.reach_bwd(sd.symbolic, avoid) + candidate_states = candidate_states.minus(avoid) attractors = Attractors.attractors(sd.symbolic, candidate_states) seeds: list[BooleanSpace] = [] diff --git a/biobalm/succession_diagram.py b/biobalm/succession_diagram.py index 7537778..12c7b79 100644 --- a/biobalm/succession_diagram.py +++ b/biobalm/succession_diagram.py @@ -1359,11 +1359,15 @@ def skip_remaining(self) -> int: pn = self.node_percolated_petri_net(self.root(), compute=True) minimal_traps = trappist(network=pn, problem="min") + if self.config["debug"]: + print(f"Found {len(minimal_traps)} .") + trap_plus_id: list[tuple[int, BooleanSpace]] = [] for m_trap in minimal_traps: m_id = self._ensure_node(None, m_trap) trap_plus_id.append((m_id, m_trap)) - self._expand_one_node(m_id) + self.node_data(m_id)["expanded"] = True + #self._expand_one_node(m_id) skipped_nodes = 0 for n_id in self.node_ids():