in commons-math-legacy/src/main/java/org/apache/commons/math4/legacy/optim/linear/SimplexTableau.java [310:377]
private void scale(double[][] scaled, double[] scaledRhs) {
/*
first transform across:
c0 x0 + c1 x1 + ... + cn xn = vn ==> (2^expChange) * (c0 x0 + c1 x1 + ... + cn xn = vn)
expChange will be negative if the constants are larger than 1,
it'll be positive if the constants are less than 1.
*/
for (int i = 0; i < scaled.length; i++) {
int minExp = MAX_IEEE_EXP + 1;
int maxExp = MIN_IEEE_EXP - 1;
for (double d: scaled[i]) {
if (d != 0) {
int e = exponent(d);
if (e < minExp) {
minExp = e;
}
if (e > maxExp) {
maxExp = e;
}
}
}
if (scaledRhs[i] != 0) {
final int e = exponent(scaledRhs[i]);
if (e < minExp) {
minExp = e;
}
if (e > maxExp) {
maxExp = e;
}
}
final int expChange = computeExpChange(minExp, maxExp);
if (expChange != 0) {
scaledRhs[i] = updateExponent(scaledRhs[i], expChange);
updateExponent(scaled[i], expChange);
}
}
/*
second, transform down the columns. this is like defining a new variable for that column
that is yi = xi * (2^expChange)
After solving for yi, we compute xi by shifting again. See getSolution()
*/
for (int i = 0; i < variableExpChange.length; i++) {
int minExp = MAX_IEEE_EXP + 1;
int maxExp = MIN_IEEE_EXP - 1;
for (double[] coefficients : scaled) {
final double d = coefficients[i];
if (d != 0) {
int e = exponent(d);
if (e < minExp) {
minExp = e;
}
if (e > maxExp) {
maxExp = e;
}
}
}
final int expChange = computeExpChange(minExp, maxExp);
variableExpChange[i] = expChange;
if (expChange != 0) {
for (double[] coefficients : scaled) {
coefficients[i] = updateExponent(coefficients[i], expChange);
}
}
}
}