package edu.stanford.nlp.sempre; import java.util.*; /** * Utilities for floating rules. */ public final class FloatingRuleUtils { private FloatingRuleUtils() { } // Should not be called. /** * Get the anchored sub-derivations (sub-trees) of a derivation. * I.e., gets all sub-derivations that are associated with a span of the utterance. */ public static List<Derivation> getDerivationAnchors(Derivation deriv) { List<Derivation> anchors = new ArrayList<>(); if (deriv.rule.isAnchored()) { // if the sub-derivation is anchored to a span just add it anchors.add(deriv); } else if (!(deriv.children == null || deriv.children.size() == 0)) { // if the derivation is not anchored but has children, recurse into children for (Derivation child : deriv.children) anchors.addAll(getDerivationAnchors(child)); } return anchors; } /** * Helper function to ensure that anchored spans are only used once in a final derivation. * for example if A spans (or has a child that spans) [0, 3] and B spans (or has a child * that spans) [2, 4] then we have an overlap. */ public static boolean derivationAnchorsOverlap(Derivation a, Derivation b) { boolean[] aAnchors = a.getAnchoredTokens(), bAnchors = b.getAnchoredTokens(); for (int i = 0; i < aAnchors.length && i < bAnchors.length; i++) if (aAnchors[i] && bAnchors[i]) return true; return false; } public static int maxNumAnchorOverlaps(Derivation a, Derivation b) { int[] aAnchors = a.getNumAnchors(), bAnchors = b.getNumAnchors(); int n = Math.max(aAnchors.length, bAnchors.length); int maxAnchors = 0; for (int i = 0; i < n; i++) maxAnchors = Math.max(maxAnchors, (i < aAnchors.length ? aAnchors[i] : 0) + (i < bAnchors.length ? bAnchors[i] : 0)); return maxAnchors; } }