DGrid bug cleared (merging mk branch revs. 315-317).

This commit is contained in:
Marcel Kronfeld 2009-07-13 15:50:28 +00:00
parent d8fbb01e29
commit 61a6c4649e
7 changed files with 164 additions and 48 deletions

View File

@ -68,7 +68,7 @@ public class CrossoverESPCX implements InterfaceCrossover, java.io.Serializable
System.arraycopy(((InterfaceESIndividual)result[i]).getDGenotype(), 0, children[i], 0, parents[i].length);
}
double[] g = Mathematics.getMeanVector(parents), tmpD;
double[] g = Mathematics.meanVect(parents), tmpD;
double w, v;
ArrayList subSpace;
// now determine the offsprings

View File

@ -67,7 +67,7 @@ public class CrossoverESSPX implements InterfaceCrossover, java.io.Serializable
}
double r;
double[] g = Mathematics.getMeanVector(parents);
double[] g = Mathematics.meanVect(parents);
double[][] Y = new double[parents.length][], C;
// calculate the Y vectors

View File

@ -72,7 +72,7 @@ public class CrossoverESUNDX implements InterfaceCrossover, java.io.Serializable
for (int i = 1; i < parents.length; i++) {
nParents[i-1] = parents[i];
}
double[] g = Mathematics.getMeanVector(nParents), tmpD;
double[] g = Mathematics.meanVect(nParents), tmpD;
double w, v;
ArrayList givenCoordinates = this.getGivenCoordinates(g, nParents);
ArrayList missingCorrdinates = this.getMissingCoordinates(g, parents[0], givenCoordinates);

View File

@ -0,0 +1,64 @@
package eva2.server.go.tools;
import java.util.Comparator;
import eva2.server.go.individuals.AbstractEAIndividual;
/**
* Comparator implementation which compares two double arrays.
* It assigns -1 if first is pareto dominant (smaller), 1 if second is pareto dominant (larger), 0 if the two ind.s
* are not comparable.
* If a criterion>=0 is specified, only the thereby indexed entry of any array
* will be used for comparison (single criterion case).
*
*/
public class DoubleArrayComparator implements Comparator<Object> {
int fitCriterion = -1;
public DoubleArrayComparator() {
this(-1);
}
/**
* Generic constructor.
*
* @param fitnessCriterion
*/
public DoubleArrayComparator(int criterion) {
fitCriterion = criterion;
}
public DoubleArrayComparator(DoubleArrayComparator o) {
fitCriterion = o.fitCriterion;
}
public Object clone() {
return new DoubleArrayComparator(this);
}
/**
* Compare two double arrays based on dominance, return -1 if the first is dominant, 1 if the second is dominant, 0 if they
* are not comparable.
*
* @see #AbstractEAIndividual.isDominatingFitness(double[], double[])
* @param o1 the first double[] to compare
* @param o2 the second double[] to compare
* @return -1 if the first is dominant, 1 if the second is dominant, otherwise 0
*/
public int compare(Object o1, Object o2) {
boolean o1domO2, o2domO1;
double[] fit1 = (double[])o1;
double[] fit2 = (double[])o2;
if (fitCriterion < 0) {
o1domO2 = AbstractEAIndividual.isDominatingFitness(fit1, fit2);
o2domO1 = AbstractEAIndividual.isDominatingFitness(fit2, fit1);
} else {
if (fit1[fitCriterion] == fit2[fitCriterion]) return 0;
else return (fit1[fitCriterion] < fit2[fitCriterion]) ? -1 : 1;
}
if (o1domO2 ^ o2domO1) return (o1domO2 ? -1 : 1);
else return 0; // these are not comparable
}
}

View File

