Lines
100 %
Functions
50 %
Branches
#![forbid(unsafe_code)]
use merc_lts::LTS;
use merc_lts::LabelledTransitionSystem;
use merc_utilities::Timing;
use crate::branching_bisim_sigref;
use crate::branching_bisim_sigref_naive;
use crate::quotient_lts_block;
use crate::quotient_lts_naive;
use crate::strong_bisim_sigref;
use crate::strong_bisim_sigref_naive;
use crate::weak_bisim_sigref_inductive_naive;
use crate::weak_bisim_sigref_naive;
use crate::weak_bisimulation;
use crate::weak_bisimulation_parallel;
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
pub enum Equivalence {
/// Partition based refinement algorithms.
WeakBisim,
WeakBisimParallel,
/// Various signature based reduction algorithms.
WeakBisimSigref,
WeakBisimSigrefNaive,
StrongBisim,
StrongBisimNaive,
BranchingBisim,
BranchingBisimNaive,
}
/// Reduces the given LTS modulo the given equivalence using signature refinement
pub fn reduce_lts<L: LTS>(
lts: L,
equivalence: Equivalence,
preprocess: bool,
timing: &Timing,
) -> LabelledTransitionSystem<L::Label> {
let state = lts.initial_state_index();
match equivalence {
Equivalence::WeakBisim => {
let (lts, _, partition) = weak_bisimulation(lts, state, preprocess, timing);
timing.measure("quotient", || quotient_lts_naive(<s, &partition, true))
Equivalence::WeakBisimParallel => {
let (lts, _, partition) = weak_bisimulation_parallel(lts, state, preprocess, timing);
Equivalence::WeakBisimSigref => {
let (lts, _, partition) = weak_bisim_sigref_inductive_naive(lts, state, preprocess, timing);
Equivalence::WeakBisimSigrefNaive => {
let (lts, _, partition) = weak_bisim_sigref_naive(lts, state, preprocess, timing);
Equivalence::StrongBisim => {
let (lts, partition) = strong_bisim_sigref(lts, timing);
timing.measure("quotient", || quotient_lts_block::<_, false>(<s, &partition))
Equivalence::StrongBisimNaive => {
let (lts, partition) = strong_bisim_sigref_naive(lts, timing);
timing.measure("quotient", || quotient_lts_naive(<s, &partition, false))
Equivalence::BranchingBisim => {
let (lts, _, partition) = branching_bisim_sigref(lts, state, timing);
timing.measure("quotient", || quotient_lts_block::<_, true>(<s, &partition))
Equivalence::BranchingBisimNaive => {
let (lts, _, partition) = branching_bisim_sigref_naive(lts, state, timing);