1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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);
}
}