def _test_sequent(*args): sequent = Sequent(*args) print '-' * 78 print 'Compiling full search: {0}'.format(sequent) compiles = compile_full(sequent) print_compiles(compiles) full_cost = add_costs(c for (c, _, _) in compiles) incremental_cost = None for event in get_events(sequent): print 'Compiling incremental search given: {0}'.format(event) compiles = compile_given(sequent, event) print_compiles(compiles) if event.args: cost = add_costs(c for (c, _, _) in compiles) if incremental_cost: incremental_cost = add_costs([incremental_cost, cost]) else: incremental_cost = cost print '# full cost =', full_cost, 'incremental cost =', incremental_cost
def measure_sequent(sequent): print '-' * 78 print 'Compiling full search: {0}'.format(sequent) compiles = compile_full(sequent) print_compiles(compiles) full_cost = add_costs(c for (c, _, _) in compiles) incremental_cost = None for event in get_events(sequent): print 'Compiling incremental search given: {0}'.format(event) compiles = compile_given(sequent, event) print_compiles(compiles) if event.args: cost = add_costs(c for (c, _, _) in compiles) if incremental_cost: incremental_cost = add_costs([incremental_cost, cost]) else: incremental_cost = cost else: pass # event is only triggered once, so ignore cost print '# full cost =', full_cost, 'incremental cost =', incremental_cost
def write_event_programs(programs, sequents): event_tasks = {} for sequent in sequents: for event in compiler.get_events(sequent): name = 'Variable' if event.is_var() else event.name plans = sorted(compiler.compile_given(sequent, event)) cost = add_costs(c for (c, _, _) in plans) tasks = event_tasks.setdefault(name, []) tasks.append((cost, event, sequent, plans)) group_tasks = {} for name, tasks in event_tasks.iteritems(): groupname = signature.get_arity(name) group_tasks.setdefault(groupname, {})[name] = sorted(tasks) group_tasks = sorted(group_tasks.iteritems()) group_id = 0 for groupname, group in group_tasks: group = sorted(group.iteritems()) arity = signature.get_arity(group[0][0]) for eventname, tasks in group: total_cost = add_costs(c for (c, _, _, _) in tasks) programs += [ '', '# ' + '-' * 76, '# plans {}.*: total cost = {:0.1f}'.format( group_id, total_cost), '# given {}'.format(eventname), ] plan_id = 0 for _, event, sequent, plans in tasks: diagonal = ( len(event.args) == 2 and event.args[0] == event.args[1]) if diagonal: lhs = event.args[0] assert lhs.arity == 'Variable' rhs = Expression.make(lhs.name + '_') event = Expression.make(event.name, lhs, rhs) if arity == 'Variable': given = 'GIVEN_EXISTS {var}'.format(var=event.name) elif arity == 'UnaryRelation': given = 'GIVEN_UNARY_RELATION {rel} {key}'.format( rel=event.name, key=event.args[0]) elif arity == 'BinaryRelation': given = 'GIVEN_BINARY_RELATION {rel} {lhs} {rhs}'.format( rel=event.name, lhs=event.args[0], rhs=event.args[1]) elif arity == 'NullaryFunction': given = 'GIVEN_NULLARY_FUNCTION {fun} {val}'\ .format( fun=event.name, val=event.var.name) elif arity == 'InjectiveFunction': given = 'GIVEN_INJECTIVE_FUNCTION {fun} {key} {val}'\ .format( fun=event.name, key=event.args[0], val=event.var.name) elif arity == 'BinaryFunction': given = 'GIVEN_BINARY_FUNCTION {fun} {lhs} {rhs} {val}'\ .format( fun=event.name, lhs=event.args[0], rhs=event.args[1], val=event.var.name) elif arity == 'SymmetricFunction': given = 'GIVEN_SYMMETRIC_FUNCTION {fun} {lhs} {rhs} {val}'\ .format( fun=event.name, lhs=event.args[0], rhs=event.args[1], val=event.var.name) else: raise ValueError('invalid arity: {}'.format(arity)) header = [given] if diagonal: header.append('IF_EQUAL {lhs} {rhs}'.format( lhs=event.args[0], rhs=event.args[1])) for cost, seq, plan in plans: programs += [ '', '# plan {}.{}: cost = {:0.1f}'.format( group_id, plan_id, cost), '# using {}'.format(sequent), '# infer {}'.format(seq), ] programs += header plan.program(programs) plan_id += 1 group_id += 1