#[derive(Debug, Clone)]
pub struct BoundsMatrix {
n: usize,
data: Vec<f64>,
}
impl BoundsMatrix {
pub fn new(n: usize, fill: f64) -> Self {
Self {
n,
data: vec![fill; n * n],
}
}
pub fn len(&self) -> usize {
self.n
}
pub fn is_empty(&self) -> bool {
self.n == 0
}
#[inline]
fn idx(&self, i: usize, j: usize) -> usize {
i * self.n + j
}
#[inline]
pub fn raw(&self, i: usize, j: usize) -> f64 {
self.data[self.idx(i, j)]
}
#[inline]
pub fn set_raw(&mut self, i: usize, j: usize, v: f64) {
let k = self.idx(i, j);
self.data[k] = v;
}
#[inline]
pub fn upper(&self, i: usize, j: usize) -> f64 {
if i < j {
self.raw(i, j)
} else {
self.raw(j, i)
}
}
#[inline]
pub fn lower(&self, i: usize, j: usize) -> f64 {
if i < j {
self.raw(j, i)
} else {
self.raw(i, j)
}
}
#[inline]
pub fn set_upper(&mut self, i: usize, j: usize, v: f64) {
if i < j {
self.set_raw(i, j, v);
} else {
self.set_raw(j, i, v);
}
}
#[inline]
pub fn set_lower(&mut self, i: usize, j: usize, v: f64) {
if i < j {
self.set_raw(j, i, v);
} else {
self.set_raw(i, j, v);
}
}
pub fn check_valid(&self) -> bool {
for i in 1..self.n {
for j in 0..i {
if self.upper(i, j) < self.lower(i, j) {
return false;
}
}
}
true
}
pub fn to_dense(&self) -> Vec<Vec<f64>> {
(0..self.n)
.map(|i| (0..self.n).map(|j| self.raw(i, j)).collect())
.collect()
}
}