2323#SBATCH --out=slurm/{job_name}-%A_%a.out
2424
2525uv run benchmark.py \
26- data/instances /{problem}/*.txt \
26+ {data_dir} /{problem}/*.txt \
2727 --problem_variant {problem} \
2828 --sol_dir {out_dir} \
2929 --time_limit {time_limit} \
3333 --permutation_max_jobs {permutation_max_jobs} >> {out_dir}/results.txt
3434"""
3535
36- NUM_CORES = 192
37- NUM_WORKERS_PER_INSTANCE = 8
38- NUM_PARALLEL_INSTANCES = 24
39- DATA_DIR = Path ("data/instances" )
40- PERMUTATION_MAX_JOBS = 100
41-
4236
4337def seconds2string (seconds : int ) -> str :
4438 mins , seconds = divmod (seconds , 60 )
4539 hours , mins = divmod (mins , 60 )
4640 return f"{ hours :02d} :{ mins :02d} :{ seconds :02d} "
4741
4842
49- def main (solver : str , time_limit : int , mock : bool ):
50- for problem_variant_enum in ProblemVariant :
51- problem_variant = problem_variant_enum .value
52- instance_dir = DATA_DIR / problem_variant
43+ def main (
44+ solver : str ,
45+ time_limit : int ,
46+ problem_variants : list [str ],
47+ mock : bool ,
48+ num_cores : int ,
49+ num_workers_per_instance : int ,
50+ num_parallel_instances : int ,
51+ results_dir : Path ,
52+ data_dir : Path ,
53+ permutation_max_jobs : int ,
54+ ):
55+ for problem_variant in problem_variants :
56+ instance_dir = data_dir / problem_variant
5357 num_instances = len (list (instance_dir .glob ("*.txt" )))
5458 job_name = f"{ problem_variant } -{ solver } -{ time_limit } "
55- _total_time = (num_instances / NUM_PARALLEL_INSTANCES ) * time_limit
56- job_time_limit = seconds2string (int (_total_time + 3600 )) # 3600s buffer
57- out_dir = f"data/results/{ problem_variant } /{ solver } /{ time_limit } "
59+ _total_time = (num_instances / num_parallel_instances ) * time_limit
60+ job_time_limit = seconds2string (
61+ int (_total_time + 3600 )
62+ ) # 3600s buffer
63+ out_dir = results_dir / f"{ problem_variant } /{ solver } /{ time_limit } "
5864 maybe_mkdir (out_dir )
5965
6066 jobscript = JOBSCRIPT .format (
6167 job_name = job_name ,
62- job_cpus_per_task = NUM_CORES ,
68+ job_cpus_per_task = num_cores ,
6369 job_time_limit = job_time_limit ,
6470 problem = problem_variant ,
6571 solver = solver ,
6672 time_limit = time_limit ,
67- num_workers_per_instance = NUM_WORKERS_PER_INSTANCE ,
68- num_parallel_instances = NUM_PARALLEL_INSTANCES ,
69- permutation_max_jobs = PERMUTATION_MAX_JOBS ,
73+ num_workers_per_instance = num_workers_per_instance ,
74+ num_parallel_instances = num_parallel_instances ,
75+ permutation_max_jobs = permutation_max_jobs ,
7076 out_dir = out_dir ,
77+ data_dir = data_dir ,
7178 )
7279
7380 if mock :
@@ -83,12 +90,30 @@ def parse_args():
8390 "--solver" , type = str , choices = ["ortools" , "cpoptimizer" ], required = True
8491 )
8592 parser .add_argument ("--time_limit" , type = int , required = True )
93+ parser .add_argument (
94+ "--problem_variants" ,
95+ type = str ,
96+ nargs = "+" ,
97+ choices = [variant .value for variant in ProblemVariant ],
98+ default = [variant .value for variant in ProblemVariant ],
99+ )
86100 parser .add_argument ("--mock" , action = "store_true" )
87101
102+ parser .add_argument ("--num_cores" , type = int , default = 192 )
103+ parser .add_argument ("--num_workers_per_instance" , type = int , default = 8 )
104+ parser .add_argument ("--num_parallel_instances" , type = int , default = 24 )
105+ parser .add_argument (
106+ "--results_dir" , type = Path , default = Path ("data/results" )
107+ )
108+ parser .add_argument (
109+ "--data_dir" , type = Path , default = Path ("data/instances" )
110+ )
111+ parser .add_argument ("--permutation_max_jobs" , type = int , default = 100 )
112+
88113 return parser .parse_args ()
89114
90115
91- def maybe_mkdir (where : str ):
116+ def maybe_mkdir (where : str | Path ):
92117 if where :
93118 dir_loc = Path (where )
94119 dir_loc .mkdir (parents = True , exist_ok = True )
0 commit comments