diff --git a/solver.py b/solver.py index 36e45599f997c4a4e017df5b973a61741e28469f..c3c35478487afd258a851147b0653b21218e6da4 100644 --- a/solver.py +++ b/solver.py @@ -1,11 +1,7 @@ # パッケージ -%matplotlib inline +# %matplotlib inline import numpy as np -import cv2 as cv # opencv -import matplotlib -import matplotlib.pyplot as plt # matplotlibの描画系 -from matplotlib import cm from collections import OrderedDict import os import math @@ -13,6 +9,11 @@ import re import glob import time +if __name__ == '__main__': + import cv2 as cv # opencv + import matplotlib + import matplotlib.pyplot as plt # matplotlibの描画系 + from matplotlib import cm def split(string): re_list = re.split('[ X#@,()\t\n]',string) @@ -174,9 +175,8 @@ def show(index, read=None): def add(e, _dict): if e not in _dict.keys(): _dict[e] = len(_dict) + 1 -def print_cnf(nodes, cnfs): +def print_cnf(nodes, cnfs, filename='p.txt'): s = [] - filename = 'p.txt' with open(filename, 'w') as file: s.append(f'p cnf {len(nodes)} {len(cnfs)}\n') file.write(''.join(s)) @@ -269,8 +269,8 @@ def generate_sat(Q): num_b = len(Q['BLOCK']) num_l = Q['num_l'] - w = Q['w'] = 20 - h = Q['h'] = 20 + w = Q['w'] + h = Q['h'] # ラインからブロック番号, 位置を逆引き l2b = [[] for _ in range(num_l+1)] @@ -572,5 +572,5 @@ def main(): img = QA2img(Q,A) plt.imshow(img) -main() - +if __name__ == '__main__': + main() diff --git a/twd_solver.py b/twd_solver.py new file mode 100644 index 0000000000000000000000000000000000000000..47377e4c72a137fabb4b56fd8ef7ae71b425aacb --- /dev/null +++ b/twd_solver.py @@ -0,0 +1,112 @@ +import os +import subprocess + +from solvers.twd import solver + +proc = None +stop_flag = False + +def stop(): + global proc + global stop_flag + + stop_flag = True + if not proc is None: + proc.terminate() + print('stopped') + +def solve(params): + global proc + global stop_flag + + stop_flag = False + + # 必要な変数があるか確認 + assert('problem' in params) + assert('timeout' in params) + + problem = params['problem'] + timeout = params['timeout'] + + basedir = os.path.abspath(os.path.dirname(__file__)) + + problem_filepath = f'{basedir}/tmp.txt' + with open(problem_filepath, 'w') as fp: + fp.write(params['problem']) + + if not stop_flag: + Q = solver.readQ(problem_filepath) + + if not stop_flag: + nodes, cnfs = solver.generate_sat(Q) + + cnf_filepath = f'{basedir}/p.txt' + if not stop_flag: + solver.print_cnf(nodes, cnfs, filename=cnf_filepath) + + solution_filepath = f'{basedir}/a.txt' + + cmds = f'minisat {cnf_filepath} {solution_filepath}'.split() + + proc = subprocess.Popen( + cmds, + # stderr=subprocess.PIPE, + # stdout=subprocess.PIPE + ) + + try: + # outs, errs = proc.communicate() + proc.communicate() + status = 'done' + except Exception as ex: + status = 'failed' + finally: + returncode = proc.returncode + # outs = outs.decode() + # errs = errs.decode() + # print(outs) + # print(errs) + + solution = '' + print(returncode) + if returncode == 10: # 10 when SAT + status = 'done' + if not stop_flag: + A = solver.read_satA(solution_filepath, Q, nodes) + if not stop_flag: + solution += f'SIZE {A["w"]}X{A["h"]}\n' + for r in A['map']: + solution += ','.join(str(v) for v in r) + '\n' + for bi, bv in A['BLOCK'].items(): + solution += f'BLOCK#{bi} @({bv["x"]},{bv["y"]})\n' + solution += '\n' + else: + status = 'failed' + + return { + 'status': status, + 'solution': solution + } + +def main(args): + + with open(args['problem'], 'r') as fp: + problem = fp.read() + + params = { + 'problem': problem, + 'timeout': args['timeout'] + } + + ret = solve(params) + + print(ret) + +if __name__ == "__main__": + + parser = argparse.ArgumentParser(description='Wrapper Script for ADC2019 Solver') + parser.add_argument('problem', type=str, help='File path to the problem file') + parser.add_argument('-t', '--timeout', type=int, default=10, help='Timeout for the process of the solver') + args = vars(parser.parse_args()) + + main(args)