16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
*/
//! The main bundle method solver.
use {Real, DVector};
use {FirstOrderProblem, Evaluation, HKWeighter};
use master::{self, MasterProblem, BoxedMasterProblem, MinimalMaster};
use std::result;
use std::error;
use std::mem::swap;
use std::f64::{INFINITY, NEG_INFINITY};
use std::time::Instant;
|
|
|
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
*/
//! The main bundle method solver.
use {Real, DVector};
use {FirstOrderProblem, Evaluation, HKWeighter};
use master::{self, MasterProblem, BoxedMasterProblem, MinimalMaster, CplexMaster};
use std::result;
use std::error;
use std::mem::swap;
use std::f64::{INFINITY, NEG_INFINITY};
use std::time::Instant;
|
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
|
* Initializes the master problem.
*
* The oracle is evaluated once at the initial center and the
* master problem is initialized with the returned subgradient
* information.
*/
fn init_master(&mut self) -> Result<()> {
self.master = Box::new(BoxedMasterProblem::<MinimalMaster>::new().unwrap());
let lb = self.problem.lower_bounds().map(|v| v.to_dense());
let ub = self.problem.upper_bounds().map(|v| v.to_dense());
if let Some(ref x) = lb {
if x.len() != self.problem.num_variables() {
return Err(Error::Dimension("Dimension of lower bounds does not match number of variables"));
}
}
let m = self.problem.num_subproblems();
self.master.set_num_subproblems(m);
self.master.set_vars(self.problem.num_variables(), lb, ub);
self.master.set_max_updates(self.params.max_updates);
self.cur_val = 0.0;
for i in 0..m {
let result = match self.problem.evaluate(i, &self.cur_y, INFINITY, 0.0) {
|
>
>
>
>
|
>
>
>
>
<
|
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
|
* Initializes the master problem.
*
* The oracle is evaluated once at the initial center and the
* master problem is initialized with the returned subgradient
* information.
*/
fn init_master(&mut self) -> Result<()> {
let m = self.problem.num_subproblems();
self.master = if m == 1 && self.params.max_bundle_size == 2 {
debug!("Use minimal master problem");
Box::new(BoxedMasterProblem::<MinimalMaster>::new().unwrap())
} else {
debug!("Use CPLEX master problem");
Box::new(BoxedMasterProblem::<CplexMaster>::new().unwrap())
};
let lb = self.problem.lower_bounds().map(|v| v.to_dense());
let ub = self.problem.upper_bounds().map(|v| v.to_dense());
if let Some(ref x) = lb {
if x.len() != self.problem.num_variables() {
return Err(Error::Dimension("Dimension of lower bounds does not match number of variables"));
}
}
self.master.set_num_subproblems(m);
self.master.set_vars(self.problem.num_variables(), lb, ub);
self.master.set_max_updates(self.params.max_updates);
self.cur_val = 0.0;
for i in 0..m {
let result = match self.problem.evaluate(i, &self.cur_y, INFINITY, 0.0) {
|