/* * 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.functions; import org.biojava.bio.symbol.PointLocation; import org.biojava.bio.symbol.SymbolList; import org.biojava.utils.ChangeListener; import org.biojava.utils.ChangeType; import org.biojava.utils.ChangeVetoException; import org.biojava.utils.Changeable; /** * Crosses two chromosomes. The basic usage of the class would be * something like choosing two chromosomes that you want to cross over and setting * these with the setChromosomePair method. Next you would call one of * the performCrossOver methods to do the crossing and finally you * would retreive the chromsome pair with the getChromosomes method. * * @author Mark Schreiber * @version 1.0 * @since 1.5 */ public interface CrossOverFunction extends Changeable{ /** * Performs a cross between the pair of chromosomes * @param chromA The first chromosome in the cross * @param chromB The second chromosome in the cross * @return A GACross that holds the results of the cross * @throws ChangeVetoException if the chromosomes are unmodifiable */ public GACrossResult performCrossOver(SymbolList chromA, SymbolList chromB) throws ChangeVetoException; /** * Sets an upper limit on the number of crosses. Its up to * the implementation to decide what to do when the limit is reached although * a good convention would be to keep only the first N crosses from the left * end (5' end) of the sequence. * * By convention the default upper limit is DEFAULT_MAX_CROSS (eg infinite). * This value should be used as the default by all implementations. * * @param maxCrossOvers the limit on crosses * @throws ChangeVetoException if a ChangeListener vetoes this change */ public void setMaxCrossOvers(int maxCrossOvers) throws ChangeVetoException; /** * @return the limit on crosses. */ public int getMaxCrossOvers(); /** * Sets the probability of crossing at each base. Each position * in the array corresponds to a position in the sequences to be crossed. * * The probability of a cross occuring after position 1 in the SymbolList * is given by crossOverProbs[1]. CrossOverProbs[0] is effectively * redundant as the cross would occur before the 1st position in the SymbolList. * * By convention if the array is shorter than the SymbolList it is being applied * to then the last value in the array will be applied to every subsequent residue. * * The default value in all implementations should be DEFAULT_CROSS_PROB * * @param crossOverProbs an array of doubles giving the probability of a * cross occuring at any place. * * @exception if a ChangeListener vetoes the change */ public void setCrossOverProbs(double[] crossOverProbs) throws ChangeVetoException; public double[] getCrossOverProbs(); public static final int DEFAULT_MAX_CROSS = Integer.MAX_VALUE; public static final double[] DEFAULT_CROSS_PROB = {0.0}; public static final ChangeType MAX_CROSSES = new ChangeType("maximum number of crosses",CrossOverFunction.class,"MAX_CROSSES"); public static final ChangeType CROSS_PROB = new ChangeType("cross over probabilities",CrossOverFunction.class,"CROSS_PROB"); public static final CrossOverFunction NO_CROSS = new NoCross(); /** *

A place holder CrossOverFunction that doesn't perform cross overs

* @author Mark Schreiber * @version 1.0 */ public final class NoCross implements CrossOverFunction { /** * @return a single member array equal to {0.0} */ public double[] getCrossOverProbs(){ return new double[]{0.0}; } /** * @return 0 (after all you can't cross over with this function) */ public int getMaxCrossOvers(){ return 0; } public GACrossResult performCrossOver(SymbolList chromA, SymbolList chromB){ return new SimpleGACrossResult( new PointLocation[]{}, new SymbolList[]{chromA, chromB} ); } public void setCrossOverProbs(double[] crossOverProb) throws ChangeVetoException{ throw new ChangeVetoException("Cannot set the crossOverProb for a NO_CROSS function"); } public void setMaxCrossOvers(int max) throws ChangeVetoException{ throw new ChangeVetoException("Cannot change the maximum crossovers in a NO_CROSS function"); } public boolean isUnchanging(ChangeType t){ return true; } public void removeChangeListener(ChangeListener c){}; public void addChangeListener(ChangeListener cl){}; public void addChangeListener(ChangeListener cl, ChangeType ct){}; public void removeChangeListener(ChangeListener cl, ChangeType ct){}; } }