mod attribution;
mod average;
mod counterfactual;
mod distribution;
mod error;
mod mediation;
mod population;
mod target;
mod temporal;
pub use crate::intervention::TemporalPolicy;
pub use attribution::{
AllocationMethod, AnomalyAttributionQuery, AttributionComponents, ChangeAttributionQuery,
MechanismChangeQuery, OrderedFloatBits, PopulationSelector, ShapleyConfig, ShapleyMode,
UnitChangeQuery,
};
pub use average::AverageEffectQuery;
pub use counterfactual::CounterfactualQuery;
pub use distribution::{InterventionalDistributionQuery, PathSpecificEffectQuery};
pub use error::QueryError;
pub use mediation::{ConditionalEffectQuery, MediationContrast, MediationQuery};
pub use population::{PopulationRegistry, PopulationSelection};
pub use target::{PredicateExpr, TargetPopulation};
pub use temporal::TemporalEffectQuery;
#[derive(Clone, Debug, PartialEq)]
#[non_exhaustive]
pub enum CausalQuery {
AverageEffect(AverageEffectQuery),
TemporalEffect(TemporalEffectQuery),
Counterfactual(CounterfactualQuery),
AnomalyAttribution(AnomalyAttributionQuery),
ChangeAttribution(ChangeAttributionQuery),
MechanismChange(MechanismChangeQuery),
UnitChange(UnitChangeQuery),
Mediation(MediationQuery),
ConditionalEffect(ConditionalEffectQuery),
Distribution(InterventionalDistributionQuery),
PathSpecific(PathSpecificEffectQuery),
}
impl CausalQuery {
#[must_use]
pub fn average_effect(query: AverageEffectQuery) -> Self {
Self::AverageEffect(query)
}
#[must_use]
pub fn temporal_effect(query: TemporalEffectQuery) -> Self {
Self::TemporalEffect(query)
}
#[must_use]
pub fn counterfactual(query: CounterfactualQuery) -> Self {
Self::Counterfactual(query)
}
#[must_use]
pub fn anomaly_attribution(query: AnomalyAttributionQuery) -> Self {
Self::AnomalyAttribution(query)
}
#[must_use]
pub fn change_attribution(query: ChangeAttributionQuery) -> Self {
Self::ChangeAttribution(query)
}
#[must_use]
pub fn mechanism_change(query: MechanismChangeQuery) -> Self {
Self::MechanismChange(query)
}
#[must_use]
pub fn unit_change(query: UnitChangeQuery) -> Self {
Self::UnitChange(query)
}
#[must_use]
pub fn mediation(query: MediationQuery) -> Self {
Self::Mediation(query)
}
#[must_use]
pub fn conditional_effect(query: ConditionalEffectQuery) -> Self {
Self::ConditionalEffect(query)
}
#[must_use]
pub fn distribution(query: InterventionalDistributionQuery) -> Self {
Self::Distribution(query)
}
#[must_use]
pub fn path_specific(query: PathSpecificEffectQuery) -> Self {
Self::PathSpecific(query)
}
}
impl From<AverageEffectQuery> for CausalQuery {
fn from(query: AverageEffectQuery) -> Self {
Self::AverageEffect(query)
}
}
impl From<TemporalEffectQuery> for CausalQuery {
fn from(query: TemporalEffectQuery) -> Self {
Self::TemporalEffect(query)
}
}
impl From<CounterfactualQuery> for CausalQuery {
fn from(query: CounterfactualQuery) -> Self {
Self::Counterfactual(query)
}
}
impl From<MediationQuery> for CausalQuery {
fn from(query: MediationQuery) -> Self {
Self::Mediation(query)
}
}
impl From<ConditionalEffectQuery> for CausalQuery {
fn from(query: ConditionalEffectQuery) -> Self {
Self::ConditionalEffect(query)
}
}
impl From<InterventionalDistributionQuery> for CausalQuery {
fn from(query: InterventionalDistributionQuery) -> Self {
Self::Distribution(query)
}
}
impl From<PathSpecificEffectQuery> for CausalQuery {
fn from(query: PathSpecificEffectQuery) -> Self {
Self::PathSpecific(query)
}
}
impl From<AnomalyAttributionQuery> for CausalQuery {
fn from(query: AnomalyAttributionQuery) -> Self {
Self::AnomalyAttribution(query)
}
}
impl From<ChangeAttributionQuery> for CausalQuery {
fn from(query: ChangeAttributionQuery) -> Self {
Self::ChangeAttribution(query)
}
}
impl From<MechanismChangeQuery> for CausalQuery {
fn from(query: MechanismChangeQuery) -> Self {
Self::MechanismChange(query)
}
}
impl From<UnitChangeQuery> for CausalQuery {
fn from(query: UnitChangeQuery) -> Self {
Self::UnitChange(query)
}
}
impl CausalQuery {
#[must_use]
pub const fn is_static_ate(&self) -> bool {
matches!(self, Self::AverageEffect(_))
}
#[must_use]
pub const fn is_temporal_effect(&self) -> bool {
matches!(self, Self::TemporalEffect(_))
}
#[must_use]
pub const fn is_counterfactual(&self) -> bool {
matches!(self, Self::Counterfactual(_))
}
#[must_use]
pub const fn is_mediation(&self) -> bool {
matches!(self, Self::Mediation(_))
}
#[must_use]
pub const fn is_conditional_effect(&self) -> bool {
matches!(self, Self::ConditionalEffect(_))
}
#[must_use]
pub const fn is_distribution(&self) -> bool {
matches!(self, Self::Distribution(_))
}
#[must_use]
pub const fn is_path_specific(&self) -> bool {
matches!(self, Self::PathSpecific(_))
}
pub fn validate(&self) -> Result<(), QueryError> {
match self {
Self::AverageEffect(q) => q.validate(),
Self::TemporalEffect(q) => q.validate(),
Self::Counterfactual(q) => q.validate(),
Self::AnomalyAttribution(q) => q.validate(),
Self::ChangeAttribution(q) => q.validate(),
Self::MechanismChange(q) => q.validate(),
Self::UnitChange(q) => q.validate(),
Self::Mediation(q) => q.validate(),
Self::ConditionalEffect(q) => q.validate(),
Self::Distribution(q) => q.validate(),
Self::PathSpecific(q) => q.validate(),
}
}
}
#[cfg(test)]
#[path = "tests.rs"]
mod tests;