role_constraints = utils.get_role_constraints(roles, instances) formulas = get_formulas(args.formula_file) domains = get_domains(roles, instances) # generates the markov logic network mln = MLN(logic="FirstOrderLogic", grammar="PRACGrammar") for domain, values in domains.items(): # domains for value in values: if len(value) > 1: const = ''.join(value) elif len(value) > 0: const = value[0] else: const = "None" mln.update_domain({domain: [const]}) for role in roles.keys(): # predicates mln.predicate(Predicate( role, [role + "_d!"])) # hard-functional constraints only for formula in formulas: # formulas formula_str = "0.0 " for idx in range(len(formula)): role = formula[idx] if idx + 1 < len(formula): formula_str += role + "(+?" + role[:2] + ")" + " ^ " else: formula_str += role + "(+?" + role[:2] + ")" mln << formula_str mln.write() mln.tofile(args.output_mln) print("The initial MLN has been written to '" + args.output_mln + "'.") print("Verify the MLN using the print out above.") print("NOTE: Weights of '" + args.output_mln + "' have NOT been learned.")
"LocInRoom": [["locations", "rooms"], ["IsLocation(?x)", "IsRoom(?y)"]], "ObjOnLoc": [["objects", "locations"], ["IsObject(?x)", "IsLocation(?y)"]], "ObjInLoc": [["objects", "locations"], ["IsObject(?x)", "IsLocation(?y)"]], "ObjCanBe": [["objects", "actions"], ["IsObject(?x)", "IsAction(?y)"]], "ObjUsedTo": [["objects", "actions"], ["IsObject(?x)", "IsAction(?y)"]], "ObjhasState": [["objects", "states"], ["IsObject(?x)", "IsState(?y)"]], "OperatesOn": [["objects", "objects"], ["IsObject(?x)", "IsObject(?y)"]] } for rel in r2i.keys(): mln.predicate(Predicate(rel, rel2mln[rel][0])) mln.predicate(Predicate("IsRoom", ["rooms"])) mln.predicate(Predicate("IsLocation", ["locations"])) mln.predicate(Predicate("IsObject", ["objects"])) mln.predicate(Predicate("IsAction", ["actions"])) mln.predicate(Predicate("IsState", ["states"])) # declares the markov logic formulas in the markov logic network for pred in mln.iterpreds(): if "Is" not in pred.name: mln << "0.0 " + rel2mln[pred.name][1][0] + " ^ " + rel2mln[ pred.name][1][1] + " ^ " + pred.name + "(?x, ?y)" # loads the 'evidence' to learn markov logic network weights db = Database(mln) for ent in e2i.keys(): ent_type = ent.split("-")[-1] if ent_type == "r":