/** * */ package edu.berkeley.nlp.PCFGLA; import edu.berkeley.nlp.PCFGLA.smoothing.Smoother; import edu.berkeley.nlp.syntax.Trees.PennTreeRenderer; import edu.berkeley.nlp.util.PriorityQueue; /** * @author petrov * */ public class HierarchicalAdaptiveGrammar extends HierarchicalGrammar { private static final long serialVersionUID = 1L; public HierarchicalAdaptiveGrammar(short[] nSubStates, boolean findClosedPaths, Smoother smoother, Grammar oldGrammar, double thresh) { super(nSubStates, findClosedPaths, smoother, oldGrammar, thresh); } public HierarchicalAdaptiveGrammar(Grammar gr){ super(gr.numSubStates,gr.findClosedPaths,gr.smoother,gr,gr.threshold); for (BinaryRule oldRule : gr.binaryRuleMap.keySet()) { HierarchicalAdaptiveBinaryRule newRule = new HierarchicalAdaptiveBinaryRule(oldRule); addBinary(newRule); } for (UnaryRule oldRule : gr.unaryRuleMap.keySet()) { HierarchicalAdaptiveUnaryRule newRule = new HierarchicalAdaptiveUnaryRule(oldRule); addUnary(newRule); } if (true) { closedSumRulesWithParent = closedViterbiRulesWithParent = unaryRulesWithParent; closedSumRulesWithChild = closedViterbiRulesWithChild = unaryRulesWithC; } else computePairsOfUnaries(); makeCRArrays(); isGrammarTag = gr.isGrammarTag; } public HierarchicalAdaptiveGrammar newInstance(short[] newNumSubStates) { return new HierarchicalAdaptiveGrammar(newNumSubStates,this.findClosedPaths,this.smoother,this,this.threshold); } void printLevelCounts(){ int nBinaryParams=0, nUnaryParams=0, nBinaryFringeParams=0, nUnaryFringeParams=0; PriorityQueue<HierarchicalAdaptiveBinaryRule> pQb = new PriorityQueue<HierarchicalAdaptiveBinaryRule>(); PriorityQueue<HierarchicalAdaptiveUnaryRule> pQu = new PriorityQueue<HierarchicalAdaptiveUnaryRule>(); for (int state = 0; state < numStates; state++) { int[] counts = new int[8]; BinaryRule[] parentRules = this.splitRulesWithP(state); if (parentRules.length==0) continue; double totalParamState =0, totalRulesState = 0; for (int i = 0; i < parentRules.length; i++) { HierarchicalAdaptiveBinaryRule r =(HierarchicalAdaptiveBinaryRule)parentRules[i]; // PennTreeRenderer.render(r.hierarchy); counts[r.hierarchy.getDepth()]++; nBinaryParams += r.countNonZeroFeatures(); int n = r.countNonZeroFringeFeatures(); nBinaryFringeParams += n; pQb.add(r,n); totalParamState+=n; totalRulesState++; } System.out.print(tagNumberer.object(state)+", binary rules per level: "); for (int i=1; i<8; i++){ System.out.print(counts[i]+" "); } System.out.print(" with \n "+tagNumberer.object(state)+"\t"+ totalParamState/totalRulesState +"\n parameters on average :'\n"); } // for (int i=0; i<6; i++){ // System.out.println(counts[i]+" binary rules are split upto level "+i); // counts[i] = 0; // } for (int state = 0; state < numStates; state++) { int[] counts = new int[8]; UnaryRule[] unaries = this.getClosedSumUnaryRulesByParent(state); //this.getClosedSumUnaryRulesByParent(state);// if (unaries.length==0) continue; for (int r = 0; r < unaries.length; r++) { HierarchicalAdaptiveUnaryRule ur =(HierarchicalAdaptiveUnaryRule)unaries[r]; // ur.toString(); // PennTreeRenderer.render(ur.hierarchy); counts[ur.hierarchy.getDepth()]++; nUnaryParams += ur.countNonZeroFeatures(); int n = ur.countNonZeroFringeFeatures(); nUnaryFringeParams += n; // totalParamState+=n; // totalRulesState++; pQu.add(ur,n); } System.out.print(tagNumberer.object(state)+", unary rules per level: "); for (int i=1; i<8; i++){ System.out.print(counts[i]+" "); } System.out.print("\n"); } System.out.println("There are "+nBinaryParams+" binary features, of which "+ nBinaryFringeParams+" are on the fringe."); System.out.println("There are "+nUnaryParams+" unary features, of which "+ nUnaryFringeParams+" are on the fringe."); System.out.println("There are "+(nBinaryParams+nUnaryParams)+" total features, of which "+ (nBinaryFringeParams+nUnaryFringeParams)+" are on the fringe."); while (pQb.hasNext()){ HierarchicalAdaptiveBinaryRule r = pQb.next(); System.out.println(r.toStringShort()+"\t"+r.countNonZeroFringeFeatures()); } while (pQu.hasNext()){ HierarchicalAdaptiveUnaryRule r = pQu.next(); System.out.println(r.toStringShort()+"\t"+r.countNonZeroFringeFeatures()); } // for (int i=0; i<6; i++){ // System.out.println(counts[i]+" unary rules are split upto level "+i); // } } }