use std::borrow::Borrow;
use std::convert::TryInto;
use std::ops::RangeBounds;
use std::os::raw::c_int;
use crate::Problem;
#[derive(Debug, Clone, Copy)]
pub struct Row(pub(crate) c_int);
#[derive(Debug, Clone, PartialEq, Default)]
pub struct ColMatrix {
pub(crate) astart: Vec<c_int>,
pub(crate) aindex: Vec<c_int>,
pub(crate) avalue: Vec<f64>,
}
impl Problem<ColMatrix> {
pub fn add_row<N: Into<f64> + Copy, B: RangeBounds<N>>(&mut self, bounds: B) -> Row {
self.add_row_inner(bounds)
}
pub fn add_column<
N: Into<f64> + Copy,
B: RangeBounds<N>,
ITEM: Borrow<(Row, f64)>,
I: IntoIterator<Item = ITEM>,
>(
&mut self,
col_factor: f64,
bounds: B,
row_factors: I,
) {
self.matrix
.astart
.push(self.matrix.aindex.len().try_into().unwrap());
let iter = row_factors.into_iter();
let (size, _) = iter.size_hint();
self.matrix.aindex.reserve(size);
self.matrix.avalue.reserve(size);
for r in iter {
let &(row, factor) = r.borrow();
self.matrix.aindex.push(row.0);
self.matrix.avalue.push(factor);
}
self.add_column_inner(col_factor, bounds);
}
}