Example #1
0
 def compute_outside(self, weights, insides, beta=1.):
     outsides = {}
     outsides[id(self)] = 0.
     topological = list(self.bottomup())
     for item in reversed(topological):
         if id(item) not in outsides:
             # not reachable from top
             outsides[id(item)] = cost.IMPOSSIBLE
             continue
         for ded in item.deds:
             if len(ded.ants) == 0:
                 continue
             # p = Pr(ded)
             p = weights.dot(ded.dcost)*beta + outsides[id(item)]
             for ant in ded.ants:
                 p += insides[id(ant)]
             for ant in ded.ants:
                 if id(ant) not in outsides:
                     outsides[id(ant)] = p-insides[id(ant)]
                 else:
                     outsides[id(ant)] = cost.add(outsides[id(ant)], p-insides[id(ant)])
     
     if outsides is None:
         outsides = {}
     if id(self) in outsides:
         return outsides
     inside = cost.IMPOSSIBLE
     for ded in self.deds:
         # beta = 0 => uniform
         c = weights.dot(ded.dcost)*beta
         for ant in ded.ants:
             ant.compute_inside(weights, insides)
             c += insides[id(ant)]
         insides[id(ded)] = c
         inside = cost.add(inside, c)
     insides[id(self)] = inside
     return insides
Example #2
0
 def compute_inside(self, weights, insides=None, beta=1.):
     if insides is None:
         insides = {}
     if id(self) in insides:
         return insides
     inside = cost.IMPOSSIBLE
     for ded in self.deds:
         # beta = 0 => uniform
         c = weights.dot(ded.dcost)*beta
         for ant in ded.ants:
             ant.compute_inside(weights, insides)
             c += insides[id(ant)]
         insides[id(ded)] = c
         inside = cost.add(inside, c)
     insides[id(self)] = inside
     return insides
Example #3
0
 def compute_inside(self, weights, insides=None, beta=1.):
     if insides is None:
         insides = {}
     if id(self) in insides:
         return insides
     inside = cost.IMPOSSIBLE
     for ded in self.deds:
         # beta = 0 => uniform
         c = weights.dot(ded.dcost) * beta
         for ant in ded.ants:
             ant.compute_inside(weights, insides)
             c += insides[id(ant)]
         insides[id(ded)] = c
         inside = cost.add(inside, c)
     insides[id(self)] = inside
     return insides
Example #4
0
def compute_outside(chart):
    # chart is list of items, axiom first, goal last
    # requires inside probs

    for item in chart:
        item.outside = None
    chart[-1].outside = 0.0

    for item in reversed(chart):
        if item.outside is None:
            item.outside = cost.IMPOSSIBLE
            continue
        for ded in item.deds:
           if len(ded.ants) > 0:
                p = ded.dcost + item.outside
                for ant in ded.ants:
                    p += ant.inside
                for ant in ded.ants:
                    if ant.outside is None:
                        ant.outside = p-ant.inside
                    else:
                        ant.outside = cost.add(ant.outside,p-ant.inside)
Example #5
0
    def compute_outside(self, weights, insides, beta=1.):
        outsides = {}
        outsides[id(self)] = 0.
        topological = list(self.bottomup())
        for item in reversed(topological):
            if id(item) not in outsides:
                # not reachable from top
                outsides[id(item)] = cost.IMPOSSIBLE
                continue
            for ded in item.deds:
                if len(ded.ants) == 0:
                    continue
                # p = Pr(ded)
                p = weights.dot(ded.dcost)*beta + outsides[id(item)]
                for ant in ded.ants:
                    p += insides[id(ant)]
                for ant in ded.ants:
                    if id(ant) not in outsides:
                        outsides[id(ant)] = p-insides[id(ant)]
                    else:
                        outsides[id(ant)] = cost.add(outsides[id(ant)], p-insides[id(ant)])

        return outsides
Example #6
0
    def compute_outside(self, weights, insides, beta=1.):
        outsides = {}
        outsides[id(self)] = 0.
        topological = list(self.bottomup())
        for item in reversed(topological):
            if id(item) not in outsides:
                # not reachable from top
                outsides[id(item)] = cost.IMPOSSIBLE
                continue
            for ded in item.deds:
                if len(ded.ants) == 0:
                    continue
                # p = Pr(ded)
                p = weights.dot(ded.dcost) * beta + outsides[id(item)]
                for ant in ded.ants:
                    p += insides[id(ant)]
                for ant in ded.ants:
                    if id(ant) not in outsides:
                        outsides[id(ant)] = p - insides[id(ant)]
                    else:
                        outsides[id(ant)] = cost.add(outsides[id(ant)],
                                                     p - insides[id(ant)])

        return outsides