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_naive;
13
use crate::weak_bisimulation;
14

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

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