def test_random_layout(self): mdp_gen_params = {"prop_feats": (1, 1)} mdp_fn = LayoutGenerator.mdp_gen_fn_from_dict(**mdp_gen_params) env = OvercookedEnv(mdp=mdp_fn, **DEFAULT_ENV_PARAMS) start_terrain = env.mdp.terrain_mtx for _ in range(3): env.reset() print(env) curr_terrain = env.mdp.terrain_mtx self.assertFalse(np.array_equal(start_terrain, curr_terrain)) mdp_gen_params = { "mdp_choices": ['cramped_room', 'asymmetric_advantages'] } mdp_fn = LayoutGenerator.mdp_gen_fn_from_dict(**mdp_gen_params) env = OvercookedEnv(mdp=mdp_fn, **DEFAULT_ENV_PARAMS) layouts_seen = [] for _ in range(10): layouts_seen.append(env.mdp.terrain_mtx) env.reset() all_same_layout = all([ np.array_equal(env.mdp.terrain_mtx, terrain) for terrain in layouts_seen ]) self.assertFalse(all_same_layout)
def test_random_layout(self): mdp_gen_params = { "inner_shape": (5, 4), "prop_empty": 0.8, "prop_feats": 0.2, "start_all_orders": [{ "ingredients": ["onion", "onion", "onion"] }], "recipe_values": [20], "recipe_times": [20], "display": False } mdp_fn = LayoutGenerator.mdp_gen_fn_from_dict(mdp_gen_params, outer_shape=(5, 4)) env = OvercookedEnv(mdp_fn, **DEFAULT_ENV_PARAMS) start_terrain = env.mdp.terrain_mtx for _ in range(3): env.reset() curr_terrain = env.mdp.terrain_mtx self.assertFalse(np.array_equal(start_terrain, curr_terrain)) mdp_gen_params = {"layout_name": 'cramped_room'} mdp_fn = LayoutGenerator.mdp_gen_fn_from_dict(mdp_gen_params) env = OvercookedEnv(mdp_fn, **DEFAULT_ENV_PARAMS) layouts_seen = [] for _ in range(5): layouts_seen.append(env.mdp.terrain_mtx) env.reset() all_same_layout = all([ np.array_equal(env.mdp.terrain_mtx, terrain) for terrain in layouts_seen ]) self.assertTrue(all_same_layout) mdp_gen_params = {"layout_name": 'asymmetric_advantages'} mdp_fn = LayoutGenerator.mdp_gen_fn_from_dict(mdp_gen_params) env = OvercookedEnv(mdp_fn, **DEFAULT_ENV_PARAMS) for _ in range(5): layouts_seen.append(env.mdp.terrain_mtx) env.reset() all_same_layout = all([ np.array_equal(env.mdp.terrain_mtx, terrain) for terrain in layouts_seen ]) self.assertFalse(all_same_layout)
def test_random_layout_generated_recipes(self): only_onions_recipes = [Recipe(["onion", "onion"]), Recipe(["onion", "onion", "onion"])] only_onions_dict_recipes = [r.to_dict() for r in only_onions_recipes] # checking if recipes are generated from mdp_params mdp_gen_params = {"generate_all_orders": {"n":2, "ingredients": ["onion"], "min_size":2, "max_size":3}, "prop_feats": 0.9, "prop_empty": 0.1, "inner_shape": (6, 5), "display": False} mdp_fn = LayoutGenerator.mdp_gen_fn_from_dict(mdp_gen_params, outer_shape=(6, 5)) env = OvercookedEnv(mdp_fn, **DEFAULT_ENV_PARAMS) for _ in range(10): env.reset() self.assertCountEqual(env.mdp.start_all_orders, only_onions_dict_recipes) self.assertEqual(len(env.mdp.start_bonus_orders), 0) # checking if bonus_orders is subset of all_orders even if not specified mdp_gen_params = {"generate_all_orders": {"n":2, "ingredients": ["onion"], "min_size":2, "max_size":3}, "generate_bonus_orders": {"n":1, "min_size":2, "max_size":3}, "prop_feats": 0.9, "prop_empty": 0.1, "inner_shape": (6, 5), "display": False} mdp_fn = LayoutGenerator.mdp_gen_fn_from_dict(mdp_gen_params, outer_shape=(6,5)) env = OvercookedEnv(mdp_fn, **DEFAULT_ENV_PARAMS) for _ in range(10): env.reset() self.assertCountEqual(env.mdp.start_all_orders, only_onions_dict_recipes) self.assertEqual(len(env.mdp.start_bonus_orders), 1) self.assertTrue(env.mdp.start_bonus_orders[0] in only_onions_dict_recipes) # checking if after reset there are new recipes generated mdp_gen_params = {"generate_all_orders": {"n":3, "min_size":2, "max_size":3}, "prop_feats": 0.9, "prop_empty": 0.1, "inner_shape": (6, 5), "display": False, "feature_types": [POT, DISH_DISPENSER, SERVING_LOC, ONION_DISPENSER, TOMATO_DISPENSER] } mdp_fn = LayoutGenerator.mdp_gen_fn_from_dict(mdp_gen_params, outer_shape=(6,5)) env = OvercookedEnv(mdp_fn, **DEFAULT_ENV_PARAMS) generated_recipes_strings = set() for _ in range(20): env.reset() generated_recipes_strings |= {json.dumps(o, sort_keys=True) for o in env.mdp.start_all_orders} self.assertTrue(len(generated_recipes_strings) > 3)
def test_random_layout_feature_types(self): mandatory_features = {POT, DISH_DISPENSER, SERVING_LOC} optional_features = {ONION_DISPENSER, TOMATO_DISPENSER} optional_features_combinations = [{ONION_DISPENSER, TOMATO_DISPENSER}, {ONION_DISPENSER}, {TOMATO_DISPENSER}] for optional_features_combo in optional_features_combinations: left_out_optional_features = optional_features - optional_features_combo used_features = list(optional_features_combo | mandatory_features) mdp_gen_params = {"prop_feats": 0.9, "feature_types": used_features, "prop_empty": 0.1, "inner_shape": (6, 5), "display": False, "start_all_orders" : [ { "ingredients" : ["onion", "onion", "onion"]} ]} mdp_fn = LayoutGenerator.mdp_gen_fn_from_dict(mdp_gen_params, outer_shape=(6, 5)) env = OvercookedEnv(mdp_fn, **DEFAULT_ENV_PARAMS) for _ in range(10): env.reset() curr_terrain = env.mdp.terrain_mtx terrain_features = set.union(*(set(line) for line in curr_terrain)) self.assertTrue(all(elem in terrain_features for elem in used_features)) # all used_features are actually used if left_out_optional_features: self.assertFalse(any(elem in terrain_features for elem in left_out_optional_features)) # all left_out optional_features are not used
def from_mdp_params_finite(mdp_params, env_params, outer_shape=None, mdp_params_schedule_fn=None, force_compute=False, mlam_params=NO_COUNTERS_PARAMS, debug=False): """ mdp_params (dict): params for creation of an OvercookedGridworld instance through the `from_layout_name` method outer_shape: the outer shape of environment mdp_params_schedule_fn: the schedule for varying mdp params Information for the rest of params please refer to the __init__ method above Generate a finite list of mdp (mdp_lst) using the naive mdp_fn, and then use the from_mdp_lst to generate the AgentEvaluator """ assert outer_shape is not None, "outer_shape needs to be defined for variable mdp" assert "num_mdp" in env_params and not np.isinf(env_params["num_mdp"]), \ "num_mdp needs to be specified and finite" mdp_fn_naive = LayoutGenerator.mdp_gen_fn_from_dict( mdp_params, outer_shape, mdp_params_schedule_fn) # finite mdp, random choice num_mdp = env_params['num_mdp'] assert type( num_mdp ) == int and num_mdp > 0, "invalid number of mdp: " + str(num_mdp) mdp_lst = [mdp_fn_naive() for _ in range(num_mdp)] return AgentEvaluator.from_mdp_lst(mdp_lst=mdp_lst, env_params=env_params, force_compute=force_compute, mlam_params=mlam_params, debug=debug)
def __init__(self, mdp_params, env_params={}, mdp_fn_params=None, force_compute=False, mlp_params=NO_COUNTERS_PARAMS, debug=False): """ mdp_params (dict): params for creation of an OvercookedGridworld instance through the `from_layout_name` method env_params (dict): params for creation of an OvercookedEnv mdp_fn_params (dict): params to setup random MDP generation force_compute (bool): whether should re-compute MediumLevelPlanner although matching file is found mlp_params (dict): params for MediumLevelPlanner """ assert type(mdp_params) is dict, "mdp_params must be a dictionary" if mdp_fn_params is None: self.variable_mdp = False self.mdp_fn = lambda: OvercookedGridworld.from_layout_name( **mdp_params) else: self.variable_mdp = True self.mdp_fn = LayoutGenerator.mdp_gen_fn_from_dict( mdp_params, **mdp_fn_params) self.env = OvercookedEnv(self.mdp_fn, **env_params) self.force_compute = force_compute self.debug = debug self.mlp_params = mlp_params self._mlp = None
def from_mdp_params_infinite(mdp_params, env_params, outer_shape=None, mdp_params_schedule_fn=None, force_compute=False, mlam_params=NO_COUNTERS_PARAMS, debug=False): """ mdp_params (dict): params for creation of an OvercookedGridworld instance through the `from_layout_name` method outer_shape: the outer shape of environment mdp_params_schedule_fn: the schedule for varying mdp params Information for the rest of params please refer to the __init__ method above Infinitely generate mdp using the naive mdp_fn """ assert outer_shape is not None, "outer_shape needs to be defined for variable mdp" assert "num_mdp" in env_params and np.isinf(env_params["num_mdp"]), \ "num_mdp needs to be specified and infinite" mdp_fn_naive = LayoutGenerator.mdp_gen_fn_from_dict( mdp_params, outer_shape, mdp_params_schedule_fn) return AgentEvaluator(env_params, mdp_fn_naive, force_compute, mlam_params, debug)
def test_failing_rnd_layout(self): with self.assertRaises(TypeError): mdp_gen_params = {"None": None} mdp_fn = LayoutGenerator.mdp_gen_fn_from_dict(**mdp_gen_params) OvercookedEnv(mdp=mdp_fn, **DEFAULT_ENV_PARAMS)