Commit d6cc21b2 authored by Kento HASEGAWA's avatar Kento HASEGAWA

Update scripts for ADC2019 system

parent 1da47298
# パッケージ
%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()
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)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment