#![allow(non_snake_case)]
use crate::algebra::*;
use crate::solver::core::cones::*;
use super::*;
pub struct LDLDataMap {
pub P: Vec<usize>,
pub A: Vec<usize>,
pub Hsblocks: Vec<usize>, pub SOC_u: Vec<Vec<usize>>, pub SOC_v: Vec<Vec<usize>>, pub SOC_D: Vec<usize>,
pub diagP: Vec<usize>,
pub diag_full: Vec<usize>,
}
impl LDLDataMap {
pub fn new<T: FloatT>(
Pmat: &CscMatrix<T>,
Amat: &CscMatrix<T>,
cones: &CompositeCone<T>,
) -> Self {
let (m, n) = (Amat.nrows(), Pmat.nrows());
let P = vec![0; Pmat.nnz()];
let A = vec![0; Amat.nnz()];
let diagP = vec![0; n];
let Hsblocks = allocate_kkt_Hsblocks::<T, usize>(cones);
let nsoc = cones.type_count(SupportedConeTag::SecondOrderCone);
let p = 2 * nsoc;
let SOC_D = vec![0; p];
let mut SOC_u = Vec::<Vec<usize>>::with_capacity(nsoc);
let mut SOC_v = Vec::<Vec<usize>>::with_capacity(nsoc);
for cone in cones.iter() {
if let SupportedCone::SecondOrderCone(soc) = cone {
SOC_u.push(vec![0; soc.numel()]);
SOC_v.push(vec![0; soc.numel()]);
}
}
let diag_full = vec![0; m + n + p];
Self {
P,
A,
Hsblocks,
SOC_u,
SOC_v,
SOC_D,
diagP,
diag_full,
}
}
}