eva2/src/eva2/server/go/individuals/codings/ga/GAGrayCodingInteger.java
Fabian Becker c16a592a26 refs #25
Some 2400 @Overrides added... LAWL
2013-01-29 13:37:25 +00:00

114 lines
4.3 KiB
Java

package eva2.server.go.individuals.codings.ga;
import java.util.BitSet;
/** This is a gray coding for integers, sorry no variable number of bits here.
* Created by IntelliJ IDEA.
* User: streiche
* Date: 24.03.2003
* Time: 18:40:03
* To change this template use Options | File Templates.
*/
public class GAGrayCodingInteger implements InterfaceGAIntegerCoding,java.io.Serializable {
GAStandardCodingInteger m_HelpingHand = new GAStandardCodingInteger();
/** This method decodes a part of a given BitSet into a int value. This method may change the contens
* of the BitSet if it doesn't describe a valid value.
* The method checks wether or not the value is within the given range.
* @param refBitSet The BitSet where the integer value is stored.
* @param range The allowed range of the value.
* @param locus The position and length on the BitSet that is to be decoded.
* @param correction Enable automatic correction is enabled.
* @return The int value.
*/
@Override
public int decodeValue(BitSet refBitSet, int[] range, int[] locus, boolean correction) {
BitSet tmpBitSet;
int[] tmpLocus;
boolean tmpB = false;
tmpLocus = new int[2];
tmpLocus[0] = 0;
tmpLocus[1] = locus[1];
tmpBitSet = new BitSet(tmpLocus.length);
// for (int i = 0; i < tmpLocus.length; i++) {
// tmpB = (tmpB ^ refBitSet.get(locus[1] + i));
// if (tmpB) tmpBitSet.set(i);
// else tmpBitSet.clear(i);
// }
for (int i = 0; i < tmpLocus[1]; i++) {
tmpB = refBitSet.get(locus[0]);
for (int j = 1; j <= i; j++) tmpB = tmpB ^ refBitSet.get(locus[0] + j);
if (tmpB) tmpBitSet.set(i);
else tmpBitSet.clear(i);
}
return this.m_HelpingHand.decodeValue(tmpBitSet, range, tmpLocus, correction);
}
/** This method codes a given int value directly into a BitSet at
* the position which is specified by locus.
* The method checks wether or not the value is within the given range.
* @param value The value to be coded.
* @param range The allowed range of the value.
* @param refBitSet The BitSet where the questioned value is stored.
* @param locus The position and length on the BitSet that is to be coded.
*/
@Override
public void codeValue(int value, int[] range, BitSet refBitSet, int[] locus) {
BitSet tmpBitSet;
int[] tmpLocus;
tmpLocus = new int[2];
tmpLocus[0] = 0;
tmpLocus[1] = locus[1];
tmpBitSet = new BitSet(tmpLocus.length);
this.m_HelpingHand.codeValue(value, range, tmpBitSet, tmpLocus);
// if (tmpBitSet.get(0)) refBitSet.set(locus[1]);
// else refBitSet.clear(locus[1]);
// for (int i = 1; i < locus.length; i++) {
// if (tmpBitSet.get(i)^tmpBitSet.get(i-1)) refBitSet.set(locus[1] + i);
// else refBitSet.clear(locus[1] + i);
// }
if (tmpBitSet.get(0)) refBitSet.set(locus[0]);
else refBitSet.clear(locus[0]);
for (int i = 1; i < locus[1]; i++) {
if (tmpBitSet.get(i)^tmpBitSet.get(i-1)) refBitSet.set(locus[0] + i);
else refBitSet.clear(locus[0] + i);
}
}
/** This method will calculate how many bits are to be used to code a given value
* @param range The range for the value.
*/
@Override
public int calculateNecessaryBits(int[] range) {
return this.m_HelpingHand.calculateNecessaryBits(range);
}
/** Perhaps a special output is necessary.
* @param b The BitString.
* @return A printable String.
*/
public String printBitSet(BitSet b) {
return this.printBitSet(b, b.size());
}
/** Perhaps a special output is necessary.
* @param b The BitString.
* @return A printable String.
*/
public String printBitSet(BitSet b, int length) {
String output = "{";
for (int i = 0; i < length; i++) {
if (b.get(i)) output += "1";
else output += "0";
}
output += "}\n";
return output;
}
}