Esempio n. 1
0
    def __init__(self,
                 game='classic_kong',
                 obs_type='ram',
                 frameskip=(2, 5),
                 repeat_action_probability=0.):
        """Frameskip should be either a tuple (indicating a random range to
        choose from, with the top value exclude), or an int."""

        utils.EzPickle.__init__(self, game, obs_type)
        assert obs_type in ('ram', 'image')

        self.game_path = self.get_rom_path(game)

        self._obs_type = obs_type
        self.frameskip = frameskip
        self.rle = RLEInterface()
        self.viewer = None

        # Tune (or disable) RLE's action repeat:
        # https://github.com/openai/gym/issues/349
        assert isinstance(
            repeat_action_probability,
            (float, int)), "Invalid repeat_action_probability: {!r}".format(
                repeat_action_probability)
        self.rle.setFloat('repeat_action_probability'.encode('utf-8'),
                          repeat_action_probability)

        self._seed()

        (screen_width, screen_height) = self.rle.getScreenDims()
        self._buffer = np.empty((screen_height, screen_width, 4),
                                dtype=np.uint8)

        self._action_set = self.rle.getMinimalActionSet()
        self.action_space = spaces.Discrete(len(self._action_set))

        (screen_width, screen_height) = self.rle.getScreenDims()
        ram_size = self.rle.getRAMSize()
        if self._obs_type == 'ram':
            self.observation_space = spaces.Box(low=np.zeros(ram_size),
                                                high=np.zeros(ram_size) + 255)
        elif self._obs_type == 'image':
            self.observation_space = spaces.Box(low=0,
                                                high=255,
                                                shape=(
                                                    screen_height,
                                                    screen_width,
                                                ))
        else:
            raise error.Error('Unrecognized observation type: {}'.format(
                self._obs_type))
Esempio n. 2
0
#!/usr/bin/env python
# python_example.py
# Author: Ben Goodrich
# Modified by: Nadav Bhonker and Shai Rozenberg
#
# This is a direct port to python of the shared library example from
# RLE provided in doc/examples/sharedLibraryInterfaceExample.cpp
import sys
from random import randrange
from rle_python_interface import RLEInterface

if len(sys.argv) < 2:
    print('Usage:', sys.argv[0], 'rom_file', 'core_file')
    sys.exit()

rle = RLEInterface()

# Get & Set the desired settings
rle.setInt('random_seed', 123)

# Set USE_SDL to true to display the screen. RLE must be compilied
# with SDL enabled for this to work. On OSX, pygame init is used to
# proxy-call SDL_main.
USE_SDL = False
if USE_SDL:
    if sys.platform == 'darwin':
        import pygame
        pygame.init()
        rle.setBool('sound', False)  # Sound doesn't work on OSX
    elif sys.platform.startswith('linux'):
        rle.setBool('sound', True)
Esempio n. 3
0
# RLE provided in doc/examples/sharedLibraryInterfaceExample.cpp
import sys
from random import randrange
from rle_python_interface import RLEInterface

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, Embedding, LSTM, Bidirectional, Activation, Conv2D, Lambda, Flatten
from keras import optimizers
from collections import deque

if len(sys.argv) < 2:
    print('Usage:', sys.argv[0], 'rom_file', 'core_file')
    sys.exit()

rle = RLEInterface()

# Get & Set the desired settings
rle.setInt(b'random_seed', 42)
#rle.setString(b'MK_player1_character', b'scorpion')

# Set USE_SDL to true to display the screen. RLE must be compilied
# with SDL enabled for this to work. On OSX, pygame init is used to
# proxy-call SDL_main.
USE_SDL = True
if USE_SDL:
    if sys.platform == 'darwin':
        import pygame
        pygame.init()
        #rle.setBool(b'sound', False) # Sound doesn't work on OSX
    elif sys.platform.startswith('linux'):
