def search_after_prefix(opts, n, prefix_idxs, counters, on_error=None): prefix = tuple(opts[p] for p in prefix_idxs) i = prefix_idxs[0] if n == 0: for p in loops.all_compositions(prefix): yield (p, prefix) return for p in loops.all_compositions(prefix): for r in _search_after(opts, n, i, p, prefix_idxs, counters, on_error): yield r
def search_process(suite, limit, sequence_queue, result_queue, status_queue, log_config): logging.config.dictConfig(log_config) log = logger.getChild('search_process') log.info('Worker thread started, limit %s', limit) opts = loops.parse_transforms(open(suite).read()) log.debug('%s optimizations', len(opts)) info = [0,0,0,0] def count_error(e,o1,o2): info[ERRORS] += 1 while info[COUNT] < limit: s = sequence_queue.get() if s is None: log.info('Worker exiting %s', info) status_queue.put(info) return log.debug('Checking sequence %s', s) os = tuple(opts[i] for i in s) for o in loops.all_compositions(os): if info[COUNT] >= limit: break o_src = count_src(o) for oo in loops.all_bin_compositions(o, o, count_error): if info[COUNT] >= limit: break if info[COUNT] % 1000 == 0: log.info('Tested %s SatChecks %s Loops %s Errors %s', *info) info[COUNT] += 1 oo_src = count_src(oo) if o_src < oo_src: continue info[SAT_CHECKS] += 1 if not loops.satisfiable(oo): continue info[CYCLES] += 1 # TODO: put found loops into a queue result = 'Loop: {}\n{}\n\n{}'.format(o.name, '\n\n'.join(str(op) for op in os), o) result_queue.put(result) log.info(result) log.info('Worker exiting %s', info) status_queue.put(info)