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.biojava.bio.dp;
024
025import org.biojava.bio.BioException;
026import org.biojava.bio.dp.onehead.SingleDP;
027import org.biojava.bio.dp.twohead.CellCalculatorFactoryMaker;
028import org.biojava.bio.dp.twohead.DPInterpreter;
029import org.biojava.bio.dp.twohead.PairwiseDP;
030
031/**
032 * The interface for objects that can generate a DP object for a MarkovModel.
033 *
034 * @author Matthew Pocock
035 */ 
036public interface DPFactory {
037  public DP createDP(MarkovModel model)
038  throws IllegalArgumentException, BioException;
039  
040  public static final DPFactory DEFAULT = new DefaultFactory(new DPInterpreter.Maker());
041  
042  public static class DefaultFactory implements DPFactory {
043    private final CellCalculatorFactoryMaker cfFacM;
044    
045    public DefaultFactory(CellCalculatorFactoryMaker cfFacM) {
046      this.cfFacM = cfFacM;
047    }
048    
049    public DP createDP(MarkovModel model)
050    throws IllegalArgumentException, BioException {
051      int heads = model.advance().length;
052      MarkovModel flat = DP.flatView(model);
053      if(heads == 1) {
054        return new SingleDP(flat);
055      } else if(heads == 2) {
056        return new PairwiseDP(flat, cfFacM);
057      } else {
058        throw new IllegalArgumentException(
059          "Can't create DPFactory for models with " + heads + " heads"
060        );
061      }
062    }
063  }
064}