RsBundle  Diff

Differences From Artifact [9033b303ef]:

  • File src/solver.rs — part of check-in [443fb2dfa5] at 2017-11-20 09:15:07 on branch trunk — Improve dimension check in master initialization. (user: fifr size: 35195)

To Artifact [32611c01f0]:

  • File src/solver.rs — part of check-in [7293704f87] at 2017-11-20 09:24:12 on branch trunk — BoxedMasterProblem is now constructed with wrapped unconstrainted master. It is more idiomatic to pass the wrapped UnconstrainedMasterProblem to the constructor instead of constructing the wrapped master in the constructor. An advantage is that errors raised by the construction of the unconstrainted master can be handled more directly. (user: fifr size: 35288)

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);