Пример #1
0
  public String classifyWhole(File file) {
    double[] probabilities = new double[genres.length]; // array of initial probabilities.
    int current = 0; // array counter.
    for (MarkovModel mm : mms) // for every MarkovModel in the array.
    {
      probabilities[current] =
          mm.probabilityWhole(file); // get initial probability from the Markov Model.
      ++current;
    }

    double[] realProbabilities = new double[genres.length]; // Array of calculated probabilities.
    int max = 0; // Pointer to maximum probability.
    for (int i = 0; i < genres.length; ++i) // Calculate probability for each genre.
    {
      double sum = 0;
      for (int j = 0; j < genres.length; ++j) // Sum of the probabilities in different genres.
      {
        sum += Math.exp(probabilities[j]);
      }
      realProbabilities[i] = Math.exp(probabilities[i]) / sum; // Calculating final probability.
      if (realProbabilities[i] > realProbabilities[max]) // recalculating max probability.
      {
        max = i;
      }
    }

    for (int i = 0; i < genres.length; ++i) {
      System.out.println(genres[i] + " : " + probabilities[i]);
    }

    return genres[max]; // returning corresponding genre.
  }
Пример #2
0
 protected void addAState(State ourState) throws IllegalSymbolException {
   try {
     delegate.addState(ourState);
   } catch (ChangeVetoException cve) {
     throw new BioError("This model should be ours with no listeners", cve);
   }
 }
Пример #3
0
 public FiniteAlphabet transitionsFrom(State from) throws IllegalSymbolException {
   return delegate.transitionsFrom(from);
 }
Пример #4
0
 public boolean containsTransition(State from, State to) throws IllegalSymbolException {
   return delegate.containsTransition(from, to);
 }
Пример #5
0
 public Distribution getWeights(State source) throws IllegalSymbolException {
   return delegate.getWeights(source);
 }
Пример #6
0
 public MagicalState magicalState() {
   return delegate.magicalState();
 }
Пример #7
0
 public int heads() {
   return delegate.heads();
 }
Пример #8
0
 public FiniteAlphabet stateAlphabet() {
   return delegate.stateAlphabet();
 }
Пример #9
0
 public Alphabet emissionAlphabet() {
   return delegate.emissionAlphabet();
 }
Пример #10
0
 public int[] advance() {
   return delegate.advance();
 }
