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
70
71
use std::collections::HashMap;
use nexsys_math::Variable;
use crate::Equation;
#[derive(Clone)]
#[derive(Debug)]
#[derive(PartialEq)]
pub struct BlockMgr<'a> {
blocks: Vec<HashMap<Vec<String>, Vec<String>>>,
ctx: &'a HashMap<String, Variable>
}
impl <'a> BlockMgr<'a> {
pub fn new(ctx: &'a HashMap<String, Variable>) -> BlockMgr<'a> {
BlockMgr { blocks: vec![], ctx }
}
pub fn add_item(&mut self, expr: &Equation) {
let n = expr.n_unknowns(&self.ctx);
let uks = expr.unknowns(&self.ctx);
if n < 1 {
return; }
if self.blocks.len() == 0 {
self.blocks = Vec::with_capacity(n);
}
while self.blocks.len() < n {
self.blocks.push(HashMap::new())
}
if let Some(v) = self.blocks[n-1].get_mut(&uks) {
v.push(expr.as_expr());
} else {
self.blocks[n-1].insert(uks, vec![expr.as_expr()]);
}
}
pub fn constrained(mut self) -> Option<Vec<(Vec<String>, Vec<String>)>> {
let mut eqns = vec![];
for i in 0..self.blocks.len() {
for j in self.blocks[i].drain() {
if j.1.len() == i + 1 {
eqns.push((j.0, j.1));
}
}
}
if eqns.len() == 0 {
None
} else {
Some(eqns)
}
}
}