RsBundle  Check-in [a89b3502b5]

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Add `MasterProblem::set_num_subproblems`.
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: a89b3502b51408955433ac8ca5ec69982119e4d6
User & Date: fifr 2016-09-28 15:02:26.367
Context
2016-09-28
15:02
Add `Vector::add_scaled`. check-in: 88be8bb445 user: fifr tags: trunk
15:02
Add `MasterProblem::set_num_subproblems`. check-in: a89b3502b5 user: fifr tags: trunk
12:23
minorant: Add `Minorant::new`. check-in: 19d05ec52f user: fifr tags: trunk
Changes
Unified Diff Ignore Whitespace Patch
Changes to src/master/boxed.rs.
178
179
180
181
182
183
184




185
186
187
188
189
190
191
        }
        return norm2;
    }
}


impl<M : UnconstrainedMasterProblem> MasterProblem for BoxedMasterProblem<M> {




    fn set_vars(&mut self, n: usize, lb : Option<DVector>, ub: Option<DVector>) {
        assert!(lb.as_ref().map(|x| x.len()).unwrap_or(n) == n);
        assert!(ub.as_ref().map(|x| x.len()).unwrap_or(n) == n);
        self.lb = lb.unwrap_or_else(|| dvec![NEG_INFINITY; n]);
        self.ub = ub.unwrap_or_else(|| dvec![INFINITY; n]);
    }








>
>
>
>







178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
        }
        return norm2;
    }
}


impl<M : UnconstrainedMasterProblem> MasterProblem for BoxedMasterProblem<M> {
    fn set_num_subproblems(&mut self, n : usize) -> Result<()> {
        self.master.set_num_subproblems(n).map_err(|err| Error::Solver(Box::new(err)))
    }

    fn set_vars(&mut self, n: usize, lb : Option<DVector>, ub: Option<DVector>) {
        assert!(lb.as_ref().map(|x| x.len()).unwrap_or(n) == n);
        assert!(ub.as_ref().map(|x| x.len()).unwrap_or(n) == n);
        self.lb = lb.unwrap_or_else(|| dvec![NEG_INFINITY; n]);
        self.ub = ub.unwrap_or_else(|| dvec![INFINITY; n]);
    }

Changes to src/master/master.rs.
33
34
35
36
37
38
39



40
41
42
43
44
45
46
47
}


/// Result type for master problems.
pub type Result<T> = result::Result<T, Error>;

pub trait MasterProblem {



    /// The the lower and upper bounds of the variables.
    fn set_vars(&mut self, nvars: usize, lb : Option<DVector>, ub: Option<DVector>);

    /// Return the current number of minorants of subproblem `fidx`.
    fn num_minorants(&self, fidx : usize) -> usize;

    /// Add a new minorant to the model.
    fn add_minorant(&mut self, fidx: usize, minorant: Minorant) -> Result<()>;







>
>
>
|







33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
}


/// Result type for master problems.
pub type Result<T> = result::Result<T, Error>;

pub trait MasterProblem {
    /// Set the number of subproblems.
    fn set_num_subproblems(&mut self, n : usize) -> Result<()>;

    /// Set the lower and upper bounds of the variables.
    fn set_vars(&mut self, nvars: usize, lb : Option<DVector>, ub: Option<DVector>);

    /// Return the current number of minorants of subproblem `fidx`.
    fn num_minorants(&self, fidx : usize) -> usize;

    /// Add a new minorant to the model.
    fn add_minorant(&mut self, fidx: usize, minorant: Minorant) -> Result<()>;
Changes to src/solver.rs.
514
515
516
517
518
519
520


521
522
523
524
525
526
527
528
529
530
531
532

        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_vars(self.problem.num_variables(), lb, ub);
        self.master.set_max_updates(self.params.max_updates);

        let m = self.problem.num_subproblems();

        self.cur_val = 0.0;
        for i in 0..m {
            let result = match self.problem.evaluate(i, &self.cur_y, INFINITY, 0.0) {
                Ok(r) => r,
                Err(err) => return Err(Error::Eval(Box::new(err))),
            };
            self.cur_vals[i] = result.objective();







>
>



<
<







514
515
516
517
518
519
520
521
522
523
524
525


526
527
528
529
530
531
532

        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) {
                Ok(r) => r,
                Err(err) => return Err(Error::Eval(Box::new(err))),
            };
            self.cur_vals[i] = result.objective();