kaggle-environments 0.2.1__py3-none-any.whl → 1.20.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of kaggle-environments might be problematic. Click here for more details.
- kaggle_environments/__init__.py +49 -13
- kaggle_environments/agent.py +177 -124
- kaggle_environments/api.py +31 -0
- kaggle_environments/core.py +295 -170
- kaggle_environments/envs/cabt/cabt.js +164 -0
- kaggle_environments/envs/cabt/cabt.json +28 -0
- kaggle_environments/envs/cabt/cabt.py +186 -0
- kaggle_environments/envs/cabt/cg/__init__.py +0 -0
- kaggle_environments/envs/cabt/cg/cg.dll +0 -0
- kaggle_environments/envs/cabt/cg/game.py +75 -0
- kaggle_environments/envs/cabt/cg/libcg.so +0 -0
- kaggle_environments/envs/cabt/cg/sim.py +48 -0
- kaggle_environments/envs/cabt/test_cabt.py +120 -0
- kaggle_environments/envs/chess/chess.js +4289 -0
- kaggle_environments/envs/chess/chess.json +60 -0
- kaggle_environments/envs/chess/chess.py +4241 -0
- kaggle_environments/envs/chess/test_chess.py +60 -0
- kaggle_environments/envs/connectx/connectx.ipynb +3186 -0
- kaggle_environments/envs/connectx/connectx.js +1 -1
- kaggle_environments/envs/connectx/connectx.json +15 -1
- kaggle_environments/envs/connectx/connectx.py +6 -23
- kaggle_environments/envs/connectx/test_connectx.py +70 -24
- kaggle_environments/envs/football/football.ipynb +75 -0
- kaggle_environments/envs/football/football.json +91 -0
- kaggle_environments/envs/football/football.py +277 -0
- kaggle_environments/envs/football/helpers.py +95 -0
- kaggle_environments/envs/football/test_football.py +360 -0
- kaggle_environments/envs/halite/__init__.py +0 -0
- kaggle_environments/envs/halite/halite.ipynb +44741 -0
- kaggle_environments/envs/halite/halite.js +199 -83
- kaggle_environments/envs/halite/halite.json +31 -18
- kaggle_environments/envs/halite/halite.py +164 -303
- kaggle_environments/envs/halite/helpers.py +720 -0
- kaggle_environments/envs/halite/test_halite.py +190 -0
- kaggle_environments/envs/hungry_geese/__init__.py +0 -0
- kaggle_environments/envs/{battlegeese/battlegeese.js → hungry_geese/hungry_geese.js} +38 -22
- kaggle_environments/envs/{battlegeese/battlegeese.json → hungry_geese/hungry_geese.json} +21 -14
- kaggle_environments/envs/hungry_geese/hungry_geese.py +316 -0
- kaggle_environments/envs/hungry_geese/test_hungry_geese.py +0 -0
- kaggle_environments/envs/identity/identity.json +6 -5
- kaggle_environments/envs/identity/identity.py +15 -2
- kaggle_environments/envs/kore_fleets/__init__.py +0 -0
- kaggle_environments/envs/kore_fleets/helpers.py +1005 -0
- kaggle_environments/envs/kore_fleets/kore_fleets.ipynb +114 -0
- kaggle_environments/envs/kore_fleets/kore_fleets.js +658 -0
- kaggle_environments/envs/kore_fleets/kore_fleets.json +164 -0
- kaggle_environments/envs/kore_fleets/kore_fleets.py +555 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/Bot.java +54 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/README.md +26 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/jars/hamcrest-core-1.3.jar +0 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/jars/junit-4.13.2.jar +0 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Board.java +518 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Cell.java +61 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Configuration.java +24 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Direction.java +166 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Fleet.java +72 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/KoreJson.java +97 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Observation.java +72 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Pair.java +13 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Player.java +68 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Point.java +65 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Shipyard.java +70 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/kore/ShipyardAction.java +59 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/main.py +73 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/BoardTest.java +567 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/ConfigurationTest.java +25 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/KoreJsonTest.java +62 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/ObservationTest.java +46 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/PointTest.java +21 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/ShipyardTest.java +22 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/configuration.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/fullob.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/java/test/observation.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/python/__init__.py +0 -0
- kaggle_environments/envs/kore_fleets/starter_bots/python/main.py +27 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/Bot.ts +34 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/DoNothingBot.ts +12 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/MinerBot.ts +62 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/README.md +55 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/interpreter.ts +402 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Board.ts +514 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Cell.ts +63 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Configuration.ts +25 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Direction.ts +169 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Fleet.ts +76 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/KoreIO.ts +70 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Observation.ts +45 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Pair.ts +11 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Player.ts +68 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Point.ts +65 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Shipyard.ts +72 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/ShipyardAction.ts +58 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/main.py +73 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/miner.py +73 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/package.json +23 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/BoardTest.ts +551 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ConfigurationTest.ts +16 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ObservationTest.ts +33 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/PointTest.ts +17 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ShipyardTest.ts +18 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/configuration.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/fullob.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/test/observation.json +1 -0
- kaggle_environments/envs/kore_fleets/starter_bots/ts/tsconfig.json +22 -0
- kaggle_environments/envs/kore_fleets/test_kore_fleets.py +331 -0
- kaggle_environments/envs/lux_ai_2021/README.md +3 -0
- kaggle_environments/envs/lux_ai_2021/__init__.py +0 -0
- kaggle_environments/envs/lux_ai_2021/agents.py +11 -0
- kaggle_environments/envs/lux_ai_2021/dimensions/754.js +2 -0
- kaggle_environments/envs/lux_ai_2021/dimensions/754.js.LICENSE.txt +296 -0
- kaggle_environments/envs/lux_ai_2021/dimensions/main.js +1 -0
- kaggle_environments/envs/lux_ai_2021/index.html +43 -0
- kaggle_environments/envs/lux_ai_2021/lux_ai_2021.json +100 -0
- kaggle_environments/envs/lux_ai_2021/lux_ai_2021.py +231 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/__init__.py +0 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.js +6 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.json +59 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_objects.js +145 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/io.js +14 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/kit.js +209 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/map.js +107 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/parser.js +79 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.js +88 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.py +75 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/simple.tar.gz +0 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/__init__.py +0 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/annotate.py +20 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/constants.py +25 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game.py +86 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.json +59 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.py +7 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_map.py +106 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_objects.py +154 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/random_agent.py +38 -0
- kaggle_environments/envs/lux_ai_2021/test_agents/python/simple_agent.py +82 -0
- kaggle_environments/envs/lux_ai_2021/test_lux.py +19 -0
- kaggle_environments/envs/lux_ai_2021/testing.md +23 -0
- kaggle_environments/envs/lux_ai_2021/todo.md.og +18 -0
- kaggle_environments/envs/lux_ai_s3/README.md +21 -0
- kaggle_environments/envs/lux_ai_s3/agents.py +5 -0
- kaggle_environments/envs/lux_ai_s3/index.html +42 -0
- kaggle_environments/envs/lux_ai_s3/lux_ai_s3.json +47 -0
- kaggle_environments/envs/lux_ai_s3/lux_ai_s3.py +178 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/__init__.py +1 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/env.py +819 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/globals.py +9 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/params.py +101 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/profiler.py +141 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/pygame_render.py +222 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/spaces.py +27 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/state.py +464 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/utils.py +12 -0
- kaggle_environments/envs/lux_ai_s3/luxai_s3/wrappers.py +156 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/agent.py +78 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/__init__.py +0 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/kit.py +31 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/utils.py +17 -0
- kaggle_environments/envs/lux_ai_s3/test_agents/python/main.py +66 -0
- kaggle_environments/envs/lux_ai_s3/test_lux.py +9 -0
- kaggle_environments/envs/mab/__init__.py +0 -0
- kaggle_environments/envs/mab/agents.py +12 -0
- kaggle_environments/envs/mab/mab.js +100 -0
- kaggle_environments/envs/mab/mab.json +74 -0
- kaggle_environments/envs/mab/mab.py +146 -0
- kaggle_environments/envs/open_spiel/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/chess/chess.js +441 -0
- kaggle_environments/envs/open_spiel/games/chess/image_config.jsonl +20 -0
- kaggle_environments/envs/open_spiel/games/chess/openings.jsonl +20 -0
- kaggle_environments/envs/open_spiel/games/connect_four/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/connect_four/connect_four.js +284 -0
- kaggle_environments/envs/open_spiel/games/connect_four/connect_four_proxy.py +86 -0
- kaggle_environments/envs/open_spiel/games/go/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/go/go.js +481 -0
- kaggle_environments/envs/open_spiel/games/go/go_proxy.py +99 -0
- kaggle_environments/envs/open_spiel/games/tic_tac_toe/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe.js +345 -0
- kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe_proxy.py +98 -0
- kaggle_environments/envs/open_spiel/games/universal_poker/__init__.py +0 -0
- kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker.js +431 -0
- kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker_proxy.py +159 -0
- kaggle_environments/envs/open_spiel/html_playthrough_generator.py +31 -0
- kaggle_environments/envs/open_spiel/observation.py +128 -0
- kaggle_environments/envs/open_spiel/open_spiel.py +565 -0
- kaggle_environments/envs/open_spiel/proxy.py +138 -0
- kaggle_environments/envs/open_spiel/test_open_spiel.py +191 -0
- kaggle_environments/envs/rps/__init__.py +0 -0
- kaggle_environments/envs/rps/agents.py +84 -0
- kaggle_environments/envs/rps/helpers.py +25 -0
- kaggle_environments/envs/rps/rps.js +117 -0
- kaggle_environments/envs/rps/rps.json +63 -0
- kaggle_environments/envs/rps/rps.py +90 -0
- kaggle_environments/envs/rps/test_rps.py +110 -0
- kaggle_environments/envs/rps/utils.py +7 -0
- kaggle_environments/envs/tictactoe/test_tictactoe.py +43 -77
- kaggle_environments/envs/tictactoe/tictactoe.ipynb +1397 -0
- kaggle_environments/envs/tictactoe/tictactoe.json +10 -2
- kaggle_environments/envs/tictactoe/tictactoe.py +1 -1
- kaggle_environments/errors.py +2 -4
- kaggle_environments/helpers.py +377 -0
- kaggle_environments/main.py +340 -0
- kaggle_environments/schemas.json +23 -18
- kaggle_environments/static/player.html +206 -74
- kaggle_environments/utils.py +46 -73
- kaggle_environments-1.20.0.dist-info/METADATA +25 -0
- kaggle_environments-1.20.0.dist-info/RECORD +211 -0
- {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.0.dist-info}/WHEEL +1 -2
- kaggle_environments-1.20.0.dist-info/entry_points.txt +3 -0
- kaggle_environments/envs/battlegeese/battlegeese.py +0 -223
- kaggle_environments/temp.py +0 -14
- kaggle_environments-0.2.1.dist-info/METADATA +0 -393
- kaggle_environments-0.2.1.dist-info/RECORD +0 -32
- kaggle_environments-0.2.1.dist-info/entry_points.txt +0 -3
- kaggle_environments-0.2.1.dist-info/top_level.txt +0 -1
- {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.0.dist-info/licenses}/LICENSE +0 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"""OpenSpiel Game and State proxies.
|
|
2
|
+
|
|
3
|
+
Proxies that act as a pyspiel.State/Game by wrapping the original object and
|
|
4
|
+
forwarding calls. Subclassing allows to override specific methods or add
|
|
5
|
+
additional functionality, or payload to the State/Game object.
|
|
6
|
+
|
|
7
|
+
WARNING: Serialization of proxy games and states is not supported.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
import pyspiel
|
|
13
|
+
|
|
14
|
+
from . import observation
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class State(pyspiel.State):
|
|
18
|
+
"""Base class for a pyspiel.State proxy."""
|
|
19
|
+
|
|
20
|
+
def __init__(self, wrapped: pyspiel.State, game: "Game"):
|
|
21
|
+
super().__init__(game)
|
|
22
|
+
self.__wrapped__ = wrapped
|
|
23
|
+
|
|
24
|
+
def current_player(self) -> int:
|
|
25
|
+
return self.__wrapped__.current_player()
|
|
26
|
+
|
|
27
|
+
def _legal_actions(self, player: int) -> list[int]:
|
|
28
|
+
return self.__wrapped__.legal_actions(player)
|
|
29
|
+
|
|
30
|
+
def _apply_action(self, action: int) -> None:
|
|
31
|
+
return self.__wrapped__.apply_action(action)
|
|
32
|
+
|
|
33
|
+
def _action_to_string(self, player: int, action: int) -> str:
|
|
34
|
+
return self.__wrapped__.action_to_string(player, action)
|
|
35
|
+
|
|
36
|
+
def chance_outcomes(self) -> list[tuple[int, float]]:
|
|
37
|
+
return self.__wrapped__.chance_outcomes()
|
|
38
|
+
|
|
39
|
+
def is_terminal(self) -> bool:
|
|
40
|
+
return self.__wrapped__.is_terminal()
|
|
41
|
+
|
|
42
|
+
def returns(self) -> list[float]:
|
|
43
|
+
return self.__wrapped__.returns()
|
|
44
|
+
|
|
45
|
+
def rewards(self) -> list[float]:
|
|
46
|
+
return self.__wrapped__.rewards()
|
|
47
|
+
|
|
48
|
+
def __str__(self) -> str:
|
|
49
|
+
return self.__wrapped__.__str__()
|
|
50
|
+
|
|
51
|
+
def to_string(self) -> str:
|
|
52
|
+
return self.__wrapped__.to_string()
|
|
53
|
+
|
|
54
|
+
def __getattr__(self, name: str) -> Any:
|
|
55
|
+
# Escape hatch when proxying Python implementations that have attributes
|
|
56
|
+
# that need to be accessed, e.g. TicTacToeState.board from its observer.
|
|
57
|
+
return object.__getattribute__(self.__wrapped__, name)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class Game(pyspiel.Game):
|
|
61
|
+
"""Base class for a pyspiel.Game proxy."""
|
|
62
|
+
|
|
63
|
+
def __init__(self, wrapped: pyspiel.Game, **kwargs):
|
|
64
|
+
# TODO(hennes): Add serialization.
|
|
65
|
+
game_info = pyspiel.GameInfo(
|
|
66
|
+
num_distinct_actions=wrapped.num_distinct_actions(),
|
|
67
|
+
max_chance_outcomes=wrapped.max_chance_outcomes(),
|
|
68
|
+
num_players=wrapped.num_players(),
|
|
69
|
+
min_utility=wrapped.min_utility(),
|
|
70
|
+
max_utility=wrapped.max_utility(),
|
|
71
|
+
utility_sum=wrapped.utility_sum(),
|
|
72
|
+
max_game_length=wrapped.max_game_length(),
|
|
73
|
+
)
|
|
74
|
+
super().__init__(
|
|
75
|
+
_game_type(wrapped.get_type(), **kwargs),
|
|
76
|
+
game_info,
|
|
77
|
+
wrapped.get_parameters(),
|
|
78
|
+
)
|
|
79
|
+
self.__wrapped__ = wrapped
|
|
80
|
+
|
|
81
|
+
def new_initial_state(self, from_string: str | None = None) -> State:
|
|
82
|
+
args = () if from_string is None else (from_string)
|
|
83
|
+
return State(wrapped=self.__wrapped__.new_initial_state(*args), game=self)
|
|
84
|
+
|
|
85
|
+
def max_chance_nodes_in_history(self) -> int:
|
|
86
|
+
return self.__wrapped__.max_chance_nodes_in_history()
|
|
87
|
+
|
|
88
|
+
def make_py_observer(
|
|
89
|
+
self,
|
|
90
|
+
iig_obs_type: pyspiel.IIGObservationType | None = None,
|
|
91
|
+
params: dict[str, Any] | None = None,
|
|
92
|
+
) -> pyspiel.Observer:
|
|
93
|
+
return _Observation(observation.make_observation(self.__wrapped__, iig_obs_type, params))
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class _Observation(observation._Observation): # pylint: disable=protected-access
|
|
97
|
+
"""_Observation proxy that passes the wrapped state to the observation."""
|
|
98
|
+
|
|
99
|
+
def __init__(self, wrapped: observation._Observation):
|
|
100
|
+
self.__wrapped__ = wrapped
|
|
101
|
+
self.dict = self.__wrapped__.dict
|
|
102
|
+
self.tensor = self.__wrapped__.tensor
|
|
103
|
+
|
|
104
|
+
def set_from(self, state: State, player: int):
|
|
105
|
+
self.__wrapped__.set_from(state.__wrapped__, player)
|
|
106
|
+
|
|
107
|
+
def string_from(self, state: State, player: int) -> str | None:
|
|
108
|
+
return self.__wrapped__.string_from(state.__wrapped__, player)
|
|
109
|
+
|
|
110
|
+
def compress(self) -> Any:
|
|
111
|
+
return self.__wrapped__.compress()
|
|
112
|
+
|
|
113
|
+
def decompress(self, compressed_observation: Any):
|
|
114
|
+
self.__wrapped__.decompress(compressed_observation)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _game_type(game_type: pyspiel.GameType, **overrides) -> pyspiel.GameType:
|
|
118
|
+
"""Returns a GameType with the given overrides."""
|
|
119
|
+
kwargs = dict(
|
|
120
|
+
short_name=game_type.short_name,
|
|
121
|
+
long_name=game_type.long_name,
|
|
122
|
+
dynamics=game_type.dynamics,
|
|
123
|
+
chance_mode=game_type.chance_mode,
|
|
124
|
+
information=game_type.information,
|
|
125
|
+
utility=game_type.utility,
|
|
126
|
+
reward_model=game_type.reward_model,
|
|
127
|
+
max_num_players=game_type.max_num_players,
|
|
128
|
+
min_num_players=game_type.min_num_players,
|
|
129
|
+
provides_information_state_string=game_type.provides_information_state_string,
|
|
130
|
+
provides_information_state_tensor=game_type.provides_information_state_tensor,
|
|
131
|
+
provides_observation_string=game_type.provides_observation_string,
|
|
132
|
+
provides_observation_tensor=game_type.provides_observation_tensor,
|
|
133
|
+
parameter_specification=game_type.parameter_specification,
|
|
134
|
+
default_loadable=game_type.default_loadable,
|
|
135
|
+
provides_factored_observation_string=game_type.provides_factored_observation_string,
|
|
136
|
+
)
|
|
137
|
+
kwargs.update(**overrides)
|
|
138
|
+
return pyspiel.GameType(**kwargs)
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import pathlib
|
|
3
|
+
|
|
4
|
+
import pyspiel
|
|
5
|
+
from absl.testing import absltest
|
|
6
|
+
|
|
7
|
+
from kaggle_environments import make
|
|
8
|
+
|
|
9
|
+
from . import open_spiel as open_spiel_env
|
|
10
|
+
|
|
11
|
+
# Expected that not all pyspiel registered games can be registered as Kaggle
|
|
12
|
+
# envs (e.g. does not yet support simultaneous move games), but should register
|
|
13
|
+
# at least this many
|
|
14
|
+
_REGISTERED_GAMES_THRESHOLD = 50
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class OpenSpielEnvTest(absltest.TestCase):
|
|
18
|
+
def test_envs_load(self):
|
|
19
|
+
envs = open_spiel_env._register_game_envs([game_type.short_name for game_type in pyspiel.registered_games()])
|
|
20
|
+
self.assertTrue(len(envs) > _REGISTERED_GAMES_THRESHOLD)
|
|
21
|
+
|
|
22
|
+
def test_tic_tac_toe_agent_playthrough(self):
|
|
23
|
+
envs = open_spiel_env._register_game_envs(["tic_tac_toe"])
|
|
24
|
+
env = make("open_spiel_tic_tac_toe", debug=True)
|
|
25
|
+
env.run(["random", "random"])
|
|
26
|
+
json = env.toJSON()
|
|
27
|
+
self.assertEqual(json["name"], "open_spiel_tic_tac_toe")
|
|
28
|
+
self.assertTrue(all([status == "DONE" for status in json["statuses"]]))
|
|
29
|
+
|
|
30
|
+
def test_tic_tac_toe_manual_playthrough(self):
|
|
31
|
+
envs = open_spiel_env._register_game_envs(["tic_tac_toe"])
|
|
32
|
+
env = make("open_spiel_tic_tac_toe", debug=True)
|
|
33
|
+
env.reset()
|
|
34
|
+
env.step([{"submission": -1}, {"submission": -1}]) # Initial setup step.
|
|
35
|
+
env.step([{"submission": 0}, {"submission": -1}])
|
|
36
|
+
env.step([{"submission": -1}, {"submission": 1}])
|
|
37
|
+
env.step([{"submission": 3}, {"submission": -1}])
|
|
38
|
+
env.step([{"submission": -1}, {"submission": 4}])
|
|
39
|
+
env.step([{"submission": 6}, {"submission": -1}])
|
|
40
|
+
self.assertTrue(env.done)
|
|
41
|
+
self.assertEqual(env.toJSON()["rewards"], [1, -1])
|
|
42
|
+
|
|
43
|
+
def test_invalid_action(self):
|
|
44
|
+
envs = open_spiel_env._register_game_envs(["tic_tac_toe"])
|
|
45
|
+
env = make("open_spiel_tic_tac_toe", debug=True)
|
|
46
|
+
env.reset()
|
|
47
|
+
for i in range(5): # Try repeatedly applying an illegal action
|
|
48
|
+
env.step(
|
|
49
|
+
[
|
|
50
|
+
{"submission": pyspiel.INVALID_ACTION},
|
|
51
|
+
{"submission": pyspiel.INVALID_ACTION},
|
|
52
|
+
]
|
|
53
|
+
)
|
|
54
|
+
if env.done:
|
|
55
|
+
break
|
|
56
|
+
self.assertEqual(i, 1) # Zeroth step is setup step, should fail next step.
|
|
57
|
+
json = env.toJSON()
|
|
58
|
+
self.assertTrue(all([status == "DONE" for status in json["statuses"]]))
|
|
59
|
+
self.assertEqual(
|
|
60
|
+
json["rewards"],
|
|
61
|
+
[
|
|
62
|
+
open_spiel_env.DEFAULT_INVALID_ACTION_REWARD,
|
|
63
|
+
-open_spiel_env.DEFAULT_INVALID_ACTION_REWARD,
|
|
64
|
+
],
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
def test_serialized_game_and_state(self):
|
|
68
|
+
envs = open_spiel_env._register_game_envs(["tic_tac_toe"])
|
|
69
|
+
env = make("open_spiel_tic_tac_toe", debug=True)
|
|
70
|
+
env.reset()
|
|
71
|
+
env.step([{"submission": -1}, {"submission": -1}]) # Initial setup step.
|
|
72
|
+
kaggle_state = env.step([{"submission": 0}, {"submission": -1}])
|
|
73
|
+
serialize_game_and_state = kaggle_state[1]["observation"]["serializedGameAndState"]
|
|
74
|
+
game, state = pyspiel.deserialize_game_and_state(serialize_game_and_state)
|
|
75
|
+
self.assertEqual(game.get_type().short_name, "tic_tac_toe_proxy")
|
|
76
|
+
self.assertEqual(state.history(), [0])
|
|
77
|
+
|
|
78
|
+
def test_agent_error(self):
|
|
79
|
+
envs = open_spiel_env._register_game_envs(["tic_tac_toe"])
|
|
80
|
+
env = make("open_spiel_tic_tac_toe", debug=True)
|
|
81
|
+
env.reset()
|
|
82
|
+
# Setup step
|
|
83
|
+
env.step(
|
|
84
|
+
[
|
|
85
|
+
{"submission": pyspiel.INVALID_ACTION},
|
|
86
|
+
{"submission": pyspiel.INVALID_ACTION},
|
|
87
|
+
]
|
|
88
|
+
)
|
|
89
|
+
env.step(
|
|
90
|
+
[
|
|
91
|
+
{"submission": open_spiel_env.AGENT_ERROR_ACTION},
|
|
92
|
+
{"submission": pyspiel.INVALID_ACTION},
|
|
93
|
+
]
|
|
94
|
+
)
|
|
95
|
+
self.assertTrue(env.done)
|
|
96
|
+
json = env.toJSON()
|
|
97
|
+
self.assertEqual(json["rewards"], [None, None])
|
|
98
|
+
self.assertEqual(json["statuses"], ["ERROR", "ERROR"])
|
|
99
|
+
|
|
100
|
+
def test_initial_actions(self):
|
|
101
|
+
open_spiel_env._register_game_envs(["tic_tac_toe"])
|
|
102
|
+
env = make(
|
|
103
|
+
"open_spiel_tic_tac_toe",
|
|
104
|
+
{"initialActions": [0, 1, 3, 4]},
|
|
105
|
+
debug=True,
|
|
106
|
+
)
|
|
107
|
+
env.reset()
|
|
108
|
+
# Setup step
|
|
109
|
+
env.step(
|
|
110
|
+
[
|
|
111
|
+
{"submission": pyspiel.INVALID_ACTION},
|
|
112
|
+
{"submission": pyspiel.INVALID_ACTION},
|
|
113
|
+
]
|
|
114
|
+
)
|
|
115
|
+
env.step(
|
|
116
|
+
[
|
|
117
|
+
{"submission": 2},
|
|
118
|
+
{"submission": pyspiel.INVALID_ACTION},
|
|
119
|
+
]
|
|
120
|
+
)
|
|
121
|
+
env.step(
|
|
122
|
+
[
|
|
123
|
+
{"submission": pyspiel.INVALID_ACTION},
|
|
124
|
+
{"submission": 7},
|
|
125
|
+
]
|
|
126
|
+
)
|
|
127
|
+
self.assertTrue(env.done)
|
|
128
|
+
json_playthrough = env.toJSON()
|
|
129
|
+
self.assertEqual(json_playthrough["rewards"], [-1, 1])
|
|
130
|
+
|
|
131
|
+
def test_chess_openings_manually_configured(self):
|
|
132
|
+
open_spiel_env._register_game_envs(["chess"])
|
|
133
|
+
openings_path = pathlib.Path(
|
|
134
|
+
open_spiel_env.GAMES_DIR,
|
|
135
|
+
"chess/openings.jsonl",
|
|
136
|
+
)
|
|
137
|
+
self.assertTrue(openings_path.is_file())
|
|
138
|
+
with open(openings_path, "r", encoding="utf-8") as f:
|
|
139
|
+
for line in f:
|
|
140
|
+
opening = json.loads(line)
|
|
141
|
+
config = {
|
|
142
|
+
"initialActions": opening.pop("initialActions"),
|
|
143
|
+
"metadata": opening,
|
|
144
|
+
}
|
|
145
|
+
env = make(
|
|
146
|
+
"open_spiel_chess",
|
|
147
|
+
config,
|
|
148
|
+
debug=True,
|
|
149
|
+
)
|
|
150
|
+
env.reset()
|
|
151
|
+
# Setup step
|
|
152
|
+
env.step(
|
|
153
|
+
[
|
|
154
|
+
{"submission": pyspiel.INVALID_ACTION},
|
|
155
|
+
{"submission": pyspiel.INVALID_ACTION},
|
|
156
|
+
]
|
|
157
|
+
)
|
|
158
|
+
obs = env.state[0]["observation"]
|
|
159
|
+
_, state = pyspiel.deserialize_game_and_state(obs["serializedGameAndState"])
|
|
160
|
+
self.assertEqual(str(state), opening["fen"])
|
|
161
|
+
self.assertEqual(str(state), env.toJSON()["configuration"]["metadata"]["fen"])
|
|
162
|
+
|
|
163
|
+
def test_chess_openings_configured_with_seed(self):
|
|
164
|
+
open_spiel_env._register_game_envs(["chess"])
|
|
165
|
+
config = {
|
|
166
|
+
"useImage": True,
|
|
167
|
+
"seed": 1,
|
|
168
|
+
}
|
|
169
|
+
env = make(
|
|
170
|
+
"open_spiel_chess",
|
|
171
|
+
config,
|
|
172
|
+
debug=True,
|
|
173
|
+
)
|
|
174
|
+
env.reset()
|
|
175
|
+
# Image config is loaded during setup step.
|
|
176
|
+
self.assertFalse("imageConfig" in env.configuration)
|
|
177
|
+
# Setup step
|
|
178
|
+
env.step(
|
|
179
|
+
[
|
|
180
|
+
{"submission": pyspiel.INVALID_ACTION},
|
|
181
|
+
{"submission": pyspiel.INVALID_ACTION},
|
|
182
|
+
]
|
|
183
|
+
)
|
|
184
|
+
self.assertTrue("imageConfig" in env.configuration)
|
|
185
|
+
self.assertEqual(env.configuration["imageConfig"]["color"], "blue")
|
|
186
|
+
self.assertEqual(env.configuration["imageConfig"]["pieceSet"], "cardinal")
|
|
187
|
+
self.assertTrue("imageConfig" in env.state[0]["observation"])
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
if __name__ == "__main__":
|
|
191
|
+
absltest.main()
|
|
File without changes
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import random
|
|
2
|
+
|
|
3
|
+
from .utils import get_score
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def rock(observation, configuration):
|
|
7
|
+
return 0
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def paper(observation, configuration):
|
|
11
|
+
return 1
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def scissors(observation, configuration):
|
|
15
|
+
return 2
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def copy_opponent(observation, configuration):
|
|
19
|
+
if observation.step > 0:
|
|
20
|
+
return observation.lastOpponentAction
|
|
21
|
+
else:
|
|
22
|
+
return random.randrange(0, configuration.signs)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
last_react_action = None
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def reactionary(observation, configuration):
|
|
29
|
+
global last_react_action
|
|
30
|
+
if observation.step == 0:
|
|
31
|
+
last_react_action = random.randrange(0, configuration.signs)
|
|
32
|
+
elif get_score(last_react_action, observation.lastOpponentAction) <= 1:
|
|
33
|
+
last_react_action = (observation.lastOpponentAction + 1) % configuration.signs
|
|
34
|
+
|
|
35
|
+
return last_react_action
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
last_counter_action = None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def counter_reactionary(observation, configuration):
|
|
42
|
+
global last_counter_action
|
|
43
|
+
if observation.step == 0:
|
|
44
|
+
last_counter_action = random.randrange(0, configuration.signs)
|
|
45
|
+
elif get_score(last_counter_action, observation.lastOpponentAction) == 1:
|
|
46
|
+
last_counter_action = (last_counter_action + 2) % configuration.signs
|
|
47
|
+
else:
|
|
48
|
+
last_counter_action = (observation.lastOpponentAction + 1) % configuration.signs
|
|
49
|
+
|
|
50
|
+
return last_counter_action
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
action_histogram = {}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def statistical(observation, configuration):
|
|
57
|
+
global action_histogram
|
|
58
|
+
if observation.step == 0:
|
|
59
|
+
action_histogram = {}
|
|
60
|
+
return
|
|
61
|
+
action = observation.lastOpponentAction
|
|
62
|
+
if action not in action_histogram:
|
|
63
|
+
action_histogram[action] = 0
|
|
64
|
+
action_histogram[action] += 1
|
|
65
|
+
mode_action = None
|
|
66
|
+
mode_action_count = None
|
|
67
|
+
for k, v in action_histogram.items():
|
|
68
|
+
if mode_action_count is None or v > mode_action_count:
|
|
69
|
+
mode_action = k
|
|
70
|
+
mode_action_count = v
|
|
71
|
+
continue
|
|
72
|
+
|
|
73
|
+
return (mode_action + 1) % configuration.signs
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
agents = {
|
|
77
|
+
"rock": rock,
|
|
78
|
+
"paper": paper,
|
|
79
|
+
"scissors": scissors,
|
|
80
|
+
"copy_opponent": copy_opponent,
|
|
81
|
+
"reactionary": reactionary,
|
|
82
|
+
"counter_reactionary": counter_reactionary,
|
|
83
|
+
"statistical": statistical,
|
|
84
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from kaggle_environments.helpers import *
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Observation(Observation):
|
|
5
|
+
"""
|
|
6
|
+
Observation primarily used as a helper to construct the State from the raw observation.
|
|
7
|
+
This provides bindings for the observation type described at https://github.com/Kaggle/kaggle-environments/blob/master/kaggle_environments/envs/rps/rps.json
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
@property
|
|
11
|
+
def last_opponent_action(self) -> int:
|
|
12
|
+
"""Move the opponent took on the last turn."""
|
|
13
|
+
return self["halite"]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Configuration(Configuration):
|
|
17
|
+
"""
|
|
18
|
+
Configuration provides access to tunable parameters in the environment.
|
|
19
|
+
This provides bindings for the configuration type described at https://github.com/Kaggle/kaggle-environments/blob/master/kaggle_environments/envs/rps/rps.json
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def signs(self) -> int:
|
|
24
|
+
"""Number of choices each step (3 for the normal rock, paper, scissors)"""
|
|
25
|
+
return self["signs"]
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
async function renderer(context) {
|
|
2
|
+
const {
|
|
3
|
+
act,
|
|
4
|
+
agents,
|
|
5
|
+
environment,
|
|
6
|
+
frame,
|
|
7
|
+
height = 400,
|
|
8
|
+
interactive,
|
|
9
|
+
isInteractive,
|
|
10
|
+
parent,
|
|
11
|
+
step,
|
|
12
|
+
update,
|
|
13
|
+
width = 400,
|
|
14
|
+
} = context;
|
|
15
|
+
|
|
16
|
+
const sign_names = ["Rock", "Paper", "Scissors", "Spock", "Lizard"]
|
|
17
|
+
const sign_icons = ["\u{1f44a}", "\u{270b}", "\u{2702}\u{fe0f}", "\u{1f596}", "\u{1f98e}"]
|
|
18
|
+
|
|
19
|
+
// Common Dimensions.
|
|
20
|
+
const maxWidth = 960;
|
|
21
|
+
const maxHeight = 280;
|
|
22
|
+
const canvasSize = Math.min(height, width);
|
|
23
|
+
const unit = 8;
|
|
24
|
+
const offset = canvasSize > 400 ? canvasSize * 0.1 : unit / 2;
|
|
25
|
+
const cellSize = (canvasSize - offset * 2) / 3;
|
|
26
|
+
|
|
27
|
+
// Canvas Setup.
|
|
28
|
+
let canvas = parent.querySelector("canvas");
|
|
29
|
+
if (!canvas) {
|
|
30
|
+
canvas = document.createElement("canvas");
|
|
31
|
+
parent.appendChild(canvas);
|
|
32
|
+
|
|
33
|
+
if (interactive) {
|
|
34
|
+
canvas.addEventListener("click", evt => {
|
|
35
|
+
if (!isInteractive()) return;
|
|
36
|
+
const rect = evt.target.getBoundingClientRect();
|
|
37
|
+
const x = evt.clientX - rect.left - offset;
|
|
38
|
+
const y = evt.clientY - rect.top - offset;
|
|
39
|
+
act(Math.floor(x / cellSize) + Math.floor(y / cellSize) * 3);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
canvas.style.cursor = isInteractive() ? "pointer" : "default";
|
|
45
|
+
|
|
46
|
+
// Canvas setup and reset.
|
|
47
|
+
let c = canvas.getContext("2d");
|
|
48
|
+
canvas.width = Math.min(maxWidth, width);
|
|
49
|
+
canvas.height = Math.min(maxHeight, height);
|
|
50
|
+
c.clearRect(0, 0, canvas.width, canvas.height);
|
|
51
|
+
|
|
52
|
+
// ------------------------------------------------------------------------------------//
|
|
53
|
+
|
|
54
|
+
if (step < environment.steps.length - 1) {
|
|
55
|
+
const state = environment.steps[step + 1]
|
|
56
|
+
const last_state = environment.steps[step]
|
|
57
|
+
const delta_reward = state[0].reward - last_state[0].reward
|
|
58
|
+
|
|
59
|
+
const p1_move = state[1].observation.lastOpponentAction;
|
|
60
|
+
const p2_move = state[0].observation.lastOpponentAction;
|
|
61
|
+
|
|
62
|
+
const info = environment.info;
|
|
63
|
+
const player1_text = info?.TeamNames?.[0] || "Player 1";
|
|
64
|
+
const player2_text = info?.TeamNames?.[1] || "Player 2";
|
|
65
|
+
|
|
66
|
+
const ctx = canvas.getContext("2d");
|
|
67
|
+
const padding = 20;
|
|
68
|
+
const row_width = (Math.min(maxWidth, width) - padding * 2) / 3;
|
|
69
|
+
const label_x = padding;
|
|
70
|
+
const player1_x = padding + row_width;
|
|
71
|
+
const player2_x = padding + 2 * row_width;
|
|
72
|
+
const middle_x = padding + row_width * 1.5;
|
|
73
|
+
const label_y = 40;
|
|
74
|
+
const sign_id_y = 80;
|
|
75
|
+
const sign_name_y = 120;
|
|
76
|
+
const sign_icon_y = 160;
|
|
77
|
+
const result_y = 200;
|
|
78
|
+
const score_y = 240;
|
|
79
|
+
|
|
80
|
+
ctx.font = "30px sans-serif";
|
|
81
|
+
ctx.fillStyle = "#FFFFFF";
|
|
82
|
+
|
|
83
|
+
// Player Row
|
|
84
|
+
ctx.fillText(player1_text, player1_x, label_y)
|
|
85
|
+
ctx.fillText(player2_text, player2_x, label_y)
|
|
86
|
+
|
|
87
|
+
// Action Id Row
|
|
88
|
+
ctx.fillText("Action:", label_x, sign_id_y);
|
|
89
|
+
ctx.fillText(p1_move, player1_x, sign_id_y);
|
|
90
|
+
ctx.fillText(p2_move, player2_x, sign_id_y);
|
|
91
|
+
|
|
92
|
+
// Action Name Row
|
|
93
|
+
ctx.fillText("Name:", label_x, sign_name_y);
|
|
94
|
+
ctx.fillText(sign_names[p1_move], player1_x, sign_name_y);
|
|
95
|
+
ctx.fillText(sign_names[p2_move], player2_x, sign_name_y);
|
|
96
|
+
|
|
97
|
+
// Emoji Row
|
|
98
|
+
ctx.fillText("Icon:", label_x, sign_icon_y);
|
|
99
|
+
ctx.fillText(sign_icons[p1_move], player1_x, sign_icon_y);
|
|
100
|
+
ctx.fillText(sign_icons[p2_move], player2_x, sign_icon_y);
|
|
101
|
+
|
|
102
|
+
// Result Row
|
|
103
|
+
ctx.fillText("Result:", label_x, result_y);
|
|
104
|
+
if (delta_reward === 1) {
|
|
105
|
+
ctx.fillText("Win", player1_x, result_y);
|
|
106
|
+
} else if (delta_reward === -1) {
|
|
107
|
+
ctx.fillText("Win", player2_x, result_y);
|
|
108
|
+
} else {
|
|
109
|
+
ctx.fillText("Tie", middle_x, result_y);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Reward Row
|
|
113
|
+
ctx.fillText("Reward:", label_x, score_y);
|
|
114
|
+
ctx.fillText(state[0].reward, player1_x, score_y);
|
|
115
|
+
ctx.fillText(state[1].reward, player2_x, score_y);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "rps",
|
|
3
|
+
"title": "Rock Paper Scissors",
|
|
4
|
+
"description": "Repeated Rock Paper Scissors",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"agents": [2],
|
|
7
|
+
"configuration": {
|
|
8
|
+
"signs": {
|
|
9
|
+
"description": "Number of choices each step (Rock = 0, Paper = 1, Scissors = 2, etc).",
|
|
10
|
+
"type": "integer",
|
|
11
|
+
"minimum": 3,
|
|
12
|
+
"maximum": 5,
|
|
13
|
+
"default": 3
|
|
14
|
+
},
|
|
15
|
+
"episodeSteps": {
|
|
16
|
+
"description": "Maximum number of steps the environment can run. Total is this number -1.",
|
|
17
|
+
"type": "integer",
|
|
18
|
+
"minimum": 2,
|
|
19
|
+
"default": 1000
|
|
20
|
+
},
|
|
21
|
+
"tieRewardThreshold": {
|
|
22
|
+
"description": "Minimum reward needed to achieve a win rather than a tie.",
|
|
23
|
+
"type": "integer",
|
|
24
|
+
"minimum": 1,
|
|
25
|
+
"maximum": 1000,
|
|
26
|
+
"default": 20
|
|
27
|
+
},
|
|
28
|
+
"agentTimeout": {
|
|
29
|
+
"description": "Obsolete field kept for backwards compatibility, please use observation.remainingOverageTime.",
|
|
30
|
+
"type": "number",
|
|
31
|
+
"minimum": 0,
|
|
32
|
+
"default": 60
|
|
33
|
+
},
|
|
34
|
+
"actTimeout": 1
|
|
35
|
+
},
|
|
36
|
+
"reward": {
|
|
37
|
+
"description": "-1 = Lost, 0 = Draw, 1 = Won",
|
|
38
|
+
"enum": [-1, 0, 1],
|
|
39
|
+
"default": 0
|
|
40
|
+
},
|
|
41
|
+
"observation": {
|
|
42
|
+
"lastOpponentAction": {
|
|
43
|
+
"description": "Symbol returned by opponent last step. None on the first step.",
|
|
44
|
+
"type": "integer",
|
|
45
|
+
"minimum": 0,
|
|
46
|
+
"maximum": 4
|
|
47
|
+
},
|
|
48
|
+
"remainingOverageTime": 60,
|
|
49
|
+
"reward": {
|
|
50
|
+
"description": "Current reward of the agent.",
|
|
51
|
+
"type": "integer",
|
|
52
|
+
"minimum": -999,
|
|
53
|
+
"maximum": 999,
|
|
54
|
+
"default": 0
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"action": {
|
|
58
|
+
"description": "Choice of sign for the step (Rock = 0, Paper = 1, Scissors = 2, etc)",
|
|
59
|
+
"type": "integer",
|
|
60
|
+
"minimum": 0,
|
|
61
|
+
"maximum": 4
|
|
62
|
+
}
|
|
63
|
+
}
|