use gamlss_core::ParameterLayout;
use crate::{Col, FittedTerm};
#[derive(Debug, Clone, PartialEq)]
pub struct ParameterTerms {
pub parameter: &'static str,
pub terms: Vec<FittedTerm>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ModelSchema {
pub response: ResponseSchema,
pub parameters: Vec<ParameterTerms>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ResponseSchema {
pub col: Col<f64>,
pub weights: Option<Col<f64>>,
pub nrows: usize,
}
#[derive(Debug, Clone, PartialEq)]
pub struct BuiltModel<M> {
model: M,
schema: ModelSchema,
layout: ParameterLayout,
}
#[derive(Debug, Clone, PartialEq)]
pub struct PredictionDesign<Blocks> {
blocks: Blocks,
}
impl<Blocks> PredictionDesign<Blocks> {
pub(crate) fn new(blocks: Blocks) -> Self {
Self { blocks }
}
#[must_use]
#[inline(always)]
pub fn blocks(&self) -> &Blocks {
&self.blocks
}
#[must_use]
#[inline]
pub fn into_blocks(self) -> Blocks {
self.blocks
}
}
impl<M> BuiltModel<M> {
pub(crate) fn new(model: M, schema: ModelSchema, layout: ParameterLayout) -> Self {
Self {
model,
schema,
layout,
}
}
#[must_use]
#[inline(always)]
pub fn model(&self) -> &M {
&self.model
}
#[must_use]
#[inline(always)]
pub fn model_mut(&mut self) -> &mut M {
&mut self.model
}
#[must_use]
#[inline]
pub fn into_model(self) -> M {
self.model
}
#[must_use]
#[inline(always)]
pub fn schema(&self) -> &ModelSchema {
&self.schema
}
#[must_use]
#[inline(always)]
pub fn terms(&self) -> &[ParameterTerms] {
&self.schema.parameters
}
#[must_use]
#[inline]
pub fn terms_for(&self, parameter: &str) -> Option<&[FittedTerm]> {
self.schema
.parameters
.iter()
.find(|terms| terms.parameter == parameter)
.map(|terms| terms.terms.as_slice())
}
#[must_use]
pub fn coefficient_names(&self) -> Vec<&str> {
let mut names = Vec::new();
for parameter in &self.schema.parameters {
for term in ¶meter.terms {
term.append_coefficient_names(&mut names);
}
}
names
}
#[must_use]
#[inline(always)]
pub fn layout(&self) -> &ParameterLayout {
&self.layout
}
}
pub(crate) fn terms_for<'a>(schema: &'a ModelSchema, parameter: &'static str) -> &'a [FittedTerm] {
schema
.parameters
.iter()
.find(|terms| terms.parameter == parameter)
.map(|terms| terms.terms.as_slice())
.unwrap_or(&[])
}