kaggle-environments 1.14.1__py2.py3-none-any.whl → 1.14.5__py2.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.

@@ -21,7 +21,7 @@ from .main import http_request
21
21
  from . import errors
22
22
  from . import utils
23
23
 
24
- __version__ = "1.14.1"
24
+ __version__ = "1.14.5"
25
25
 
26
26
  __all__ = ["Agent", "environments", "errors", "evaluate", "http_request",
27
27
  "make", "register", "utils", "__version__",
@@ -7,6 +7,7 @@
7
7
  "configuration": {
8
8
  "episodeSteps": 61,
9
9
  "actTimeout": 60,
10
+ "runTimeout": 9600,
10
11
  "agentTimeout": {
11
12
  "description": "Obsolete field kept for backwards compatibility, please use observation.remainingOverageTime.",
12
13
  "type": "number",
@@ -68,4 +69,4 @@
68
69
  "defaults": ["ACTIVE", "INACTIVE", "ACTIVE", "INACTIVE"]
69
70
  }
70
71
  }
71
-
72
+
@@ -20,6 +20,17 @@ model = None
20
20
  tokenizer = None
21
21
  model_initialized = False
22
22
 
23
+ ERROR = "ERROR"
24
+ DONE = "DONE"
25
+ INACTIVE = "INACTIVE"
26
+ ACTIVE = "ACTIVE"
27
+ TIMEOUT = "TIMEOUT"
28
+
29
+ GUESS = "guess"
30
+ ASK = "ask"
31
+ GUESSER = "guesser"
32
+ ANSWERER = "guesser"
33
+
23
34
  keywords_list = json.loads(KEYWORDS_JSON)
24
35
  keyword_cat = random.choice(keywords_list)
25
36
  category = keyword_cat["category"]
@@ -42,12 +53,12 @@ def guesser_agent(obs):
42
53
  )
43
54
 
44
55
  prompt = ""
45
- if obs.turnType == "ask":
56
+ if obs.turnType == ASK:
46
57
  prompt = "{}{}".format(
47
58
  info_prompt.format(q_a_thread=q_a_thread),
48
59
  questions_prompt
49
60
  )
