use crate::errors::Result;
use ndarray::{Array1, Array2};
pub trait HiddenMarkovModel {
fn n_states(&self) -> usize;
fn n_features(&self) -> usize;
fn fit(&mut self, observations: &Array2<f64>, lengths: Option<&[usize]>) -> Result<()>;
fn predict(&self, observations: &Array2<f64>) -> Result<Array1<usize>>;
fn score(&self, observations: &Array2<f64>) -> Result<f64>;
fn sample(&self, n_samples: usize) -> Result<(Array2<f64>, Array1<usize>)>;
fn decode(&self, observations: &Array2<f64>) -> Result<(f64, Array1<usize>)> {
let states = self.predict(observations)?;
let log_prob = self.score(observations)?;
Ok((log_prob, states))
}
}