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
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
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
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)
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
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