1
#![forbid(unsafe_code)]
2

            
3
use merc_lts::LTS;
4
use merc_utilities::Timing;
5

            
6
use crate::Equivalence;
7
use crate::Partition;
8
use crate::branching_bisim_sigref;
9
use crate::branching_bisim_sigref_naive;
10
use crate::strong_bisim_sigref;
11
use crate::strong_bisim_sigref_naive;
12
use crate::weak_bisim_sigref_inductive_naive;
13
use crate::weak_bisim_sigref_naive;
14
use crate::weak_bisimulation;
15

            
16
// Compare two LTSs for equivalence using the given algorithm.
17
100
pub fn compare_lts<L: LTS>(equivalence: Equivalence, left: L, right: L, preprocess: bool, timing: &mut Timing) -> bool {
18
100
    let (merged, rhs_initial) = timing.measure("merge lts", || left.merge_disjoint(&right));
19
100
    drop(right); // No longer needed.
20

            
21
    // Reduce the merged LTS modulo the given equivalence and return the partition
22
100
    match equivalence {
23
        Equivalence::WeakBisim => {
24
            let (lts, partition) = weak_bisimulation(merged, preprocess, timing);
25
            partition.block_number(lts.initial_state_index()) == partition.block_number(rhs_initial)
26
        }
27
        Equivalence::WeakBisimSigref => {
28
            let (lts, partition) = weak_bisim_sigref_inductive_naive(merged, preprocess, timing);
29
            partition.block_number(lts.initial_state_index()) == partition.block_number(rhs_initial)
30
        }
31
        Equivalence::WeakBisimSigrefNaive => {
32
            let (lts, partition) = weak_bisim_sigref_naive(merged, preprocess, timing);
33
            partition.block_number(lts.initial_state_index()) == partition.block_number(rhs_initial)
34
        }
35
        Equivalence::StrongBisim => {
36
100
            let (lts, partition) = strong_bisim_sigref(merged, timing);
37
100
            partition.block_number(lts.initial_state_index()) == partition.block_number(rhs_initial)
38
        }
39
        Equivalence::StrongBisimNaive => {
40
            let (lts, partition) = strong_bisim_sigref_naive(merged, timing);
41
            partition.block_number(lts.initial_state_index()) == partition.block_number(rhs_initial)
42
        }
43
        Equivalence::BranchingBisim => {
44
            let (lts, partition) = branching_bisim_sigref(merged, timing);
45
            partition.block_number(lts.initial_state_index()) == partition.block_number(rhs_initial)
46
        }
47
        Equivalence::BranchingBisimNaive => {
48
            let (lts, partition) = branching_bisim_sigref_naive(merged, timing);
49
            partition.block_number(lts.initial_state_index()) == partition.block_number(rhs_initial)
50
        }
51
    }
52
100
}