use std::sync::Arc;
use crate::ids::VariableId;
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct AssumptionSet {
pub entries: Vec<AssumptionRecord>,
}
impl AssumptionSet {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn push(&mut self, record: AssumptionRecord) {
self.entries.push(record);
}
#[must_use]
pub fn len(&self) -> usize {
self.entries.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.entries.is_empty()
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct AssumptionRecord {
pub assumption: Assumption,
pub source: AssumptionSource,
pub scope: AssumptionScope,
pub status: AssumptionStatus,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Assumption {
CausalMarkov,
Faithfulness,
CausalSufficiency,
Consistency,
Positivity,
NoInterference,
Stationarity,
PiecewiseStationarity,
NoSelectionBias,
ExclusionRestriction {
instrument: VariableId,
},
Monotonicity,
ParametricRestriction(ParametricAssumption),
PriorRestriction(PriorAssumption),
Custom {
id: Arc<str>,
description: Arc<str>,
},
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ParametricAssumption {
pub id: Arc<str>,
pub description: Arc<str>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct PriorAssumption {
pub id: Arc<str>,
pub description: Arc<str>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum AssumptionSource {
UserDeclared,
AlgorithmDefault {
algorithm: Arc<str>,
},
Artifact,
Derived {
from: Arc<str>,
},
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum AssumptionScope {
Global,
Identification,
Estimation,
Discovery,
Variables {
variables: Arc<[VariableId]>,
},
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
pub enum AssumptionStatus {
Declared,
Supported,
Contradicted,
Untestable,
}