kaggle-environments 1.17.8__py2.py3-none-any.whl → 1.17.10__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.
- kaggle_environments/__init__.py +1 -1
- kaggle_environments/agent.py +2 -2
- kaggle_environments/core.py +2 -2
- kaggle_environments/envs/open_spiel/games/chess/chess.js +200 -93
- kaggle_environments/static/player.html +72 -61
- {kaggle_environments-1.17.8.dist-info → kaggle_environments-1.17.10.dist-info}/METADATA +1 -1
- {kaggle_environments-1.17.8.dist-info → kaggle_environments-1.17.10.dist-info}/RECORD +11 -11
- {kaggle_environments-1.17.8.dist-info → kaggle_environments-1.17.10.dist-info}/WHEEL +1 -1
- {kaggle_environments-1.17.8.dist-info → kaggle_environments-1.17.10.dist-info}/entry_points.txt +0 -0
- {kaggle_environments-1.17.8.dist-info → kaggle_environments-1.17.10.dist-info}/licenses/LICENSE +0 -0
- {kaggle_environments-1.17.8.dist-info → kaggle_environments-1.17.10.dist-info}/top_level.txt +0 -0
kaggle_environments/__init__.py
CHANGED
|
@@ -20,7 +20,7 @@ from .core import *
|
|
|
20
20
|
from .main import http_request
|
|
21
21
|
from . import errors
|
|
22
22
|
|
|
23
|
-
__version__ = "1.17.
|
|
23
|
+
__version__ = "1.17.10"
|
|
24
24
|
|
|
25
25
|
__all__ = ["Agent", "environments", "errors", "evaluate", "http_request",
|
|
26
26
|
"make", "register", "utils", "__version__",
|
kaggle_environments/agent.py
CHANGED
|
@@ -174,8 +174,8 @@ class Agent:
|
|
|
174
174
|
out = out_buffer.getvalue()
|
|
175
175
|
err = err_buffer.getvalue()
|
|
176
176
|
# Get the maximum log length
|
|
177
|
-
# Allow up to
|
|
178
|
-
max_log_length = self.configuration.get('maxLogLength',
|
|
177
|
+
# Allow up to 10k (default) log characters per step which is ~10MB per 600 step episode
|
|
178
|
+
max_log_length = self.configuration.get('maxLogLength', 10000)
|
|
179
179
|
|
|
180
180
|
# truncate if max_log_length is set to None, do not truncate
|
|
181
181
|
if max_log_length is not None:
|
kaggle_environments/core.py
CHANGED
|
@@ -608,8 +608,8 @@ class Environment:
|
|
|
608
608
|
err = err_buffer.getvalue()
|
|
609
609
|
|
|
610
610
|
# strip if needed
|
|
611
|
-
# Allow up to
|
|
612
|
-
max_log_length = self.configuration.get("maxLogLength",
|
|
611
|
+
# Allow up to 10k (default) log characters per step which is ~10MB per 600 step episode
|
|
612
|
+
max_log_length = self.configuration.get("maxLogLength", 10000)
|
|
613
613
|
if max_log_length is not None:
|
|
614
614
|
out = out[0:max_log_length]
|
|
615
615
|
err = err[0:max_log_length]
|
|
@@ -1,41 +1,39 @@
|
|
|
1
1
|
function renderer(options) {
|
|
2
|
-
const { environment, step, parent, width = 400, height = 400 } = options;
|
|
2
|
+
const { environment, step, parent, width = 400, height = 400 } = options; // Chess-specific constants
|
|
3
3
|
|
|
4
|
-
// Chess-specific constants
|
|
5
4
|
const DEFAULT_NUM_ROWS = 8;
|
|
6
5
|
const DEFAULT_NUM_COLS = 8;
|
|
7
6
|
const PIECE_SVG_URLS = {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
7
|
+
p: 'https://upload.wikimedia.org/wikipedia/commons/c/c7/Chess_pdt45.svg', // Black Pawn
|
|
8
|
+
r: 'https://upload.wikimedia.org/wikipedia/commons/f/ff/Chess_rdt45.svg', // Black Rook
|
|
9
|
+
n: 'https://upload.wikimedia.org/wikipedia/commons/e/ef/Chess_ndt45.svg', // Black Knight
|
|
10
|
+
b: 'https://upload.wikimedia.org/wikipedia/commons/9/98/Chess_bdt45.svg', // Black Bishop
|
|
11
|
+
q: 'https://upload.wikimedia.org/wikipedia/commons/4/47/Chess_qdt45.svg', // Black Queen
|
|
12
|
+
k: 'https://upload.wikimedia.org/wikipedia/commons/f/f0/Chess_kdt45.svg', // Black King
|
|
13
|
+
P: 'https://upload.wikimedia.org/wikipedia/commons/4/45/Chess_plt45.svg', // White Pawn
|
|
14
|
+
R: 'https://upload.wikimedia.org/wikipedia/commons/7/72/Chess_rlt45.svg', // White Rook
|
|
15
|
+
N: 'https://upload.wikimedia.org/wikipedia/commons/7/70/Chess_nlt45.svg', // White Knight
|
|
16
|
+
B: 'https://upload.wikimedia.org/wikipedia/commons/b/b1/Chess_blt45.svg', // White Bishop
|
|
17
|
+
Q: 'https://upload.wikimedia.org/wikipedia/commons/1/15/Chess_qlt45.svg', // White Queen
|
|
18
|
+
K: 'https://upload.wikimedia.org/wikipedia/commons/4/42/Chess_klt45.svg' // White King
|
|
20
19
|
};
|
|
21
20
|
const LIGHT_SQUARE_COLOR = '#f0d9b5';
|
|
22
21
|
const DARK_SQUARE_COLOR = '#b58863';
|
|
23
22
|
|
|
24
|
-
// Renderer state variables
|
|
25
23
|
let currentBoardElement = null;
|
|
26
24
|
let currentStatusTextElement = null;
|
|
27
25
|
let currentWinnerTextElement = null;
|
|
28
26
|
let currentMessageBoxElement = typeof document !== 'undefined' ? document.getElementById('messageBox') : null;
|
|
29
27
|
let currentRendererContainer = null;
|
|
28
|
+
let currentBoardContainer = null;
|
|
30
29
|
let currentTitleElement = null;
|
|
31
|
-
let squareSize =
|
|
30
|
+
let squareSize = 0;
|
|
32
31
|
|
|
33
32
|
function _showMessage(message, type = 'info', duration = 3000) {
|
|
34
33
|
if (typeof document === 'undefined' || !document.body) return;
|
|
35
34
|
if (!currentMessageBoxElement) {
|
|
36
35
|
currentMessageBoxElement = document.createElement('div');
|
|
37
36
|
currentMessageBoxElement.id = 'messageBox';
|
|
38
|
-
// Identical styling to the Connect Four renderer's message box
|
|
39
37
|
Object.assign(currentMessageBoxElement.style, {
|
|
40
38
|
position: 'fixed',
|
|
41
39
|
top: '10px',
|
|
@@ -56,71 +54,148 @@ function renderer(options) {
|
|
|
56
54
|
currentMessageBoxElement.textContent = message;
|
|
57
55
|
currentMessageBoxElement.style.backgroundColor = type === 'error' ? '#ef4444' : '#10b981';
|
|
58
56
|
currentMessageBoxElement.style.opacity = '1';
|
|
59
|
-
setTimeout(() => {
|
|
57
|
+
setTimeout(() => {
|
|
58
|
+
if (currentMessageBoxElement) currentMessageBoxElement.style.opacity = '0';
|
|
59
|
+
}, duration);
|
|
60
60
|
}
|
|
61
|
-
|
|
62
61
|
function _ensureRendererElements(parentElementToClear, rows, cols) {
|
|
63
62
|
if (!parentElementToClear) return false;
|
|
64
63
|
parentElementToClear.innerHTML = '';
|
|
65
64
|
|
|
65
|
+
// NEW: Check for mobile screen size to apply responsive styles.
|
|
66
|
+
const isMobile = window.innerWidth < 768;
|
|
67
|
+
|
|
66
68
|
currentRendererContainer = document.createElement('div');
|
|
67
69
|
Object.assign(currentRendererContainer.style, {
|
|
68
70
|
display: 'flex',
|
|
69
71
|
flexDirection: 'column',
|
|
70
72
|
alignItems: 'center',
|
|
71
|
-
padding: '20px',
|
|
73
|
+
padding: isMobile ? '10px' : '20px', // Responsive padding
|
|
72
74
|
boxSizing: 'border-box',
|
|
73
75
|
width: '100%',
|
|
74
76
|
height: '100%',
|
|
75
77
|
fontFamily: "'Inter', sans-serif"
|
|
76
78
|
});
|
|
79
|
+
parentElementToClear.appendChild(currentRendererContainer);
|
|
77
80
|
|
|
78
81
|
if (!environment.viewer) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
82
|
+
const headerContainer = document.createElement('div');
|
|
83
|
+
Object.assign(headerContainer.style, {
|
|
84
|
+
display: 'flex',
|
|
85
|
+
justifyContent: 'center',
|
|
86
|
+
alignItems: 'center',
|
|
87
|
+
width: '100%',
|
|
88
|
+
marginBottom: '1rem',
|
|
89
|
+
color: 'white',
|
|
90
|
+
flexShrink: '0',
|
|
91
|
+
flexDirection: isMobile ? 'column' : 'row' // Stacks header vertically on mobile
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// Player 2 (White) - Left side
|
|
95
|
+
const whitePlayerContainer = document.createElement('div');
|
|
96
|
+
Object.assign(whitePlayerContainer.style, {
|
|
97
|
+
display: 'flex',
|
|
98
|
+
alignItems: 'center'
|
|
99
|
+
});
|
|
100
|
+
const whitePawnImg = document.createElement('img');
|
|
101
|
+
whitePawnImg.src = PIECE_SVG_URLS.P;
|
|
102
|
+
Object.assign(whitePawnImg.style, { height: '30px', marginRight: '8px' });
|
|
103
|
+
const whitePlayerName = document.createElement('span');
|
|
104
|
+
whitePlayerName.textContent = environment.info?.TeamNames?.[1] || 'Player 2';
|
|
105
|
+
Object.assign(whitePlayerName.style, {
|
|
106
|
+
fontSize: isMobile ? '1rem' : '1.1rem', // Responsive font size
|
|
107
|
+
fontWeight: 'bold'
|
|
108
|
+
});
|
|
109
|
+
whitePlayerContainer.appendChild(whitePawnImg);
|
|
110
|
+
whitePlayerContainer.appendChild(whitePlayerName);
|
|
111
|
+
|
|
112
|
+
// Center Title
|
|
113
|
+
currentTitleElement = document.createElement('h1');
|
|
114
|
+
currentTitleElement.textContent = 'Chess';
|
|
115
|
+
Object.assign(currentTitleElement.style, {
|
|
116
|
+
fontSize: isMobile ? '1.5rem' : '1.875rem', // Responsive font size
|
|
117
|
+
fontWeight: 'bold',
|
|
118
|
+
textAlign: 'center',
|
|
119
|
+
color: '#e5e7eb',
|
|
120
|
+
margin: isMobile ? '10px 0' : '0 40px', // Responsive margin
|
|
121
|
+
order: isMobile ? '0' : 'initial' // Ensures title is between players on desktop
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// Player 1 (Black) - Right side
|
|
125
|
+
const blackPlayerContainer = document.createElement('div');
|
|
126
|
+
Object.assign(blackPlayerContainer.style, {
|
|
127
|
+
display: 'flex',
|
|
128
|
+
alignItems: 'center'
|
|
129
|
+
});
|
|
130
|
+
const blackPlayerName = document.createElement('span');
|
|
131
|
+
blackPlayerName.textContent = environment.info?.TeamNames?.[0] || 'Player 1';
|
|
132
|
+
Object.assign(blackPlayerName.style, {
|
|
133
|
+
fontSize: isMobile ? '1rem' : '1.1rem', // Responsive font size
|
|
134
|
+
fontWeight: 'bold'
|
|
135
|
+
});
|
|
136
|
+
const blackPawnImg = document.createElement('img');
|
|
137
|
+
blackPawnImg.src = PIECE_SVG_URLS.p;
|
|
138
|
+
Object.assign(blackPawnImg.style, { height: '30px', marginLeft: '8px' });
|
|
139
|
+
blackPlayerContainer.appendChild(blackPlayerName);
|
|
140
|
+
blackPlayerContainer.appendChild(blackPawnImg);
|
|
141
|
+
|
|
142
|
+
// Assemble the header - order matters for mobile stacking
|
|
143
|
+
if (isMobile) {
|
|
144
|
+
// On mobile: White Player, then Black Player, then Title for a "vs" feel
|
|
145
|
+
headerContainer.appendChild(whitePlayerContainer);
|
|
146
|
+
const vsText = document.createElement('div');
|
|
147
|
+
vsText.textContent = 'vs';
|
|
148
|
+
Object.assign(vsText.style, { margin: '4px 0', fontStyle: 'italic' });
|
|
149
|
+
headerContainer.appendChild(vsText);
|
|
150
|
+
headerContainer.appendChild(blackPlayerContainer);
|
|
151
|
+
// Title is not added here for mobile to keep it separate or could be added last
|
|
152
|
+
} else {
|
|
153
|
+
// On desktop: White Player, Title, Black Player
|
|
154
|
+
headerContainer.appendChild(whitePlayerContainer);
|
|
155
|
+
headerContainer.appendChild(currentTitleElement);
|
|
156
|
+
headerContainer.appendChild(blackPlayerContainer);
|
|
157
|
+
}
|
|
158
|
+
currentRendererContainer.appendChild(headerContainer);
|
|
90
159
|
}
|
|
91
|
-
parentElementToClear.appendChild(currentRendererContainer);
|
|
92
160
|
|
|
93
|
-
|
|
94
|
-
|
|
161
|
+
// ... (The rest of the function for the board and status container remains the same, but let's add responsive fonts to the status)
|
|
162
|
+
|
|
163
|
+
// Board container...
|
|
164
|
+
currentBoardContainer = document.createElement('div');
|
|
165
|
+
Object.assign(currentBoardContainer.style, {
|
|
166
|
+
display: 'flex',
|
|
167
|
+
justifyContent: 'center',
|
|
168
|
+
alignItems: 'center',
|
|
169
|
+
flexGrow: '1',
|
|
170
|
+
overflow: 'hidden',
|
|
171
|
+
width: '100%',
|
|
172
|
+
minHeight: '0'
|
|
173
|
+
});
|
|
174
|
+
currentRendererContainer.appendChild(currentBoardContainer);
|
|
175
|
+
|
|
176
|
+
// ... code to create board and squares ...
|
|
95
177
|
currentBoardElement = document.createElement('div');
|
|
96
178
|
Object.assign(currentBoardElement.style, {
|
|
97
179
|
display: 'grid',
|
|
98
|
-
gridTemplateColumns: `repeat(${cols}, ${squareSize}px)`,
|
|
99
|
-
gridTemplateRows: `repeat(${rows}, ${squareSize}px)`,
|
|
100
|
-
width: `${cols * squareSize}px`,
|
|
101
|
-
height: `${rows * squareSize}px`,
|
|
102
180
|
border: '2px solid #333'
|
|
103
181
|
});
|
|
104
|
-
|
|
182
|
+
currentBoardContainer.appendChild(currentBoardElement);
|
|
105
183
|
for (let r = 0; r < rows; r++) {
|
|
106
184
|
for (let c = 0; c < cols; c++) {
|
|
107
185
|
const square = document.createElement('div');
|
|
108
186
|
square.id = `cell-${r}-${c}`;
|
|
109
187
|
Object.assign(square.style, {
|
|
110
|
-
width: `${squareSize}px`,
|
|
111
|
-
height: `${squareSize}px`,
|
|
112
188
|
backgroundColor: (r + c) % 2 === 0 ? LIGHT_SQUARE_COLOR : DARK_SQUARE_COLOR,
|
|
113
189
|
display: 'flex',
|
|
114
190
|
alignItems: 'center',
|
|
115
|
-
justifyContent: 'center'
|
|
191
|
+
justifyContent: 'center'
|
|
116
192
|
});
|
|
117
193
|
currentBoardElement.appendChild(square);
|
|
118
194
|
}
|
|
119
195
|
}
|
|
120
|
-
currentRendererContainer.appendChild(currentBoardElement);
|
|
121
196
|
|
|
197
|
+
// Status Container
|
|
122
198
|
const statusContainer = document.createElement('div');
|
|
123
|
-
// Identical styling to the Connect Four renderer's status container
|
|
124
199
|
Object.assign(statusContainer.style, {
|
|
125
200
|
padding: '10px 15px',
|
|
126
201
|
backgroundColor: 'white',
|
|
@@ -130,15 +205,16 @@ function renderer(options) {
|
|
|
130
205
|
width: 'auto',
|
|
131
206
|
minWidth: '200px',
|
|
132
207
|
maxWidth: '90vw',
|
|
133
|
-
marginTop: '20px'
|
|
208
|
+
marginTop: '20px',
|
|
209
|
+
flexShrink: '0'
|
|
134
210
|
});
|
|
135
211
|
if (!environment.viewer) {
|
|
136
|
-
|
|
212
|
+
currentRendererContainer.appendChild(statusContainer);
|
|
137
213
|
}
|
|
138
214
|
|
|
139
215
|
currentStatusTextElement = document.createElement('p');
|
|
140
216
|
Object.assign(currentStatusTextElement.style, {
|
|
141
|
-
fontSize: '1.1rem',
|
|
217
|
+
fontSize: isMobile ? '0.9rem' : '1.1rem', // Responsive font size
|
|
142
218
|
fontWeight: '600',
|
|
143
219
|
margin: '0 0 5px 0'
|
|
144
220
|
});
|
|
@@ -146,19 +222,15 @@ function renderer(options) {
|
|
|
146
222
|
|
|
147
223
|
currentWinnerTextElement = document.createElement('p');
|
|
148
224
|
Object.assign(currentWinnerTextElement.style, {
|
|
149
|
-
fontSize: '1.25rem',
|
|
225
|
+
fontSize: isMobile ? '1rem' : '1.25rem', // Responsive font size
|
|
150
226
|
fontWeight: '700',
|
|
151
227
|
margin: '5px 0 0 0'
|
|
152
228
|
});
|
|
153
229
|
statusContainer.appendChild(currentWinnerTextElement);
|
|
154
230
|
|
|
155
|
-
if (typeof document !== 'undefined' && !document.body.hasAttribute('data-renderer-initialized')) {
|
|
156
|
-
document.body.setAttribute('data-renderer-initialized', 'true');
|
|
157
|
-
}
|
|
158
231
|
return true;
|
|
159
232
|
}
|
|
160
233
|
|
|
161
|
-
// White is in position 1, Black is in position 0
|
|
162
234
|
function _getTeamNameForColor(color, teamNames) {
|
|
163
235
|
if (!teamNames || teamNames.length < 2) return null;
|
|
164
236
|
return color.toLowerCase() === 'white' ? teamNames[1] : teamNames[0];
|
|
@@ -166,22 +238,22 @@ function renderer(options) {
|
|
|
166
238
|
|
|
167
239
|
function _deriveWinnerFromRewards(currentStepAgents, teamNames) {
|
|
168
240
|
if (!currentStepAgents || currentStepAgents.length < 2) return null;
|
|
169
|
-
|
|
241
|
+
|
|
170
242
|
const player0Reward = currentStepAgents[0].reward;
|
|
171
243
|
const player1Reward = currentStepAgents[1].reward;
|
|
172
|
-
|
|
244
|
+
|
|
173
245
|
if (player0Reward === player1Reward) {
|
|
174
246
|
return 'draw';
|
|
175
247
|
}
|
|
176
|
-
|
|
248
|
+
|
|
177
249
|
const winnerPlayerIndex = player0Reward === 1 ? 0 : 1;
|
|
178
250
|
const color = winnerPlayerIndex === 0 ? 'Black' : 'White';
|
|
179
|
-
|
|
251
|
+
|
|
180
252
|
if (teamNames) {
|
|
181
253
|
const teamName = _getTeamNameForColor(color, teamNames);
|
|
182
254
|
return `${color} (${teamName})`;
|
|
183
255
|
}
|
|
184
|
-
|
|
256
|
+
|
|
185
257
|
return color.toLowerCase();
|
|
186
258
|
}
|
|
187
259
|
|
|
@@ -216,29 +288,51 @@ function renderer(options) {
|
|
|
216
288
|
};
|
|
217
289
|
}
|
|
218
290
|
|
|
219
|
-
|
|
220
291
|
function _renderBoardDisplay(gameStateToDisplay, displayRows, displayCols) {
|
|
221
|
-
if (!currentBoardElement || !currentStatusTextElement || !currentWinnerTextElement)
|
|
292
|
+
if (!currentBoardContainer || !currentBoardElement || !currentStatusTextElement || !currentWinnerTextElement)
|
|
293
|
+
return;
|
|
294
|
+
|
|
295
|
+
const isMobile = window.innerWidth < 768;
|
|
296
|
+
|
|
297
|
+
// Calculate and apply board size
|
|
298
|
+
const containerWidth = currentBoardContainer.clientWidth ?? width;
|
|
299
|
+
const containerHeight = currentBoardContainer.clientHeight ?? height;
|
|
300
|
+
const smallestContainerEdge = Math.min(containerWidth, containerHeight);
|
|
301
|
+
const newSquareSize = Math.floor(smallestContainerEdge / displayCols);
|
|
302
|
+
|
|
303
|
+
if (newSquareSize !== squareSize) {
|
|
304
|
+
squareSize = newSquareSize;
|
|
305
|
+
Object.assign(currentBoardElement.style, {
|
|
306
|
+
gridTemplateColumns: `repeat(${displayCols}, ${squareSize}px)`,
|
|
307
|
+
gridTemplateRows: `repeat(${displayRows}, ${squareSize}px)`,
|
|
308
|
+
width: `${displayCols * squareSize}px`,
|
|
309
|
+
height: `${displayRows * squareSize}px`
|
|
310
|
+
});
|
|
222
311
|
|
|
223
|
-
|
|
312
|
+
const squares = currentBoardElement.querySelectorAll('div[id^="cell-"]');
|
|
313
|
+
squares.forEach((square) => {
|
|
314
|
+
Object.assign(square.style, {
|
|
315
|
+
width: `${squareSize}px`,
|
|
316
|
+
height: `${squareSize}px`
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Clear and render board pieces...
|
|
224
322
|
for (let r = 0; r < displayRows; r++) {
|
|
225
323
|
for (let c = 0; c < displayCols; c++) {
|
|
226
324
|
const squareElement = currentBoardElement.querySelector(`#cell-${r}-${c}`);
|
|
227
|
-
if (squareElement)
|
|
228
|
-
squareElement.innerHTML = '';
|
|
229
|
-
}
|
|
325
|
+
if (squareElement) squareElement.innerHTML = '';
|
|
230
326
|
}
|
|
231
327
|
}
|
|
232
|
-
|
|
328
|
+
|
|
233
329
|
if (!gameStateToDisplay || !gameStateToDisplay.board) {
|
|
234
|
-
currentStatusTextElement.textContent =
|
|
235
|
-
currentWinnerTextElement.textContent =
|
|
330
|
+
currentStatusTextElement.textContent = 'Waiting for game data...';
|
|
331
|
+
currentWinnerTextElement.textContent = '';
|
|
236
332
|
return;
|
|
237
333
|
}
|
|
238
334
|
|
|
239
|
-
|
|
240
335
|
const { board, activeColor, isTerminal, winner } = gameStateToDisplay;
|
|
241
|
-
|
|
242
336
|
const pieceSize = Math.floor(squareSize * 0.9);
|
|
243
337
|
for (let r_data = 0; r_data < displayRows; r_data++) {
|
|
244
338
|
for (let c_data = 0; c_data < displayCols; c_data++) {
|
|
@@ -254,76 +348,89 @@ function renderer(options) {
|
|
|
254
348
|
}
|
|
255
349
|
}
|
|
256
350
|
|
|
351
|
+
// Render status text
|
|
257
352
|
currentStatusTextElement.innerHTML = '';
|
|
258
353
|
currentWinnerTextElement.innerHTML = '';
|
|
259
354
|
if (isTerminal) {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
355
|
+
const winnerText = winner
|
|
356
|
+
? String(winner).toLowerCase() === 'draw'
|
|
357
|
+
? "It's a Draw!"
|
|
358
|
+
: winner
|
|
359
|
+
: 'Game ended.';
|
|
360
|
+
if (isMobile) {
|
|
361
|
+
currentStatusTextElement.innerHTML = `<div style="font-size: 0.9rem; color: #666;">Winner</div>`;
|
|
362
|
+
currentWinnerTextElement.innerHTML = `<div style="font-size: 1.1rem; font-weight: bold;">${winnerText}</div>`;
|
|
267
363
|
} else {
|
|
268
|
-
|
|
364
|
+
currentStatusTextElement.textContent = 'Game Over!';
|
|
365
|
+
currentWinnerTextElement.innerHTML = `Winner: <span style="font-weight: bold;">${winnerText}</span>`;
|
|
269
366
|
}
|
|
270
367
|
} else {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
368
|
+
const playerColor = String(activeColor).toLowerCase() === 'w' ? 'White' : 'Black';
|
|
369
|
+
const teamName = _getTeamNameForColor(playerColor, environment.info?.TeamNames);
|
|
370
|
+
const currentPlayerText = teamName ? `${playerColor} (${teamName})` : playerColor;
|
|
371
|
+
|
|
372
|
+
if (isMobile) {
|
|
373
|
+
currentStatusTextElement.innerHTML = `<div style="font-size: 0.9rem; color: #666;">Current Player</div>`;
|
|
374
|
+
currentWinnerTextElement.innerHTML = `<div style="font-size: 1.1rem; font-weight: bold;">${currentPlayerText}</div>`;
|
|
375
|
+
} else {
|
|
376
|
+
currentStatusTextElement.innerHTML = `Current Player: <span style="font-weight: bold;">${currentPlayerText}</span>`;
|
|
377
|
+
currentWinnerTextElement.innerHTML = ''; // Clear winner text when game is active
|
|
378
|
+
}
|
|
276
379
|
}
|
|
277
380
|
}
|
|
278
381
|
|
|
279
|
-
// --- Main execution logic ---
|
|
280
382
|
if (!_ensureRendererElements(parent, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS)) {
|
|
281
383
|
if (parent && typeof parent.innerHTML !== 'undefined') {
|
|
282
|
-
parent.innerHTML =
|
|
384
|
+
parent.innerHTML =
|
|
385
|
+
"<p style='color:red; font-family: sans-serif;'>Critical Error: Renderer element setup failed.</p>";
|
|
283
386
|
}
|
|
284
387
|
return;
|
|
285
388
|
}
|
|
286
389
|
|
|
287
390
|
if (!environment || !environment.steps || !environment.steps[step]) {
|
|
288
391
|
_renderBoardDisplay(null, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS);
|
|
289
|
-
if (currentStatusTextElement) currentStatusTextElement.textContent =
|
|
392
|
+
if (currentStatusTextElement) currentStatusTextElement.textContent = 'Initializing environment...';
|
|
290
393
|
return;
|
|
291
394
|
}
|
|
292
395
|
|
|
293
396
|
const currentStepAgents = environment.steps[step];
|
|
294
397
|
if (!currentStepAgents || !Array.isArray(currentStepAgents) || currentStepAgents.length === 0) {
|
|
295
398
|
_renderBoardDisplay(null, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS);
|
|
296
|
-
if (currentStatusTextElement) currentStatusTextElement.textContent =
|
|
399
|
+
if (currentStatusTextElement) currentStatusTextElement.textContent = 'Waiting for agent data...';
|
|
297
400
|
return;
|
|
298
401
|
}
|
|
299
|
-
|
|
300
|
-
// In chess, observation is the same for both agents. We can take it from the first.
|
|
402
|
+
|
|
301
403
|
const agent = currentStepAgents[0];
|
|
302
404
|
|
|
303
405
|
if (!agent || typeof agent.observation === 'undefined') {
|
|
304
406
|
_renderBoardDisplay(null, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS);
|
|
305
|
-
if (currentStatusTextElement) currentStatusTextElement.textContent =
|
|
407
|
+
if (currentStatusTextElement) currentStatusTextElement.textContent = 'Waiting for observation data...';
|
|
306
408
|
return;
|
|
307
409
|
}
|
|
308
410
|
const observationForRenderer = agent.observation;
|
|
309
411
|
|
|
310
412
|
let gameSpecificState = null;
|
|
311
413
|
|
|
312
|
-
if (
|
|
414
|
+
if (
|
|
415
|
+
observationForRenderer &&
|
|
416
|
+
typeof observationForRenderer.observationString === 'string' &&
|
|
417
|
+
observationForRenderer.observationString.trim() !== ''
|
|
418
|
+
) {
|
|
313
419
|
try {
|
|
314
420
|
const fen = observationForRenderer.observationString;
|
|
315
421
|
const parsedFen = _parseFen(fen);
|
|
316
422
|
if (parsedFen) {
|
|
317
|
-
const winner = observationForRenderer.isTerminal
|
|
318
|
-
_deriveWinnerFromRewards(currentStepAgents, environment.info?.TeamNames)
|
|
319
|
-
|
|
423
|
+
const winner = observationForRenderer.isTerminal
|
|
424
|
+
? _deriveWinnerFromRewards(currentStepAgents, environment.info?.TeamNames)
|
|
425
|
+
: null;
|
|
426
|
+
gameSpecificState = {
|
|
320
427
|
...parsedFen,
|
|
321
428
|
isTerminal: observationForRenderer.isTerminal,
|
|
322
429
|
winner: winner
|
|
323
430
|
};
|
|
324
431
|
}
|
|
325
432
|
} catch (e) {
|
|
326
|
-
_showMessage(
|
|
433
|
+
_showMessage('Error: Corrupted game state (obs_string).', 'error');
|
|
327
434
|
}
|
|
328
435
|
}
|
|
329
436
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
See the License for the specific language governing permissions and
|
|
14
14
|
limitations under the License.
|
|
15
15
|
-->
|
|
16
|
-
<!
|
|
16
|
+
<!doctype html>
|
|
17
17
|
<html lang="en">
|
|
18
18
|
<head>
|
|
19
19
|
<title>Kaggle Simulation Player</title>
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
</g>
|
|
97
97
|
</svg>
|
|
98
98
|
</a>
|
|
99
|
-
|
|
99
|
+
`,
|
|
100
100
|
)`
|
|
101
101
|
display: inline-flex;
|
|
102
102
|
`;
|
|
@@ -129,11 +129,9 @@
|
|
|
129
129
|
|
|
130
130
|
useEffect(async () => {
|
|
131
131
|
if (!ref.current) return;
|
|
132
|
-
|
|
133
132
|
const renderFrame = async (start, step, lastFrame) => {
|
|
134
133
|
if (step !== context.step) return;
|
|
135
134
|
if (lastFrame === 1) {
|
|
136
|
-
if (!animate) return;
|
|
137
135
|
start = Date.now();
|
|
138
136
|
}
|
|
139
137
|
const frame =
|
|
@@ -142,16 +140,18 @@
|
|
|
142
140
|
: 1;
|
|
143
141
|
try {
|
|
144
142
|
if (debug) console.time("render");
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
143
|
+
if (typeof renderer === "function") {
|
|
144
|
+
await renderer({
|
|
145
|
+
...context,
|
|
146
|
+
frame,
|
|
147
|
+
height: ref.current.clientHeight,
|
|
148
|
+
hooks: preactHooks,
|
|
149
|
+
parent: ref.current,
|
|
150
|
+
preact,
|
|
151
|
+
styled,
|
|
152
|
+
width: ref.current.clientWidth,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
155
|
} catch (error) {
|
|
156
156
|
if (debug) console.error(error);
|
|
157
157
|
console.log({ ...context, frame, error });
|
|
@@ -199,7 +199,7 @@
|
|
|
199
199
|
${processing && h`<${Processing} />`}
|
|
200
200
|
</div>`;
|
|
201
201
|
})`
|
|
202
|
-
background-color: #
|
|
202
|
+
background-color: #1c1d20;
|
|
203
203
|
display: flex;
|
|
204
204
|
flex: 1;
|
|
205
205
|
overflow: hidden;
|
|
@@ -210,34 +210,40 @@
|
|
|
210
210
|
// Partitions the elements of arr into subarrays of max length num.
|
|
211
211
|
const groupIntoSets = (arr, num) => {
|
|
212
212
|
const sets = [];
|
|
213
|
-
arr.forEach(a => {
|
|
213
|
+
arr.forEach((a) => {
|
|
214
214
|
if (sets.length === 0 || sets[sets.length - 1].length === num) {
|
|
215
215
|
sets.push([]);
|
|
216
216
|
}
|
|
217
217
|
sets[sets.length - 1].push(a);
|
|
218
218
|
});
|
|
219
219
|
return sets;
|
|
220
|
-
}
|
|
220
|
+
};
|
|
221
221
|
|
|
222
222
|
// Expects `width` input prop to set proper max-width for agent name span.
|
|
223
223
|
const Legend = styled((props) => {
|
|
224
224
|
const { agents, legend } = useContext(Context);
|
|
225
225
|
|
|
226
|
-
const agentPairs = groupIntoSets(
|
|
226
|
+
const agentPairs = groupIntoSets(
|
|
227
|
+
agents.sort((a, b) => a.index - b.index),
|
|
228
|
+
2,
|
|
229
|
+
);
|
|
227
230
|
|
|
228
231
|
return h`<div className=${props.className}>
|
|
229
|
-
${agentPairs.map(
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
232
|
+
${agentPairs.map(
|
|
233
|
+
(agentList) =>
|
|
234
|
+
h`<ul>
|
|
235
|
+
${agentList.map(
|
|
236
|
+
(a) =>
|
|
237
|
+
h`<li key=${a.id} title="id: ${a.id}" style="color:${a.color || "#FFF"}">
|
|
233
238
|
${a.image && h`<img src=${a.image} />`}
|
|
234
239
|
<span>${a.name}</span>
|
|
235
|
-
</li
|
|
240
|
+
</li>`,
|
|
236
241
|
)}
|
|
237
|
-
</ul
|
|
242
|
+
</ul>`,
|
|
243
|
+
)}
|
|
238
244
|
</div>`;
|
|
239
245
|
})`
|
|
240
|
-
background-color: #
|
|
246
|
+
background-color: #1c1d20;
|
|
241
247
|
font-family: sans-serif;
|
|
242
248
|
font-size: 14px;
|
|
243
249
|
height: 48px;
|
|
@@ -257,7 +263,7 @@
|
|
|
257
263
|
}
|
|
258
264
|
|
|
259
265
|
span {
|
|
260
|
-
max-width: ${p => (p.width || 400) * 0.5 - 36}px;
|
|
266
|
+
max-width: ${(p) => (p.width || 400) * 0.5 - 36}px;
|
|
261
267
|
overflow: hidden;
|
|
262
268
|
text-overflow: ellipsis;
|
|
263
269
|
white-space: nowrap;
|
|
@@ -343,9 +349,8 @@
|
|
|
343
349
|
`;
|
|
344
350
|
|
|
345
351
|
const Controls = styled((props) => {
|
|
346
|
-
const { environment, pause, play, playing, setStep, step } =
|
|
347
|
-
Context
|
|
348
|
-
);
|
|
352
|
+
const { environment, pause, play, playing, setStep, step } =
|
|
353
|
+
useContext(Context);
|
|
349
354
|
const value = step + 1;
|
|
350
355
|
const onClick = () => (playing ? pause() : play());
|
|
351
356
|
const onInput = (e) => {
|
|
@@ -356,13 +361,11 @@
|
|
|
356
361
|
return h`
|
|
357
362
|
<div className=${props.className}>
|
|
358
363
|
<${PlayButton} onClick=${onClick}><svg xmlns="http://www.w3.org/2000/svg" width="24px" height="24px" viewBox="0 0 24 24" fill="#FFFFFF">${
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
<${StepInput} min="1" max=${
|
|
364
|
-
environment.steps.length
|
|
365
|
-
} value="${value}" onInput=${onInput} />
|
|
364
|
+
playing
|
|
365
|
+
? h`<path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z"/><path d="M0 0h24v24H0z" fill="none"/>`
|
|
366
|
+
: h`<path d="M8 5v14l11-7z"/><path d="M0 0h24v24H0z" fill="none"/>`
|
|
367
|
+
}</svg><//>
|
|
368
|
+
<${StepInput} min="1" max=${environment.steps.length} value="${value}" onInput=${onInput} />
|
|
366
369
|
<${StepCount}>${value} / ${environment.steps.length}<//>
|
|
367
370
|
</div>
|
|
368
371
|
`;
|
|
@@ -401,9 +404,8 @@
|
|
|
401
404
|
`;
|
|
402
405
|
|
|
403
406
|
const Settings = styled((props) => {
|
|
404
|
-
const { environment, pause, play, playing, setStep, step } =
|
|
405
|
-
Context
|
|
406
|
-
);
|
|
407
|
+
const { environment, pause, play, playing, setStep, step } =
|
|
408
|
+
useContext(Context);
|
|
407
409
|
|
|
408
410
|
return h`
|
|
409
411
|
<div className=${props.className}>
|
|
@@ -424,13 +426,14 @@
|
|
|
424
426
|
|
|
425
427
|
const Player = styled((props) => {
|
|
426
428
|
const context = useContext(Context);
|
|
427
|
-
const { agents, controls, header, legend, loading, settings, width } =
|
|
429
|
+
const { agents, controls, header, legend, loading, settings, width } =
|
|
430
|
+
context;
|
|
428
431
|
return h`
|
|
429
432
|
<div className=${props.className}>
|
|
430
433
|
${loading && h`<${Loading} />`}
|
|
431
434
|
${!loading && header && h`<${Header} />`}
|
|
432
435
|
${!loading && h`<${Viewer} />`}
|
|
433
|
-
${!loading && legend && h`<${Legend} width=${width}/>`}
|
|
436
|
+
${!loading && legend && agents?.length > 0 && h`<${Legend} width=${width}/>`}
|
|
434
437
|
${!loading && controls && h`<${Controls} />`}
|
|
435
438
|
${!loading && settings && h`<${Settings} />`}
|
|
436
439
|
</div>`;
|
|
@@ -444,7 +447,6 @@
|
|
|
444
447
|
justify-content: center;
|
|
445
448
|
position: relative;
|
|
446
449
|
width: 100%;
|
|
447
|
-
|
|
448
450
|
&:not(.no-border) {
|
|
449
451
|
border: 4px solid #212121;
|
|
450
452
|
}
|
|
@@ -544,7 +546,7 @@
|
|
|
544
546
|
updateContext(window.kaggle || {});
|
|
545
547
|
|
|
546
548
|
if (window.kaggle?.playing) {
|
|
547
|
-
|
|
549
|
+
play(true);
|
|
548
550
|
}
|
|
549
551
|
|
|
550
552
|
// Listen for messages received to update the context.
|
|
@@ -554,16 +556,19 @@
|
|
|
554
556
|
// Ensure the environment names match before updating.
|
|
555
557
|
try {
|
|
556
558
|
if (
|
|
557
|
-
event.data.environment?.name ==
|
|
558
|
-
|
|
559
|
-
event.data.environment?.
|
|
559
|
+
event.data.environment?.name ==
|
|
560
|
+
contextRef.current.environment.name ||
|
|
561
|
+
(event.data.environment?.name &&
|
|
562
|
+
!contextRef.current.environment.name) ||
|
|
563
|
+
event.data.environment?.loading !==
|
|
564
|
+
contextRef.current.environment.loading
|
|
560
565
|
) {
|
|
561
566
|
const nextContext = {
|
|
562
567
|
...event.data,
|
|
563
568
|
environment: {
|
|
564
569
|
...event.data.environment,
|
|
565
|
-
steps: event.data.environment?.steps ?? []
|
|
566
|
-
}
|
|
570
|
+
steps: event.data.environment?.steps ?? [],
|
|
571
|
+
},
|
|
567
572
|
};
|
|
568
573
|
window.kaggle = nextContext;
|
|
569
574
|
if (!window.kaggle.renderer) {
|
|
@@ -576,21 +581,24 @@
|
|
|
576
581
|
...(window.kaggle ?? {}),
|
|
577
582
|
environment: {
|
|
578
583
|
...(window.kaggle?.environment ?? {}),
|
|
579
|
-
steps: event.data.setSteps
|
|
580
|
-
}
|
|
581
|
-
}
|
|
584
|
+
steps: event.data.setSteps,
|
|
585
|
+
},
|
|
586
|
+
};
|
|
582
587
|
window.kaggle = nextContext;
|
|
583
588
|
if (!window.kaggle.renderer) {
|
|
584
589
|
window.kaggle.renderer = window.renderer;
|
|
585
590
|
}
|
|
586
|
-
updateContext(nextContext)
|
|
591
|
+
updateContext(nextContext);
|
|
587
592
|
}
|
|
588
593
|
|
|
589
594
|
// Side load the renderer script if it is specified by the post message event and not already loaded.
|
|
590
|
-
const renderScriptId =
|
|
591
|
-
if (
|
|
595
|
+
const renderScriptId = "rendererScript";
|
|
596
|
+
if (
|
|
597
|
+
event.data.environment?.rendererUrl &&
|
|
598
|
+
!document.querySelector(`#${renderScriptId}`)
|
|
599
|
+
) {
|
|
592
600
|
window.rendererUrl = event.data.environment?.rendererUrl;
|
|
593
|
-
const script = document.createElement(
|
|
601
|
+
const script = document.createElement("script");
|
|
594
602
|
script.id = renderScriptId;
|
|
595
603
|
script.onload = () => {
|
|
596
604
|
window.kaggle.renderer = window.renderer;
|
|
@@ -600,7 +608,7 @@
|
|
|
600
608
|
}
|
|
601
609
|
} catch {}
|
|
602
610
|
},
|
|
603
|
-
false
|
|
611
|
+
false,
|
|
604
612
|
);
|
|
605
613
|
// Listen for keyboard commands.
|
|
606
614
|
window.addEventListener(
|
|
@@ -614,12 +622,15 @@
|
|
|
614
622
|
environment,
|
|
615
623
|
} = contextRef.current;
|
|
616
624
|
const key = event.keyCode;
|
|
617
|
-
const zero_key = 48
|
|
618
|
-
const nine_key = 57
|
|
625
|
+
const zero_key = 48;
|
|
626
|
+
const nine_key = 57;
|
|
619
627
|
if (
|
|
620
628
|
interactive ||
|
|
621
629
|
isInteractive() ||
|
|
622
|
-
(key !== 32 &&
|
|
630
|
+
(key !== 32 &&
|
|
631
|
+
key !== 37 &&
|
|
632
|
+
key !== 39 &&
|
|
633
|
+
!(key >= zero_key && key <= nine_key))
|
|
623
634
|
)
|
|
624
635
|
return;
|
|
625
636
|
|
|
@@ -639,7 +650,7 @@
|
|
|
639
650
|
event.preventDefault();
|
|
640
651
|
return false;
|
|
641
652
|
},
|
|
642
|
-
false
|
|
653
|
+
false,
|
|
643
654
|
);
|
|
644
655
|
}, 1);
|
|
645
656
|
}, []);
|
|
@@ -711,7 +722,7 @@
|
|
|
711
722
|
|
|
712
723
|
return h`
|
|
713
724
|
<${Context.Provider} value=${contextRef.current}>
|
|
714
|
-
<${Player} className="${contextRef.current.environment.viewer ?
|
|
725
|
+
<${Player} className="${contextRef.current.environment.viewer ? "no-border" : ""}" />
|
|
715
726
|
<//>`;
|
|
716
727
|
};
|
|
717
728
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
kaggle_environments/__init__.py,sha256=
|
|
2
|
-
kaggle_environments/agent.py,sha256=
|
|
1
|
+
kaggle_environments/__init__.py,sha256=OCL_DAcP94CEKy_kcY-S_aO58u4QqPeoajar2Q9AyBI,2176
|
|
2
|
+
kaggle_environments/agent.py,sha256=IgRagzcTi6F73nPeViDdh9wvHnx8fQhFmXJNutovGZE,6706
|
|
3
3
|
kaggle_environments/api.py,sha256=eLBKqr11Ku4tdsMUdUqy74FIVEA_hdV3_QUpX84x3Z8,798
|
|
4
|
-
kaggle_environments/core.py,sha256=
|
|
4
|
+
kaggle_environments/core.py,sha256=PzF9NR0rFfFikspJ3HE0uI8UOiv_tlDhGSbu11g9vQQ,27860
|
|
5
5
|
kaggle_environments/errors.py,sha256=SzKjkZP7pJbf9g0GDjGq4XG194hCQXLMwrlMCcm7Ai8,3336
|
|
6
6
|
kaggle_environments/helpers.py,sha256=xkOMXaOMifYHHstDZo8bexk-Qq9suPM7Gkfi2JbXu8M,10627
|
|
7
7
|
kaggle_environments/main.py,sha256=10wtcEFcGIjdOd9AEps5WOAwslc6Wsx3eZ43LXJa8jE,11705
|
|
@@ -196,7 +196,7 @@ kaggle_environments/envs/open_spiel/proxy.py,sha256=8Shane4KWYKvbP9nV3l8VQfAFOfF
|
|
|
196
196
|
kaggle_environments/envs/open_spiel/proxy_test.py,sha256=QkmRo_uS0DgDDm2pbU2vwal5KOMCWKw92rC2_g3MziM,1837
|
|
197
197
|
kaggle_environments/envs/open_spiel/test_open_spiel.py,sha256=MwyjH-e00-3SP8_r10drYTFvplacbo0cDCI0XKtE4wU,3596
|
|
198
198
|
kaggle_environments/envs/open_spiel/games/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
199
|
-
kaggle_environments/envs/open_spiel/games/chess/chess.js,sha256=
|
|
199
|
+
kaggle_environments/envs/open_spiel/games/chess/chess.js,sha256=K9rW8D7IsgUhqTj6MlJzytnQsPWIWEhb4KJkeca8DwI,19275
|
|
200
200
|
kaggle_environments/envs/open_spiel/games/connect_four/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
201
201
|
kaggle_environments/envs/open_spiel/games/connect_four/connect_four.js,sha256=iO74ar3Hh64VYEx9v3eysgrPU-Mcokl9dkFxie6uISg,14893
|
|
202
202
|
kaggle_environments/envs/open_spiel/games/connect_four/connect_four_proxy.py,sha256=2otG99felDYhNhWpsadbM9YUaHtrXqhV1GFNEHhuPwA,2348
|
|
@@ -223,10 +223,10 @@ kaggle_environments/envs/tictactoe/test_tictactoe.py,sha256=6CgQbRz-yxNoMfD5tzmC
|
|
|
223
223
|
kaggle_environments/envs/tictactoe/tictactoe.js,sha256=NZDT-oSG0a6a-rso9Ldh9qkJwVrxrAsjKUC3_tJu3tw,8002
|
|
224
224
|
kaggle_environments/envs/tictactoe/tictactoe.json,sha256=zMXZ8-fpT7FBhzz2FFBvRLn4XwtngjEqOieMvI6cCj8,1121
|
|
225
225
|
kaggle_environments/envs/tictactoe/tictactoe.py,sha256=uq3sTHWNMg0dxX2v9pTbJAKM7fwerxQt7OQjCX96m-Y,3657
|
|
226
|
-
kaggle_environments/static/player.html,sha256=
|
|
227
|
-
kaggle_environments-1.17.
|
|
228
|
-
kaggle_environments-1.17.
|
|
229
|
-
kaggle_environments-1.17.
|
|
230
|
-
kaggle_environments-1.17.
|
|
231
|
-
kaggle_environments-1.17.
|
|
232
|
-
kaggle_environments-1.17.
|
|
226
|
+
kaggle_environments/static/player.html,sha256=l00X3_tfLtr_DmP7xpJFs8lKaTQoZtdexnKlHvT1fHc,25320
|
|
227
|
+
kaggle_environments-1.17.10.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
228
|
+
kaggle_environments-1.17.10.dist-info/METADATA,sha256=Qs1WmewnSzN_tVAhtEy2o-BtqBF6tHjmgozlBwb1zgA,10956
|
|
229
|
+
kaggle_environments-1.17.10.dist-info/WHEEL,sha256=7wAbZI8A1UjN-j4-aYf66qBxOZ0Ioy0QNykkY5NcGJo,109
|
|
230
|
+
kaggle_environments-1.17.10.dist-info/entry_points.txt,sha256=HbVC-LKGQFV6lEEYBYyDTtrkHgdHJUWQ8_qt9KHGqz4,70
|
|
231
|
+
kaggle_environments-1.17.10.dist-info/top_level.txt,sha256=v3MMWIPMQFcI-WuF_dJngHWe9Bb2yH_6p4wat1x4gAc,20
|
|
232
|
+
kaggle_environments-1.17.10.dist-info/RECORD,,
|
{kaggle_environments-1.17.8.dist-info → kaggle_environments-1.17.10.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{kaggle_environments-1.17.8.dist-info → kaggle_environments-1.17.10.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
{kaggle_environments-1.17.8.dist-info → kaggle_environments-1.17.10.dist-info}/top_level.txt
RENAMED
|
File without changes
|