diff --git a/.bashrc b/.bashrc new file mode 100644 index 000000000..e3e9b075e --- /dev/null +++ b/.bashrc @@ -0,0 +1,2 @@ + +conda activate pddl-generators diff --git a/environment.yml b/environment.yml new file mode 100644 index 000000000..d617e8165 --- /dev/null +++ b/environment.yml @@ -0,0 +1,7 @@ +name: pddl-generators +dependencies: + - python=3.9 + - pip + - pip: + - configspace + - ansicolors diff --git a/memo.py b/memo.py new file mode 100644 index 000000000..cc9b36dc7 --- /dev/null +++ b/memo.py @@ -0,0 +1,257 @@ + +from ConfigSpace.hyperparameters import CategoricalHyperparameter +from ConfigSpace.hyperparameters import UniformFloatHyperparameter +from ConfigSpace.hyperparameters import UniformIntegerHyperparameter + + +def get_int(name, lower, upper, *, log=False, step_size=1): + return UniformIntegerHyperparameter( + name, lower=lower, upper=upper, default_value=lower, log=log, q=step_size + ) + + +def get_float(name, lower, upper, *, log=False, precision=0.01): + return UniformFloatHyperparameter( + name, lower=lower, upper=upper, default_value=lower, log=log, q=precision + ) + + +def get_enum(name, choices, default_value=None): + if default_value is None: + default_value = choices[0] + return CategoricalHyperparameter(name, choices, default_value=default_value) + + + +DOMAINS = [ + Domain( + "agricola", + "GenAgricola.py {stages} {seed} --num_workers {workers} {all_workers_flag}", + # Exclude --num_ints and --num_rounds {num_rounds} because they were not used in IPC'18. + [ + get_int("stages", lower=3, upper=20), + get_int("workers", lower=3, upper=20), + get_enum( + "all_workers_flag", ["", "--must_create_workers"], default_value="" + ), + ], + ), + Domain( + "barman", + "barman-generator.py {cocktails} {ingredients} {shots} {seed}", + [ + get_int("cocktails", lower=1, upper=10), + get_int("shots", lower=1, upper=5), + get_int("ingredients", lower=2, upper=6), + ], + adapt_parameters=adapt_parameters_barman, + ), + Domain( + "blocksworld", + "blocksworld 4 {n} {seed}", + [get_int("n", lower=2, upper=100)], + ), + Domain( + "childsnack", + "child-snack-generator.py pool {seed} {children} {trays} {gluten_factor} {constrainedness}", + [ + get_int("children", lower=2, upper=5), + get_float("constrainedness", lower=1.0, upper=2.0, precision=0.5), + get_int("trays", lower=1, upper=3), + get_float("gluten_factor", lower=0.2, upper=0.8, precision=0.2), + ], + ), + Domain( + "driverlog", + "dlgen {seed} {roadjunctions} {drivers} {packages} {trucks}", + [ + get_int("drivers", lower=1, upper=3), + get_int("packages", lower=1, upper=3), + get_int("roadjunctions", lower=2, upper=6), + get_int("trucks", lower=1, upper=5), + ], + ), + Domain( + "floortile", + "floortile-generator.py name {rows} {columns} {robots} seq {seed}", + [ + get_int("rows", lower=2, upper=6), + get_int("columns", lower=2, upper=6), + get_int("robots", lower=1, upper=6), + ], + adapt_parameters=adapt_parameters_floortile, + ), + Domain( + "freecell", + "freecell -f {cells} -c {columns} -s 4 -0 {suite_size} -1 {suite_size} " + "-2 {suite_size} -3 {suite_size} -i {initial_stacks} -r {seed}", + [ + get_int("cells", lower=2, upper=4), + get_int("columns", lower=3, upper=8), + #get_int("suits", lower=4, upper=4), # hardcoded as in IPC tasks + get_int("suite_size", lower=2, upper=20), + get_int("initial_stacks", lower=1, upper=8), + ], + adapt_parameters=adapt_parameters_freecell, + ), + Domain( + "grid", + "generate.py {x} {y} --shapes {shapes} --keys {keys} --locks {locks} --prob-goal {prob_key_in_goal} --seed {seed}", + [ + get_int("x", lower=2, upper=5, step_size=1), + get_int("y", lower=2, upper=5, step_size=1), + get_float("prob_key_in_goal", lower=0.5, upper=1.0, precision=0.5), + get_int("shapes", lower=1, upper=2), + get_int("extra_keys", lower=1, upper=2), + get_float("percentage_cells_locked", lower=0.3, upper=0.9, precision=0.3), + ], + adapt_parameters=adapt_parameters_grid, + ), + Domain( + "hiking", + "generator.py {couples} {cars} {places} {seed}", + [ + get_int("couples", lower=1, upper=5), + get_int("places", lower=2, upper=10), + get_int("cars", lower=1, upper=5), + ], + adapt_parameters=adapt_parameters_hiking, + ), + Domain( + "mprime", + "mprime -l {locations} -f {maxfuel} -s {maxspace} -v {vehicles} -c {cargos} -r {seed}", + [ + # optimal planning (ranges from IPC renamed domain version): + # for file in `ls prob*.pddl`; do grep location $file | wc -l; done | sort -n | uniq | paste -s -d, + #get_int("locations", lower=4, upper=22, step_size=1), # 4,5,6,7,8,10,11,12,13,15,16,17,18,19,21,22 + #get_int("maxfuel", lower=3, upper=13, step_size=1), # 3,4,5,6,7,8,9,10,11,12,13 + #get_int("maxspace", lower=1, upper=3, step_size=1), # 1,2,3 + #get_int("vehicles", lower=1, upper=16, step_size=1), # 1,2,3,4,5,6,7,8,9,11,16 + #get_int("cargos", lower=2, upper=46, step_size=1), # 2,3,4,5,6,7,8,9,10,11,13,14,15,16,18,20,22,24,34,37,39,40,44,46 + get_enum("locations", [3,4,5,6,8,10]), + get_enum("maxfuel", [3,4,5,6,8,10]), + get_enum("maxspace", [1,2,3]), + get_enum("vehicles", [1,2,3,4,6,8]), + get_enum("cargos", [1,2,3,4,5,6,8,10,12]), + # satisficing planning + #get_int("locations", lower=5, upper=25, step_size=5), + #get_int("maxfuel", lower=10, upper=15, step_size=5), + #get_int("maxspace", lower=2, upper=4, step_size=2), + #get_int("vehicles", lower=2, upper=16, step_size=2), + #get_int("cargos", lower=5, upper=50, step_size=5), + ], + ), + Domain( + "mystery", + "mystery -l {locations} -f {maxfuel} -s {maxspace} -v {vehicles} -c {cargos} -r {seed}", + [ + get_int("locations", lower=5, upper=25, step_size=5), + get_int("maxfuel", lower=10, upper=15, step_size=5), + get_int("maxspace", lower=2, upper=4, step_size=2), + get_int("vehicles", lower=2, upper=16, step_size=2), + get_int("cargos", lower=5, upper=50, step_size=5), + ], + ), + Domain( + "pathways", + f"wrapper.py --seed {{seed}} --reactions {{reactions}} --goals {{goals}} --initial-substances {{substances}} {TMP_DOMAIN} {TMP_PROBLEM}", + [ + # optimal planning + #get_int("reactions", lower=1, upper=101, step_size=5), # IPC: 12-480 + #get_int("goals", lower=1, upper=31, step_size=3), # IPC: 1-40 + #get_int("substances", lower=1, upper=22, step_size=3), # IPC: 3-35 + # satisficing planning + get_int("reactions", lower=10, upper=1010, step_size=50), # IPC: 12-480 + get_int("goals", lower=10, upper=90, step_size=10), # IPC: 1-40 + get_int("substances", lower=10, upper=80, step_size=10), # IPC: 3-35 + ], + ), + Domain( + "tetris", + "generator.py {rows} {block_type} {seed}", + [ + get_int("rows", lower=4, upper=50), + get_enum("block_type", ["1", "2", "3", "4"], "1"), + ], + adapt_parameters=adapt_parameters_tetris, + ), + Domain( + "tidybot", + "gentidy.py {worldsize} {tables} {cupboards} {mintablesize} {maxtablesize} {cupboardsize} {seed}", + [ + get_int("worldsize", lower=5, upper=15, step_size=1), # IPC 2011: 5-9 (opt), 9-12 (sat) + get_int("tables", lower=0, upper=10, step_size=2), # IPC 2011: 0-5 (opt), 2-9 (sat) + get_int("cupboards", lower=1, upper=3), # IPC 2011: 1 (opt), 1-3 (sat) + get_int("mintablesize", lower=1, upper=5, step_size=2), # IPC 2011: ? (opt), ? (sat) + get_int("maxtablesize", lower=1, upper=5, step_size=2), # IPC 2011: ? (opt), ? (sat) + get_int("cupboardsize", lower=4, upper=5), # IPC 2011: ? (opt), ? (sat), 4 (README) + ], + adapt_parameters=adapt_parameters_tidybot, + ), + # Schedule + # + # -p number of parts (minimal 1) + # -s number of shapes (preset: 0, maximal: 2) + # -c number of colors (preset: 2, minimal 1, maximal: 4) + # -w number of widths (preset: 2, minimal 1, maximal: 3) + # -o number of orientations (preset: 2, minimal 1, maximal: 2) + # -Q probability cylindrical goal (preset: 80) + # -W probability of colour in I (preset: 50) + # -E probability of colour in G (preset: 80) + # -R probability of hole in I (preset: 50) + # -T probability of hole in G (preset: 80) + # -Y probability of surface condition in G (preset: 50) + # -r random seed (minimal 1, optional) + Domain( + "schedule", + "./schedule " + "-p {parts} -s {shapes} -c {colors} -w {widths} -o {orientations} " + "-Q {prob_cylindrical_goal} -W {prob_color_init} -E {prob_color_goal} " + "-R {prob_hole_init} -T {prob_hole_goal} -Y {prob_surface_goal} -r {seed}", + [ + get_int("parts", lower=1, upper=100), + get_int("shapes", lower=0, upper=2, log=False), + get_int("colors", lower=1, upper=4, log=False), + get_int("widths", lower=1, upper=3, log=False), + get_int("orientations", lower=1, upper=2, log=False), + get_int("prob_cylindrical_goal", lower=0, upper=100, log=False), + get_int("prob_color_init", lower=0, upper=100, log=False), + get_int("prob_color_goal", lower=0, upper=100, log=False), + get_int("prob_hole_init", lower=0, upper=100, log=False), + get_int("prob_hole_goal", lower=0, upper=100, log=False), + get_int("prob_surface_goal", lower=0, upper=100, log=False), + ], + ), + Domain( + "spanner", + "spanner-generator.py --seed {seed} {spanners} {nuts} {locations}", + [ + get_int("spanners", lower=1, upper=5), + get_int("nuts", lower=1, upper=5), + get_int("locations", lower=1, upper=10), + ], + adapt_parameters=adapt_parameters_spanner, + ), + Domain( + "tpp", + "tpp -s {seed} -m {markets} -p {products} -t {trucks} -d {depots} -l {goods} " + + TMP_PROBLEM, + [ + get_int("products", lower=2, upper=20), + get_int("markets", lower=1, upper=10), + get_int("trucks", lower=2, upper=10), + get_int("depots", lower=1, upper=10), + get_int("goods", lower=3, upper=10), + ], + ), + Domain( + "visitall", + "grid -x {grid_width} -y {grid_height} -u {unavailable_cells} -r {ratio_goal_cells} -s {seed}", + [ + get_int("grid_width", lower=2, upper=3), + get_int("grid_height", lower=2, upper=3), + get_enum("unavailable_cells", [0]), + get_float("ratio_goal_cells", lower=0.5, upper=1.0, precision=0.5), + ] + ), +]