List of usage examples for org.apache.commons.math3.optim.nonlinear.scalar.noderiv PowellOptimizer PowellOptimizer
public PowellOptimizer(double rel, double abs)
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; }