Example usage for org.apache.commons.math3.optim.nonlinear.scalar.noderiv PowellOptimizer PowellOptimizer

List of usage examples for org.apache.commons.math3.optim.nonlinear.scalar.noderiv PowellOptimizer PowellOptimizer

Introduction

In this page you can find the example usage for org.apache.commons.math3.optim.nonlinear.scalar.noderiv PowellOptimizer PowellOptimizer.

Prototype

public PowellOptimizer(double rel, double abs) 

Source Link

Document

The parameters control the default convergence checking procedure.

Usage

From source file:edu.cmu.tetrad.search.Mimbuild2.java

private void optimizeAllParamsSimultaneously(Node[][] indicators, TetradMatrix measurescov,
        TetradMatrix latentscov, double[][] loadings, int[][] indicatorIndices, double[] delta) {
    double[] values = getAllParams(indicators, latentscov, loadings, delta);

    Function4 function = new Function4(indicatorIndices, measurescov, loadings, latentscov, delta);
    MultivariateOptimizer search = new PowellOptimizer(1e-7, 1e-7);

    PointValuePair pair = search.optimize(new InitialGuess(values), new ObjectiveFunction(function),
            GoalType.MINIMIZE, new MaxEval(100000));

    minimum = pair.getValue();/*from   w ww . j  a  va 2s. c o m*/
}

From source file:com.wwidesigner.optimization.ObjectiveFunctionOptimizer.java

protected static PointValuePair runPowell(BaseObjectiveFunction objective, double[] startPoint)
        throws TooManyEvaluationsException {
    PowellOptimizer optimizer = new PowellOptimizer(1.e-6, 1.e-14);

    return optimizer.optimize(GoalType.MINIMIZE, new ObjectiveFunction(objective),
            new MaxEval(objective.getMaxEvaluations()), MaxIter.unlimited(), new InitialGuess(startPoint));
}

From source file:edu.cmu.tetrad.sem.GeneralizedSemIm.java

public DataSet simulateDataMinimizeSurface(int sampleSize, boolean latentDataSaved) {
    final Map<String, Double> variableValues = new HashMap<String, Double>();

    final double func_tolerance = 1.0e-4;
    final double param_tolerance = 1.0e-3;

    List<Node> continuousVariables = new LinkedList<Node>();
    final List<Node> variableNodes = pm.getVariableNodes();

    // Work with a copy of the variables, because their type can be set externally.
    for (Node node : variableNodes) {
        ContinuousVariable var = new ContinuousVariable(node.getName());
        var.setNodeType(node.getNodeType());

        if (var.getNodeType() != NodeType.ERROR) {
            continuousVariables.add(var);
        }//from  www  .j ava2 s  .  c  o  m
    }

    DataSet fullDataSet = new ColtDataSet(sampleSize, continuousVariables);

    final Context context = new Context() {
        public Double getValue(String term) {
            Double value = parameterValues.get(term);

            if (value != null) {
                return value;
            }

            value = variableValues.get(term);

            if (value != null) {
                return value;
            }

            throw new IllegalArgumentException("No value recorded for '" + term + "'");
        }
    };

    final double[] _metric = new double[1];

    MultivariateFunction function = new MultivariateFunction() {
        double metric;

        public double value(double[] doubles) {
            for (int i = 0; i < variableNodes.size(); i++) {
                variableValues.put(variableNodes.get(i).getName(), doubles[i]);
            }

            double[] image = new double[doubles.length];

            for (int i = 0; i < variableNodes.size(); i++) {
                Node node = variableNodes.get(i);
                Expression expression = pm.getNodeExpression(node);
                image[i] = expression.evaluate(context);

                if (Double.isNaN(image[i])) {
                    throw new IllegalArgumentException("Undefined value for expression " + expression);
                }
            }

            metric = 0.0;

            for (int i = 0; i < variableNodes.size(); i++) {
                double diff = doubles[i] - image[i];
                metric += diff * diff;
            }

            for (int i = 0; i < variableNodes.size(); i++) {
                variableValues.put(variableNodes.get(i).getName(), image[i]);
            }

            _metric[0] = metric;

            return metric;
        }
    };

    MultivariateOptimizer search = new PowellOptimizer(1e-7, 1e-7);

    // Do the simulation.
    ROW: for (int row = 0; row < sampleSize; row++) {

        // Take random draws from error distributions.
        for (int i = 0; i < variableNodes.size(); i++) {
            Node variable = variableNodes.get(i);
            Node error = pm.getErrorNode(variable);

            Expression expression = pm.getNodeExpression(error);
            double value = expression.evaluate(context);

            if (Double.isNaN(value)) {
                throw new IllegalArgumentException("Undefined value for expression: " + expression);
            }

            variableValues.put(error.getName(), value);
        }

        for (int i = 0; i < variableNodes.size(); i++) {
            Node variable = variableNodes.get(i);
            variableValues.put(variable.getName(), 0.0);// RandomUtil.getInstance().nextUniform(-5, 5));
        }

        while (true) {

            double[] values = new double[variableNodes.size()];

            for (int i = 0; i < values.length; i++) {
                values[i] = variableValues.get(variableNodes.get(i).getName());
            }

            PointValuePair pair = search.optimize(new InitialGuess(values), new ObjectiveFunction(function),
                    GoalType.MINIMIZE, new MaxEval(100000));

            values = pair.getPoint();

            for (int i = 0; i < variableNodes.size(); i++) {
                if (isSimulatePositiveDataOnly() && values[i] < 0) {
                    row--;
                    continue ROW;
                }

                if (!Double.isNaN(selfLoopCoef) && row > 0) {
                    values[i] += selfLoopCoef * fullDataSet.getDouble(row - 1, i);
                }

                variableValues.put(variableNodes.get(i).getName(), values[i]);
                fullDataSet.setDouble(row, i, values[i]);
            }

            if (_metric[0] < 0.01) {
                break; // while
            }
        }
    }

    if (latentDataSaved) {
        return fullDataSet;
    } else {
        return DataUtils.restrictToMeasured(fullDataSet);
    }
}

