pub fn new(manager_ref: &'a BDDManagerRef, game: &'a VariabilityParityGame, alternative_solving: bool) -> Self {
fn solve_recursive(&mut self, gamma: Submap, depth: usize) -> Result<(Submap, Submap), MercError> {
let (omega1_0, omega1_1) = self.solve_recursive(gamma.clone().minus(&alpha.clone())?, depth + 1)?;
/// Left-optimised Zielonka solver that has improved theoretical complexity, but might be slower in practice.
fn zielonka_family_optimised(&mut self, gamma: Submap, depth: usize) -> Result<(Submap, Submap), MercError> {
let (omega1_0, omega1_1) = self.zielonka_family_optimised(gamma.clone().minus(&alpha)?, depth + 1)?;
let (omega2_0, omega2_1) = self.zielonka_family_optimised(gamma_restricted.minus(&alpha1)?, depth + 1)?;
/// Attrx,γ (β) = intersection { α ⊆ γ | ∀v ∈ V, c ∈ C: (c ∈ β(v) ⇒ c ∈ α(v)) ∧
/// The relation to the implementation is not entirely straightforward. The player `x` is called alpha here, and A is the beta set.
fn attractor(&mut self, alpha: Player, gamma: &Submap, mut A: Submap) -> Result<Submap, MercError> {
/// Checks that the sets W0 and W1 form a partition w.r.t the submap V, i.e., their union is V and their intersection is empty.
"The intersection of both solutions should be empty, but vertex {v} has non-empty intersection."
let solution = solve_variability_zielonka(&manager_ref, &vpg, ZielonkaVariant::Family, false).unwrap();
solve_variability_zielonka(&manager_ref, &vpg, ZielonkaVariant::FamilyOptimisedLeft, false).unwrap();