/
RandomObject.py
70 lines (56 loc) · 2.72 KB
/
RandomObject.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# Copyright (c) 2019-2020, RTE (https://www.rte-france.com)
# See AUTHORS.txt
# This Source Code Form is subject to the terms of the Mozilla Public License, version 2.0.
# If a copy of the Mozilla Public License, version 2.0 was not distributed with this file,
# you can obtain one at http://mozilla.org/MPL/2.0/.
# SPDX-License-Identifier: MPL-2.0
# This file is part of Grid2Op, Grid2Op a testbed platform to model sequential decision making in power systems.
import numpy as np
class RandomObject(object):
"""
Utility class to deal with randomness in some aspect of the game (chronics, action_space, observation_space for
examples.
Attributes
----------
space_prng: ``numpy.random.RandomState``
The random state of the observation (in case of non deterministic observations or BaseAction.
This should not be used at the
moment)
seed_used: ``int``
The seed used throughout the episode in case of non deterministic observations or action.
Notes
-----
In order to be reproducible, and to make proper use of the
:func:`BaseAgent.seed` capabilities, you must absolutely NOT use the `random` python module (which will not
be seeded) nor the `np.random` module and avoid any other "sources" of pseudo random numbers.
You can adapt your code the following way. Instead of using `np.random` use `self.space_prng`.
For example, if you wanted to write
`np.random.randint(1,5)` replace it by `self.space_prng.randint(1,5)`. It is the same for `np.random.normal()`
that is
replaced by `self.space_prng.normal()`.
You have an example of such usage in :func:`RandomAgent.my_act`.
If you really need other sources of randomness (for example if you use tensorflow or torch) we strongly
recommend you to overload the :func:`BaseAgent.seed` accordingly so that the neural networks are always initialized
in the same order using the same weights.
"""
def __init__(self):
self.space_prng = np.random.RandomState()
self.seed_used = None
def seed(self, seed):
"""
Set the seed of the source of pseudo random number used for this RandomObject.
Parameters
----------
seed: ``int``
The seed to be set.
Returns
-------
res: ``tuple``
The associated tuple of seeds used. Tuples are returned because in some cases, multiple objects are seeded
with the same call to :func:`RandomObject.seed`
"""
self.seed_used = seed
if self.seed_used is not None:
# in this case i have specific seed set. So i force the seed to be deterministic.
self.space_prng.seed(seed=self.seed_used)
return self.seed_used,