wafer-core 0.1.37__py3-none-any.whl → 0.1.39__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.
Files changed (32) hide show
  1. wafer_core/lib/trace_compare/fusion_analyzer.py +2 -0
  2. wafer_core/rollouts/_logging/__init__.py +5 -1
  3. wafer_core/rollouts/_logging/logging_config.py +95 -3
  4. wafer_core/rollouts/_logging/sample_handler.py +66 -0
  5. wafer_core/rollouts/_pytui/__init__.py +114 -0
  6. wafer_core/rollouts/_pytui/app.py +809 -0
  7. wafer_core/rollouts/_pytui/console.py +291 -0
  8. wafer_core/rollouts/_pytui/renderer.py +210 -0
  9. wafer_core/rollouts/_pytui/spinner.py +73 -0
  10. wafer_core/rollouts/_pytui/terminal.py +489 -0
  11. wafer_core/rollouts/_pytui/text.py +470 -0
  12. wafer_core/rollouts/_pytui/theme.py +241 -0
  13. wafer_core/rollouts/evaluation.py +142 -177
  14. wafer_core/rollouts/progress_app.py +395 -0
  15. wafer_core/rollouts/tui/DESIGN.md +251 -115
  16. wafer_core/rollouts/tui/monitor.py +64 -20
  17. wafer_core/tools/compile/__init__.py +30 -0
  18. wafer_core/tools/compile/compiler.py +314 -0
  19. wafer_core/tools/compile/modal_compile.py +359 -0
  20. wafer_core/tools/compile/tests/__init__.py +1 -0
  21. wafer_core/tools/compile/tests/test_compiler.py +675 -0
  22. wafer_core/tools/compile/tests/test_data/utils.cuh +10 -0
  23. wafer_core/tools/compile/tests/test_data/vector_add.cu +7 -0
  24. wafer_core/tools/compile/tests/test_data/with_header.cu +9 -0
  25. wafer_core/tools/compile/tests/test_modal_integration.py +326 -0
  26. wafer_core/tools/compile/types.py +117 -0
  27. {wafer_core-0.1.37.dist-info → wafer_core-0.1.39.dist-info}/METADATA +1 -1
  28. {wafer_core-0.1.37.dist-info → wafer_core-0.1.39.dist-info}/RECORD +29 -12
  29. wafer_core/rollouts/events.py +0 -240
  30. wafer_core/rollouts/progress_display.py +0 -476
  31. wafer_core/utils/event_streaming.py +0 -63
  32. {wafer_core-0.1.37.dist-info → wafer_core-0.1.39.dist-info}/WHEEL +0 -0
