RsBundle  Diff

Differences From Artifact [c77f09f605]:

  • File src/solver.rs — part of check-in [f0ef5ba392] at 2017-01-20 09:19:39 on branch trunk — Refactor several lint warnings. (user: fifr size: 33012)

To Artifact [6c293f03e8]:

  • File src/solver.rs — part of check-in [d7ed56f9b3] at 2017-02-22 16:32:29 on branch trunk — Remove `DVector` from external API. The use of `[Real]` or `Vec<Real>` is sufficient in most cases. (user: fifr size: 33005)

513
514
515
516
517
518
519
520
521


522
523
524
525
526
527
528
513
514
515
516
517
518
519


520
521
522
523
524
525
526
527
528







-
-
+
+







    pub fn init(&mut self) -> Result<()> {
        try!(self.params.check());
        if self.cur_y.len() != self.problem.num_variables() {
            self.cur_valid = false;
            self.cur_y.init0(self.problem.num_variables());
        }

        let lb = self.problem.lower_bounds().map(|x| x.to_dense());
        let ub = self.problem.upper_bounds().map(|x| x.to_dense());
        let lb = self.problem.lower_bounds();
        let ub = self.problem.upper_bounds();
        for i in 0..self.cur_y.len() {
            let lb_i = lb.as_ref().map(|x| x[i]).unwrap_or(NEG_INFINITY);
            let ub_i = ub.as_ref().map(|x| x[i]).unwrap_or(INFINITY);
            if lb_i > ub_i {
                return Err(Error::InvalidBounds(lb_i, ub_i));
            }
            if self.cur_y[i] < lb_i {
623
624
625
626
627
628
629

630
631
632
633
634
635
636
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637







+








        if !newvars.is_empty() {
            let mut problem = &mut self.problem;
            let minorants = &self.minorants;
            self.master.add_vars(&newvars,
                                 &mut move |fidx, minidx, vars| {
                                     problem.extend_subgradient(minorants[fidx][minidx].primal.as_ref().unwrap(), vars)
                                         .map(DVector)
                                         .unwrap()
                                 });
            let newn = self.cur_y.len() + newvars.len();
            self.cur_y.resize(newn, 0.0);
            self.nxt_d.resize(newn, 0.0);
            self.nxt_y.resize(newn, 0.0);
            Ok(true)
690
691
692
693
694
695
696
697
698


699
700
701
702
703
704
705
691
692
693
694
695
696
697


698
699
700
701
702
703
704
705
706







-
-
+
+







            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());
        let lb = self.problem.lower_bounds().map(DVector);
        let ub = self.problem.upper_bounds().map(DVector);

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