def __init__(self, span, lhs, rhs, dot=0, bindings=None):
        """
        Construct a new edge.  If the edge is incomplete (i.e., if
        ``dot<len(rhs)``), then store the bindings as-is.  If the edge
        is complete (i.e., if ``dot==len(rhs)``), then apply the
        bindings to all nonterminals in ``lhs`` and ``rhs``, and then
        clear the bindings.  See ``TreeEdge`` for a description of
        the other arguments.
        """
        if bindings is None: bindings = {}

        # If the edge is complete, then substitute in the bindings,
        # and then throw them away.  (If we didn't throw them away, we
        # might think that 2 complete edges are different just because
        # they have different bindings, even though all bindings have
        # already been applied.)
        if dot == len(rhs) and bindings:
            lhs = self._bind(lhs, bindings)
            rhs = [self._bind(elt, bindings) for elt in rhs]
            bindings = {}

        # Initialize the edge.
        TreeEdge.__init__(self, span, lhs, rhs, dot)
        self._bindings = bindings
        self._comparison_key = (self._comparison_key, tuple(sorted(bindings.items())))
Beispiel #2
0
    def __init__(self, span, lhs, rhs, dot=0, bindings=None):
        """
        Construct a new edge.  If the edge is incomplete (i.e., if
        ``dot<len(rhs)``), then store the bindings as-is.  If the edge
        is complete (i.e., if ``dot==len(rhs)``), then apply the
        bindings to all nonterminals in ``lhs`` and ``rhs``, and then
        clear the bindings.  See ``TreeEdge`` for a description of
        the other arguments.
        """
        if bindings is None: bindings = {}

        # If the edge is complete, then substitute in the bindings,
        # and then throw them away.  (If we didn't throw them away, we
        # might think that 2 complete edges are different just because
        # they have different bindings, even though all bindings have
        # already been applied.)
        if dot == len(rhs) and bindings:
            lhs = self._bind(lhs, bindings)
            rhs = [self._bind(elt, bindings) for elt in rhs]
            bindings = {}

        # Initialize the edge.
        TreeEdge.__init__(self, span, lhs, rhs, dot)
        self._bindings = bindings
        self._comparison_key = (self._comparison_key,
                                tuple(sorted(bindings.items())))
 def __str__(self):
     if self.is_complete():
         return TreeEdge.__unicode__(self)
     else:
         bindings = '{%s}' % ', '.join('%s: %r' % item for item in
                                        sorted(self._bindings.items()))
         return '%s %s' % (TreeEdge.__unicode__(self), bindings)
Beispiel #4
0
 def __str__(self):
     if self.is_complete():
         return TreeEdge.__unicode__(self)
     else:
         bindings = '{%s}' % ', '.join(
             '%s: %r' % item for item in sorted(self._bindings.items()))
         return '%s %s' % (TreeEdge.__unicode__(self), bindings)
Beispiel #5
0
 def apply_iter(self, chart, grammar, right_edge):
     if (right_edge.is_incomplete() or       # use only completed edges
         isinstance(right_edge, LeafEdge) or # skip terminal leaves
         is_lexical(right_edge) or           # skip lexical productions
         right_edge.lhs().symbol() == 'G'):  # skip BRM rules
         return
     # We only merge if both the right end left edge are completed. The
     # left edge must be adjacent to the right edge in the chart.
     for left_edge in chart.select(end=right_edge.start(), is_complete=True):
         if isinstance(left_edge, LeafEdge) or is_lexical(left_edge):
             continue
         new_edge = TreeEdge(span=(left_edge.start(), right_edge.end()),
                             lhs=right_edge.lhs(),
                             rhs=[left_edge.lhs(), right_edge.lhs()],
                             dot=2) # edge is completed at initialization
         if chart.insert(new_edge, (left_edge, right_edge)):
             yield new_edge
Beispiel #6
0
 def __init__(self, prob, *args, **kwargs):
     TreeEdge.__init__(self, *args, **kwargs)
     self._prob = prob
     # two edges with different probabilities are not equal.
     self._comparison_key = (self._comparison_key, prob)
Beispiel #7
0
 def __init__(self, prob, *args, **kwargs):
     TreeEdge.__init__(self, *args, **kwargs)
     self._prob = prob
     # two edges with different probabilities are not equal.
     self._comparison_key = (self._comparison_key, prob)
Beispiel #8
0
 def __cmp__(self, other):
     if self._prob != other.prob(): return -1
     return TreeEdge.__cmp__(self, other)
Beispiel #9
0
 def __init__(self, prob, *args, **kwargs):
     self._prob = prob
     TreeEdge.__init__(self, *args, **kwargs)
Beispiel #10
0
 def __str__(self):
     if self.is_complete():
         return TreeEdge.__unicode__(self)
     else:
         bindings = "{%s}" % ", ".join("%s: %r" % item for item in sorted(self._bindings.items()))
         return "%s %s" % (TreeEdge.__unicode__(self), bindings)
Beispiel #11
0
 def __cmp__(self, other):
     if self._prob != other.prob(): return -1
     return TreeEdge.__cmp__(self, other)
Beispiel #12
0
 def __init__(self, prob, *args, **kwargs):
     self._prob = prob
     TreeEdge.__init__(self, *args, **kwargs)