List of usage examples for edu.stanford.nlp.util BinaryHeapPriorityQueue BinaryHeapPriorityQueue
public BinaryHeapPriorityQueue()
From source file:conditionalCFG.ConditionalCFGParser.java
License:Open Source License
private PriorityQueue<Derivation> getCandidates(Vertex v, int k) { PriorityQueue<Derivation> candV = cand.get(v); if (candV == null) { candV = new BinaryHeapPriorityQueue<Derivation>(); List<Arc> bsV = getBackwardsStar(v); for (Arc arc : bsV) { int size = arc.size(); double score = arc.ruleScore; List<Double> childrenScores = new ArrayList<Double>(); for (int i = 0; i < size; i++) { Vertex child = arc.tails.get(i); double s = iScore[child.start][child.end][child.goal]; childrenScores.add(s);// www .j ava 2 s. c o m score += s; } if (score == Double.NEGATIVE_INFINITY) { continue; } List<Integer> j = new ArrayList<Integer>(); for (int i = 0; i < size; i++) { j.add(1); } Derivation d = new Derivation(arc, j, score, childrenScores); candV.add(d, score); } PriorityQueue<Derivation> tmp = new BinaryHeapPriorityQueue<Derivation>(); for (int i = 0; i < k; i++) { if (candV.isEmpty()) { break; } Derivation d = candV.removeFirst(); tmp.add(d, d.score); } candV = tmp; cand.put(v, candV); } return candV; }
From source file:de.up.ling.irtg.automata.condensed.CondensedBestFirstIntersectionAutomaton.java
@Override public void makeAllRulesExplicit() { if (!isExplicit) { isExplicit = true;/*from www .ja v a2 s .c om*/ getStateInterner().setTrustingMode(true); right.makeAllRulesCondensedExplicit(); BinaryHeapPriorityQueue<Integer> agenda = new BinaryHeapPriorityQueue<>(); IntSet seenStates = new IntOpenHashSet(); // all states that have ever been added to the agenda IntSet removedStates = new IntOpenHashSet(); // all states that have ever been dequeued from the agenda // initialize agenda with nullary rules int[] emptyChildren = new int[0]; for (CondensedRule rightRule : right.getCondensedRulesBottomUpFromExplicit(emptyChildren)) { // System.err.println("right: " + rightRule.toString(right)); IntSet rightLabels = rightRule.getLabels(right); for (int rightLabel : rightLabels) { int leftLabel = leftToRightSignatureMapper.remapBackward(rightLabel); for (Rule leftRule : left.getRulesBottomUp(leftLabel, emptyChildren)) { // System.err.println("left: " + leftRule.toString(left)); Rule rule = combineRules(leftRule, rightRule); storeRule(rule); if (Math.log(rule.getWeight()) > viterbiScore.getOrDefault(rule.getParent(), Double.NEGATIVE_INFINITY)) { viterbiScore.put(rule.getParent(), Math.log(rule.getWeight())); } double estimate = edgeEvaluator.evaluate(leftRule.getParent(), rightRule.getParent(), rule.getWeight()); agenda.add(rule.getParent(), estimate); seenStates.add(rule.getParent()); // System.err.println("Addding " + rule.getParent() + " with estimate " + estimate); } } } // iterate until agenda is empty List<IntSet> remappedChildren = new ArrayList<IntSet>(); while (!agenda.isEmpty()) { int statePairID = agenda.removeFirst(); int rightState = stateToRightState.get(statePairID); int leftState = stateToLeftState.get(statePairID); // register statePairID as "removed from agenda" removedStates.add(statePairID); // If left & right state are final, leave the loop. if (right.getFinalStates().contains(rightState) && left.getFinalStates().contains(leftState)) { break; } rightRuleLoop: for (CondensedRule rightRule : right.getCondensedRulesForRhsState(rightState)) { remappedChildren.clear(); // iterate over all children in the right rule for (int i = 0; i < rightRule.getArity(); ++i) { IntSet partners = getPartners(rightRule.getChildren()[i]); if (partners == null) { continue rightRuleLoop; } else { remappedChildren.add(new IntArraySet(partners)); //!(1) Make a copy of partners, it could be changed while iterating over it } } left.foreachRuleBottomUpForSets(rightRule.getLabels(right), remappedChildren, leftToRightSignatureMapper, leftRule -> { Rule rule = combineRules(leftRule, rightRule); //!(1) 'partners' could be changed here (-> addStatePair) storeRule(rule); double insideScore = Math.log(rule.getWeight()); for (int child : rule.getChildren()) { assert viterbiScore.containsKey(child); insideScore += viterbiScore.get(child); } double estimate = edgeEvaluator.evaluate(leftRule.getParent(), rightRule.getParent(), insideScore); // Update viterbi score if needed if (insideScore > viterbiScore.getOrDefault(rule.getParent(), Double.NEGATIVE_INFINITY)) { viterbiScore.put(rule.getParent(), insideScore); } // add new parent state to chart seenStates.add(rule.getParent()); // if parent state is new or still on the agenda, // give it a chance to move closer to the front of the agenda if (!removedStates.contains(rule.getParent())) { agenda.relaxPriority(rule.getParent(), estimate); } }); } } finalStates = null; } }
From source file:de.up.ling.stud.astar.astarParser.java
public Tree<String> parse(List<String> words, Pcfg grammar) { /*//w w w . java 2s. c o m Set up variables */ agenda = new BinaryHeapPriorityQueue<>(); seenItemsByEndPosition = new Int2ObjectOpenHashMap<>(); seenItemsByEndPosition.defaultReturnValue(new ArrayList<>()); seenItemsByStartPosition = new Int2ObjectOpenHashMap<>(); seenItemsByStartPosition.defaultReturnValue(new ArrayList<>()); completedEdges = new LongOpenHashSet(); edgeStorage = new ArrayList<>(); insideMap = new Long2DoubleOpenHashMap(); insideMap.defaultReturnValue(Double.NEGATIVE_INFINITY); pcfg = grammar; signature = pcfg.getSignature(); n = words.size(); summarizer = new SXEstimate(pcfg); /* Create startitems */ for (int i = 0; i < n; i++) { int[] rhs = new int[1]; rhs[0] = signature.getIdforSymbol(words.get(i)); // System.err.println("Current word: " + words.get(i) + "\twith ID: "+ rhs[0]); boolean found = false; for (Rule r : pcfg.getRules(rhs)) { found = true; Edge edge = new Edge(r.getLhs(), i, i + 1, null, null); double inside = Math.log(r.getProb()); double outsideEstimate = summarizer.evaluate(edge, words); updateInside(edge, inside); enqueue(edge, inside + outsideEstimate); } System.err.println(found ? "Found! " : "Not found..."); } /* Main loop */ int edgeCounter = 0; while (!agenda.isEmpty()) { ++edgeCounter; if (flush()) break; Edge item = dequeue(); // System.err.println("Current Item: " + item.toStringReadable(signature)); seenItemsByEndPosition.get(item.getBegin()).stream().forEach((candidate) -> { int[] rhs = new int[2]; rhs[0] = candidate.getSymbol(); rhs[1] = item.getSymbol(); pcfg.getRules(rhs).stream().forEach((r) -> { Edge edge = new Edge(r.getLhs(), candidate.getBegin(), item.getEnd(), candidate, item); if (!completedEdges.contains(edge.asLongEncoding())) { double insideLeft = getInside(candidate); double insideRight = getInside(item); double newInside = insideLeft + insideRight + Math.log(r.getProb()); double outsideEstimate = summarizer.evaluate(edge, words); updateInside(edge, newInside); enqueue(edge, newInside + outsideEstimate); } }); }); seenItemsByStartPosition.get(item.getEnd()).stream().forEach((candidate) -> { int[] rhs = new int[2]; rhs[0] = item.getSymbol(); rhs[1] = candidate.getSymbol(); pcfg.getRules(rhs).stream().forEach((r) -> { Edge edge = new Edge(r.getLhs(), item.getBegin(), candidate.getEnd(), item, candidate); if (!completedEdges.contains(edge.asLongEncoding())) { double insideLeft = getInside(item); double insideRight = getInside(candidate); double newInside = insideLeft + insideRight + Math.log(r.getProb()); double outsideEstimate = summarizer.evaluate(edge, words); updateInside(edge, newInside); enqueue(edge, newInside + outsideEstimate); } }); }); } // System.err.println("Edges: " + edgeCounter); // Find final item and create a parse tree for (Edge finalItem : seenItemsByEndPosition.get(n)) { if (isStartItem(finalItem)) { return createParseTree(finalItem); } } return null; }