From 26a40070f7d1b01d446b533f63e9f53a820b71b2 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 09:56:01 +0200 Subject: [PATCH 01/67] Update twine check --- .github/workflows/dist.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dist.yaml b/.github/workflows/dist.yaml index b858d10a..1b0f9ac8 100644 --- a/.github/workflows/dist.yaml +++ b/.github/workflows/dist.yaml @@ -40,7 +40,12 @@ jobs: pip install twine last_dist=$(ls -t dist/CARL-*.tar.gz | head -n 1) twine_output=`twine check "$last_dist"` - if [[ "$twine_output" != "Checking $last_dist: PASSED" ]]; then echo $twine_output && exit 1;fi + if [[ "$twine_output" != "Checking $last_dist: PASSED" ]] + then + echo $twine_output + else + pip install $last_dist + fi - name: Install dist run: | From 070cbb45502a8608ae6933c65c377ee7f04d7080 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 10:08:11 +0200 Subject: [PATCH 02/67] Fix return type --- carl/envs/box2d/parking_garage/bus.py | 28 ++++++++++---------- carl/envs/box2d/parking_garage/race_car.py | 30 +++++++++++----------- carl/envs/box2d/parking_garage/trike.py | 14 +++++----- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/carl/envs/box2d/parking_garage/bus.py b/carl/envs/box2d/parking_garage/bus.py index fda79c8d..9dc9e6d3 100644 --- a/carl/envs/box2d/parking_garage/bus.py +++ b/carl/envs/box2d/parking_garage/bus.py @@ -70,14 +70,14 @@ class Bus(Car): Different body to the original OpenAI car. We also added a brake bias with 40% front and 60% rear break bias """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = False # Flag to determine which wheels are driven self.trailer_type = ( 0 # Determines which trailer to attach 0 -> none, 1 -> small, 2 -> large ) - def __init__(self, world, init_angle, init_x, init_y): + def __init__(self, world, init_angle, init_x, init_y) -> None: self._init_extra_params() self.world = world @@ -348,7 +348,7 @@ def __init__(self, world, init_angle, init_x, init_y): self.drawlist = self.wheels + [self.hull] self.particles = [] - def gas(self, gas): + def gas(self, gas) -> None: """control: rear wheel drive Args: @@ -368,7 +368,7 @@ def gas(self, gas): diff = 0.1 # gradually increase, but stop immediately w.gas += diff - def brake(self, b): + def brake(self, b) -> None: """control: brake Args: @@ -384,7 +384,7 @@ def brake(self, b): for w in self.wheels[4:]: w.brake = b * 0.8 - def steer(self, s): + def steer(self, s) -> None: """control: steer Args: @@ -392,7 +392,7 @@ def steer(self, s): self.wheels[0].steer = s self.wheels[1].steer = s - def step(self, dt): + def step(self, dt) -> None: """ Copy of the original step function of 'gym.envs.box2d.car_dynamics.Car' needed to accept different Engin powers or other fixed parameters @@ -500,7 +500,7 @@ class FWDBus(Bus): Front wheel driven race car """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = False # Flag to determine which wheels are driven self.fwd = True # Flag to determine which wheels are driven self.trailer_type = ( @@ -513,7 +513,7 @@ class AWDBus(Bus): 4x4 wheel driven race car """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = True # Flag to determine which wheels are driven self.trailer_type = ( @@ -526,7 +526,7 @@ class BusSmallTrailer(Bus): Bus with small trailer attached """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = False # Flag to determine which wheels are driven self.trailer_type = ( @@ -539,7 +539,7 @@ class FWDBusSmallTrailer(Bus): Front wheel driven race car """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = False # Flag to determine which wheels are driven self.fwd = True # Flag to determine which wheels are driven self.trailer_type = ( @@ -552,7 +552,7 @@ class AWDBusSmallTrailer(Bus): 4x4 wheel driven race car """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = True # Flag to determine which wheels are driven self.trailer_type = ( @@ -565,7 +565,7 @@ class BusLargeTrailer(Bus): Bus with small trailer attached """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = False # Flag to determine which wheels are driven self.trailer_type = ( @@ -578,7 +578,7 @@ class FWDBusLargeTrailer(Bus): Front wheel driven race car """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = False # Flag to determine which wheels are driven self.fwd = True # Flag to determine which wheels are driven self.trailer_type = ( @@ -591,7 +591,7 @@ class AWDBusLargeTrailer(Bus): 4x4 wheel driven race car """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = True # Flag to determine which wheels are driven self.trailer_type = ( diff --git a/carl/envs/box2d/parking_garage/race_car.py b/carl/envs/box2d/parking_garage/race_car.py index 88394ae0..944f14dc 100644 --- a/carl/envs/box2d/parking_garage/race_car.py +++ b/carl/envs/box2d/parking_garage/race_car.py @@ -77,14 +77,14 @@ class RaceCar(Car): wheels. We also added a brake bias with 40% front and 60% rear break bias """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = False # Flag to determine which wheels are driven self.trailer_type = ( 0 # Determines which trailer to attach 0 -> none, 1 -> small, 2 -> large ) - def __init__(self, world, init_angle, init_x, init_y): + def __init__(self, world, init_angle, init_x, init_y) -> None: self._init_extra_params() self.world = world @@ -367,7 +367,7 @@ def __init__(self, world, init_angle, init_x, init_y): self.drawlist = self.wheels + [self.hull] self.particles = [] - def gas(self, gas): + def gas(self, gas) -> None: """control: rear wheel drive Args: @@ -387,7 +387,7 @@ def gas(self, gas): diff = 0.1 # gradually increase, but stop immediately w.gas += diff - def brake(self, b): + def brake(self, b) -> None: """control: brake Args: @@ -403,7 +403,7 @@ def brake(self, b): for w in self.wheels[4:]: w.brake = b * 0.8 - def steer(self, s): + def steer(self, s) -> None: """control: steer Args: @@ -411,10 +411,10 @@ def steer(self, s): self.wheels[0].steer = s self.wheels[1].steer = s - def step(self, dt): + def step(self, dt) -> None: """ Copy of the original step function of 'gym.envs.box2d.car_dynamics.Car' needed to accept different - Engin powers or other fixed parameters + engine powers or other fixed parameters :param dt: :return: """ @@ -519,7 +519,7 @@ class FWDRaceCar(RaceCar): Front wheel driven race car """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = False # Flag to determine which wheels are driven self.fwd = True # Flag to determine which wheels are driven self.trailer_type = ( @@ -532,7 +532,7 @@ class AWDRaceCar(RaceCar): 4x4 wheel driven race car """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = True # Flag to determine which wheels are driven self.trailer_type = ( @@ -545,7 +545,7 @@ class RaceCarSmallTrailer(RaceCar): RaceCar with small trailer attached """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = False # Flag to determine which wheels are driven self.trailer_type = ( @@ -558,7 +558,7 @@ class FWDRaceCarSmallTrailer(RaceCar): Front wheel driven race car """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = False # Flag to determine which wheels are driven self.fwd = True # Flag to determine which wheels are driven self.trailer_type = ( @@ -571,7 +571,7 @@ class AWDRaceCarSmallTrailer(RaceCar): 4x4 wheel driven race car """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = True # Flag to determine which wheels are driven self.trailer_type = ( @@ -584,7 +584,7 @@ class RaceCarLargeTrailer(RaceCar): RaceCar with small trailer attached """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = False # Flag to determine which wheels are driven self.trailer_type = ( @@ -597,7 +597,7 @@ class FWDRaceCarLargeTrailer(RaceCar): Front wheel driven race car """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = False # Flag to determine which wheels are driven self.fwd = True # Flag to determine which wheels are driven self.trailer_type = ( @@ -610,7 +610,7 @@ class AWDRaceCarLargeTrailer(RaceCar): 4x4 wheel driven race car """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = True # Flag to determine which wheels are driven self.trailer_type = ( diff --git a/carl/envs/box2d/parking_garage/trike.py b/carl/envs/box2d/parking_garage/trike.py index b2a6b9d7..0828c298 100644 --- a/carl/envs/box2d/parking_garage/trike.py +++ b/carl/envs/box2d/parking_garage/trike.py @@ -56,12 +56,12 @@ class TukTuk(Car): TukTuk """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = False # Flag to determine which wheels are driven (Not supported) self.trailer_type = 0 # Determines which trailer to attach 0 -> none, 1 -> small, 2 -> large (not supported) - def __init__(self, world, init_angle, init_x, init_y): + def __init__(self, world, init_angle, init_x, init_y) -> None: self._init_extra_params() self.world = world @@ -220,14 +220,14 @@ def __init__(self, world, init_angle, init_x, init_y): self.drawlist = self.wheels + [self.hull] self.particles = [] - def steer(self, s): + def steer(self, s) -> None: """control: steer Args: s (-1..1): target position, it takes time to rotate steering wheel from side-to-side""" self.wheels[0].steer = s - def gas(self, gas): + def gas(self, gas) -> None: """control: rear wheel drive Args: @@ -243,7 +243,7 @@ def gas(self, gas): diff = 0.1 # gradually increase, but stop immediately w.gas += diff - def brake(self, b): + def brake(self, b) -> None: """control: brake Args: @@ -259,7 +259,7 @@ def brake(self, b): for w in self.wheels[5:]: w.brake = b * 0.8 - def step(self, dt): + def step(self, dt) -> None: """ Copy of the original step function of 'gym.envs.box2d.car_dynamics.Car' needed to accept different Engin powers or other fixed parameters @@ -367,7 +367,7 @@ class TukTukSmallTrailer(TukTuk): TukTuk with small trailer attached """ - def _init_extra_params(self): + def _init_extra_params(self) -> None: self.rwd = True # Flag to determine which wheels are driven self.fwd = False # Flag to determine which wheels are driven self.trailer_type = ( From 06f6ea2b7257fa433d427105904d7c3e0b4ba372 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 10:12:56 +0200 Subject: [PATCH 03/67] Annotate inits --- carl/envs/box2d/parking_garage/bus.py | 3 ++- carl/envs/box2d/parking_garage/race_car.py | 3 ++- carl/envs/box2d/parking_garage/trike.py | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/carl/envs/box2d/parking_garage/bus.py b/carl/envs/box2d/parking_garage/bus.py index 9dc9e6d3..fe5e12a6 100644 --- a/carl/envs/box2d/parking_garage/bus.py +++ b/carl/envs/box2d/parking_garage/bus.py @@ -1,4 +1,5 @@ import numpy as np +import Box2D from Box2D.b2 import circleShape # noqa: F401 from Box2D.b2 import contactListener # noqa: F401 from Box2D.b2 import distanceJointDef # noqa: F401 @@ -77,7 +78,7 @@ def _init_extra_params(self) -> None: 0 # Determines which trailer to attach 0 -> none, 1 -> small, 2 -> large ) - def __init__(self, world, init_angle, init_x, init_y) -> None: + def __init__(self, world: Box2D.b2World, init_angle: float, init_x: float, init_y: float) -> None: self._init_extra_params() self.world = world diff --git a/carl/envs/box2d/parking_garage/race_car.py b/carl/envs/box2d/parking_garage/race_car.py index 944f14dc..51e242f4 100644 --- a/carl/envs/box2d/parking_garage/race_car.py +++ b/carl/envs/box2d/parking_garage/race_car.py @@ -1,4 +1,5 @@ import numpy as np +import Box2D from Box2D.b2 import circleShape # noqa: F401 from Box2D.b2 import contactListener # noqa: F401 from Box2D.b2 import distanceJointDef # noqa: F401 @@ -84,7 +85,7 @@ def _init_extra_params(self) -> None: 0 # Determines which trailer to attach 0 -> none, 1 -> small, 2 -> large ) - def __init__(self, world, init_angle, init_x, init_y) -> None: + def __init__(self, world: Box2D.b2World, init_angle: float, init_x: float, init_y: float) -> None: self._init_extra_params() self.world = world diff --git a/carl/envs/box2d/parking_garage/trike.py b/carl/envs/box2d/parking_garage/trike.py index 0828c298..861ff469 100644 --- a/carl/envs/box2d/parking_garage/trike.py +++ b/carl/envs/box2d/parking_garage/trike.py @@ -1,4 +1,5 @@ import numpy as np +import Box2D from Box2D.b2 import circleShape # noqa: F401 from Box2D.b2 import contactListener # noqa: F401 from Box2D.b2 import distanceJointDef # noqa: F401 @@ -61,7 +62,7 @@ def _init_extra_params(self) -> None: self.fwd = False # Flag to determine which wheels are driven (Not supported) self.trailer_type = 0 # Determines which trailer to attach 0 -> none, 1 -> small, 2 -> large (not supported) - def __init__(self, world, init_angle, init_x, init_y) -> None: + def __init__(self, world: Box2D.b2World, init_angle: float, init_x: float, init_y: float) -> None: self._init_extra_params() self.world = world From da41eea97d336a008728d898955caf2c5591eb7c Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 10:17:11 +0200 Subject: [PATCH 04/67] Annotate args --- carl/envs/box2d/parking_garage/bus.py | 13 +++++++------ carl/envs/box2d/parking_garage/race_car.py | 13 +++++++------ carl/envs/box2d/parking_garage/trike.py | 13 +++++++------ 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/carl/envs/box2d/parking_garage/bus.py b/carl/envs/box2d/parking_garage/bus.py index fe5e12a6..436167a7 100644 --- a/carl/envs/box2d/parking_garage/bus.py +++ b/carl/envs/box2d/parking_garage/bus.py @@ -349,7 +349,7 @@ def __init__(self, world: Box2D.b2World, init_angle: float, init_x: float, init_ self.drawlist = self.wheels + [self.hull] self.particles = [] - def gas(self, gas) -> None: + def gas(self, gas: float) -> None: """control: rear wheel drive Args: @@ -369,7 +369,7 @@ def gas(self, gas) -> None: diff = 0.1 # gradually increase, but stop immediately w.gas += diff - def brake(self, b) -> None: + def brake(self, b: float) -> None: """control: brake Args: @@ -385,7 +385,7 @@ def brake(self, b) -> None: for w in self.wheels[4:]: w.brake = b * 0.8 - def steer(self, s) -> None: + def steer(self, s: float) -> None: """control: steer Args: @@ -393,12 +393,13 @@ def steer(self, s) -> None: self.wheels[0].steer = s self.wheels[1].steer = s - def step(self, dt) -> None: + def step(self, dt: float) -> None: """ Copy of the original step function of 'gym.envs.box2d.car_dynamics.Car' needed to accept different Engin powers or other fixed parameters - :param dt: - :return: + + dt : float + Timestep for simulation """ for w in self.wheels: # Steer each wheel diff --git a/carl/envs/box2d/parking_garage/race_car.py b/carl/envs/box2d/parking_garage/race_car.py index 51e242f4..9ac60444 100644 --- a/carl/envs/box2d/parking_garage/race_car.py +++ b/carl/envs/box2d/parking_garage/race_car.py @@ -368,7 +368,7 @@ def __init__(self, world: Box2D.b2World, init_angle: float, init_x: float, init_ self.drawlist = self.wheels + [self.hull] self.particles = [] - def gas(self, gas) -> None: + def gas(self, gas: float) -> None: """control: rear wheel drive Args: @@ -388,7 +388,7 @@ def gas(self, gas) -> None: diff = 0.1 # gradually increase, but stop immediately w.gas += diff - def brake(self, b) -> None: + def brake(self, b: float) -> None: """control: brake Args: @@ -404,7 +404,7 @@ def brake(self, b) -> None: for w in self.wheels[4:]: w.brake = b * 0.8 - def steer(self, s) -> None: + def steer(self, s: float) -> None: """control: steer Args: @@ -412,12 +412,13 @@ def steer(self, s) -> None: self.wheels[0].steer = s self.wheels[1].steer = s - def step(self, dt) -> None: + def step(self, dt: float) -> None: """ Copy of the original step function of 'gym.envs.box2d.car_dynamics.Car' needed to accept different engine powers or other fixed parameters - :param dt: - :return: + + dt : float + Timestep for simulation """ for w in self.wheels: # Steer each wheel diff --git a/carl/envs/box2d/parking_garage/trike.py b/carl/envs/box2d/parking_garage/trike.py index 861ff469..48416f6d 100644 --- a/carl/envs/box2d/parking_garage/trike.py +++ b/carl/envs/box2d/parking_garage/trike.py @@ -221,14 +221,14 @@ def __init__(self, world: Box2D.b2World, init_angle: float, init_x: float, init_ self.drawlist = self.wheels + [self.hull] self.particles = [] - def steer(self, s) -> None: + def steer(self, s: float) -> None: """control: steer Args: s (-1..1): target position, it takes time to rotate steering wheel from side-to-side""" self.wheels[0].steer = s - def gas(self, gas) -> None: + def gas(self, gas: float) -> None: """control: rear wheel drive Args: @@ -244,7 +244,7 @@ def gas(self, gas) -> None: diff = 0.1 # gradually increase, but stop immediately w.gas += diff - def brake(self, b) -> None: + def brake(self, b: float) -> None: """control: brake Args: @@ -260,12 +260,13 @@ def brake(self, b) -> None: for w in self.wheels[5:]: w.brake = b * 0.8 - def step(self, dt) -> None: + def step(self, dt: float) -> None: """ Copy of the original step function of 'gym.envs.box2d.car_dynamics.Car' needed to accept different Engin powers or other fixed parameters - :param dt: - :return: + + dt : float + Timestep for simulation """ for w in self.wheels: # Steer each wheel From 7e30680ec6f1c210945953c539258fbb1ca762a4 Mon Sep 17 00:00:00 2001 From: amsks Date: Wed, 6 Jul 2022 10:38:09 +0200 Subject: [PATCH 05/67] carl/context mypy fixed --- carl/context/augmentation.py | 7 +++---- carl/context/sampling.py | 4 +--- carl/context/selection.py | 8 ++++---- carl/context/utils.py | 4 ++-- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/carl/context/augmentation.py b/carl/context/augmentation.py index cfb3368c..5b987ac5 100644 --- a/carl/context/augmentation.py +++ b/carl/context/augmentation.py @@ -1,13 +1,13 @@ -from typing import List, Union +from typing import List, Union, Any import numpy as np def add_gaussian_noise( default_value: Union[float, List[float]], - percentage_std: float = 0.01, + percentage_std: Union[float, Any] = 0.01, random_generator: np.random.Generator = None, -) -> Union[float, List[float]]: +) -> Union[float, Any]: """ Add gaussian noise to default value. @@ -45,7 +45,6 @@ def add_gaussian_noise( seed = 123456 rng = np.random.default_rng(seed=seed) - default_value = 10 default_value = list(np.arange(0, 4)) percentage_std = 0.01 n_samples = 1000 diff --git a/carl/context/sampling.py b/carl/context/sampling.py index e2624486..7012175f 100644 --- a/carl/context/sampling.py +++ b/carl/context/sampling.py @@ -156,9 +156,7 @@ def sample_contexts( context_feature_type = sample_dists[k][1] lower_bound, upper_bound = env_bounds[k][0], env_bounds[k][1] if context_feature_type == list: - length = np.random.randint( - 5e5 - ) # TODO should we allow lists to be this long? or should we parametrize this? + length = np.random.randint(500000) # TODO should we allow lists to be this long? or should we parametrize this? arg_class = sample_dists[k][1][1] context_list = random_variable.rvs(size=length) context_list = np.clip(context_list, lower_bound, upper_bound) diff --git a/carl/context/selection.py b/carl/context/selection.py index 0c3eda3e..278c4e2c 100644 --- a/carl/context/selection.py +++ b/carl/context/selection.py @@ -79,7 +79,7 @@ class RandomSelector(AbstractSelector): Random Context Selector. """ - def _select(self): + def _select(self) -> Tuple[Context, int]: # TODO seed? context_id = np.random.choice(self.context_ids) context = self.contexts[self.contexts_keys[context_id]] @@ -93,7 +93,7 @@ class RoundRobinSelector(AbstractSelector): Iterate through all contexts and then start at the first again. """ - def _select(self): + def _select(self) -> Tuple[Context, int]: if self.context_id is None: self.context_id = -1 self.context_id = (self.context_id + 1) % len(self.contexts) @@ -139,7 +139,7 @@ def __init__( super().__init__(contexts=contexts) self.selector_function = selector_function - def _select(self): - context, context_id = self.selector_function(inst=self) + def _select(self) -> Tuple[Context, int]: + context, context_id = self.selector_function(self) self.context_id = context_id return context, context_id diff --git a/carl/context/utils.py b/carl/context/utils.py index 0223292c..be82889c 100644 --- a/carl/context/utils.py +++ b/carl/context/utils.py @@ -4,7 +4,7 @@ def get_context_bounds( - context_keys: List[str], context_bounds: Dict[str, Tuple[float, float, float]] + context_keys: List[str], context_bounds: Dict[str, Tuple[float, float]] ) -> Tuple[np.ndarray, np.ndarray]: """ Get context bounds for specific features. @@ -28,7 +28,7 @@ def get_context_bounds( upper_bounds = np.empty(shape=len(context_keys)) for i, context_key in enumerate(context_keys): - l, u, _ = context_bounds[context_key] + l, u = context_bounds[context_key] lower_bounds[i] = l upper_bounds[i] = u From 68b6a99d4e60fd6b3bbd9d42954ca6349bd81aec Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 10:55:51 +0200 Subject: [PATCH 06/67] Fix mypy --- carl/envs/carl_env.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/carl/envs/carl_env.py b/carl/envs/carl_env.py index ea29ddf9..8a494958 100644 --- a/carl/envs/carl_env.py +++ b/carl/envs/carl_env.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional, Tuple, Union +from typing import Any, Dict, List, Optional, Tuple, Union, Type, TypeVar import importlib import inspect @@ -19,6 +19,8 @@ import jax.numpy as jnp import jaxlib +ObsType = TypeVar("ObsType") + class CARLEnv(Wrapper): """ @@ -99,14 +101,14 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, Type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): super().__init__(env=env) # Gather args - self._context: Optional[Dict] = None # init for property - self._contexts: Optional[Dict[Any, Dict[Any, Any]]] = None # init for property + self._context: Dict # init for property + self._contexts: Dict[Any, Dict[Any, Any]] # init for property self.default_context = default_context self.contexts = contexts self.context_mask = context_mask @@ -116,10 +118,11 @@ def __init__( self.logger = logger self.add_gaussian_noise_to_context = add_gaussian_noise_to_context self.gaussian_noise_std_percentage = gaussian_noise_std_percentage + self.context_selector: Type[AbstractSelector] if context_selector is None: - self.context_selector = RoundRobinSelector(contexts=contexts) + self.context_selector = RoundRobinSelector(contexts=contexts) # type: ignore [assignment] elif isinstance(context_selector, AbstractSelector): - self.context_selector = context_selector + self.context_selector = context_selector # type: ignore [assignment] elif inspect.isclass(context_selector) and issubclass( context_selector, AbstractSelector ): @@ -127,7 +130,7 @@ def __init__( context_selector_kwargs = {} _context_selector_kwargs = {"contexts": contexts} context_selector_kwargs.update(_context_selector_kwargs) - self.context_selector = context_selector(**context_selector_kwargs) + self.context_selector = context_selector(**context_selector_kwargs) # type: ignore [assignment] else: raise ValueError( f"Context selector must be None or an AbstractSelector class or instance. " @@ -154,6 +157,7 @@ def __init__( # TODO properly record which are appended to state if logger is not None: fname = os.path.join(logger.logdir, "env_info.json") + save_val: Optional[List[str]] if state_context_features is not None: save_val = list(state_context_features) # please json else: @@ -167,9 +171,12 @@ def __init__( state_context_features = list( self.contexts[list(self.contexts.keys())[0]].keys() ) - self.state_context_features: List[str] = state_context_features + self.state_context_features: List[str] = state_context_features # type: ignore [assignment] + # (Mypy thinks that state_context_features is of type Optional[List[str]] which it can't be anymore due to the + # if-else clause) + # state_context_features contains the names of the context features that should be appended to the state - # However, if context_mask is set, we want to update staet_context_feature_names so that the context features + # However, if context_mask is set, we want to update state_context_feature_names so that the context features # in context_mask are not appended to the state anymore. if self.context_mask: self.state_context_features = [ @@ -225,7 +232,7 @@ def context(self) -> Dict: return self._context @context.setter - def context(self, context: Dict): + def context(self, context: Dict) -> None: self._context = self.fill_context_with_default(context=context) @property @@ -233,7 +240,7 @@ def contexts(self) -> Dict[Any, Dict[Any, Any]]: return self._contexts @contexts.setter - def contexts(self, contexts: Dict[Any, Dict[Any, Any]]): + def contexts(self, contexts: Dict[Any, Dict[Any, Any]]) -> None: self._contexts = { k: self.fill_context_with_default(context=v) for k, v in contexts.items() } @@ -259,7 +266,7 @@ def reset(self, **kwargs: Dict) -> Any: self._update_context() self._log_context() state = self.env.reset(**kwargs) - state = self.build_context_adaptive_state(state) + state = self.build_context_adaptive_state(state=state) return state def build_context_adaptive_state( From 9e4408ce9045b4f6f6987a69f4a4a4c8143c3056 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 10:59:28 +0200 Subject: [PATCH 07/67] Handle return types of gym.Env in reset --- carl/envs/carl_env.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/carl/envs/carl_env.py b/carl/envs/carl_env.py index 8a494958..1737e040 100644 --- a/carl/envs/carl_env.py +++ b/carl/envs/carl_env.py @@ -265,9 +265,16 @@ def reset(self, **kwargs: Dict) -> Any: self._progress_instance() self._update_context() self._log_context() - state = self.env.reset(**kwargs) + return_info = kwargs.get("return_info", False) + _ret = self.env.reset(**kwargs) + info_dict = dict() + if return_info: + state, info_dict = _ret state = self.build_context_adaptive_state(state=state) - return state + ret = state + if return_info: + ret = state, info_dict + return ret def build_context_adaptive_state( self, state: List[float], context_feature_values: Optional[List[float]] = None From 67f7534857c0ec5b8d7ce6994a5861b22b922af9 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 11:33:29 +0200 Subject: [PATCH 08/67] Fix mypy for carl_env.py --- carl/context/utils.py | 2 +- carl/envs/carl_env.py | 53 ++++++++++++++++++++++++------------------- carl/utils/types.py | 4 +++- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/carl/context/utils.py b/carl/context/utils.py index 0223292c..90985c95 100644 --- a/carl/context/utils.py +++ b/carl/context/utils.py @@ -4,7 +4,7 @@ def get_context_bounds( - context_keys: List[str], context_bounds: Dict[str, Tuple[float, float, float]] + context_keys: List[str], context_bounds: Dict[str, Tuple[float, float, type]] ) -> Tuple[np.ndarray, np.ndarray]: """ Get context bounds for specific features. diff --git a/carl/envs/carl_env.py b/carl/envs/carl_env.py index 1737e040..fe9d5dbd 100644 --- a/carl/envs/carl_env.py +++ b/carl/envs/carl_env.py @@ -1,4 +1,5 @@ from typing import Any, Dict, List, Optional, Tuple, Union, Type, TypeVar +from types import ModuleType import importlib import inspect @@ -12,6 +13,7 @@ from carl.context.augmentation import add_gaussian_noise from carl.context.selection import AbstractSelector, RoundRobinSelector from carl.context.utils import get_context_bounds +from carl.utils.types import Vector from carl.utils.trial_logger import TrialLogger brax_spec = importlib.util.find_spec("brax") @@ -136,6 +138,7 @@ def __init__( f"Context selector must be None or an AbstractSelector class or instance. " f"Got type {type(context_selector)}." ) + context_keys: Vector if state_context_features is not None: if ( state_context_features == "changing_context_features" @@ -245,7 +248,7 @@ def contexts(self, contexts: Dict[Any, Dict[Any, Any]]) -> None: k: self.fill_context_with_default(context=v) for k, v in contexts.items() } - def reset(self, **kwargs: Dict) -> Any: + def reset(self, **kwargs: Dict) -> Union[ObsType, tuple[ObsType, dict]]: # type: ignore [override] """ Reset environment. @@ -258,6 +261,8 @@ def reset(self, **kwargs: Dict) -> Any: ------- state State of environment after reset. + info_dict : dict + Return also if return_info=True. """ self.episode_counter += 1 @@ -266,10 +271,12 @@ def reset(self, **kwargs: Dict) -> Any: self._update_context() self._log_context() return_info = kwargs.get("return_info", False) - _ret = self.env.reset(**kwargs) + _ret = self.env.reset(**kwargs) # type: ignore [arg-type] info_dict = dict() if return_info: state, info_dict = _ret + else: + state = _ret state = self.build_context_adaptive_state(state=state) ret = state if return_info: @@ -277,9 +284,9 @@ def reset(self, **kwargs: Dict) -> Any: return ret def build_context_adaptive_state( - self, state: List[float], context_feature_values: Optional[List[float]] = None - ) -> List[float]: - tnp = np + self, state: List[float], context_feature_values: Optional[Vector] = None + ) -> Union[Vector, Dict]: + tnp: ModuleType = np if brax_spec is not None: if type(state) == jaxlib.xla_extension.DeviceArray: tnp = jnp @@ -303,7 +310,7 @@ def build_context_adaptive_state( ) if self.dict_observation_space: - state = dict(state=state, context=context_values) + state: Dict = dict(state=state, context=context_values) # type: ignore [no-redef] elif self.vectorized: state = tnp.array([np.concatenate((s, context_values)) for s in state]) else: @@ -348,7 +355,7 @@ def step(self, action: Any) -> Tuple[Any, Any, bool, Dict]: ) # Add context features to state - state = self.build_context_adaptive_state(state, context_feature_values) + state = self.build_context_adaptive_state(state=state, context_feature_values=context_feature_values) self.total_timestep_counter += 1 self.step_counter += 1 @@ -402,7 +409,7 @@ def _progress_instance(self) -> None: None """ - context = self.context_selector.select() + context = self.context_selector.select() # type: ignore [call-arg] if self.add_gaussian_noise_to_context and self.whitelist_gaussian_noise: context_augmented = {} @@ -420,9 +427,9 @@ def _progress_instance(self) -> None: def build_observation_space( self, - env_lower_bounds: Optional[Union[List, np.array]] = None, - env_upper_bounds: Optional[Union[List, np.array]] = None, - context_bounds: Optional[Dict[str, Tuple[float]]] = None, + env_lower_bounds: Optional[Vector] = None, + env_upper_bounds: Optional[Vector] = None, + context_bounds: Optional[Dict[str, Tuple[float, float, type]]] = None, ) -> None: """ Build observation space of environment. @@ -437,10 +444,10 @@ def build_observation_space( both are None, (re-)create bounds (low=-inf, high=inf) with correct dimension. env_upper_bounds: Optional[Union[List, np.array]], default=None Upper bounds for environment observation space. - context_bounds: Optional[Dict[str, Tuple[float]]], default=None + context_bounds: Optional[Dict[str, Tuple[float, float, float]]], default=None Lower and upper bounds for context features. The bounds are provided as a Dict containing the context feature names/ids as keys and the - bounds per feature as a tuple (low, high). + bounds per feature as a tuple (low, high, dtype). If None and the context should not be hidden, creates default bounds with (low=-inf, high=inf) with correct dimension. @@ -469,7 +476,7 @@ def build_observation_space( obs_space = ( self.env.observation_space.spaces["state"].low if isinstance(self.env.observation_space, spaces.Dict) - else self.env.observation_space.low + else self.env.observation_space.low # type: ignore [attr-defined] ) obs_shape = obs_space.shape if len(obs_shape) == 3 and self.hide_context: @@ -486,8 +493,8 @@ def build_observation_space( and len(self.state_context_features) == 0 ): self.env.observation_space = spaces.Box( - env_lower_bounds, - env_upper_bounds, + np.array(env_lower_bounds), + np.array(env_upper_bounds), dtype=np.float32, ) else: @@ -510,22 +517,22 @@ def build_observation_space( self.env.observation_space = spaces.Dict( { "state": spaces.Box( - low=env_lower_bounds, - high=env_upper_bounds, + low=np.array(env_lower_bounds), + high=np.array(env_upper_bounds), dtype=np.float32, ), "context": spaces.Box( - low=context_lower_bounds, - high=context_upper_bounds, + low=np.array(context_lower_bounds), + high=np.array(context_upper_bounds), dtype=np.float32, ), } ) else: - low = np.concatenate((env_lower_bounds, context_lower_bounds)) - high = np.concatenate((env_upper_bounds, context_upper_bounds)) + low: Vector = np.concatenate((np.array(env_lower_bounds), np.array(context_lower_bounds))) + high: Vector = np.concatenate((np.array(env_upper_bounds), np.array(context_upper_bounds))) self.env.observation_space = spaces.Box( - low=low, high=high, dtype=np.float32 + low=np.array(low), high=np.array(high), dtype=np.float32 ) self.observation_space = ( self.env.observation_space diff --git a/carl/utils/types.py b/carl/utils/types.py index 53ac9628..97096107 100644 --- a/carl/utils/types.py +++ b/carl/utils/types.py @@ -1,3 +1,5 @@ -from typing import Any, Dict +from typing import Any, Dict, Union, List +import numpy as np Context = Dict[str, Any] +Vector = Union[List[Any], np.typing.NDArray] From dc6d75b29e7928e51306ff67ede43d2f4249bbfc Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 12:11:30 +0200 Subject: [PATCH 09/67] Correct reset function --- carl/envs/classic_control/carl_mountaincar.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/carl/envs/classic_control/carl_mountaincar.py b/carl/envs/classic_control/carl_mountaincar.py index 61d23f3f..f579229b 100644 --- a/carl/envs/classic_control/carl_mountaincar.py +++ b/carl/envs/classic_control/carl_mountaincar.py @@ -45,7 +45,7 @@ def __init__(self, goal_velocity: float = 0.0): self.min_velocity_start = 0.0 self.max_velocity_start = 0.0 - def reset_state(self) -> np.ndarray: + def sample_initial_state(self) -> np.ndarray: return np.array( [ self.np_random.uniform( @@ -57,9 +57,19 @@ def reset_state(self) -> np.ndarray: ] ) - def reset(self) -> np.ndarray: - self.state = self.reset_state().squeeze() - return self.state + def reset( + self, + *, + seed: Optional[int] = None, + return_info: bool = False, + options: Optional[dict] = None, + ) -> Union[np.ndarray, tuple[np.ndarray, dict]]: + super().reset(seed=seed) + self.state = self.sample_initial_state() + if not return_info: + return np.array(self.state, dtype=np.float32) + else: + return np.array(self.state, dtype=np.float32), {} def step(self, action: int) -> Tuple[np.ndarray, float, bool, Dict]: state, reward, done, info = super().step(action) From 7c763f8d259c4a22a84d5e62fbee08a5bea4660e Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 12:11:34 +0200 Subject: [PATCH 10/67] Fix mypy --- carl/envs/carl_env.py | 8 +++----- carl/envs/classic_control/carl_acrobot.py | 7 ++++--- carl/envs/classic_control/carl_cartpole.py | 9 +++++---- carl/envs/classic_control/carl_mountaincar.py | 6 ++++-- carl/envs/classic_control/carl_mountaincarcontinuous.py | 9 +++++---- carl/envs/classic_control/carl_pendulum.py | 7 ++++--- carl/utils/types.py | 3 ++- 7 files changed, 27 insertions(+), 22 deletions(-) diff --git a/carl/envs/carl_env.py b/carl/envs/carl_env.py index fe9d5dbd..33eb9a21 100644 --- a/carl/envs/carl_env.py +++ b/carl/envs/carl_env.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional, Tuple, Union, Type, TypeVar +from typing import Any, Dict, List, Optional, Tuple, Union, Type, Mapping from types import ModuleType import importlib @@ -13,7 +13,7 @@ from carl.context.augmentation import add_gaussian_noise from carl.context.selection import AbstractSelector, RoundRobinSelector from carl.context.utils import get_context_bounds -from carl.utils.types import Vector +from carl.utils.types import Vector, ObsType from carl.utils.trial_logger import TrialLogger brax_spec = importlib.util.find_spec("brax") @@ -21,8 +21,6 @@ import jax.numpy as jnp import jaxlib -ObsType = TypeVar("ObsType") - class CARLEnv(Wrapper): """ @@ -429,7 +427,7 @@ def build_observation_space( self, env_lower_bounds: Optional[Vector] = None, env_upper_bounds: Optional[Vector] = None, - context_bounds: Optional[Dict[str, Tuple[float, float, type]]] = None, + context_bounds: Optional[Mapping[str, Tuple[float, float, type]]] = None, ) -> None: """ Build observation space of environment. diff --git a/carl/envs/classic_control/carl_acrobot.py b/carl/envs/classic_control/carl_acrobot.py index 046ad3cf..4c93770b 100644 --- a/carl/envs/classic_control/carl_acrobot.py +++ b/carl/envs/classic_control/carl_acrobot.py @@ -75,7 +75,7 @@ def reset( seed: Optional[int] = None, return_info: bool = False, options: Optional[dict] = None, - ): + ) -> Union[np.ndarray, tuple[np.ndarray, dict]]: super().reset(seed=seed) low = ( self.INITIAL_ANGLE_LOWER, @@ -99,7 +99,7 @@ def reset( class CARLAcrobotEnv(CARLEnv): def __init__( self, - env: gym.Env = CustomAcrobotEnv(), + env: CustomAcrobotEnv = CustomAcrobotEnv(), contexts: Dict[Any, Dict[Any, Any]] = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = False, @@ -112,7 +112,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -139,6 +139,7 @@ def __init__( ) # allow to augment all values def _update_context(self) -> None: + self.env: CustomAcrobotEnv self.env.LINK_LENGTH_1 = self.context["link_length_1"] self.env.LINK_LENGTH_2 = self.context["link_length_2"] self.env.LINK_MASS_1 = self.context["link_mass_1"] diff --git a/carl/envs/classic_control/carl_cartpole.py b/carl/envs/classic_control/carl_cartpole.py index d8ffa0f2..43d068aa 100644 --- a/carl/envs/classic_control/carl_cartpole.py +++ b/carl/envs/classic_control/carl_cartpole.py @@ -36,7 +36,7 @@ class CustomCartPoleEnv(CartPoleEnv): - def __init__(self): + def __init__(self) -> None: super().__init__() self.initial_state_lower = -0.05 self.initial_state_upper = 0.05 @@ -47,7 +47,7 @@ def reset( seed: Optional[int] = None, return_info: bool = False, options: Optional[dict] = None, - ): + ) -> Union[np.ndarray, tuple[np.ndarray, dict]]: super().reset(seed=seed) self.state = self.np_random.uniform( low=self.initial_state_lower, high=self.initial_state_upper, size=(4,) @@ -62,7 +62,7 @@ def reset( class CARLCartPoleEnv(CARLEnv): def __init__( self, - env: gym.Env = CustomCartPoleEnv(), + env: CustomCartPoleEnv = CustomCartPoleEnv(), contexts: Dict[Any, Dict[Any, Any]] = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = False, @@ -75,7 +75,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -102,6 +102,7 @@ def __init__( ) # allow to augment all values def _update_context(self) -> None: + self.env: CustomCartPoleEnv self.env.gravity = self.context["gravity"] self.env.masscart = self.context["masscart"] self.env.masspole = self.context["masspole"] diff --git a/carl/envs/classic_control/carl_mountaincar.py b/carl/envs/classic_control/carl_mountaincar.py index f579229b..815c58f6 100644 --- a/carl/envs/classic_control/carl_mountaincar.py +++ b/carl/envs/classic_control/carl_mountaincar.py @@ -44,6 +44,7 @@ def __init__(self, goal_velocity: float = 0.0): self.max_position_start = -0.4 self.min_velocity_start = 0.0 self.max_velocity_start = 0.0 + self.state: np.ndarray def sample_initial_state(self) -> np.ndarray: return np.array( @@ -84,7 +85,7 @@ def step(self, action: int) -> Tuple[np.ndarray, float, bool, Dict]: class CARLMountainCarEnv(CARLEnv): def __init__( self, - env: gym.Env = CustomMountainCarEnv(), + env: CustomMountainCarEnv = CustomMountainCarEnv(), contexts: Dict[Any, Dict[Any, Any]] = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = False, @@ -97,7 +98,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -134,6 +135,7 @@ def __init__( ) # allow to augment all values def _update_context(self) -> None: + self.env: CustomMountainCarEnv self.env.min_position = self.context["min_position"] self.env.max_position = self.context["max_position"] self.env.max_speed = self.context["max_speed"] diff --git a/carl/envs/classic_control/carl_mountaincarcontinuous.py b/carl/envs/classic_control/carl_mountaincarcontinuous.py index a620688c..acc09028 100644 --- a/carl/envs/classic_control/carl_mountaincarcontinuous.py +++ b/carl/envs/classic_control/carl_mountaincarcontinuous.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Optional, Union +from typing import Dict, List, Optional, Union, Any import gym import gym.envs.classic_control as gccenvs @@ -65,8 +65,8 @@ def reset_state(self) -> np.ndarray: class CARLMountainCarContinuousEnv(CARLEnv): def __init__( self, - env: gym.Env = CustomMountainCarContinuousEnv(), - contexts: Dict[str, Dict] = {}, + env: CustomMountainCarContinuousEnv = CustomMountainCarContinuousEnv(), + contexts: Dict[Any, Dict[Any, Any]] = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = True, gaussian_noise_std_percentage: float = 0.01, @@ -78,7 +78,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -115,6 +115,7 @@ def __init__( ) # allow to augment all values def _update_context(self) -> None: + self.env: CustomMountainCarContinuousEnv self.env.min_position = self.context["min_position"] self.env.max_position = self.context["max_position"] self.env.max_speed = self.context["max_speed"] diff --git a/carl/envs/classic_control/carl_pendulum.py b/carl/envs/classic_control/carl_pendulum.py index 926b08b4..691a4ff3 100644 --- a/carl/envs/classic_control/carl_pendulum.py +++ b/carl/envs/classic_control/carl_pendulum.py @@ -42,7 +42,7 @@ def reset( seed: Optional[int] = None, return_info: bool = False, options: Optional[dict] = None, - ): + ) -> Union[np.ndarray, tuple[np.ndarray, dict]]: super().reset(seed=seed) high = np.array([self.initial_angle_max, self.initial_velocity_max]) self.state = self.np_random.uniform(low=-high, high=high) @@ -56,7 +56,7 @@ def reset( class CARLPendulumEnv(CARLEnv): def __init__( self, - env: gym.Env = CustomPendulum(), + env: CustomPendulum = CustomPendulum(), contexts: Dict[Any, Dict[Any, Any]] = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = False, @@ -69,7 +69,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -108,6 +108,7 @@ def __init__( ) # allow to augment all values def _update_context(self) -> None: + self.env: CustomPendulum self.env.max_speed = self.context["max_speed"] self.env.dt = self.context["dt"] self.env.l = self.context["l"] # noqa: E741 ambiguous variable name diff --git a/carl/utils/types.py b/carl/utils/types.py index 97096107..cd02e6eb 100644 --- a/carl/utils/types.py +++ b/carl/utils/types.py @@ -1,5 +1,6 @@ -from typing import Any, Dict, Union, List +from typing import Any, Dict, Union, List, TypeVar import numpy as np Context = Dict[str, Any] Vector = Union[List[Any], np.typing.NDArray] +ObsType = TypeVar("ObsType") From b64b817d75aff2790d518702ed8996291a9f990b Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 12:27:29 +0200 Subject: [PATCH 11/67] Fix mypy brax --- carl/envs/brax/carl_fetch.py | 8 +++++--- carl/envs/brax/carl_grasp.py | 8 +++++--- carl/envs/brax/carl_halfcheetah.py | 8 +++++--- carl/envs/brax/carl_humanoid.py | 8 +++++--- carl/utils/doc_building/render_brax_env.py | 4 +++- carl/utils/types.py | 3 ++- 6 files changed, 25 insertions(+), 14 deletions(-) diff --git a/carl/envs/brax/carl_fetch.py b/carl/envs/brax/carl_fetch.py index c3253091..8d68142f 100644 --- a/carl/envs/brax/carl_fetch.py +++ b/carl/envs/brax/carl_fetch.py @@ -14,6 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts DEFAULT_CONTEXT = { "joint_stiffness": 5000, @@ -45,8 +46,8 @@ def __init__( self, env: Fetch = Fetch(), n_envs: int = 1, - contexts: Dict[str, Dict] = {}, - hide_context=False, + contexts: Contexts = {}, + hide_context: bool = False, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, @@ -56,7 +57,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -91,6 +92,7 @@ def __init__( ) # allow to augment all values def _update_context(self) -> None: + self.env = Fetch config = copy.deepcopy(self.base_config) config["gravity"] = {"z": self.context["gravity"]} config["friction"] = self.context["friction"] diff --git a/carl/envs/brax/carl_grasp.py b/carl/envs/brax/carl_grasp.py index 0ba14df7..bf3f6184 100644 --- a/carl/envs/brax/carl_grasp.py +++ b/carl/envs/brax/carl_grasp.py @@ -14,6 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts DEFAULT_CONTEXT = { "joint_stiffness": 5000, @@ -45,8 +46,8 @@ def __init__( self, env: Grasp = Grasp(), n_envs: int = 1, - contexts: Dict[str, Dict] = {}, - hide_context=False, + contexts: Contexts = {}, + hide_context: bool = False, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, @@ -56,7 +57,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -91,6 +92,7 @@ def __init__( ) # allow to augment all values def _update_context(self) -> None: + self.env: Grasp config = copy.deepcopy(self.base_config) config["gravity"] = {"z": self.context["gravity"]} config["friction"] = self.context["friction"] diff --git a/carl/envs/brax/carl_halfcheetah.py b/carl/envs/brax/carl_halfcheetah.py index fb9f1d57..b0960738 100644 --- a/carl/envs/brax/carl_halfcheetah.py +++ b/carl/envs/brax/carl_halfcheetah.py @@ -14,6 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts DEFAULT_CONTEXT = { "joint_stiffness": 15000.0, @@ -39,8 +40,8 @@ def __init__( self, env: Halfcheetah = Halfcheetah(), n_envs: int = 1, - contexts: Dict[Any, Dict[Any, Any]] = {}, - hide_context=False, + contexts: Contexts = {}, + hide_context: bool = False, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, @@ -50,7 +51,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -85,6 +86,7 @@ def __init__( ) # allow to augment all values def _update_context(self) -> None: + self.env: Halfcheetah config = copy.deepcopy(self.base_config) config["gravity"] = {"z": self.context["gravity"]} config["friction"] = self.context["friction"] diff --git a/carl/envs/brax/carl_humanoid.py b/carl/envs/brax/carl_humanoid.py index dc66ccd4..c42f5428 100644 --- a/carl/envs/brax/carl_humanoid.py +++ b/carl/envs/brax/carl_humanoid.py @@ -16,6 +16,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts DEFAULT_CONTEXT = { "gravity": -9.8, @@ -39,8 +40,8 @@ def __init__( self, env: Humanoid = Humanoid(), n_envs: int = 1, - contexts: Dict[str, Dict] = {}, - hide_context=False, + contexts: Contexts = {}, + hide_context: bool = False, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, @@ -50,7 +51,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -85,6 +86,7 @@ def __init__( ) # allow to augment all values def _update_context(self) -> None: + self.env: Humanoid config = copy.deepcopy(self.base_config) config["gravity"] = {"z": self.context["gravity"]} config["friction"] = self.context["friction"] diff --git a/carl/utils/doc_building/render_brax_env.py b/carl/utils/doc_building/render_brax_env.py index 1c51391d..7cd953e2 100644 --- a/carl/utils/doc_building/render_brax_env.py +++ b/carl/utils/doc_building/render_brax_env.py @@ -1,5 +1,7 @@ if __name__ == "__main__": + from typing import List import jax + import brax from brax import envs from brax.io import html from IPython.display import HTML @@ -9,7 +11,7 @@ env = env_fn() state = env.reset(rng=jax.random.PRNGKey(seed=1)) - def visualize(sys, qps): + def visualize(sys: brax.System, qps: List[brax.QP]) -> HTML: """Renders a 3D visualization of the environment.""" return HTML(html.render(sys, qps)) diff --git a/carl/utils/types.py b/carl/utils/types.py index cd02e6eb..e9181a72 100644 --- a/carl/utils/types.py +++ b/carl/utils/types.py @@ -2,5 +2,6 @@ import numpy as np Context = Dict[str, Any] -Vector = Union[List[Any], np.typing.NDArray] +Contexts = Dict[Any, Context] +Vector = Union[List[Any], np.ndarray] ObsType = TypeVar("ObsType") From 95e0234b270833b284f2c0406da5ba157ee76c11 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 13:28:56 +0200 Subject: [PATCH 12/67] Fix mypy brax --- carl/envs/brax/carl_ant.py | 8 +++++--- carl/envs/brax/carl_fetch.py | 2 +- carl/envs/brax/carl_ur5e.py | 8 +++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/carl/envs/brax/carl_ant.py b/carl/envs/brax/carl_ant.py index cdeae740..32d83ea8 100644 --- a/carl/envs/brax/carl_ant.py +++ b/carl/envs/brax/carl_ant.py @@ -14,6 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts DEFAULT_CONTEXT = { "joint_stiffness": 5000, @@ -41,8 +42,8 @@ def __init__( self, env: Ant = Ant(), n_envs: int = 1, - contexts: Dict[str, Dict] = {}, - hide_context=False, + contexts: Contexts = {}, + hide_context: bool = False, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, @@ -52,7 +53,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -87,6 +88,7 @@ def __init__( ) # allow to augment all values def _update_context(self) -> None: + self.env: Ant config = copy.deepcopy(self.base_config) config["gravity"] = {"z": self.context["gravity"]} config["friction"] = self.context["friction"] diff --git a/carl/envs/brax/carl_fetch.py b/carl/envs/brax/carl_fetch.py index 8d68142f..c758f26c 100644 --- a/carl/envs/brax/carl_fetch.py +++ b/carl/envs/brax/carl_fetch.py @@ -92,7 +92,7 @@ def __init__( ) # allow to augment all values def _update_context(self) -> None: - self.env = Fetch + self.env: Fetch config = copy.deepcopy(self.base_config) config["gravity"] = {"z": self.context["gravity"]} config["friction"] = self.context["friction"] diff --git a/carl/envs/brax/carl_ur5e.py b/carl/envs/brax/carl_ur5e.py index 4838abfe..6dff86fb 100644 --- a/carl/envs/brax/carl_ur5e.py +++ b/carl/envs/brax/carl_ur5e.py @@ -14,6 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts DEFAULT_CONTEXT = { "joint_stiffness": 40000, @@ -45,8 +46,8 @@ def __init__( self, env: Ur5e = Ur5e(), n_envs: int = 1, - contexts: Dict[str, Dict] = {}, - hide_context=False, + contexts: Contexts = {}, + hide_context: bool = False, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, @@ -56,7 +57,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -91,6 +92,7 @@ def __init__( ) # allow to augment all values def _update_context(self) -> None: + self.env: Ur5e config = copy.deepcopy(self.base_config) config["gravity"] = {"z": self.context["gravity"]} config["friction"] = self.context["friction"] From 9dcabadd43b413334bf2ff8a899a976033225753 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 13:42:58 +0200 Subject: [PATCH 13/67] Moved demo to examples --- carl/envs/box2d/carl_lunarlander.py | 48 ----------------------- examples/demo_heuristic_lunarlander.py | 54 ++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 48 deletions(-) create mode 100644 examples/demo_heuristic_lunarlander.py diff --git a/carl/envs/box2d/carl_lunarlander.py b/carl/envs/box2d/carl_lunarlander.py index 5cee0ad4..c06e60f7 100644 --- a/carl/envs/box2d/carl_lunarlander.py +++ b/carl/envs/box2d/carl_lunarlander.py @@ -176,51 +176,3 @@ def _update_context(self) -> None: gravity = (gravity_x, gravity_y) self.env.world.gravity = gravity - - -def demo_heuristic_lander( - env: Union[ - CARLLunarLanderEnv, lunar_lander.LunarLander, lunar_lander.LunarLanderContinuous - ], - seed: Optional[int] = None, - render: bool = False, -) -> float: - """ - Copied from LunarLander - """ - env.seed(seed) - total_reward = 0 - steps = 0 - env.render() - s = env.reset() - while True: - a = heuristic(env, s) - s, r, done, info = env.step(a) - total_reward += r - - if render: - still_open = env.render() - if not still_open: - break - - if done: # or steps % 20 == 0: - # print("observations:", " ".join(["{:+0.2f}".format(x) for x in s])) - print("step {} total_reward {:+0.2f}".format(steps, total_reward)) - steps += 1 - if done: - break - return total_reward - - -if __name__ == "__main__": - env = CARLLunarLanderEnv( - hide_context=False, - add_gaussian_noise_to_context=True, - gaussian_noise_std_percentage=0.1, - ) - # env.render() # initialize viewer. otherwise weird bug. - # env = ll.LunarLander() - # env = CustomLunarLanderEnv() - for i in range(5): - demo_heuristic_lander(env, seed=1, render=True) - env.close() diff --git a/examples/demo_heuristic_lunarlander.py b/examples/demo_heuristic_lunarlander.py new file mode 100644 index 00000000..d05e0ed4 --- /dev/null +++ b/examples/demo_heuristic_lunarlander.py @@ -0,0 +1,54 @@ +from typing import Union, Optional + +from gym.envs.box2d.lunar_lander import heuristic +import gym.envs.box2d.lunar_lander as lunar_lander + +from carl.envs import CARLLunarLanderEnv + + +def demo_heuristic_lander( + env: Union[ + CARLLunarLanderEnv, lunar_lander.LunarLander, lunar_lander.LunarLanderContinuous + ], + seed: Optional[int] = None, + render: bool = False, +) -> float: + """ + Copied from LunarLander + """ + env.seed(seed) + total_reward = 0 + steps = 0 + env.render() + s = env.reset() + while True: + a = heuristic(env, s) + s, r, done, info = env.step(a) + total_reward += r + + if render: + still_open = env.render() + if not still_open: + break + + if done: # or steps % 20 == 0: + # print("observations:", " ".join(["{:+0.2f}".format(x) for x in s])) + print("step {} total_reward {:+0.2f}".format(steps, total_reward)) + steps += 1 + if done: + break + return total_reward + + +if __name__ == "__main__": + env = CARLLunarLanderEnv( + hide_context=False, + add_gaussian_noise_to_context=True, + gaussian_noise_std_percentage=0.1, + ) + # env.render() # initialize viewer. otherwise weird bug. + # env = ll.LunarLander() + # env = CustomLunarLanderEnv() + for i in range(5): + demo_heuristic_lander(env, seed=1, render=True) + env.close() From 5f2a34fb122cbaa2f7920d0251883abf770b1d4b Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 13:51:04 +0200 Subject: [PATCH 14/67] Update reset signature --- carl/envs/box2d/carl_vehicle_racing.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/carl/envs/box2d/carl_vehicle_racing.py b/carl/envs/box2d/carl_vehicle_racing.py index 6908c728..3bf91c26 100644 --- a/carl/envs/box2d/carl_vehicle_racing.py +++ b/carl/envs/box2d/carl_vehicle_racing.py @@ -91,7 +91,13 @@ def __init__(self, vehicle_class: Type[Car] = Car, verbose: int = 1): super().__init__(verbose) self.vehicle_class = vehicle_class - def reset(self) -> np.ndarray: + def reset( + self, + *, + seed: Optional[int] = None, + return_info: bool = False, + options: Optional[dict] = None, + ) -> Union[ObsType, tuple[ObsType, dict]]: self._destroy() self.reward = 0.0 self.prev_reward = 0.0 @@ -114,7 +120,11 @@ def reset(self) -> np.ndarray: 49 ): # this sets up the environment and resolves any initial violations of geometry self.step(None) - return self.step(None)[0] + + if not return_info: + return self.step(None)[0] + else: + return self.step(None)[0], {} def render_indicators(self, W: int, H: int) -> None: # copied from meta car racing From c150ed2c3aecc65bc91776ea80597cea4aae949f Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 13:51:27 +0200 Subject: [PATCH 15/67] Remove rendering of score label In the current gym version, there is no score label. --- carl/envs/box2d/carl_vehicle_racing.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/carl/envs/box2d/carl_vehicle_racing.py b/carl/envs/box2d/carl_vehicle_racing.py index 3bf91c26..f477fbd0 100644 --- a/carl/envs/box2d/carl_vehicle_racing.py +++ b/carl/envs/box2d/carl_vehicle_racing.py @@ -188,8 +188,6 @@ def horiz_ind(place: int, val: int, color: Tuple) -> None: len(polygons) // 3, ("v3f", polygons), ("c4f", colors) # gl.GL_QUADS, ) vl.draw(gl.GL_QUADS) - self.score_label.text = "%04i" % self.reward - self.score_label.draw() class CARLVehicleRacingEnv(CARLEnv): From 87ef74cf1f51ec8d617341829c0a06844a648477 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 13:53:04 +0200 Subject: [PATCH 16/67] Fix mypy box2d --- carl/envs/box2d/carl_bipedal_walker.py | 5 +++-- carl/envs/box2d/carl_lunarlander.py | 7 ++++--- carl/envs/box2d/carl_vehicle_racing.py | 6 ++++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/carl/envs/box2d/carl_bipedal_walker.py b/carl/envs/box2d/carl_bipedal_walker.py index bad4a401..3a11adfd 100644 --- a/carl/envs/box2d/carl_bipedal_walker.py +++ b/carl/envs/box2d/carl_bipedal_walker.py @@ -89,7 +89,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -126,7 +126,8 @@ def __init__( DEFAULT_CONTEXT.keys() ) # allow to augment all values - def _update_context(self): + def _update_context(self) -> None: + self.env: bipedal_walker.BipedalWalker bpw.FPS = self.context["FPS"] bpw.SCALE = self.context["SCALE"] bpw.FRICTION = self.context["FRICTION"] diff --git a/carl/envs/box2d/carl_lunarlander.py b/carl/envs/box2d/carl_lunarlander.py index c06e60f7..8acaf846 100644 --- a/carl/envs/box2d/carl_lunarlander.py +++ b/carl/envs/box2d/carl_lunarlander.py @@ -2,7 +2,6 @@ from gym import Wrapper from gym.envs.box2d import lunar_lander -from gym.envs.box2d.lunar_lander import heuristic from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv @@ -85,12 +84,13 @@ def __init__( self.active_seed = None def step(self, action: ActType) -> Tuple[ObsType, float, bool, dict]: + self.env: lunar_lander.LunarLander state, reward, done, info = self.env.step(action) if self.env.game_over and self.high_gameover_penalty: reward = -10000 return state, reward, done, info - def seed(self, seed=None): + def seed(self, seed: Optional[int] = None) -> Optional[int]: seed_ = self.env.seed(seed) self.active_seed = seed_[0] return seed_ @@ -113,7 +113,7 @@ def __init__( high_gameover_penalty: bool = False, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -153,6 +153,7 @@ def __init__( ) # allow to augment all values def _update_context(self) -> None: + self.env: LunarLanderEnv lunar_lander.FPS = self.context["FPS"] lunar_lander.SCALE = self.context["SCALE"] lunar_lander.MAIN_ENGINE_POWER = self.context["MAIN_ENGINE_POWER"] diff --git a/carl/envs/box2d/carl_vehicle_racing.py b/carl/envs/box2d/carl_vehicle_racing.py index f477fbd0..0b2a11e6 100644 --- a/carl/envs/box2d/carl_vehicle_racing.py +++ b/carl/envs/box2d/carl_vehicle_racing.py @@ -38,6 +38,7 @@ from carl.envs.box2d.parking_garage.trike import TukTukSmallTrailer # as Car from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import ObsType, Contexts PARKING_GARAGE_DICT = { # Racing car @@ -194,7 +195,7 @@ class CARLVehicleRacingEnv(CARLEnv): def __init__( self, env: CustomCarRacingEnv = CustomCarRacingEnv(), - contexts: Optional[Dict[Union[str, int], Dict[Any, Any]]] = None, + contexts: Optional[Contexts] = None, hide_context: bool = True, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, @@ -205,7 +206,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -248,6 +249,7 @@ def __init__( ] def _update_context(self) -> None: + self.env: CustomCarRacingEnv vehicle_class_index = self.context["VEHICLE"] self.env.vehicle_class = PARKING_GARAGE[vehicle_class_index] From 101bf55b55a3e8f06cddf96419fee1723f06bd8b Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 13:58:29 +0200 Subject: [PATCH 17/67] Move CARLVehicleRacing example --- carl/envs/box2d/carl_vehicle_racing.py | 62 ------------------------ examples/demo_carracing.py | 66 ++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 62 deletions(-) create mode 100644 examples/demo_carracing.py diff --git a/carl/envs/box2d/carl_vehicle_racing.py b/carl/envs/box2d/carl_vehicle_racing.py index 0b2a11e6..bab09360 100644 --- a/carl/envs/box2d/carl_vehicle_racing.py +++ b/carl/envs/box2d/carl_vehicle_racing.py @@ -252,65 +252,3 @@ def _update_context(self) -> None: self.env: CustomCarRacingEnv vehicle_class_index = self.context["VEHICLE"] self.env.vehicle_class = PARKING_GARAGE[vehicle_class_index] - - -if __name__ == "__main__": - import time - - from pyglet.window import key - - a = np.array([0.0, 0.0, 0.0]) - - def key_press(k: int, mod: Any) -> None: - global restart - if k == 0xFF0D: - restart = True - if k == key.SPACE: - restart = True - if k == key.LEFT: - a[0] = -1.0 - if k == key.RIGHT: - a[0] = +1.0 - if k == key.UP: - a[1] = +1.0 - if k == key.DOWN: - a[2] = +1.0 - - def key_release(k: int, mod: Any) -> None: - if k == key.LEFT and a[0] == -1.0: - a[0] = 0 - if k == key.RIGHT and a[0] == +1.0: - a[0] = 0 - if k == key.UP: - a[1] = 0 - if k == key.DOWN: - a[2] = 0 - - contexts = {i: {"VEHICLE": i} for i in range(len(VEHICLE_NAMES))} - env = CARLVehicleRacingEnv(contexts=contexts) - env.render() - env.viewer.window.on_key_press = key_press - env.viewer.window.on_key_release = key_release - record_video = False - if record_video: - from gym.wrappers.monitor import Monitor - - env = Monitor(env, "/tmp/video-test", force=True) - isopen = True - while isopen: - env.reset() - total_reward = 0.0 - steps = 0 - restart = False - while True: - s, r, done, info = env.step(a) - time.sleep(0.025) - total_reward += r - if steps % 200 == 0 or done: - print("\naction " + str(["{:+0.2f}".format(x) for x in a])) - print("step {} total_reward {:+0.2f}".format(steps, total_reward)) - steps += 1 - isopen = env.render() - if done or restart or not isopen: - break - env.close() diff --git a/examples/demo_carracing.py b/examples/demo_carracing.py new file mode 100644 index 00000000..641b1f40 --- /dev/null +++ b/examples/demo_carracing.py @@ -0,0 +1,66 @@ +from typing import Any +import numpy as np +import gym +import time +from carl.envs.box2d.carl_vehicle_racing import CARLVehicleRacingEnv, VEHICLE_NAMES + + +if __name__ == "__main__": + from pyglet.window import key + + a = np.array([0.0, 0.0, 0.0]) + + def key_press(k: int, mod: Any) -> None: + global restart + if k == 0xFF0D: + restart = True + if k == key.SPACE: + restart = True + if k == key.LEFT: + a[0] = -1.0 + if k == key.RIGHT: + a[0] = +1.0 + if k == key.UP: + a[1] = +1.0 + if k == key.DOWN: + a[2] = +1.0 + + def key_release(k: int, mod: Any) -> None: + if k == key.LEFT and a[0] == -1.0: + a[0] = 0 + if k == key.RIGHT and a[0] == +1.0: + a[0] = 0 + if k == key.UP: + a[1] = 0 + if k == key.DOWN: + a[2] = 0 + + contexts = {i: {"VEHICLE": i} for i in range(len(VEHICLE_NAMES))} + env = CARLVehicleRacingEnv(contexts=contexts) + env.render() + env.viewer.window.on_key_press = key_press + env.viewer.window.on_key_release = key_release + record_video = False + if record_video: + from gym.wrappers.record_video import RecordVideo + + env = RecordVideo(env=env, video_folder="/tmp/video-test", name_prefix="CARLVehicleRacing") + + isopen = True + while isopen: + env.reset() + total_reward = 0.0 + steps = 0 + restart = False + while True: + s, r, done, info = env.step(a) + time.sleep(0.025) + total_reward += r + if steps % 200 == 0 or done: + print("\naction " + str(["{:+0.2f}".format(x) for x in a])) + print("step {} total_reward {:+0.2f}".format(steps, total_reward)) + steps += 1 + isopen = env.render() + if done or restart or not isopen: + break + env.close() From 989731472082bca764bd10050bac6e3bbb460723 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 14:03:53 +0200 Subject: [PATCH 18/67] Update carracing example --- examples/demo_carracing.py | 55 ++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/examples/demo_carracing.py b/examples/demo_carracing.py index 641b1f40..b961d3b0 100644 --- a/examples/demo_carracing.py +++ b/examples/demo_carracing.py @@ -1,45 +1,47 @@ +""" +Code adapted from gym.envs.box2d.car_racing.py +""" + from typing import Any import numpy as np import gym import time +import pygame from carl.envs.box2d.carl_vehicle_racing import CARLVehicleRacingEnv, VEHICLE_NAMES - if __name__ == "__main__": from pyglet.window import key a = np.array([0.0, 0.0, 0.0]) - def key_press(k: int, mod: Any) -> None: - global restart - if k == 0xFF0D: - restart = True - if k == key.SPACE: - restart = True - if k == key.LEFT: - a[0] = -1.0 - if k == key.RIGHT: - a[0] = +1.0 - if k == key.UP: - a[1] = +1.0 - if k == key.DOWN: - a[2] = +1.0 + def register_input(): + for event in pygame.event.get(): + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_LEFT: + a[0] = -1.0 + if event.key == pygame.K_RIGHT: + a[0] = +1.0 + if event.key == pygame.K_UP: + a[1] = +1.0 + if event.key == pygame.K_DOWN: + a[2] = +0.8 # set 1.0 for wheels to block to zero rotation + if event.key == pygame.K_RETURN: + global restart + restart = True - def key_release(k: int, mod: Any) -> None: - if k == key.LEFT and a[0] == -1.0: - a[0] = 0 - if k == key.RIGHT and a[0] == +1.0: - a[0] = 0 - if k == key.UP: - a[1] = 0 - if k == key.DOWN: - a[2] = 0 + if event.type == pygame.KEYUP: + if event.key == pygame.K_LEFT: + a[0] = 0 + if event.key == pygame.K_RIGHT: + a[0] = 0 + if event.key == pygame.K_UP: + a[1] = 0 + if event.key == pygame.K_DOWN: + a[2] = 0 contexts = {i: {"VEHICLE": i} for i in range(len(VEHICLE_NAMES))} env = CARLVehicleRacingEnv(contexts=contexts) env.render() - env.viewer.window.on_key_press = key_press - env.viewer.window.on_key_release = key_release record_video = False if record_video: from gym.wrappers.record_video import RecordVideo @@ -53,6 +55,7 @@ def key_release(k: int, mod: Any) -> None: steps = 0 restart = False while True: + register_input() s, r, done, info = env.step(a) time.sleep(0.025) total_reward += r From cfd5df2d171d4131bf649b95953377aa420d1a11 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 14:04:53 +0200 Subject: [PATCH 19/67] Fix mypy box2d --- carl/envs/box2d/carl_bipedal_walker.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/carl/envs/box2d/carl_bipedal_walker.py b/carl/envs/box2d/carl_bipedal_walker.py index 3a11adfd..af077715 100644 --- a/carl/envs/box2d/carl_bipedal_walker.py +++ b/carl/envs/box2d/carl_bipedal_walker.py @@ -226,10 +226,10 @@ def demo_heuristic( moving_s_base = 4 + 5 * moving_leg supporting_s_base = 4 + 5 * supporting_leg - hip_targ = [None, None] # -0.8 .. +1.1 - knee_targ = [None, None] # -0.6 .. +0.9 - hip_todo = [0.0, 0.0] - knee_todo = [0.0, 0.0] + hip_targ = np.array([None, None]) # -0.8 .. +1.1 + knee_targ = np.array([None, None]) # -0.6 .. +0.9 + hip_todo = np.array([0.0, 0.0]) + knee_todo = np.array([0.0, 0.0]) if state == STAY_ON_ONE_LEG: hip_targ[moving_leg] = 1.1 From 7cb58c3f966897ad5db9bf2de6ad47d8c6a74609 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 14:11:34 +0200 Subject: [PATCH 20/67] Fix mypy --- carl/context/sampling.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/carl/context/sampling.py b/carl/context/sampling.py index 7012175f..18b219f8 100644 --- a/carl/context/sampling.py +++ b/carl/context/sampling.py @@ -5,6 +5,7 @@ from scipy.stats import norm from carl import envs +from carl.utils.types import Contexts, Context def get_default_context_and_bounds( @@ -145,9 +146,9 @@ def sample_contexts( sample_dists[context_feature_name] = (random_variable, context_feature_type) # Sample contexts - contexts = {} + contexts: Contexts = {} for i in range(0, num_contexts): - c = {} + c: Context = {} # k = name of context feature for k in env_defaults.keys(): if k in sample_dists.keys(): From 1e3b78cf53878074a11a5548c5405b02e47d439d Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 14:33:14 +0200 Subject: [PATCH 21/67] Fix mypy --- carl/envs/mario/carl_mario.py | 5 +++-- carl/envs/mario/carl_mario_definitions.py | 5 +++-- carl/envs/mario/generate_sample.py | 5 +++-- carl/envs/mario/toad_gan.py | 3 ++- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/carl/envs/mario/carl_mario.py b/carl/envs/mario/carl_mario.py index 759a068c..ebf98433 100644 --- a/carl/envs/mario/carl_mario.py +++ b/carl/envs/mario/carl_mario.py @@ -29,7 +29,7 @@ def __init__( context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): @@ -49,10 +49,11 @@ def __init__( context_selector_kwargs=context_selector_kwargs, context_mask=context_mask, ) - self.levels = [] + self.levels: List[str] = [] self._update_context() def _update_context(self) -> None: + self.env: MarioEnv if not self.levels: for context in self.contexts.values(): level = generate_level( diff --git a/carl/envs/mario/carl_mario_definitions.py b/carl/envs/mario/carl_mario_definitions.py index ce627dda..8cdabafe 100644 --- a/carl/envs/mario/carl_mario_definitions.py +++ b/carl/envs/mario/carl_mario_definitions.py @@ -1,11 +1,12 @@ import numpy as np +from torch import Tensor try: from carl.envs.mario.toad_gan import generate_initial_noise except FileNotFoundError: - def generate_initial_noise(*args, **kwargs): - return "None *" + def generate_initial_noise(width: int, height: int, level_index: int) -> Tensor: + return Tensor() INITIAL_WIDTH = 100 diff --git a/carl/envs/mario/generate_sample.py b/carl/envs/mario/generate_sample.py index f07c7b8a..bdb2e949 100644 --- a/carl/envs/mario/generate_sample.py +++ b/carl/envs/mario/generate_sample.py @@ -2,10 +2,11 @@ import torch import torch.nn as nn from torch.nn.functional import interpolate +from torch import Tensor # Generates a noise tensor. Uses torch.randn. -def generate_spatial_noise(size, device="cpu"): +def generate_spatial_noise(size, device="cpu") -> Tensor: return torch.randn(size, device=device, dtype=torch.float32) @@ -60,7 +61,7 @@ def generate_sample( in_s = torch.zeros(in_s.shape[0], channels, *in_s.shape[2:]).to(device) if current_scale == 0: # First step: Make base noise - if initial_noise is not None: + if initial_noise is not None and len(initial_noise) > 0: z_curr = initial_noise.float().to(device) else: z_curr = generate_spatial_noise( diff --git a/carl/envs/mario/toad_gan.py b/carl/envs/mario/toad_gan.py index 4c892052..9f09ffbd 100644 --- a/carl/envs/mario/toad_gan.py +++ b/carl/envs/mario/toad_gan.py @@ -6,6 +6,7 @@ from dataclasses import dataclass import torch +from torch import Tensor from carl.envs.mario.generate_sample import generate_sample, generate_spatial_noise from carl.envs.mario.reachabillity import reachability_map @@ -102,7 +103,7 @@ def generate_level( return "".join(level) -def generate_initial_noise(width: int, height: int, level_index: int): +def generate_initial_noise(width: int, height: int, level_index: int) -> Tensor: toad_gan = load_generator(level_index) base_noise_map = toad_gan.noise_maps[0] nzx = ( From bc45f549d5794be8ecee97c03646a993f15225d7 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 14:39:23 +0200 Subject: [PATCH 22/67] Update reset function --- carl/envs/mario/mario_env.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/carl/envs/mario/mario_env.py b/carl/envs/mario/mario_env.py index 49177a05..5de0e155 100644 --- a/carl/envs/mario/mario_env.py +++ b/carl/envs/mario/mario_env.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Literal, cast +from typing import Any, Dict, List, Literal, cast, Optional, Union import os import random @@ -7,6 +7,7 @@ import cv2 import gym +from gym.core import ObsType import numpy as np from gym import spaces from gym.utils import seeding @@ -77,7 +78,13 @@ def __init__( self.mario_inertia = 0.89 self._init_game() - def reset(self): + def reset( + self, + *, + seed: Optional[int] = None, + return_info: bool = False, + options: Optional[dict] = None, + ) -> Union[ObsType, tuple[ObsType, dict]]: self._reset_obs() if self.game is None: self.game = self._init_game() @@ -88,7 +95,10 @@ def reset(self): buffer = self._receive() frame = self._read_frame(buffer) self._update_obs(frame) - return self._obs.copy() + if not return_info: + return self._obs.copy() + else: + return self._obs.copy(), {} def step(self, action): if self.sticky_action_probability != 0.0: @@ -132,7 +142,7 @@ def step(self, action): def render(self, *args, **kwargs): return self.original_obs[0] - def __getstate__(self): + def __getstate__(self) -> Dict: assert self.gateway self.gateway.close() self.gateway = None @@ -141,7 +151,7 @@ def __getstate__(self): self.socket.close() return self.__dict__ - def _reset_obs(self): + def _reset_obs(self) -> None: self._obs[:] = 0 self.original_obs.clear() From 76aa19b015d616c4b0be443709e53ad1f897dc3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20D=C3=B6hler?= Date: Wed, 6 Jul 2022 14:44:20 +0200 Subject: [PATCH 23/67] mypy dmc fish --- carl/envs/dmc/dmc_tasks/fish.py | 74 +++++++++++++++++---------------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/carl/envs/dmc/dmc_tasks/fish.py b/carl/envs/dmc/dmc_tasks/fish.py index 30092006..0442c57c 100644 --- a/carl/envs/dmc/dmc_tasks/fish.py +++ b/carl/envs/dmc/dmc_tasks/fish.py @@ -15,15 +15,19 @@ """Fish Domain.""" +from typing import Dict, List, Optional, Tuple, Union + import collections +import dm_env # type: ignore import numpy as np -from dm_control import mujoco -from dm_control.rl import control -from dm_control.suite import base, common -from dm_control.utils import containers, rewards +from dm_control import mujoco # type: ignore +from dm_control.rl import control # type: ignore +from dm_control.suite import base, common # type: ignore +from dm_control.utils import containers, rewards # type: ignore -from carl.envs.dmc.dmc_tasks.utils import adapt_context +from carl.envs.dmc.dmc_tasks.utils import adapt_context # type: ignore +from carl.utils.types import Context _DEFAULT_TIME_LIMIT = 40 _CONTROL_TIMESTEP = 0.04 @@ -40,19 +44,19 @@ SUITE = containers.TaggedTasks() -def get_model_and_assets(): +def get_model_and_assets() -> Tuple[bytes, Dict]: """Returns a tuple containing the model XML string and a dict of assets.""" return common.read_model("fish.xml"), common.ASSETS -@SUITE.add("benchmarking") +@SUITE.add("benchmarking") # type: ignore def upright_context( - context={}, - context_mask=[], - time_limit=_DEFAULT_TIME_LIMIT, - random=None, - environment_kwargs=None, -): + context: Context = {}, + context_mask: List = [], + time_limit: int = _DEFAULT_TIME_LIMIT, + random: Union[np.random.RandomState, int, None] = None, + environment_kwargs: Optional[Dict] = None, +) -> dm_env: """Returns the Fish Upright task.""" xml_string, assets = get_model_and_assets() if context != {}: @@ -71,14 +75,14 @@ def upright_context( ) -@SUITE.add("benchmarking") +@SUITE.add("benchmarking") # type: ignore def swim_context( - context={}, - context_mask=[], - time_limit=_DEFAULT_TIME_LIMIT, - random=None, - environment_kwargs=None, -): + context: Context = {}, + context_mask: List = [], + time_limit: int = _DEFAULT_TIME_LIMIT, + random: Union[np.random.RandomState, int, None] = None, + environment_kwargs: Optional[Dict] = None, +) -> dm_env: """Returns the Fish Swim task.""" xml_string, assets = get_model_and_assets() if context != {}: @@ -100,23 +104,23 @@ def swim_context( class Physics(mujoco.Physics): """Physics simulation with additional features for the Fish domain.""" - def upright(self): + def upright(self) -> np.float64: """Returns projection from z-axes of torso to the z-axes of worldbody.""" return self.named.data.xmat["torso", "zz"] - def torso_velocity(self): + def torso_velocity(self) -> np.ndarray: """Returns velocities and angular velocities of the torso.""" return self.data.sensordata - def joint_velocities(self): + def joint_velocities(self) -> np.ndarray: """Returns the joint velocities.""" return self.named.data.qvel[_JOINTS] - def joint_angles(self): + def joint_angles(self) -> np.ndarray: """Returns the joint positions.""" return self.named.data.qpos[_JOINTS] - def mouth_to_target(self): + def mouth_to_target(self) -> np.ndarray: """Returns a vector, from mouth to target in local coordinate of mouth.""" data = self.named.data mouth_to_target_global = data.geom_xpos["target"] - data.geom_xpos["mouth"] @@ -126,7 +130,7 @@ def mouth_to_target(self): class Upright(base.Task): """A Fish `Task` for getting the torso upright with smooth reward.""" - def __init__(self, random=None): + def __init__(self, random: Union[np.random.RandomState, int, None] = None) -> None: """Initializes an instance of `Upright`. Args: random: Either an existing `numpy.random.RandomState` instance, an @@ -135,7 +139,7 @@ def __init__(self, random=None): """ super().__init__(random=random) - def initialize_episode(self, physics): + def initialize_episode(self, physics: Physics) -> None: """Randomizes the tail and fin angles and the orientation of the Fish.""" quat = self.random.randn(4) physics.named.data.qpos["root"][3:7] = quat / np.linalg.norm(quat) @@ -145,15 +149,15 @@ def initialize_episode(self, physics): physics.named.model.geom_rgba["target", 3] = 0 super().initialize_episode(physics) - def get_observation(self, physics): + def get_observation(self, physics: Physics) -> collections.OrderedDict: """Returns an observation of joint angles, velocities and uprightness.""" obs = collections.OrderedDict() obs["joint_angles"] = physics.joint_angles() - obs["upright"] = physics.upright() + obs["upright"] = physics.upright() # type: ignore obs["velocity"] = physics.velocity() return obs - def get_reward(self, physics): + def get_reward(self, physics: Physics) -> float: """Returns a smooth reward.""" return rewards.tolerance(physics.upright(), bounds=(1, 1), margin=1) @@ -161,7 +165,7 @@ def get_reward(self, physics): class Swim(base.Task): """A Fish `Task` for swimming with smooth reward.""" - def __init__(self, random=None): + def __init__(self, random: Union[np.random.RandomState, int, None] = None) -> None: """Initializes an instance of `Swim`. Args: random: Optional, either a `numpy.random.RandomState` instance, an @@ -170,7 +174,7 @@ def __init__(self, random=None): """ super().__init__(random=random) - def initialize_episode(self, physics): + def initialize_episode(self, physics: Physics) -> None: """Sets the state of the environment at the start of each episode.""" quat = self.random.randn(4) @@ -183,16 +187,16 @@ def initialize_episode(self, physics): physics.named.model.geom_pos["target", "z"] = self.random.uniform(0.1, 0.3) super().initialize_episode(physics) - def get_observation(self, physics): + def get_observation(self, physics: Physics) -> collections.OrderedDict: """Returns an observation of joints, target direction and velocities.""" obs = collections.OrderedDict() obs["joint_angles"] = physics.joint_angles() - obs["upright"] = physics.upright() + obs["upright"] = physics.upright() # type: ignore obs["target"] = physics.mouth_to_target() obs["velocity"] = physics.velocity() return obs - def get_reward(self, physics): + def get_reward(self, physics: Physics) -> np.float64: """Returns a smooth reward.""" radii = physics.named.model.geom_size[["mouth", "target"], 0].sum() in_target = rewards.tolerance( From 86146443ad8bfad56fb025ca5a50e9f332ea0228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20D=C3=B6hler?= Date: Wed, 6 Jul 2022 14:45:20 +0200 Subject: [PATCH 24/67] mypy dmc quadruped --- carl/envs/dmc/dmc_tasks/quadruped.py | 152 +++++++++++++++------------ 1 file changed, 85 insertions(+), 67 deletions(-) diff --git a/carl/envs/dmc/dmc_tasks/quadruped.py b/carl/envs/dmc/dmc_tasks/quadruped.py index cfab004c..e67029ec 100644 --- a/carl/envs/dmc/dmc_tasks/quadruped.py +++ b/carl/envs/dmc/dmc_tasks/quadruped.py @@ -15,18 +15,24 @@ """Quadruped Domain.""" +from typing import Any, Dict, List, Optional, Union + import collections +from collections import OrderedDict +import dm_env # type: ignore import numpy as np -from dm_control import mujoco -from dm_control.mujoco.wrapper import mjbindings -from dm_control.rl import control -from dm_control.suite import base, common -from dm_control.utils import containers, rewards, xml_tools -from lxml import etree +from dm_control import mujoco # type: ignore +from dm_control.mujoco.wrapper import mjbindings # type: ignore +from dm_control.mujoco.wrapper.core import MjData # type: ignore +from dm_control.rl import control # type: ignore +from dm_control.suite import base, common # type: ignore +from dm_control.utils import containers, rewards, xml_tools # type: ignore +from lxml import etree # type: ignore from scipy import ndimage -from carl.envs.dmc.dmc_tasks.utils import adapt_context +from carl.envs.dmc.dmc_tasks.utils import adapt_context # type: ignore +from carl.utils.types import Context enums = mjbindings.enums mjlib = mjbindings.mjlib @@ -53,8 +59,11 @@ def make_model( - floor_size=None, terrain=False, rangefinders=False, walls_and_ball=False -): + floor_size: Optional[Any] = None, + terrain: bool = False, + rangefinders: bool = False, + walls_and_ball: bool = False, +) -> bytes: """Returns the model XML string.""" xml_string = common.read_model("quadruped.xml") parser = etree.XMLParser(remove_blank_text=True) @@ -94,14 +103,14 @@ def make_model( return etree.tostring(mjcf, pretty_print=True) -@SUITE.add() +@SUITE.add() # type: ignore def walk_context( - context={}, - context_mask=[], - time_limit=_DEFAULT_TIME_LIMIT, - random=None, - environment_kwargs=None, -): + context: Context = {}, + context_mask: List = [], + time_limit: int = _DEFAULT_TIME_LIMIT, + random: Union[np.random.RandomState, int, None] = None, + environment_kwargs: Optional[Dict] = None, +) -> dm_env: """Returns the Walk task with the adapted context.""" xml_string = make_model(floor_size=_DEFAULT_TIME_LIMIT * _WALK_SPEED) if context != {}: @@ -120,14 +129,14 @@ def walk_context( ) -@SUITE.add() +@SUITE.add() # type: ignore def run_context( - context={}, - context_mask=[], - time_limit=_DEFAULT_TIME_LIMIT, - random=None, - environment_kwargs=None, -): + context: Context = {}, + context_mask: List = [], + time_limit: int = _DEFAULT_TIME_LIMIT, + random: Union[np.random.RandomState, int, None] = None, + environment_kwargs: Optional[Dict] = None, +) -> dm_env: """Returns the Run task with the adapted context.""" xml_string = make_model(floor_size=_DEFAULT_TIME_LIMIT * _RUN_SPEED) if context != {}: @@ -146,14 +155,14 @@ def run_context( ) -@SUITE.add() +@SUITE.add() # type: ignore def escape_context( - context={}, - context_mask=[], - time_limit=_DEFAULT_TIME_LIMIT, - random=None, - environment_kwargs=None, -): + context: Context = {}, + context_mask: List = [], + time_limit: int = _DEFAULT_TIME_LIMIT, + random: Union[np.random.RandomState, int, None] = None, + environment_kwargs: Optional[Dict] = None, +) -> dm_env: """Returns the Escape task with the adapted context.""" xml_string = make_model(floor_size=40, terrain=True, rangefinders=True) if context != {}: @@ -172,14 +181,14 @@ def escape_context( ) -@SUITE.add() +@SUITE.add() # type: ignore def fetch_context( - context={}, - context_mask=[], - time_limit=_DEFAULT_TIME_LIMIT, - random=None, - environment_kwargs=None, -): + context: Context = {}, + context_mask: List = [], + time_limit: int = _DEFAULT_TIME_LIMIT, + random: Union[np.random.RandomState, int, None] = None, + environment_kwargs: Optional[Dict] = None, +) -> dm_env: """Returns the Fetch task with the adapted context.""" xml_string = make_model(walls_and_ball=True) if context != {}: @@ -201,13 +210,13 @@ def fetch_context( class Physics(mujoco.Physics): """Physics simulation with additional features for the Quadruped domain.""" - def _reload_from_data(self, data): + def _reload_from_data(self, data: MjData) -> None: super()._reload_from_data(data) # Clear cached sensor names when the physics is reloaded. - self._sensor_types_to_names = {} - self._hinge_names = [] + self._sensor_types_to_names: Dict = {} + self._hinge_names: List = [] - def _get_sensor_names(self, *sensor_types): + def _get_sensor_names(self, *sensor_types: List[int]) -> List[str]: try: sensor_names = self._sensor_types_to_names[sensor_types] except KeyError: @@ -216,15 +225,15 @@ def _get_sensor_names(self, *sensor_types): self._sensor_types_to_names[sensor_types] = sensor_names return sensor_names - def torso_upright(self): + def torso_upright(self) -> np.ndarray: """Returns the dot-product of the torso z-axis and the global z-axis.""" return np.asarray(self.named.data.xmat["torso", "zz"]) - def torso_velocity(self): + def torso_velocity(self) -> np.ndarray: """Returns the velocity of the torso, in the local frame.""" return self.named.data.sensordata["velocimeter"].copy() - def egocentric_state(self): + def egocentric_state(self) -> np.ndarray: """Returns the state without global orientation or position.""" if not self._hinge_names: [hinge_ids] = np.nonzero(self.model.jnt_type == enums.mjtJoint.mjJNT_HINGE) @@ -239,45 +248,45 @@ def egocentric_state(self): ) ) - def toe_positions(self): + def toe_positions(self) -> np.ndarray: """Returns toe positions in egocentric frame.""" torso_frame = self.named.data.xmat["torso"].reshape(3, 3) torso_pos = self.named.data.xpos["torso"] torso_to_toe = self.named.data.xpos[_TOES] - torso_pos return torso_to_toe.dot(torso_frame) - def force_torque(self): + def force_torque(self) -> np.ndarray: """Returns scaled force/torque sensor readings at the toes.""" force_torque_sensors = self._get_sensor_names( enums.mjtSensor.mjSENS_FORCE, enums.mjtSensor.mjSENS_TORQUE ) return np.arcsinh(self.named.data.sensordata[force_torque_sensors]) - def imu(self): + def imu(self) -> np.ndarray: """Returns IMU-like sensor readings.""" imu_sensors = self._get_sensor_names( enums.mjtSensor.mjSENS_GYRO, enums.mjtSensor.mjSENS_ACCELEROMETER ) return self.named.data.sensordata[imu_sensors] - def rangefinder(self): + def rangefinder(self) -> np.ndarray: """Returns scaled rangefinder sensor readings.""" rf_sensors = self._get_sensor_names(enums.mjtSensor.mjSENS_RANGEFINDER) rf_readings = self.named.data.sensordata[rf_sensors] no_intersection = -1.0 return np.where(rf_readings == no_intersection, 1.0, np.tanh(rf_readings)) - def origin_distance(self): + def origin_distance(self) -> np.ndarray: """Returns the distance from the origin to the workspace.""" return np.asarray(np.linalg.norm(self.named.data.site_xpos["workspace"])) - def origin(self): + def origin(self) -> np.ndarray: """Returns origin position in the torso frame.""" torso_frame = self.named.data.xmat["torso"].reshape(3, 3) torso_pos = self.named.data.xpos["torso"] return -torso_pos.dot(torso_frame) - def ball_state(self): + def ball_state(self) -> np.ndarray: """Returns ball position and velocity relative to the torso frame.""" data = self.named.data torso_frame = data.xmat["torso"].reshape(3, 3) @@ -287,21 +296,21 @@ def ball_state(self): ball_state = np.vstack((ball_rel_pos, ball_rel_vel, ball_rot_vel)) return ball_state.dot(torso_frame).ravel() - def target_position(self): + def target_position(self) -> np.ndarray: """Returns target position in torso frame.""" torso_frame = self.named.data.xmat["torso"].reshape(3, 3) torso_pos = self.named.data.xpos["torso"] torso_to_target = self.named.data.site_xpos["target"] - torso_pos return torso_to_target.dot(torso_frame) - def ball_to_target_distance(self): + def ball_to_target_distance(self) -> np.float64: """Returns horizontal distance from the ball to the target.""" ball_to_target = ( self.named.data.site_xpos["target"] - self.named.data.xpos["ball"] ) return np.linalg.norm(ball_to_target[:2]) - def self_to_ball_distance(self): + def self_to_ball_distance(self) -> np.float64: """Returns horizontal distance from the quadruped workspace to the ball.""" self_to_ball = ( self.named.data.site_xpos["workspace"] - self.named.data.xpos["ball"] @@ -309,7 +318,12 @@ def self_to_ball_distance(self): return np.linalg.norm(self_to_ball[:2]) -def _find_non_contacting_height(physics, orientation, x_pos=0.0, y_pos=0.0): +def _find_non_contacting_height( + physics: Physics, + orientation: np.ndarray, + x_pos: float = 0.0, + y_pos: float = 0.0, +) -> None: """Find a height with no contacts given a body orientation. Args: physics: An instance of `Physics`. @@ -340,7 +354,7 @@ def _find_non_contacting_height(physics, orientation, x_pos=0.0, y_pos=0.0): raise RuntimeError("Failed to find a non-contacting configuration.") -def _common_observations(physics): +def _common_observations(physics: Physics) -> collections.OrderedDict: """Returns the observations common to all tasks.""" obs = collections.OrderedDict() obs["egocentric_state"] = physics.egocentric_state() @@ -351,7 +365,7 @@ def _common_observations(physics): return obs -def _upright_reward(physics, deviation_angle=0): +def _upright_reward(physics: Physics, deviation_angle: float = 0) -> np.float64: """Returns a reward proportional to how upright the torso is. Args: physics: an instance of `Physics`. @@ -372,7 +386,11 @@ def _upright_reward(physics, deviation_angle=0): class Move(base.Task): """A quadruped task solved by moving forward at a designated speed.""" - def __init__(self, desired_speed, random=None): + def __init__( + self, + desired_speed: float, + random: Union[np.random.RandomState, int, None] = None, + ) -> None: """Initializes an instance of `Move`. Args: desired_speed: A float. If this value is zero, reward is given simply @@ -385,7 +403,7 @@ def __init__(self, desired_speed, random=None): self._desired_speed = desired_speed super().__init__(random=random) - def initialize_episode(self, physics): + def initialize_episode(self, physics: Physics) -> None: """Sets the state of the environment at the start of each episode. Args: physics: An instance of `Physics`. @@ -396,11 +414,11 @@ def initialize_episode(self, physics): _find_non_contacting_height(physics, orientation) super().initialize_episode(physics) - def get_observation(self, physics): + def get_observation(self, physics: Physics) -> collections.OrderedDict: """Returns an observation to the agent.""" return _common_observations(physics) - def get_reward(self, physics): + def get_reward(self, physics: Physics) -> np.float64: """Returns a reward to the agent.""" # Move reward term. @@ -418,7 +436,7 @@ def get_reward(self, physics): class Escape(base.Task): """A quadruped task solved by escaping a bowl-shaped terrain.""" - def initialize_episode(self, physics): + def initialize_episode(self, physics: Physics) -> None: """Sets the state of the environment at the start of each episode. Args: physics: An instance of `Physics`. @@ -457,14 +475,14 @@ def initialize_episode(self, physics): orientation /= np.linalg.norm(orientation) _find_non_contacting_height(physics, orientation) - def get_observation(self, physics): + def get_observation(self, physics: Physics) -> collections.OrderedDict: """Returns an observation to the agent.""" obs = _common_observations(physics) obs["origin"] = physics.origin() obs["rangefinder"] = physics.rangefinder() return obs - def get_reward(self, physics): + def get_reward(self, physics: Physics) -> np.float64: """Returns a reward to the agent.""" # Escape reward term. @@ -483,7 +501,7 @@ def get_reward(self, physics): class Fetch(base.Task): """A quadruped task solved by bringing a ball to the origin.""" - def initialize_episode(self, physics): + def initialize_episode(self, physics: Physics) -> None: """Sets the state of the environment at the start of each episode. Args: physics: An instance of `Physics`. @@ -503,14 +521,14 @@ def initialize_episode(self, physics): physics.named.data.qvel["ball_root"][:2] = 5 * self.random.randn(2) super().initialize_episode(physics) - def get_observation(self, physics): + def get_observation(self, physics: Physics) -> OrderedDict: """Returns an observation to the agent.""" obs = _common_observations(physics) obs["ball_state"] = physics.ball_state() obs["target_position"] = physics.target_position() return obs - def get_reward(self, physics): + def get_reward(self, physics: Physics) -> np.float64: """Returns a reward to the agent.""" # Reward for moving close to the ball. From c32bf201912a77a9ecaa430b3e08f2170202a12c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20D=C3=B6hler?= Date: Wed, 6 Jul 2022 14:46:33 +0200 Subject: [PATCH 25/67] mypy dmc context utils --- carl/envs/dmc/dmc_tasks/utils.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/carl/envs/dmc/dmc_tasks/utils.py b/carl/envs/dmc/dmc_tasks/utils.py index 2dd72d4d..512e9b83 100644 --- a/carl/envs/dmc/dmc_tasks/utils.py +++ b/carl/envs/dmc/dmc_tasks/utils.py @@ -1,7 +1,9 @@ -from lxml import etree +from typing import Dict, List +from lxml import etree # type: ignore -def adapt_context(xml_string, context, context_mask=[]): + +def adapt_context(xml_string: bytes, context: Dict, context_mask: List = []) -> bytes: """Adapts and returns the xml_string of the model with the given context.""" mjcf = etree.fromstring(xml_string) default = mjcf.find("./default/") From 66660da1ffd94379c00878a5a95de466a40e0b7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20D=C3=B6hler?= Date: Wed, 6 Jul 2022 14:52:50 +0200 Subject: [PATCH 26/67] wrapper fix --- carl/envs/dmc/wrappers.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/carl/envs/dmc/wrappers.py b/carl/envs/dmc/wrappers.py index 79586ffe..d9af9259 100644 --- a/carl/envs/dmc/wrappers.py +++ b/carl/envs/dmc/wrappers.py @@ -56,10 +56,7 @@ def step(self, action: ActType) -> Tuple[ObsType, float, bool, dict]: step_type: StepType = timestep.step_type reward = timestep.reward discount = timestep.discount - if isinstance(self.observation_space, spaces.Box): - observation = timestep.observation["observations"] - else: - raise NotImplementedError + observation = timestep.observation["observations"] info = {"step_type": step_type, "discount": discount} done = step_type == StepType.LAST return observation, reward, done, info From 7ffd1af980a9c9d64e2bce09cce1af79db2e65d5 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 14:56:20 +0200 Subject: [PATCH 27/67] Fix mypy mario --- carl/envs/mario/mario_env.py | 13 +++++++------ carl/envs/mario/models/discriminator.py | 6 ++++-- carl/envs/mario/models/generator.py | 6 ++++-- carl/envs/mario/toad_gan.py | 20 ++++++++++++++------ 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/carl/envs/mario/mario_env.py b/carl/envs/mario/mario_env.py index 5de0e155..64a8fca9 100644 --- a/carl/envs/mario/mario_env.py +++ b/carl/envs/mario/mario_env.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Literal, cast, Optional, Union +from typing import Any, Dict, List, Literal, cast, Optional, Union, ByteString import os import random @@ -12,6 +12,7 @@ from gym import spaces from gym.utils import seeding from py4j.java_gateway import GatewayParameters, JavaGateway +from PIL import Image from carl.envs.mario.level_image_gen import LevelImageGen @@ -174,7 +175,7 @@ def _update_obs(self, frame): else: self._obs = np.transpose(frame, axes=(2, 0, 1)) - def _init_game(self): + def _init_game(self) -> MarioGame: self.gateway = JavaGateway( gateway_parameters=GatewayParameters( port=self.port, @@ -188,16 +189,16 @@ def _init_game(self): self.frame_size = self.game.getFrameSize() return self.game - def _receive(self): + def _receive(self) -> ByteString: frameBuffer = b"" while len(frameBuffer) != self.frame_size: frameBuffer += self.socket.recv(self.frame_size) return frameBuffer - def get_action_meanings(self): + def get_action_meanings(self) -> List[str]: return ACTION_MEANING - def render_current_level(self): + def render_current_level(self) -> Image: img_gen = LevelImageGen( sprite_path=os.path.abspath( os.path.join(os.path.dirname(__file__), "sprites") @@ -205,7 +206,7 @@ def render_current_level(self): ) return img_gen.render(self.levels[self.current_level_idx].split("\n")) - def seed(self, seed=None): + def seed(self, seed: Optional[int] = None) -> List[Any]: self.np_random, seed = seeding.np_random(seed) return [seed] diff --git a/carl/envs/mario/models/discriminator.py b/carl/envs/mario/models/discriminator.py index 51a4265c..7ebff146 100644 --- a/carl/envs/mario/models/discriminator.py +++ b/carl/envs/mario/models/discriminator.py @@ -1,6 +1,8 @@ # Code from https://github.com/Mawiszus/TOAD-GAN import torch import torch.nn as nn +from torch import Tensor +from argparse import Namespace from .conv_block import ConvBlock @@ -8,7 +10,7 @@ class Level_WDiscriminator(nn.Module): """Patch based Discriminator. Uses Namespace opt.""" - def __init__(self, opt): + def __init__(self, opt: Namespace): super().__init__() self.is_cuda = torch.cuda.is_available() N = int(opt.nfc) @@ -24,7 +26,7 @@ def __init__(self, opt): self.tail = nn.Conv2d(N, 1, kernel_size=(3, 3), stride=1, padding=opt.padd_size) - def forward(self, x): + def forward(self, x: Tensor) -> Tensor: x = self.head(x) x = self.body(x) x = self.tail(x) diff --git a/carl/envs/mario/models/generator.py b/carl/envs/mario/models/generator.py index dd098f38..1e5e46b6 100644 --- a/carl/envs/mario/models/generator.py +++ b/carl/envs/mario/models/generator.py @@ -2,6 +2,8 @@ import torch import torch.nn as nn import torch.nn.functional as F +from torch import Tensor +from argparse import Namespace from .conv_block import ConvBlock @@ -9,7 +11,7 @@ class Level_GeneratorConcatSkip2CleanAdd(nn.Module): """Patch based Generator. Uses namespace opt.""" - def __init__(self, opt): + def __init__(self, opt: Namespace): super().__init__() self.is_cuda = torch.cuda.is_available() N = int(opt.nfc) @@ -29,7 +31,7 @@ def __init__(self, opt): ), ) - def forward(self, x, y, temperature=1): + def forward(self, x: Tensor, y: Tensor, temperature: float = 1) -> Tensor: x = self.head(x) x = self.body(x) x = self.tail(x) diff --git a/carl/envs/mario/toad_gan.py b/carl/envs/mario/toad_gan.py index 9f09ffbd..030a54f8 100644 --- a/carl/envs/mario/toad_gan.py +++ b/carl/envs/mario/toad_gan.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import Optional, List import functools import os @@ -14,7 +14,15 @@ @dataclass class TOADGAN: - def __init__(self, Gs, Zs, reals, NoiseAmp, token_list, num_layers): + def __init__( + self, + Gs: Tensor, + Zs: Tensor, + reals: Tensor, + NoiseAmp: Tensor, + token_list: Tensor, + num_layers: int + ): self.generators = Gs self.noise_maps = Zs self.reals = reals @@ -23,11 +31,11 @@ def __init__(self, Gs, Zs, reals, NoiseAmp, token_list, num_layers): self.num_layer = num_layers @property - def original_height(self): + def original_height(self) -> int: return self.reals[-1].shape[-2] @property - def original_width(self): + def original_width(self) -> int: return self.reals[-1].shape[-1] @@ -41,7 +49,7 @@ def original_width(self): @functools.lru_cache(maxsize=None) -def load_generator(level_index: int): +def load_generator(level_index: int) -> TOADGAN: import carl.envs.mario.models as models sys.modules["models"] = models @@ -80,7 +88,7 @@ def generate_level( level_index: int, initial_noise: Optional[torch.Tensor] = None, filter_unplayable: bool = True, -): +) -> str: toad_gan = load_generator(level_index) playable = False level = None From e715ad7f39c68ce3be6c9ed5ce526cee75d99b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20D=C3=B6hler?= Date: Wed, 6 Jul 2022 14:57:44 +0200 Subject: [PATCH 28/67] mypy dmc walker --- carl/envs/dmc/dmc_tasks/walker.py | 78 +++++++++++++++++-------------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/carl/envs/dmc/dmc_tasks/walker.py b/carl/envs/dmc/dmc_tasks/walker.py index 9f75142b..e07ebb43 100644 --- a/carl/envs/dmc/dmc_tasks/walker.py +++ b/carl/envs/dmc/dmc_tasks/walker.py @@ -15,15 +15,20 @@ """Planar Walker Domain.""" +from typing import Dict, List, Optional, Tuple, Union + import collections -from dm_control import mujoco -from dm_control.rl import control -from dm_control.suite import base, common +import dm_env # type: ignore +import numpy as np +from dm_control import mujoco # type: ignore +from dm_control.rl import control # type: ignore +from dm_control.suite import base, common # type: ignore from dm_control.suite.utils import randomizers -from dm_control.utils import containers, rewards +from dm_control.utils import containers, rewards # type: ignore -from carl.envs.dmc.dmc_tasks.utils import adapt_context +from carl.envs.dmc.dmc_tasks.utils import adapt_context # type: ignore +from carl.utils.types import Context _DEFAULT_TIME_LIMIT = 25 _CONTROL_TIMESTEP = 0.025 @@ -41,19 +46,19 @@ SUITE = containers.TaggedTasks() -def get_model_and_assets(): +def get_model_and_assets() -> Tuple[bytes, Dict]: """Returns a tuple containing the model XML string and a dict of assets.""" return common.read_model("walker.xml"), common.ASSETS -@SUITE.add("benchmarking") +@SUITE.add("benchmarking") # type: ignore def stand_context( - context={}, - context_mask=[], - time_limit=_DEFAULT_TIME_LIMIT, - random=None, - environment_kwargs=None, -): + context: Context = {}, + context_mask: List = [], + time_limit: int = _DEFAULT_TIME_LIMIT, + random: Union[np.random.RandomState, int, None] = None, + environment_kwargs: Optional[Dict] = None, +) -> dm_env: """Returns the Stand task with the adapted context.""" xml_string, assets = get_model_and_assets() if context != {}: @@ -72,14 +77,14 @@ def stand_context( ) -@SUITE.add("benchmarking") +@SUITE.add("benchmarking") # type: ignore def walk_context( - context={}, - context_mask=[], - time_limit=_DEFAULT_TIME_LIMIT, - random=None, - environment_kwargs=None, -): + context: Context = {}, + context_mask: List = [], + time_limit: int = _DEFAULT_TIME_LIMIT, + random: Union[np.random.RandomState, int, None] = None, + environment_kwargs: Optional[Dict] = None, +) -> dm_env: """Returns the Walk task with the adapted context.""" xml_string, assets = get_model_and_assets() if context != {}: @@ -98,14 +103,14 @@ def walk_context( ) -@SUITE.add("benchmarking") +@SUITE.add("benchmarking") # type: ignore def run_context( - context={}, - context_mask=[], - time_limit=_DEFAULT_TIME_LIMIT, - random=None, - environment_kwargs=None, -): + context: Context = {}, + context_mask: List = [], + time_limit: int = _DEFAULT_TIME_LIMIT, + random: Union[np.random.RandomState, int, None] = None, + environment_kwargs: Optional[Dict] = None, +) -> dm_env: """Returns the Run task with the adapted context.""" xml_string, assets = get_model_and_assets() if context != {}: @@ -127,19 +132,19 @@ def run_context( class Physics(mujoco.Physics): """Physics simulation with additional features for the Walker domain.""" - def torso_upright(self): + def torso_upright(self) -> np.float64: """Returns projection from z-axes of torso to the z-axes of world.""" return self.named.data.xmat["torso", "zz"] - def torso_height(self): + def torso_height(self) -> np.float64: """Returns the height of the torso.""" return self.named.data.xpos["torso", "z"] - def horizontal_velocity(self): + def horizontal_velocity(self) -> np.float64: """Returns the horizontal velocity of the center-of-mass.""" return self.named.data.sensordata["torso_subtreelinvel"][0] - def orientations(self): + def orientations(self) -> np.ndarray: """Returns planar orientations of all bodies.""" return self.named.data.xmat[1:, ["xx", "xz"]].ravel() @@ -147,7 +152,9 @@ def orientations(self): class PlanarWalker(base.Task): """A planar walker task.""" - def __init__(self, move_speed, random=None): + def __init__( + self, move_speed: float, random: Union[np.random.RandomState, int, None] = None + ) -> None: """Initializes an instance of `PlanarWalker`. Args: move_speed: A float. If this value is zero, reward is given simply for @@ -160,7 +167,7 @@ def __init__(self, move_speed, random=None): self._move_speed = move_speed super().__init__(random=random) - def initialize_episode(self, physics): + def initialize_episode(self, physics: Physics) -> None: """Sets the state of the environment at the start of each episode. In 'standing' mode, use initial orientation and small velocities. In 'random' mode, randomize joint angles and let fall to the floor. @@ -170,15 +177,16 @@ def initialize_episode(self, physics): randomizers.randomize_limited_and_rotational_joints(physics, self.random) super().initialize_episode(physics) - def get_observation(self, physics): + def get_observation(self, physics: Physics) -> collections.OrderedDict: """Returns an observation of body orientations, height and velocites.""" obs = collections.OrderedDict() obs["orientations"] = physics.orientations() obs["height"] = physics.torso_height() obs["velocity"] = physics.velocity() + self.get_reward(physics) return obs - def get_reward(self, physics): + def get_reward(self, physics: Physics) -> np.float64: """Returns a reward to the agent.""" standing = rewards.tolerance( physics.torso_height(), From 99a5355af03dcd16a046ccb1d6127e394966f8b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20D=C3=B6hler?= Date: Wed, 6 Jul 2022 15:02:33 +0200 Subject: [PATCH 29/67] mypy dmc loader --- carl/envs/dmc/loader.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/carl/envs/dmc/loader.py b/carl/envs/dmc/loader.py index 2d8bb033..103d9bf9 100644 --- a/carl/envs/dmc/loader.py +++ b/carl/envs/dmc/loader.py @@ -1,5 +1,8 @@ +from typing import Any, Dict, List, Optional + import inspect +import dm_env from dm_control import suite from carl.envs.dmc.dmc_tasks import fish, quadruped, walker # noqa: F401 @@ -12,14 +15,14 @@ def load_dmc_env( - domain_name, - task_name, - context={}, - context_mask=[], - task_kwargs=None, - environment_kwargs=None, - visualize_reward=False, -): + domain_name: str, + task_name: str, + context: Dict = {}, + context_mask: List = [], + task_kwargs: Optional[Any] = None, + environment_kwargs: Dict[str, bool] = None, + visualize_reward: bool = False, +) -> dm_env: if domain_name in _DOMAINS: domain = _DOMAINS[domain_name] From 7a6d54bef6556534ea3fceb9a68fa31d21ea939d Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 15:06:14 +0200 Subject: [PATCH 30/67] Fix mypy mario --- carl/envs/mario/mario_env.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/carl/envs/mario/mario_env.py b/carl/envs/mario/mario_env.py index 64a8fca9..b9eaaa0c 100644 --- a/carl/envs/mario/mario_env.py +++ b/carl/envs/mario/mario_env.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Literal, cast, Optional, Union, ByteString +from typing import Any, Dict, List, Literal, cast, Optional, Union, ByteString, Type import os import random @@ -156,14 +156,14 @@ def _reset_obs(self) -> None: self._obs[:] = 0 self.original_obs.clear() - def _read_frame(self, buffer): + def _read_frame(self, buffer: ByteString) -> np.ndarray: frame = ( np.frombuffer(buffer, dtype=np.int32).reshape(256, 256, 3).astype(np.uint8) ) self.original_obs.append(frame) return frame - def _update_obs(self, frame): + def _update_obs(self, frame) -> None: if self.grayscale: frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) @@ -182,7 +182,7 @@ def _init_game(self) -> MarioGame: eager_load=True, ) ) - self.game = cast(MarioGame, cast(Any, self.gateway.jvm).engine.core.MarioGame()) + self.game = cast(MarioGame, cast(Any, self.gateway.jvm).engine.core.MarioGame()) # type: ignore [attr-defined] self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect(("localhost", self.game.getPort())) self.game.initGame() From bc5c83443016339207189981f3bdc18baa757f82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20D=C3=B6hler?= Date: Wed, 6 Jul 2022 15:17:46 +0200 Subject: [PATCH 31/67] mypy dmc --- carl/envs/dmc/carl_dm_fish.py | 4 ++-- carl/envs/dmc/carl_dm_quadruped.py | 9 +++++---- carl/envs/dmc/carl_dm_walker.py | 9 +++++---- carl/envs/dmc/carl_dmcontrol.py | 13 +++++++------ carl/envs/dmc/dmc_tasks/walker.py | 4 ++-- carl/envs/dmc/loader.py | 6 +++--- carl/envs/dmc/try_dm_control.py | 26 +++++++++++++++++--------- carl/envs/dmc/wrappers.py | 6 +++--- 8 files changed, 44 insertions(+), 33 deletions(-) diff --git a/carl/envs/dmc/carl_dm_fish.py b/carl/envs/dmc/carl_dm_fish.py index 89940b41..8882542a 100644 --- a/carl/envs/dmc/carl_dm_fish.py +++ b/carl/envs/dmc/carl_dm_fish.py @@ -4,7 +4,7 @@ from carl.context.selection import AbstractSelector from carl.envs.dmc.carl_dmcontrol import CARLDmcEnv -from carl.envs.dmc.dmc_tasks.fish import STEP_LIMIT +from carl.envs.dmc.dmc_tasks.fish import STEP_LIMIT # type: ignore from carl.utils.trial_logger import TrialLogger DEFAULT_CONTEXT = { @@ -71,7 +71,7 @@ def __init__( state_context_features: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): diff --git a/carl/envs/dmc/carl_dm_quadruped.py b/carl/envs/dmc/carl_dm_quadruped.py index 3e9aa152..f3d0a2e1 100644 --- a/carl/envs/dmc/carl_dm_quadruped.py +++ b/carl/envs/dmc/carl_dm_quadruped.py @@ -4,8 +4,9 @@ from carl.context.selection import AbstractSelector from carl.envs.dmc.carl_dmcontrol import CARLDmcEnv -from carl.envs.dmc.dmc_tasks.quadruped import STEP_LIMIT +from carl.envs.dmc.dmc_tasks.quadruped import STEP_LIMIT # type: ignore from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Context DEFAULT_CONTEXT = { "gravity": -9.81, @@ -57,19 +58,19 @@ def __init__( self, domain: str = "quadruped", task: str = "walk_context", - contexts: Dict[Any, Dict[Any, Any]] = {}, + contexts: Dict[Any, Context] = {}, context_mask: Optional[List[str]] = [], hide_context: bool = True, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, max_episode_length: int = STEP_LIMIT, state_context_features: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): diff --git a/carl/envs/dmc/carl_dm_walker.py b/carl/envs/dmc/carl_dm_walker.py index 90fe5811..8112b8c0 100644 --- a/carl/envs/dmc/carl_dm_walker.py +++ b/carl/envs/dmc/carl_dm_walker.py @@ -4,8 +4,9 @@ from carl.context.selection import AbstractSelector from carl.envs.dmc.carl_dmcontrol import CARLDmcEnv -from carl.envs.dmc.dmc_tasks.walker import STEP_LIMIT +from carl.envs.dmc.dmc_tasks.walker import STEP_LIMIT # type: ignore from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Context DEFAULT_CONTEXT = { "gravity": -9.81, @@ -57,19 +58,19 @@ def __init__( self, domain: str = "walker", task: str = "walk_context", - contexts: Dict[Any, Dict[Any, Any]] = {}, + contexts: Dict[Any, Context] = {}, context_mask: Optional[List[str]] = [], hide_context: bool = True, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, max_episode_length: int = STEP_LIMIT, state_context_features: Optional[List[str]] = None, dict_observation_space: bool = False, context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] + Union[AbstractSelector, type[AbstractSelector]] ] = None, context_selector_kwargs: Optional[Dict] = None, ): diff --git a/carl/envs/dmc/carl_dmcontrol.py b/carl/envs/dmc/carl_dmcontrol.py index 054b0fcd..313868fe 100644 --- a/carl/envs/dmc/carl_dmcontrol.py +++ b/carl/envs/dmc/carl_dmcontrol.py @@ -1,10 +1,11 @@ -from typing import Any, Dict, List, Optional, Union +from typing import Dict, List, Optional, Union from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.envs.dmc.loader import load_dmc_env from carl.envs.dmc.wrappers import MujocoToGymWrapper from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Context, Contexts class CARLDmcEnv(CARLEnv): @@ -32,23 +33,23 @@ def __init__( self, domain: str, task: str, - contexts: Dict[Any, Dict[Any, Any]], + contexts: Contexts, context_mask: Optional[List[str]], hide_context: bool, add_gaussian_noise_to_context: bool, gaussian_noise_std_percentage: float, logger: Optional[TrialLogger], scale_context_features: str, - default_context: Optional[Dict], + default_context: Optional[Context], max_episode_length: int, state_context_features: Optional[List[str]], dict_observation_space: bool, - context_selector: Optional[Union[AbstractSelector, type(AbstractSelector)]], + context_selector: Optional[Union[AbstractSelector, type[AbstractSelector]]], context_selector_kwargs: Optional[Dict], ): # TODO can we have more than 1 env? if not contexts: - contexts = {0: default_context} + contexts = {0: default_context} # type: ignore self.domain = domain self.task = task env = load_dmc_env( @@ -78,7 +79,7 @@ def __init__( ) # TODO check gaussian noise on context features self.whitelist_gaussian_noise = list( - default_context.keys() + default_context.keys() # type: ignore ) # allow to augment all values def _update_context(self) -> None: diff --git a/carl/envs/dmc/dmc_tasks/walker.py b/carl/envs/dmc/dmc_tasks/walker.py index e07ebb43..a0d80628 100644 --- a/carl/envs/dmc/dmc_tasks/walker.py +++ b/carl/envs/dmc/dmc_tasks/walker.py @@ -24,7 +24,7 @@ from dm_control import mujoco # type: ignore from dm_control.rl import control # type: ignore from dm_control.suite import base, common # type: ignore -from dm_control.suite.utils import randomizers +from dm_control.suite.utils import randomizers # type: ignore from dm_control.utils import containers, rewards # type: ignore from carl.envs.dmc.dmc_tasks.utils import adapt_context # type: ignore @@ -181,7 +181,7 @@ def get_observation(self, physics: Physics) -> collections.OrderedDict: """Returns an observation of body orientations, height and velocites.""" obs = collections.OrderedDict() obs["orientations"] = physics.orientations() - obs["height"] = physics.torso_height() + obs["height"] = physics.torso_height() # type: ignore obs["velocity"] = physics.velocity() self.get_reward(physics) return obs diff --git a/carl/envs/dmc/loader.py b/carl/envs/dmc/loader.py index 103d9bf9..0a62c4bc 100644 --- a/carl/envs/dmc/loader.py +++ b/carl/envs/dmc/loader.py @@ -2,8 +2,8 @@ import inspect -import dm_env -from dm_control import suite +import dm_env # type: ignore +from dm_control import suite # type: ignore from carl.envs.dmc.dmc_tasks import fish, quadruped, walker # noqa: F401 @@ -18,7 +18,7 @@ def load_dmc_env( domain_name: str, task_name: str, context: Dict = {}, - context_mask: List = [], + context_mask: Optional[List[str]] = [], task_kwargs: Optional[Any] = None, environment_kwargs: Dict[str, bool] = None, visualize_reward: bool = False, diff --git a/carl/envs/dmc/try_dm_control.py b/carl/envs/dmc/try_dm_control.py index 39c94b30..64ccdf1c 100644 --- a/carl/envs/dmc/try_dm_control.py +++ b/carl/envs/dmc/try_dm_control.py @@ -1,5 +1,7 @@ # flake8: noqa: F401 +# type: ignore import matplotlib.pyplot as plt +from pyannotate_runtime import collect_types from carl.envs import CARLDmcFishEnv from carl.envs import CARLDmcFishEnv_defaults as fish_default @@ -16,21 +18,27 @@ stronger_act = walker_default.copy() stronger_act["actuator_strength"] = walker_default["actuator_strength"] * 2 contexts = {0: stronger_act} - carl_env = CARLDmcWalkerEnv( - task="stand_context", - contexts=contexts, - context_mask=walker_mask, - hide_context=False, - dict_observation_space=True, - ) # stronger_act = quadruped_default.copy() # stronger_act["actuator_strength"] = quadruped_default["actuator_strength"]*2 # contexts = {0: stronger_act} - # carl_env = CARLDmcQuadrupedEnv(task="walk_context", contexts=contexts, context_mask=quadruped_mask, hide_context=False) + # carl_env = CARLDmcQuadrupedEnv(task="fetch_context", contexts=contexts, context_mask=quadruped_mask, hide_context=False) # contexts = {0: fish_default} - # carl_env = CARLDmcFishEnv(task="swim_context", contexts=contexts, context_mask=fish_mask, hide_context=False) + # carl_env = CARLDmcFishEnv(task="upright_context", contexts=contexts, context_mask=fish_mask, hide_context=False) + collect_types.init_types_collection() + with collect_types.collect(): + carl_env = CARLDmcWalkerEnv( + task="run_context", + contexts=contexts, + context_mask=walker_mask, + hide_context=False, + dict_observation_space=True, + ) + action = carl_env.action_space.sample() + state, reward, done, info = carl_env.step(action=action) + print("state", state, type(state)) + collect_types.dump_stats("pyannotate.dump") render = lambda: plt.imshow(carl_env.render(mode="rgb_array")) s = carl_env.reset() diff --git a/carl/envs/dmc/wrappers.py b/carl/envs/dmc/wrappers.py index d9af9259..9f9ec3d5 100644 --- a/carl/envs/dmc/wrappers.py +++ b/carl/envs/dmc/wrappers.py @@ -1,8 +1,8 @@ from typing import Optional, Tuple, TypeVar, Union +import dm_env # type: ignore import gym import numpy as np -from dm_control.rl.control import Environment from dm_env import StepType from gym import spaces @@ -11,7 +11,7 @@ class MujocoToGymWrapper(gym.Env): - def __init__(self, env: Environment): + def __init__(self, env: dm_env) -> None: # TODO set seeds self.env = env @@ -78,7 +78,7 @@ def reset( raise NotImplementedError return observation - def render(self, mode="human", camera_id=0): + def render(self, mode: str = "human", camera_id: int = 0) -> np.ndarray: """Renders the environment. The set of supported modes varies per environment. (And some From 1780f5d61efecbf2cd8bf1b05f20d9374785be3d Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 15:20:41 +0200 Subject: [PATCH 32/67] Add changelog.md --- changelog.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 changelog.md diff --git a/changelog.md b/changelog.md new file mode 100644 index 00000000..4433d617 --- /dev/null +++ b/changelog.md @@ -0,0 +1,7 @@ +# 0.2.0 +- Integrate dm control environments (#55) +- Add context masks to only append those to the state (#54) +- Extend classic control environments to parametrize initial state distributions (#52) + +# 0.1.0 +- Initial release. \ No newline at end of file From db95fa720fcfab816d7ef185888477afab2535a9 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 15:20:55 +0200 Subject: [PATCH 33/67] Add S.D. to authors --- carl/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/carl/__init__.py b/carl/__init__.py index 2102bbd8..c0b98193 100644 --- a/carl/__init__.py +++ b/carl/__init__.py @@ -1,4 +1,4 @@ __copyright__ = "Copyright 2021, AutoML.org Freiburg-Hannover" __license__ = "Apache-2.0 License" __version__ = "0.1" -__author__ = "Carolin Benjamins, Theresa Eimer, Frederik Schubert, André Biedenkapp, Aditya Mohan" +__author__ = "Carolin Benjamins, Theresa Eimer, Frederik Schubert, André Biedenkapp, Aditya Mohan, Sebastian Döhler" From e239d3223dc5902dcab0f838cf2bb943f5b62b8c Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 15:21:05 +0200 Subject: [PATCH 34/67] Update version --- carl/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/carl/__init__.py b/carl/__init__.py index c0b98193..9a34d234 100644 --- a/carl/__init__.py +++ b/carl/__init__.py @@ -1,4 +1,4 @@ __copyright__ = "Copyright 2021, AutoML.org Freiburg-Hannover" __license__ = "Apache-2.0 License" -__version__ = "0.1" +__version__ = "0.2.0" __author__ = "Carolin Benjamins, Theresa Eimer, Frederik Schubert, André Biedenkapp, Aditya Mohan, Sebastian Döhler" From 119a58993642333d352a11bb2972001b0e4b43bc Mon Sep 17 00:00:00 2001 From: amsks Date: Wed, 6 Jul 2022 15:33:33 +0200 Subject: [PATCH 35/67] mario everything except from env done --- carl/envs/mario/generate_sample.py | 36 +++++++++++++++------------- carl/envs/mario/level_image_gen.py | 5 ++-- carl/envs/mario/mario_game.py | 8 +++---- carl/envs/mario/models/conv_block.py | 9 +++---- 4 files changed, 31 insertions(+), 27 deletions(-) diff --git a/carl/envs/mario/generate_sample.py b/carl/envs/mario/generate_sample.py index bdb2e949..db3cfb5e 100644 --- a/carl/envs/mario/generate_sample.py +++ b/carl/envs/mario/generate_sample.py @@ -3,33 +3,35 @@ import torch.nn as nn from torch.nn.functional import interpolate from torch import Tensor +from typing import Any, Union, Tuple, List, Optional +from carl.envs.mario.toad_gan import TOADGAN # Generates a noise tensor. Uses torch.randn. -def generate_spatial_noise(size, device="cpu") -> Tensor: +def generate_spatial_noise(size: Union[Any, List[int], Tuple[int]], device: Union[str, torch.device] ="cpu") -> Tensor: return torch.randn(size, device=device, dtype=torch.float32) # Generate a sample given a TOAD-GAN and additional parameters @torch.no_grad() def generate_sample( - generators, - noise_maps, - reals, - noise_amplitudes, - num_layer, - token_list, - scale_v=1.0, - scale_h=1.0, - current_scale=0, - gen_start_scale=0, - initial_noise=None, -): + generators: Tensor, + noise_maps: Tensor, + reals: Tensor, + noise_amplitudes: Tensor, + num_layer: int, + token_list: Tensor, + scale_v: float =1.0, + scale_h: float =1.0, + current_scale: int =0, + gen_start_scale: int =0, + initial_noise: Optional[Tensor]=None, +) -> List[str]: in_s = None - images_cur = [] - images = [] - z_s = [] + images_cur: List[Tensor] = [] + images: List[Tensor] = [] + z_s: List[Tensor] = [] # Generate on GPU if available device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") @@ -105,7 +107,7 @@ def generate_sample( return one_hot_to_ascii_level(I_curr, token_list) -def one_hot_to_ascii_level(level, tokens): +def one_hot_to_ascii_level(level: Any, tokens: Any) -> List[str]: """Converts a full token level tensor to an ascii level.""" ascii_level = [] for i in range(level.shape[2]): diff --git a/carl/envs/mario/level_image_gen.py b/carl/envs/mario/level_image_gen.py index c7eee69c..1a2c00c8 100644 --- a/carl/envs/mario/level_image_gen.py +++ b/carl/envs/mario/level_image_gen.py @@ -3,6 +3,7 @@ from PIL import Image, ImageEnhance, ImageOps +from typing import List, Tuple, Any class LevelImageGen: """Generates PIL Image files from Super Mario Bros. ascii levels. @@ -114,7 +115,7 @@ def __init__(self, sprite_path: str): self.sprite_dict = sprite_dict - def prepare_sprite_and_box(self, ascii_level, sprite_key, curr_x, curr_y): + def prepare_sprite_and_box(self, ascii_level: List[str], sprite_key: str, curr_x: int, curr_y: int) -> Tuple[Any, Tuple[int, int, int, int]]: """Helper to make correct sprites and sprite sizes to draw into the image. Some sprites are bigger than one tile and the renderer needs to adjust for them.""" @@ -388,7 +389,7 @@ def prepare_sprite_and_box(self, ascii_level, sprite_key, curr_x, curr_y): return actual_sprite, (new_left, new_top, new_right, new_bottom) - def render(self, ascii_level): + def render(self, ascii_level: List[str]) -> Image: """Renders the ascii level as a PIL Image. Assumes the Background is sky""" len_level = len(ascii_level[-1]) height_level = len(ascii_level) diff --git a/carl/envs/mario/mario_game.py b/carl/envs/mario/mario_game.py index 227c213f..bd57fde1 100644 --- a/carl/envs/mario/mario_game.py +++ b/carl/envs/mario/mario_game.py @@ -7,19 +7,19 @@ def getPort(self) -> int: pass @abstractmethod - def initGame(self): + def initGame(self) -> None: pass @abstractmethod - def stepGame(self, left: bool, right: bool, down: bool, speed: bool, jump: bool): + def stepGame(self, left: bool, right: bool, down: bool, speed: bool, jump: bool) -> None: pass @abstractmethod - def resetGame(self, level: str, timer: int, mario_state: int, inertia: float): + def resetGame(self, level: str, timer: int, mario_state: int, inertia: float) -> None: pass @abstractmethod - def computeObservationRGB(self): + def computeObservationRGB(self) -> None: pass @abstractmethod diff --git a/carl/envs/mario/models/conv_block.py b/carl/envs/mario/models/conv_block.py index 8c9402e8..3a501ec7 100644 --- a/carl/envs/mario/models/conv_block.py +++ b/carl/envs/mario/models/conv_block.py @@ -1,11 +1,11 @@ # Code from https://github.com/Mawiszus/TOAD-GAN import torch.nn as nn - +from typing import Tuple, Union class ConvBlock(nn.Sequential): """Conv block containing Conv2d, BatchNorm2d and LeakyReLU Layers.""" - def __init__(self, in_channel, out_channel, ker_size, padd, stride): + def __init__(self, in_channel: int, out_channel: int, ker_size: Union[int, Tuple[int, int]], padd: Union[str, Union[int, Tuple[int, int]]], stride: Union[int, Tuple[int, int]]): super().__init__() self.add_module( "conv", @@ -16,6 +16,7 @@ def __init__(self, in_channel, out_channel, ker_size, padd, stride): stride=stride, padding=padd, ), - ), - self.add_module("norm", nn.BatchNorm2d(out_channel)), + ) + + self.add_module("norm", nn.BatchNorm2d(out_channel)) self.add_module("LeakyRelu", nn.LeakyReLU(0.2, inplace=True)) From 352ba372da35c502a51693db8096e03c1755c6e5 Mon Sep 17 00:00:00 2001 From: amsks Date: Wed, 6 Jul 2022 16:00:38 +0200 Subject: [PATCH 36/67] mario_env done --- carl/envs/mario/mario_env.py | 44 +++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/carl/envs/mario/mario_env.py b/carl/envs/mario/mario_env.py index b9eaaa0c..5541de57 100644 --- a/carl/envs/mario/mario_env.py +++ b/carl/envs/mario/mario_env.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Literal, cast, Optional, Union, ByteString, Type +from typing import Any, Dict, List, Literal, cast, Optional, Union, ByteString, Deque, Tuple import os import random @@ -26,17 +26,18 @@ class MarioEnv(gym.Env): def __init__( self, levels: List[str], - timer=100, - visual=False, - sticky_action_probability=0.1, - frame_skip=2, - frame_stack=4, - frame_dim=64, - hide_points_banner=False, - sparse_rewards=False, - grayscale=False, - seed=0, + timer: int =100, + visual: bool =False, + sticky_action_probability: float=0.1, + frame_skip: int=2, + frame_stack: int=4, + frame_dim: int=64, + hide_points_banner: bool =False, + sparse_rewards: bool=False, + grayscale: bool=False, + seed: int =0, ): + self.gateway: Any = None self.seed(seed) self.level_names = levels self.levels = [load_level(name) for name in levels] @@ -57,7 +58,7 @@ def __init__( shape=[self.frame_stack if grayscale else 3, self.height, self.width], dtype=np.uint8, ) - self.original_obs = deque(maxlen=self.frame_skip) + self.original_obs: Deque = deque(maxlen=self.frame_skip) self.actions = [ [False, False, False, False, False], # noop [False, False, True, False, False], # down @@ -71,7 +72,7 @@ def __init__( [False, False, False, False, True], # jump ] self.action_space = spaces.Discrete(n=len(self.actions)) - self._obs = np.zeros(shape=self.observation_space.shape, dtype=np.uint8) + self._obs: Any = np.zeros(shape=self.observation_space.shape, dtype=np.uint8) self.current_level_idx = 0 self.frame_size = -1 self.port = get_port() @@ -88,7 +89,7 @@ def reset( ) -> Union[ObsType, tuple[ObsType, dict]]: self._reset_obs() if self.game is None: - self.game = self._init_game() + self.game: Any = self._init_game() self.current_level_idx = (self.current_level_idx + 1) % len(self.levels) level = self.levels[self.current_level_idx] self.game.resetGame(level, self.timer, self.mario_state, self.mario_inertia) @@ -101,7 +102,7 @@ def reset( else: return self._obs.copy(), {} - def step(self, action): + def step(self, action: Any) -> Any: if self.sticky_action_probability != 0.0: if ( self.last_action is not None @@ -136,15 +137,16 @@ def step(self, action): return ( self._obs.copy(), reward if not self.sparse_rewards else int(completionPercentage == 1.0), - done, - info, + done, # bool + info, # Dict[str, Any] ) - def render(self, *args, **kwargs): + def render(self, *args: Any, **kwargs: Any) -> ObsType: return self.original_obs[0] def __getstate__(self) -> Dict: assert self.gateway + self.gateway.close() self.gateway = None self.game = None @@ -156,14 +158,14 @@ def _reset_obs(self) -> None: self._obs[:] = 0 self.original_obs.clear() - def _read_frame(self, buffer: ByteString) -> np.ndarray: + def _read_frame(self, buffer: Any) -> Any: frame = ( np.frombuffer(buffer, dtype=np.int32).reshape(256, 256, 3).astype(np.uint8) ) self.original_obs.append(frame) return frame - def _update_obs(self, frame) -> None: + def _update_obs(self, frame: Any) -> Any: if self.grayscale: frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) @@ -182,7 +184,7 @@ def _init_game(self) -> MarioGame: eager_load=True, ) ) - self.game = cast(MarioGame, cast(Any, self.gateway.jvm).engine.core.MarioGame()) # type: ignore [attr-defined] + self.game = cast(MarioGame, cast(Any, self.gateway.jvm).engine.core.MarioGame()) self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect(("localhost", self.game.getPort())) self.game.initGame() From ad5f9a46186b8905b25f1525d9dfff53e059339a Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 16:08:28 +0200 Subject: [PATCH 37/67] Update setup.py Remove setup.cfg and fill init with more info. --- carl/__init__.py | 30 ++++++++++- setup.cfg | 93 ---------------------------------- setup.py | 129 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 156 insertions(+), 96 deletions(-) delete mode 100644 setup.cfg diff --git a/carl/__init__.py b/carl/__init__.py index 9a34d234..031be118 100644 --- a/carl/__init__.py +++ b/carl/__init__.py @@ -1,4 +1,32 @@ -__copyright__ = "Copyright 2021, AutoML.org Freiburg-Hannover" __license__ = "Apache-2.0 License" __version__ = "0.2.0" __author__ = "Carolin Benjamins, Theresa Eimer, Frederik Schubert, André Biedenkapp, Aditya Mohan, Sebastian Döhler" + + +import datetime +import os +import sys +import warnings + +name = "CARL" +package_name = "carl" +author = __author__ + +author_email = "benjamins@tnt.uni-hannover.de" +description = "CARL- Contextually Adaptive Reinforcement Learning" +url = "https://www.automl.org/" +project_urls = { + "Documentation": "https://carl.readthedocs.io/en/latest/", + "Source Code": "https://github.com/https://github.com/automl/CARL", +} +copyright = f""" + Copyright {datetime.date.today().strftime('%Y')}, AutoML.org Freiburg-Hannover +""" +version = __version__ + + +if os.name != "posix": + warnings.warn( + f"Detected unsupported operating system: {sys.platform}." + "Please be aware, that SMAC might not run on this system." + ) \ No newline at end of file diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index f6b6ec6c..00000000 --- a/setup.cfg +++ /dev/null @@ -1,93 +0,0 @@ -[metadata] -name = CARL -version = 0.1 -author_email = benjamins@tnt.uni-hannover.de, eimer@tnt.uni-hannover.de -author = Carolin Benjamins & Theresa Eimer <{author_email}> -home_page = https://github.com/automl/{name} -project_urls = - Documentation = https://carl.readthedocs.io/en/latest/ - Project Page = https://www.tnt.uni-hannover.de/en/project/dacbench/ -license = Apache 2.0 -license_file = LICENSE -long_description = file: README.md -long_description_content_type = text/markdown -keywords = - RL - Generalization - Context -classifiers = - Programming Language :: Python :: 3 - Natural Language :: English - Environment :: Console - Intended Audience :: Developers - Intended Audience :: Education - Intended Audience :: Science/Research - License :: OSI Approved :: Apache Software License - Operating System :: POSIX :: Linux - Topic :: Scientific/Engineering :: Artificial Intelligence - Topic :: Scientific/Engineering - Topic :: Software Development - -[options] -python_requires = >= 3.9 -packages = carl -include-package-data = True -install_requires = - gym>=0.22.0 - pygame==2.1.0 - scipy>=1.7.0 - ConfigArgParse>=1.5.1 - numpy>=1.19.5 - pandas>=1.3.0 - xvfbwrapper>=0.2.9 - matplotlib>=3.4.2 - optuna>=2.9.1 - dataclasses>=0.6 - numpyencoder>=0.3.0 - pyglet>=1.5.15 - pytablewriter>=0.62.0 - PyYAML>=5.4.1 - tabulate>=0.8.9 - bs4>=0.0.1 - -[options.package_data] -carl = py.typed - -[options.extras_require] -box2d = - gym[box2d]>=2.3.10 -brax = - brax>=0.0.10 - protobuf>=3.17.3 -rna = - viennarna>=2.4.18 - dataclasses - Distance -dm_control = - dm_control>=1.0.3 -mario = - torch>=1.9.0 - Pillow>=8.3.1 - py4j>=0.10.9.2 -experiments = - ray>=1.5.1 - seaborn>=0.11.1 - sb3_contrib>=1.1.0 - stable_baselines3>=1.1.0 - tensorflow>=2.5.0 -dev = - pytest>=6.1.1 - pytest-cov - mypy - black - flake8 - isort - pydocstyle - pre-commit -docs = - sphinx>=4.2.0 - sphinx-gallery>=0.10.0 - image>=1.5.33 - sphinx-autoapi>=1.8.4 - - diff --git a/setup.py b/setup.py index 8bf1ba93..9f272d2e 100644 --- a/setup.py +++ b/setup.py @@ -1,2 +1,127 @@ -from setuptools import setup -setup() +import os + +import setuptools + +from carl import ( + author, + author_email, + description, + package_name, + project_urls, + url, + version, +) + +HERE = os.path.dirname(os.path.realpath(__file__)) + + +def read_file(filepath: str) -> str: + with open(filepath, "r", encoding="utf-8") as fh: + return fh.read() + + +extras_require = { + "box2d": [ + "gym[box2d]>=2.3.10", + ], + "brax": [ + "brax>=0.0.10", + "protobuf>=3.17.3", + ], + "rna": [ + "viennarna>=2.4.18", + "dataclasses", + "Distance", + ], + "dm_control": [ + "dm_control>=1.0.3", + ], + "mario": [ + "torch>=1.9.0", + "Pillow>=8.3.1", + "py4j>=0.10.9.2", + ], + "experiments": [ + "ray>=1.5.1", + "seaborn>=0.11.1", + "sb3_contrib>=1.1.0", + "stable_baselines3>=1.1.0", + "tensorflow>=2.5.0", + ], + "dev": [ + "pytest>=6.1.1", + "pytest-cov", + "mypy", + "black", + "flake8", + "isort", + "pydocstyle", + "pre-commit", + ], + "docs": [ + "sphinx>=4.2.0", + "sphinx-gallery>=0.10.0", + "image>=1.5.33", + "sphinx-autoapi>=1.8.4", + ] +} + +setuptools.setup( + name=package_name, + author=author, + author_email=author_email, + description=description, + long_description=read_file(os.path.join(HERE, "README.md")), + long_description_content_type="text/markdown", + license="Apache 2.0", + license_file="LICENSE", + url=url, + project_urls=project_urls, + keywords=[ + "RL", + "Generalization", + "Context", + "Reinforcement Learning" + ], + version=version, + packages=setuptools.find_packages(exclude=["tests"]), + include_package_data=True, + python_requires=">=3.9", + install_requires=[ + "gym>=0.22.0", + "pygame==2.1.0", + "scipy>=1.7.0", + "ConfigArgParse>=1.5.1", + "numpy>=1.19.5", + "pandas>=1.3.0", + "xvfbwrapper>=0.2.9", + "matplotlib>=3.4.2", + "optuna>=2.9.1", + "dataclasses>=0.6", + "numpyencoder>=0.3.0", + "pyglet>=1.5.15", + "pytablewriter>=0.62.0", + "PyYAML>=5.4.1", + "tabulate>=0.8.9", + "bs4>=0.0.1", + ], + extras_require=extras_require, + test_suite="pytest", + platforms=["Linux"], + entry_points={ + "console_scripts": ["smac = smac.smac_cli:cmd_line_call"], + }, + classifiers=[ + "Programming Language :: Python :: 3", + "Natural Language :: English", + "Environment :: Console", + "Intended Audience :: Developers", + "Intended Audience :: Education", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: Apache Software License", + "Operating System :: POSIX :: Linux", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "Topic :: Scientific/Engineering", + "Topic :: Software Development", + ], +) \ No newline at end of file From 7b57015e2cdaf94522f0a87867ef3c2ff935acdb Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 16:51:26 +0200 Subject: [PATCH 38/67] Update gym version --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 9f272d2e..07244249 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ def read_file(filepath: str) -> str: extras_require = { "box2d": [ - "gym[box2d]>=2.3.10", + "gym[box2d]>=0.24.1", ], "brax": [ "brax>=0.0.10", @@ -88,7 +88,7 @@ def read_file(filepath: str) -> str: include_package_data=True, python_requires=">=3.9", install_requires=[ - "gym>=0.22.0", + "gym>=0.24.1", "pygame==2.1.0", "scipy>=1.7.0", "ConfigArgParse>=1.5.1", From 8d17051b5ab4acc912f830edc15454b034c43e69 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 17:11:24 +0200 Subject: [PATCH 39/67] Remove RNA --- README.md | 10 +- carl/envs/__init__.py | 9 -- carl/envs/rna/Readme.md | 35 ----- carl/envs/rna/__init__.py | 11 -- carl/envs/rna/carl_rna.py | 120 ------------------ carl/envs/rna/carl_rna_definitions.py | 52 -------- .../environments/environment_families/rna.rst | 4 + test/local_only/test_rna_env.py | 40 ------ 8 files changed, 5 insertions(+), 276 deletions(-) delete mode 100644 carl/envs/rna/Readme.md delete mode 100644 carl/envs/rna/__init__.py delete mode 100644 carl/envs/rna/carl_rna.py delete mode 100644 carl/envs/rna/carl_rna_definitions.py delete mode 100644 test/local_only/test_rna_env.py diff --git a/README.md b/README.md index 26263f17..2773f81c 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,6 @@ Benchmarks include: - [Super Mario (TOAD-GAN)](https://github.com/Mawiszus/TOAD-GAN), a procedurally generated jump'n'run game with control over level similarity -- [RNADesign](https://github.com/automl/learna/), an environment for RNA design given structure - constraints with structures from different datasets to choose from - - [dm_control](https://github.com/deepmind/dm_control), environments based on the MuJoCo physics engine. The environments are extended with different context features. ![Screenshot of each environment included in CARL.](./docs/source/figures/envs_overview.png) @@ -44,7 +41,7 @@ pip install . This will only install the basic classic control environments, which should run on most operating systems. For the full set of environments, use the install options: ```bash -pip install -e .[box2d, brax, rna, mario, dm_control] +pip install -e .[box2d, brax, mario, dm_control] ``` These may not be compatible with Windows systems. Box2D environment may need to be installed via conda on MacOS systems: @@ -60,9 +57,6 @@ To install the additional requirements for ToadGAN: javac carl/envs/mario/Mario-AI-Framework/**/*.java ``` -If you want to use the RNA design environment, you also need to download the RNA data -in addition to installing the dependencies. Please follow the instructions in carl/envs/rna. - ## CARL's Contextual Extension CARL contextually extends the environment by making the context visible and configurable. During training we therefore can encounter different contexts and train for generalization. @@ -95,8 +89,6 @@ Benchmarking Track)](https://arxiv.org/pdf/2106.13281.pdf) [TOAD-GAN: Coherent Style Level Generation from a Single Example, Awiszus et al., AIIDE 2020](https://arxiv.org/pdf/2008.01531.pdf) -[Learning to Design RNA, Runge et al., ICRL 2019](https://arxiv.org/pdf/1812.11951.pdf) - [dm_control: Software and Tasks for Continuous Control](https://arxiv.org/pdf/2006.12983.pdf) ## License diff --git a/carl/envs/__init__.py b/carl/envs/__init__.py index 4e6b3611..0e82ac83 100644 --- a/carl/envs/__init__.py +++ b/carl/envs/__init__.py @@ -34,15 +34,6 @@ "Module 'Mario' not found. Please follow installation guide for ToadGAN environment." ) -RNA_spec = importlib.util.find_spec("viennarna") -found = RNA_spec is not None -if found: - from carl.envs.rna import * -else: - warnings.warn( - "Module 'RNA' not found. Please follow installation guide for RNA environment." - ) - dm_control_spec = importlib.util.find_spec("dm_control") found = dm_control_spec is not None if found: diff --git a/carl/envs/rna/Readme.md b/carl/envs/rna/Readme.md deleted file mode 100644 index c70892d5..00000000 --- a/carl/envs/rna/Readme.md +++ /dev/null @@ -1,35 +0,0 @@ -# Downloading RNA data -To use the RNA env, you need to install the base environment as well as download -the sequence data. If you have not downloaded the learna submodule automatically, -please do so now and make sure it is placed in this directory. - -There are three different datasets you can download. -First, you need to enter the learna directory: -``` -cd learna -``` -Then to download the Eterna100 dataset, run: -``` -python -m src.data.download_and_build_eterna ./src/data/secondaries_to_single_files.sh data/eterna data/eterna/interim/eterna.txt -``` -A note on python requests: the content length header element that's used in this original download -script is not guaranteed to be present. If there's an error, try replacing line 6 in the python scripts with: -```python -response = requests.get(url, stream=True, headers={'Accept-Encoding': None}) -``` -Afterwards the download should start as normal. - -For Rfam-Taneda, use: -``` -sh src/data/download_and_build_rfam_taneda.sh -``` -And finally for Rfam-Learn: -``` -sh src/data/download_and_build_rfam_learn.sh -mv data/rfam_learn/test data/rfam_learn_test -mv data/rfam_learn/validation data/rfam_learn_validation -mv data/rfam_learn/train data/rfam_learn_train -rm -rf data/rfam_learn -``` - -If everything went well, you should see .rna files in the target data folders. By default, the env will try to parse them out of carl/envs/rna/learna/data/, so make sure to specify a different path upon initialization if you want to relocate the data. diff --git a/carl/envs/rna/__init__.py b/carl/envs/rna/__init__.py deleted file mode 100644 index f88937fd..00000000 --- a/carl/envs/rna/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# flake8: noqa: F401 -try: - from carl.envs.rna.carl_rna import CARLRnaDesignEnv - from carl.envs.rna.carl_rna_definitions import ( - CONTEXT_BOUNDS as CARLRnaDesignEnv_bounds, - ) - from carl.envs.rna.carl_rna_definitions import ( - DEFAULT_CONTEXT as CARLRnaDesignEnv_defaults, - ) -except Exception as e: - print(e) diff --git a/carl/envs/rna/carl_rna.py b/carl/envs/rna/carl_rna.py deleted file mode 100644 index 9bebb689..00000000 --- a/carl/envs/rna/carl_rna.py +++ /dev/null @@ -1,120 +0,0 @@ -from typing import Dict, List, Optional, Union - -import os - -import gym -import numpy as np - -from carl.context.selection import AbstractSelector -from carl.envs.carl_env import CARLEnv -from carl.envs.rna.carl_rna_definitions import ( - ACTION_SPACE, - DEFAULT_CONTEXT, - OBSERVATION_SPACE, -) -from carl.envs.rna.learna.src.data.parse_dot_brackets import parse_dot_brackets -from carl.envs.rna.learna.src.learna.environment import ( - RnaDesignEnvironment, - RnaDesignEnvironmentConfig, -) -from carl.utils.trial_logger import TrialLogger - - -class RnaGymWrapper(object): - def __init__(self, env): - self.env = env - - def reset(self): - state = self.env.reset() - state = np.array(state).flatten() - return state - - def step(self, action): - state, done, reward = self.env.execute(action) - state = np.array(state).flatten() - return state, reward, done, {} - - def __getattr__(self, name): - if not name == "env": - return getattr(self.env, name) - else: - return self.env - - -class CARLRnaDesignEnv(CARLEnv): - def __init__( - self, - env: gym.Env = None, - data_location: str = "envs/rna/learna/data", - contexts: Dict[str, Dict] = {}, - hide_context: bool = True, - add_gaussian_noise_to_context: bool = False, - gaussian_noise_std_percentage: float = 0.01, - logger: Optional[TrialLogger] = None, - scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, - context_selector: Optional[ - Union[AbstractSelector, type(AbstractSelector)] - ] = None, - context_selector_kwargs: Optional[Dict] = None, - context_mask: Optional[List[str]] = None, - ): - """ - - Parameters - ---------- - env: gym.Env, optional - Defaults to classic control environment mountain car from gym (MountainCarEnv). - contexts: List[Dict], optional - Different contexts / different environment parameter settings. - instance_mode: str, optional - """ - self.data_location = os.path.abspath(data_location) - - if not contexts: - contexts = {0: DEFAULT_CONTEXT} - if env is None: - env_config = RnaDesignEnvironmentConfig( - mutation_threshold=DEFAULT_CONTEXT["mutation_threshold"], - reward_exponent=DEFAULT_CONTEXT["reward_exponent"], - state_radius=DEFAULT_CONTEXT["state_radius"], - ) - dot_brackets = parse_dot_brackets( - dataset=DEFAULT_CONTEXT["dataset"], - data_dir=data_location, - target_structure_ids=DEFAULT_CONTEXT["target_structure_ids"], - ) - env = RnaDesignEnvironment(dot_brackets, env_config) - env.action_space = ACTION_SPACE - env.observation_space = OBSERVATION_SPACE - env.reward_range = (-np.inf, np.inf) - env.metadata = {} - env = RnaGymWrapper(env) - - super().__init__( - env=env, - contexts=contexts, - hide_context=hide_context, - add_gaussian_noise_to_context=add_gaussian_noise_to_context, - gaussian_noise_std_percentage=gaussian_noise_std_percentage, - logger=logger, - scale_context_features=scale_context_features, - default_context=default_context, - context_selector=context_selector, - context_selector_kwargs=context_selector_kwargs, - context_mask=context_mask, - ) - self.whitelist_gaussian_noise = list(DEFAULT_CONTEXT) - - def _update_context(self) -> None: - dot_brackets = parse_dot_brackets( - dataset=self.context["dataset"], - data_dir=self.data_location, - target_structure_ids=self.context["target_structure_ids"], - ) - env_config = RnaDesignEnvironmentConfig( - mutation_threshold=self.context["mutation_threshold"], - reward_exponent=self.context["reward_exponent"], - state_radius=self.context["state_radius"], - ) - self.env = RnaGymWrapper(RnaDesignEnvironment(dot_brackets, env_config)) diff --git a/carl/envs/rna/carl_rna_definitions.py b/carl/envs/rna/carl_rna_definitions.py deleted file mode 100644 index fbeb5e1f..00000000 --- a/carl/envs/rna/carl_rna_definitions.py +++ /dev/null @@ -1,52 +0,0 @@ -import numpy as np -from gym import spaces - -# FIXME: how much sense do these make? Eterna solvers are unique and I'm not sure how to get the solvers for taneda -# SOLVER_LIST_ETERNA = [22230] -# SOLVER_LIST_RFAM_TANEDA = [None] -# SOLVER_LIST_RFAM_LEARN = [None] - -ID_LIST_ETERNA = np.arange(1, 101) -ID_LIST_RFAM_TANEDA = np.arange(1, 30) -ID_LIST_RFAM_LEARN = np.arange(1, 65001) - -DEFAULT_CONTEXT = { - "mutation_threshold": 5, - "reward_exponent": 1, - "state_radius": 5, - "dataset": "rfam_taneda", - "target_structure_ids": None, - # if solvers is set to 'None', all solvers are eligible - # "solvers": None, -} -CONTEXT_BOUNDS = { - "mutation_threshold": (0.1, np.inf, float), - "reward_exponent": (0.1, np.inf, float), - "state_radius": (1, np.inf, float), - "dataset": ( - None, - None, - "categorical", - ["eterna", "rfam_taneda", "rfam_learn", None], - ), - "target_structure_ids": ( - None, - None, - "conditional", - { - "eterna": ID_LIST_ETERNA, - "rfam_taneda": ID_LIST_RFAM_TANEDA, - "rfan_learn": ID_LIST_RFAM_LEARN, - None: [None], - }, - "dataset", - ), - # "solvers": { - # "eterna": SOLVER_LIST_ETERNA, - # "rfam_taneda": SOLVER_LIST_RFAM_TANEDA, - # "rfan_learn": SOLVER_LIST_RFAM_LEARN, None: [None] - # }, -} - -ACTION_SPACE = spaces.Discrete(4) -OBSERVATION_SPACE = spaces.Box(low=-np.inf * np.ones(11), high=np.inf * np.ones(11)) diff --git a/docs/source/environments/environment_families/rna.rst b/docs/source/environments/environment_families/rna.rst index 7825e0ec..12ded4f4 100644 --- a/docs/source/environments/environment_families/rna.rst +++ b/docs/source/environments/environment_families/rna.rst @@ -1,5 +1,9 @@ CARL RNA Design Environment =========================== +.. warning:: + This environment currently is under maintenance and cannot be installed. Thank you for your patience. + + .. image:: ../data/screenshots/learna.png :width: 65% :align: center diff --git a/test/local_only/test_rna_env.py b/test/local_only/test_rna_env.py deleted file mode 100644 index f0c9e968..00000000 --- a/test/local_only/test_rna_env.py +++ /dev/null @@ -1,40 +0,0 @@ -import unittest - -from carl.envs.rna.carl_rna import CARLRnaDesignEnv, RnaGymWrapper - - -class TestRNA(unittest.TestCase): - def test_rna_init(self): - env = CARLRnaDesignEnv() - self.assertFalse(env is None) - self.assertTrue(isinstance(env, CARLRnaDesignEnv)) - self.assertTrue(isinstance(env.env, RnaGymWrapper)) - self.assertFalse(env.data_location is None) - - self.assertTrue("mutation_threshold" in env.context.keys()) - self.assertTrue("reward_exponent" in env.context.keys()) - self.assertTrue("state_radius" in env.context.keys()) - self.assertTrue("dataset" in env.context.keys()) - self.assertTrue("target_structure_ids" in env.context.keys()) - - def test_update_context(self): - env = CARLRnaDesignEnv() - self.assertTrue( - env.context["mutation_threshold"] == env.env._env_config.mutation_threshold - ) - self.assertTrue( - env.context["reward_exponent"] == env.env._env_config.reward_exponent - ) - self.assertTrue(env.context["state_radius"] == env.env._env_config.state_radius) - - env.context = { - "mutation_threshold": 3, - "reward_exponent": 2, - "state_radius": 1, - "dataset": env.context["dataset"], - "target_structure_ids": env.context["target_structure_ids"], - } - env._update_context() - self.assertTrue(env.env._env_config.mutation_threshold == 3) - self.assertTrue(env.env._env_config.reward_exponent == 2) - self.assertTrue(env.env._env_config.state_radius == 1) From b0e044ce7f181555200a15fa910e4862f5a1ccde Mon Sep 17 00:00:00 2001 From: amsks Date: Wed, 6 Jul 2022 17:15:01 +0200 Subject: [PATCH 40/67] mypy corrected for everything except carl_rna --- carl/context/utils.py | 6 ++--- carl/envs/box2d/carl_vehicle_racing.py | 26 +++++++++---------- carl/envs/carl_env.py | 2 +- carl/envs/classic_control/carl_mountaincar.py | 2 +- carl/utils/doc_building/plot_radar.py | 4 +-- carl/utils/doc_building/plotting.py | 2 +- carl/utils/trial_logger.py | 2 +- 7 files changed, 22 insertions(+), 22 deletions(-) diff --git a/carl/context/utils.py b/carl/context/utils.py index 90985c95..ac0fdabb 100644 --- a/carl/context/utils.py +++ b/carl/context/utils.py @@ -4,7 +4,7 @@ def get_context_bounds( - context_keys: List[str], context_bounds: Dict[str, Tuple[float, float, type]] + context_keys: List[str], context_bounds: Dict[str, Tuple[float, float]] ) -> Tuple[np.ndarray, np.ndarray]: """ Get context bounds for specific features. @@ -28,7 +28,7 @@ def get_context_bounds( upper_bounds = np.empty(shape=len(context_keys)) for i, context_key in enumerate(context_keys): - l, u, _ = context_bounds[context_key] + l, u = context_bounds[context_key] lower_bounds[i] = l upper_bounds[i] = u @@ -63,4 +63,4 @@ def get_context_bounds( "min_velocity_start": (-np.inf, np.inf), "max_velocity_start": (-np.inf, np.inf), } - lower, upper = get_context_bounds(list(DEFAULT_CONTEXT.keys()), CONTEXT_BOUNDS) + lower, upper = get_context_bounds(list(DEFAULT_CONTEXT.keys()), CONTEXT_BOUNDS) diff --git a/carl/envs/box2d/carl_vehicle_racing.py b/carl/envs/box2d/carl_vehicle_racing.py index bab09360..472c01fc 100644 --- a/carl/envs/box2d/carl_vehicle_racing.py +++ b/carl/envs/box2d/carl_vehicle_racing.py @@ -88,7 +88,7 @@ class CustomCarRacingEnv(CarRacing): - def __init__(self, vehicle_class: Type[Car] = Car, verbose: int = 1): + def __init__(self, vehicle_class: Type[Car] = Car, verbose: bool = True): super().__init__(verbose) self.vehicle_class = vehicle_class @@ -104,7 +104,7 @@ def reset( self.prev_reward = 0.0 self.tile_visited_count = 0 self.t = 0.0 - self.road_poly = [] # type: List + self.road_poly = [] while True: success = self._create_track() @@ -115,17 +115,17 @@ def reset( "retry to generate track (normal if there are not many" "instances of this message)" ) - self.car = self.vehicle_class(self.world, *self.track[0][1:4]) + self.car = self.vehicle_class(self.world, *self.track[0][1:4]) # type: ignore [assignment] for i in range( 49 ): # this sets up the environment and resolves any initial violations of geometry - self.step(None) + self.step(None) # type: ignore [arg-type] if not return_info: - return self.step(None)[0] + return self.step(None)[0] # type: ignore [arg-type] else: - return self.step(None)[0], {} + return self.step(None)[0], {} # type: ignore [arg-type] def render_indicators(self, W: int, H: int) -> None: # copied from meta car racing @@ -173,18 +173,18 @@ def horiz_ind(place: int, val: int, color: Tuple) -> None: ) true_speed = np.sqrt( - np.square(self.car.hull.linearVelocity[0]) - + np.square(self.car.hull.linearVelocity[1]) + np.square(self.car.hull.linearVelocity[0]) # type: ignore [attr-defined] + + np.square(self.car.hull.linearVelocity[1]) # type: ignore [attr-defined] ) vertical_ind(5, 0.02 * true_speed, (1, 1, 1)) # Custom render to handle different amounts of wheels - vertical_ind(7, 0.01 * self.car.wheels[0].omega, (0.0, 0, 1)) # ABS sensors - for i in range(len(self.car.wheels)): - vertical_ind(7 + i, 0.01 * self.car.wheels[i].omega, (0.0 + i * 0.1, 0, 1)) - horiz_ind(20, -10.0 * self.car.wheels[0].joint.angle, (0, 1, 0)) - horiz_ind(30, -0.8 * self.car.hull.angularVelocity, (1, 0, 0)) + vertical_ind(7, 0.01 * self.car.wheels[0].omega, (0.0, 0, 1)) # type: ignore [attr-defined] + for i in range(len(self.car.wheels)): # type: ignore [attr-defined] + vertical_ind(7 + i, 0.01 * self.car.wheels[i].omega, (0.0 + i * 0.1, 0, 1)) # type: ignore [attr-defined] + horiz_ind(20, -10.0 * self.car.wheels[0].joint.angle, (0, 1, 0)) # type: ignore [attr-defined] + horiz_ind(30, -0.8 * self.car.hull.angularVelocity, (1, 0, 0)) # type: ignore [attr-defined] vl = pyglet.graphics.vertex_list( len(polygons) // 3, ("v3f", polygons), ("c4f", colors) # gl.GL_QUADS, ) diff --git a/carl/envs/carl_env.py b/carl/envs/carl_env.py index 33eb9a21..4a51f089 100644 --- a/carl/envs/carl_env.py +++ b/carl/envs/carl_env.py @@ -503,7 +503,7 @@ def build_observation_space( context_upper_bounds = np.inf * np.ones(context_dim) else: context_lower_bounds, context_upper_bounds = get_context_bounds( - context_keys, context_bounds + context_keys, context_bounds # type: ignore [arg-type] ) if self.state_context_features is not None: ids = np.array( diff --git a/carl/envs/classic_control/carl_mountaincar.py b/carl/envs/classic_control/carl_mountaincar.py index 815c58f6..b6975a27 100644 --- a/carl/envs/classic_control/carl_mountaincar.py +++ b/carl/envs/classic_control/carl_mountaincar.py @@ -44,7 +44,7 @@ def __init__(self, goal_velocity: float = 0.0): self.max_position_start = -0.4 self.min_velocity_start = 0.0 self.max_velocity_start = 0.0 - self.state: np.ndarray + self.state: np.ndarray # type: ignore [assignment] def sample_initial_state(self) -> np.ndarray: return np.array( diff --git a/carl/utils/doc_building/plot_radar.py b/carl/utils/doc_building/plot_radar.py index 86dbbdec..0b72d11a 100644 --- a/carl/utils/doc_building/plot_radar.py +++ b/carl/utils/doc_building/plot_radar.py @@ -268,7 +268,7 @@ data = pd.concat(data) # normalize values - cols = [c for c in data.columns if c not in ["env_type", "env_name"]] + cols = [c for c in data.columns if c not in ["env_type", "env_name"]] # type: ignore [attr-defined] max_values_per_col = [] for col in cols: if col == "state_space_size": @@ -305,7 +305,7 @@ # Plot the four cases from the example data on separate axes for ax, env_type in zip(axs.flat, env_types): - D = data[data["env_type"] == env_type] + D = data[data["env_type"] == env_type] # type: ignore [call-overload] labels = D["env_name"].to_list() color_palette_name = "colorblind" n = len(D) diff --git a/carl/utils/doc_building/plotting.py b/carl/utils/doc_building/plotting.py index 5e133373..728780b2 100644 --- a/carl/utils/doc_building/plotting.py +++ b/carl/utils/doc_building/plotting.py @@ -61,7 +61,7 @@ def _close_line(self, line: Line2D) -> None: def set_varlabels(self, labels: List[str], **kwargs: Dict) -> None: self.set_thetagrids(np.degrees(theta), labels, **kwargs) - def _gen_axes_patch(self): + def _gen_axes_patch(self) -> Any: # The Axes patch must be centered at (0.5, 0.5) and of radius 0.5 # in axes coordinates. if frame == "circle": diff --git a/carl/utils/trial_logger.py b/carl/utils/trial_logger.py index 5317876f..fa4dc2ba 100644 --- a/carl/utils/trial_logger.py +++ b/carl/utils/trial_logger.py @@ -95,7 +95,7 @@ def write_trial_setup(self) -> None: parsed_namespace=self.trial_setup_args, output_file_paths=output_file_paths ) - def write_context(self, episode: int, step: int, context: Dict[Any, Any]): + def write_context(self, episode: int, step: int, context: Dict[Any, Any]) -> None: """ Context will be written to csv file (logdir / "context_history.csv"). From f613d9b428ed0e20d7c4a4fe6ff6d17f5d865f1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20D=C3=B6hler?= Date: Wed, 6 Jul 2022 17:28:39 +0200 Subject: [PATCH 41/67] gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0cc7c932..dc65ce7b 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ carl/runscripts/generated docs/html docs/apidoc CARL.egg-info +carl.egg-info .mypy_cache .pytest_cache .coverage From 9080c282cee83b6e4a5d8252df200ba30814d8fb Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 17:37:22 +0200 Subject: [PATCH 42/67] Fix mypy --- carl/envs/dmc/loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/carl/envs/dmc/loader.py b/carl/envs/dmc/loader.py index 0a62c4bc..841ba4a3 100644 --- a/carl/envs/dmc/loader.py +++ b/carl/envs/dmc/loader.py @@ -5,7 +5,7 @@ import dm_env # type: ignore from dm_control import suite # type: ignore -from carl.envs.dmc.dmc_tasks import fish, quadruped, walker # noqa: F401 +from carl.envs.dmc.dmc_tasks import fish, quadruped, walker # type: ignore [import] # noqa: F401 _DOMAINS = { name: module From 6c9411b86240dd289b3c3dc4a698777afc9aa0b8 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 17:44:53 +0200 Subject: [PATCH 43/67] Change type of contexts to Contexts --- carl/context/selection.py | 14 +++++++------- carl/envs/box2d/carl_bipedal_walker.py | 3 ++- carl/envs/box2d/carl_lunarlander.py | 3 ++- carl/envs/carl_env.py | 14 +++++++------- carl/envs/classic_control/carl_acrobot.py | 3 ++- carl/envs/classic_control/carl_cartpole.py | 3 ++- carl/envs/classic_control/carl_mountaincar.py | 3 ++- .../classic_control/carl_mountaincarcontinuous.py | 3 ++- carl/envs/classic_control/carl_pendulum.py | 3 ++- carl/envs/dmc/carl_dm_fish.py | 3 ++- carl/envs/dmc/carl_dm_quadruped.py | 4 ++-- carl/envs/dmc/carl_dm_walker.py | 4 ++-- carl/envs/mario/carl_mario.py | 3 ++- 13 files changed, 36 insertions(+), 27 deletions(-) diff --git a/carl/context/selection.py b/carl/context/selection.py index 278c4e2c..0ab831e1 100644 --- a/carl/context/selection.py +++ b/carl/context/selection.py @@ -3,7 +3,7 @@ import numpy as np -from carl.utils.types import Context +from carl.utils.types import Contexts, Context class AbstractSelector(object): @@ -15,13 +15,13 @@ class AbstractSelector(object): Parameters ---------- - contexts: Dict[Any, Context] + contexts: Contexts Context set. A `Context` is a Dict[str, Any]. Attributes ---------- - contexts : Dict[Any, Context] + contexts : Contexts Context set. context_ids : List[int] Integer index for contexts. @@ -34,8 +34,8 @@ class AbstractSelector(object): """ - def __init__(self, contexts: Dict[Any, Context]): - self.contexts: Dict[Any, Context] = contexts + def __init__(self, contexts: Contexts): + self.contexts: Contexts = contexts self.context_ids: List[int] = list(np.arange(len(contexts))) self.contexts_keys: List[Any] = list(contexts.keys()) self.n_calls: int = 0 @@ -110,7 +110,7 @@ class CustomSelector(AbstractSelector): Parameters ---------- - contexts: Dict[Any, Context] + contexts: Contexts Set of contexts. selector_function: callable Function receiving a pointer to the selector implementing selection logic. @@ -133,7 +133,7 @@ class CustomSelector(AbstractSelector): def __init__( self, - contexts: Dict[Any, Context], + contexts: Contexts, selector_function: Callable[[AbstractSelector], Tuple[Context, int]], ): super().__init__(contexts=contexts) diff --git a/carl/envs/box2d/carl_bipedal_walker.py b/carl/envs/box2d/carl_bipedal_walker.py index af077715..87afda0d 100644 --- a/carl/envs/box2d/carl_bipedal_walker.py +++ b/carl/envs/box2d/carl_bipedal_walker.py @@ -8,6 +8,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts DEFAULT_CONTEXT = { "FPS": 50, @@ -78,7 +79,7 @@ class CARLBipedalWalkerEnv(CARLEnv): def __init__( self, env: Optional[bipedal_walker.BipedalWalker] = None, - contexts: Dict[Any, Dict[Any, Any]] = {}, + contexts: Contexts = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.05, diff --git a/carl/envs/box2d/carl_lunarlander.py b/carl/envs/box2d/carl_lunarlander.py index 8acaf846..1396be22 100644 --- a/carl/envs/box2d/carl_lunarlander.py +++ b/carl/envs/box2d/carl_lunarlander.py @@ -6,6 +6,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts ObsType = TypeVar("ObsType") ActType = TypeVar("ActType") @@ -100,7 +101,7 @@ class CARLLunarLanderEnv(CARLEnv): def __init__( self, env: Optional[LunarLanderEnv] = None, - contexts: Dict[Any, Dict[Any, Any]] = {}, + contexts: Contexts = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.05, diff --git a/carl/envs/carl_env.py b/carl/envs/carl_env.py index 4a51f089..cd157b98 100644 --- a/carl/envs/carl_env.py +++ b/carl/envs/carl_env.py @@ -13,7 +13,7 @@ from carl.context.augmentation import add_gaussian_noise from carl.context.selection import AbstractSelector, RoundRobinSelector from carl.context.utils import get_context_bounds -from carl.utils.types import Vector, ObsType +from carl.utils.types import Vector, ObsType, Contexts, Context from carl.utils.trial_logger import TrialLogger brax_spec = importlib.util.find_spec("brax") @@ -38,7 +38,7 @@ class CARLEnv(Wrapper): ---------- env: gym.Env Environment which context features are made visible / which is turned into a cMDP. - contexts: Dict[Any, Dict[Any, Any]] + contexts: Contexts Dict of contexts/instances. Key are context id, values are contexts as Dict[context feature id, context feature value]. hide_context: bool = False @@ -89,14 +89,14 @@ def __init__( self, env: gym.Env, n_envs: int = 1, - contexts: Dict[Any, Dict[Any, Any]] = {}, + contexts: Contexts = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, max_episode_length: int = int(1e6), scale_context_features: str = "no", - default_context: Optional[Dict] = None, + default_context: Optional[Context] = None, state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, @@ -107,8 +107,8 @@ def __init__( ): super().__init__(env=env) # Gather args - self._context: Dict # init for property - self._contexts: Dict[Any, Dict[Any, Any]] # init for property + self._context: Context # init for property + self._contexts: Contexts # init for property self.default_context = default_context self.contexts = contexts self.context_mask = context_mask @@ -241,7 +241,7 @@ def contexts(self) -> Dict[Any, Dict[Any, Any]]: return self._contexts @contexts.setter - def contexts(self, contexts: Dict[Any, Dict[Any, Any]]) -> None: + def contexts(self, contexts: Contexts) -> None: self._contexts = { k: self.fill_context_with_default(context=v) for k, v in contexts.items() } diff --git a/carl/envs/classic_control/carl_acrobot.py b/carl/envs/classic_control/carl_acrobot.py index 4c93770b..049efce7 100644 --- a/carl/envs/classic_control/carl_acrobot.py +++ b/carl/envs/classic_control/carl_acrobot.py @@ -7,6 +7,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts DEFAULT_CONTEXT = { "link_length_1": 1, # should be seen as 100% default and scaled @@ -100,7 +101,7 @@ class CARLAcrobotEnv(CARLEnv): def __init__( self, env: CustomAcrobotEnv = CustomAcrobotEnv(), - contexts: Dict[Any, Dict[Any, Any]] = {}, + contexts: Contexts = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, diff --git a/carl/envs/classic_control/carl_cartpole.py b/carl/envs/classic_control/carl_cartpole.py index 43d068aa..13c06bb9 100644 --- a/carl/envs/classic_control/carl_cartpole.py +++ b/carl/envs/classic_control/carl_cartpole.py @@ -7,6 +7,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts DEFAULT_CONTEXT = { "gravity": 9.8, @@ -63,7 +64,7 @@ class CARLCartPoleEnv(CARLEnv): def __init__( self, env: CustomCartPoleEnv = CustomCartPoleEnv(), - contexts: Dict[Any, Dict[Any, Any]] = {}, + contexts: Contexts = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, diff --git a/carl/envs/classic_control/carl_mountaincar.py b/carl/envs/classic_control/carl_mountaincar.py index b6975a27..9eb76143 100644 --- a/carl/envs/classic_control/carl_mountaincar.py +++ b/carl/envs/classic_control/carl_mountaincar.py @@ -7,6 +7,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts DEFAULT_CONTEXT = { "min_position": -1.2, # unit? @@ -86,7 +87,7 @@ class CARLMountainCarEnv(CARLEnv): def __init__( self, env: CustomMountainCarEnv = CustomMountainCarEnv(), - contexts: Dict[Any, Dict[Any, Any]] = {}, + contexts: Contexts = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, diff --git a/carl/envs/classic_control/carl_mountaincarcontinuous.py b/carl/envs/classic_control/carl_mountaincarcontinuous.py index acc09028..cafcae63 100644 --- a/carl/envs/classic_control/carl_mountaincarcontinuous.py +++ b/carl/envs/classic_control/carl_mountaincarcontinuous.py @@ -7,6 +7,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts DEFAULT_CONTEXT = { "min_position": -1.2, @@ -66,7 +67,7 @@ class CARLMountainCarContinuousEnv(CARLEnv): def __init__( self, env: CustomMountainCarContinuousEnv = CustomMountainCarContinuousEnv(), - contexts: Dict[Any, Dict[Any, Any]] = {}, + contexts: Contexts = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = True, gaussian_noise_std_percentage: float = 0.01, diff --git a/carl/envs/classic_control/carl_pendulum.py b/carl/envs/classic_control/carl_pendulum.py index 691a4ff3..309b49b4 100644 --- a/carl/envs/classic_control/carl_pendulum.py +++ b/carl/envs/classic_control/carl_pendulum.py @@ -7,6 +7,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts DEFAULT_CONTEXT = { "max_speed": 8.0, @@ -57,7 +58,7 @@ class CARLPendulumEnv(CARLEnv): def __init__( self, env: CustomPendulum = CustomPendulum(), - contexts: Dict[Any, Dict[Any, Any]] = {}, + contexts: Contexts = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.01, diff --git a/carl/envs/dmc/carl_dm_fish.py b/carl/envs/dmc/carl_dm_fish.py index 8882542a..eaaecf90 100644 --- a/carl/envs/dmc/carl_dm_fish.py +++ b/carl/envs/dmc/carl_dm_fish.py @@ -6,6 +6,7 @@ from carl.envs.dmc.carl_dmcontrol import CARLDmcEnv from carl.envs.dmc.dmc_tasks.fish import STEP_LIMIT # type: ignore from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts DEFAULT_CONTEXT = { "gravity": -9.81, # Gravity is disabled via flag @@ -59,7 +60,7 @@ def __init__( self, domain: str = "fish", task: str = "swim_context", - contexts: Dict[Any, Dict[Any, Any]] = {}, + contexts: Contexts = {}, context_mask: Optional[List[str]] = [], hide_context: bool = True, add_gaussian_noise_to_context: bool = False, diff --git a/carl/envs/dmc/carl_dm_quadruped.py b/carl/envs/dmc/carl_dm_quadruped.py index f3d0a2e1..c1d7c177 100644 --- a/carl/envs/dmc/carl_dm_quadruped.py +++ b/carl/envs/dmc/carl_dm_quadruped.py @@ -6,7 +6,7 @@ from carl.envs.dmc.carl_dmcontrol import CARLDmcEnv from carl.envs.dmc.dmc_tasks.quadruped import STEP_LIMIT # type: ignore from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "gravity": -9.81, @@ -58,7 +58,7 @@ def __init__( self, domain: str = "quadruped", task: str = "walk_context", - contexts: Dict[Any, Context] = {}, + contexts: Contexts = {}, context_mask: Optional[List[str]] = [], hide_context: bool = True, add_gaussian_noise_to_context: bool = False, diff --git a/carl/envs/dmc/carl_dm_walker.py b/carl/envs/dmc/carl_dm_walker.py index 8112b8c0..7176c3dc 100644 --- a/carl/envs/dmc/carl_dm_walker.py +++ b/carl/envs/dmc/carl_dm_walker.py @@ -6,7 +6,7 @@ from carl.envs.dmc.carl_dmcontrol import CARLDmcEnv from carl.envs.dmc.dmc_tasks.walker import STEP_LIMIT # type: ignore from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "gravity": -9.81, @@ -58,7 +58,7 @@ def __init__( self, domain: str = "walker", task: str = "walk_context", - contexts: Dict[Any, Context] = {}, + contexts: Contexts = {}, context_mask: Optional[List[str]] = [], hide_context: bool = True, add_gaussian_noise_to_context: bool = False, diff --git a/carl/envs/mario/carl_mario.py b/carl/envs/mario/carl_mario.py index ebf98433..c7e0f914 100644 --- a/carl/envs/mario/carl_mario.py +++ b/carl/envs/mario/carl_mario.py @@ -12,13 +12,14 @@ from carl.envs.mario.mario_env import MarioEnv from carl.envs.mario.toad_gan import generate_level from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Contexts class CARLMarioEnv(CARLEnv): def __init__( self, env: gym.Env = MarioEnv(levels=[]), - contexts: Dict[int, Dict] = {}, + contexts: Contexts = {}, hide_context: bool = True, add_gaussian_noise_to_context: bool = False, gaussian_noise_std_percentage: float = 0.05, From 4d759d33d406d600d00eafbf56cd3d21f516b949 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Wed, 6 Jul 2022 17:50:08 +0200 Subject: [PATCH 44/67] Change type of default_context to Context --- carl/envs/box2d/carl_bipedal_walker.py | 4 ++-- carl/envs/box2d/carl_lunarlander.py | 4 ++-- carl/envs/box2d/carl_vehicle_racing.py | 4 ++-- carl/envs/brax/carl_ant.py | 4 ++-- carl/envs/brax/carl_fetch.py | 4 ++-- carl/envs/brax/carl_grasp.py | 4 ++-- carl/envs/brax/carl_halfcheetah.py | 4 ++-- carl/envs/brax/carl_humanoid.py | 4 ++-- carl/envs/brax/carl_ur5e.py | 4 ++-- carl/envs/carl_env.py | 6 +++--- carl/envs/classic_control/carl_acrobot.py | 4 ++-- carl/envs/classic_control/carl_cartpole.py | 4 ++-- carl/envs/classic_control/carl_mountaincar.py | 4 ++-- carl/envs/classic_control/carl_mountaincarcontinuous.py | 4 ++-- carl/envs/classic_control/carl_pendulum.py | 4 ++-- carl/envs/dmc/carl_dm_fish.py | 4 ++-- carl/envs/dmc/dmc_tasks/utils.py | 4 +++- carl/envs/dmc/loader.py | 3 ++- carl/envs/mario/carl_mario.py | 4 ++-- carl/utils/trial_logger.py | 6 ++++-- 20 files changed, 44 insertions(+), 39 deletions(-) diff --git a/carl/envs/box2d/carl_bipedal_walker.py b/carl/envs/box2d/carl_bipedal_walker.py index 87afda0d..1b8d4641 100644 --- a/carl/envs/box2d/carl_bipedal_walker.py +++ b/carl/envs/box2d/carl_bipedal_walker.py @@ -8,7 +8,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context DEFAULT_CONTEXT = { "FPS": 50, @@ -85,7 +85,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.05, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, diff --git a/carl/envs/box2d/carl_lunarlander.py b/carl/envs/box2d/carl_lunarlander.py index 1396be22..25a89ba0 100644 --- a/carl/envs/box2d/carl_lunarlander.py +++ b/carl/envs/box2d/carl_lunarlander.py @@ -6,7 +6,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context ObsType = TypeVar("ObsType") ActType = TypeVar("ActType") @@ -107,7 +107,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.05, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, max_episode_length: int = 1000, diff --git a/carl/envs/box2d/carl_vehicle_racing.py b/carl/envs/box2d/carl_vehicle_racing.py index 472c01fc..c78fa501 100644 --- a/carl/envs/box2d/carl_vehicle_racing.py +++ b/carl/envs/box2d/carl_vehicle_racing.py @@ -38,7 +38,7 @@ from carl.envs.box2d.parking_garage.trike import TukTukSmallTrailer # as Car from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import ObsType, Contexts +from carl.utils.types import ObsType, Contexts, Context PARKING_GARAGE_DICT = { # Racing car @@ -201,7 +201,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, diff --git a/carl/envs/brax/carl_ant.py b/carl/envs/brax/carl_ant.py index 32d83ea8..f949ee9f 100644 --- a/carl/envs/brax/carl_ant.py +++ b/carl/envs/brax/carl_ant.py @@ -14,7 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context DEFAULT_CONTEXT = { "joint_stiffness": 5000, @@ -48,7 +48,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, diff --git a/carl/envs/brax/carl_fetch.py b/carl/envs/brax/carl_fetch.py index c758f26c..a42aa5a8 100644 --- a/carl/envs/brax/carl_fetch.py +++ b/carl/envs/brax/carl_fetch.py @@ -14,7 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context DEFAULT_CONTEXT = { "joint_stiffness": 5000, @@ -52,7 +52,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, diff --git a/carl/envs/brax/carl_grasp.py b/carl/envs/brax/carl_grasp.py index bf3f6184..ae299c5b 100644 --- a/carl/envs/brax/carl_grasp.py +++ b/carl/envs/brax/carl_grasp.py @@ -14,7 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context DEFAULT_CONTEXT = { "joint_stiffness": 5000, @@ -52,7 +52,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, diff --git a/carl/envs/brax/carl_halfcheetah.py b/carl/envs/brax/carl_halfcheetah.py index b0960738..f99535c2 100644 --- a/carl/envs/brax/carl_halfcheetah.py +++ b/carl/envs/brax/carl_halfcheetah.py @@ -14,7 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context DEFAULT_CONTEXT = { "joint_stiffness": 15000.0, @@ -46,7 +46,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, diff --git a/carl/envs/brax/carl_humanoid.py b/carl/envs/brax/carl_humanoid.py index c42f5428..74d5e09f 100644 --- a/carl/envs/brax/carl_humanoid.py +++ b/carl/envs/brax/carl_humanoid.py @@ -16,7 +16,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context DEFAULT_CONTEXT = { "gravity": -9.8, @@ -46,7 +46,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, diff --git a/carl/envs/brax/carl_ur5e.py b/carl/envs/brax/carl_ur5e.py index 6dff86fb..fce0be5b 100644 --- a/carl/envs/brax/carl_ur5e.py +++ b/carl/envs/brax/carl_ur5e.py @@ -14,7 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context DEFAULT_CONTEXT = { "joint_stiffness": 40000, @@ -52,7 +52,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, diff --git a/carl/envs/carl_env.py b/carl/envs/carl_env.py index cd157b98..9be9a232 100644 --- a/carl/envs/carl_env.py +++ b/carl/envs/carl_env.py @@ -58,7 +58,7 @@ class CARLEnv(Wrapper): Wether to scale context features. Available modes are 'no', 'by_mean' and 'by_default'. 'by_mean' scales the context features by their mean over all passed instances and 'by_default' scales the context features by their default values ('default_context'). - default_context: Dict + default_context: Context The default context of the environment. Used for scaling the context features if applicable. Used for filling incomplete contexts. state_context_features: Optional[List[str]] = None @@ -233,7 +233,7 @@ def context(self) -> Dict: return self._context @context.setter - def context(self, context: Dict) -> None: + def context(self, context: Context) -> None: self._context = self.fill_context_with_default(context=context) @property @@ -373,7 +373,7 @@ def __getattr__(self, name: str) -> Any: ) return getattr(self.env, name) - def fill_context_with_default(self, context: Dict) -> Dict: + def fill_context_with_default(self, context: Context) -> Dict: """ Fill the context with the default values if entries are missing diff --git a/carl/envs/classic_control/carl_acrobot.py b/carl/envs/classic_control/carl_acrobot.py index 049efce7..35a05847 100644 --- a/carl/envs/classic_control/carl_acrobot.py +++ b/carl/envs/classic_control/carl_acrobot.py @@ -7,7 +7,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context DEFAULT_CONTEXT = { "link_length_1": 1, # should be seen as 100% default and scaled @@ -107,7 +107,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, max_episode_length: int = 500, # from https://github.com/openai/gym/blob/master/gym/envs/__init__.py state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, diff --git a/carl/envs/classic_control/carl_cartpole.py b/carl/envs/classic_control/carl_cartpole.py index 13c06bb9..b26dc64b 100644 --- a/carl/envs/classic_control/carl_cartpole.py +++ b/carl/envs/classic_control/carl_cartpole.py @@ -7,7 +7,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context DEFAULT_CONTEXT = { "gravity": 9.8, @@ -70,7 +70,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, max_episode_length: int = 500, # from https://github.com/openai/gym/blob/master/gym/envs/__init__.py state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, diff --git a/carl/envs/classic_control/carl_mountaincar.py b/carl/envs/classic_control/carl_mountaincar.py index 9eb76143..8332ea05 100644 --- a/carl/envs/classic_control/carl_mountaincar.py +++ b/carl/envs/classic_control/carl_mountaincar.py @@ -7,7 +7,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context DEFAULT_CONTEXT = { "min_position": -1.2, # unit? @@ -93,7 +93,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, max_episode_length: int = 200, # from https://github.com/openai/gym/blob/master/gym/envs/__init__.py state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, diff --git a/carl/envs/classic_control/carl_mountaincarcontinuous.py b/carl/envs/classic_control/carl_mountaincarcontinuous.py index cafcae63..35109d67 100644 --- a/carl/envs/classic_control/carl_mountaincarcontinuous.py +++ b/carl/envs/classic_control/carl_mountaincarcontinuous.py @@ -7,7 +7,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context DEFAULT_CONTEXT = { "min_position": -1.2, @@ -73,7 +73,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, max_episode_length: int = 999, # from https://github.com/openai/gym/blob/master/gym/envs/__init__.py state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, diff --git a/carl/envs/classic_control/carl_pendulum.py b/carl/envs/classic_control/carl_pendulum.py index 309b49b4..d6ce46b0 100644 --- a/carl/envs/classic_control/carl_pendulum.py +++ b/carl/envs/classic_control/carl_pendulum.py @@ -7,7 +7,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context DEFAULT_CONTEXT = { "max_speed": 8.0, @@ -64,7 +64,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, max_episode_length: int = 200, # from https://github.com/openai/gym/blob/master/gym/envs/__init__.py state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, diff --git a/carl/envs/dmc/carl_dm_fish.py b/carl/envs/dmc/carl_dm_fish.py index eaaecf90..827395c3 100644 --- a/carl/envs/dmc/carl_dm_fish.py +++ b/carl/envs/dmc/carl_dm_fish.py @@ -6,7 +6,7 @@ from carl.envs.dmc.carl_dmcontrol import CARLDmcEnv from carl.envs.dmc.dmc_tasks.fish import STEP_LIMIT # type: ignore from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context DEFAULT_CONTEXT = { "gravity": -9.81, # Gravity is disabled via flag @@ -67,7 +67,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.01, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, max_episode_length: int = STEP_LIMIT, state_context_features: Optional[List[str]] = None, dict_observation_space: bool = False, diff --git a/carl/envs/dmc/dmc_tasks/utils.py b/carl/envs/dmc/dmc_tasks/utils.py index 512e9b83..8b9c8922 100644 --- a/carl/envs/dmc/dmc_tasks/utils.py +++ b/carl/envs/dmc/dmc_tasks/utils.py @@ -2,8 +2,10 @@ from lxml import etree # type: ignore +from carl.utils.types import Context -def adapt_context(xml_string: bytes, context: Dict, context_mask: List = []) -> bytes: + +def adapt_context(xml_string: bytes, context: Context, context_mask: List = []) -> bytes: """Adapts and returns the xml_string of the model with the given context.""" mjcf = etree.fromstring(xml_string) default = mjcf.find("./default/") diff --git a/carl/envs/dmc/loader.py b/carl/envs/dmc/loader.py index 841ba4a3..4e70bcd4 100644 --- a/carl/envs/dmc/loader.py +++ b/carl/envs/dmc/loader.py @@ -6,6 +6,7 @@ from dm_control import suite # type: ignore from carl.envs.dmc.dmc_tasks import fish, quadruped, walker # type: ignore [import] # noqa: F401 +from carl.utils.types import Context _DOMAINS = { name: module @@ -17,7 +18,7 @@ def load_dmc_env( domain_name: str, task_name: str, - context: Dict = {}, + context: Context = {}, context_mask: Optional[List[str]] = [], task_kwargs: Optional[Any] = None, environment_kwargs: Dict[str, bool] = None, diff --git a/carl/envs/mario/carl_mario.py b/carl/envs/mario/carl_mario.py index c7e0f914..64b6c875 100644 --- a/carl/envs/mario/carl_mario.py +++ b/carl/envs/mario/carl_mario.py @@ -12,7 +12,7 @@ from carl.envs.mario.mario_env import MarioEnv from carl.envs.mario.toad_gan import generate_level from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts +from carl.utils.types import Contexts, Context class CARLMarioEnv(CARLEnv): @@ -25,7 +25,7 @@ def __init__( gaussian_noise_std_percentage: float = 0.05, logger: Optional[TrialLogger] = None, scale_context_features: str = "no", - default_context: Optional[Dict] = DEFAULT_CONTEXT, + default_context: Optional[Context] = DEFAULT_CONTEXT, state_context_features: Optional[List[str]] = None, context_mask: Optional[List[str]] = None, dict_observation_space: bool = False, diff --git a/carl/utils/trial_logger.py b/carl/utils/trial_logger.py index fa4dc2ba..21d1ae09 100644 --- a/carl/utils/trial_logger.py +++ b/carl/utils/trial_logger.py @@ -6,6 +6,8 @@ import configargparse import pandas as pd +from carl.utils.types import Context + class TrialLogger(object): """ @@ -95,7 +97,7 @@ def write_trial_setup(self) -> None: parsed_namespace=self.trial_setup_args, output_file_paths=output_file_paths ) - def write_context(self, episode: int, step: int, context: Dict[Any, Any]) -> None: + def write_context(self, episode: int, step: int, context: Context) -> None: """ Context will be written to csv file (logdir / "context_history.csv"). @@ -109,7 +111,7 @@ def write_context(self, episode: int, step: int, context: Dict[Any, Any]) -> Non Episode. step: int Timestep. - context: Dict[Any, Any] + context: Context Keys: Context features names/ids, values: context feature values. Returns From 0bc456f3beb7a5bcac86adb1c2aae457c9f9e3da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20D=C3=B6hler?= Date: Wed, 6 Jul 2022 18:01:12 +0200 Subject: [PATCH 45/67] black, isort and flake8 --- carl/context/augmentation.py | 2 +- carl/context/sampling.py | 6 ++- carl/context/selection.py | 4 +- carl/context/utils.py | 2 +- carl/envs/box2d/carl_bipedal_walker.py | 4 +- carl/envs/box2d/carl_lunarlander.py | 4 +- carl/envs/box2d/carl_vehicle_racing.py | 34 +++++++-------- carl/envs/box2d/parking_garage/bus.py | 6 ++- carl/envs/box2d/parking_garage/race_car.py | 6 ++- carl/envs/box2d/parking_garage/trike.py | 6 ++- carl/envs/brax/carl_ant.py | 2 +- carl/envs/brax/carl_fetch.py | 2 +- carl/envs/brax/carl_grasp.py | 2 +- carl/envs/brax/carl_halfcheetah.py | 2 +- carl/envs/brax/carl_humanoid.py | 2 +- carl/envs/brax/carl_ur5e.py | 2 +- carl/envs/carl_env.py | 20 +++++---- carl/envs/classic_control/carl_acrobot.py | 5 +-- carl/envs/classic_control/carl_cartpole.py | 5 +-- carl/envs/classic_control/carl_mountaincar.py | 17 ++++---- .../carl_mountaincarcontinuous.py | 5 +-- carl/envs/classic_control/carl_pendulum.py | 5 +-- carl/envs/dmc/carl_dm_fish.py | 4 +- carl/envs/dmc/carl_dm_quadruped.py | 2 +- carl/envs/dmc/carl_dm_walker.py | 2 +- carl/envs/dmc/dmc_tasks/utils.py | 6 ++- carl/envs/dmc/loader.py | 6 ++- carl/envs/mario/carl_mario.py | 2 +- carl/envs/mario/generate_sample.py | 20 +++++---- carl/envs/mario/level_image_gen.py | 7 +++- carl/envs/mario/mario_env.py | 42 +++++++++---------- carl/envs/mario/mario_game.py | 8 +++- carl/envs/mario/models/conv_block.py | 15 +++++-- carl/envs/mario/models/discriminator.py | 3 +- carl/envs/mario/models/generator.py | 3 +- carl/envs/mario/toad_gan.py | 16 +++---- carl/utils/doc_building/plot_radar.py | 4 +- carl/utils/doc_building/render_brax_env.py | 3 +- carl/utils/trial_logger.py | 2 +- carl/utils/types.py | 3 +- 40 files changed, 164 insertions(+), 127 deletions(-) diff --git a/carl/context/augmentation.py b/carl/context/augmentation.py index 5b987ac5..a378260d 100644 --- a/carl/context/augmentation.py +++ b/carl/context/augmentation.py @@ -1,4 +1,4 @@ -from typing import List, Union, Any +from typing import Any, List, Union import numpy as np diff --git a/carl/context/sampling.py b/carl/context/sampling.py index 18b219f8..31fec750 100644 --- a/carl/context/sampling.py +++ b/carl/context/sampling.py @@ -5,7 +5,7 @@ from scipy.stats import norm from carl import envs -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts def get_default_context_and_bounds( @@ -157,7 +157,9 @@ def sample_contexts( context_feature_type = sample_dists[k][1] lower_bound, upper_bound = env_bounds[k][0], env_bounds[k][1] if context_feature_type == list: - length = np.random.randint(500000) # TODO should we allow lists to be this long? or should we parametrize this? + length = np.random.randint( + 500000 + ) # TODO should we allow lists to be this long? or should we parametrize this? arg_class = sample_dists[k][1][1] context_list = random_variable.rvs(size=length) context_list = np.clip(context_list, lower_bound, upper_bound) diff --git a/carl/context/selection.py b/carl/context/selection.py index 0ab831e1..83ceb3d9 100644 --- a/carl/context/selection.py +++ b/carl/context/selection.py @@ -1,9 +1,9 @@ from abc import abstractmethod -from typing import Any, Callable, Dict, List, Optional, Tuple +from typing import Any, Callable, List, Optional, Tuple import numpy as np -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts class AbstractSelector(object): diff --git a/carl/context/utils.py b/carl/context/utils.py index ac0fdabb..be82889c 100644 --- a/carl/context/utils.py +++ b/carl/context/utils.py @@ -63,4 +63,4 @@ def get_context_bounds( "min_velocity_start": (-np.inf, np.inf), "max_velocity_start": (-np.inf, np.inf), } - lower, upper = get_context_bounds(list(DEFAULT_CONTEXT.keys()), CONTEXT_BOUNDS) + lower, upper = get_context_bounds(list(DEFAULT_CONTEXT.keys()), CONTEXT_BOUNDS) diff --git a/carl/envs/box2d/carl_bipedal_walker.py b/carl/envs/box2d/carl_bipedal_walker.py index 1b8d4641..33e66453 100644 --- a/carl/envs/box2d/carl_bipedal_walker.py +++ b/carl/envs/box2d/carl_bipedal_walker.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional, Union +from typing import Dict, List, Optional, Union import numpy as np from Box2D.b2 import edgeShape, fixtureDef, polygonShape @@ -8,7 +8,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "FPS": 50, diff --git a/carl/envs/box2d/carl_lunarlander.py b/carl/envs/box2d/carl_lunarlander.py index 25a89ba0..8b8964b8 100644 --- a/carl/envs/box2d/carl_lunarlander.py +++ b/carl/envs/box2d/carl_lunarlander.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional, Tuple, TypeVar, Union +from typing import Dict, List, Optional, Tuple, TypeVar, Union from gym import Wrapper from gym.envs.box2d import lunar_lander @@ -6,7 +6,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts ObsType = TypeVar("ObsType") ActType = TypeVar("ActType") diff --git a/carl/envs/box2d/carl_vehicle_racing.py b/carl/envs/box2d/carl_vehicle_racing.py index c78fa501..f19927ee 100644 --- a/carl/envs/box2d/carl_vehicle_racing.py +++ b/carl/envs/box2d/carl_vehicle_racing.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional, Tuple, Type, Union +from typing import Dict, List, Optional, Tuple, Type, Union import numpy as np import pyglet @@ -38,7 +38,7 @@ from carl.envs.box2d.parking_garage.trike import TukTukSmallTrailer # as Car from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import ObsType, Contexts, Context +from carl.utils.types import Context, Contexts, ObsType PARKING_GARAGE_DICT = { # Racing car @@ -93,18 +93,18 @@ def __init__(self, vehicle_class: Type[Car] = Car, verbose: bool = True): self.vehicle_class = vehicle_class def reset( - self, - *, - seed: Optional[int] = None, - return_info: bool = False, - options: Optional[dict] = None, + self, + *, + seed: Optional[int] = None, + return_info: bool = False, + options: Optional[dict] = None, ) -> Union[ObsType, tuple[ObsType, dict]]: self._destroy() self.reward = 0.0 self.prev_reward = 0.0 self.tile_visited_count = 0 self.t = 0.0 - self.road_poly = [] + self.road_poly = [] while True: success = self._create_track() @@ -120,10 +120,10 @@ def reset( for i in range( 49 ): # this sets up the environment and resolves any initial violations of geometry - self.step(None) # type: ignore [arg-type] + self.step(None) # type: ignore [arg-type] if not return_info: - return self.step(None)[0] # type: ignore [arg-type] + return self.step(None)[0] # type: ignore [arg-type] else: return self.step(None)[0], {} # type: ignore [arg-type] @@ -173,18 +173,18 @@ def horiz_ind(place: int, val: int, color: Tuple) -> None: ) true_speed = np.sqrt( - np.square(self.car.hull.linearVelocity[0]) # type: ignore [attr-defined] - + np.square(self.car.hull.linearVelocity[1]) # type: ignore [attr-defined] + np.square(self.car.hull.linearVelocity[0]) # type: ignore [attr-defined] + + np.square(self.car.hull.linearVelocity[1]) # type: ignore [attr-defined] ) vertical_ind(5, 0.02 * true_speed, (1, 1, 1)) # Custom render to handle different amounts of wheels - vertical_ind(7, 0.01 * self.car.wheels[0].omega, (0.0, 0, 1)) # type: ignore [attr-defined] - for i in range(len(self.car.wheels)): # type: ignore [attr-defined] - vertical_ind(7 + i, 0.01 * self.car.wheels[i].omega, (0.0 + i * 0.1, 0, 1)) # type: ignore [attr-defined] - horiz_ind(20, -10.0 * self.car.wheels[0].joint.angle, (0, 1, 0)) # type: ignore [attr-defined] - horiz_ind(30, -0.8 * self.car.hull.angularVelocity, (1, 0, 0)) # type: ignore [attr-defined] + vertical_ind(7, 0.01 * self.car.wheels[0].omega, (0.0, 0, 1)) # type: ignore [attr-defined] + for i in range(len(self.car.wheels)): # type: ignore [attr-defined] + vertical_ind(7 + i, 0.01 * self.car.wheels[i].omega, (0.0 + i * 0.1, 0, 1)) # type: ignore [attr-defined] + horiz_ind(20, -10.0 * self.car.wheels[0].joint.angle, (0, 1, 0)) # type: ignore [attr-defined] + horiz_ind(30, -0.8 * self.car.hull.angularVelocity, (1, 0, 0)) # type: ignore [attr-defined] vl = pyglet.graphics.vertex_list( len(polygons) // 3, ("v3f", polygons), ("c4f", colors) # gl.GL_QUADS, ) diff --git a/carl/envs/box2d/parking_garage/bus.py b/carl/envs/box2d/parking_garage/bus.py index 436167a7..bb85c043 100644 --- a/carl/envs/box2d/parking_garage/bus.py +++ b/carl/envs/box2d/parking_garage/bus.py @@ -1,5 +1,5 @@ -import numpy as np import Box2D +import numpy as np from Box2D.b2 import circleShape # noqa: F401 from Box2D.b2 import contactListener # noqa: F401 from Box2D.b2 import distanceJointDef # noqa: F401 @@ -78,7 +78,9 @@ def _init_extra_params(self) -> None: 0 # Determines which trailer to attach 0 -> none, 1 -> small, 2 -> large ) - def __init__(self, world: Box2D.b2World, init_angle: float, init_x: float, init_y: float) -> None: + def __init__( + self, world: Box2D.b2World, init_angle: float, init_x: float, init_y: float + ) -> None: self._init_extra_params() self.world = world diff --git a/carl/envs/box2d/parking_garage/race_car.py b/carl/envs/box2d/parking_garage/race_car.py index 9ac60444..fc16d57c 100644 --- a/carl/envs/box2d/parking_garage/race_car.py +++ b/carl/envs/box2d/parking_garage/race_car.py @@ -1,5 +1,5 @@ -import numpy as np import Box2D +import numpy as np from Box2D.b2 import circleShape # noqa: F401 from Box2D.b2 import contactListener # noqa: F401 from Box2D.b2 import distanceJointDef # noqa: F401 @@ -85,7 +85,9 @@ def _init_extra_params(self) -> None: 0 # Determines which trailer to attach 0 -> none, 1 -> small, 2 -> large ) - def __init__(self, world: Box2D.b2World, init_angle: float, init_x: float, init_y: float) -> None: + def __init__( + self, world: Box2D.b2World, init_angle: float, init_x: float, init_y: float + ) -> None: self._init_extra_params() self.world = world diff --git a/carl/envs/box2d/parking_garage/trike.py b/carl/envs/box2d/parking_garage/trike.py index 48416f6d..caadc4b7 100644 --- a/carl/envs/box2d/parking_garage/trike.py +++ b/carl/envs/box2d/parking_garage/trike.py @@ -1,5 +1,5 @@ -import numpy as np import Box2D +import numpy as np from Box2D.b2 import circleShape # noqa: F401 from Box2D.b2 import contactListener # noqa: F401 from Box2D.b2 import distanceJointDef # noqa: F401 @@ -62,7 +62,9 @@ def _init_extra_params(self) -> None: self.fwd = False # Flag to determine which wheels are driven (Not supported) self.trailer_type = 0 # Determines which trailer to attach 0 -> none, 1 -> small, 2 -> large (not supported) - def __init__(self, world: Box2D.b2World, init_angle: float, init_x: float, init_y: float) -> None: + def __init__( + self, world: Box2D.b2World, init_angle: float, init_x: float, init_y: float + ) -> None: self._init_extra_params() self.world = world diff --git a/carl/envs/brax/carl_ant.py b/carl/envs/brax/carl_ant.py index f949ee9f..c53fd64f 100644 --- a/carl/envs/brax/carl_ant.py +++ b/carl/envs/brax/carl_ant.py @@ -14,7 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "joint_stiffness": 5000, diff --git a/carl/envs/brax/carl_fetch.py b/carl/envs/brax/carl_fetch.py index a42aa5a8..272e6481 100644 --- a/carl/envs/brax/carl_fetch.py +++ b/carl/envs/brax/carl_fetch.py @@ -14,7 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "joint_stiffness": 5000, diff --git a/carl/envs/brax/carl_grasp.py b/carl/envs/brax/carl_grasp.py index ae299c5b..f7795a42 100644 --- a/carl/envs/brax/carl_grasp.py +++ b/carl/envs/brax/carl_grasp.py @@ -14,7 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "joint_stiffness": 5000, diff --git a/carl/envs/brax/carl_halfcheetah.py b/carl/envs/brax/carl_halfcheetah.py index f99535c2..fea08688 100644 --- a/carl/envs/brax/carl_halfcheetah.py +++ b/carl/envs/brax/carl_halfcheetah.py @@ -14,7 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "joint_stiffness": 15000.0, diff --git a/carl/envs/brax/carl_humanoid.py b/carl/envs/brax/carl_humanoid.py index 74d5e09f..873473ca 100644 --- a/carl/envs/brax/carl_humanoid.py +++ b/carl/envs/brax/carl_humanoid.py @@ -16,7 +16,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "gravity": -9.8, diff --git a/carl/envs/brax/carl_ur5e.py b/carl/envs/brax/carl_ur5e.py index fce0be5b..02ebd518 100644 --- a/carl/envs/brax/carl_ur5e.py +++ b/carl/envs/brax/carl_ur5e.py @@ -14,7 +14,7 @@ from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "joint_stiffness": 40000, diff --git a/carl/envs/carl_env.py b/carl/envs/carl_env.py index 9be9a232..37483607 100644 --- a/carl/envs/carl_env.py +++ b/carl/envs/carl_env.py @@ -1,10 +1,10 @@ -from typing import Any, Dict, List, Optional, Tuple, Union, Type, Mapping -from types import ModuleType +from typing import Any, Dict, List, Mapping, Optional, Tuple, Type, Union import importlib import inspect import json import os +from types import ModuleType import gym import numpy as np @@ -13,8 +13,8 @@ from carl.context.augmentation import add_gaussian_noise from carl.context.selection import AbstractSelector, RoundRobinSelector from carl.context.utils import get_context_bounds -from carl.utils.types import Vector, ObsType, Contexts, Context from carl.utils.trial_logger import TrialLogger +from carl.utils.types import Context, Contexts, ObsType, Vector brax_spec = importlib.util.find_spec("brax") if brax_spec is not None: @@ -353,7 +353,9 @@ def step(self, action: Any) -> Tuple[Any, Any, bool, Dict]: ) # Add context features to state - state = self.build_context_adaptive_state(state=state, context_feature_values=context_feature_values) + state = self.build_context_adaptive_state( + state=state, context_feature_values=context_feature_values + ) self.total_timestep_counter += 1 self.step_counter += 1 @@ -503,7 +505,7 @@ def build_observation_space( context_upper_bounds = np.inf * np.ones(context_dim) else: context_lower_bounds, context_upper_bounds = get_context_bounds( - context_keys, context_bounds # type: ignore [arg-type] + context_keys, context_bounds # type: ignore [arg-type] ) if self.state_context_features is not None: ids = np.array( @@ -527,8 +529,12 @@ def build_observation_space( } ) else: - low: Vector = np.concatenate((np.array(env_lower_bounds), np.array(context_lower_bounds))) - high: Vector = np.concatenate((np.array(env_upper_bounds), np.array(context_upper_bounds))) + low: Vector = np.concatenate( + (np.array(env_lower_bounds), np.array(context_lower_bounds)) + ) + high: Vector = np.concatenate( + (np.array(env_upper_bounds), np.array(context_upper_bounds)) + ) self.env.observation_space = spaces.Box( low=np.array(low), high=np.array(high), dtype=np.float32 ) diff --git a/carl/envs/classic_control/carl_acrobot.py b/carl/envs/classic_control/carl_acrobot.py index 35a05847..a3c9aea0 100644 --- a/carl/envs/classic_control/carl_acrobot.py +++ b/carl/envs/classic_control/carl_acrobot.py @@ -1,13 +1,12 @@ -from typing import Any, Dict, List, Optional, Union +from typing import Dict, List, Optional, Union -import gym import numpy as np from gym.envs.classic_control import AcrobotEnv from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "link_length_1": 1, # should be seen as 100% default and scaled diff --git a/carl/envs/classic_control/carl_cartpole.py b/carl/envs/classic_control/carl_cartpole.py index b26dc64b..ba1f1507 100644 --- a/carl/envs/classic_control/carl_cartpole.py +++ b/carl/envs/classic_control/carl_cartpole.py @@ -1,13 +1,12 @@ -from typing import Any, Dict, List, Optional, Union +from typing import Dict, List, Optional, Union -import gym import numpy as np from gym.envs.classic_control import CartPoleEnv from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "gravity": 9.8, diff --git a/carl/envs/classic_control/carl_mountaincar.py b/carl/envs/classic_control/carl_mountaincar.py index 8332ea05..0407ea67 100644 --- a/carl/envs/classic_control/carl_mountaincar.py +++ b/carl/envs/classic_control/carl_mountaincar.py @@ -1,13 +1,12 @@ -from typing import Any, Dict, List, Optional, Tuple, Union +from typing import Dict, List, Optional, Tuple, Union -import gym import gym.envs.classic_control as gccenvs import numpy as np from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "min_position": -1.2, # unit? @@ -45,7 +44,7 @@ def __init__(self, goal_velocity: float = 0.0): self.max_position_start = -0.4 self.min_velocity_start = 0.0 self.max_velocity_start = 0.0 - self.state: np.ndarray # type: ignore [assignment] + self.state: np.ndarray # type: ignore [assignment] def sample_initial_state(self) -> np.ndarray: return np.array( @@ -60,11 +59,11 @@ def sample_initial_state(self) -> np.ndarray: ) def reset( - self, - *, - seed: Optional[int] = None, - return_info: bool = False, - options: Optional[dict] = None, + self, + *, + seed: Optional[int] = None, + return_info: bool = False, + options: Optional[dict] = None, ) -> Union[np.ndarray, tuple[np.ndarray, dict]]: super().reset(seed=seed) self.state = self.sample_initial_state() diff --git a/carl/envs/classic_control/carl_mountaincarcontinuous.py b/carl/envs/classic_control/carl_mountaincarcontinuous.py index 35109d67..9d833236 100644 --- a/carl/envs/classic_control/carl_mountaincarcontinuous.py +++ b/carl/envs/classic_control/carl_mountaincarcontinuous.py @@ -1,13 +1,12 @@ -from typing import Dict, List, Optional, Union, Any +from typing import Dict, List, Optional, Union -import gym import gym.envs.classic_control as gccenvs import numpy as np from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "min_position": -1.2, diff --git a/carl/envs/classic_control/carl_pendulum.py b/carl/envs/classic_control/carl_pendulum.py index d6ce46b0..6a293020 100644 --- a/carl/envs/classic_control/carl_pendulum.py +++ b/carl/envs/classic_control/carl_pendulum.py @@ -1,13 +1,12 @@ -from typing import Any, Dict, List, Optional, Union +from typing import Dict, List, Optional, Union -import gym import gym.envs.classic_control as gccenvs import numpy as np from carl.context.selection import AbstractSelector from carl.envs.carl_env import CARLEnv from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "max_speed": 8.0, diff --git a/carl/envs/dmc/carl_dm_fish.py b/carl/envs/dmc/carl_dm_fish.py index 827395c3..5dd1e04a 100644 --- a/carl/envs/dmc/carl_dm_fish.py +++ b/carl/envs/dmc/carl_dm_fish.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional, Union +from typing import Dict, List, Optional, Union import numpy as np @@ -6,7 +6,7 @@ from carl.envs.dmc.carl_dmcontrol import CARLDmcEnv from carl.envs.dmc.dmc_tasks.fish import STEP_LIMIT # type: ignore from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts DEFAULT_CONTEXT = { "gravity": -9.81, # Gravity is disabled via flag diff --git a/carl/envs/dmc/carl_dm_quadruped.py b/carl/envs/dmc/carl_dm_quadruped.py index c1d7c177..f027adbd 100644 --- a/carl/envs/dmc/carl_dm_quadruped.py +++ b/carl/envs/dmc/carl_dm_quadruped.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional, Union +from typing import Dict, List, Optional, Union import numpy as np diff --git a/carl/envs/dmc/carl_dm_walker.py b/carl/envs/dmc/carl_dm_walker.py index 7176c3dc..743ccb3a 100644 --- a/carl/envs/dmc/carl_dm_walker.py +++ b/carl/envs/dmc/carl_dm_walker.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Optional, Union +from typing import Dict, List, Optional, Union import numpy as np diff --git a/carl/envs/dmc/dmc_tasks/utils.py b/carl/envs/dmc/dmc_tasks/utils.py index 8b9c8922..7ce8b721 100644 --- a/carl/envs/dmc/dmc_tasks/utils.py +++ b/carl/envs/dmc/dmc_tasks/utils.py @@ -1,11 +1,13 @@ -from typing import Dict, List +from typing import List from lxml import etree # type: ignore from carl.utils.types import Context -def adapt_context(xml_string: bytes, context: Context, context_mask: List = []) -> bytes: +def adapt_context( + xml_string: bytes, context: Context, context_mask: List = [] +) -> bytes: """Adapts and returns the xml_string of the model with the given context.""" mjcf = etree.fromstring(xml_string) default = mjcf.find("./default/") diff --git a/carl/envs/dmc/loader.py b/carl/envs/dmc/loader.py index 4e70bcd4..36dbf24c 100644 --- a/carl/envs/dmc/loader.py +++ b/carl/envs/dmc/loader.py @@ -5,7 +5,11 @@ import dm_env # type: ignore from dm_control import suite # type: ignore -from carl.envs.dmc.dmc_tasks import fish, quadruped, walker # type: ignore [import] # noqa: F401 +from carl.envs.dmc.dmc_tasks import ( # type: ignore [import] # noqa: F401 + fish, + quadruped, + walker, +) from carl.utils.types import Context _DOMAINS = { diff --git a/carl/envs/mario/carl_mario.py b/carl/envs/mario/carl_mario.py index 64b6c875..1e8e9edf 100644 --- a/carl/envs/mario/carl_mario.py +++ b/carl/envs/mario/carl_mario.py @@ -12,7 +12,7 @@ from carl.envs.mario.mario_env import MarioEnv from carl.envs.mario.toad_gan import generate_level from carl.utils.trial_logger import TrialLogger -from carl.utils.types import Contexts, Context +from carl.utils.types import Context, Contexts class CARLMarioEnv(CARLEnv): diff --git a/carl/envs/mario/generate_sample.py b/carl/envs/mario/generate_sample.py index db3cfb5e..6fb7707e 100644 --- a/carl/envs/mario/generate_sample.py +++ b/carl/envs/mario/generate_sample.py @@ -1,14 +1,16 @@ # Code from https://github.com/Mawiszus/TOAD-GAN +from typing import Any, List, Optional, Tuple, Union + import torch import torch.nn as nn -from torch.nn.functional import interpolate from torch import Tensor -from typing import Any, Union, Tuple, List, Optional +from torch.nn.functional import interpolate -from carl.envs.mario.toad_gan import TOADGAN # Generates a noise tensor. Uses torch.randn. -def generate_spatial_noise(size: Union[Any, List[int], Tuple[int]], device: Union[str, torch.device] ="cpu") -> Tensor: +def generate_spatial_noise( + size: Union[Any, List[int], Tuple[int]], device: Union[str, torch.device] = "cpu" +) -> Tensor: return torch.randn(size, device=device, dtype=torch.float32) @@ -21,11 +23,11 @@ def generate_sample( noise_amplitudes: Tensor, num_layer: int, token_list: Tensor, - scale_v: float =1.0, - scale_h: float =1.0, - current_scale: int =0, - gen_start_scale: int =0, - initial_noise: Optional[Tensor]=None, + scale_v: float = 1.0, + scale_h: float = 1.0, + current_scale: int = 0, + gen_start_scale: int = 0, + initial_noise: Optional[Tensor] = None, ) -> List[str]: in_s = None diff --git a/carl/envs/mario/level_image_gen.py b/carl/envs/mario/level_image_gen.py index 1a2c00c8..17378462 100644 --- a/carl/envs/mario/level_image_gen.py +++ b/carl/envs/mario/level_image_gen.py @@ -1,9 +1,10 @@ # Code from https://github.com/Mawiszus/TOAD-GAN +from typing import Any, List, Tuple + import os from PIL import Image, ImageEnhance, ImageOps -from typing import List, Tuple, Any class LevelImageGen: """Generates PIL Image files from Super Mario Bros. ascii levels. @@ -115,7 +116,9 @@ def __init__(self, sprite_path: str): self.sprite_dict = sprite_dict - def prepare_sprite_and_box(self, ascii_level: List[str], sprite_key: str, curr_x: int, curr_y: int) -> Tuple[Any, Tuple[int, int, int, int]]: + def prepare_sprite_and_box( + self, ascii_level: List[str], sprite_key: str, curr_x: int, curr_y: int + ) -> Tuple[Any, Tuple[int, int, int, int]]: """Helper to make correct sprites and sprite sizes to draw into the image. Some sprites are bigger than one tile and the renderer needs to adjust for them.""" diff --git a/carl/envs/mario/mario_env.py b/carl/envs/mario/mario_env.py index 5541de57..127a75db 100644 --- a/carl/envs/mario/mario_env.py +++ b/carl/envs/mario/mario_env.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Literal, cast, Optional, Union, ByteString, Deque, Tuple +from typing import Any, ByteString, Deque, Dict, List, Literal, Optional, Union, cast import os import random @@ -7,12 +7,12 @@ import cv2 import gym -from gym.core import ObsType import numpy as np from gym import spaces +from gym.core import ObsType from gym.utils import seeding -from py4j.java_gateway import GatewayParameters, JavaGateway from PIL import Image +from py4j.java_gateway import GatewayParameters, JavaGateway from carl.envs.mario.level_image_gen import LevelImageGen @@ -26,16 +26,16 @@ class MarioEnv(gym.Env): def __init__( self, levels: List[str], - timer: int =100, - visual: bool =False, - sticky_action_probability: float=0.1, - frame_skip: int=2, - frame_stack: int=4, - frame_dim: int=64, - hide_points_banner: bool =False, - sparse_rewards: bool=False, - grayscale: bool=False, - seed: int =0, + timer: int = 100, + visual: bool = False, + sticky_action_probability: float = 0.1, + frame_skip: int = 2, + frame_stack: int = 4, + frame_dim: int = 64, + hide_points_banner: bool = False, + sparse_rewards: bool = False, + grayscale: bool = False, + seed: int = 0, ): self.gateway: Any = None self.seed(seed) @@ -81,11 +81,11 @@ def __init__( self._init_game() def reset( - self, - *, - seed: Optional[int] = None, - return_info: bool = False, - options: Optional[dict] = None, + self, + *, + seed: Optional[int] = None, + return_info: bool = False, + options: Optional[dict] = None, ) -> Union[ObsType, tuple[ObsType, dict]]: self._reset_obs() if self.game is None: @@ -137,8 +137,8 @@ def step(self, action: Any) -> Any: return ( self._obs.copy(), reward if not self.sparse_rewards else int(completionPercentage == 1.0), - done, # bool - info, # Dict[str, Any] + done, # bool + info, # Dict[str, Any] ) def render(self, *args: Any, **kwargs: Any) -> ObsType: @@ -146,7 +146,7 @@ def render(self, *args: Any, **kwargs: Any) -> ObsType: def __getstate__(self) -> Dict: assert self.gateway - + self.gateway.close() self.gateway = None self.game = None diff --git a/carl/envs/mario/mario_game.py b/carl/envs/mario/mario_game.py index bd57fde1..09f62da5 100644 --- a/carl/envs/mario/mario_game.py +++ b/carl/envs/mario/mario_game.py @@ -11,11 +11,15 @@ def initGame(self) -> None: pass @abstractmethod - def stepGame(self, left: bool, right: bool, down: bool, speed: bool, jump: bool) -> None: + def stepGame( + self, left: bool, right: bool, down: bool, speed: bool, jump: bool + ) -> None: pass @abstractmethod - def resetGame(self, level: str, timer: int, mario_state: int, inertia: float) -> None: + def resetGame( + self, level: str, timer: int, mario_state: int, inertia: float + ) -> None: pass @abstractmethod diff --git a/carl/envs/mario/models/conv_block.py b/carl/envs/mario/models/conv_block.py index 3a501ec7..614f0fae 100644 --- a/carl/envs/mario/models/conv_block.py +++ b/carl/envs/mario/models/conv_block.py @@ -1,11 +1,20 @@ # Code from https://github.com/Mawiszus/TOAD-GAN +from typing import Tuple, Union + import torch.nn as nn -from typing import Tuple, Union + class ConvBlock(nn.Sequential): """Conv block containing Conv2d, BatchNorm2d and LeakyReLU Layers.""" - def __init__(self, in_channel: int, out_channel: int, ker_size: Union[int, Tuple[int, int]], padd: Union[str, Union[int, Tuple[int, int]]], stride: Union[int, Tuple[int, int]]): + def __init__( + self, + in_channel: int, + out_channel: int, + ker_size: Union[int, Tuple[int, int]], + padd: Union[str, Union[int, Tuple[int, int]]], + stride: Union[int, Tuple[int, int]], + ): super().__init__() self.add_module( "conv", @@ -17,6 +26,6 @@ def __init__(self, in_channel: int, out_channel: int, ker_size: Union[int, Tuple padding=padd, ), ) - + self.add_module("norm", nn.BatchNorm2d(out_channel)) self.add_module("LeakyRelu", nn.LeakyReLU(0.2, inplace=True)) diff --git a/carl/envs/mario/models/discriminator.py b/carl/envs/mario/models/discriminator.py index 7ebff146..4527e94f 100644 --- a/carl/envs/mario/models/discriminator.py +++ b/carl/envs/mario/models/discriminator.py @@ -1,8 +1,9 @@ # Code from https://github.com/Mawiszus/TOAD-GAN +from argparse import Namespace + import torch import torch.nn as nn from torch import Tensor -from argparse import Namespace from .conv_block import ConvBlock diff --git a/carl/envs/mario/models/generator.py b/carl/envs/mario/models/generator.py index 1e5e46b6..95c75eab 100644 --- a/carl/envs/mario/models/generator.py +++ b/carl/envs/mario/models/generator.py @@ -1,9 +1,10 @@ # Code from https://github.com/Mawiszus/TOAD-GAN +from argparse import Namespace + import torch import torch.nn as nn import torch.nn.functional as F from torch import Tensor -from argparse import Namespace from .conv_block import ConvBlock diff --git a/carl/envs/mario/toad_gan.py b/carl/envs/mario/toad_gan.py index 030a54f8..ac290a83 100644 --- a/carl/envs/mario/toad_gan.py +++ b/carl/envs/mario/toad_gan.py @@ -1,4 +1,4 @@ -from typing import Optional, List +from typing import Optional import functools import os @@ -15,13 +15,13 @@ @dataclass class TOADGAN: def __init__( - self, - Gs: Tensor, - Zs: Tensor, - reals: Tensor, - NoiseAmp: Tensor, - token_list: Tensor, - num_layers: int + self, + Gs: Tensor, + Zs: Tensor, + reals: Tensor, + NoiseAmp: Tensor, + token_list: Tensor, + num_layers: int, ): self.generators = Gs self.noise_maps = Zs diff --git a/carl/utils/doc_building/plot_radar.py b/carl/utils/doc_building/plot_radar.py index 0b72d11a..e16b72a3 100644 --- a/carl/utils/doc_building/plot_radar.py +++ b/carl/utils/doc_building/plot_radar.py @@ -268,7 +268,7 @@ data = pd.concat(data) # normalize values - cols = [c for c in data.columns if c not in ["env_type", "env_name"]] # type: ignore [attr-defined] + cols = [c for c in data.columns if c not in ["env_type", "env_name"]] # type: ignore [attr-defined] max_values_per_col = [] for col in cols: if col == "state_space_size": @@ -305,7 +305,7 @@ # Plot the four cases from the example data on separate axes for ax, env_type in zip(axs.flat, env_types): - D = data[data["env_type"] == env_type] # type: ignore [call-overload] + D = data[data["env_type"] == env_type] # type: ignore [call-overload] labels = D["env_name"].to_list() color_palette_name = "colorblind" n = len(D) diff --git a/carl/utils/doc_building/render_brax_env.py b/carl/utils/doc_building/render_brax_env.py index 7cd953e2..d0adc496 100644 --- a/carl/utils/doc_building/render_brax_env.py +++ b/carl/utils/doc_building/render_brax_env.py @@ -1,7 +1,8 @@ if __name__ == "__main__": from typing import List - import jax + import brax + import jax from brax import envs from brax.io import html from IPython.display import HTML diff --git a/carl/utils/trial_logger.py b/carl/utils/trial_logger.py index 21d1ae09..877e188d 100644 --- a/carl/utils/trial_logger.py +++ b/carl/utils/trial_logger.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, Union +from typing import Union import argparse from pathlib import Path diff --git a/carl/utils/types.py b/carl/utils/types.py index e9181a72..e22bf3f5 100644 --- a/carl/utils/types.py +++ b/carl/utils/types.py @@ -1,4 +1,5 @@ -from typing import Any, Dict, Union, List, TypeVar +from typing import Any, Dict, List, TypeVar, Union + import numpy as np Context = Dict[str, Any] From b86be638c6d610fb4cb7ca4e7b13ebd7b2cca074 Mon Sep 17 00:00:00 2001 From: sebidoe <45859263+sebidoe@users.noreply.github.com> Date: Wed, 6 Jul 2022 18:07:29 +0200 Subject: [PATCH 46/67] Update try_dm_control.py --- carl/envs/dmc/try_dm_control.py | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/carl/envs/dmc/try_dm_control.py b/carl/envs/dmc/try_dm_control.py index 64ccdf1c..b67f1280 100644 --- a/carl/envs/dmc/try_dm_control.py +++ b/carl/envs/dmc/try_dm_control.py @@ -1,7 +1,6 @@ # flake8: noqa: F401 # type: ignore import matplotlib.pyplot as plt -from pyannotate_runtime import collect_types from carl.envs import CARLDmcFishEnv from carl.envs import CARLDmcFishEnv_defaults as fish_default @@ -27,18 +26,16 @@ # contexts = {0: fish_default} # carl_env = CARLDmcFishEnv(task="upright_context", contexts=contexts, context_mask=fish_mask, hide_context=False) collect_types.init_types_collection() - with collect_types.collect(): - carl_env = CARLDmcWalkerEnv( - task="run_context", - contexts=contexts, - context_mask=walker_mask, - hide_context=False, - dict_observation_space=True, - ) - action = carl_env.action_space.sample() - state, reward, done, info = carl_env.step(action=action) - print("state", state, type(state)) - collect_types.dump_stats("pyannotate.dump") + carl_env = CARLDmcWalkerEnv( + task="run_context", + contexts=contexts, + context_mask=walker_mask, + hide_context=False, + dict_observation_space=True, + ) + action = carl_env.action_space.sample() + state, reward, done, info = carl_env.step(action=action) + print("state", state, type(state)) render = lambda: plt.imshow(carl_env.render(mode="rgb_array")) s = carl_env.reset() From deb6731ddab908bec8271964b19f0570187f2753 Mon Sep 17 00:00:00 2001 From: sebidoe <45859263+sebidoe@users.noreply.github.com> Date: Wed, 6 Jul 2022 18:08:02 +0200 Subject: [PATCH 47/67] Update try_dm_control.py --- carl/envs/dmc/try_dm_control.py | 1 - 1 file changed, 1 deletion(-) diff --git a/carl/envs/dmc/try_dm_control.py b/carl/envs/dmc/try_dm_control.py index b67f1280..48ff1825 100644 --- a/carl/envs/dmc/try_dm_control.py +++ b/carl/envs/dmc/try_dm_control.py @@ -25,7 +25,6 @@ # contexts = {0: fish_default} # carl_env = CARLDmcFishEnv(task="upright_context", contexts=contexts, context_mask=fish_mask, hide_context=False) - collect_types.init_types_collection() carl_env = CARLDmcWalkerEnv( task="run_context", contexts=contexts, From abe7f4e3d5c0845c12401e0ce678c2d434f5da5f Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Thu, 7 Jul 2022 17:21:29 +0200 Subject: [PATCH 48/67] Fix pre-commit --- .pre-commit-config.yaml | 2 +- carl/__init__.py | 2 +- carl/envs/__init__.py | 8 ++++---- carl/envs/box2d/carl_vehicle_racing.py | 4 ++-- carl/envs/box2d/parking_garage/bus.py | 4 +++- carl/envs/box2d/parking_garage/race_car.py | 4 +++- carl/envs/box2d/parking_garage/trike.py | 4 +++- carl/envs/box2d/parking_garage/utils.py | 2 ++ carl/envs/mario/generate_sample.py | 2 +- examples/demo_carracing.py | 4 +++- 10 files changed, 23 insertions(+), 13 deletions(-) create mode 100644 carl/envs/box2d/parking_garage/utils.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c5520ce7..824121d4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,7 +17,7 @@ repos: args: [--check] - repo: https://github.com/ambv/black - rev: 21.12b0 + rev: 22.6.0 hooks: - id: black name: black formatter carl diff --git a/carl/__init__.py b/carl/__init__.py index 031be118..df2401bf 100644 --- a/carl/__init__.py +++ b/carl/__init__.py @@ -29,4 +29,4 @@ warnings.warn( f"Detected unsupported operating system: {sys.platform}." "Please be aware, that SMAC might not run on this system." - ) \ No newline at end of file + ) diff --git a/carl/envs/__init__.py b/carl/envs/__init__.py index 0e82ac83..829cb87c 100644 --- a/carl/envs/__init__.py +++ b/carl/envs/__init__.py @@ -1,13 +1,13 @@ # flake8: noqa: F401 # Modular imports -import importlib +import importlib.util as iutil import warnings # Classic control is in gym and thus necessary for the base version to run from carl.envs.classic_control import * # Environment loading -box2d_spec = importlib.util.find_spec("Box2D") +box2d_spec = iutil.find_spec("Box2D") found = box2d_spec is not None if found: from carl.envs.box2d import * @@ -16,7 +16,7 @@ "Module 'Box2D' not found. If you want to use these environments, please follow the installation guide." ) -brax_spec = importlib.util.find_spec("brax") +brax_spec = iutil.find_spec("brax") found = brax_spec is not None if found: from carl.envs.brax import * @@ -34,7 +34,7 @@ "Module 'Mario' not found. Please follow installation guide for ToadGAN environment." ) -dm_control_spec = importlib.util.find_spec("dm_control") +dm_control_spec = iutil.find_spec("dm_control") found = dm_control_spec is not None if found: from carl.envs.dmc import * diff --git a/carl/envs/box2d/carl_vehicle_racing.py b/carl/envs/box2d/carl_vehicle_racing.py index f19927ee..8e02a415 100644 --- a/carl/envs/box2d/carl_vehicle_racing.py +++ b/carl/envs/box2d/carl_vehicle_racing.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Optional, Tuple, Type, Union +from typing import Dict, List, Optional, Tuple, Type, Union, Any import numpy as np import pyglet @@ -104,7 +104,7 @@ def reset( self.prev_reward = 0.0 self.tile_visited_count = 0 self.t = 0.0 - self.road_poly = [] + self.road_poly: List[Tuple[List[float], Tuple[Any]]] = [] while True: success = self._create_track() diff --git a/carl/envs/box2d/parking_garage/bus.py b/carl/envs/box2d/parking_garage/bus.py index bb85c043..846d69ca 100644 --- a/carl/envs/box2d/parking_garage/bus.py +++ b/carl/envs/box2d/parking_garage/bus.py @@ -1,3 +1,4 @@ +from typing import List import Box2D import numpy as np from Box2D.b2 import circleShape # noqa: F401 @@ -11,6 +12,7 @@ from Box2D.b2 import ropeJointDef # noqa: F401 from Box2D.b2 import shape # noqa: F401; noqa: F401 from gym.envs.box2d.car_dynamics import Car +from carl.envs.box2d.parking_garage.utils import Particle __author__ = "André Biedenkapp" @@ -349,7 +351,7 @@ def __init__( self.drawlist = self.wheels + [self.hull, self.trailer, self.trailer_axel] else: self.drawlist = self.wheels + [self.hull] - self.particles = [] + self.particles: List[Particle] = [] def gas(self, gas: float) -> None: """control: rear wheel drive diff --git a/carl/envs/box2d/parking_garage/race_car.py b/carl/envs/box2d/parking_garage/race_car.py index fc16d57c..41a9f6f1 100644 --- a/carl/envs/box2d/parking_garage/race_car.py +++ b/carl/envs/box2d/parking_garage/race_car.py @@ -1,3 +1,4 @@ +from typing import List import Box2D import numpy as np from Box2D.b2 import circleShape # noqa: F401 @@ -11,6 +12,7 @@ from Box2D.b2 import ropeJointDef # noqa: F401 from Box2D.b2 import shape # noqa: F401; noqa: F401 from gym.envs.box2d.car_dynamics import Car +from carl.envs.box2d.parking_garage.utils import Particle __author__ = "André Biedenkapp" @@ -368,7 +370,7 @@ def __init__( self.drawlist = self.wheels + [self.hull, self.trailer, self.trailer_axel] else: self.drawlist = self.wheels + [self.hull] - self.particles = [] + self.particles: List[Particle] = [] def gas(self, gas: float) -> None: """control: rear wheel drive diff --git a/carl/envs/box2d/parking_garage/trike.py b/carl/envs/box2d/parking_garage/trike.py index caadc4b7..5d40b8eb 100644 --- a/carl/envs/box2d/parking_garage/trike.py +++ b/carl/envs/box2d/parking_garage/trike.py @@ -1,3 +1,4 @@ +from typing import List import Box2D import numpy as np from Box2D.b2 import circleShape # noqa: F401 @@ -11,6 +12,7 @@ from Box2D.b2 import ropeJointDef # noqa: F401 from Box2D.b2 import shape # noqa: F401; noqa: F401 from gym.envs.box2d.car_dynamics import Car +from carl.envs.box2d.parking_garage.utils import Particle __author__ = "André Biedenkapp" @@ -221,7 +223,7 @@ def __init__( raise NotImplementedError else: self.drawlist = self.wheels + [self.hull] - self.particles = [] + self.particles: List[Particle] = [] def steer(self, s: float) -> None: """control: steer diff --git a/carl/envs/box2d/parking_garage/utils.py b/carl/envs/box2d/parking_garage/utils.py new file mode 100644 index 00000000..0d181edc --- /dev/null +++ b/carl/envs/box2d/parking_garage/utils.py @@ -0,0 +1,2 @@ +class Particle: + pass diff --git a/carl/envs/mario/generate_sample.py b/carl/envs/mario/generate_sample.py index 6fb7707e..39a95222 100644 --- a/carl/envs/mario/generate_sample.py +++ b/carl/envs/mario/generate_sample.py @@ -15,7 +15,7 @@ def generate_spatial_noise( # Generate a sample given a TOAD-GAN and additional parameters -@torch.no_grad() +@torch.no_grad() # type: ignore [misc] def generate_sample( generators: Tensor, noise_maps: Tensor, diff --git a/examples/demo_carracing.py b/examples/demo_carracing.py index b961d3b0..9f76272b 100644 --- a/examples/demo_carracing.py +++ b/examples/demo_carracing.py @@ -46,7 +46,9 @@ def register_input(): if record_video: from gym.wrappers.record_video import RecordVideo - env = RecordVideo(env=env, video_folder="/tmp/video-test", name_prefix="CARLVehicleRacing") + env = RecordVideo( + env=env, video_folder="/tmp/video-test", name_prefix="CARLVehicleRacing" + ) isopen = True while isopen: From 90cb9159be6259176af82f9ddeaccba44d94e224 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Thu, 7 Jul 2022 17:22:11 +0200 Subject: [PATCH 49/67] Update changelog.md --- changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.md b/changelog.md index 4433d617..674ab7d6 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,7 @@ - Integrate dm control environments (#55) - Add context masks to only append those to the state (#54) - Extend classic control environments to parametrize initial state distributions (#52) +- Remove RNA environment for maintenance # 0.1.0 - Initial release. \ No newline at end of file From e2bc9eacf97994c03347c19a5cbbacc97691cb7b Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Thu, 7 Jul 2022 17:22:11 +0200 Subject: [PATCH 50/67] Update changelog.md --- changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.md b/changelog.md index 4433d617..674ab7d6 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,7 @@ - Integrate dm control environments (#55) - Add context masks to only append those to the state (#54) - Extend classic control environments to parametrize initial state distributions (#52) +- Remove RNA environment for maintenance # 0.1.0 - Initial release. \ No newline at end of file From 344b5cc830e74ebc33fbdc3f46ba3dd5e98f638f Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Thu, 7 Jul 2022 17:23:50 +0200 Subject: [PATCH 51/67] Update changelog.md --- changelog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 674ab7d6..56792283 100644 --- a/changelog.md +++ b/changelog.md @@ -2,7 +2,8 @@ - Integrate dm control environments (#55) - Add context masks to only append those to the state (#54) - Extend classic control environments to parametrize initial state distributions (#52) -- Remove RNA environment for maintenance +- Remove RNA environment for maintenance (#61) +- Fixed pre-commit (mypy, black, flake8, isort) (#62) # 0.1.0 - Initial release. \ No newline at end of file From 0786b382d923a4f103e28707cb2b84aa5bdab459 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Fri, 8 Jul 2022 09:48:32 +0200 Subject: [PATCH 52/67] Fix tests --- carl/context/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/carl/context/utils.py b/carl/context/utils.py index be82889c..38244f3c 100644 --- a/carl/context/utils.py +++ b/carl/context/utils.py @@ -28,7 +28,7 @@ def get_context_bounds( upper_bounds = np.empty(shape=len(context_keys)) for i, context_key in enumerate(context_keys): - l, u = context_bounds[context_key] + l, u, dtype = context_bounds[context_key] lower_bounds[i] = l upper_bounds[i] = u From f464d38768bec74af14bc92c48aba0f5a84191ca Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Fri, 8 Jul 2022 09:51:21 +0200 Subject: [PATCH 53/67] Fix dist check --- .github/workflows/dist.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dist.yaml b/.github/workflows/dist.yaml index 1b0f9ac8..fc2f3cd1 100644 --- a/.github/workflows/dist.yaml +++ b/.github/workflows/dist.yaml @@ -38,7 +38,7 @@ jobs: - name: Twine check run: | pip install twine - last_dist=$(ls -t dist/CARL-*.tar.gz | head -n 1) + last_dist=$(ls -t dist/carl-*.tar.gz | head -n 1) twine_output=`twine check "$last_dist"` if [[ "$twine_output" != "Checking $last_dist: PASSED" ]] then @@ -49,7 +49,7 @@ jobs: - name: Install dist run: | - last_dist=$(ls -t dist/CARL-*.tar.gz | head -n 1) + last_dist=$(ls -t dist/carl-*.tar.gz | head -n 1) pip install $last_dist - name: PEP 561 Compliance From 8343d80fb9a541aba3c23017317cd8f3b9f23d35 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Fri, 8 Jul 2022 09:56:17 +0200 Subject: [PATCH 54/67] Fix mypy --- carl/context/utils.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/carl/context/utils.py b/carl/context/utils.py index 38244f3c..1d55faec 100644 --- a/carl/context/utils.py +++ b/carl/context/utils.py @@ -1,10 +1,10 @@ -from typing import Dict, List, Tuple +from typing import Dict, List, Tuple, Type, Any import numpy as np def get_context_bounds( - context_keys: List[str], context_bounds: Dict[str, Tuple[float, float]] + context_keys: List[str], context_bounds: Dict[str, Tuple[float, float, Type[Any]]] ) -> Tuple[np.ndarray, np.ndarray]: """ Get context bounds for specific features. @@ -15,7 +15,7 @@ def get_context_bounds( ---------- context_keys: List[str] Names of context features. - context_bounds: Dict[str, Tuple[float, float, float]] + context_bounds: Dict[str, Tuple[float, float, type]] Dictionary containing lower and upper bound as a tuple, e.g., "context_feature_name": (-np.inf, np.inf)). Returns @@ -51,16 +51,16 @@ def get_context_bounds( } CONTEXT_BOUNDS = { - "min_position": (-np.inf, np.inf), - "max_position": (-np.inf, np.inf), - "max_speed": (0, np.inf), - "goal_position": (-np.inf, np.inf), - "goal_velocity": (-np.inf, np.inf), - "force": (-np.inf, np.inf), - "gravity": (0, np.inf), - "min_position_start": (-np.inf, np.inf), - "max_position_start": (-np.inf, np.inf), - "min_velocity_start": (-np.inf, np.inf), - "max_velocity_start": (-np.inf, np.inf), + "min_position": (-np.inf, np.inf, float), + "max_position": (-np.inf, np.inf, float), + "max_speed": (0, np.inf, float), + "goal_position": (-np.inf, np.inf, float), + "goal_velocity": (-np.inf, np.inf, float), + "force": (-np.inf, np.inf, float), + "gravity": (0, np.inf, float), + "min_position_start": (-np.inf, np.inf, float), + "max_position_start": (-np.inf, np.inf, float), + "min_velocity_start": (-np.inf, np.inf, float), + "max_velocity_start": (-np.inf, np.inf, float), } lower, upper = get_context_bounds(list(DEFAULT_CONTEXT.keys()), CONTEXT_BOUNDS) From 44e2a1b3fdf734590628b2a1cbae18f2de24362b Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Fri, 8 Jul 2022 09:57:10 +0200 Subject: [PATCH 55/67] Format isort --- carl/context/utils.py | 2 +- carl/envs/box2d/carl_vehicle_racing.py | 2 +- carl/envs/box2d/parking_garage/bus.py | 2 ++ carl/envs/box2d/parking_garage/race_car.py | 2 ++ carl/envs/box2d/parking_garage/trike.py | 2 ++ 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/carl/context/utils.py b/carl/context/utils.py index 1d55faec..de62371f 100644 --- a/carl/context/utils.py +++ b/carl/context/utils.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Tuple, Type, Any +from typing import Any, Dict, List, Tuple, Type import numpy as np diff --git a/carl/envs/box2d/carl_vehicle_racing.py b/carl/envs/box2d/carl_vehicle_racing.py index 8e02a415..6aa0ea0a 100644 --- a/carl/envs/box2d/carl_vehicle_racing.py +++ b/carl/envs/box2d/carl_vehicle_racing.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Optional, Tuple, Type, Union, Any +from typing import Any, Dict, List, Optional, Tuple, Type, Union import numpy as np import pyglet diff --git a/carl/envs/box2d/parking_garage/bus.py b/carl/envs/box2d/parking_garage/bus.py index 846d69ca..7d6e810e 100644 --- a/carl/envs/box2d/parking_garage/bus.py +++ b/carl/envs/box2d/parking_garage/bus.py @@ -1,4 +1,5 @@ from typing import List + import Box2D import numpy as np from Box2D.b2 import circleShape # noqa: F401 @@ -12,6 +13,7 @@ from Box2D.b2 import ropeJointDef # noqa: F401 from Box2D.b2 import shape # noqa: F401; noqa: F401 from gym.envs.box2d.car_dynamics import Car + from carl.envs.box2d.parking_garage.utils import Particle __author__ = "André Biedenkapp" diff --git a/carl/envs/box2d/parking_garage/race_car.py b/carl/envs/box2d/parking_garage/race_car.py index 41a9f6f1..c82c3e58 100644 --- a/carl/envs/box2d/parking_garage/race_car.py +++ b/carl/envs/box2d/parking_garage/race_car.py @@ -1,4 +1,5 @@ from typing import List + import Box2D import numpy as np from Box2D.b2 import circleShape # noqa: F401 @@ -12,6 +13,7 @@ from Box2D.b2 import ropeJointDef # noqa: F401 from Box2D.b2 import shape # noqa: F401; noqa: F401 from gym.envs.box2d.car_dynamics import Car + from carl.envs.box2d.parking_garage.utils import Particle __author__ = "André Biedenkapp" diff --git a/carl/envs/box2d/parking_garage/trike.py b/carl/envs/box2d/parking_garage/trike.py index 5d40b8eb..d2bcf95a 100644 --- a/carl/envs/box2d/parking_garage/trike.py +++ b/carl/envs/box2d/parking_garage/trike.py @@ -1,4 +1,5 @@ from typing import List + import Box2D import numpy as np from Box2D.b2 import circleShape # noqa: F401 @@ -12,6 +13,7 @@ from Box2D.b2 import ropeJointDef # noqa: F401 from Box2D.b2 import shape # noqa: F401; noqa: F401 from gym.envs.box2d.car_dynamics import Car + from carl.envs.box2d.parking_garage.utils import Particle __author__ = "André Biedenkapp" From 6540edef395c3546a7d041ad53246ffc789f20a2 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Fri, 8 Jul 2022 10:50:35 +0200 Subject: [PATCH 56/67] Remove setup packages for experiments No experiments in this branch --- setup.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/setup.py b/setup.py index 07244249..c1c80aea 100644 --- a/setup.py +++ b/setup.py @@ -41,13 +41,6 @@ def read_file(filepath: str) -> str: "Pillow>=8.3.1", "py4j>=0.10.9.2", ], - "experiments": [ - "ray>=1.5.1", - "seaborn>=0.11.1", - "sb3_contrib>=1.1.0", - "stable_baselines3>=1.1.0", - "tensorflow>=2.5.0", - ], "dev": [ "pytest>=6.1.1", "pytest-cov", From 5b6618bc69964e7158a668f3b28d7058fcf65839 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Fri, 8 Jul 2022 10:50:53 +0200 Subject: [PATCH 57/67] Remove requirements for rna --- setup.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/setup.py b/setup.py index c1c80aea..f534d762 100644 --- a/setup.py +++ b/setup.py @@ -28,11 +28,6 @@ def read_file(filepath: str) -> str: "brax>=0.0.10", "protobuf>=3.17.3", ], - "rna": [ - "viennarna>=2.4.18", - "dataclasses", - "Distance", - ], "dm_control": [ "dm_control>=1.0.3", ], From aca24aa187c1bb43bc8ec52cfc572bce5589de78 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Fri, 8 Jul 2022 11:03:07 +0200 Subject: [PATCH 58/67] Update requirements --- setup.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/setup.py b/setup.py index f534d762..3e2f1fa1 100644 --- a/setup.py +++ b/setup.py @@ -77,14 +77,12 @@ def read_file(filepath: str) -> str: python_requires=">=3.9", install_requires=[ "gym>=0.24.1", - "pygame==2.1.0", "scipy>=1.7.0", "ConfigArgParse>=1.5.1", "numpy>=1.19.5", "pandas>=1.3.0", "xvfbwrapper>=0.2.9", "matplotlib>=3.4.2", - "optuna>=2.9.1", "dataclasses>=0.6", "numpyencoder>=0.3.0", "pyglet>=1.5.15", @@ -112,4 +110,4 @@ def read_file(filepath: str) -> str: "Topic :: Scientific/Engineering", "Topic :: Software Development", ], -) \ No newline at end of file +) From e556b7883e57dc74d60fd8fd21b49453a5a35565 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Fri, 8 Jul 2022 11:08:28 +0200 Subject: [PATCH 59/67] Remove RNA --- carl/utils/doc_building/build.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/carl/utils/doc_building/build.py b/carl/utils/doc_building/build.py index 8cac006a..2aed6c78 100644 --- a/carl/utils/doc_building/build.py +++ b/carl/utils/doc_building/build.py @@ -65,21 +65,17 @@ def build() -> Tuple[pd.DataFrame, Dict, Dict]: # if len(overview_table_entries) == 3: # TODO change back # break - # Add RNA and Mario Information - env_families = ["RNA", "Mario"] - env_names = ["CARLRnaDesignEnv", "CARLMarioEnv"] + # Add Mario Information + env_families = ["Mario"] + env_names = ["CARLMarioEnv"] from carl.envs.mario.carl_mario_definitions import CONTEXT_BOUNDS as mario_bounds from carl.envs.mario.carl_mario_definitions import DEFAULT_CONTEXT as mario_defaults - from carl.envs.rna.carl_rna_definitions import ACTION_SPACE as rna_A - from carl.envs.rna.carl_rna_definitions import CONTEXT_BOUNDS as rna_bounds - from carl.envs.rna.carl_rna_definitions import DEFAULT_CONTEXT as rna_defaults - from carl.envs.rna.carl_rna_definitions import OBSERVATION_SPACE as rna_O - unicorn_defaults = [rna_defaults, mario_defaults] + unicorn_defaults = [mario_defaults] N_context_features = [len(c) for c in unicorn_defaults] - action_spaces = [rna_A, MARIO_ACTION_SPACE] - observation_spaces = [rna_O, MARIO_OBSERVATION_SPACE] - unicorn_bounds = [rna_bounds, mario_bounds] + action_spaces = [MARIO_ACTION_SPACE] + observation_spaces = [MARIO_OBSERVATION_SPACE] + unicorn_bounds = [mario_bounds] for i in range(len(env_names)): data = { k_env_family: env_families[i], From 0d137d6eb1525a8ce8b2583ce4b0782485451ea7 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Fri, 8 Jul 2022 11:15:20 +0200 Subject: [PATCH 60/67] Fix tests.yaml --- .github/workflows/tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index e5c878f4..160f5316 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -98,7 +98,7 @@ jobs: run: | python -m pip install --upgrade pip python setup.py sdist - last_dist=$(ls -t dist/CARL-*.tar.gz | head -n 1) + last_dist=$(ls -t dist/carl-*.tar.gz | head -n 1) pip install $last_dist[dev] - name: Tests From f16dc897a04110199eda295321a4cdb7df29abbe Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Fri, 8 Jul 2022 11:19:01 +0200 Subject: [PATCH 61/67] Remove operating system warning --- carl/__init__.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/carl/__init__.py b/carl/__init__.py index df2401bf..f9fc6f8d 100644 --- a/carl/__init__.py +++ b/carl/__init__.py @@ -4,9 +4,6 @@ import datetime -import os -import sys -import warnings name = "CARL" package_name = "carl" @@ -23,10 +20,3 @@ Copyright {datetime.date.today().strftime('%Y')}, AutoML.org Freiburg-Hannover """ version = __version__ - - -if os.name != "posix": - warnings.warn( - f"Detected unsupported operating system: {sys.platform}." - "Please be aware, that SMAC might not run on this system." - ) From 468764b184c7d55347ed1758185c44421d756274 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Fri, 8 Jul 2022 11:41:07 +0200 Subject: [PATCH 62/67] Add test for dmc loader --- test/test_dmc.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 test/test_dmc.py diff --git a/test/test_dmc.py b/test/test_dmc.py new file mode 100644 index 00000000..272dc590 --- /dev/null +++ b/test/test_dmc.py @@ -0,0 +1,31 @@ +import unittest + +from carl.envs.dmc.loader import load_dmc_env + + +class TestDMCLoader(unittest.TestCase): + def test_load_classic_dmc_env(self): + _ = load_dmc_env( + domain_name="walker", + task_name="walk", + ) + + def test_load_context_dmc_env(self): + _ = load_dmc_env( + domain_name="walker", + task_name="walk_context", + ) + + def test_load_unknowntask_dmc_env(self): + with self.assertRaises(ValueError): + _ = load_dmc_env( + domain_name="walker", + task_name="walk_context_blub", + ) + + def test_load_unknowndomain_dmc_env(self): + with self.assertRaises(ValueError): + _ = load_dmc_env( + domain_name="sdfsdf", + task_name="walk", + ) From 39996d0b0b556e1ace38db7f2f486463eddc16fb Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Fri, 8 Jul 2022 11:46:57 +0200 Subject: [PATCH 63/67] Move to examples --- {carl/envs/dmc => examples}/try_dm_control.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {carl/envs/dmc => examples}/try_dm_control.py (100%) diff --git a/carl/envs/dmc/try_dm_control.py b/examples/try_dm_control.py similarity index 100% rename from carl/envs/dmc/try_dm_control.py rename to examples/try_dm_control.py From 9c4ed0f6b5183c4d31bba9e61e2e5c18188b4972 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Tue, 12 Jul 2022 10:35:49 +0200 Subject: [PATCH 64/67] Add requirement --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 3e2f1fa1..978afd94 100644 --- a/setup.py +++ b/setup.py @@ -30,6 +30,7 @@ def read_file(filepath: str) -> str: ], "dm_control": [ "dm_control>=1.0.3", + "dm-env", ], "mario": [ "torch>=1.9.0", From a533fd4dc73dca498bbccce354be0d015e3cde49 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Tue, 12 Jul 2022 10:38:50 +0200 Subject: [PATCH 65/67] Remove requirement --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index 978afd94..3e2f1fa1 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,6 @@ def read_file(filepath: str) -> str: ], "dm_control": [ "dm_control>=1.0.3", - "dm-env", ], "mario": [ "torch>=1.9.0", From ce969ffb8d2666c2ceb9210bab4c4ee67e0be148 Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Tue, 12 Jul 2022 10:43:03 +0200 Subject: [PATCH 66/67] Update tests.yaml --- .github/workflows/tests.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 160f5316..6f378032 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -85,13 +85,13 @@ jobs: # Miniconda is available in $CONDA env var $CONDA/bin/conda create -n testenv --yes pip wheel gxx_linux-64 gcc_linux-64 python=${{ matrix.python-version }} $CONDA/envs/testenv/bin/python3 -m pip install --upgrade pip - $CONDA/envs/testenv/bin/pip3 install -e .[dev] + $CONDA/envs/testenv/bin/pip3 install -e . [dev,dm_control] - name: Source install if: matrix.kind == 'source' run: | python -m pip install --upgrade pip - pip install -e .[dev] + pip install -e . [dev,dm_control] - name: Dist install if: matrix.kind == 'dist' @@ -99,7 +99,7 @@ jobs: python -m pip install --upgrade pip python setup.py sdist last_dist=$(ls -t dist/carl-*.tar.gz | head -n 1) - pip install $last_dist[dev] + pip install $last_dist [dev,dm_control] - name: Tests timeout-minutes: 60 From 1a231f3b8a4955adfcb1f3e9348d4a7a0ca0cf5b Mon Sep 17 00:00:00 2001 From: Carolin Benjamins Date: Tue, 12 Jul 2022 10:45:35 +0200 Subject: [PATCH 67/67] Fix whitespace in tests.yaml --- .github/workflows/tests.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 6f378032..9a848bc5 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -85,13 +85,13 @@ jobs: # Miniconda is available in $CONDA env var $CONDA/bin/conda create -n testenv --yes pip wheel gxx_linux-64 gcc_linux-64 python=${{ matrix.python-version }} $CONDA/envs/testenv/bin/python3 -m pip install --upgrade pip - $CONDA/envs/testenv/bin/pip3 install -e . [dev,dm_control] + $CONDA/envs/testenv/bin/pip3 install -e .[dev,dm_control] - name: Source install if: matrix.kind == 'source' run: | python -m pip install --upgrade pip - pip install -e . [dev,dm_control] + pip install -e .[dev,dm_control] - name: Dist install if: matrix.kind == 'dist' @@ -99,7 +99,7 @@ jobs: python -m pip install --upgrade pip python setup.py sdist last_dist=$(ls -t dist/carl-*.tar.gz | head -n 1) - pip install $last_dist [dev,dm_control] + pip install $last_dist[dev,dm_control] - name: Tests timeout-minutes: 60