50
- elif obs.turnType == "guess":
61
+ elif obs.turnType == GUESS:
51
62
  prompt = "{}{}".format(
52
63
  info_prompt.format(q_a_thread=q_a_thread),
53
64
  guess_prompt
@@ -73,7 +84,66 @@ def answerer_agent(obs):
73
84
  return ""
74
85
 
75
86
 
76
- agents = {"guesser": guesser_agent, "answerer": answerer_agent}
87
+ agents = {GUESSER: guesser_agent, ANSWERER: answerer_agent}
88
+
89
+ def guesser_action(active, inactive, step):
90
+ guessed = False
91
+ if not active.action:
92
+ active.status = ERROR
93
+ elif active.observation.turnType == ASK:
94
+ question = active.action[:2000]
95
+ active.observation.questions.append(question)
96
+ inactive.observation.questions.append(question)
97
+ elif active.observation.turnType == GUESS:
98
+ guess = active.action[:100]
99
+ active.observation.guesses.append(guess)
100
+ inactive.observation.guesses.append(guess)
101
+ if active.action and keyword_guessed(active.action):
102
+ guessed = True
103
+ score = 20 - int(step / 3)
104
+ end_game(active, inactive, score, DONE, DONE)
105
+ return guessed
106
+
107
+ def end_game(active, inactive, reward, status, inactive_status):
108
+ active.observation.keyword = keyword
109
+ active.observation.category = category
110
+ inactive.observation.keyword = keyword
111
+ inactive.observation.category = category
112
+ active.reward = reward
113
+ inactive.reward = reward
114
+ active.status = status
115
+ inactive.status = inactive_status
116
+
117
+
118
+ def answerer_action(active, inactive):
119
+ active.observation.keyword = keyword
120
+ active.observation.category = category
121
+ response = active.action
122
+ if not response:
123
+ response = "none"
124
+ end_game(active, inactive, -1, ERROR, DONE)
125
+ elif "yes" in response.lower():
126
+ response = "yes"
127
+ elif "no" in response.lower():
128
+ response = "no"
129
+ else:
130
+ response = "maybe"
131
+ end_game(active, inactive, -1, ERROR, DONE)
132
+ active.observation.answers.append(response)
133
+ inactive.observation.answers.append(response)
134
+
135
+ def increment_turn(active, inactive, step, guessed):
136
+ if step == 59 and not guessed:
137
+ end_game(active, inactive, -1, DONE, DONE)
138
+ elif active.observation.turnType == "guess":
139
+ active.observation.turnType = "ask"
140
+ elif active.observation.turnType == "ask":
141
+ active.observation.turnType = "guess"
142
+ active.status = INACTIVE
143
+ inactive.status = ACTIVE
144
+ else:
145
+ active.status = INACTIVE
146
+ inactive.status = ACTIVE
77
147
 
78
148
 
79
149
  def interpreter(state, env):
@@ -81,14 +151,14 @@ def interpreter(state, env):
81
151
  return state
82
152
 
83
153
  # Isolate the active and inactive agents.
84
- active1 = state[0] if state[0].status == "ACTIVE" else state[1]
85
- inactive1 = state[0] if state[0].status == "INACTIVE" else state[1]
86
- active2 = state[2] if state[2].status == "ACTIVE" else state[3]
87
- inactive2 = state[2] if state[2].status == "INACTIVE" else state[3]
88
- if active1.status == "DONE" and inactive1.status == "DONE":
154
+ active1 = state[0] if state[0].status == ACTIVE else state[1]
155
+ inactive1 = state[0] if state[0].status == INACTIVE else state[1]
156
+ active2 = state[2] if state[2].status == ACTIVE else state[3]
157
+ inactive2 = state[2] if state[2].status == INACTIVE else state[3]
158
+ if active1.status == DONE and inactive1.status == DONE:
89
159
  active1 = None
90
160
  inactive1 = None
91
- if active2.status == "DONE" or inactive2.status == "DONE":
161
+ if active2.status == DONE or inactive2.status == DONE:
92
162
  active2 = None
93
163
  inactive2 = None
94
164
  if active1 is None and inactive1 is None and active2 is None and inactive2 is None:
@@ -96,110 +166,37 @@ def interpreter(state, env):
96
166
 
97
167
  step = state[0].observation.step
98
168
 
169
+ end_early = (active1 and active1.status) in (TIMEOUT, ERROR) or (active2 and active2.status in (TIMEOUT, ERROR))
170
+ either_guessed = False
171
+
99
172
  if active1 is not None:
100
173
  guessed = False
101
- if active1.observation.role == "guesser":
102
- if active1.observation.turnType == "ask":
103
- active1.observation.questions.append(active1.action)
104
- inactive1.observation.questions.append(active1.action)
105
- elif active1.observation.turnType == "guess":
106
- active1.observation.guesses.append(active1.action)
107
- inactive1.observation.guesses.append(active1.action)
108
- if keyword_guessed(active1.action):
109
- guessed = True
110
- score = 20 - int(step / 3)
111
- active1.reward = score
112
- inactive1.reward = score
113
- active1.status = "DONE"
114
- inactive1.status = "DONE"
115
- active1.observation.keyword = keyword
116
- active1.observation.category = category
117
- inactive1.observation.keyword = keyword
118
- inactive1.observation.category = category
174
+ if active1.observation.role == GUESSER:
175
+ guessed = guesser_action(active1, inactive1, step)
176
+ either_guessed = guessed
119
177
  else:
120
- active1.observation.keyword = keyword
121
- active1.observation.category = category
122
- response = active1.action
123
- if response.lower().__contains__("yes"):
124
- response = "yes"
125
- elif response.lower().__contains__("no"):
126
- response = "no"
127
- else:
128
- response = "maybe"
129
- active1.observation.answers.append(response)
130
- inactive1.observation.answers.append(response)
131
-
132
- if step == 59 and not guessed:
133
- active1.observation.keyword = keyword
134
- active1.observation.category = category
135
- inactive1.observation.keyword = keyword
136
- inactive1.observation.category = category
137
- active1.reward = -1
138
- inactive1.reward = -1
139
- active1.status = "DONE"
140
- inactive1.status = "DONE"
141
- elif active1.observation.turnType == "guess":
142
- active1.observation.turnType = "ask"
143
- elif active1.observation.turnType == "ask":
144
- active1.observation.turnType = "guess"
145
- active1.status = "INACTIVE"
146
- inactive1.status = "ACTIVE"
178
+ answerer_action(active1, inactive1)
179
+ if active1.status in (TIMEOUT, ERROR):
180
+ end_game(active1, inactive1, 0, active1.status, DONE)
181
+ elif end_early:
182
+ end_game(active1, inactive1, 0, DONE, DONE)
147
183
  else:
148
- active1.status = "INACTIVE"
149
- inactive1.status = "ACTIVE"
184
+ increment_turn(active1, inactive1, step, guessed)
150
185
 
151
186
  if active2 is not None:
152
187
  guessed = False
153
- if active2.observation.role == "guesser":
154
- if active2.observation.turnType == "ask":
155
- active2.observation.questions.append(active2.action)
156
- inactive2.observation.questions.append(active2.action)
157
- elif active2.observation.turnType == "guess":
158
- active2.observation.guesses.append(active2.action)
159
- inactive2.observation.guesses.append(active2.action)
160
- if keyword_guessed(active2.action):
161
- guessed = True
162
- score = 20 - int(step / 3)
163
- active2.reward = score
164
- inactive2.reward = score
165
- active2.status = "DONE"
166
- inactive2.status = "DONE"
167
- active2.observation.keyword = keyword
168
- active2.observation.category = category
169
- inactive2.observation.keyword = keyword
170
- inactive2.observation.category = category
188
+ if active2.observation.role == GUESSER:
189
+ guessed = guesser_action(active2, inactive2, step)
190
+ either_guessed = either_guessed or guessed
171
191
  else:
172
- active2.observation.keyword = keyword
173
- active2.observation.category = category
174
- response = active2.action
175
- if response.lower().__contains__("yes"):
176
- response = "yes"
177
- elif response.lower().__contains__("no"):
178
- response = "no"
179
- else:
180
- response = "maybe"
181
- active2.observation.answers.append(response)
182
- inactive2.observation.answers.append(response)
183
-
184
- if step == 59 and not guessed:
185
- active2.observation.keyword = keyword
186
- active2.observation.category = category
187
- inactive2.observation.keyword = keyword
188
- inactive2.observation.category = category
189
- active2.reward = -1
190
- inactive2.reward = -1
191
- active2.status = "DONE"
192
- inactive2.status = "DONE"
193
- elif active2.observation.turnType == "guess":
194
- active2.observation.turnType = "ask"
195
- elif active2.observation.turnType == "ask":
196
- active2.observation.turnType = "guess"
197
- active2.status = "INACTIVE"
198
- inactive2.status = "ACTIVE"
192
+ answerer_action(active2, inactive2)
193
+ if active2.status in (TIMEOUT, ERROR):
194
+ end_game(active2, inactive2, 0, active2.status, DONE)
195
+ elif end_early:
196
+ end_game(active2, inactive2, 0, DONE, DONE)
199
197
  else:
200
- active2.status = "INACTIVE"
201
- inactive2.status = "ACTIVE"
202
-
198
+ increment_turn(active2, inactive2, step, guessed)
199
+
203
200
  return state
204
201
 
205
202
 
@@ -207,7 +204,7 @@ def renderer(state, env):
207
204
 
208
205
  for s in state:
209
206
  print("role: ", s.observation.role)
210
- if s.observation.role == "guesser":
207
+ if s.observation.role == GUESSER:
211
208
  transcript = ""
212
209
  for i in range(0, len(s.observation.guesses)):
213
210
  transcript = "{}Q: {} A: {}\nG: {}\n".format(
@@ -39,16 +39,13 @@ prev_step = 0
39
39
  luxenv: LuxAI_S2 = LuxAI_S2(verbose=0, validate_action_space=True, collect_stats=True)
40
40
  prev_obs = None
41
41
  state_obs = None
42
- def cleanup_dimensions():
43
- global dimension_process
44
- if dimension_process is not None:
45
- dimension_process.kill()
42
+ default_env_cfg = None
46
43
  def enqueue_output(out, queue):
47
44
  for line in iter(out.readline, b''):
48
45
  queue.put(line)
49
46
  out.close()
50
47
  def interpreter(state, env):
51
- global luxenv, prev_obs, state_obs
48
+ global luxenv, prev_obs, state_obs, default_env_cfg
52
49
  player_0 = state[0]
53
50
  player_1 = state[1]
54
51
  # filter out actions such as debug annotations so they aren't saved
@@ -65,18 +62,29 @@ def interpreter(state, env):
65
62
  else:
66
63
  max_episode_length = 1000
67
64
 
68
- parsed_env_config = copy.deepcopy(env.configuration)
69
- parsed_env_config["max_episode_length"] = max_episode_length
70
- delete_keys = ["seed", "episodeSteps", "actTimeout", "runTimeout", "env_cfg"]
71
65
 
72
- for k in delete_keys:
73
- if k in parsed_env_config: del parsed_env_config[k]
66
+ if default_env_cfg is None:
67
+ # if this is the first time creating the environment, env.configuration contains the kaggle competition configurations used to override
68
+ # the default env config in LuxAI_S2. env.configuration is later populated by the merge of the kaggle competition configs with the
69
+ # env config in LuxAI_S2 so we only run this branch once and save the result.
70
+ parsed_env_config = copy.deepcopy(env.configuration)
71
+ parsed_env_config["max_episode_length"] = max_episode_length
72
+ delete_keys = ["seed", "episodeSteps", "actTimeout", "runTimeout", "env_cfg"]
73
+ env_cfg_override = dict()
74
+ if "env_cfg" in parsed_env_config:
75
+ env_cfg_override = copy.deepcopy(parsed_env_config["env_cfg"])
76
+ for k in delete_keys:
77
+ if k in parsed_env_config: del parsed_env_config[k]
78
+ parsed_env_config = {**parsed_env_config, **env_cfg_override}
79
+ default_env_cfg = parsed_env_config
80
+ else:
81
+ parsed_env_config = default_env_cfg
74
82
  luxenv = LuxAI_S2(validate_action_space=True, collect_stats=True, **parsed_env_config)
75
83
  _, _ = luxenv.reset(seed=seed)
76
84
  state_obs = luxenv.state.get_compressed_obs()
77
85
 
78
86
  env_cfg_json = dataclasses.asdict(luxenv.env_cfg)
79
- # del env_cfg_json["WEATHER_ID_TO_NAME"]
87
+
80
88
  env.configuration.env_cfg = env_cfg_json
81
89
 
82
90
  player_0.observation.player = "player_0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kaggle-environments
3
- Version: 1.14.1
3
+ Version: 1.14.5
4
4
  Summary: Kaggle Environments
5
5
  Home-page: https://github.com/Kaggle/kaggle-environments
6
6
  Author: Kaggle
@@ -16,7 +16,10 @@ Requires-Dist: jsonschema >=3.0.1
16
16
  Requires-Dist: numpy >=1.19.5
17
17
  Requires-Dist: pettingzoo ==1.24.0
18
18
  Requires-Dist: requests >=2.25.1
19
+ Requires-Dist: scipy >=1.11.2
20
+ Requires-Dist: shimmy >=1.2.1
19
21
  Requires-Dist: stable-baselines3 ==2.1.0
22
+ Requires-Dist: transformers >=4.33.1
20
23
  Requires-Dist: vec-noise >=1.1.4
21
24
 
22
25
  # [<img src="https://kaggle.com/static/images/site-logo.png" height="50" style="margin-bottom:-15px" />](https://kaggle.com) Environments
@@ -1,4 +1,4 @@
1
- kaggle_environments/__init__.py,sha256=W-w3qHRxvExrwKAq0b95x02Ln4P18hiWeRHehZ_wSfw,1702
1
+ kaggle_environments/__init__.py,sha256=sQ-D4OKiM-2xFoo9MlUPMX_TYBykHXx-VQE9QWp-ro0,1702
2
2
  kaggle_environments/agent.py,sha256=BpYrAC6EOhJF3Wzynq-CWg8l-z5uXW1Lq4qUsyOM0ik,6203
3
3
  kaggle_environments/api.py,sha256=eLBKqr11Ku4tdsMUdUqy74FIVEA_hdV3_QUpX84x3Z8,798
4
4
  kaggle_environments/core.py,sha256=IrEkN9cIA2djBAxI8Sz1GRpGNKjhqbnBdV6irAeTm8Q,27851
@@ -71,8 +71,8 @@ kaggle_environments/envs/kore_fleets/starter_bots/ts/test/fullob.json,sha256=lEW
71
71
  kaggle_environments/envs/kore_fleets/starter_bots/ts/test/observation.json,sha256=SIgLl8uTPmv2T_-g3gsFaibh_DWfvZNlZS7yPXL1Cnc,5998
72
72
  kaggle_environments/envs/llm_20_questions/keywords.py,sha256=BnyVrV0_xbiDt_Td4YXSKae9hHndAo5YYfYVtyL4eS4,45282
73
73
  kaggle_environments/envs/llm_20_questions/llm_20_questions.js,sha256=qy6V_j7GOqjCbCowBdJ6dtr23HCvK2MdSbQWi-0blPY,5923
74
- kaggle_environments/envs/llm_20_questions/llm_20_questions.json,sha256=nFAPb4vc10qW3-WOOM-iEHtOro-ij7-Um4UdzRoK8Xc,2074
75
- kaggle_environments/envs/llm_20_questions/llm_20_questions.py,sha256=39ud8BnfwO9lyGViGQoKmRs3TUnqIR4EYbr0YjFC1y0,10141
74
+ kaggle_environments/envs/llm_20_questions/llm_20_questions.json,sha256=VYxgQEDCaJv910sQdE_FOtV2w1V83Y3C6nTjx4FFZyo,2101
75
+ kaggle_environments/envs/llm_20_questions/llm_20_questions.py,sha256=x5vPzxe0t-OZSUf_KBaiIlvW_PCbpKPqOE7ORPTCjXA,9073
76
76
  kaggle_environments/envs/lux_ai_2021/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
77
  kaggle_environments/envs/lux_ai_2021/agents.py,sha256=bDqsY17Jxrk69a8HXb96ex2U1ipKkQPVJuXxmiA5hMA,421
78
78
  kaggle_environments/envs/lux_ai_2021/index.html,sha256=4Ec1FuHuuH1EvkvlLOpNUUFYLovnS_IA-rOOHEUjcGY,1550
@@ -105,7 +105,7 @@ kaggle_environments/envs/lux_ai_s2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQe
105
105
  kaggle_environments/envs/lux_ai_s2/agents.py,sha256=43bT4pa6t1SsAS4akQ8y2L7wJrs0hZAH0v1M5Nt_vR0,112
106
106
  kaggle_environments/envs/lux_ai_s2/index.html,sha256=-mAWnS23XMRMqDbT4Ceb7aFeFisKM12ri24GZBLNiKw,1606
107
107
  kaggle_environments/envs/lux_ai_s2/lux_ai_s2.json,sha256=eiiNUsvePpW2FTOVdJ4Lxy6P82TjOmc-6kA9V9Aqxks,1924
108
- kaggle_environments/envs/lux_ai_s2/lux_ai_s2.py,sha256=pUpFULFEZ-tsmVnEyTI9m_OKLdRxDtIbyFJ1xlGov5g,4555
108
+ kaggle_environments/envs/lux_ai_s2/lux_ai_s2.py,sha256=R2CPS2yr2SsHzDtuAUA3k5evzGnibwNbSdwg5OZOwKg,5208
109
109
  kaggle_environments/envs/lux_ai_s2/test_lux.py,sha256=ngPPwEBbLZXpUkC0A6G8RdrCRW83yp8GmWJKuWusNyo,300
110
110
  kaggle_environments/envs/lux_ai_s2/luxai_s2/__init__.py,sha256=RR5qH3QiHJ_WxLf1iVi5bEPbFJYtySJ9Cpd5fhD-Dhk,59
111
111
  kaggle_environments/envs/lux_ai_s2/luxai_s2/actions.py,sha256=FtVPwW1muusolkpf9HbwNyQlCkeF96UAguWrjquwnuk,13446
@@ -176,9 +176,9 @@ kaggle_environments/envs/tictactoe/tictactoe.js,sha256=NZDT-oSG0a6a-rso9Ldh9qkJw
176
176
  kaggle_environments/envs/tictactoe/tictactoe.json,sha256=zMXZ8-fpT7FBhzz2FFBvRLn4XwtngjEqOieMvI6cCj8,1121
177
177
  kaggle_environments/envs/tictactoe/tictactoe.py,sha256=iLNU5V-lz7Xab-d1vpPMfU5jDM3QtgBUH63Y_SU7I9Y,3639
178
178
  kaggle_environments/static/player.html,sha256=HH8qvFfTIDw8eZvw5W88jcCu58Lo4_eUQ1ak46KWVGQ,22945
179
- kaggle_environments-1.14.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
180
- kaggle_environments-1.14.1.dist-info/METADATA,sha256=yRR4WK5x1Q6A4sSCBL9Tmit31aYhYjES6t48snhTnuE,10603
181
- kaggle_environments-1.14.1.dist-info/WHEEL,sha256=m9WAupmBd2JGDsXWQGJgMGXIWbQY3F5c2xBJbBhq0nY,110
182
- kaggle_environments-1.14.1.dist-info/entry_points.txt,sha256=HbVC-LKGQFV6lEEYBYyDTtrkHgdHJUWQ8_qt9KHGqz4,70
183
- kaggle_environments-1.14.1.dist-info/top_level.txt,sha256=v3MMWIPMQFcI-WuF_dJngHWe9Bb2yH_6p4wat1x4gAc,20
184
- kaggle_environments-1.14.1.dist-info/RECORD,,
179
+ kaggle_environments-1.14.5.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
180
+ kaggle_environments-1.14.5.dist-info/METADATA,sha256=Zn6TzB6J1NEXFrMd2W2M_DFkdXgqXQ_wZhx5uus8H18,10700
181
+ kaggle_environments-1.14.5.dist-info/WHEEL,sha256=m9WAupmBd2JGDsXWQGJgMGXIWbQY3F5c2xBJbBhq0nY,110
182
+ kaggle_environments-1.14.5.dist-info/entry_points.txt,sha256=HbVC-LKGQFV6lEEYBYyDTtrkHgdHJUWQ8_qt9KHGqz4,70
183
+ kaggle_environments-1.14.5.dist-info/top_level.txt,sha256=v3MMWIPMQFcI-WuF_dJngHWe9Bb2yH_6p4wat1x4gAc,20
184
+ kaggle_environments-1.14.5.dist-info/RECORD,,