Commit a1d0df36 authored by  tawada's avatar tawada
Browse files

merge adc2019-system

parents d5529338 a4f61528
Loading
Loading
Loading
Loading

.gitignore

0 → 100644
+2 −0
Changes for .gitignore: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
/*.txt
/__pycache__
+7 −7
Changes for solver.py: 7 added lines, 7 removed lines.
Original line number Diff line number Diff line
@@ -2,10 +2,6 @@

# %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)
@@ -188,9 +189,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))
@@ -679,5 +679,5 @@ def main():
    #img = QA2img(Q,A)
    #plt.imshow(img)

if __name__ == '__main__':
    main()

twd_solver.py

0 → 100644
+117 −0
Changes for twd_solver.py: 117 added lines, 0 removed lines.
Original line number Diff line number Diff line
import argparse
import os
import subprocess

if __name__ == '__main__':
    import solver
else:
    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)

    returncode = 0
    if not stop_flag:
        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 = ''
    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)