From source file:edu.cmu.tetrad.search.BinaryTetradTest.java

private void estimateTwoFactorModel(double params[]) {
    double bestScore = Double.MAX_VALUE;
    double bestParams[] = new double[params.length];
    for (int i = 0; i < 5; i++) {
        for (int c = 0; c < 11; c++) {
            params[c] = RandomUtil.getInstance().nextDouble() / 2. + 0.2;
        }/*from   w  ww  . j a  va2s  .co  m*/

        MultivariateOptimizer search = new PowellOptimizer(1e-7, 1e-7);

        PointValuePair pair = search.optimize(new InitialGuess(params),
                new ObjectiveFunction(new FittingFunction(this)), GoalType.MINIMIZE, new MaxEval(100000));

        double newScore = scoreParams(pair.getPoint());

        if (newScore < bestScore) {
            System.arraycopy(params, 0, bestParams, 0, params.length);
            bestScore = newScore;
        }
        //System.out.println(scoreParams(params));
        //for (int c = 0; c < 11; c++)
        //    System.out.println(params[c]); System.exit(0);
    }
    System.arraycopy(bestParams, 0, params, 0, params.length);
    //System.out.println();
}

From source file:edu.cmu.tetrad.search.Lofs2.java

private void optimizeRow(final int rowIndex, final TetradMatrix data, final double range,
        final List<List<Integer>> rows, final List<List<Double>> parameters) {
    System.out.println("A");

    final int numParams = rows.get(rowIndex).size();

    final double[] dLeftMin = new double[numParams];
    final double[] dRightMin = new double[numParams];

    double[] values = new double[numParams];
    double delta = 0.1;

    if (false) { //isEdgeCorrected()) {
        double min = -2;
        double max = 2;

        int[] dims = new int[values.length];

        int numBins = 5;
        for (int i = 0; i < values.length; i++)
            dims[i] = numBins;//from w  ww . j a va 2  s .  c o  m

        CombinationGenerator gen = new CombinationGenerator(dims);
        int[] comb;
        List<Double> maxParams = new ArrayList<Double>();

        for (int i = 0; i < values.length; i++)
            maxParams.add(0.0);

        double maxV = Double.NEGATIVE_INFINITY;

        while ((comb = gen.next()) != null) {
            List<Double> params = new ArrayList<Double>();

            for (int i = 0; i < values.length; i++) {
                params.add(min + (max - min) * (comb[i] / (double) numBins));
            }

            parameters.set(rowIndex, params);

            double v = scoreRow(rowIndex, data, rows, parameters);

            if (v > maxV) {
                maxV = v;
                maxParams = params;
            }
        }

        System.out.println("maxparams = " + maxParams);

        parameters.set(rowIndex, maxParams);

        for (int i = 0; i < values.length; i++) {
            dLeftMin[i] = -range;
            dRightMin[i] = range;
            values[i] = maxParams.get(i);
        }
    } else if (false) {
        for (int i = 0; i < numParams; i++) {
            parameters.get(rowIndex).set(i, -range);
            double vLeft = scoreRow(rowIndex, data, rows, parameters);
            double dLeft = -range;

            // Search from the left for the first valley; mark that as dleft.
            for (double d = -range + delta; d < range; d += delta) {
                parameters.get(rowIndex).set(i, d);
                double v = scoreRow(rowIndex, data, rows, parameters);
                if (Double.isNaN(v))
                    continue;
                if (v > vLeft)
                    break;
                vLeft = v;
                dLeft = d;
            }

            parameters.get(rowIndex).set(i, range);
            double vRight = scoreRow(rowIndex, data, rows, parameters);
            double dRight = range;

            // Similarly for dright. Will take dleft and dright to be bounds for the parameter,
            // to avoid high scores at the boundaries.
            for (double d = range - delta; d > -range; d -= delta) {
                parameters.get(rowIndex).set(i, d);
                double v = scoreRow(rowIndex, data, rows, parameters);
                if (Double.isNaN(v))
                    continue;
                if (v > vRight)
                    break;
                vRight = v;
                dRight = d;
            }

            // If dleft dright ended up reversed, re-reverse them.
            if (dLeft > dRight) {
                double temp = dRight;
                dLeft = dRight;
                dRight = temp;
            }

            System.out.println("dLeft = " + dLeft + " dRight = " + dRight);

            dLeftMin[i] = dLeft;
            dRightMin[i] = dRight;

            values[i] = (dLeft + dRight) / 2.0;
        }
    } else {

        System.out.println("B");

        // Default case: search for the maximum score over the entire range.
        for (int i = 0; i < numParams; i++) {
            dLeftMin[i] = -range;
            dRightMin[i] = range;

            values[i] = 0;
        }
    }

    MultivariateFunction function = new MultivariateFunction() {
        public double value(double[] values) {
            System.out.println(Arrays.toString(values));

            for (int i = 0; i < values.length; i++) {
                parameters.get(rowIndex).set(i, values[i]);
            }

            double v = scoreRow(rowIndex, data, rows, parameters);

            if (Double.isNaN(v)) {
                return Double.POSITIVE_INFINITY; // was 10000
            }

            return -v;
        }
    };

    try {
        MultivariateOptimizer search = new PowellOptimizer(1e-7, 1e-7);

        PointValuePair pair = search.optimize(new InitialGuess(values), new ObjectiveFunction(function),
                GoalType.MINIMIZE, new MaxEval(100000));

        values = pair.getPoint();
    } catch (Exception e) {
        e.printStackTrace();

        for (int i = 0; i < values.length; i++) {
            parameters.get(rowIndex).set(i, Double.NaN);
        }
    }
}

From source file:org.hawkular.datamining.forecast.models.performance.OptimizationAlgorithmsTests.java

private long executePowell(ModelData modelData) {
    long start = System.nanoTime();
    PowellOptimizer optimizer = new PowellOptimizer(0.00001, 0.00001);
    PointValuePair unbounded = optimizer.optimize(GoalType.MINIMIZE, new MaxIter(MAX_ITER),
            new MaxEval(MAX_EVAL), new InitialGuess(INITIAL_GUESS), new ObjectiveFunction(objectiveFunction));
    long executionTime = System.nanoTime() - start;

    printOptimizationResult(objectiveFunction, unbounded.getPoint(), modelData);

    return executionTime;
}