use super::functions::ConvexFunction;
use super::types::QuadraticFunction;
impl ConvexFunction for QuadraticFunction {
fn eval(&self, x: &[f64]) -> f64 {
let n = x.len();
let mut quad = 0.0_f64;
for i in 0..n {
for j in 0..n {
quad += x[i] * self.coeffs[i][j] * x[j];
}
}
let linear: f64 = self.linear.iter().zip(x).map(|(c, xi)| c * xi).sum();
0.5 * quad + linear + self.constant
}
fn gradient(&self, x: &[f64]) -> Vec<f64> {
let n = x.len();
let mut grad = vec![0.0_f64; n];
for i in 0..n {
for j in 0..n {
grad[i] += self.coeffs[i][j] * x[j];
}
grad[i] += self.linear[i];
}
grad
}
fn is_strongly_convex(&self) -> bool {
self.coeffs.iter().enumerate().all(|(i, row)| row[i] > 0.0)
}
}