-
Notifications
You must be signed in to change notification settings - Fork 19
Open
Description
The tr_unique
function doesn't remove Tr
duplicates if they are not consecutive within the list of trs of a state. The same behaviour happens in OpenFST so adding a new test case for this situation will break comparison tests.
The following example can reproduce the issue:
#[test]
fn test_tr_map_unique_1() -> Result<()> {
let mut fst_in = VectorFst::<ProbabilityWeight>::new();
let s1 = fst_in.add_state();
let s2 = fst_in.add_state();
fst_in.add_tr(s1, Tr::new(1, 2, ProbabilityWeight::new(1.0), s2))?;
fst_in.add_tr(s1, Tr::new(1, 2, ProbabilityWeight::new(2.0), s2))?;
fst_in.add_tr(s1, Tr::new(1, 2, ProbabilityWeight::new(1.0), s2))?;
fst_in.set_start(s1)?;
fst_in.set_final(s2, ProbabilityWeight::one())?;
let mut fst_out = VectorFst::<ProbabilityWeight>::new();
let s1 = fst_out.add_state();
let s2 = fst_out.add_state();
fst_out.add_tr(s1, Tr::new(1, 2, ProbabilityWeight::new(1.0), s2))?;
fst_out.add_tr(s1, Tr::new(1, 2, ProbabilityWeight::new(2.0), s2))?;
fst_out.set_start(s1)?;
fst_out.set_final(s2, ProbabilityWeight::one())?;
tr_unique(&mut fst_in);
assert_eq!(fst_in, fst_out);
Ok(())
}
It can easily be solved by adding a check on the weight
value of a transition in tr_compare
:
pub(crate) fn tr_compare<W: Semiring>(tr_1: &Tr<W>, tr_2: &Tr<W>) -> Ordering {
if tr_1.ilabel < tr_2.ilabel {
return Ordering::Less;
}
if tr_1.ilabel > tr_2.ilabel {
return Ordering::Greater;
}
if tr_1.olabel < tr_2.olabel {
return Ordering::Less;
}
if tr_1.olabel > tr_2.olabel {
return Ordering::Greater;
}
if tr_1.weight < tr_2.weight {
return Ordering::Less;
}
if tr_1.weight > tr_2.weight {
return Ordering::Greater;
}
if tr_1.nextstate < tr_2.nextstate {
return Ordering::Less;
}
if tr_1.nextstate > tr_2.nextstate {
return Ordering::Greater;
}
Ordering::Equal
}
Metadata
Metadata
Assignees
Labels
No labels