use super::functions::{ConvexFunction, ProxableFunction};
use super::types::L1NormFunction;
impl ConvexFunction for L1NormFunction {
fn eval(&self, x: &[f64]) -> f64 {
self.lambda * x.iter().map(|xi| xi.abs()).sum::<f64>()
}
fn gradient(&self, x: &[f64]) -> Vec<f64> {
x.iter().map(|xi| self.lambda * xi.signum()).collect()
}
fn is_strongly_convex(&self) -> bool {
false
}
}
impl ProxableFunction for L1NormFunction {
fn prox(&self, v: &[f64], t: f64) -> Vec<f64> {
let threshold = t * self.lambda;
v.iter()
.map(|vi| vi.signum() * (vi.abs() - threshold).max(0.0))
.collect()
}
}