| ︙ | | | ︙ | |
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>
//
use crate::mcf;
use crate::{Aggregatable, DVector, FirstOrderProblem, Minorant, Real, SimpleEvaluation};
use log::debug;
use std::f64::INFINITY;
use std::fmt;
use std::fs::File;
use std::io::Read;
use std::result;
|
>
|
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>
//
use crate::mcf;
use crate::{Aggregatable, DVector, FirstOrderProblem, Minorant, Real, SimpleEvaluation};
use itertools::izip;
use log::debug;
use std::f64::INFINITY;
use std::fmt;
use std::fs::File;
use std::io::Read;
use std::result;
|
| ︙ | | | ︙ | |
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
ind: usize,
val: Real,
}
/// A single MMCF subproblem, i.e. one network.
struct Subproblem {
net: mcf::Solver,
cbase: DVector,
c: DVector,
}
pub struct MMCFProblem {
pub multimodel: bool,
subs: Vec<Subproblem>,
lhs: Vec<Vec<Vec<Elem>>>,
rhs: DVector,
rhsval: Real,
}
impl MMCFProblem {
pub fn read_mnetgen(basename: &str) -> std::result::Result<MMCFProblem, MMCFReadError> {
let mut buffer = String::new();
|
>
<
|
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
ind: usize,
val: Real,
}
/// A single MMCF subproblem, i.e. one network.
struct Subproblem {
net: mcf::Solver,
lhs: Vec<Vec<Elem>>,
cbase: DVector,
c: DVector,
}
pub struct MMCFProblem {
pub multimodel: bool,
subs: Vec<Subproblem>,
rhs: DVector,
rhsval: Real,
}
impl MMCFProblem {
pub fn read_mnetgen(basename: &str) -> std::result::Result<MMCFProblem, MMCFReadError> {
let mut buffer = String::new();
|
| ︙ | | | ︙ | |
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
|
let mut data = line.split_whitespace();
let mt = data.next().unwrap().parse::<usize>()? - 1;
let cap = data.next().unwrap().parse::<Real>()?;
rhs[mt] = cap;
}
// set lhs
let mut lhs = vec![vec![vec![]; ncom]; ncaps];
for i in 0..ncaps {
for fidx in 0..ncom {
lhs[i][fidx] = lhsidx[i][fidx].iter().map(|&j| Elem { ind: j, val: 1.0 }).collect();
}
}
let subproblems = nets
.into_iter()
.zip(cbase)
.map(|(net, cbase)| Subproblem { net, cbase, c: dvec![] })
.collect();
Ok(MMCFProblem {
multimodel: false,
subs: subproblems,
lhs,
rhs,
rhsval: 0.0,
})
}
/// Compute costs for a primal solution.
pub fn get_primal_costs(&self, fidx: usize, primals: &[DVector]) -> Real {
|
|
<
|
>
|
|
>
|
|
|
>
>
<
|
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
|
let mut data = line.split_whitespace();
let mt = data.next().unwrap().parse::<usize>()? - 1;
let cap = data.next().unwrap().parse::<Real>()?;
rhs[mt] = cap;
}
// set lhs
let mut lhs = vec![vec![vec![]; ncaps]; ncom];
for fidx in 0..ncom {
for i in 0..ncaps {
lhs[fidx][i] = lhsidx[i][fidx].iter().map(|&j| Elem { ind: j, val: 1.0 }).collect();
}
}
let subproblems = izip!(nets, cbase, lhs)
.map(|(net, cbase, lhs)| Subproblem {
net,
cbase,
c: dvec![],
lhs,
})
.collect();
Ok(MMCFProblem {
multimodel: false,
subs: subproblems,
rhs,
rhsval: 0.0,
})
}
/// Compute costs for a primal solution.
pub fn get_primal_costs(&self, fidx: usize, primals: &[DVector]) -> Real {
|
| ︙ | | | ︙ | |
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
|
type Err = Error;
type Primal = Vec<DVector>;
type EvalResult = SimpleEvaluation<Vec<DVector>>;
fn num_variables(&self) -> usize {
self.lhs.len()
}
fn lower_bounds(&self) -> Option<Vec<Real>> {
Some(vec![0.0; self.lhs.len()])
}
fn upper_bounds(&self) -> Option<Vec<Real>> {
None
}
fn num_subproblems(&self) -> usize {
|
|
|
|
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
|
type Err = Error;
type Primal = Vec<DVector>;
type EvalResult = SimpleEvaluation<Vec<DVector>>;
fn num_variables(&self) -> usize {
self.rhs.len()
}
fn lower_bounds(&self) -> Option<Vec<Real>> {
Some(vec![0.0; self.rhs.len()])
}
fn upper_bounds(&self) -> Option<Vec<Real>> {
None
}
fn num_subproblems(&self) -> usize {
|
| ︙ | | | ︙ | |
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
|
sub.c.clear();
sub.c.extend(sub.cbase.iter());
}
for (i, &y) in y.iter().enumerate().filter(|&(i, &y)| y != 0.0) {
self.rhsval += self.rhs[i] * y;
for (fidx, sub) in self.subs.iter_mut().enumerate() {
for elem in &self.lhs[i][fidx] {
sub.c[elem.ind] += y * elem.val;
}
}
}
debug!("y={:?}", y);
for (i, sub) in self.subs.iter_mut().enumerate() {
|
|
|
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
|
sub.c.clear();
sub.c.extend(sub.cbase.iter());
}
for (i, &y) in y.iter().enumerate().filter(|&(i, &y)| y != 0.0) {
self.rhsval += self.rhs[i] * y;
for (fidx, sub) in self.subs.iter_mut().enumerate() {
for elem in &sub.lhs[i] {
sub.c[elem.ind] += y * elem.val;
}
}
}
debug!("y={:?}", y);
for (i, sub) in self.subs.iter_mut().enumerate() {
|
| ︙ | | | ︙ | |
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
|
objective = self.rhsval - self.subs[fidx].net.objective()?;
} else {
subg = dvec![0.0; self.rhs.len()];
objective = -self.subs[fidx].net.objective()?;
}
let sol = self.subs[fidx].net.get_solution()?;
for (i, lhs) in self.lhs.iter().enumerate() {
subg[i] -= lhs[fidx].iter().map(|elem| elem.val * sol[elem.ind]).sum::<Real>();
}
Ok(SimpleEvaluation {
objective,
minorants: vec![(
Minorant {
constant: objective,
|
|
|
|
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
|
objective = self.rhsval - self.subs[fidx].net.objective()?;
} else {
subg = dvec![0.0; self.rhs.len()];
objective = -self.subs[fidx].net.objective()?;
}
let sol = self.subs[fidx].net.get_solution()?;
for (i, lhs) in self.subs[fidx].lhs.iter().enumerate() {
subg[i] -= lhs.iter().map(|elem| elem.val * sol[elem.ind]).sum::<Real>();
}
Ok(SimpleEvaluation {
objective,
minorants: vec![(
Minorant {
constant: objective,
|
| ︙ | | | ︙ | |
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
|
let mut sols = Vec::with_capacity(self.subs.len());
for sub in &self.subs {
objective -= sub.net.objective()?;
sols.push(sub.net.get_solution()?);
}
let mut subg = self.rhs.clone();
for (i, lhs) in self.lhs.iter().enumerate() {
for (fidx, flhs) in lhs.iter().enumerate() {
subg[i] -= flhs.iter().map(|elem| elem.val * sols[fidx][elem.ind]).sum::<Real>();
}
}
Ok(SimpleEvaluation {
objective,
minorants: vec![(
Minorant {
|
|
|
|
|
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
|
let mut sols = Vec::with_capacity(self.subs.len());
for sub in &self.subs {
objective -= sub.net.objective()?;
sols.push(sub.net.get_solution()?);
}
let mut subg = self.rhs.clone();
for (fidx, sub) in self.subs.iter().enumerate() {
for (i, lhs) in sub.lhs.iter().enumerate() {
subg[i] -= lhs.iter().map(|elem| elem.val * sols[fidx][elem.ind]).sum::<Real>();
}
}
Ok(SimpleEvaluation {
objective,
minorants: vec![(
Minorant {
|
| ︙ | | | ︙ | |