private void scale()

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);
                }
            }
        }
    }