rustfst/algorithms/lazy/cache/
utils_parsing.rs

1use std::sync::Arc;
2
3use nom::multi::count;
4use nom::IResult;
5
6use crate::algorithms::lazy::cache::cache_internal_types::{CacheTrs, FinalWeight, StartState};
7use crate::algorithms::lazy::CacheStatus;
8use crate::parsers::bin_fst::utils_parsing::{parse_bin_fst_tr, parse_start_state};
9use crate::parsers::nom_utils::NomCustomError;
10use crate::parsers::{parse_bin_i64, parse_bin_u64, parse_bin_u8};
11use crate::prelude::{SerializableSemiring, StateId, TrsVec};
12
13pub(crate) type IResultCustomError<A, B> = IResult<A, B, NomCustomError<A>>;
14
15pub(crate) fn parse_cache_start_state(
16    i: &[u8],
17) -> IResultCustomError<&[u8], CacheStatus<StartState>> {
18    let (i, is_computed) = parse_bin_u8(i)?;
19    if is_computed == 0 {
20        Ok((i, CacheStatus::NotComputed))
21    } else {
22        let (i, raw_start_state) = parse_bin_i64(i)?;
23        Ok((i, CacheStatus::Computed(parse_start_state(raw_start_state))))
24    }
25}
26
27pub(crate) fn parse_vec_cache_trs<W: SerializableSemiring>(
28    i: &[u8],
29) -> IResultCustomError<&[u8], CacheStatus<CacheTrs<W>>> {
30    let (i, is_computed) = parse_bin_u8(i)?;
31
32    if is_computed == 0 {
33        Ok((i, CacheStatus::NotComputed))
34    } else {
35        let (i, num_trs) = parse_bin_i64(i)?;
36        let (i, trs) = count(parse_bin_fst_tr::<W>, num_trs as usize)(i)?;
37        let (i, niepsilons) = parse_bin_u64(i)?;
38        let (i, noepsilons) = parse_bin_u64(i)?;
39
40        Ok((
41            i,
42            CacheStatus::Computed(CacheTrs {
43                trs: TrsVec(Arc::new(trs)),
44                niepsilons: niepsilons as usize,
45                noepsilons: noepsilons as usize,
46            }),
47        ))
48    }
49}
50
51pub(crate) fn parse_hashmap_cache_trs<W: SerializableSemiring>(
52    i: &[u8],
53) -> IResultCustomError<&[u8], (StateId, CacheTrs<W>)> {
54    let (i, state) = parse_bin_i64(i)?;
55    let (i, num_trs) = parse_bin_i64(i)?;
56    let (i, trs) = count(parse_bin_fst_tr::<W>, num_trs as usize)(i)?;
57    let (i, niepsilons) = parse_bin_u64(i)?;
58    let (i, noepsilons) = parse_bin_u64(i)?;
59
60    Ok((
61        i,
62        (
63            state as StateId,
64            CacheTrs {
65                trs: TrsVec(Arc::new(trs)),
66                niepsilons: niepsilons as usize,
67                noepsilons: noepsilons as usize,
68            },
69        ),
70    ))
71}
72
73pub(crate) fn parse_vec_cache_final_weight<W: SerializableSemiring>(
74    i: &[u8],
75) -> IResultCustomError<&[u8], CacheStatus<FinalWeight<W>>> {
76    let (i, is_computed) = parse_bin_u8(i)?;
77
78    if is_computed == 0 {
79        Ok((i, CacheStatus::NotComputed))
80    } else {
81        let (i, is_some) = parse_bin_u8(i)?;
82        if is_some == 1 {
83            let (i, final_weight) = W::parse_binary(i)?;
84            Ok((i, CacheStatus::Computed(Some(final_weight))))
85        } else {
86            Ok((i, CacheStatus::Computed(None)))
87        }
88    }
89}
90
91pub(crate) fn parse_hashmap_cache_final_weight<W: SerializableSemiring>(
92    i: &[u8],
93) -> IResultCustomError<&[u8], (StateId, FinalWeight<W>)> {
94    let (i, state) = parse_bin_i64(i)?;
95    let (i, is_some) = parse_bin_u8(i)?;
96    if is_some == 1 {
97        let (i, final_weight) = W::parse_binary(i)?;
98        Ok((i, (state as StateId, Some(final_weight))))
99    } else {
100        Ok((i, (state as StateId, None)))
101    }
102}