#![allow(non_snake_case)]
use crate::algebra::*;
use crate::solver::chordal::*;
#[derive(Debug)]
pub(crate) struct SparsityPattern {
pub(crate) sntree: SuperNodeTree,
pub(crate) ordering: Vec<usize>,
pub(crate) orig_index: usize, }
impl SparsityPattern {
pub(crate) fn new<T: FloatT>(
L: CscMatrix<T>,
mut ordering: Vec<usize>,
orig_index: usize,
merge_method: &str,
) -> Self {
let mut sntree = SuperNodeTree::new(&L);
if sntree.n_cliques > 1 {
match merge_method {
"none" => {
NoMergeStrategy::new().merge_cliques(&mut sntree);
}
"parent_child" => {
ParentChildMergeStrategy::new().merge_cliques(&mut sntree);
}
"clique_graph" => {
CliqueGraphMergeStrategy::new().merge_cliques(&mut sntree);
}
_ => {
panic! {"Unrecognized merge strategy"};
}
}
}
sntree.reorder_snode_consecutively(&mut ordering);
sntree.calculate_block_dimensions();
Self {
sntree,
ordering,
orig_index,
}
}
}