rustfst/algorithms/lazy/cache/
utils_parsing.rs1use 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}