15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
//
//! The main bundle method solver.
use {Real, DVector};
use {FirstOrderProblem, Update, Evaluation, HKWeighter};
use master::{MasterProblem, BoxedMasterProblem, MinimalMaster, CplexMaster};
use std::mem::swap;
use std::f64::{INFINITY, NEG_INFINITY};
use std::time::Instant;
use std::result::Result;
use failure::Error;
|
>
|
|
15
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, Update, Evaluation, HKWeighter};
use master::{MasterProblem, UnconstrainedMasterProblem, BoxedMasterProblem};
use master::{MinimalMaster, CplexMaster};
use std::mem::swap;
use std::f64::{INFINITY, NEG_INFINITY};
use std::time::Instant;
use std::result::Result;
use failure::Error;
|
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
|
nxt_mods: dvec![],
new_cutval: 0.0,
sgnorm: 0.0,
expected_progress: 0.0,
cnt_descent: 0,
cnt_null: 0,
start_time: Instant::now(),
master: Box::new(BoxedMasterProblem::<MinimalMaster>::new().map_err(SolverError::Master)?),
minorants: vec![],
iterinfos: vec![],
})
}
/// A new solver with default parameter.
pub fn new(problem: P) -> Result<Solver<P, Pr, E>, SolverError> {
|
|
|
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
|
nxt_mods: dvec![],
new_cutval: 0.0,
sgnorm: 0.0,
expected_progress: 0.0,
cnt_descent: 0,
cnt_null: 0,
start_time: Instant::now(),
master: Box::new(BoxedMasterProblem::new(MinimalMaster::new().map_err(SolverError::Master)?)),
minorants: vec![],
iterinfos: vec![],
})
}
/// A new solver with default parameter.
pub fn new(problem: P) -> Result<Solver<P, Pr, E>, SolverError> {
|
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
|
* information.
*/
fn init_master(&mut self) -> Result<(), SolverError> {
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(DVector);
let ub = self.problem.upper_bounds().map(DVector);
if lb.as_ref().map(|lb| lb.len() != self.problem.num_variables()).unwrap_or(false) {
return Err(SolverError::Dimension);
|
|
|
|
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
|
* information.
*/
fn init_master(&mut self) -> Result<(), SolverError> {
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::new(MinimalMaster::new().map_err(SolverError::Master)?))
} else {
debug!("Use CPLEX master problem");
Box::new(BoxedMasterProblem::new(CplexMaster::new().map_err(SolverError::Master)?))
};
let lb = self.problem.lower_bounds().map(DVector);
let ub = self.problem.upper_bounds().map(DVector);
if lb.as_ref().map(|lb| lb.len() != self.problem.num_variables()).unwrap_or(false) {
return Err(SolverError::Dimension);
|