pub(crate) fn match_postproc(
m: usize,
n: usize,
ptr: &[usize],
row: &[usize],
val: &[f64],
rscaling: &mut [f64],
cscaling: &mut [f64],
nmatch: usize,
match_result: &[i32],
_flag: &mut i32,
) {
if m == n {
let ravg = rscaling.iter().sum::<f64>() / m as f64;
let cavg = cscaling.iter().sum::<f64>() / n as f64;
let adjust = (ravg - cavg) / 2.0;
for r in rscaling {
*r -= adjust;
}
for c in cscaling {
*c += adjust;
}
} else if m < n {
let mut cmax = vec![0.0; n];
let mut ravg = 0.0;
let mut cavg = 0.0;
for (i, &m) in match_result.iter().enumerate() {
if m == 0 {
continue;
}
ravg += rscaling[i];
cavg += cscaling[m as usize];
}
ravg /= nmatch as f64;
cavg /= nmatch as f64;
let adjust = (ravg - cavg) / 2.0;
for r in rscaling.iter_mut() {
*r -= adjust;
}
for c in cscaling.iter_mut() {
*c += adjust;
}
for i in 0..n {
let colmax = (ptr[i]..ptr[i + 1])
.map(|j| (val[j] * rscaling[row[j]].exp()).abs())
.fold(0.0, f64::max);
cmax[i] = if colmax == 0.0 {
0.0
} else {
(1.0 / colmax).ln()
};
}
for &m in match_result {
if m != 0 {
cmax[m as usize] = cscaling[m as usize];
}
}
cscaling.copy_from_slice(&cmax);
} else if n < m {
let mut rmax = vec![0.0; m];
let mut ravg = 0.0;
let mut cavg = 0.0;
for (i, &m) in match_result.iter().enumerate() {
if m == 0 {
continue;
}
ravg += rscaling[i];
cavg += cscaling[m as usize];
}
ravg /= nmatch as f64;
cavg /= nmatch as f64;
let adjust = (ravg - cavg) / 2.0;
for r in rscaling.iter_mut() {
*r -= adjust;
}
for c in cscaling.iter_mut() {
*c += adjust;
}
for i in 0..n {
for j in ptr[i]..ptr[i + 1] {
let v = (val[j] * cscaling[i].exp()).abs();
rmax[row[j]] = f64::max(rmax[row[j]], v);
}
}
for (i, &m) in match_result.iter().enumerate() {
if m != 0 {
continue;
}
rscaling[i] = if rmax[i] == 0.0 {
0.0
} else {
(1.0 / rmax[i]).ln()
};
}
}
}