001/*
002 *                    BioJava development code
003 *
004 * This code may be freely distributed and modified under the
005 * terms of the GNU Lesser General Public Licence.  This should
006 * be distributed with the code.  If you do not have a copy,
007 * see:
008 *
009 *      http://www.gnu.org/copyleft/lesser.html
010 *
011 * Copyright for this code is held jointly by the individual
012 * authors.  These should be listed in @author doc comments.
013 *
014 * For more information on the BioJava project and its aims,
015 * or to join the biojava-l mailing list, visit the home page
016 * at:
017 *
018 *      http://www.biojava.org/
019 *
020 */
021
022
023package org.biojavax.ga.functions;
024
025import java.util.Random;
026
027import org.biojava.bio.dist.OrderNDistribution;
028import org.biojava.bio.symbol.Edit;
029import org.biojava.bio.symbol.IllegalAlphabetException;
030import org.biojava.bio.symbol.IllegalSymbolException;
031import org.biojava.bio.symbol.SymbolList;
032import org.biojava.utils.ChangeVetoException;
033
034/**
035 * <p> Simple no frills Implementation of the MutationFunction interface</p>
036 * <p> This class is final, custom implementations should extend <code>
037 * AbstractMutationFunction</code></p>
038 *
039 * @author Mark Schreiber
040 * @version 1.0
041 * @since 1.5
042 */
043
044public final class SimpleMutationFunction extends AbstractMutationFunction {
045
046  public SimpleMutationFunction() {
047  }
048
049  public SymbolList mutate(SymbolList seq)
050      throws ChangeVetoException, IllegalAlphabetException, IllegalSymbolException {
051
052    int maxIndex = getMutationProbs().length -1;
053    OrderNDistribution d = getMutationSpectrum();
054    Random r = new Random();
055
056    for (int i = 1; i < seq.length(); i++) {
057      int index = Math.min(i-1, maxIndex);
058      double mutProb = getMutationProbs()[index];
059
060      if(r.nextDouble() < mutProb){
061
062        Edit e = new Edit(i, seq.getAlphabet(),
063                          d.getDistribution(seq.symbolAt(i)).sampleSymbol());
064        seq.edit(e);
065
066      }
067    }
068
069    return seq;
070  }
071
072}