public FiniteAlphabet stateAlphabet() { return delegate.stateAlphabet(); }
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); } } }