Source code for cntk.contrib.deeprl.agent.shared.discretize

# Copyright (c) Microsoft. All rights reserved.

# Licensed under the MIT license. See LICENSE.md file in the project root
# for full license information.
# ==============================================================================
"""Discretize continuous environment space."""

import numpy as np


[docs]class BoxSpaceDiscretizer: """Discretize Box space.""" def __init__(self, space, resolution): spaceclassname = \ space.__class__.__module__ + '.' + space.__class__.__name__ if spaceclassname != 'gym.spaces.box.Box': raise ValueError( 'Space {0} incompatible with {1}. (Only supports ' 'Box space)'.format(space, self)) assert np.isscalar(resolution) or space.low.shape == resolution.shape self._state_mins = space.low self._state_maxs = space.high if np.isscalar(resolution): self._state_resolutions = resolution + np.zeros(space.low.shape) else: self._state_resolutions = resolution self.num_states = int(np.prod(self._state_resolutions))
[docs] def discretize(self, value): """Discretize box space observation.""" index = 0 for i, v in np.ndenumerate(value): i_idx = self._get_index( v, self._state_mins[i], self._state_maxs[i], self._state_resolutions[i]) index = index * self._state_resolutions[i] + i_idx return int(index)
def _get_index(self, value, minv, maxv, res): """Convert a continuous value to a discrete number.""" if value >= maxv: return res - 1 elif value <= minv: return 0 else: ind = np.floor((value - minv) * res / (maxv - minv)) return int(min(res - 1, max(0, ind)))