code: ///**
  // * 
  // */
  //package edu.berkeley.nlp.PCFGLA;
  //
  //import java.util.List;
  //import java.util.Random;
  //
  //import edu.berkeley.nlp.auxv.AuxVarInsideOutside;
  //import edu.berkeley.nlp.auxv.SuffStat;
  //import edu.berkeley.nlp.auxv.AuxVarInsideOutside.BottleNeckTimerMonitor;
  //import edu.berkeley.nlp.auxv.AuxVarInsideOutside.Choke;
  //import edu.berkeley.nlp.auxv.AuxVarInsideOutside.IterManager;
  //import edu.berkeley.nlp.auxv.bractrl.BracketNumberController;
  //import edu.berkeley.nlp.auxv.bractrl.BracketNumberControllers;
  //import edu.berkeley.nlp.auxv.bractrl.BracketsFromGoldTree;
  //import edu.berkeley.nlp.auxv.bractrl.InformedBracketProposer;
  //import edu.berkeley.nlp.syntax.StateSet;
  //import edu.berkeley.nlp.syntax.Tree;
  //import edu.berkeley.nlp.math.SloppyMath;
  //import fig.basic.Option;
  //
  ///**
  // * @author petrov
  // *
  // */
  //public class SamplingParser extends DoublyConstrainedTwoChartsParser {
  //
  //	AuxVarInsideOutside auxVarInsideOutside;
  //	BracketNumberController bnc;
  //	
  //
  //	// TODO: should be make non-static
  //	@Option public static double ratioItersToBras = 9.0;
  //	@Option public static double ratioBurnInToIters = 0.2; 
  //	@Option public static double minActiveRatio = 0.5;
  //	
  //
  //	Random rand = GrammarTrainer.RANDOM;
  //
  //	public SamplingParser(Grammar gr, Lexicon lex) { 
  //		super(gr, lex);
  //		bnc = BracketNumberControllers.instance.newBracketNumberController();
  //	}
  //	
  //	public int initialNBrackets(Random rand, List<String> sentence)
  //	{
  //		return bnc.initialNumberOfBrackets(rand, sentence);
  //	}
  //	
  //	/**
  //	 * Throws MeasureZeroException if on measure zero
  //	 * in this case, suff stat are left untouched
  //	 * @param sentence
  //	 * @param finalSuffStats
  //	 * @param goldTree
  //	 * @return
  //	 */
  //	public double computeExpectedCounts(List<String> sentence, SuffStat finalSuffStats, Tree<StateSet> goldTree){
  //		
  //    BracketsFromGoldTree prop = new BracketsFromGoldTree(goldTree);
  //    IterManager iterManager = new IterManager(initialNBrackets(rand, sentence), 
  //    		ratioItersToBras, ratioBurnInToIters);
  //		auxVarInsideOutside = new AuxVarInsideOutside(this, prop, 
  //        bnc, iterManager, rand);
  //		Choke choke = new Choke(minActiveRatio);
  //		
  //		BottleNeckTimerMonitor bnt = new AuxVarInsideOutside.BottleNeckTimerMonitor();
  //		auxVarInsideOutside.setMonitor(bnt);
  //		
  //		SuffStat tempSuffStat = finalSuffStats.newInstance();
  //		long start = System.currentTimeMillis();
  //		auxVarInsideOutside.compute(sentence, tempSuffStat, goldTree, choke);
  //		long stop = System.currentTimeMillis();
  //		System.out.println("Time for approx:" + (stop - start));
  //		System.out.println("Bottleneck exact time: " + bnt.totalTimeCallingExact);
  //		System.out.println("Longest iteration time: " + bnt.maxTimeCallingExact);
  //		System.out.println("Shortest iteration time: " + bnt.minTimeCallingExact);
  //		double posteriorDerivationLogPr = auxVarInsideOutside.posteriorDerivationLogPr();
  //		if (SloppyMath.isVeryDangerous(posteriorDerivationLogPr)) //posteriorDerivationLogPr == Double.NEGATIVE_INFINITY)
  //			throw new MeasureZeroException();
  //		finalSuffStats.add(tempSuffStat);
  //		System.out.println("Current cheat ratio: " + choke.cheatRatio());
  //		return posteriorDerivationLogPr;
  //	}
  //	
  //	public static class MeasureZeroException extends RuntimeException {
  //		private static final long serialVersionUID = 1L;
  //	}
  // }
  