NullPointerException in Hidden Markov Model

Hashem Koohy <[email protected]>
Newsgroups gmane.comp.java.bio.general
Message-ID <CA9F60A4.1D02%[email protected]>
Hi,
I have set up a HMM model and I am trying to get the viterbi path printed
out, instead I get the following error message. I feel it must be some thing
silly but I cannot  spot it. I really appreciate any clue.


Exception in thread "main" java.lang.NullPointerException
    at org.biojava.bio.dp.onehead.SingleDP.viterbi(SingleDP.java:648)
    at org.biojava.bio.dp.onehead.SingleDP.viterbi(SingleDP.java:512)
    at hmmwithdirichletprior.VITERBI2.main(VITERBI2.java:188)




This is how I call my HMM model from main function:


            MarkovModel mm = block.makeMarkovModel(observedSeqAlphabet,
tranProb, strProb, statesAndDirPar, "dirichletMM");
             DP dp    = new SingleDP(mm);
            SymbolList [] symList = {symbolList};
            StatePath viterbiPath = dp.viterbi(symList,
ScoreType.PROBABILITY);

And here is my makeMarkovModel method:


        private static MarkovModel makeMarkovModel(
                SimpleAlphabet alphabet,  double [][] transitionMatrix,
double [] startProbabilities, LinkedHashMap<String ,
                double []> statesAndCorresponingDirichletParameters, String
modelName ) throws Exception{
            
            SimpleMarkovModel mm  = new SimpleMarkovModel(1, alphabet,
modelName );
            int [] advance = { 1 };
            
            int numberOfStates =
statesAndCorresponingDirichletParameters.size();
            ArrayList<String > stateNames = new ArrayList<String>();
            ArrayList<double []> arraysOfDirichletParameters = new
ArrayList<double []>();
            
            for(Map.Entry<String, double[]>
me:statesAndCorresponingDirichletParameters.entrySet() ){
                double oneDirichletPar [] = me.getValue();
                arraysOfDirichletParameters.add(oneDirichletPar);
                String oneState           = me.getKey();
                stateNames.add(oneState);
            }
                   
            //Distribution initiation
            Distribution     [] dists          = new
Distribution[numberOfStates];
            EmissionState   [] emissionStates = new
SimpleEmissionState[numberOfStates];
            
            for(int i = 0; i< numberOfStates;i++){
                dists[i] =
DistributionFactory.DEFAULT.createDistribution(alphabet);
                String oneState = stateNames.get(i);
                emissionStates[i] =  new SimpleEmissionState(oneState,
Annotation.EMPTY_ANNOTATION,advance,dists[i] );
            }
            
            //add states to the model
            for(State s:emissionStates ){
                try{
                    mm.addState(s);
                }
                catch(Exception e){
                    throw new Exception("Can't add states to model!");
                }
            }
            
            
            //create transitions
            State magic = mm.magicalState();
            for(State i:emissionStates ){
                mm.createTransition(magic, i);
                for(State j: emissionStates){
                    mm.createTransition(i, j);
                }
            }
            
            //set up emission scores
            for(Iterator<?> i = alphabet.iterator(); i.hasNext();){
                AtomicSymbol oneSym = (AtomicSymbol) i.next();
                double [] symbolsInThisSymbolAsArrayOfDoubles =
makeArrayOfDoublesFromASymbol(oneSym);
                for(int d =0 ; d< dists.length; d++){
                    double dirichletPar [] =
arraysOfDirichletParameters.get(d);
                    double oneDensity         =
DirichletDist.density(dirichletPar, symbolsInThisSymbolAsArrayOfDoubles);
                    dists[d].setWeight(oneSym,oneDensity );
                   
                }
            }
            
                //set  transition scores
                Distribution transDist;
                
                //magical to others
                transDist = mm.getWeights(mm.magicalState());
                for(int i=0; i<emissionStates.length; i++){
                    transDist.setWeight(emissionStates[i],
startProbabilities[i]);
                }
                
                //from each state to others
                for(int i =0; i<emissionStates.length;i++){
                    transDist = mm.getWeights(emissionStates[i]);
                    transDist.setWeight(emissionStates[i],
transitionMatrix[i][i]);
                    for(int j =0; j<emissionStates.length; j++){
                        if(i !=j){
                            transDist.setWeight(emissionStates[j],
transitionMatrix[i][j]);
                        }
                    }
                }  
            System.out.println("One HMM set up!");
            return mm;
        }/*makeMarkovModel*/



In the mailing list I see Thomas Covello posted similar problem on May 2009
but don¹t see any treat to it.
Thanks 
Hashem
-------------------------------
Hashem Koohy
PhD
Postdoctoral Fellow,
Sanger Institute,
Cambridge
Mobile: 07515425433





-- 
 The Wellcome Trust Sanger Institute is operated by Genome Research 
 Limited, a charity registered in England with number 1021457 and a 
 company registered in England with number 2742969, whose registered 
 office is 215 Euston Road, London, NW1 2BE. 


_______________________________________________
Biojava-l mailing list  -  [email protected]
http://lists.open-bio.org/mailman/listinfo/biojava-l
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.