Formatting.

"final" keyword.


git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1398547 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Gilles Sadowski 2012-10-15 22:30:30 +00:00
parent ecc9690e26
commit 3a874d8f01
1 changed files with 173 additions and 172 deletions

View File

@ -457,130 +457,132 @@ public class CMAESOptimizer
// -------------------- Generation Loop --------------------------------
generationLoop:
for (iterations = 1; iterations <= maxIterations; iterations++) {
// Generate and evaluate lambda offspring
RealMatrix arz = randn1(dimension, lambda);
RealMatrix arx = zeros(dimension, lambda);
double[] fitness = new double[lambda];
// generate random offspring
for (int k = 0; k < lambda; k++) {
RealMatrix arxk = null;
for (int i = 0; i < checkFeasableCount+1; i++) {
if (diagonalOnly <= 0) {
arxk = xmean.add(BD.multiply(arz.getColumnMatrix(k))
.scalarMultiply(sigma)); // m + sig * Normal(0,C)
} else {
arxk = xmean.add(times(diagD,arz.getColumnMatrix(k))
.scalarMultiply(sigma));
}
if (i >= checkFeasableCount || fitfun.isFeasible(arxk.getColumn(0))) {
break;
}
// regenerate random arguments for row
arz.setColumn(k, randn(dimension));
for (iterations = 1; iterations <= maxIterations; iterations++) {
// Generate and evaluate lambda offspring
final RealMatrix arz = randn1(dimension, lambda);
final RealMatrix arx = zeros(dimension, lambda);
final double[] fitness = new double[lambda];
// generate random offspring
for (int k = 0; k < lambda; k++) {
RealMatrix arxk = null;
for (int i = 0; i < checkFeasableCount + 1; i++) {
if (diagonalOnly <= 0) {
arxk = xmean.add(BD.multiply(arz.getColumnMatrix(k))
.scalarMultiply(sigma)); // m + sig * Normal(0,C)
} else {
arxk = xmean.add(times(diagD,arz.getColumnMatrix(k))
.scalarMultiply(sigma));
}
copyColumn(arxk, 0, arx, k);
try {
fitness[k] = fitfun.value(arx.getColumn(k)); // compute fitness
} catch (TooManyEvaluationsException e) {
break generationLoop;
}
}
// Sort by fitness and compute weighted mean into xmean
int[] arindex = sortedIndices(fitness);
// Calculate new xmean, this is selection and recombination
RealMatrix xold = xmean; // for speed up of Eq. (2) and (3)
RealMatrix bestArx = selectColumns(arx, MathArrays.copyOf(arindex, mu));
xmean = bestArx.multiply(weights);
RealMatrix bestArz = selectColumns(arz, MathArrays.copyOf(arindex, mu));
RealMatrix zmean = bestArz.multiply(weights);
boolean hsig = updateEvolutionPaths(zmean, xold);
if (diagonalOnly <= 0) {
updateCovariance(hsig, bestArx, arz, arindex, xold);
} else {
updateCovarianceDiagonalOnly(hsig, bestArz, xold);
}
// Adapt step size sigma - Eq. (5)
sigma *= Math.exp(Math.min(1, (normps/chiN - 1) * cs / damps));
double bestFitness = fitness[arindex[0]];
double worstFitness = fitness[arindex[arindex.length - 1]];
if (bestValue > bestFitness) {
bestValue = bestFitness;
lastResult = optimum;
optimum = new PointValuePair(
fitfun.repair(bestArx.getColumn(0)),
isMinimize ? bestFitness : -bestFitness);
if (getConvergenceChecker() != null && lastResult != null) {
if (getConvergenceChecker().converged(iterations, optimum, lastResult)) {
break generationLoop;
}
}
}
// handle termination criteria
// Break, if fitness is good enough
if (stopFitness != 0) { // only if stopFitness is defined
if (bestFitness < (isMinimize ? stopFitness : -stopFitness)) {
break generationLoop;
}
}
double[] sqrtDiagC = sqrt(diagC).getColumn(0);
double[] pcCol = pc.getColumn(0);
for (int i = 0; i < dimension; i++) {
if (sigma*(Math.max(Math.abs(pcCol[i]), sqrtDiagC[i])) > stopTolX) {
if (i >= checkFeasableCount ||
fitfun.isFeasible(arxk.getColumn(0))) {
break;
}
if (i >= dimension-1) {
break generationLoop;
}
// regenerate random arguments for row
arz.setColumn(k, randn(dimension));
}
for (int i = 0; i < dimension; i++) {
if (sigma*sqrtDiagC[i] > stopTolUpX) {
break generationLoop;
}
}
double historyBest = min(fitnessHistory);
double historyWorst = max(fitnessHistory);
if (iterations > 2 && Math.max(historyWorst, worstFitness) -
Math.min(historyBest, bestFitness) < stopTolFun) {
copyColumn(arxk, 0, arx, k);
try {
fitness[k] = fitfun.value(arx.getColumn(k)); // compute fitness
} catch (TooManyEvaluationsException e) {
break generationLoop;
}
if (iterations > fitnessHistory.length &&
historyWorst-historyBest < stopTolHistFun) {
break generationLoop;
}
// condition number of the covariance matrix exceeds 1e14
if (max(diagD)/min(diagD) > 1e7) {
break generationLoop;
}
// user defined termination
if (getConvergenceChecker() != null) {
PointValuePair current =
new PointValuePair(bestArx.getColumn(0),
isMinimize ? bestFitness : -bestFitness);
if (lastResult != null &&
getConvergenceChecker().converged(iterations, current, lastResult)) {
break generationLoop;
}
lastResult = current;
}
// Adjust step size in case of equal function values (flat fitness)
if (bestValue == fitness[arindex[(int)(0.1+lambda/4.)]]) {
sigma = sigma * Math.exp(0.2 + cs / damps);
}
if (iterations > 2 && Math.max(historyWorst, bestFitness) -
Math.min(historyBest, bestFitness) == 0) {
sigma = sigma * Math.exp(0.2 + cs / damps);
}
// store best in history
push(fitnessHistory,bestFitness);
fitfun.setValueRange(worstFitness-bestFitness);
if (generateStatistics) {
statisticsSigmaHistory.add(sigma);
statisticsFitnessHistory.add(bestFitness);
statisticsMeanHistory.add(xmean.transpose());
statisticsDHistory.add(diagD.transpose().scalarMultiply(1E5));
}
}
// Sort by fitness and compute weighted mean into xmean
final int[] arindex = sortedIndices(fitness);
// Calculate new xmean, this is selection and recombination
final RealMatrix xold = xmean; // for speed up of Eq. (2) and (3)
final RealMatrix bestArx = selectColumns(arx, MathArrays.copyOf(arindex, mu));
xmean = bestArx.multiply(weights);
final RealMatrix bestArz = selectColumns(arz, MathArrays.copyOf(arindex, mu));
final RealMatrix zmean = bestArz.multiply(weights);
final boolean hsig = updateEvolutionPaths(zmean, xold);
if (diagonalOnly <= 0) {
updateCovariance(hsig, bestArx, arz, arindex, xold);
} else {
updateCovarianceDiagonalOnly(hsig, bestArz, xold);
}
// Adapt step size sigma - Eq. (5)
sigma *= Math.exp(Math.min(1, (normps/chiN - 1) * cs / damps));
final double bestFitness = fitness[arindex[0]];
final double worstFitness = fitness[arindex[arindex.length - 1]];
if (bestValue > bestFitness) {
bestValue = bestFitness;
lastResult = optimum;
optimum = new PointValuePair(fitfun.repair(bestArx.getColumn(0)),
isMinimize ? bestFitness : -bestFitness);
if (getConvergenceChecker() != null &&
lastResult != null) {
if (getConvergenceChecker().converged(iterations, optimum, lastResult)) {
break generationLoop;
}
}
}
// handle termination criteria
// Break, if fitness is good enough
if (stopFitness != 0) { // only if stopFitness is defined
if (bestFitness < (isMinimize ? stopFitness : -stopFitness)) {
break generationLoop;
}
}
final double[] sqrtDiagC = sqrt(diagC).getColumn(0);
final double[] pcCol = pc.getColumn(0);
for (int i = 0; i < dimension; i++) {
if (sigma * Math.max(Math.abs(pcCol[i]), sqrtDiagC[i]) > stopTolX) {
break;
}
if (i >= dimension - 1) {
break generationLoop;
}
}
for (int i = 0; i < dimension; i++) {
if (sigma * sqrtDiagC[i] > stopTolUpX) {
break generationLoop;
}
}
final double historyBest = min(fitnessHistory);
final double historyWorst = max(fitnessHistory);
if (iterations > 2 &&
Math.max(historyWorst, worstFitness) -
Math.min(historyBest, bestFitness) < stopTolFun) {
break generationLoop;
}
if (iterations > fitnessHistory.length &&
historyWorst-historyBest < stopTolHistFun) {
break generationLoop;
}
// condition number of the covariance matrix exceeds 1e14
if (max(diagD)/min(diagD) > 1e7) {
break generationLoop;
}
// user defined termination
if (getConvergenceChecker() != null) {
final PointValuePair current
= new PointValuePair(bestArx.getColumn(0),
isMinimize ? bestFitness : -bestFitness);
if (lastResult != null &&
getConvergenceChecker().converged(iterations, current, lastResult)) {
break generationLoop;
}
lastResult = current;
}
// Adjust step size in case of equal function values (flat fitness)
if (bestValue == fitness[arindex[(int)(0.1+lambda/4.)]]) {
sigma = sigma * Math.exp(0.2 + cs / damps);
}
if (iterations > 2 && Math.max(historyWorst, bestFitness) -
Math.min(historyBest, bestFitness) == 0) {
sigma = sigma * Math.exp(0.2 + cs / damps);
}
// store best in history
push(fitnessHistory,bestFitness);
fitfun.setValueRange(worstFitness-bestFitness);
if (generateStatistics) {
statisticsSigmaHistory.add(sigma);
statisticsFitnessHistory.add(bestFitness);
statisticsMeanHistory.add(xmean.transpose());
statisticsDHistory.add(diagD.transpose().scalarMultiply(1E5));
}
}
return optimum;
}
@ -637,11 +639,11 @@ public class CMAESOptimizer
lambda = 4 + (int) (3 * Math.log(dimension));
}
// initialize sigma
double[][] sigmaArray = new double[guess.length][1];
final double[][] sigmaArray = new double[guess.length][1];
for (int i = 0; i < guess.length; i++) {
sigmaArray[i][0] = inputSigma == null ? 0.3 : inputSigma[i];
}
RealMatrix insigma = new Array2DRowRealMatrix(sigmaArray, false);
final RealMatrix insigma = new Array2DRowRealMatrix(sigmaArray, false);
sigma = max(insigma); // overall standard deviation
// initialize termination criteria
@ -711,7 +713,7 @@ public class CMAESOptimizer
B.multiply(zmean).scalarMultiply(
Math.sqrt(cs * (2 - cs) * mueff)));
normps = ps.getFrobeniusNorm();
boolean hsig = normps /
final boolean hsig = normps /
Math.sqrt(1 - Math.pow(1 - cs, 2 * iterations)) /
chiN < 1.4 + 2 / ((double) dimension + 1);
pc = pc.scalarMultiply(1 - cc);
@ -766,10 +768,10 @@ public class CMAESOptimizer
final RealMatrix xold) {
double negccov = 0;
if (ccov1 + ccovmu > 0) {
RealMatrix arpos = bestArx.subtract(repmat(xold, 1, mu))
.scalarMultiply(1 / sigma); // mu difference vectors
RealMatrix roneu = pc.multiply(pc.transpose())
.scalarMultiply(ccov1); // rank one update
final RealMatrix arpos = bestArx.subtract(repmat(xold, 1, mu))
.scalarMultiply(1 / sigma); // mu difference vectors
final RealMatrix roneu = pc.multiply(pc.transpose())
.scalarMultiply(ccov1); // rank one update
// minor correction if hsig==false
double oldFac = hsig ? 0 : ccov1 * cc * (2 - cc);
oldFac += 1 - ccov1 - ccovmu;
@ -777,31 +779,31 @@ public class CMAESOptimizer
// Adapt covariance matrix C active CMA
negccov = (1 - ccovmu) * 0.25 * mueff /
(Math.pow(dimension + 2, 1.5) + 2 * mueff);
double negminresidualvariance = 0.66;
// keep at least 0.66 in all directions, small popsize are most
// critical
double negalphaold = 0.5; // where to make up for the variance
// loss,
final double negminresidualvariance = 0.66;
// where to make up for the variance loss
final double negalphaold = 0.5;
// prepare vectors, compute negative updating matrix Cneg
int[] arReverseIndex = reverse(arindex);
final int[] arReverseIndex = reverse(arindex);
RealMatrix arzneg = selectColumns(arz, MathArrays.copyOf(arReverseIndex, mu));
RealMatrix arnorms = sqrt(sumRows(square(arzneg)));
int[] idxnorms = sortedIndices(arnorms.getRow(0));
RealMatrix arnormsSorted = selectColumns(arnorms, idxnorms);
int[] idxReverse = reverse(idxnorms);
RealMatrix arnormsReverse = selectColumns(arnorms, idxReverse);
final int[] idxnorms = sortedIndices(arnorms.getRow(0));
final RealMatrix arnormsSorted = selectColumns(arnorms, idxnorms);
final int[] idxReverse = reverse(idxnorms);
final RealMatrix arnormsReverse = selectColumns(arnorms, idxReverse);
arnorms = divide(arnormsReverse, arnormsSorted);
int[] idxInv = inverse(idxnorms);
RealMatrix arnormsInv = selectColumns(arnorms, idxInv);
final int[] idxInv = inverse(idxnorms);
final RealMatrix arnormsInv = selectColumns(arnorms, idxInv);
// check and set learning rate negccov
double negcovMax = (1 - negminresidualvariance) /
final double negcovMax = (1 - negminresidualvariance) /
square(arnormsInv).multiply(weights).getEntry(0, 0);
if (negccov > negcovMax) {
negccov = negcovMax;
}
arzneg = times(arzneg, repmat(arnormsInv, dimension, 1));
RealMatrix artmp = BD.multiply(arzneg);
RealMatrix Cneg = artmp.multiply(diag(weights)).multiply(artmp.transpose());
final RealMatrix artmp = BD.multiply(arzneg);
final RealMatrix Cneg = artmp.multiply(diag(weights)).multiply(artmp.transpose());
oldFac += negalphaold * negccov;
C = C.scalarMultiply(oldFac)
.add(roneu) // regard old matrix
@ -833,7 +835,7 @@ public class CMAESOptimizer
// to achieve O(N^2)
C = triu(C, 0).add(triu(C, 1).transpose());
// enforce symmetry to prevent complex numbers
EigenDecomposition eig = new EigenDecomposition(C);
final EigenDecomposition eig = new EigenDecomposition(C);
B = eig.getV(); // eigen decomposition, B==normalized eigenvectors
D = eig.getD();
diagD = diag(D);
@ -843,12 +845,12 @@ public class CMAESOptimizer
diagD.setEntry(i, 0, 0);
}
}
double tfac = max(diagD) / 1e14;
final double tfac = max(diagD) / 1e14;
C = C.add(eye(dimension, dimension).scalarMultiply(tfac));
diagD = diagD.add(ones(dimension, 1).scalarMultiply(tfac));
}
if (max(diagD) > 1e14 * min(diagD)) {
double tfac = max(diagD) / 1e14 - min(diagD);
final double tfac = max(diagD) / 1e14 - min(diagD);
C = C.add(eye(dimension, dimension).scalarMultiply(tfac));
diagD = diagD.add(ones(dimension, 1).scalarMultiply(tfac));
}
@ -878,12 +880,12 @@ public class CMAESOptimizer
* @return a sorted array of indices pointing into doubles.
*/
private int[] sortedIndices(final double[] doubles) {
DoubleIndex[] dis = new DoubleIndex[doubles.length];
final DoubleIndex[] dis = new DoubleIndex[doubles.length];
for (int i = 0; i < doubles.length; i++) {
dis[i] = new DoubleIndex(doubles[i], i);
}
Arrays.sort(dis);
int[] indices = new int[doubles.length];
final int[] indices = new int[doubles.length];
for (int i = 0; i < doubles.length; i++) {
indices[i] = dis[i].index;
}
@ -896,9 +898,9 @@ public class CMAESOptimizer
*/
private static class DoubleIndex implements Comparable<DoubleIndex> {
/** Value to compare. */
private double value;
private final double value;
/** Index into sorted array. */
private int index;
private final int index;
/**
* @param value Value to compare.
@ -949,7 +951,7 @@ public class CMAESOptimizer
* Flag indicating whether the objective variables are forced into their
* bounds if defined
*/
private boolean isRepairMode;
private final boolean isRepairMode;
/** Simple constructor.
*/
@ -966,12 +968,10 @@ public class CMAESOptimizer
double value;
if (isRepairMode) {
double[] repaired = repair(point);
value = CMAESOptimizer.this
.computeObjectiveValue(repaired) +
penalty(point, repaired);
value = CMAESOptimizer.this.computeObjectiveValue(repaired) +
penalty(point, repaired);
} else {
value = CMAESOptimizer.this
.computeObjectiveValue(point);
value = CMAESOptimizer.this.computeObjectiveValue(point);
}
return isMinimize ? value : -value;
}
@ -1045,7 +1045,7 @@ public class CMAESOptimizer
* @return Matrix representing the element-wise logarithm of m.
*/
private static RealMatrix log(final RealMatrix m) {
double[][] d = new double[m.getRowDimension()][m.getColumnDimension()];
final double[][] d = new double[m.getRowDimension()][m.getColumnDimension()];
for (int r = 0; r < m.getRowDimension(); r++) {
for (int c = 0; c < m.getColumnDimension(); c++) {
d[r][c] = Math.log(m.getEntry(r, c));
@ -1059,7 +1059,7 @@ public class CMAESOptimizer
* @return Matrix representing the element-wise square root of m.
*/
private static RealMatrix sqrt(final RealMatrix m) {
double[][] d = new double[m.getRowDimension()][m.getColumnDimension()];
final double[][] d = new double[m.getRowDimension()][m.getColumnDimension()];
for (int r = 0; r < m.getRowDimension(); r++) {
for (int c = 0; c < m.getColumnDimension(); c++) {
d[r][c] = Math.sqrt(m.getEntry(r, c));
@ -1073,7 +1073,7 @@ public class CMAESOptimizer
* @return Matrix representing the element-wise square of m.
*/
private static RealMatrix square(final RealMatrix m) {
double[][] d = new double[m.getRowDimension()][m.getColumnDimension()];
final double[][] d = new double[m.getRowDimension()][m.getColumnDimension()];
for (int r = 0; r < m.getRowDimension(); r++) {
for (int c = 0; c < m.getColumnDimension(); c++) {
double e = m.getEntry(r, c);
@ -1089,7 +1089,7 @@ public class CMAESOptimizer
* @return the matrix where the elements of m and n are element-wise multiplied.
*/
private static RealMatrix times(final RealMatrix m, final RealMatrix n) {
double[][] d = new double[m.getRowDimension()][m.getColumnDimension()];
final double[][] d = new double[m.getRowDimension()][m.getColumnDimension()];
for (int r = 0; r < m.getRowDimension(); r++) {
for (int c = 0; c < m.getColumnDimension(); c++) {
d[r][c] = m.getEntry(r, c) * n.getEntry(r, c);
@ -1104,7 +1104,7 @@ public class CMAESOptimizer
* @return Matrix where the elements of m and n are element-wise divided.
*/
private static RealMatrix divide(final RealMatrix m, final RealMatrix n) {
double[][] d = new double[m.getRowDimension()][m.getColumnDimension()];
final double[][] d = new double[m.getRowDimension()][m.getColumnDimension()];
for (int r = 0; r < m.getRowDimension(); r++) {
for (int c = 0; c < m.getColumnDimension(); c++) {
d[r][c] = m.getEntry(r, c) / n.getEntry(r, c);
@ -1119,7 +1119,7 @@ public class CMAESOptimizer
* @return Matrix representing the selected columns.
*/
private static RealMatrix selectColumns(final RealMatrix m, final int[] cols) {
double[][] d = new double[m.getRowDimension()][cols.length];
final double[][] d = new double[m.getRowDimension()][cols.length];
for (int r = 0; r < m.getRowDimension(); r++) {
for (int c = 0; c < cols.length; c++) {
d[r][c] = m.getEntry(r, cols[c]);
@ -1134,7 +1134,7 @@ public class CMAESOptimizer
* @return Upper triangular part of matrix.
*/
private static RealMatrix triu(final RealMatrix m, int k) {
double[][] d = new double[m.getRowDimension()][m.getColumnDimension()];
final double[][] d = new double[m.getRowDimension()][m.getColumnDimension()];
for (int r = 0; r < m.getRowDimension(); r++) {
for (int c = 0; c < m.getColumnDimension(); c++) {
d[r][c] = r <= c - k ? m.getEntry(r, c) : 0;
@ -1148,7 +1148,7 @@ public class CMAESOptimizer
* @return Row matrix representing the sums of the rows.
*/
private static RealMatrix sumRows(final RealMatrix m) {
double[][] d = new double[1][m.getColumnDimension()];
final double[][] d = new double[1][m.getColumnDimension()];
for (int c = 0; c < m.getColumnDimension(); c++) {
double sum = 0;
for (int r = 0; r < m.getRowDimension(); r++) {
@ -1166,13 +1166,13 @@ public class CMAESOptimizer
*/
private static RealMatrix diag(final RealMatrix m) {
if (m.getColumnDimension() == 1) {
double[][] d = new double[m.getRowDimension()][m.getRowDimension()];
final double[][] d = new double[m.getRowDimension()][m.getRowDimension()];
for (int i = 0; i < m.getRowDimension(); i++) {
d[i][i] = m.getEntry(i, 0);
}
return new Array2DRowRealMatrix(d, false);
} else {
double[][] d = new double[m.getRowDimension()][1];
final double[][] d = new double[m.getRowDimension()][1];
for (int i = 0; i < m.getColumnDimension(); i++) {
d[i][0] = m.getEntry(i, i);
}
@ -1188,7 +1188,8 @@ public class CMAESOptimizer
* @param m2 Target matrix.
* @param col2 Target column.
*/
private static void copyColumn(final RealMatrix m1, int col1, RealMatrix m2, int col2) {
private static void copyColumn(final RealMatrix m1, int col1,
RealMatrix m2, int col2) {
for (int i = 0; i < m1.getRowDimension(); i++) {
m2.setEntry(i, col2, m1.getEntry(i, col1));
}
@ -1200,7 +1201,7 @@ public class CMAESOptimizer
* @return n-by-m matrix filled with 1.
*/
private static RealMatrix ones(int n, int m) {
double[][] d = new double[n][m];
final double[][] d = new double[n][m];
for (int r = 0; r < n; r++) {
Arrays.fill(d[r], 1);
}
@ -1214,7 +1215,7 @@ public class CMAESOptimizer
* the diagonal.
*/
private static RealMatrix eye(int n, int m) {
double[][] d = new double[n][m];
final double[][] d = new double[n][m];
for (int r = 0; r < n; r++) {
if (r < m) {
d[r][r] = 1;
@ -1239,9 +1240,9 @@ public class CMAESOptimizer
* @return a matrix which replicates the input matrix in both directions.
*/
private static RealMatrix repmat(final RealMatrix mat, int n, int m) {
int rd = mat.getRowDimension();
int cd = mat.getColumnDimension();
double[][] d = new double[n * rd][m * cd];
final int rd = mat.getRowDimension();
final int cd = mat.getColumnDimension();
final double[][] d = new double[n * rd][m * cd];
for (int r = 0; r < n * rd; r++) {
for (int c = 0; c < m * cd; c++) {
d[r][c] = mat.getEntry(r % rd, c % cd);
@ -1257,8 +1258,8 @@ public class CMAESOptimizer
* @return a sequence as column matrix.
*/
private static RealMatrix sequence(double start, double end, double step) {
int size = (int) ((end - start) / step + 1);
double[][] d = new double[size][1];
final int size = (int) ((end - start) / step + 1);
final double[][] d = new double[size][1];
double value = start;
for (int r = 0; r < size; r++) {
d[r][0] = value;
@ -1334,7 +1335,7 @@ public class CMAESOptimizer
* @return the inverse of the mapping defined by indices.
*/
private static int[] inverse(final int[] indices) {
int[] inverse = new int[indices.length];
final int[] inverse = new int[indices.length];
for (int i = 0; i < indices.length; i++) {
inverse[indices[i]] = i;
}
@ -1346,7 +1347,7 @@ public class CMAESOptimizer
* @return the indices in inverse order (last is first).
*/
private static int[] reverse(final int[] indices) {
int[] reverse = new int[indices.length];
final int[] reverse = new int[indices.length];
for (int i = 0; i < indices.length; i++) {
reverse[i] = indices[indices.length - i - 1];
}
@ -1358,7 +1359,7 @@ public class CMAESOptimizer
* @return an array of Gaussian random numbers.
*/
private double[] randn(int size) {
double[] randn = new double[size];
final double[] randn = new double[size];
for (int i = 0; i < size; i++) {
randn[i] = random.nextGaussian();
}
@ -1371,7 +1372,7 @@ public class CMAESOptimizer
* @return a 2-dimensional matrix of Gaussian random numbers.
*/
private RealMatrix randn1(int size, int popSize) {
double[][] d = new double[size][popSize];
final double[][] d = new double[size][popSize];
for (int r = 0; r < size; r++) {
for (int c = 0; c < popSize; c++) {
d[r][c] = random.nextGaussian();