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
kaggle_environments/utils.py
CHANGED
|
@@ -13,23 +13,23 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import json
|
|
16
|
-
import jsonschema
|
|
17
|
-
import sys
|
|
18
16
|
from copy import deepcopy
|
|
19
|
-
from io import StringIO
|
|
20
17
|
from pathlib import Path
|
|
21
|
-
from urllib.parse import urlparse
|
|
22
|
-
from .errors import InvalidArgument, NotFound
|
|
23
18
|
|
|
19
|
+
import jsonschema
|
|
20
|
+
|
|
21
|
+
from .errors import InvalidArgument, NotFound
|
|
24
22
|
|
|
25
23
|
# Path Utilities.
|
|
26
24
|
root_path = Path(__file__).parent.resolve()
|
|
27
25
|
envs_path = Path.joinpath(root_path, "envs")
|
|
28
26
|
|
|
29
27
|
|
|
30
|
-
#
|
|
31
|
-
def get(o, classinfo=None, default=None, path=
|
|
32
|
-
if
|
|
28
|
+
# Primitive Utilities.
|
|
29
|
+
def get(o, classinfo=None, default=None, path=None, is_callable=None, fallback=None):
|
|
30
|
+
if path is None:
|
|
31
|
+
path = []
|
|
32
|
+
if o is None and default is not None:
|
|
33
33
|
o = default
|
|
34
34
|
if has(o, classinfo, default, path, is_callable):
|
|
35
35
|
cur = o
|
|
@@ -37,25 +37,27 @@ def get(o, classinfo=None, default=None, path=[], is_callable=None, fallback=Non
|
|
|
37
37
|
cur = cur[p]
|
|
38
38
|
return cur
|
|
39
39
|
else:
|
|
40
|
-
if default
|
|
40
|
+
if default is not None:
|
|
41
41
|
return default
|
|
42
42
|
return fallback
|
|
43
43
|
|
|
44
44
|
|
|
45
|
-
def has(o, classinfo=None, default=None, path=
|
|
45
|
+
def has(o, classinfo=None, default=None, path=None, is_callable=None):
|
|
46
|
+
if path is None:
|
|
47
|
+
path = []
|
|
46
48
|
try:
|
|
47
49
|
cur = o
|
|
48
50
|
for p in path:
|
|
49
51
|
cur = cur[p]
|
|
50
|
-
if classinfo
|
|
51
|
-
raise "Not a match"
|
|
52
|
-
if is_callable
|
|
53
|
-
raise "Not callable"
|
|
54
|
-
if is_callable
|
|
55
|
-
raise "Is callable"
|
|
52
|
+
if classinfo is not None and not isinstance(cur, classinfo):
|
|
53
|
+
raise ValueError("Not a match")
|
|
54
|
+
if is_callable and not callable(cur):
|
|
55
|
+
raise ValueError("Not callable")
|
|
56
|
+
if not is_callable and callable(cur):
|
|
57
|
+
raise ValueError("Is callable")
|
|
56
58
|
return True
|
|
57
59
|
except:
|
|
58
|
-
if default
|
|
60
|
+
if default is not None and o is not None and len(path) > 0:
|
|
59
61
|
cur = o
|
|
60
62
|
for p in path[:-1]:
|
|
61
63
|
if not has(cur, dict, path=[p]):
|
|
@@ -65,9 +67,15 @@ def has(o, classinfo=None, default=None, path=[], is_callable=None):
|
|
|
65
67
|
return False
|
|
66
68
|
|
|
67
69
|
|
|
68
|
-
def call(o, default=None, path=
|
|
70
|
+
def call(o, default=None, path=None, args=None, kwargs=None):
|
|
71
|
+
if path is None:
|
|
72
|
+
path = []
|
|
73
|
+
if args is None:
|
|
74
|
+
args = []
|
|
75
|
+
if kwargs is None:
|
|
76
|
+
kwargs = {}
|
|
69
77
|
o = get(o, default=False, path=path, is_callable=True)
|
|
70
|
-
if o
|
|
78
|
+
if o is not False:
|
|
71
79
|
return o(*args, **kwargs)
|
|
72
80
|
else:
|
|
73
81
|
return default
|
|
@@ -84,7 +92,7 @@ class Struct(dict):
|
|
|
84
92
|
self[attr] = value
|
|
85
93
|
|
|
86
94
|
|
|
87
|
-
# Added
|
|
95
|
+
# Added benefit of cloning lists and dicts.
|
|
88
96
|
def structify(o):
|
|
89
97
|
if isinstance(o, list):
|
|
90
98
|
return [structify(o[i]) for i in range(len(o))]
|
|
@@ -99,49 +107,17 @@ def read_file(path, fallback=None):
|
|
|
99
107
|
with open(path, "r", encoding="utf-8") as file:
|
|
100
108
|
return file.read()
|
|
101
109
|
except:
|
|
102
|
-
if fallback
|
|
110
|
+
if fallback is not None:
|
|
103
111
|
return fallback
|
|
104
112
|
raise NotFound(f"{path} not found")
|
|
105
113
|
|
|
106
114
|
|
|
107
|
-
def get_exec(raw, fallback=None):
|
|
108
|
-
orig_out = sys.stdout
|
|
109
|
-
buffer = StringIO()
|
|
110
|
-
sys.stdout = buffer
|
|
111
|
-
try:
|
|
112
|
-
code_object = compile(raw, "<string>", "exec")
|
|
113
|
-
env = {}
|
|
114
|
-
exec(code_object, env)
|
|
115
|
-
sys.stdout = orig_out
|
|
116
|
-
print(buffer.getvalue())
|
|
117
|
-
return env
|
|
118
|
-
except Exception as e:
|
|
119
|
-
sys.stdout = orig_out
|
|
120
|
-
print(buffer.getvalue())
|
|
121
|
-
if fallback != None:
|
|
122
|
-
return fallback
|
|
123
|
-
raise InvalidArgument("Invalid raw Python: " + str(e))
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def get_last_callable(raw, fallback=None):
|
|
127
|
-
try:
|
|
128
|
-
local = get_exec(raw)
|
|
129
|
-
callables = [v for v in local.values() if callable(v)]
|
|
130
|
-
if len(callables) > 0:
|
|
131
|
-
return callables[-1]
|
|
132
|
-
raise "Nope"
|
|
133
|
-
except:
|
|
134
|
-
if fallback != None:
|
|
135
|
-
return fallback
|
|
136
|
-
raise InvalidArgument("No callable found")
|
|
137
|
-
|
|
138
|
-
|
|
139
115
|
def get_file_json(path, fallback=None):
|
|
140
116
|
try:
|
|
141
117
|
with open(path, "r") as json_file:
|
|
142
118
|
return json.load(json_file)
|
|
143
119
|
except:
|
|
144
|
-
if fallback
|
|
120
|
+
if fallback is not None:
|
|
145
121
|
return fallback
|
|
146
122
|
raise InvalidArgument(f"{path} does not contain valid JSON")
|
|
147
123
|
|
|
@@ -152,22 +128,22 @@ schemas = structify(get_file_json(Path.joinpath(root_path, "schemas.json")))
|
|
|
152
128
|
|
|
153
129
|
def default_schema(schema, data):
|
|
154
130
|
default = get(schema, path=["default"])
|
|
155
|
-
if default
|
|
131
|
+
if default is None and data is None:
|
|
156
132
|
return
|
|
157
133
|
|
|
158
134
|
if get(schema, path=["type"]) == "object":
|
|
159
135
|
default = deepcopy(get(default, dict, {}))
|
|
160
|
-
if data
|
|
136
|
+
if data is None or not has(data, dict):
|
|
161
137
|
obj = default
|
|
162
138
|
else:
|
|
163
139
|
obj = data
|
|
164
140
|
for k, v in default.items():
|
|
165
|
-
if not
|
|
141
|
+
if k not in obj:
|
|
166
142
|
obj[k] = v
|
|
167
143
|
properties = get(schema, dict, {}, ["properties"])
|
|
168
144
|
for key, prop_schema in properties.items():
|
|
169
145
|
new_value = default_schema(prop_schema, get(obj, path=[key]))
|
|
170
|
-
if new_value
|
|
146
|
+
if new_value is not None:
|
|
171
147
|
obj[key] = new_value
|
|
172
148
|
return obj
|
|
173
149
|
|
|
@@ -176,20 +152,20 @@ def default_schema(schema, data):
|
|
|
176
152
|
arr = get(data, list, default)
|
|
177
153
|
item_schema = get(schema, dict, {}, ["items"])
|
|
178
154
|
for index, value in enumerate(arr):
|
|
179
|
-
if value
|
|
155
|
+
if value is None and len(default) > index:
|
|
180
156
|
new_value = default[index]
|
|
181
157
|
else:
|
|
182
158
|
new_value = default_schema(item_schema, value)
|
|
183
|
-
if new_value
|
|
159
|
+
if new_value is not None:
|
|
184
160
|
arr[index] = new_value
|
|
185
161
|
return arr
|
|
186
162
|
|
|
187
|
-
return data if data
|
|
163
|
+
return data if data is not None else default
|
|
188
164
|
|
|
189
165
|
|
|
190
166
|
def process_schema(schema, data, use_default=True):
|
|
191
167
|
error = None
|
|
192
|
-
if use_default
|
|
168
|
+
if use_default is True:
|
|
193
169
|
data = default_schema(schema, deepcopy(data))
|
|
194
170
|
try:
|
|
195
171
|
jsonschema.validate(data, schema)
|
|
@@ -198,21 +174,18 @@ def process_schema(schema, data, use_default=True):
|
|
|
198
174
|
return error, data
|
|
199
175
|
|
|
200
176
|
|
|
201
|
-
def is_url(url):
|
|
202
|
-
try:
|
|
203
|
-
result = urlparse(url)
|
|
204
|
-
return all([result.scheme, result.netloc])
|
|
205
|
-
except ValueError:
|
|
206
|
-
return False
|
|
207
|
-
|
|
208
|
-
|
|
209
177
|
# Player utilities
|
|
210
178
|
def get_player(window_kaggle, renderer):
|
|
179
|
+
if renderer[0] == "html_path":
|
|
180
|
+
key = "/*window.kaggle*/"
|
|
181
|
+
value = f"""
|
|
182
|
+
window.kaggle = {json.dumps(window_kaggle, indent=2)};\n\n
|
|
183
|
+
"""
|
|
184
|
+
return read_file(renderer[1]).replace(key, value)
|
|
185
|
+
|
|
211
186
|
key = "/*window.kaggle*/"
|
|
212
187
|
value = f"""
|
|
213
188
|
window.kaggle = {json.dumps(window_kaggle, indent=2)};\n\n
|
|
214
189
|
window.kaggle.renderer = {renderer.strip()};\n\n
|
|
215
190
|
"""
|
|
216
|
-
return read_file(Path.joinpath(root_path, "static", "player.html")).replace(
|
|
217
|
-
key, value
|
|
218
|
-
)
|
|
191
|
+
return read_file(Path.joinpath(root_path, "static", "player.html")).replace(key, value)
|
|
@@ -1,21 +1,35 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: kaggle-environments
|
|
3
|
-
Version:
|
|
3
|
+
Version: 1.20.1
|
|
4
4
|
Summary: Kaggle Environments
|
|
5
|
-
Home-page: https://github.com/Kaggle/kaggle-environments
|
|
6
|
-
Author: Kaggle
|
|
7
|
-
Author-email: support@kaggle.com
|
|
8
|
-
License: Apache 2.0
|
|
9
5
|
Keywords: Kaggle
|
|
10
|
-
|
|
11
|
-
Requires-Python: >=3.
|
|
6
|
+
Author-email: Kaggle <support@kaggle.com>
|
|
7
|
+
Requires-Python: >=3.10
|
|
12
8
|
Description-Content-Type: text/markdown
|
|
13
|
-
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Dist: accelerate
|
|
11
|
+
Requires-Dist: bitsandbytes
|
|
12
|
+
Requires-Dist: Chessnut >= 0.4.1
|
|
13
|
+
Requires-Dist: Flask >= 1.1.2
|
|
14
|
+
Requires-Dist: gymnasium == 1.2.0
|
|
15
|
+
Requires-Dist: gymnax==0.0.8
|
|
16
|
+
Requires-Dist: jax
|
|
17
|
+
Requires-Dist: jsonschema >= 3.0.1
|
|
18
|
+
Requires-Dist: litellm
|
|
19
|
+
Requires-Dist: numpy >= 2.2.6
|
|
20
|
+
Requires-Dist: open_spiel >= 1.6.2
|
|
21
|
+
Requires-Dist: pettingzoo == 1.24.0
|
|
22
|
+
Requires-Dist: requests >= 2.25.1
|
|
23
|
+
Requires-Dist: scipy >= 1.15.3
|
|
24
|
+
Requires-Dist: shimmy >= 1.2.1
|
|
25
|
+
Requires-Dist: stable-baselines3 == 2.7.0
|
|
26
|
+
Requires-Dist: transformers >= 4.33.1
|
|
27
|
+
Project-URL: Homepage, https://github.com/Kaggle/kaggle-environments
|
|
14
28
|
|
|
15
29
|
# [<img src="https://kaggle.com/static/images/site-logo.png" height="50" style="margin-bottom:-15px" />](https://kaggle.com) Environments
|
|
16
30
|
|
|
17
31
|
```bash
|
|
18
|
-
pip install kaggle-environments
|
|
32
|
+
uv pip install kaggle-environments
|
|
19
33
|
```
|
|
20
34
|
|
|
21
35
|
# TLDR;
|
|
@@ -66,10 +80,10 @@ help(env.reset)
|
|
|
66
80
|
Agent functions can have observation and configuration parameters and must return a valid action. Details about the observation, configuration, and actions can seen by viewing the specification.
|
|
67
81
|
|
|
68
82
|
```python
|
|
69
|
-
from
|
|
70
|
-
env = make("connectx", {rows: 10, columns: 8, inarow: 5})
|
|
83
|
+
from kaggle_environments import make
|
|
84
|
+
env = make("connectx", {"rows": 10, "columns": 8, "inarow": 5})
|
|
71
85
|
|
|
72
|
-
def agent(observation,
|
|
86
|
+
def agent(observation, configuration):
|
|
73
87
|
print(observation) # {board: [...], mark: 1}
|
|
74
88
|
print(configuration) # {rows: 10, columns: 8, inarow: 5}
|
|
75
89
|
return 3 # Action: always place a mark in the 3rd column.
|
|
@@ -116,7 +130,7 @@ agent6 = "http://localhost:8000/run/agent"
|
|
|
116
130
|
Most environments contain default agents to play against. To see the list of available agents for a specific environment run:
|
|
117
131
|
|
|
118
132
|
```python
|
|
119
|
-
from
|
|
133
|
+
from kaggle_environments import make
|
|
120
134
|
env = make("tictactoe")
|
|
121
135
|
|
|
122
136
|
# The list of available default agents.
|
|
@@ -160,7 +174,7 @@ There are 3 types of errors which can occur from agent execution:
|
|
|
160
174
|
To help debug your agent and why it threw the errors above, add the `debug` flag when setting up the environment.
|
|
161
175
|
|
|
162
176
|
```python
|
|
163
|
-
from
|
|
177
|
+
from kaggle_environments import make
|
|
164
178
|
|
|
165
179
|
def agent():
|
|
166
180
|
return "Something Bad"
|
|
@@ -211,16 +225,15 @@ There are two types of configuration: Defaults applying to every environment and
|
|
|
211
225
|
| Name | Description |
|
|
212
226
|
| ------------ | --------------------------------------------------------------- |
|
|
213
227
|
| episodeSteps | Maximum number of steps in the episode. |
|
|
214
|
-
| agentExec | How the agent is executed alongside the envionment. |
|
|
215
228
|
| agentTimeout | Maximum runtime (seconds) to initialize an agent. |
|
|
216
229
|
| actTimeout | Maximum runtime (seconds) to obtain an action from an agent. |
|
|
217
230
|
| runTimeout | Maximum runtime (seconds) of an episode (not necessarily DONE). |
|
|
231
|
+
| maxLogLength | Maximum log length (number of characters, `None` -> no limit) |
|
|
218
232
|
|
|
219
233
|
```python
|
|
220
234
|
env = make("connectx", configuration={
|
|
221
235
|
"columns": 19, # Specific to ConnectX.
|
|
222
236
|
"actTimeout": 10,
|
|
223
|
-
"agentExec": "LOCAL"
|
|
224
237
|
})
|
|
225
238
|
```
|
|
226
239
|
|
|
@@ -247,13 +260,12 @@ print(steps)
|
|
|
247
260
|
Evaluation is used to run an episode (environment + agents) multiple times and just return the rewards.
|
|
248
261
|
|
|
249
262
|
```python
|
|
250
|
-
from
|
|
263
|
+
from kaggle_environments import evaluate
|
|
251
264
|
|
|
252
265
|
# Same definitions as "make" above.
|
|
253
|
-
|
|
254
|
-
configuration = {rows: 10, columns: 8, inarow: 5}
|
|
266
|
+
environment = "connectx"
|
|
267
|
+
configuration = {"rows": 10, "columns": 8, "inarow": 5}
|
|
255
268
|
steps = []
|
|
256
|
-
debug = False
|
|
257
269
|
|
|
258
270
|
# Which agents to run repeatedly. Same as env.run(agents)
|
|
259
271
|
agents = ["random", agent1]
|
|
@@ -261,7 +273,7 @@ agents = ["random", agent1]
|
|
|
261
273
|
# How many times to run them.
|
|
262
274
|
num_episodes = 10
|
|
263
275
|
|
|
264
|
-
rewards = evaluate(environment, agents, configuration, steps, num_episodes
|
|
276
|
+
rewards = evaluate(environment, agents, configuration, steps, num_episodes)
|
|
265
277
|
```
|
|
266
278
|
|
|
267
279
|
## Stepping
|
|
@@ -271,7 +283,7 @@ Running above essentially just steps until no agent is still active. To execute
|
|
|
271
283
|
```python
|
|
272
284
|
agent1_action = agent1(env.state[0].observation)
|
|
273
285
|
agent2_action = agent2(env.state[1].observation)
|
|
274
|
-
state = env.step(agent1_action, agent2_action)
|
|
286
|
+
state = env.step([agent1_action, agent2_action])
|
|
275
287
|
```
|
|
276
288
|
|
|
277
289
|
## Playing
|
|
@@ -279,7 +291,7 @@ state = env.step(agent1_action, agent2_action)
|
|
|
279
291
|
A few environments offer an interactive play against agents within jupyter notebooks. An example of this is using connectx:
|
|
280
292
|
|
|
281
293
|
```python
|
|
282
|
-
from
|
|
294
|
+
from kaggle_environments import make
|
|
283
295
|
|
|
284
296
|
env = make("connectx")
|
|
285
297
|
# None indicates which agent will be manually played.
|
|
@@ -301,93 +313,3 @@ out = env.render(mode="ansi")
|
|
|
301
313
|
print(out)
|
|
302
314
|
```
|
|
303
315
|
|
|
304
|
-
# Command Line
|
|
305
|
-
|
|
306
|
-
```sh
|
|
307
|
-
> python main.py -h
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
## List Registered Environments
|
|
311
|
-
|
|
312
|
-
```sh
|
|
313
|
-
> python main.py list
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
## Evaluate Episode Rewards
|
|
317
|
-
|
|
318
|
-
```sh
|
|
319
|
-
python main.py evaluate --environment tictactoe --agents random random --episodes 10
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
## Run an Episode
|
|
323
|
-
|
|
324
|
-
```sh
|
|
325
|
-
> python main.py run --environment tictactoe --agents random /pathtomy/agent.py --debug True
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
## Load an Episode
|
|
329
|
-
|
|
330
|
-
This is useful when converting an episode json output into html.
|
|
331
|
-
|
|
332
|
-
```sh
|
|
333
|
-
python main.py load --environment tictactoe --steps [...] --render '{"mode": "html"}'
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
# HTTP Server
|
|
337
|
-
|
|
338
|
-
The HTTP server contains the same interface/actions as the CLI above merging both POST body and GET params.
|
|
339
|
-
|
|
340
|
-
## Setup
|
|
341
|
-
|
|
342
|
-
```bash
|
|
343
|
-
python main.py http-server --port=8012 --host=0.0.0.0
|
|
344
|
-
```
|
|
345
|
-
|
|
346
|
-
## Adding Middleware
|
|
347
|
-
|
|
348
|
-
```python
|
|
349
|
-
# middleware.py
|
|
350
|
-
import time
|
|
351
|
-
|
|
352
|
-
def request(req):
|
|
353
|
-
time.sleep(30)
|
|
354
|
-
req.agents = ["random", "random"]
|
|
355
|
-
return req
|
|
356
|
-
|
|
357
|
-
def response(req, resp):
|
|
358
|
-
time.sleep(10)
|
|
359
|
-
return resp
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
```bash
|
|
363
|
-
python3 main.py http-server --middleware=/path/to/middleware.py
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
### Running Agents on Separate Servers
|
|
367
|
-
|
|
368
|
-
```python
|
|
369
|
-
# How to run agent on a separate server.
|
|
370
|
-
import requests
|
|
371
|
-
import json
|
|
372
|
-
|
|
373
|
-
path_to_agent1 = "/home/ajeffries/git/playground/agent1.py"
|
|
374
|
-
path_to_agent2 = "/home/ajeffries/git/playground/agent2.py"
|
|
375
|
-
|
|
376
|
-
agent1_url = f"http://localhost:5001?agents[]={path_to_agent1}"
|
|
377
|
-
agent2_url = f"http://localhost:5002?agents[]={path_to_agent2}"
|
|
378
|
-
|
|
379
|
-
body = {
|
|
380
|
-
"action": "run",
|
|
381
|
-
"environment": "tictactoe",
|
|
382
|
-
"agents": [agent1_url, agent2_url]
|
|
383
|
-
}
|
|
384
|
-
resp = requests.post(url="http://localhost:5000", data=json.dumps(body)).json()
|
|
385
|
-
|
|
386
|
-
# Inflate the response replay to visualize.
|
|
387
|
-
from kaggle_environments import make
|
|
388
|
-
env = make("tictactoe", steps=resp["steps"], debug=True)
|
|
389
|
-
env.render(mode="ipython")
|
|
390
|
-
print(resp)
|
|
391
|
-
```
|
|
392
|
-
|
|
393
|
-
|