def helper(program_base, t): if monitor['stopped']: return try: stop_queue.get_nowait() monitor['stopped'] = True return except queue.Empty: pass if t == T: if not get_unused_indices(program_base): result_queue.put(program_base.prefix) # don't keep searching if pruned # has < T stmts. will get picked up # on another enumeration return type_to_inputs = collections.defaultdict(list) for i, typ in enumerate(program_base.types): type_to_inputs[typ].append(i) for k, v in ctx.typemap.items(): type_to_inputs[k] += v used = set(program_base.stmts) for f in ctx.functions: for args in iterate_inputs(f, type_to_inputs): stmt = f, args if stmt in used: continue program = Program(program_base.input_types, list(program_base.stmts) + [stmt]) helper(program, t + 1)
def test_get_unused_indices(self): prefix = 'LIST|INT|MAP,*2,0|FILTER,>0,0|FILTER,<0,2' program = Program.parse(prefix) expected = {1, 3} actual = get_unused_indices(program) self.assertEqual(actual, expected)