def __init__(self, semiring_const2semiring_obj): GKPrologVisitorAtoms.__init__(self) self.pred2update_type = {} self.weight_manager = WeightManager(self.pred2semiring) if not isinstance(semiring_const2semiring_obj, dict): raise TypeError for semiring_const, semiring_obj in semiring_const2semiring_obj.iteritems(): if not isinstance(semiring_obj, Semiring): raise ValueError, "wrong object type for the semiring {} --> {}".format(semiring_const, str(type(semiring_obj))) self.semiring_const2semiring_obj = semiring_const2semiring_obj
class GKPrologVisitorPredicateDeclarations(GKPrologVisitorAtoms): def __init__(self, semiring_const2semiring_obj): GKPrologVisitorAtoms.__init__(self) self.pred2update_type = {} self.weight_manager = WeightManager(self.pred2semiring) if not isinstance(semiring_const2semiring_obj, dict): raise TypeError for semiring_const, semiring_obj in semiring_const2semiring_obj.iteritems(): if not isinstance(semiring_obj, Semiring): raise ValueError, "wrong object type for the semiring {} --> {}".format(semiring_const, str(type(semiring_obj))) self.semiring_const2semiring_obj = semiring_const2semiring_obj def resolve_semiring(self, semiring_const): return self.semiring_const2semiring_obj[str(semiring_const)] def register_weighted_fact(self, weighted_fact): if not isinstance(weighted_fact, WeightedFact): raise TypeError self.weight_manager.set_weight(weighted_fact.atom, weighted_fact.weight) def transform_weighted_rule(self, weighted_rule): if not isinstance(weighted_rule, WeightedRule): raise TypeError head_predicate = weighted_rule.head.predicate bogus_atom = self.create_bogus_atom(head_predicate) bogus_weighted_fact = WeightedFact(weighted_rule.weight, bogus_atom) self.register_weighted_fact(bogus_weighted_fact) new_body = (bogus_atom,) + weighted_rule.body head = weighted_rule.head return Rule(head, new_body) # Visit a parse tree produced by GKPrologParser#Rule. def visitRule(self, ctx): head = self.visit(ctx.atom()) body = self.visit(ctx.body_atom_list()) return Rule(head, body) # Visit a parse tree produced by GKPrologParser#WeightedRule. def visitWeightedRule(self, ctx): head_term = self.visit(ctx.atom()) body = self.visit(ctx.body_atom_list()) weight_term = self.visit(ctx.algebraic_weight()) head, weight = self.pred2semiring[head_term.predicate].parse(head_term, weight_term) # XXX SEMIRING PARSED RULE res = WeightedRule(weight, head, body) res = self.transform_weighted_rule(res) return res # Visit a parse tree produced by GKPrologParser#Fact. def visitFact(self, ctx): atom = self.visit(ctx.atom()) weight = self.pred2semiring[atom.predicate].one() res = WeightedFact(weight, atom) self.register_weighted_fact(res) return Fact(atom) # Visit a parse tree produced by GKPrologParser#WeightedFact. def visitWeightedFact(self, ctx): atom_term = self.visit(ctx.atom()) weight_term = self.visit(ctx.algebraic_weight()) atom, weight = self.pred2semiring[atom_term.predicate].parse(atom_term, weight_term) res = WeightedFact(weight, atom) self.register_weighted_fact(res) return Fact(atom) def registerTypeDeclaration(self, ctx): pred_name = self.visit(ctx.predicate_name()) pred_arity = int(ctx.INT_ID().getText()) semiring_type = self.visit(ctx.semiring_type()) semiring_type = str(semiring_type) # TODO remove make a symbolic version pred = Predicate(pred_name, pred_arity) if pred in self.pred2semiring: raise ValueError, "predicate {} was already declared".format(str(pred)) self.pred2semiring[pred] = self.resolve_semiring(semiring_type) return pred # Visit a parse tree produced by GKPrologParser#Declaration. def visitDeclaration(self, ctx): self.registerTypeDeclaration(ctx) return self.visitChildren(ctx) # Visit a parse tree produced by GKPrologParser#DeclarationCycle. def visitDeclarationCycle(self, ctx): pred = self.registerTypeDeclaration(ctx) update_type = ctx.UPDATE_TYPE().getText() if pred in self.pred2update_type: raise ValueError, "the updated type for predicate {} was already declared".format(str(pred)) self.pred2update_type[pred] = update_type return self.visitChildren(ctx)