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