1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use anyhow::Result;
use crate::algorithms::{FinalTr, MapFinalAction, TrMapper, WeightConverter};
use crate::fst_properties::FstProperties;
use crate::semirings::{Semiring, WeightQuantize};
use crate::Tr;
use crate::KDELTA;
pub struct QuantizeMapper {}
pub fn map_weight<W: WeightQuantize>(weight: &mut W) -> Result<()> {
weight.quantize_assign(KDELTA)
}
impl<S: WeightQuantize + Semiring> TrMapper<S> for QuantizeMapper {
fn tr_map(&self, tr: &mut Tr<S>) -> Result<()> {
map_weight(&mut tr.weight)
}
fn final_tr_map(&self, final_tr: &mut FinalTr<S>) -> Result<()> {
map_weight(&mut final_tr.weight)
}
fn final_action(&self) -> MapFinalAction {
MapFinalAction::MapNoSuperfinal
}
fn properties(&self, inprops: FstProperties) -> FstProperties {
inprops & FstProperties::weight_invariant_properties()
}
}
impl<S> WeightConverter<S, S> for QuantizeMapper
where
S: WeightQuantize,
{
tr_mapper_to_weight_convert_mapper_methods!(S);
}