use candle_core::{Result, Tensor};
pub trait BlackBoxLikelihood {
fn log_likelihood(&self, etas: &[&Tensor]) -> Result<Tensor>;
}
pub trait VariationalDistribution {
fn mean(&self) -> Result<Tensor>;
fn var(&self) -> Result<Tensor>;
}
pub trait Prior {
fn log_prob(&self, theta: &Tensor) -> Result<Tensor>;
}
pub trait AnalyticalKL {
fn kl_from_gaussian(&self, mean: &Tensor, var: &Tensor) -> Result<Tensor>;
}
pub trait ComponentVariational: VariationalDistribution {
fn alpha(&self) -> Result<Tensor>;
fn beta_mean(&self) -> Result<Tensor>;
fn beta_std(&self) -> Result<Tensor>;
fn num_components(&self) -> usize;
}
pub trait IndependentGateVariational: VariationalDistribution {
fn inclusion_prob(&self) -> Result<Tensor>;
fn effect_mean(&self) -> Result<Tensor>;
fn effect_std(&self) -> Result<Tensor>;
fn kl_bernoulli(&self, prior_inclusion: f64) -> Result<Tensor>;
}
pub trait LocalReparamModel {
fn forward(&self, num_samples: usize) -> Result<LocalReparamSample>;
}
pub struct LocalReparamSample {
pub eta: Tensor,
pub kl: Tensor,
}