use crate::core::error::ModelError;
use super::param_collection::{GradientCollection, ParamCollection};
pub trait BaseModel<Input, Output> {
fn predict(&self, x: &Input) -> Result<Output, ModelError>;
fn compute_cost(&self, x: &Input, y: &Output) -> Result<f64, ModelError>;
}
pub trait OptimizableModel<Input, Output>:
BaseModel<Input, Output> + ParamCollection + GradientCollection
{
fn forward(&self, input: &Input) -> Result<Output, ModelError>;
fn backward(&mut self, input: &Input, output_grad: &Output) -> Result<(), ModelError>;
fn compute_output_gradient(&self, x: &Input, y: &Output) -> Result<Output, ModelError>;
}