RsBundle  Diff

Differences From Artifact [2c5245183b]:

  • File src/solver.rs — part of check-in [a89b3502b5] at 2016-09-28 15:02:26 on branch trunk — Add `MasterProblem::set_num_subproblems`. (user: fifr size: 23431)

To Artifact [592e0262e8]:

  • File src/solver.rs — part of check-in [cc9ce5ef15] at 2016-09-28 15:15:52 on branch trunk — solver: Use `CplexMaster` as default for large master problems. (user: fifr size: 23702)

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