in commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/stat/regression/MillerUpdatingRegression.java [690:806]
private void vmove(int from, int to) {
double d1;
double d2;
double x;
double d1new;
double d2new;
double cbar;
double sbar;
double y;
int first;
int inc;
int m1;
int m2;
int mp1;
int pos;
boolean bSkipTo40 = false;
if (from == to) {
return;
}
if (!this.rssSet) {
ss();
}
int count = 0;
if (from < to) {
first = from;
inc = 1;
count = to - from;
} else {
first = from - 1;
inc = -1;
count = from - to;
}
int m = first;
int idx = 0;
while (idx < count) {
m1 = m * (nvars + nvars - m - 1) / 2;
m2 = m1 + nvars - m - 1;
mp1 = m + 1;
d1 = d[m];
d2 = d[mp1];
// Special cases.
if (d1 > this.epsilon || d2 > this.epsilon) {
x = r[m1];
if (JdkMath.abs(x) * JdkMath.sqrt(d1) < tol[mp1]) {
x = 0.0;
}
if (d1 < this.epsilon || JdkMath.abs(x) < this.epsilon) {
d[m] = d2;
d[mp1] = d1;
r[m1] = 0.0;
for (int col = m + 2; col < nvars; col++) {
++m1;
x = r[m1];
r[m1] = r[m2];
r[m2] = x;
++m2;
}
x = rhs[m];
rhs[m] = rhs[mp1];
rhs[mp1] = x;
bSkipTo40 = true;
//break;
} else if (d2 < this.epsilon) {
d[m] = d1 * x * x;
r[m1] = 1.0 / x;
for (int i = m1 + 1; i < m1 + nvars - m - 1; i++) {
r[i] /= x;
}
rhs[m] /= x;
bSkipTo40 = true;
//break;
}
if (!bSkipTo40) {
d1new = d2 + d1 * x * x;
cbar = d2 / d1new;
sbar = x * d1 / d1new;
d2new = d1 * cbar;
d[m] = d1new;
d[mp1] = d2new;
r[m1] = sbar;
for (int col = m + 2; col < nvars; col++) {
++m1;
y = r[m1];
r[m1] = cbar * r[m2] + sbar * y;
r[m2] = y - x * r[m2];
++m2;
}
y = rhs[m];
rhs[m] = cbar * rhs[mp1] + sbar * y;
rhs[mp1] = y - x * rhs[mp1];
}
}
if (m > 0) {
pos = m;
for (int row = 0; row < m; row++) {
x = r[pos];
r[pos] = r[pos - 1];
r[pos - 1] = x;
pos += nvars - row - 2;
}
}
// Adjust variable order (VORDER), the tolerances (TOL) and
// the vector of residual sums of squares (RSS).
m1 = vorder[m];
vorder[m] = vorder[mp1];
vorder[mp1] = m1;
x = tol[m];
tol[m] = tol[mp1];
tol[mp1] = x;
rss[m] = rss[mp1] + d[mp1] * rhs[mp1] * rhs[mp1];
m += inc;
++idx;
}
}