/* * BioJava development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. If you do not have a copy, * see: * * http://www.gnu.org/copyleft/lesser.html * * Copyright for this code is held jointly by the individual * authors. These should be listed in @author doc comments. * * For more information on the BioJava project and its aims, * or to join the biojava-l mailing list, visit the home page * at: * * http://www.biojava.org/ * */ package org.biojavax.ga.util; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.biojava.bio.BioError; import org.biojava.bio.BioException; import org.biojava.bio.dist.Distribution; import org.biojava.bio.dist.OrderNDistribution; import org.biojava.bio.dist.OrderNDistributionFactory; import org.biojava.bio.dist.UniformDistribution; import org.biojava.bio.seq.io.CharacterTokenization; import org.biojava.bio.seq.io.SymbolTokenization; import org.biojava.bio.symbol.Alphabet; import org.biojava.bio.symbol.AlphabetIndex; import org.biojava.bio.symbol.AlphabetManager; import org.biojava.bio.symbol.AtomicSymbol; import org.biojava.bio.symbol.FiniteAlphabet; import org.biojava.bio.symbol.IllegalAlphabetException; import org.biojava.bio.symbol.IllegalSymbolException; import org.biojava.bio.symbol.SimpleAlphabet; import org.biojava.bio.symbol.SimpleSymbolList; import org.biojava.bio.symbol.SymbolList; import org.biojava.utils.ChangeVetoException; /** *
Utility methods for the GA library
*
* @author Mark Schreiber
* @version 1.0
* @since 1.5
*/
public final class GATools {
private static SimpleAlphabet binary;
private static AtomicSymbol zero;
private static AtomicSymbol one;
static{
zero = AlphabetManager.createSymbol("zero");
one = AlphabetManager.createSymbol("one");
Set syms = new HashSet();
syms.add(zero); syms.add(one);
binary = new SimpleAlphabet(syms, "GA_Binary");
CharacterTokenization tk = new CharacterTokenization(binary, false);
tk.bindSymbol(zero, '0');
tk.bindSymbol(one, '1');
binary.putTokenization("token", tk);
AlphabetManager.registerAlphabet(binary.getName(), binary);
}
/**
* Gets a Reference to the FlyWeight GA_Binary Alphabet
.
* It contains the Symbols one and zero.
* @return the finite, flyweight Binary Alphabet
*/
public static FiniteAlphabet getBinaryAlphabet(){
return binary;
}
/**
* @return the GA_Binary symbol "one"
*/
public static AtomicSymbol one(){
return one;
}
/**
* Creates a SymbolList
in the GABinary Alphabet
* @param binarySequence a String like "01010000101010101" with no white space
* @return a SymbolList
parsed from binarySequence
* @throws IllegalSymbolException if a character other than 1 or 0 is found.
*/
public static SymbolList createBinary(String binarySequence)
throws IllegalSymbolException{
SymbolTokenization toke = null;
try {
toke =
getBinaryAlphabet().getTokenization("token");
}
catch (BioException ex) {
throw new BioError("Cannot make binary tokenization", ex);
}
return new SimpleSymbolList(toke, binarySequence);
}
/**
* @return the GA_Binary symbol "zero"
*/
public static AtomicSymbol zero(){
return zero;
}
/**
* Makes a 1st order distribution which is infact uniform (equivalent to a
* uniform zero order distribution).
* @param a the zero order Alphabet which will be multiplied into the 1st order alphabet
* @return the "1st order" distribution
* @throws IllegalAlphabetException if the Distribution cannot be constructed from a
.
*/
public static OrderNDistribution uniformMutationDistribution(FiniteAlphabet a) throws IllegalAlphabetException{
List l = Collections.nCopies(2, a);
Alphabet alpha = AlphabetManager.getCrossProductAlphabet(l);
OrderNDistribution d =
(OrderNDistribution)OrderNDistributionFactory.DEFAULT.createDistribution(alpha);
AlphabetIndex ind = AlphabetManager.getAlphabetIndex(a);
UniformDistribution u = new UniformDistribution(a);
for(int i = 0; i < a.size(); i++){
try {
d.setDistribution(ind.symbolForIndex(i), u);
}
catch (IllegalSymbolException ex) {
throw new BioError(ex); //shouldn't happen
}
}
return d;
}
/**
* Makes a mutation Distribution
where the probability
* of a Symbol
being mutated to itself is zero and the
* probability of it being changed to any other Symbol
in
* the Alphabet a
is 1.0 / (a.size() - 1.0)
* @param a the FiniteAlphabet
which mutations are sampled from.
* @return A Distribution
suitable for use in a MutationFunction
* @throws IllegalAlphabetException if the Distribution
cannot be made
* over the FiniteAlphabet
*/
public static OrderNDistribution standardMutationDistribution(FiniteAlphabet a) throws IllegalAlphabetException{
List l = Collections.nCopies(2, a);
Alphabet alpha = AlphabetManager.getCrossProductAlphabet(l);
OrderNDistribution d =
(OrderNDistribution)OrderNDistributionFactory.DEFAULT.createDistribution(alpha);
AlphabetIndex ind = AlphabetManager.getAlphabetIndex(a);
for(int i = 0; i < a.size(); i++){
try {
Distribution sub_dist = d.getDistribution(ind.symbolForIndex(i));
AlphabetIndex ind2 = AlphabetManager.getAlphabetIndex(a);
for (int j = 0; j < a.size(); j++){
if(ind.symbolForIndex(i) == ind2.symbolForIndex(j)){
sub_dist.setWeight(ind2.symbolForIndex(j), 0.0);
}else{
sub_dist.setWeight(ind2.symbolForIndex(j), 1.0/ (double)(a.size() -1));
}
}
}catch (IllegalSymbolException ex) {
throw new BioError(ex); //shouldn't happen
}catch (ChangeVetoException ex){
throw new BioError(ex); //shouldn't happen
}
}
return d;
}
}