Use tabulate for output format, add day names and --simple

This commit is contained in:
Yorick van Pelt 2024-04-15 10:22:47 +02:00
parent 09ea4ee5ca
commit 7c0ccaf0b6
No known key found for this signature in database
GPG Key ID: D8D3CC6D951384DE
2 changed files with 27 additions and 10 deletions

View File

@ -9,13 +9,16 @@ from collections import OrderedDict, defaultdict
from pyscipopt import Model, quicksum from pyscipopt import Model, quicksum
from typing import Any, Tuple, TypeVar from typing import Any, Tuple, TypeVar
from dataclasses import dataclass, field from dataclasses import dataclass, field
from tabulate import tabulate
conf = yaml.safe_load(open('config.yaml', 'r')) conf = yaml.safe_load(open('config.yaml', 'r'))
DEFAULT_CONFIG = { DEFAULT_CONFIG = {
"max_load_person": 6 "max_load_person": 6,
"day_names": [f"dag {str(i)}" for i in range(conf['config']['days'])],
} }
config = DEFAULT_CONFIG | conf['config'] config = DEFAULT_CONFIG | conf['config']
config['ignore'].append('') config['ignore'].append('')
assert(len(config['day_names']) == config['days'])
QUADRATIC = False QUADRATIC = False
@ -105,17 +108,26 @@ def set_capabilities(tasks: dict[str, TaskConfig], people: dict[str, Person]):
if pers: if pers:
people[pers.lower()].does.add((day, task)) people[pers.lower()].does.add((day, task))
def write_tasks(people, tasks, file=sys.stdout): def write_tasks(people: dict[str, Person], tasks: dict[str, TaskConfig], file=sys.stdout):
for name, p in people.items(): headers = ["wie"] + config['day_names']
days = [[] for i in range(config['days'])] if not args.simple:
headers += ["workload", "vrolijkheid"]
tabl = []
for p in people.values():
days = [[] for _ in range(config['days'])]
for (d,t) in p.does: for (d,t) in p.does:
days[d].append((t, t in p.loves, t in p.hates)) days[d].append((t, t in p.loves, t in p.hates))
if not args.simple:
def q(w): def q(w):
return ",".join([t + (" <3" if love else "") + (" :(" if hate else "") for (t,love,hate) in w]) return ",".join([tasks[t].name + (" :)" if love else "") + (" :(" if hate else "") for (t,love,hate) in w])
days_fmt = " {} ||" * len(days) else:
days_filled = days_fmt.format(*map(q, days)) def q(w):
print("| {} ||{} {} || {}".format(name, days_filled, p.vrolijkheid(), p.workload(tasks)), file=file) return ",".join([tasks[t].name for (t,_,_) in w])
print("|-") row = [p.name, *map(q, days)]
if not args.simple:
row += [p.workload(tasks), p.vrolijkheid()]
tabl.append(row)
print(tabulate(tabl, headers=headers, tablefmt=args.output_format), file=file)
def scipsol(people: dict[str, Person], tasks: dict[str, TaskConfig]): def scipsol(people: dict[str, Person], tasks: dict[str, TaskConfig]):
max_loads: dict[Tuple[str, int], int] = {} max_loads: dict[Tuple[str, int], int] = {}
@ -201,7 +213,9 @@ def scipsol(people: dict[str, Person], tasks: dict[str, TaskConfig]):
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("-q", "--quadratic", action="store_true") parser.add_argument("-q", "--quadratic", action="store_true")
parser.add_argument("--simple", action="store_true", help="hide workload and happiness")
parser.add_argument("--max_total_error", type=int, default=None) parser.add_argument("--max_total_error", type=int, default=None)
parser.add_argument("--output-format", default="mediawiki", help="`tabulate` output format")
args = parser.parse_args() args = parser.parse_args()
QUADRATIC = args.quadratic QUADRATIC = args.quadratic

3
requirements.txt Normal file
View File

@ -0,0 +1,3 @@
tabulate~=0.9.0
PySCIPOpt~=4.4.0
PyYAML~=6.0.1