public Matrix left_smooth(Matrix eigenFeatDict, ArrayList<Integer> doc){
		double[][] L=new double[doc.size()][_smooths.size()*_num_hidden];
		double[][] smoothedStateofToken=new double[1][_smooths.size()*_num_hidden];
		double[][] smoothedStateofTokenCopy=new double[1][_smooths.size()*_num_hidden];
		
//		System.out.println("Doc Size, #sent, #tok="+doc.size()+" "+doc.getNumSentences()+" "+doc.getNumTokens());
		Matrix LMatrix= new Matrix(L); 
		Matrix smoothedStateofTokenMatrix; 
		int tok_idx=1;
		
		while(tok_idx<doc.size()){
			//Token tok=doc.get(tok_idx++);
			//assert counter== tok_idx;
			if (tok_idx==1){
				smoothedStateofTokenCopy=getStateforToken(eigenFeatDict,doc.get(tok_idx-1));//s1=x0
				for (int idx=0; idx<_smooths.size();idx++){
					for (int k=0;k<_num_hidden;k++)
						smoothedStateofToken[0][idx*_num_hidden+k]= smoothedStateofTokenCopy[0][k];
				}
				smoothedStateofTokenMatrix= new Matrix(smoothedStateofToken); 
			}
			else{
				smoothedStateofToken=getNextStateSmoothed(smoothedStateofToken,getStateforToken(eigenFeatDict,doc.get(tok_idx-1)));
				smoothedStateofTokenMatrix= new Matrix(smoothedStateofToken); 
			}
			
			
			LMatrix.setMatrix(tok_idx, tok_idx, 0, LMatrix.getColumnDimension()-1, smoothedStateofTokenMatrix);
			tok_idx++;
		}
		return LMatrix;
	}