@ -1,14 +1,14 @@
package eva2.tools;
import java.util.Arrays;
import eva2.server.go.individuals.InterfaceDataTypeDouble;
import java.util.List;
import wsi.ra.math.RNG;
import wsi.ra.math.Jama.Matrix;
import wsi.ra.math.interpolation.BasicDataSet;
import wsi.ra.math.interpolation.InterpolationException;
import wsi.ra.math.interpolation.SplineInterpolation;
import eva2.server.go.tools.DoubleArrayComparator;
//created at June 27 2006
@ -16,15 +16,6 @@ import wsi.ra.math.interpolation.SplineInterpolation;
* @author Andreas Dr&auml;ger
*/
public class Mathematics {
public static void main(String args[]) {
int i = 0;
double y[] = new double[args.length];
for (; i < args.length; i++)
y[i] = Double.parseDouble(args[i]);
System.out.println(median(y) / 1000);
}
public static void revertArray(Object[] src, Object[] dst) {
if (dst.length>=src.length) {
for (int i=0; i<src.length; i++) {
@ -34,19 +25,48 @@ public class Mathematics {
}
/**
* Computes the median of a given double vector.
* Computes the median of a given double vector by sorting x.
*
* @param x
* a vector of doubles
* @param x a vector of doubles
* @param cloneX flag whether x should be cloned before sorting.
* @return the median
*/
public static double median(double[] x) {
if (x.length == 1) return x[0];
Arrays.sort(x);
if (x.length % 2 == 0) return x[(x.length + 1) / 2];
return (x[x.length / 2] + x[x.length / 2 + 1]) / 2;
}
public static double median(double[] x, boolean cloneX) {
double[] in;
if (cloneX) in = (double[]) x.clone();
else in = x;
Arrays.sort(in);
if (in.length % 2 != 0) return in[(in.length-1) / 2];
else return (in[in.length/2] + in[(in.length/2)+1]) / 2.;
}
/**
* Computes the median of a given list of double vectors by sorting it.
* If the size is even, no direct median is defined - in that case it may be
* interpolated by the two closest elements or one of them may be selected (always
* the smaller one depending on the comparator.
*
* @see #DoubleArrayComparator
* @param dblArrList a list of double vectors
* @param interpolate flag whether, for even size, the median is interpolated
* @return the median
*/
public static double[] median(List<double[]> dblArrList, boolean interpolate) {
java.util.Collections.sort(dblArrList, new DoubleArrayComparator());
int len = dblArrList.size();
if (len % 2 != 0) return dblArrList.get((len-1) / 2);
else {
double[] med = dblArrList.get(len/2).clone();
if (interpolate) {
vvAdd(med, dblArrList.get((len/2)+1), med);
svDiv(2, med, med);
}
return med;
}
}
/**
* This method gives a linear interpolation of the function values of the
* given argument/function value pairs.
@ -326,7 +346,7 @@ public class Mathematics {
* @param d d[i] the vectors, d[i][j] the jth coordinate of the ith vector
* @return The mean vector.
*/
public static double[] getMeanVector(double[][] d) {
public static double[] meanVect(double[][] d) {
double[] result = new double[d[0].length];
for (int i = 0; i < d.length; i++) {
for (int j = 0; j < d[i].length; j++) {
@ -948,4 +968,35 @@ public class Mathematics {
return (2 * min - val - step);
return (val += step);
}
/**
* Return first multiple of interval which is larger than len.
*
* @param len
* @param interval
* @return
*/
public static double firstMultipleAbove(double len, double interval) {
double startVal,dn = (len / interval );
startVal = Math.round(dn-0.5)*interval;
if( startVal < len || (len==0)) {
startVal+=interval;
}
return startVal;
}
/**
* Return the product over a double vector.
* @param vals
* @return
*/
public static double product(double[] vals) {
double prod=1.;
for (int i = 0; i < vals.length; i++) {
prod*=vals[i];
}
return prod;
}
}

View File

@ -19,6 +19,8 @@ package wsi.ra.chart2d;
import java.awt.Color ;
import java.awt.Graphics ;
import eva2.tools.Mathematics;
/*==========================================================================*
* CLASS DECLARATION
*==========================================================================*/
@ -94,12 +96,14 @@ public class DGrid extends DComponent
DPoint p1, p2;
DLine l;
minX = (int)( rectangle.x / hor_dist );
if( minX * hor_dist <= rectangle.x ) minX++;
minX *= hor_dist;
minY = ( rectangle.y / ver_dist );
if( minY * ver_dist <= rectangle.y ) minY++;
minY *= ver_dist;
minX=Mathematics.firstMultipleAbove(rectangle.x, hor_dist);
minY=Mathematics.firstMultipleAbove(rectangle.y, ver_dist);
// minX = (int)( rectangle.x / hor_dist );
// if( minX * hor_dist <= rectangle.x ) minX++;
// minX *= hor_dist;
// minY = (int)( rectangle.y / ver_dist );
// if( minY * ver_dist <= rectangle.y ) minY++;
// minY *= ver_dist;
p1 = new DPoint( 0, rectangle.y );
p2 = new DPoint( 0, rectangle.y + rectangle.height );
@ -127,16 +131,6 @@ public class DGrid extends DComponent
public String toString(){
return "chart2d.DGrid[ hor: "+hor_dist+", ver: "+ver_dist+" ]";
}
// public void updateDistByRect(DRectangle rect) {
// System.out.println(rect);
// if (!rect.isEmpty() && (hor_dist>0 && ver_dist>0)) {
// double horRatio = Math.abs(rectangle.x)/hor_dist;
// double verRatio = Math.abs(rectangle.y)/ver_dist;
//// rectangle = visRect;
// setDistances(rect.x*horRatio, rect.y*verRatio);
// }
// }
}
/****************************************************************************

View File

@ -3,6 +3,9 @@ package wsi.ra.chart2d;
import java.awt.* ;
import javax.swing.BorderFactory;
import javax.swing.border.* ;
import eva2.tools.Mathematics;
import java.awt.geom.AffineTransform ;
import java.text.NumberFormat;
import java.text.DecimalFormat;
@ -291,16 +294,19 @@ public class ScaledBorder implements Border
FontMetrics fm = g.getFontMetrics();
int fontAsc = fm.getAscent(), v2m = fm.stringWidth("0") / y_values2marker;
int n = (int)( src_rect.y / src_dY );
// if( n * src_dY < src_rect.y || ( src_rect.x == 0 && src_rect.y == 0 ) ) n++;
if( n * src_dY < src_rect.y || ( src_rect.x == 0 && src_rect.y == 0 ) ) {
if (n+1 > n) n++;
else System.err.println("Overflow error A in ScaledBorder!");
}
// double startVal,dn = (src_rect.y / src_dY );
// startVal = Math.round(dn-0.5)*src_dY;
//
// if( startVal < src_rect.y || ( src_rect.x == 0 && src_rect.y == 0 ) ) {
// startVal+=src_dY;
// }
double startVal = Mathematics.firstMultipleAbove(src_rect.y, src_dY);
double v, scaledV, minx = src_rect.x;
if( x_scale != null ) minx = x_scale.getImageOf( minx );
v = n * src_dY;
v = startVal;
while (v <= src_rect.y + src_rect.height){
if( y_scale != null ) scaledV = y_scale.getImageOf( v );
else scaledV=v;
@ -321,7 +327,7 @@ public class ScaledBorder implements Border
v += src_dY;
}
}
public double getSrcdY( FontMetrics fm, Dimension cd ){
return getSrcdY(fm.getHeight(), cd.height);
}
@ -333,6 +339,7 @@ public class ScaledBorder implements Border
double minsrc_dY = 2 * src_rect.height / (double)max; // die 2 einfach mal so eingesetzt <--------------------------
src_dY = aBitBigger( minsrc_dY );
if( src_dY < minimal_increment ) src_dY = minimal_increment;
if( under_construction ) System.out.println("Setting src_dY to " + src_dY + " for " + src_rect);
return src_dY;
}