Example usage for edu.stanford.nlp.util BinaryHeapPriorityQueue BinaryHeapPriorityQueue

List of usage examples for edu.stanford.nlp.util BinaryHeapPriorityQueue BinaryHeapPriorityQueue

Introduction

In this page you can find the example usage for edu.stanford.nlp.util BinaryHeapPriorityQueue BinaryHeapPriorityQueue.

Prototype

public BinaryHeapPriorityQueue() 

Source Link

Usage

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;
}