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 ArgminSolver;
use ArgminResult;
pub struct MultiStart<'a, A>
where
A: ArgminSolver<'a>,
{
solvers: Vec<A>,
problems: Vec<<A as ArgminSolver<'a>>::ProblemDefinition>,
init_params: Vec<<A as ArgminSolver<'a>>::StartingPoints>,
}
impl<'a, A> MultiStart<'a, A>
where
A: ArgminSolver<'a>,
{
pub fn new() -> Self {
MultiStart {
solvers: vec![],
problems: vec![],
init_params: vec![],
}
}
pub fn push(
&mut self,
solver: A,
prob_def: A::ProblemDefinition,
init_param: A::StartingPoints,
) -> &mut Self {
self.solvers.push(solver);
self.problems.push(prob_def);
self.init_params.push(init_param);
self
}
pub fn run(&mut self) -> Vec<ArgminResult<A::Parameter, A::CostValue>> {
self.solvers
.iter_mut()
.zip(self.problems.clone().into_iter())
.zip(self.init_params.iter())
.map(|((s, p), i)| s.run(p, i).unwrap())
.collect()
}
}
impl<'a, A> Default for MultiStart<'a, A>
where
A: ArgminSolver<'a>,
{
fn default() -> Self {
Self::new()
}
}