pub trait Model {
type Symbol;
type ValueError: Error;
type B: BitStore;
// Required methods
fn probability(
&self,
symbol: Option<&Self::Symbol>,
) -> Result<Range<Self::B>, Self::ValueError>;
fn max_denominator(&self) -> Self::B;
fn symbol(&self, value: Self::B) -> Option<Self::Symbol>;
fn max_length(&self) -> usize;
// Provided methods
fn denominator(&self) -> Self::B { ... }
fn update(&mut self, _symbol: &Self::Symbol) { ... }
}Expand description
A Model is used to calculate the probability of a given symbol occurring
in a sequence.
The Model is used both for encoding and decoding. A
‘max-length’ model has a maximum length. The compressed size of a message
equal to the maximum length is larger than with a
fixed_length::Model, but smaller than with a
Model.
A max-length model can be converted into a regular model using the
convenience Wrapper type.
The more accurately a Model is able to predict the next symbol, the
greater the compression ratio will be.
§Example
pub enum Symbol {
A,
B,
C,
}
pub struct MyModel;
impl max_length::Model for MyModel {
type B = u32;
type Symbol = Symbol;
type ValueError = Infallible;
fn probability(&self, symbol: Option<&Self::Symbol>) -> Result<Range<u32>, Infallible> {
Ok(match symbol {
Some(Symbol::A) => 0..1,
Some(Symbol::B) => 1..2,
Some(Symbol::C) => 2..3,
None => 3..4,
})
}
fn symbol(&self, value: Self::B) -> Option<Self::Symbol> {
match value {
0..1 => Some(Symbol::A),
1..2 => Some(Symbol::B),
2..3 => Some(Symbol::C),
3..4 => None,
_ => unreachable!(),
}
}
fn max_denominator(&self) -> u32 {
4
}
fn max_length(&self) -> usize {
3
}
}Required Associated Types§
Sourcetype ValueError: Error
type ValueError: Error
Invalid symbol error
Required Methods§
Sourcefn probability(
&self,
symbol: Option<&Self::Symbol>,
) -> Result<Range<Self::B>, Self::ValueError>
fn probability( &self, symbol: Option<&Self::Symbol>, ) -> Result<Range<Self::B>, Self::ValueError>
Given a symbol, return an interval representing the probability of that symbol occurring.
This is given as a range, over the denominator given by
Model::denominator. This range should in general include EOF,
which is denoted by None.
For example, from the set {heads, tails}, the interval representing
heads could be 0..1, and tails would be 1..2, and EOF could be
2..3 (with a denominator of 3).
This is the inverse of the Model::symbol method
§Errors
This returns a custom error if the given symbol is not valid
Sourcefn max_denominator(&self) -> Self::B
fn max_denominator(&self) -> Self::B
The maximum denominator used for probability ranges. See
Model::probability.
This value is used to calculate an appropriate precision for the
encoding, therefore this value must not change, and
Model::denominator must never exceed it.
Sourcefn symbol(&self, value: Self::B) -> Option<Self::Symbol>
fn symbol(&self, value: Self::B) -> Option<Self::Symbol>
Given a value, return the symbol whose probability range it falls in.
None indicates EOF
This is the inverse of the Model::probability method
Sourcefn max_length(&self) -> usize
fn max_length(&self) -> usize
The maximum number of symbols to encode
Provided Methods§
Sourcefn denominator(&self) -> Self::B
fn denominator(&self) -> Self::B
The denominator for probability ranges. See Model::probability.
By default this method simply returns the Model::max_denominator,
which is suitable for non-adaptive models.
In adaptive models this value may change, however it should never exceed
Model::max_denominator, or it becomes possible for the
Encoder and Decoder to panic due
to overflow or underflow.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".