use ndarray::{Array1, ArrayView1, ArrayView2};
use crate::crossfit::Fold;
use crate::data::DmlData;
use crate::error::Result;
use crate::score::LinearScore;
pub(crate) mod irm;
mod pliv;
mod plr;
pub use irm::{Irm, IrmScore};
pub use pliv::Pliv;
pub use plr::{Plr, PlrScore};
#[derive(Debug, Clone, Copy)]
pub struct ScoreInput<'a> {
pub y: ArrayView1<'a, f64>,
pub d: ArrayView1<'a, f64>,
pub x: ArrayView2<'a, f64>,
pub z: Option<ArrayView1<'a, f64>>,
}
#[derive(Debug, Clone)]
pub struct ScoreEstimate {
pub score: LinearScore,
pub predictions: Vec<(&'static str, Array1<f64>)>,
}
pub trait LinearScoreModel {
fn name(&self) -> String;
fn validate(&self, _data: &DmlData) -> Result<()> {
Ok(())
}
fn estimate_score(&self, input: &ScoreInput<'_>, folds: &[Fold]) -> Result<ScoreEstimate>;
}
macro_rules! dml_model_api {
() => {
pub fn n_folds(mut self, n_folds: usize) -> Self {
self.splitting.n_folds = n_folds;
self
}
pub fn n_rep(mut self, n_rep: usize) -> Self {
self.splitting.n_rep = n_rep;
self
}
pub fn seed(mut self, seed: u64) -> Self {
self.splitting.seed = seed;
self
}
pub fn fit(&self, data: &$crate::DmlData) -> $crate::Result<$crate::DmlFit> {
let splits = self.splitting.draw(data.n_obs())?;
$crate::fit_model(self, data, &splits)
}
pub fn fit_with_folds(
&self,
data: &$crate::DmlData,
splits: &[Vec<$crate::Fold>],
) -> $crate::Result<$crate::DmlFit> {
$crate::fit_model(self, data, splits)
}
};
}
pub(crate) use dml_model_api;