Esempio n. 4
0
 def setUp(self):
     cwd = os.getcwd()
     core = 'snes'
     romName = os.path.join(cwd, 'roms', 'classic_kong.smc')
     self.rle = RLEInterface()
     self.rle.loadROM(romName, core)
Esempio n. 5
0
class RleTest(unittest.TestCase):
    def setUp(self):
        cwd = os.getcwd()
        core = 'snes'
        romName = os.path.join(cwd, 'roms', 'classic_kong.smc')
        self.rle = RLEInterface()
        self.rle.loadROM(romName, core)

    def test_ram(self):
        ram_size = self.rle.getRAMSize()
        self.assertEqual(128 * 1024, ram_size)
        ram = np.array(ram_size, dtype=np.uint8)
        ram = self.rle.getRAM()
        self.assertIsNotNone(ram[0])
        self.assertIsNotNone(ram[ram_size - 1])

    def test_getScreenRGB(self):
        dimensions = self.rle.getScreenDims()
        self.assertEqual(dimensions[0], 256)
        self.assertEqual(dimensions[1], 224)
        screen_data = np.empty((dimensions[1], dimensions[0], 4),
                               dtype=np.uint8)

        for _ in range(10):
            self.rle.act(0)
            self.rle.getScreenRGB(screen_data=screen_data)
            self.rle.getScreenGrayscale(screen_data=screen_data)

    def test_getScreenGrayscale(self):
        dimensions = self.rle.getScreenDims()
        self.assertEqual(dimensions[0], 256)
        self.assertEqual(dimensions[1], 224)
        screen_data = np.empty((dimensions[1], dimensions[0]), dtype=np.uint8)
        self.assertEqual(224 * 256, screen_data.size)
        for _ in range(100):
            self.rle.act(0)
        self.rle.getScreenGrayscale(screen_data=screen_data)
Esempio n. 6
0
        if self.epsilon > self.epsilon_min:
            self.epsilon *= self.epsilon_decay

    def load(self, name):
        self.model.load_weights(name)

    def save(self, name):
        self.model.save_weights(name)


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print('Usage:', sys.argv[0], 'rom_file', 'core_file')
        sys.exit()

    rle = RLEInterface()
    rle.setInt(b'random_seed', 42)
    USE_SDL = True
    if USE_SDL:
        if sys.platform == 'darwin':
            import pygame
            pygame.init()
            #rle.setBool(b'sound', False) # Sound doesn't work on OSX
        elif sys.platform.startswith('linux'):
            #rle.setBool(b'sound', True)
            rle.setBool(b'display_screen', True)

    # Load the ROM file
    rle.loadROM(sys.argv[1], sys.argv[2])

    width, height = rle.getScreenDims()
#!/usr/bin/env python
# python_example.py
# Author: Ben Goodrich
#
# This is a direct port to python of the shared library example from
# ALE provided in doc/examples/sharedLibraryInterfaceExample.cpp
import sys
from random import randrange
from rle_python_interface import RLEInterface

if len(sys.argv) < 2:
  print 'Usage:', sys.argv[0], 'rom_file'
  sys.exit()

rle = RLEInterface()

# Get & Set the desired settings
rle.setInt('random_seed', 123)

# Set USE_SDL to true to display the screen. ALE must be compilied
# with SDL enabled for this to work. On OSX, pygame init is used to
# proxy-call SDL_main.
USE_SDL = False
if USE_SDL:
  if sys.platform == 'darwin':
    import pygame
    pygame.init()
    rle.setBool('sound', False) # Sound doesn't work on OSX
  elif sys.platform.startswith('linux'):
    rle.setBool('sound', True)
  rle.setBool('display_screen', True)