Пример #11
0
  public FlatModel(MarkovModel model) throws IllegalSymbolException, IllegalAlphabetException {
    this.source = model;
    this.delegate =
        new SimpleMarkovModel(source.advance().length, source.emissionAlphabet(), "flat");

    // add all the states
    // System.out.println("Adding states");
    Map toM = new HashMap();
    Map inModel = new HashMap();
    Map misStart = new HashMap();
    Map misEnd = new HashMap();
    Map modelStart = new HashMap();
    Map modelEnd = new HashMap();

    for (Iterator i = model.stateAlphabet().iterator(); i.hasNext(); ) {
      State s = (State) i.next();
      if (s instanceof DotState) { // simple dot state in model
        DotStateWrapper dsw = new DotStateWrapper(s);
        addAState(dsw);
        inModel.put(s, model);
        toM.put(s, dsw);
        // System.out.println("Added dot state " + dsw.getName());
      } else if (s instanceof EmissionState) { // simple emission state in model
        if (s instanceof MagicalState) {
          modelStart.put(model, model.magicalState());
          modelEnd.put(model, model.magicalState());
        } else {
          EmissionWrapper esw = new EmissionWrapper((EmissionState) s);
          addAState(esw);
          inModel.put(s, model);
          toM.put(s, esw);
          // System.out.println("Added emission state " + esw.getName());
        }
      } else if (s instanceof ModelInState) { // complex model inside state
        // System.out.println("Adding a model-in-state");
        ModelInState mis = (ModelInState) s;
        MarkovModel flatM = DP.flatView(mis.getModel());

        DotStateWrapper start = new DotStateWrapper(mis, "start");
        DotStateWrapper end = new DotStateWrapper(mis, "end");
        addAState(start);
        addAState(end);
        inModel.put(mis, model);
        modelStart.put(flatM, start);
        modelEnd.put(flatM, end);
        misStart.put(mis, start);
        misEnd.put(mis, end);
        // System.out.println("Added " + start.getName() + " and " + end.getName());

        for (Iterator j = flatM.stateAlphabet().iterator(); j.hasNext(); ) {
          State t = (State) j.next();
          if (t instanceof DotState) {
            DotStateWrapper dsw = new DotStateWrapper(t);
            addAState(dsw);
            inModel.put(t, flatM);
            toM.put(t, dsw);
            toM.put(((Wrapper) t).getWrapped(), dsw);
            // System.out.println("Added wrapped dot state " + dsw.getName());
          } else if (t instanceof EmissionState) {
            if (t instanceof MagicalState) {
              continue;
            }
            EmissionWrapper esw = new EmissionWrapper((EmissionState) t);
            addAState(esw);
            inModel.put(t, flatM);
            toM.put(t, esw);
            // toM.put(((Wrapper) t).getUnprojectedFeatures(), esw);
            // System.out.println("Added wrapped emission state " + esw.getName());
          } else { // unknown eventuality
            throw new IllegalSymbolException(s, "Don't know how to handle state: " + s.getName());
          }
        }
      } else { // unknown eventuality
        throw new IllegalSymbolException(s, "Don't know how to handle state: " + s.getName());
      }
    }

    // wire
    for (Iterator i = delegate.stateAlphabet().iterator(); i.hasNext(); ) {
      State s = (State) i.next();

      State sOrig;
      MarkovModel sModel;

      // System.out.println("Processing transitions from " + s.getName());

      // find underlying state and model for s
      if (s instanceof MagicalState) { // from magic
        sOrig = s;
        sModel = model;
      } else { // from not Magic
        Wrapper swrapper = (Wrapper) s;
        State swrapped = swrapper.getWrapped();
        MarkovModel subModel = (MarkovModel) inModel.get(swrapped);

        if (subModel != model) { // subModel -> *
          sOrig = swrapped;
          sModel = subModel;
        } else if (swrapper instanceof ModelInState) { // mis -> ?
          if (swrapper == modelStart.get(subModel)) { // mis -> subModel
            sModel = ((ModelInState) swrapped).getModel();
            sOrig = sModel.magicalState();
          } else { // mis -> model
            sModel = model;
            sOrig = swrapped;
          }
        } else { // normal
          sModel = model;
          sOrig = s;
        }
      }

      //
      // FIXME -- Matthew broked this...
      //

      TranslatedDistribution dist = null;
      // TranslatedDistribution dist = TranslatedDistribution.getDistribution(
      //  delegate.transitionsFrom(s),
      //  sModel.getWeights(sOrig)
      // );
      SimpleReversibleTranslationTable table = (SimpleReversibleTranslationTable) dist.getTable();
      try {
        delegate.setWeights(s, dist);
      } catch (ChangeVetoException cve) {
        throw new BioError("Couldn't edit delegate model", cve);
      }
      table.setTranslation(s, sOrig);

      // find all reachable states from s
      for (Iterator j = sModel.transitionsFrom(sOrig).iterator(); j.hasNext(); ) {
        State tOrig = (State) j.next();
        State t;
        if (tOrig instanceof MagicalState) { // * -> magic
          if (sModel == model) { // outer -> magic
            t = tOrig;
          } else { // subModel -> magic
            t = (State) modelEnd.get(sModel);
          }
        } else { // * -> normal
          t = (State) toM.get(sOrig);
        }
        table.setTranslation(t, tOrig);
      }
    }
  }
Пример #12
0
 public FiniteAlphabet transitionsTo(State to) throws IllegalSymbolException {
   return delegate.transitionsTo(to);
 }