kaggle-environments 0.2.1__py3-none-any.whl → 1.20.1__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-0.2.1.dist-info → kaggle_environments-1.20.1.dist-info}/METADATA +36 -114
- kaggle_environments-1.20.1.dist-info/RECORD +211 -0
- {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.1.dist-info}/WHEEL +1 -2
- kaggle_environments-1.20.1.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/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.1.dist-info/licenses}/LICENSE +0 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from os import path
|
|
3
|
+
|
|
4
|
+
from .agents import agents as all_agents
|
|
5
|
+
from .utils import get_score
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def interpreter(state, env):
|
|
9
|
+
player1 = state[0]
|
|
10
|
+
player2 = state[1]
|
|
11
|
+
|
|
12
|
+
# Specification can fully handle the reset.
|
|
13
|
+
if env.done:
|
|
14
|
+
return state
|
|
15
|
+
|
|
16
|
+
def is_valid_action(player, sign_count):
|
|
17
|
+
return player.action is not None and isinstance(player.action, int) and 0 <= player.action < sign_count
|
|
18
|
+
|
|
19
|
+
# Check for validity of actions
|
|
20
|
+
is_player1_valid = is_valid_action(player1, env.configuration.signs)
|
|
21
|
+
is_player2_valid = is_valid_action(player2, env.configuration.signs)
|
|
22
|
+
if not is_player2_valid:
|
|
23
|
+
player2.status = "INVALID"
|
|
24
|
+
player2.reward = 0
|
|
25
|
+
|
|
26
|
+
if is_player1_valid:
|
|
27
|
+
player1.status = "DONE"
|
|
28
|
+
player1.reward = 1
|
|
29
|
+
return state
|
|
30
|
+
|
|
31
|
+
if not is_player1_valid:
|
|
32
|
+
player1.status = "INVALID"
|
|
33
|
+
player1.reward = 0
|
|
34
|
+
|
|
35
|
+
if is_player2_valid:
|
|
36
|
+
player2.status = "DONE"
|
|
37
|
+
player2.reward = 1
|
|
38
|
+
return state
|
|
39
|
+
else:
|
|
40
|
+
return state
|
|
41
|
+
|
|
42
|
+
score = get_score(player1.action, player2.action)
|
|
43
|
+
player1.observation.lastOpponentAction = player2.action
|
|
44
|
+
player1.reward += score
|
|
45
|
+
player2.observation.lastOpponentAction = player1.action
|
|
46
|
+
player2.reward -= score
|
|
47
|
+
player1.observation.reward = int(player1.reward)
|
|
48
|
+
player2.observation.reward = int(player2.reward)
|
|
49
|
+
remaining_steps = env.configuration.episodeSteps - player1.observation.step - 1
|
|
50
|
+
|
|
51
|
+
# This is the last step
|
|
52
|
+
if remaining_steps <= 1:
|
|
53
|
+
player1.status = "DONE"
|
|
54
|
+
player2.status = "DONE"
|
|
55
|
+
# Player performance too similar, consider the match a tie.
|
|
56
|
+
if abs(player1.reward) < env.configuration.tieRewardThreshold:
|
|
57
|
+
player1.reward = 0
|
|
58
|
+
player2.reward = 0
|
|
59
|
+
return state
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def renderer(state, env):
|
|
63
|
+
sign_names = ["Rock", "Paper", "Scissors", "Spock", "Lizard"]
|
|
64
|
+
rounds_played = len(env.steps)
|
|
65
|
+
board = ""
|
|
66
|
+
|
|
67
|
+
# This line prints results each round, good for debugging
|
|
68
|
+
for i in range(1, rounds_played):
|
|
69
|
+
step = env.steps[i]
|
|
70
|
+
right_move = step[0].observation.lastOpponentAction
|
|
71
|
+
left_move = step[1].observation.lastOpponentAction
|
|
72
|
+
board += f"Round {i}: {sign_names[left_move]} vs {sign_names[right_move]}, Score: {step[0].reward} to {step[1].reward}\n"
|
|
73
|
+
|
|
74
|
+
board += f"Game ended on round {rounds_played - 1}, final score: {state[0].reward} to {state[0].reward}\n"
|
|
75
|
+
return board
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
dir_path = path.dirname(__file__)
|
|
79
|
+
json_path = path.abspath(path.join(dir_path, "rps.json"))
|
|
80
|
+
with open(json_path) as json_file:
|
|
81
|
+
specification = json.load(json_file)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def html_renderer():
|
|
85
|
+
js_path = path.abspath(path.join(dir_path, "rps.js"))
|
|
86
|
+
with open(js_path, encoding="utf-8") as js_file:
|
|
87
|
+
return js_file.read()
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
agents = all_agents
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
from kaggle_environments import make
|
|
2
|
+
|
|
3
|
+
from .agents import agents, paper, rock
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def negative_move_agent(observation, configuration):
|
|
7
|
+
return -1
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def too_big_sign_agent(observation, configuration):
|
|
11
|
+
return 1000000
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def non_integer_agent(observation, configuration):
|
|
15
|
+
return 0.3
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def none_agent(observation, configuration):
|
|
19
|
+
return None
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_rps_completes():
|
|
23
|
+
env = make("rps", configuration={"episodeSteps": 10, "tieRewardThreshold": 1})
|
|
24
|
+
env.run([rock, rock])
|
|
25
|
+
json = env.toJSON()
|
|
26
|
+
assert json["name"] == "rps"
|
|
27
|
+
assert json["statuses"] == ["DONE", "DONE"]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_all_agents():
|
|
31
|
+
env = make("rps", configuration={"episodeSteps": 3, "tieRewardThreshold": 1})
|
|
32
|
+
for agent in agents:
|
|
33
|
+
env.run([agent, agent])
|
|
34
|
+
json = env.toJSON()
|
|
35
|
+
assert json["statuses"] == ["DONE", "DONE"]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_tie():
|
|
39
|
+
env = make("rps", configuration={"episodeSteps": 3, "tieRewardThreshold": 1})
|
|
40
|
+
env.run([rock, rock])
|
|
41
|
+
assert (
|
|
42
|
+
env.render(mode="ansi")
|
|
43
|
+
== "Round 1: Rock vs Rock, Score: 0 to 0\nRound 2: Rock vs Rock, Score: 0 to 0\nGame ended on round 2, final score: 0 to 0\n"
|
|
44
|
+
)
|
|
45
|
+
json = env.toJSON()
|
|
46
|
+
assert json["rewards"] == [0, 0]
|
|
47
|
+
assert json["statuses"] == ["DONE", "DONE"]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def test_threshold_tie():
|
|
51
|
+
env = make("rps", configuration={"episodeSteps": 3, "tieRewardThreshold": 4})
|
|
52
|
+
env.run([rock, paper])
|
|
53
|
+
assert (
|
|
54
|
+
env.render(mode="ansi")
|
|
55
|
+
== "Round 1: Rock vs Paper, Score: -1.0 to 1.0\nRound 2: Rock vs Paper, Score: 0 to 0\nGame ended on round 2, final score: 0 to 0\n"
|
|
56
|
+
)
|
|
57
|
+
json = env.toJSON()
|
|
58
|
+
assert json["rewards"] == [0, 0]
|
|
59
|
+
assert json["statuses"] == ["DONE", "DONE"]
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_win():
|
|
63
|
+
env = make("rps", configuration={"episodeSteps": 2, "tieRewardThreshold": 1})
|
|
64
|
+
env.run([paper, rock])
|
|
65
|
+
json = env.toJSON()
|
|
66
|
+
print(json)
|
|
67
|
+
assert json["rewards"] == [1, -1]
|
|
68
|
+
assert json["statuses"] == ["DONE", "DONE"]
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def test_loss():
|
|
72
|
+
env = make("rps", configuration={"episodeSteps": 2, "tieRewardThreshold": 1})
|
|
73
|
+
env.run([rock, paper])
|
|
74
|
+
json = env.toJSON()
|
|
75
|
+
assert json["rewards"] == [-1, 1]
|
|
76
|
+
assert json["statuses"] == ["DONE", "DONE"]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def test_negative_move():
|
|
80
|
+
env = make("rps", configuration={"episodeSteps": 10, "tieRewardThreshold": 1})
|
|
81
|
+
env.run([negative_move_agent, rock])
|
|
82
|
+
json = env.toJSON()
|
|
83
|
+
assert json["rewards"] == [None, 1]
|
|
84
|
+
assert json["statuses"] == ["INVALID", "DONE"]
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def test_non_integer_move():
|
|
88
|
+
env = make("rps", configuration={"episodeSteps": 10, "tieRewardThreshold": 1})
|
|
89
|
+
env.run([non_integer_agent, rock])
|
|
90
|
+
json = env.toJSON()
|
|
91
|
+
assert json["rewards"] == [None, 1]
|
|
92
|
+
assert json["statuses"] == ["INVALID", "DONE"]
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def test_too_big_move():
|
|
96
|
+
env = make("rps", configuration={"episodeSteps": 10, "tieRewardThreshold": 1})
|
|
97
|
+
env.run([paper, too_big_sign_agent])
|
|
98
|
+
json = env.toJSON()
|
|
99
|
+
assert json["rewards"] == [1, None]
|
|
100
|
+
assert json["statuses"] == ["DONE", "INVALID"]
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def test_agent_reward():
|
|
104
|
+
env = make("rps", configuration={"episodeSteps": 2, "tieRewardThreshold": 1})
|
|
105
|
+
env.run([paper, rock])
|
|
106
|
+
json = env.toJSON()
|
|
107
|
+
last_step = json["steps"][-1]
|
|
108
|
+
assert last_step[0]["observation"]["step"] == last_step[0]["observation"]["reward"]
|
|
109
|
+
assert last_step[0]["observation"]["reward"] == -last_step[1]["observation"]["reward"]
|
|
110
|
+
assert json["statuses"] == ["DONE", "DONE"]
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import math
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def get_score(left_move, right_move):
|
|
5
|
+
# This method exists in this file so it can be consumed from rps.py and agents.py without a circular dependency
|
|
6
|
+
delta = right_move - left_move if (left_move + right_move) % 2 == 0 else left_move - right_move
|
|
7
|
+
return 0 if delta == 0 else math.copysign(1, delta)
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import time
|
|
16
|
-
|
|
16
|
+
|
|
17
|
+
from kaggle_environments import errors, evaluate, make, utils
|
|
17
18
|
|
|
18
19
|
env = None
|
|
19
20
|
|
|
@@ -30,7 +31,7 @@ def custom2(obs):
|
|
|
30
31
|
|
|
31
32
|
def custom3(obs):
|
|
32
33
|
step = sum(1 for mark in obs.board if mark == obs.mark)
|
|
33
|
-
time.sleep(
|
|
34
|
+
time.sleep(4)
|
|
34
35
|
return [1, 3, 5, 7][step]
|
|
35
36
|
|
|
36
37
|
|
|
@@ -42,10 +43,16 @@ def custom5():
|
|
|
42
43
|
return -1
|
|
43
44
|
|
|
44
45
|
|
|
46
|
+
def custom6(obs):
|
|
47
|
+
step = sum(1 for mark in obs.board if mark == obs.mark)
|
|
48
|
+
time.sleep(2)
|
|
49
|
+
return [1, 3, 5, 7][step]
|
|
50
|
+
|
|
51
|
+
|
|
45
52
|
def before_each(state=None):
|
|
46
53
|
global env
|
|
47
54
|
steps = [] if state == None else [state]
|
|
48
|
-
env = make("tictactoe", steps=steps, debug=
|
|
55
|
+
env = make("tictactoe", steps=steps, debug=False)
|
|
49
56
|
|
|
50
57
|
|
|
51
58
|
def test_to_json():
|
|
@@ -64,14 +71,14 @@ def test_can_reset():
|
|
|
64
71
|
"action": 0,
|
|
65
72
|
"status": "ACTIVE",
|
|
66
73
|
"info": {},
|
|
67
|
-
"observation": {"mark": 1, "board": [0, 0, 0, 0, 0, 0, 0, 0, 0]},
|
|
74
|
+
"observation": {"remainingOverageTime": 2, "mark": 1, "board": [0, 0, 0, 0, 0, 0, 0, 0, 0], "step": 0},
|
|
68
75
|
"reward": 0,
|
|
69
76
|
},
|
|
70
77
|
{
|
|
71
78
|
"action": 0,
|
|
72
79
|
"status": "INACTIVE",
|
|
73
80
|
"info": {},
|
|
74
|
-
"observation": {"mark": 2},
|
|
81
|
+
"observation": {"remainingOverageTime": 2, "mark": 2},
|
|
75
82
|
"reward": 0,
|
|
76
83
|
},
|
|
77
84
|
]
|
|
@@ -85,14 +92,14 @@ def test_can_place_valid_mark():
|
|
|
85
92
|
"action": 4,
|
|
86
93
|
"status": "INACTIVE",
|
|
87
94
|
"info": {},
|
|
88
|
-
"observation": {"mark": 1, "board": [0, 0, 0, 0, 1, 0, 0, 0, 0]},
|
|
95
|
+
"observation": {"remainingOverageTime": 2, "mark": 1, "board": [0, 0, 0, 0, 1, 0, 0, 0, 0], "step": 1},
|
|
89
96
|
"reward": 0,
|
|
90
97
|
},
|
|
91
98
|
{
|
|
92
99
|
"action": 0, # None caused the default action to be applied.
|
|
93
100
|
"status": "ACTIVE",
|
|
94
101
|
"info": {},
|
|
95
|
-
"observation": {"mark": 2},
|
|
102
|
+
"observation": {"remainingOverageTime": 2, "mark": 2},
|
|
96
103
|
"reward": 0,
|
|
97
104
|
},
|
|
98
105
|
]
|
|
@@ -108,14 +115,14 @@ def test_can_place_invalid_mark():
|
|
|
108
115
|
"action": 0,
|
|
109
116
|
"status": "DONE",
|
|
110
117
|
"info": {},
|
|
111
|
-
"observation": {"mark": 1, "board": [0, 0, 0, 0, 1, 0, 0, 0, 0]},
|
|
118
|
+
"observation": {"remainingOverageTime": 2, "mark": 1, "board": [0, 0, 0, 0, 1, 0, 0, 0, 0], "step": 2},
|
|
112
119
|
"reward": 0,
|
|
113
120
|
},
|
|
114
121
|
{
|
|
115
122
|
"action": 4,
|
|
116
123
|
"status": "INVALID",
|
|
117
124
|
"info": {},
|
|
118
|
-
"observation": {"mark": 2},
|
|
125
|
+
"observation": {"remainingOverageTime": 2, "mark": 2},
|
|
119
126
|
"reward": None,
|
|
120
127
|
},
|
|
121
128
|
]
|
|
@@ -131,14 +138,14 @@ def test_can_place_winning_mark():
|
|
|
131
138
|
"action": 7,
|
|
132
139
|
"status": "DONE",
|
|
133
140
|
"info": {},
|
|
134
|
-
"observation": {"mark": 1, "board": [2, 1, 0, 1, 1, 0, 2, 1, 2]},
|
|
141
|
+
"observation": {"remainingOverageTime": 2, "mark": 1, "board": [2, 1, 0, 1, 1, 0, 2, 1, 2], "step": 1},
|
|
135
142
|
"reward": 1,
|
|
136
143
|
},
|
|
137
144
|
{
|
|
138
145
|
"action": 0,
|
|
139
146
|
"status": "DONE",
|
|
140
147
|
"info": {},
|
|
141
|
-
"observation": {"mark": 2},
|
|
148
|
+
"observation": {"remainingOverageTime": 2, "mark": 2},
|
|
142
149
|
"reward": -1,
|
|
143
150
|
},
|
|
144
151
|
]
|
|
@@ -155,8 +162,7 @@ def test_can_step_through_agents():
|
|
|
155
162
|
before_each()
|
|
156
163
|
while not env.done:
|
|
157
164
|
action1 = env.agents.random(env.state[0].observation)
|
|
158
|
-
action2 = env.agents.reaction(
|
|
159
|
-
utils.structify({"board": env.state[0].observation.board, "mark": 2}))
|
|
165
|
+
action2 = env.agents.reaction(utils.structify({"board": env.state[0].observation.board, "mark": 2}))
|
|
160
166
|
env.step([action1, action2])
|
|
161
167
|
assert env.state[0].reward + env.state[1].reward == 0
|
|
162
168
|
|
|
@@ -169,8 +175,7 @@ def test_can_run_agents():
|
|
|
169
175
|
|
|
170
176
|
def test_can_evaluate():
|
|
171
177
|
rewards = evaluate("tictactoe", ["random", "reaction"], num_episodes=2)
|
|
172
|
-
assert (rewards[0][0] + rewards[0][1] ==
|
|
173
|
-
0) and rewards[1][0] + rewards[1][1] == 0
|
|
178
|
+
assert (rewards[0][0] + rewards[0][1] == 0) and rewards[1][0] + rewards[1][1] == 0
|
|
174
179
|
|
|
175
180
|
|
|
176
181
|
def test_can_run_custom_agents():
|
|
@@ -181,83 +186,44 @@ def test_can_run_custom_agents():
|
|
|
181
186
|
"action": 6,
|
|
182
187
|
"reward": 1,
|
|
183
188
|
"info": {},
|
|
184
|
-
"observation": {"board": [1, 2, 1, 2, 1, 2, 1, 0, 0], "mark": 1},
|
|
189
|
+
"observation": {"remainingOverageTime": 2, "board": [1, 2, 1, 2, 1, 2, 1, 0, 0], "mark": 1, "step": 7},
|
|
185
190
|
"status": "DONE",
|
|
186
191
|
},
|
|
187
192
|
{
|
|
188
193
|
"action": 0,
|
|
189
194
|
"reward": -1,
|
|
190
195
|
"info": {},
|
|
191
|
-
"observation": {"mark": 2},
|
|
196
|
+
"observation": {"remainingOverageTime": 2, "mark": 2},
|
|
192
197
|
"status": "DONE",
|
|
193
198
|
},
|
|
194
199
|
]
|
|
195
200
|
|
|
196
201
|
|
|
197
202
|
def test_agents_can_timeout_on_init():
|
|
198
|
-
env = make("tictactoe", debug=
|
|
199
|
-
"agentTimeout": 1, "actTimeout": 1})
|
|
203
|
+
env = make("tictactoe", debug=False)
|
|
200
204
|
state = env.run([custom1, custom3])[-1]
|
|
201
|
-
assert state ==
|
|
202
|
-
|
|
203
|
-
"action": 0,
|
|
204
|
-
"reward": 0,
|
|
205
|
-
"info": {},
|
|
206
|
-
"observation": {"board": [1, 0, 0, 0, 0, 0, 0, 0, 0], "mark": 1},
|
|
207
|
-
"status": "DONE",
|
|
208
|
-
},
|
|
209
|
-
{
|
|
210
|
-
"action": None,
|
|
211
|
-
"reward": None,
|
|
212
|
-
"info": {},
|
|
213
|
-
"observation": {"mark": 2},
|
|
214
|
-
"status": "TIMEOUT",
|
|
215
|
-
},
|
|
216
|
-
]
|
|
205
|
+
assert state[1]["status"] == "TIMEOUT"
|
|
206
|
+
assert state[1]["observation"]["remainingOverageTime"] < 0
|
|
217
207
|
|
|
218
208
|
|
|
219
209
|
def test_agents_can_timeout_on_act():
|
|
220
|
-
env = make("tictactoe", debug=
|
|
221
|
-
|
|
222
|
-
state
|
|
223
|
-
assert state ==
|
|
224
|
-
|
|
225
|
-
"action": 0,
|
|
226
|
-
"reward": 0,
|
|
227
|
-
"info": {},
|
|
228
|
-
"observation": {"board": [1, 2, 1, 0, 0, 0, 0, 0, 0], "mark": 1},
|
|
229
|
-
"status": "DONE",
|
|
230
|
-
},
|
|
231
|
-
{
|
|
232
|
-
"action": None,
|
|
233
|
-
"reward": None,
|
|
234
|
-
"info": {},
|
|
235
|
-
"observation": {"mark": 2},
|
|
236
|
-
"status": "TIMEOUT",
|
|
237
|
-
},
|
|
238
|
-
]
|
|
210
|
+
env = make("tictactoe", debug=False)
|
|
211
|
+
state = env.run([custom1, custom6])[-1]
|
|
212
|
+
print(state)
|
|
213
|
+
assert state[1]["status"] == "TIMEOUT"
|
|
214
|
+
assert state[1]["observation"]["remainingOverageTime"] < 0
|
|
239
215
|
|
|
240
216
|
|
|
241
217
|
def test_run_timeout():
|
|
242
|
-
env = make("tictactoe", debug=
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
"status": "ACTIVE",
|
|
252
|
-
},
|
|
253
|
-
{
|
|
254
|
-
"action": 5,
|
|
255
|
-
"reward": 0,
|
|
256
|
-
"info": {},
|
|
257
|
-
"observation": {"mark": 2},
|
|
258
|
-
"status": "INACTIVE",
|
|
259
|
-
},
|
|
260
|
-
]
|
|
218
|
+
env = make("tictactoe", debug=False, configuration={"actTimeout": 10, "runTimeout": 1})
|
|
219
|
+
try:
|
|
220
|
+
state = env.run([custom1, custom3])[-1]
|
|
221
|
+
except errors.DeadlineExceeded:
|
|
222
|
+
pass
|
|
223
|
+
except:
|
|
224
|
+
assert False, "should fail with deadline exceeded"
|
|
225
|
+
else:
|
|
226
|
+
assert False, "Should fail when runtimeout is reached"
|
|
261
227
|
|
|
262
228
|
|
|
263
229
|
def test_agents_can_error():
|
|
@@ -268,14 +234,14 @@ def test_agents_can_error():
|
|
|
268
234
|
"action": 0,
|
|
269
235
|
"reward": 0,
|
|
270
236
|
"info": {},
|
|
271
|
-
"observation": {"board": [1, 0, 0, 0, 0, 0, 0, 0, 0], "mark": 1},
|
|
237
|
+
"observation": {"remainingOverageTime": 2, "board": [1, 0, 0, 0, 0, 0, 0, 0, 0], "mark": 1, "step": 2},
|
|
272
238
|
"status": "DONE",
|
|
273
239
|
},
|
|
274
240
|
{
|
|
275
241
|
"action": None,
|
|
276
242
|
"reward": None,
|
|
277
243
|
"info": {},
|
|
278
|
-
"observation": {"mark": 2},
|
|
244
|
+
"observation": {"remainingOverageTime": 2, "mark": 2},
|
|
279
245
|
"status": "ERROR",
|
|
280
246
|
},
|
|
281
247
|
]
|
|
@@ -289,14 +255,14 @@ def test_agents_can_have_invalid_actions():
|
|
|
289
255
|
"action": 0,
|
|
290
256
|
"reward": 0,
|
|
291
257
|
"info": {},
|
|
292
|
-
"observation": {"board": [1, 0, 0, 0, 0, 0, 0, 0, 0], "mark": 1},
|
|
258
|
+
"observation": {"remainingOverageTime": 2, "board": [1, 0, 0, 0, 0, 0, 0, 0, 0], "mark": 1, "step": 2},
|
|
293
259
|
"status": "DONE",
|
|
294
260
|
},
|
|
295
261
|
{
|
|
296
262
|
"action": None,
|
|
297
263
|
"reward": None,
|
|
298
264
|
"info": {},
|
|
299
|
-
"observation": {"mark": 2},
|
|
265
|
+
"observation": {"remainingOverageTime": 2, "mark": 2},
|
|
300
266
|
"status": "INVALID",
|
|
301
267
|
},
|
|
302
268
|
]
|