def determine_param_orderings(predicate): logger.debug("Determining ordering for: " + str(predicate)) def establish_relationship(value_pair, index_pair, op, cmp_map): x,y = value_pair i,k = index_pair if not(cmp_map.has_key((i,k)) and cmp_map[(i,k)] == None): if op(x,y): if cmp_map.has_key((i,k)): if op != cmp_map[(i,k)]: cmp_map[(i,k)] = None else: cmp_map[(i,k)] = op elif cmp_map.has_key((i,k)) and op == cmp_map[(i,k)]: cmp_map[(i,k)] = None logger.debug(str(cmp_map)) # end establish_relationship v = UniqueVariableFactory() type_map = {} types = predicate.param_types for i, type in zip(range(0, len(types)), types): if not type_map.has_key(type): type_map[type] = [] type_map[type].append(i) pairs = [] for type in type_map.keys(): for x in choose(type_map[type], 2): pairs.append(list(x)) cmp_map = {} variables = v.next_variable_sequence(predicate.arity) logger.debug("Calling: fol_bc_ask( %s )" % predicate(*variables)) for answer in fol_bc_ask([predicate(*variables)], {}): logger.debug("Answer: " + str(answer)) for pair in pairs: i,k = pair x,y = answer[variables[i]], answer[variables[k]] logger.debug("Comparing %s and %s." % (x, y)) try: for op in [operator.lt, operator.gt, operator.eq]: establish_relationship((x,y), (i,k), op, cmp_map) except: pass return cmp_map
def foil_main(predicate, positive_tuples, negative_tuples, bk, ordering=None): arity = predicate.arity clauses = set([]) variable_factory = UniqueVariableFactory() params = variable_factory.next_variable_sequence(predicate.arity, prefix="PARAM_") training_set = TrainingSet(predicate, params, positive_tuples, negative_tuples) while len(training_set.positive_examples) > 0: head = tuple(training_set.variables) for x in head: x.depth = 0 body = [] rule = MutableRule(predicate, head, body) predicate.rules.append(rule) construct_clause_recursive(predicate, rule, training_set, bk, variable_factory=variable_factory, ordering=ordering)