Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | solver: Check bounds for validity. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
d67ab3a0b0fd099f2ebe0ad046b67ca4 |
| User & Date: | fifr 2016-10-11 08:45:35.274 |
Context
|
2016-10-11
| ||
| 08:50 | Add variable+value update. check-in: 8d2547a9f9 user: fifr tags: trunk | |
| 08:45 | solver: Check bounds for validity. check-in: d67ab3a0b0 user: fifr tags: trunk | |
|
2016-10-10
| ||
| 20:33 | solver: Add `last_primal` method to `UpdateState`. check-in: 40a866dae4 user: fifr tags: trunk | |
Changes
Changes to src/solver.rs.
| ︙ | |||
68 69 70 71 72 73 74 75 76 77 78 79 80 81 | 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | + + + + + + + + + + + |
/// Some parameter has an invalid value.
Parameter(msg: String) {
description("Parameter error")
display("Parameter error: {}", msg)
}
/// The lower bound of a variable is larger than the upper bound.
InvalidBounds(lower: Real, upper: Real) {
description("invalid bounds")
display("Invalid bounds, lower:{} upper:{}", lower, upper)
}
/// The value of a variable is outside its bounds.
ViolatedBounds(lower: Real, upper: Real, value: Real) {
description("violated bounds")
display("Violated bounds, lower:{} upper:{} value:{}", lower, upper, value)
}
}
}
/// Result type for solvers.
pub type Result<T> = result::Result<T, Error>;
|
| ︙ | |||
503 504 505 506 507 508 509 510 511 512 513 514 515 516 | 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 | + |
}
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 {
self.cur_valid = false;
self.cur_y[i] = lb_i;
} else if self.cur_y[i] > ub_i {
self.cur_valid = false;
self.cur_y[i] = ub_i;
}
|
| ︙ | |||
565 566 567 568 569 570 571 | 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 | + + + + + + - + |
}
};
let mut newvars = Vec::with_capacity(updates.len());
for u in updates {
match u {
Update::AddVariable{lower, upper} => {
if lower > upper {
return Err(Error::InvalidBounds(lower, upper))
}
let value = if lower > 0.0 { lower }
else if upper < 0.0 { upper }
else { 0.0 };
|
| ︙ |