Esempio n. 8
0
class RleEnv(gym.Env, utils.EzPickle):
    metadata = {'render.modes': ['human', 'rgb_array']}

    def __init__(self,
                 game='classic_kong',
                 obs_type='ram',
                 frameskip=(2, 5),
                 repeat_action_probability=0.):
        """Frameskip should be either a tuple (indicating a random range to
        choose from, with the top value exclude), or an int."""

        utils.EzPickle.__init__(self, game, obs_type)
        assert obs_type in ('ram', 'image')

        self.game_path = self.get_rom_path(game)

        self._obs_type = obs_type
        self.frameskip = frameskip
        self.rle = RLEInterface()
        self.viewer = None

        # Tune (or disable) RLE's action repeat:
        # https://github.com/openai/gym/issues/349
        assert isinstance(
            repeat_action_probability,
            (float, int)), "Invalid repeat_action_probability: {!r}".format(
                repeat_action_probability)
        self.rle.setFloat('repeat_action_probability'.encode('utf-8'),
                          repeat_action_probability)

        self._seed()

        (screen_width, screen_height) = self.rle.getScreenDims()
        self._buffer = np.empty((screen_height, screen_width, 4),
                                dtype=np.uint8)

        self._action_set = self.rle.getMinimalActionSet()
        self.action_space = spaces.Discrete(len(self._action_set))

        (screen_width, screen_height) = self.rle.getScreenDims()
        ram_size = self.rle.getRAMSize()
        if self._obs_type == 'ram':
            self.observation_space = spaces.Box(low=np.zeros(ram_size),
                                                high=np.zeros(ram_size) + 255)
        elif self._obs_type == 'image':
            self.observation_space = spaces.Box(low=0,
                                                high=255,
                                                shape=(
                                                    screen_height,
                                                    screen_width,
                                                ))
        else:
            raise error.Error('Unrecognized observation type: {}'.format(
                self._obs_type))

    def get_rom_path(self, game):
        cwd = os.path.dirname(__file__)
        roms_path = os.path.join(cwd, 'roms')
        for file in os.listdir(roms_path):
            if fnmatch.fnmatch(file, game + '*'):
                return os.path.join(roms_path, file)

    def _seed(self, seed=None):
        self.np_random, seed1 = seeding.np_random(seed)
        # Derive a random seed. This gets passed as a uint, but gets
        # checked as an int elsewhere, so we need to keep it below
        # 2**31.
        seed2 = seeding.hash_seed(seed1 + 1) % 2**31
        # Empirically, we need to seed before loading the ROM.
        self.rle.setInt(b'random_seed', seed2)
        self.rle.loadROM(self.game_path, 'snes')
        return [seed1, seed2]

    def _step(self, a):
        reward = 0.0
        action = self._action_set[a]

        if isinstance(self.frameskip, int):
            num_steps = self.frameskip
        else:
            num_steps = self.np_random.randint(self.frameskip[0],
                                               self.frameskip[1])
        for _ in range(num_steps):
            reward += self.rle.act(action)
        ob = self._get_obs()

        return ob, reward, self.rle.game_over(), {
            "rle.lives": self.rle.lives()
        }

    def _get_image(self):
        self.rle.getScreenRGB(self._buffer)
        return self._buffer[:, :, [0, 1, 2]]

    def _get_ram(self):
        return to_ram(self.rle)

    @property
    def _n_actions(self):
        return len(self._action_set)

    def _get_obs(self):
        if self._obs_type == 'ram':
            return self._get_ram()
        if self._obs_type == 'image':
            return self._get_image()

    def _reset(self):
        self.rle.reset_game()
        return self._get_obs()

    def _render(self, mode='human', close=False):
        if close:
            if self.viewer is not None:
                self.viewer.close()
                self.viewer = None
            return
        img = self._get_image()
        if mode == 'rgb_array':
            return img
        elif mode == 'human':
            from gym.envs.classic_control import rendering
            if self.viewer is None:
                self.viewer = rendering.SimpleImageViewer()
            self.viewer.imshow(img)

    def get_action_meanings(self):
        return [get_action_meaning(i) for i in self._action_set]