Lines
63.64 %
Functions
20.83 %
Branches
100 %
#![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;
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
pub enum Equivalence {
/// Partition based refinement algorithms.
WeakBisim,
/// 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> {
match equivalence {
Equivalence::WeakBisim => {
let (lts, partition) = weak_bisimulation(lts, preprocess, timing);
timing.measure("quotient", || quotient_lts_naive(<s, &partition, true))
Equivalence::WeakBisimSigref => {
let (lts, partition) = weak_bisim_sigref_inductive_naive(lts, preprocess, timing);
Equivalence::WeakBisimSigrefNaive => {
let (lts, partition) = weak_bisim_sigref_naive(lts, 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, timing);
timing.measure("quotient", || quotient_lts_block::<_, true>(<s, &partition))
Equivalence::BranchingBisimNaive => {
let (lts, partition) = branching_bisim_sigref_naive(lts, timing);