@@ -0,0 +1,326 @@
1
+ """Integration tests for Modal-based CUDA compilation.
2
+
3
+ These tests require Modal to be configured with valid credentials.
4
+ They are skipped if Modal is not available or not authenticated.
5
+
6
+ Run with:
7
+ MODAL_TOKEN_ID=... MODAL_TOKEN_SECRET=... pytest test_modal_integration.py -v
8
+ """
9
+
10
+ import os
11
+ from pathlib import Path
12
+
13
+ import pytest
14
+
15
+ # Skip all tests if Modal credentials are not set
16
+ pytestmark = pytest.mark.skipif(
17
+ not os.environ.get("MODAL_TOKEN_ID") or not os.environ.get("MODAL_TOKEN_SECRET"),
18
+ reason="Modal credentials not configured (set MODAL_TOKEN_ID and MODAL_TOKEN_SECRET)",
19
+ )
20
+
21
+ # Test data directory
22
+ TEST_DATA_DIR = Path(__file__).parent / "test_data"
23
+
24
+
25
+ # =============================================================================
26
+ # Test CUDA Code Samples
27
+ # =============================================================================
28
+
29
+ SIMPLE_KERNEL = """\
30
+ __global__ void test_kernel() {
31
+ // Empty kernel for testing
32
+ }
33
+ """
34
+
35
+ VECTOR_ADD_KERNEL = """\
36
+ __global__ void vector_add(float* a, float* b, float* c, int n) {
37
+ int idx = blockIdx.x * blockDim.x + threadIdx.x;
38
+ if (idx < n) {
39
+ c[idx] = a[idx] + b[idx];
40
+ }
41
+ }
42
+ """
43
+
44
+ SHARED_MEMORY_KERNEL = """\
45
+ #define TILE_SIZE 16
46
+
47
+ __global__ void tiled_matmul(float* A, float* B, float* C, int N) {
48
+ __shared__ float As[TILE_SIZE][TILE_SIZE];
49
+ __shared__ float Bs[TILE_SIZE][TILE_SIZE];
50
+
51
+ int bx = blockIdx.x, by = blockIdx.y;
52
+ int tx = threadIdx.x, ty = threadIdx.y;
53
+
54
+ int row = by * TILE_SIZE + ty;
55
+ int col = bx * TILE_SIZE + tx;
56
+
57
+ float sum = 0.0f;
58
+
59
+ for (int t = 0; t < (N + TILE_SIZE - 1) / TILE_SIZE; t++) {
60
+ if (row < N && t * TILE_SIZE + tx < N)
61
+ As[ty][tx] = A[row * N + t * TILE_SIZE + tx];
62
+ else
63
+ As[ty][tx] = 0.0f;
64
+
65
+ if (t * TILE_SIZE + ty < N && col < N)
66
+ Bs[ty][tx] = B[(t * TILE_SIZE + ty) * N + col];
67
+ else
68
+ Bs[ty][tx] = 0.0f;
69
+
70
+ __syncthreads();
71
+
72
+ for (int k = 0; k < TILE_SIZE; k++) {
73
+ sum += As[ty][k] * Bs[k][tx];
74
+ }
75
+ __syncthreads();
76
+ }
77
+
78
+ if (row < N && col < N) {
79
+ C[row * N + col] = sum;
80
+ }
81
+ }
82
+ """
83
+
84
+ SYNTAX_ERROR_KERNEL = """\
85
+ __global__ void broken_kernel() {
86
+ // Missing semicolon below
87
+ int x = 1
88
+ }
89
+ """
90
+
91
+
92
+ # =============================================================================
93
+ # Tests
94
+ # =============================================================================
95
+
96
+
97
+ class TestModalCompileSimple:
98
+ """Test simple kernel compilation via Modal."""
99
+
100
+ @pytest.mark.slow
101
+ def test_simple_kernel_ptx(self) -> None:
102
+ """Test compiling a simple kernel to PTX."""
103
+ from wafer_core.tools.compile import (
104
+ CompileRequest,
105
+ OutputFormat,
106
+ )
107
+ from wafer_core.tools.compile.modal_compile import compile_cuda
108
+
109
+ request = CompileRequest(
110
+ files={"kernel.cu": SIMPLE_KERNEL},
111
+ arch="sm_90a",
112
+ output=(OutputFormat.PTX,),
113
+ )
114
+
115
+ # Call Modal function
116
+ result = compile_cuda.remote({
117
+ "files": request.files,
118
+ "arch": request.arch,
119
+ "flags": list(request.flags),
120
+ "output": [fmt.value for fmt in request.output],
121
+ })
122
+
123
+ assert result["success"] is True
124
+ assert result["ptx"] is not None
125
+ assert ".version" in result["ptx"]
126
+ assert ".target" in result["ptx"]
127
+ assert "test_kernel" in result["ptx"]
128
+
129
+ @pytest.mark.slow
130
+ def test_vector_add_kernel_sass(self) -> None:
131
+ """Test compiling vector_add kernel to SASS."""
132
+ from wafer_core.tools.compile import (
133
+ CompileRequest,
134
+ OutputFormat,
135
+ )
136
+ from wafer_core.tools.compile.modal_compile import compile_cuda
137
+
138
+ request = CompileRequest(
139
+ files={"kernel.cu": VECTOR_ADD_KERNEL},
140
+ arch="sm_90a",
141
+ output=(OutputFormat.SASS,),
142
+ )
143
+
144
+ result = compile_cuda.remote({
145
+ "files": request.files,
146
+ "arch": request.arch,
147
+ "flags": list(request.flags),
148
+ "output": [fmt.value for fmt in request.output],
149
+ })
150
+
151
+ assert result["success"] is True
152
+ assert result["sass"] is not None
153
+ # SASS should contain assembly instructions
154
+ assert "vector_add" in result["sass"]
155
+
156
+ @pytest.mark.slow
157
+ def test_both_ptx_and_sass(self) -> None:
158
+ """Test generating both PTX and SASS."""
159
+ from wafer_core.tools.compile import (
160
+ CompileRequest,
161
+ OutputFormat,
162
+ )
163
+ from wafer_core.tools.compile.modal_compile import compile_cuda
164
+
165
+ request = CompileRequest(
166
+ files={"kernel.cu": VECTOR_ADD_KERNEL},
167
+ arch="sm_90a",
168
+ output=(OutputFormat.PTX, OutputFormat.SASS),
169
+ )
170
+
171
+ result = compile_cuda.remote({
172
+ "files": request.files,
173
+ "arch": request.arch,
174
+ "flags": list(request.flags),
175
+ "output": [fmt.value for fmt in request.output],
176
+ })
177
+
178
+ assert result["success"] is True
179
+ assert result["ptx"] is not None
180
+ assert result["sass"] is not None
181
+
182
+
183
+ class TestModalCompileMultiFile:
184
+ """Test multi-file compilation via Modal."""
185
+
186
+ @pytest.mark.slow
187
+ def test_kernel_with_header(self) -> None:
188
+ """Test compiling a kernel that includes a header."""
189
+ from wafer_core.tools.compile.modal_compile import compile_cuda
190
+
191
+ main_cu = '#include "utils.cuh"\n' + """
192
+ __global__ void apply_square(float* data, int n) {
193
+ int idx = blockIdx.x * blockDim.x + threadIdx.x;
194
+ if (idx < n) {
195
+ data[idx] = square(data[idx]);
196
+ }
197
+ }
198
+ """
199
+ header = """
200
+ #pragma once
201
+ __device__ float square(float x) {
202
+ return x * x;
203
+ }
204
+ """
205
+
206
+ result = compile_cuda.remote({
207
+ "files": {
208
+ "main.cu": main_cu,
209
+ "utils.cuh": header,
210
+ },
211
+ "arch": "sm_90a",
212
+ "flags": [],
213
+ "output": ["ptx"],
214
+ })
215
+
216
+ assert result["success"] is True
217
+ assert result["ptx"] is not None
218
+ assert "apply_square" in result["ptx"]
219
+
220
+
221
+ class TestModalCompileArchitectures:
222
+ """Test compilation for different GPU architectures."""
223
+
224
+ @pytest.mark.slow
225
+ @pytest.mark.parametrize("arch", ["sm_80", "sm_89", "sm_90a"])
226
+ def test_different_architectures(self, arch: str) -> None:
227
+ """Test compiling for different architectures."""
228
+ from wafer_core.tools.compile.modal_compile import compile_cuda
229
+
230
+ result = compile_cuda.remote({
231
+ "files": {"kernel.cu": SIMPLE_KERNEL},
232
+ "arch": arch,
233
+ "flags": [],
234
+ "output": ["ptx"],
235
+ })
236
+
237
+ assert result["success"] is True
238
+ assert result["ptx"] is not None
239
+ assert f".target {arch}" in result["ptx"]
240
+
241
+
242
+ class TestModalCompileErrors:
243
+ """Test error handling in Modal compilation."""
244
+
245
+ @pytest.mark.slow
246
+ def test_syntax_error(self) -> None:
247
+ """Test that syntax errors are reported."""
248
+ from wafer_core.tools.compile.modal_compile import compile_cuda
249
+
250
+ result = compile_cuda.remote({
251
+ "files": {"kernel.cu": SYNTAX_ERROR_KERNEL},
252
+ "arch": "sm_90a",
253
+ "flags": [],
254
+ "output": ["ptx"],
255
+ })
256
+
257
+ assert result["success"] is False
258
+ assert result["stderr"] != ""
259
+ # Error should mention the missing semicolon or syntax error
260
+ assert "error" in result["stderr"].lower()
261
+
262
+ @pytest.mark.slow
263
+ def test_missing_include(self) -> None:
264
+ """Test that missing includes are reported."""
265
+ from wafer_core.tools.compile.modal_compile import compile_cuda
266
+
267
+ kernel = '#include "nonexistent.h"\n__global__ void test() {}'
268
+
269
+ result = compile_cuda.remote({
270
+ "files": {"kernel.cu": kernel},
271
+ "arch": "sm_90a",
272
+ "flags": [],
273
+ "output": ["ptx"],
274
+ })
275
+
276
+ assert result["success"] is False
277
+ assert "nonexistent.h" in result["stderr"] or "cannot open" in result["stderr"].lower()
278
+
279
+
280
+ class TestModalCompileFlags:
281
+ """Test custom compiler flags."""
282
+
283
+ @pytest.mark.slow
284
+ def test_optimization_flags(self) -> None:
285
+ """Test compilation with optimization flags."""
286
+ from wafer_core.tools.compile.modal_compile import compile_cuda
287
+
288
+ result = compile_cuda.remote({
289
+ "files": {"kernel.cu": VECTOR_ADD_KERNEL},
290
+ "arch": "sm_90a",
291
+ "flags": ["-O3"],
292
+ "output": ["ptx"],
293
+ })
294
+
295
+ assert result["success"] is True
296
+ assert result["ptx"] is not None
297
+
298
+ @pytest.mark.slow
299
+ def test_lineinfo_flag(self) -> None:
300
+ """Test compilation with lineinfo flag."""
301
+ from wafer_core.tools.compile.modal_compile import compile_cuda
302
+
303
+ result = compile_cuda.remote({
304
+ "files": {"kernel.cu": VECTOR_ADD_KERNEL},
305
+ "arch": "sm_90a",
306
+ "flags": ["-lineinfo"],
307
+ "output": ["ptx"],
308
+ })
309
+
310
+ assert result["success"] is True
311
+ assert result["ptx"] is not None
312
+
313
+
314
+ class TestModalHealthCheck:
315
+ """Test Modal health check function."""
316
+
317
+ @pytest.mark.slow
318
+ def test_health_check(self) -> None:
319
+ """Test the health check endpoint."""
320
+ from wafer_core.tools.compile.modal_compile import health_check
321
+
322
+ result = health_check.remote()
323
+
324
+ assert result["status"] == "ok"
325
+ assert result["nvcc_available"] is True
326
+ assert "nvcc_version" in result
@@ -0,0 +1,117 @@
1
+ """Types for the cloud CUDA compiler."""
2
+
3
+ from dataclasses import dataclass, field
4
+ from enum import Enum
5
+ from typing import Literal
6
+
7
+
8
+ class OutputFormat(str, Enum):
9
+ """Supported output formats."""
10
+
11
+ PTX = "ptx"
12
+ SASS = "sass"
13
+
14
+
15
+ # Valid SM architectures (CUDA compute capabilities)
16
+ VALID_ARCHITECTURES = frozenset(
17
+ {
18
+ # Ampere
19
+ "sm_80",
20
+ "sm_86",
21
+ "sm_87",
22
+ # Ada Lovelace
23
+ "sm_89",
24
+ # Hopper
25
+ "sm_90",
26
+ "sm_90a",
27
+ # Blackwell
28
+ "sm_100",
29
+ "sm_100a",
30
+ "sm_101",
31
+ "sm_101a",
32
+ "sm_120",
33
+ "sm_120a",
34
+ }
35
+ )
36
+
37
+
38
+ @dataclass(frozen=True)
39
+ class CompileRequest:
40
+ """Request to compile CUDA code.
41
+
42
+ Attributes:
43
+ files: Mapping of filename to file content. At least one .cu file required.
44
+ arch: Target GPU architecture (e.g., "sm_90a" for Hopper).
45
+ flags: Additional nvcc flags (e.g., ["-O3", "--maxrregcount=64"]).
46
+ output: Requested output formats (ptx and/or sass).
47
+ """
48
+
49
+ files: dict[str, str]
50
+ arch: str = "sm_90a"
51
+ flags: tuple[str, ...] = field(default_factory=tuple)
52
+ output: tuple[OutputFormat, ...] = field(
53
+ default_factory=lambda: (OutputFormat.PTX, OutputFormat.SASS)
54
+ )
55
+
56
+ def __post_init__(self) -> None:
57
+ """Validate the request."""
58
+ # Validate files
59
+ if not self.files:
60
+ raise ValueError("At least one file is required")
61
+
62
+ # Check for at least one .cu file
63
+ cu_files = [f for f in self.files if f.endswith(".cu")]
64
+ if not cu_files:
65
+ raise ValueError("At least one .cu file is required")
66
+
67
+ # Validate architecture
68
+ if self.arch not in VALID_ARCHITECTURES:
69
+ raise ValueError(
70
+ f"Invalid architecture '{self.arch}'. "
71
+ f"Valid architectures: {sorted(VALID_ARCHITECTURES)}"
72
+ )
73
+
74
+ # Validate output formats
75
+ if not self.output:
76
+ raise ValueError("At least one output format is required")
77
+
78
+ @property
79
+ def main_cu_file(self) -> str:
80
+ """Get the main .cu file (first one found)."""
81
+ for filename in self.files:
82
+ if filename.endswith(".cu"):
83
+ return filename
84
+ # This should never happen due to __post_init__ validation
85
+ raise ValueError("No .cu file found") # pragma: no cover
86
+
87
+
88
+ @dataclass(frozen=True)
89
+ class CompileResponse:
90
+ """Response from CUDA compilation.
91
+
92
+ Attributes:
93
+ success: Whether compilation succeeded.
94
+ ptx: Generated PTX code (if requested and successful).
95
+ sass: Generated SASS code (if requested and successful).
96
+ stderr: Compiler warnings or errors.
97
+ compilation_time_ms: Time taken to compile in milliseconds.
98
+ """
99
+
100
+ success: bool
101
+ ptx: str | None = None
102
+ sass: str | None = None
103
+ stderr: str = ""
104
+ compilation_time_ms: int = 0
105
+
106
+ @classmethod
107
+ def error(cls, message: str, compilation_time_ms: int = 0) -> "CompileResponse":
108
+ """Create an error response."""
109
+ return cls(
110
+ success=False,
111
+ stderr=message,
112
+ compilation_time_ms=compilation_time_ms,
113
+ )
114
+
115
+
116
+ # Type alias for the output format literal
117
+ OutputFormatLiteral = Literal["ptx", "sass"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wafer-core
3
- Version: 0.1.37
3
+ Version: 0.1.39
4
4
  Summary: Core utilities and environments for Wafer GPU kernel optimization
5
5
  Requires-Python: >=3.10
6
6
  Requires-Dist: aiohttp>=3.9.0
@@ -326,7 +326,7 @@ wafer_core/lib/trace_compare/api.py,sha256=JSRTcd7eZK1Z8l18TFEiA5A8ENJS1TMz7oIiw
326
326
  wafer_core/lib/trace_compare/architecture.py,sha256=8bqlAJQeJLBHblyXvFV-w55PIKiVQDPjDQZ8Jx4tuGg,2110
327
327
  wafer_core/lib/trace_compare/classifier.py,sha256=sE1K007GVk_Up2g59SVUIZ7BThf0yHNjGsZ9AyM_Ah8,6028
328
328
  wafer_core/lib/trace_compare/formatter.py,sha256=GNrCZ45ueBN05CEXjOtTuKvTI8z-g-ZZFil-ni3sWVY,37962
329
- wafer_core/lib/trace_compare/fusion_analyzer.py,sha256=eJba8VdHrz3IVlo4oAhFRRQLzj3I3KS-6otrFznooXg,38459
329
+ wafer_core/lib/trace_compare/fusion_analyzer.py,sha256=xmVEF9qeroMa-ONfpnn64_q-aLyAjZ-9EIAYdVpIHKI,38555
330
330
  wafer_core/lib/trace_compare/kernel_registry.yaml,sha256=0-knXwsF3pR1x1JdIz-aWaH-5xDgTylh53E47Kf6nHo,9808
331
331
  wafer_core/lib/trace_compare/layer_segmentation.py,sha256=kI_Y1e9nrKZfdwfcrGo4h7gpMxqXI_xkgXk46zuFen4,4642
332
332
  wafer_core/lib/trace_compare/loader.py,sha256=z3gO7CV8AxZloWUCA0aA3pwkNiEnEobdLQBAII41cGY,16129
@@ -352,8 +352,7 @@ wafer_core/rollouts/cli_agents.py,sha256=e4qqqYBzWLsbw8FsNnddGApWp_on9Cvzrfd1ami
352
352
  wafer_core/rollouts/deploy.py,sha256=3t88fM_BMyAPkxIl8pS4r5ogHJvrlqWQDuIaltDZBRc,40924
353
353
  wafer_core/rollouts/dtypes.py,sha256=oRWjpbUOTf4uyXvnO9QThcSzD1fBrDQnAfRhGbxdgrg,61916
354
354
  wafer_core/rollouts/eval_helpers.py,sha256=OE7uQZRcbqQhpFqb4zOj8zafc9Gr6xZJpSrMvxXKVUw,1699
355
- wafer_core/rollouts/evaluation.py,sha256=fk-pGZ5vpocVmw1iBbHtxMK0K6l8pYTLHCpDNvRY1Xo,69142
356
- wafer_core/rollouts/events.py,sha256=z85J8kq0LXPj5CiUk4RkiTQg--r9xiO7QeeJwkyUOto,7505
355
+ wafer_core/rollouts/evaluation.py,sha256=CGBOsqJNyC4fsgTbdcBs8OXY3Ihk_Er-K4g76GFq9M0,67139
357
356
  wafer_core/rollouts/export.py,sha256=0CfdBB7Du4E3VekKEUcTwTEFS1bOMGZ9GbD5KU3CecQ,11583
358
357
  wafer_core/rollouts/feedback.py,sha256=mu17eQbAinXZWI3hMYLq-LyF4JAdH9SfNRWY-0S8jvQ,6769
359
358
  wafer_core/rollouts/fingerprint.py,sha256=9qL9VrKdg2lhGnSD8ycMZ214EBeH5XCDpPgFJdbwmW4,10542
@@ -363,7 +362,7 @@ wafer_core/rollouts/models.py,sha256=BrMnUpTA9_HnOghpedzdLUm9Di3FyJouzOkK4PPBg_k
363
362
  wafer_core/rollouts/paths.py,sha256=9XtrA9ylhb5LttMFe2DE7X0IHeUMjuGUerII9OscYec,3436
364
363
  wafer_core/rollouts/pipeline.py,sha256=vlJTYE3ZX2XScpF9pmtv91K8Q0g8uLmcbI5jn6b5Hzg,15319
365
364
  wafer_core/rollouts/progress.py,sha256=szA9cvWT2xUxGVhF9BaAqJMmKDqMAUlxImxcOpcnqbY,29228
366
- wafer_core/rollouts/progress_display.py,sha256=it-IiI37k9whAuB6T_66GYgsZyidCq5x00URiOcxe2c,15769
365
+ wafer_core/rollouts/progress_app.py,sha256=ir3fk8OZd09Zs7e7EC2WjQs_H-6W-zCbZAjSCDIcKEo,13517
367
366
  wafer_core/rollouts/prompt.py,sha256=EDmGb0rhWwke7tokIcO8dukc3q5c8x0n5Omi5CpAQmA,11022
368
367
  wafer_core/rollouts/providers.py,sha256=dcGJh1p30hstVbCDDtJ902lyafkg81DKjcOzb0uuKS0,1400
369
368
  wafer_core/rollouts/remote.py,sha256=cAYpRCONlsTeRxzLiegAUfjZWGtqBNwZTHehMhk5ldA,8816
@@ -374,10 +373,19 @@ wafer_core/rollouts/slice.py,sha256=darOZO53BuSPfvv_KjOSzulGVSWbL4OuoE3k6xXpBFg,
374
373
  wafer_core/rollouts/store.py,sha256=UDP9idDOEVs_0Pslx0K_Y8E1i-BeoqVSaxdQiaqtz1E,18051
375
374
  wafer_core/rollouts/transform_messages.py,sha256=yldzdLgugNYb5Zxju7myFBel1tmrHXx9M399ImqPLGI,20891
376
375
  wafer_core/rollouts/upload.py,sha256=hEqZfwgb0b4GYbrwRSA3fuqF70pqo6hyaQU59j3vM7E,4890
377
- wafer_core/rollouts/_logging/__init__.py,sha256=rCXeAssQ3gIrduuMzvKPD-ikt6rXejVL9h5XtDRyIQg,498
376
+ wafer_core/rollouts/_logging/__init__.py,sha256=njcyIodFQKYWS6AxXSpuSH6KBQ4hS1SH71wuvt4cApc,677
378
377
  wafer_core/rollouts/_logging/color_formatter.py,sha256=x3qRKwHsUCFkgcIl8x_Ajjw82X2EedbTe14sCxMU4Kc,2267
379
378
  wafer_core/rollouts/_logging/json_formatter.py,sha256=jJIa2IZCsu2C_Y1HXQi7hbI33x6L6shN_dqu-hmhxp4,2380
380
- wafer_core/rollouts/_logging/logging_config.py,sha256=FY32lGbbTv5YCCN7em6LjupsV-R_onVCPeXGaQIKMYI,7449
379
+ wafer_core/rollouts/_logging/logging_config.py,sha256=JbHCBcKHaospwF3BlKfp1HzhZTUElhtOGghKHF21bvc,10581
380
+ wafer_core/rollouts/_logging/sample_handler.py,sha256=XhS5bVs6VKjABP7PeAp8CuEppqXUOm5rPCi-uEbt6QU,2122
381
+ wafer_core/rollouts/_pytui/__init__.py,sha256=Q4TwOoefOqDkudvaWJ7TQF6Ak32Nqs09h7jl8luPuo8,2368
382
+ wafer_core/rollouts/_pytui/app.py,sha256=NGNZ97nPq8ZZitMrY2tUgSEz_K3m5FqlNQpdy3geoEk,26163
383
+ wafer_core/rollouts/_pytui/console.py,sha256=0TBZ9MPfLls6wPQvI9KA_0k1348e0VckAvPwn2y6D9Q,10804
384
+ wafer_core/rollouts/_pytui/renderer.py,sha256=kFJoEsURAowj8KmKujcDJF00VDwiFhW4AP0fFD7hsrA,6429
385
+ wafer_core/rollouts/_pytui/spinner.py,sha256=ilIOIubZQz5C77m-Y6te55z8c1Kz8njy66CVsxMu9xw,2256
386
+ wafer_core/rollouts/_pytui/terminal.py,sha256=mCSZYAAH10Dl53fuCxQ2ZegkOmL1gFI5wEkTxQyOoKI,17736
387
+ wafer_core/rollouts/_pytui/text.py,sha256=KeGJAM6MJQQLSk9y2R-HnYgLqCcc8Qk4QfukctBuYA8,14107
388
+ wafer_core/rollouts/_pytui/theme.py,sha256=FdYrvQz66b7uMNbB2WCp8FPUvGSJ6vUHDaYnR6SSeSY,8067
381
389
  wafer_core/rollouts/agent_presets/README.md,sha256=gGyE0P_2Cp5s5ekHVY3cYcz19g91Wb-wboFakcvBriQ,7584
382
390
  wafer_core/rollouts/agent_presets/__init__.py,sha256=BLZOzAyC-cThQQQpAROeo4eEMOlMCrVEgnKYqzSsyS4,454
383
391
  wafer_core/rollouts/agent_presets/base_preset.py,sha256=vDzDiVe_DHN2fiQrtGTW309EJgt3t1jaPAgkQCgDycw,2550
@@ -577,11 +585,11 @@ wafer_core/rollouts/training/rollout_gen/__init__.py,sha256=-jX1P4Q2HSwBZ733kA1R
577
585
  wafer_core/rollouts/training/rollout_gen/async_rollout_manager.py,sha256=I1ZlQRonw-bZzxFKz94x22lLKwKBlw5Jqos5BDEDrIU,12488
578
586
  wafer_core/rollouts/training/rollout_gen/rollout_generation.py,sha256=QlkYrvS1dKFIKseLLHC_IApy4bMJDuf5iDeM0rm9wTQ,8271
579
587
  wafer_core/rollouts/training/rollout_gen/rollout_manager.py,sha256=SUOWxPqy8KPDkmYLJ-EWSm5NzDNZASBizcQuqgCGzGM,5011
580
- wafer_core/rollouts/tui/DESIGN.md,sha256=lrBmulRC8dbMaoKumCV9bUqdnhUJ8RxW_OLBYP3wbCo,6481
588
+ wafer_core/rollouts/tui/DESIGN.md,sha256=ssWAZa2CIMkEBMnpm7diSsQE7cagP_CzJQhdktQVM5Q,14273
581
589
  wafer_core/rollouts/tui/__init__.py,sha256=-lAiJnFzsq9EAmynS2o0sJ0MBCsoKO8FRJycZbnx3xo,502
582
590
  wafer_core/rollouts/tui/__main__.py,sha256=cL010zdA5VKP9eQVYZThIodr4mIbb126x4agDLBUmmk,117
583
591
  wafer_core/rollouts/tui/demo.py,sha256=3jEmdFlIRLqdDINI9gOgWUV077ZFJ2AbG1yFH0QKEbo,1851
584
- wafer_core/rollouts/tui/monitor.py,sha256=lPfsp9clKelSD7nB8CIVjs-7MTFvAmNS2uCzrS_DH-I,38082
592
+ wafer_core/rollouts/tui/monitor.py,sha256=BrFgFefp8p6XleSUTjjLvg75KX9QoofjZTxwI6SqUTM,40012
585
593
  wafer_core/rollouts/tui/remote_runner.py,sha256=qdoZV-MWkja8NS3zUPdeHfxbbx4D7weLjIB3T3vvLp4,4132
586
594
  wafer_core/rollouts/tui/terminal.py,sha256=-kp4rUAqwWUJbIMJAgouMoMPHUHN1OhTRh5STW1yqMI,4856
587
595
  wafer_core/rollouts/tui/traces.py,sha256=-VE32AGY03X1tGGZNm2jFSS8oWjagshlVTv_XXgOArc,62977
@@ -636,6 +644,16 @@ wafer_core/tools/capture_tool/core.py,sha256=zQPilq5ZDJxBm0MFAzrl1-I2A2fyBGPRs8r
636
644
  wafer_core/tools/capture_tool/dtypes.py,sha256=1Vm5obOCYc-Njuwkp7uqh_W4lqtYurT3b8lLnunc2Q8,3790
637
645
  wafer_core/tools/capture_tool/executor.py,sha256=n1DVfbsP60yJAazx9C9Kwed9LB7AcKXJcoDnhno7ydU,1495
638
646
  wafer_core/tools/capture_tool/metrics.py,sha256=BFZNmdE-kh3LneYdWXTNZmlLuo-DCrP5aEBHxEQYJDU,10890
647
+ wafer_core/tools/compile/__init__.py,sha256=8VyaMDDPxg4DcT-rwMf9lcNhAanWnmsqijUJYsuzJNg,615
648
+ wafer_core/tools/compile/compiler.py,sha256=rGPvfqLTg-7y3hyFEihF6lxiEOfbIsRwfvOZSaVJ2_A,10192
649
+ wafer_core/tools/compile/modal_compile.py,sha256=zYrkAtGYkDiM6tJfH_hD-mJ0LqCW5HCSsf_6fADJIbI,13310
650
+ wafer_core/tools/compile/types.py,sha256=8Hjh6Mz2a7s2JjtKYQq-l3X41gmywnbKk3tc1wvbMLM,3277
651
+ wafer_core/tools/compile/tests/__init__.py,sha256=gSuBMN-7VayQ9HgyNuUXRumenwk7jtq86ZxdCgFjeYE,41
652
+ wafer_core/tools/compile/tests/test_compiler.py,sha256=kQ-YTLY8ETnS83nQ8xVSygKY532epxqRTsGx311SG7w,20795
653
+ wafer_core/tools/compile/tests/test_modal_integration.py,sha256=EIufgxGmZedovjchOp8nDWd9fM-nVAd59GsPZddUnc4,9551
654
+ wafer_core/tools/compile/tests/test_data/utils.cuh,sha256=nLGyklqWX2RJKNmdq6eBZX9eKo06jGk6e1q5kpNQGWY,155
655
+ wafer_core/tools/compile/tests/test_data/vector_add.cu,sha256=ZCXfrrr0SSD_g-ekZ9fAhwIq3hlQWqLhGmiLYGgKQ1s,213
656
+ wafer_core/tools/compile/tests/test_data/with_header.cu,sha256=MktwDpDDG4zH3HEgvwqZKn3n9cb7_v-OczXEsybORRM,215
639
657
  wafer_core/tools/dispatch_baseline/__init__.py,sha256=RgWDH5rPYGDnC_MDosVAygsBj9SYLZFJQqF7QjNYwAw,1635
640
658
  wafer_core/tools/dispatch_baseline/analyzer.py,sha256=Js2ctkd_3qTbV6u8bTUBfwrnof3X2WMD8F6K2qZQowE,5229
641
659
  wafer_core/tools/dispatch_baseline/client.py,sha256=-kzRYGEFG0QnrHtgz5WATAgk1_RzQ2RGuUt7L1A6Mww,5611
@@ -676,7 +694,6 @@ wafer_core/utils/__init__.py,sha256=oPHgkMkE7wS2lYKLlXrw4Ia5EHnpVcGHFfpWebIlVKs,
676
694
  wafer_core/utils/backend.py,sha256=zt5AX00OXSIstprvQ1_WNf_PQYphD2y53kOXWvg20RY,8986
677
695
  wafer_core/utils/code_validation.py,sha256=UqS4UVDxO-atdbn6i7JygX6IFPITvT56zZn1t-ZNuM8,4692
678
696
  wafer_core/utils/environment_serialization.py,sha256=cVDkapx0JC60CekazgirPEMAeGZhbLdX1WMIkFvId60,5047
679
- wafer_core/utils/event_streaming.py,sha256=Sg3-hI043Ofc2b29Z3DWrKgu4HkfJoIqhhbfGRJv70Q,2260
680
697
  wafer_core/utils/exceptions.py,sha256=Tl6Ml47Sr55DLEO_ehZc9jC5bNJRONslKCga5S2U4Rc,12164
681
698
  wafer_core/utils/execution_types.py,sha256=j2AGSoEIoY13BnGK9ggZQrM1BpVf6KjXZg2ASObhOqA,1159
682
699
  wafer_core/utils/gpu_environment_utils.py,sha256=IYIQkFv_dW9jVd1oPAA7yszXrlbApXnVLiXM_Eh89U0,9560
@@ -705,6 +722,6 @@ wafer_core/utils/modal_execution/modal_app.py,sha256=VfS2cX8gHtnlPXemmMcEwDPeQdh
705
722
  wafer_core/utils/modal_execution/modal_config.py,sha256=7cGX9TGqilQ3qxI3OFGXV5orjtyRU-PEDOJ4vP2oxno,4421
706
723
  wafer_core/utils/modal_execution/modal_execution.py,sha256=gChjnV6jqA3A7IRP3DfvV5cSfm_MN0X4f7JZufXgdZE,24594
707
724
  wafer_core/utils/modal_execution/test_modal.py,sha256=_jqou_hrLs1Daf1590Pnb0a_lXMMa2rczAPpW9HpoNQ,8153
708
- wafer_core-0.1.37.dist-info/METADATA,sha256=i2rz9s8beDf1a-zDbQwwugs6LTYtYQLxwt6djruJjiM,1477
709
- wafer_core-0.1.37.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
710
- wafer_core-0.1.37.dist-info/RECORD,,
725
+ wafer_core-0.1.39.dist-info/METADATA,sha256=OcMn8TZzsUvPT2JBa0xYK_sAT_og1PAZd-DpDcLG1XA,1477
726
+ wafer_core-0.1.39.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
727
+ wafer_core-0.1.39.dist-info/RECORD,,