Deduplicate norm() method and use the one provided by Mathematics

This commit is contained in:
Fabian Becker 2015-12-23 13:18:39 +01:00
parent 6ea7dc46f0
commit b2c0ae9488
4 changed files with 15 additions and 40 deletions

View File

@ -4,6 +4,7 @@ import eva2.optimization.individuals.AbstractEAIndividual;
import eva2.tools.EVAERROR; import eva2.tools.EVAERROR;
import eva2.tools.math.Mathematics; import eva2.tools.math.Mathematics;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import eva2.util.annotation.Parameter;
import java.io.Serializable; import java.io.Serializable;
@ -19,8 +20,7 @@ import java.io.Serializable;
public class DoubleIntegralMetric implements InterfaceDistanceMetric, Serializable { public class DoubleIntegralMetric implements InterfaceDistanceMetric, Serializable {
boolean oneNormed = true; // if true, the vectors are normed to unity sum before comparison. boolean oneNormed = true; // if true, the vectors are normed to unity sum before comparison.
public DoubleIntegralMetric() { public DoubleIntegralMetric() {}
}
public DoubleIntegralMetric(boolean normed) { public DoubleIntegralMetric(boolean normed) {
oneNormed = normed; oneNormed = normed;
@ -35,10 +35,8 @@ public class DoubleIntegralMetric implements InterfaceDistanceMetric, Serializab
public double distance(AbstractEAIndividual indy1, AbstractEAIndividual indy2) { public double distance(AbstractEAIndividual indy1, AbstractEAIndividual indy2) {
double[] dIndy1 = null, dIndy2 = null; double[] dIndy1 = null, dIndy2 = null;
if (dIndy1 == null || dIndy2 == null) { dIndy1 = AbstractEAIndividual.getDoublePositionShallow(indy1);
dIndy1 = AbstractEAIndividual.getDoublePositionShallow(indy1); dIndy2 = AbstractEAIndividual.getDoublePositionShallow(indy2);
dIndy2 = AbstractEAIndividual.getDoublePositionShallow(indy2);
}
if (oneNormed) { if (oneNormed) {
double l1 = Mathematics.sum(dIndy1); double l1 = Mathematics.sum(dIndy1);
@ -53,9 +51,8 @@ public class DoubleIntegralMetric implements InterfaceDistanceMetric, Serializab
} }
double sum1 = 0, sum2 = 0; double sum1 = 0, sum2 = 0;
double tmpDiff = 0, sqrDiffSum = 0; double tmpDiff, sqrDiffSum = 0;
// System.out.println(Mathematics.sum(dIndy1));
// System.out.println(Mathematics.sum(dIndy2));
for (int i = 0; (i < dIndy1.length) && (i < dIndy2.length); i++) { for (int i = 0; (i < dIndy1.length) && (i < dIndy2.length); i++) {
sum1 += dIndy1[i]; sum1 += dIndy1[i];
sum2 += dIndy2[i]; sum2 += dIndy2[i];
@ -73,12 +70,8 @@ public class DoubleIntegralMetric implements InterfaceDistanceMetric, Serializab
return oneNormed; return oneNormed;
} }
@Parameter(description = "If true, both vectors are normed to unity sum before comparison.")
public void setOneNormed(boolean normedByLength) { public void setOneNormed(boolean normedByLength) {
this.oneNormed = normedByLength; this.oneNormed = normedByLength;
} }
public String oneNormedTipText() {
return "If true, both vectors are normed to unity sum before comparison.";
}
} }

View File

@ -3,6 +3,7 @@ package eva2.optimization.operator.distancemetric;
import eva2.gui.BeanInspector; import eva2.gui.BeanInspector;
import eva2.optimization.individuals.*; import eva2.optimization.individuals.*;
import eva2.tools.math.Mathematics;
import eva2.util.annotation.Description; import eva2.util.annotation.Description;
import java.util.BitSet; import java.util.BitSet;
@ -130,7 +131,6 @@ public class PhenotypeMetric implements InterfaceDistanceMetric, java.io.Seriali
if ((indy1 instanceof InterfaceDataTypePermutation) && (indy2 instanceof InterfaceDataTypePermutation)) { if ((indy1 instanceof InterfaceDataTypePermutation) && (indy2 instanceof InterfaceDataTypePermutation)) {
int[] dIndy1, dIndy2; int[] dIndy1, dIndy2;
String s1 = "", s2 = ""; String s1 = "", s2 = "";
// double tmpResult = 0;
for (int p = 0; p < ((InterfaceDataTypePermutation) indy1).getPermutationData().length; p++) { for (int p = 0; p < ((InterfaceDataTypePermutation) indy1).getPermutationData().length; p++) {
dIndy1 = ((InterfaceDataTypePermutation) indy1).getPermutationData()[p]; dIndy1 = ((InterfaceDataTypePermutation) indy1).getPermutationData()[p];
dIndy2 = ((InterfaceDataTypePermutation) indy2).getPermutationData()[p]; dIndy2 = ((InterfaceDataTypePermutation) indy2).getPermutationData()[p];
@ -192,7 +192,7 @@ public class PhenotypeMetric implements InterfaceDistanceMetric, java.io.Seriali
return result / d1.length; return result / d1.length;
} }
if (indy instanceof InterfaceDataTypeDouble) { if (indy instanceof InterfaceDataTypeDouble) {
result = norm(((InterfaceDataTypeDouble) indy).getDoubleData()); result = Mathematics.norm(((InterfaceDataTypeDouble) indy).getDoubleData());
return result; return result;
} }
if (indy instanceof InterfaceDataTypePermutation) { if (indy instanceof InterfaceDataTypePermutation) {
@ -208,20 +208,6 @@ public class PhenotypeMetric implements InterfaceDistanceMetric, java.io.Seriali
return 0; return 0;
} }
/**
* Calculates the 2 norm of a given vector.
*
* @param v1
* @return
*/
public static double norm(double[] v1) {
double result = 0;
for (int i = 0; i < v1.length; i++) {
result += Math.pow(v1[i], 2);
}
return Math.sqrt(result);
}
/** /**
* This method will return a naming String * This method will return a naming String
* *

View File

@ -15,15 +15,11 @@ import eva2.util.annotation.Description;
@Description("This is an experimental method for individuals using global ES mutation.") @Description("This is an experimental method for individuals using global ES mutation.")
public class SigmaSingleMetricGlobalMutation implements InterfaceDistanceMetric, java.io.Serializable { public class SigmaSingleMetricGlobalMutation implements InterfaceDistanceMetric, java.io.Serializable {
public SigmaSingleMetricGlobalMutation() { public SigmaSingleMetricGlobalMutation() {}
}
public SigmaSingleMetricGlobalMutation(SigmaSingleMetricGlobalMutation a) {
}
@Override @Override
public Object clone() { public Object clone() {
return new SigmaSingleMetricGlobalMutation(this); return new SigmaSingleMetricGlobalMutation();
} }
/** /**

View File

@ -248,9 +248,9 @@ public class PostProcess {
Population result = new Population(); Population result = new Population();
for (int i = 0; i < pop.size(); i++) { for (int i = 0; i < pop.size(); i++) {
indy = pop.getEAIndividual(i); indy = pop.getEAIndividual(i);
if (bSmallerEq && (PhenotypeMetric.norm(indy.getFitness()) <= fitNorm)) { if (bSmallerEq && (Mathematics.norm(indy.getFitness()) <= fitNorm)) {
result.add(indy); result.add(indy);
} else if (!bSmallerEq && (PhenotypeMetric.norm(indy.getFitness()) > fitNorm)) { } else if (!bSmallerEq && (Mathematics.norm(indy.getFitness()) > fitNorm)) {
result.add(indy); result.add(indy);
} }
} }
@ -279,7 +279,7 @@ public class PostProcess {
if ((crit >= 0) && (crit < indy.getFitness().length)) { if ((crit >= 0) && (crit < indy.getFitness().length)) {
curFit = indy.getFitness(crit); curFit = indy.getFitness(crit);
} else { } else {
curFit = PhenotypeMetric.norm(indy.getFitness()); curFit = Mathematics.norm(indy.getFitness());
} }
if (bSmallerEq && (curFit <= fitThresh)) { if (bSmallerEq && (curFit <= fitThresh)) {
@ -1058,7 +1058,7 @@ public class PostProcess {
plot = draw("After " + stepsDone + " steps (" + params.getPPMethod() + ")" + ((params.getPostProcessClusterSigma() > 0) ? " and second clustering" : ""), null, outputPop, null, problem); plot = draw("After " + stepsDone + " steps (" + params.getPPMethod() + ")" + ((params.getPostProcessClusterSigma() > 0) ? " and second clustering" : ""), null, outputPop, null, problem);
} }
// ##### some statistics // ##### some statistics
double upBnd = PhenotypeMetric.norm(outputPop.getWorstEAIndividual().getFitness()) * 1.1; double upBnd = Mathematics.norm(outputPop.getWorstEAIndividual().getFitness()) * 1.1;
upBnd = Math.pow(10, Math.floor(Math.log10(upBnd) + 1)); upBnd = Math.pow(10, Math.floor(Math.log10(upBnd) + 1));
double lowBnd = 0; double lowBnd = 0;
int fitCrit = 0; // use first fitness criterion int fitCrit = 0; // use first fitness criterion