Use tabulate for output format, add day names and --simple
This commit is contained in:
		
							parent
							
								
									09ea4ee5ca
								
							
						
					
					
						commit
						7c0ccaf0b6
					
				@ -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))
 | 
				
			||||||
        def q(w):
 | 
					        if not args.simple:
 | 
				
			||||||
            return ",".join([t + (" <3" if love else "") + (" :(" if hate else "") for (t,love,hate) in w])
 | 
					            def q(w):
 | 
				
			||||||
        days_fmt = " {} ||" * len(days)
 | 
					                return ",".join([tasks[t].name + (" :)" if love else "") + (" :(" if hate else "") for (t,love,hate) in w])
 | 
				
			||||||
        days_filled = days_fmt.format(*map(q, days))
 | 
					        else:
 | 
				
			||||||
        print("| {} ||{} {} || {}".format(name, days_filled, p.vrolijkheid(), p.workload(tasks)), file=file)
 | 
					            def q(w):
 | 
				
			||||||
        print("|-")
 | 
					                return ",".join([tasks[t].name for (t,_,_) in w])
 | 
				
			||||||
 | 
					        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
									
								
							
							
						
						
									
										3
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					tabulate~=0.9.0
 | 
				
			||||||
 | 
					PySCIPOpt~=4.4.0
 | 
				
			||||||
 | 
					PyYAML~=6.0.1
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user