Commit d6cc21b2 authored by Kento HASEGAWA's avatar Kento HASEGAWA
Browse files

Update scripts for ADC2019 system

parent 1da47298
Loading
Loading
Loading
Loading
+10 −10
Changes for solver.py: 10 added lines, 10 removed lines.
Original line number Diff line number Diff line
# パッケージ

%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)

if __name__ == '__main__':
    main()

twd_solver.py

0 → 100644
+112 −0
Changes for twd_solver.py: 112 added lines, 0 removed lines.
Original line number Diff line number Diff line
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)