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}