Skip to content

Commit 63074e4

Browse files
committed
Add refinement on the 6x6 system
1 parent 5601a1a commit 63074e4

File tree

4 files changed

+51
-8
lines changed

4 files changed

+51
-8
lines changed

highs/ipm/hipo/ipm/Iterate.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,24 @@ namespace hipo {
88
NewtonDir::NewtonDir(Int m, Int n)
99
: x(n, 0.0), y(m, 0.0), xl(n, 0.0), xu(n, 0.0), zl(n, 0.0), zu(n, 0.0) {}
1010

11+
void NewtonDir::clear() {
12+
std::fill(x.begin(), x.end(), 0.0);
13+
std::fill(y.begin(), y.end(), 0.0);
14+
std::fill(xl.begin(), xl.end(), 0.0);
15+
std::fill(xu.begin(), xu.end(), 0.0);
16+
std::fill(zl.begin(), zl.end(), 0.0);
17+
std::fill(zu.begin(), zu.end(), 0.0);
18+
}
19+
20+
void NewtonDir::add(const NewtonDir& d) {
21+
vectorAdd(x, d.x);
22+
vectorAdd(y, d.y);
23+
vectorAdd(xl, d.xl);
24+
vectorAdd(xu, d.xu);
25+
vectorAdd(zl, d.zl);
26+
vectorAdd(zu, d.zu);
27+
}
28+
1129
Iterate::Iterate(const Model& model_input, Regularisation& r)
1230
: model{&model_input}, delta(model->m(), model->n()), regul{r} {
1331
clearIter();
@@ -257,14 +275,7 @@ void Iterate::clearRes() {
257275
res.r5.assign(model->n(), 0.0);
258276
res.r6.assign(model->n(), 0.0);
259277
}
260-
void Iterate::clearDir() {
261-
delta.x.assign(model->n(), 0.0);
262-
delta.xl.assign(model->n(), 0.0);
263-
delta.xu.assign(model->n(), 0.0);
264-
delta.y.assign(model->m(), 0.0);
265-
delta.zl.assign(model->n(), 0.0);
266-
delta.zu.assign(model->n(), 0.0);
267-
}
278+
void Iterate::clearDir() { delta.clear(); }
268279
void Iterate::clearIres() {
269280
ires.r1.assign(model->m(), 0.0);
270281
ires.r2.assign(model->n(), 0.0);

highs/ipm/hipo/ipm/Iterate.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ struct NewtonDir {
2020
std::vector<double> zu{};
2121

2222
NewtonDir(Int m, Int n);
23+
void clear();
24+
void add(const NewtonDir& d);
2325
};
2426

2527
struct Residuals {

highs/ipm/hipo/ipm/Parameters.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ const Int kMinNumberSn = 10;
3737
const double kDenseColThresh = 0.5;
3838
const Int kMinRowsForDensity = 2000;
3939

40+
// parameters for iterative refinement
41+
const Int kMaxIterRefine = 3;
42+
const double kTolRefine = 1e-12;
43+
4044
// static regularisation
4145
struct Regularisation {
4246
double primal = 1e-12;

highs/ipm/hipo/ipm/Refine.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,36 @@
55
namespace hipo {
66

77
void Solver::refine(NewtonDir& delta) {
8+
NewtonDir correction(m_, n_);
9+
NewtonDir temp(m_, n_);
10+
811
// compute the residuals of the linear system in it_->ires
912
it_->residuals6x6(delta);
1013

1114
double omega = computeOmega(delta);
15+
double old_omega{};
16+
17+
for (Int iter = 0; iter < kMaxIterRefine; ++iter) {
18+
if (omega < kTolRefine) break;
19+
20+
correction.clear();
21+
solveNewtonSystem(correction, it_->ires);
22+
23+
temp = delta;
24+
temp.add(correction);
25+
26+
it_->residuals6x6(temp);
27+
28+
old_omega = omega;
29+
omega = computeOmega(temp);
30+
31+
if (omega < old_omega) {
32+
delta = temp;
33+
} else {
34+
omega = old_omega;
35+
break;
36+
}
37+
}
1238
}
1339

1440
static void updateOmega(double tau, double& omega1, double& omega2, double num,

0 commit comments

Comments
 (0)