use super::*;
use crate::solver::core::{
cones::{CompositeCone, SupportedConeT},
traits::ProblemData,
Solver,
};
use crate::algebra::*;
use crate::timers::*;
pub type DefaultSolver<T = f64> = Solver<
DefaultProblemData<T>,
DefaultVariables<T>,
DefaultResiduals<T>,
DefaultKKTSystem<T>,
CompositeCone<T>,
DefaultInfo<T>,
DefaultSolution<T>,
DefaultSettings<T>,
>;
impl<T> DefaultSolver<T>
where
T: FloatT,
{
pub fn new(
P: &CscMatrix<T>,
q: &[T],
A: &CscMatrix<T>,
b: &[T],
cone_types: &[SupportedConeT<T>],
settings: DefaultSettings<T>,
) -> Self {
_check_dimensions(P, q, A, b, cone_types);
let mut timers = Timers::default();
let mut output;
timeit! {timers => "setup"; {
let info = DefaultInfo::<T>::new();
let cones = CompositeCone::<T>::new(cone_types);
let mut data = DefaultProblemData::<T>::new(P,q,A,b);
let variables = DefaultVariables::<T>::new(data.n,data.m);
let residuals = DefaultResiduals::<T>::new(data.n,data.m);
timeit!{timers => "equilibration"; {
data.equilibrate(&cones,&settings);
}}
let kktsystem;
timeit!{timers => "kktinit"; {
kktsystem = DefaultKKTSystem::<T>::new(&data,&cones,&settings);
}}
let step_rhs = DefaultVariables::<T>::new(data.n,data.m);
let step_lhs = DefaultVariables::<T>::new(data.n,data.m);
let prev_vars = DefaultVariables::<T>::new(data.n,data.m);
let solution = DefaultSolution::<T>::new(data.m,data.n);
output = Self{data,variables,residuals,kktsystem,step_lhs,
step_rhs,prev_vars,info,solution,cones,settings,timers: None};
}}
output.timers.replace(timers);
output
}
}
fn _check_dimensions<T: FloatT>(
P: &CscMatrix<T>,
q: &[T],
A: &CscMatrix<T>,
b: &[T],
cone_types: &[SupportedConeT<T>],
) {
let m = b.len();
let n = q.len();
let p = cone_types.iter().fold(0, |acc, cone| acc + cone.nvars());
assert!(m == A.nrows(), "A and b incompatible dimensions.");
assert!(
p == m,
"Constraint dimensions inconsistent with size of cones."
);
assert!(n == A.ncols(), "A and q incompatible dimensions.");
assert!(n == P.ncols(), "P and q incompatible dimensions.");
assert!(P.is_square(), "P not square.");
}