#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Root {
First,
Centroid,
Leaf,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Place {
Shallow,
Deep,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Binarization {
Edge,
Hypergraph,
Balanced,
}
pub(crate) const ROOTS: &[(&str, Root)] = &[
("first", Root::First),
("centroid", Root::Centroid),
("leaf", Root::Leaf),
];
pub(crate) const PLACES: &[(&str, Place)] = &[("shallow", Place::Shallow), ("deep", Place::Deep)];
pub(crate) const BINARIZATIONS: &[(&str, Binarization)] = &[
("edge", Binarization::Edge),
("hypergraph", Binarization::Hypergraph),
("balanced", Binarization::Balanced),
];
fn token<T: PartialEq>(table: &[(&'static str, T)], value: &T) -> &'static str {
table
.iter()
.find(|(_, v)| v == value)
.map(|(n, _)| *n)
.expect("every value has a row in its own table")
}
impl std::fmt::Display for Root {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(token(ROOTS, self))
}
}
impl std::fmt::Display for Place {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(token(PLACES, self))
}
}
impl std::fmt::Display for Binarization {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(token(BINARIZATIONS, self))
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct Reading {
pub root: Option<Root>,
pub place: Option<Place>,
pub binarize: Option<Binarization>,
}
impl Reading {
#[must_use]
pub fn inherit(self, base: Reading) -> Reading {
Reading {
root: self.root.or(base.root),
place: self.place.or(base.place),
binarize: self.binarize.or(base.binarize),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum RootPick {
First,
Centroid,
Leaf(usize),
}
impl std::fmt::Display for RootPick {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
RootPick::First => f.write_str("first"),
RootPick::Centroid => f.write_str("centroid"),
RootPick::Leaf(bag) => write!(f, "leaf#{bag}"),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) struct FixedReading {
pub(crate) root: RootPick,
pub(crate) place: Place,
pub(crate) binarize: Binarization,
}
impl std::fmt::Display for FixedReading {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"root={} place={} binarize={}",
self.root, self.place, self.binarize
)
}
}