Example #1
0
 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
Example #2
0
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)