use crate::LUInt;
pub(crate) fn solve_triangular(
nz_symb: usize,
pattern_symb: &[LUInt],
begin: &[LUInt],
end: Option<&[LUInt]>,
index: &[LUInt],
value: &[f64],
pivot: Option<&[f64]>,
droptol: f64,
lhs: &mut [f64], pattern: &mut [LUInt],
flops: &mut usize, ) -> usize {
let mut nz: usize = 0;
let mut flop_count = 0;
if pivot.is_some() && end.is_some() {
let pivot = pivot.unwrap();
let end = end.unwrap();
for n in 0..nz_symb {
let ipivot = pattern_symb[n];
if lhs[ipivot as usize] != 0.0 {
lhs[ipivot as usize] /= pivot[ipivot as usize];
let x = lhs[ipivot as usize];
flop_count += 1;
for pos in begin[ipivot as usize]..end[ipivot as usize] {
let i = index[pos as usize];
lhs[i as usize] -= x * value[pos as usize];
flop_count += 1;
}
if x.abs() > droptol {
pattern[nz] = ipivot;
nz += 1;
} else {
lhs[ipivot as usize] = 0.0;
}
}
}
} else if let Some(pivot) = pivot {
for n in 0..nz_symb {
let ipivot = pattern_symb[n];
if lhs[ipivot as usize] != 0.0 {
lhs[ipivot as usize] /= pivot[ipivot as usize];
let x = lhs[ipivot as usize];
flop_count += 1;
let mut pos = begin[ipivot as usize];
while index[pos as usize] >= 0 {
let i = index[pos as usize];
lhs[i as usize] -= x * value[pos as usize];
flop_count += 1;
pos += 1;
}
if x.abs() > droptol {
pattern[nz] = ipivot;
nz += 1;
} else {
lhs[ipivot as usize] = 0.0;
}
}
}
} else if let Some(end) = end {
for n in 0..nz_symb {
let ipivot = pattern_symb[n];
if lhs[ipivot as usize] != 0.0 {
let x = lhs[ipivot as usize];
for pos in begin[ipivot as usize]..end[ipivot as usize] {
let i = index[pos as usize];
lhs[i as usize] -= x * value[pos as usize];
flop_count += 1;
}
if x.abs() > droptol {
pattern[nz] = ipivot;
nz += 1;
} else {
lhs[ipivot as usize] = 0.0;
}
}
}
} else {
for n in 0..nz_symb {
let ipivot = pattern_symb[n];
if lhs[ipivot as usize] != 0.0 {
let x = lhs[ipivot as usize];
let mut pos = begin[ipivot as usize];
while index[pos as usize] >= 0 {
let i = index[pos as usize];
lhs[i as usize] -= x * value[pos as usize];
flop_count += 1;
pos += 1;
}
if x.abs() > droptol {
pattern[nz] = ipivot;
nz += 1;
} else {
lhs[ipivot as usize] = 0.0;
}
}
}
}
*flops += flop_count;
nz
}