warp-lang 1.8.1__py3-none-macosx_10_13_universal2.whl → 1.9.0__py3-none-macosx_10_13_universal2.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 warp-lang might be problematic. Click here for more details.

Files changed (134) hide show
  1. warp/__init__.py +282 -103
  2. warp/__init__.pyi +482 -110
  3. warp/bin/libwarp-clang.dylib +0 -0
  4. warp/bin/libwarp.dylib +0 -0
  5. warp/build.py +93 -30
  6. warp/build_dll.py +47 -67
  7. warp/builtins.py +955 -137
  8. warp/codegen.py +312 -206
  9. warp/config.py +1 -1
  10. warp/context.py +1249 -784
  11. warp/examples/core/example_marching_cubes.py +1 -0
  12. warp/examples/core/example_render_opengl.py +100 -3
  13. warp/examples/fem/example_apic_fluid.py +98 -52
  14. warp/examples/fem/example_convection_diffusion_dg.py +25 -4
  15. warp/examples/fem/example_diffusion_mgpu.py +8 -3
  16. warp/examples/fem/utils.py +68 -22
  17. warp/fabric.py +1 -1
  18. warp/fem/cache.py +27 -19
  19. warp/fem/domain.py +2 -2
  20. warp/fem/field/nodal_field.py +2 -2
  21. warp/fem/field/virtual.py +264 -166
  22. warp/fem/geometry/geometry.py +5 -5
  23. warp/fem/integrate.py +129 -51
  24. warp/fem/space/restriction.py +4 -0
  25. warp/fem/space/shape/tet_shape_function.py +3 -10
  26. warp/jax_experimental/custom_call.py +1 -1
  27. warp/jax_experimental/ffi.py +2 -1
  28. warp/marching_cubes.py +708 -0
  29. warp/native/array.h +99 -4
  30. warp/native/builtin.h +82 -5
  31. warp/native/bvh.cpp +64 -28
  32. warp/native/bvh.cu +58 -58
  33. warp/native/bvh.h +2 -2
  34. warp/native/clang/clang.cpp +7 -7
  35. warp/native/coloring.cpp +8 -2
  36. warp/native/crt.cpp +2 -2
  37. warp/native/crt.h +3 -5
  38. warp/native/cuda_util.cpp +41 -10
  39. warp/native/cuda_util.h +10 -4
  40. warp/native/exports.h +1842 -1908
  41. warp/native/fabric.h +2 -1
  42. warp/native/hashgrid.cpp +37 -37
  43. warp/native/hashgrid.cu +2 -2
  44. warp/native/initializer_array.h +1 -1
  45. warp/native/intersect.h +2 -2
  46. warp/native/mat.h +1910 -116
  47. warp/native/mathdx.cpp +43 -43
  48. warp/native/mesh.cpp +24 -24
  49. warp/native/mesh.cu +26 -26
  50. warp/native/mesh.h +4 -2
  51. warp/native/nanovdb/GridHandle.h +179 -12
  52. warp/native/nanovdb/HostBuffer.h +8 -7
  53. warp/native/nanovdb/NanoVDB.h +517 -895
  54. warp/native/nanovdb/NodeManager.h +323 -0
  55. warp/native/nanovdb/PNanoVDB.h +2 -2
  56. warp/native/quat.h +331 -14
  57. warp/native/range.h +7 -1
  58. warp/native/reduce.cpp +10 -10
  59. warp/native/reduce.cu +13 -14
  60. warp/native/runlength_encode.cpp +2 -2
  61. warp/native/runlength_encode.cu +5 -5
  62. warp/native/scan.cpp +3 -3
  63. warp/native/scan.cu +4 -4
  64. warp/native/sort.cpp +10 -10
  65. warp/native/sort.cu +22 -22
  66. warp/native/sparse.cpp +8 -8
  67. warp/native/sparse.cu +13 -13
  68. warp/native/spatial.h +366 -17
  69. warp/native/temp_buffer.h +2 -2
  70. warp/native/tile.h +283 -69
  71. warp/native/vec.h +381 -14
  72. warp/native/volume.cpp +54 -54
  73. warp/native/volume.cu +1 -1
  74. warp/native/volume.h +2 -1
  75. warp/native/volume_builder.cu +30 -37
  76. warp/native/warp.cpp +150 -149
  77. warp/native/warp.cu +323 -192
  78. warp/native/warp.h +227 -226
  79. warp/optim/linear.py +736 -271
  80. warp/render/imgui_manager.py +289 -0
  81. warp/render/render_opengl.py +85 -6
  82. warp/sim/graph_coloring.py +2 -2
  83. warp/sparse.py +558 -175
  84. warp/tests/aux_test_module_aot.py +7 -0
  85. warp/tests/cuda/test_async.py +3 -3
  86. warp/tests/cuda/test_conditional_captures.py +101 -0
  87. warp/tests/geometry/test_marching_cubes.py +233 -12
  88. warp/tests/sim/test_coloring.py +6 -6
  89. warp/tests/test_array.py +56 -5
  90. warp/tests/test_codegen.py +3 -2
  91. warp/tests/test_context.py +8 -15
  92. warp/tests/test_enum.py +136 -0
  93. warp/tests/test_examples.py +2 -2
  94. warp/tests/test_fem.py +45 -2
  95. warp/tests/test_fixedarray.py +229 -0
  96. warp/tests/test_func.py +18 -15
  97. warp/tests/test_future_annotations.py +7 -5
  98. warp/tests/test_linear_solvers.py +30 -0
  99. warp/tests/test_map.py +1 -1
  100. warp/tests/test_mat.py +1518 -378
  101. warp/tests/test_mat_assign_copy.py +178 -0
  102. warp/tests/test_mat_constructors.py +574 -0
  103. warp/tests/test_module_aot.py +287 -0
  104. warp/tests/test_print.py +69 -0
  105. warp/tests/test_quat.py +140 -34
  106. warp/tests/test_quat_assign_copy.py +145 -0
  107. warp/tests/test_reload.py +2 -1
  108. warp/tests/test_sparse.py +71 -0
  109. warp/tests/test_spatial.py +140 -34
  110. warp/tests/test_spatial_assign_copy.py +160 -0
  111. warp/tests/test_struct.py +43 -3
  112. warp/tests/test_types.py +0 -20
  113. warp/tests/test_vec.py +179 -34
  114. warp/tests/test_vec_assign_copy.py +143 -0
  115. warp/tests/tile/test_tile.py +184 -18
  116. warp/tests/tile/test_tile_cholesky.py +605 -0
  117. warp/tests/tile/test_tile_load.py +169 -0
  118. warp/tests/tile/test_tile_mathdx.py +2 -558
  119. warp/tests/tile/test_tile_matmul.py +1 -1
  120. warp/tests/tile/test_tile_mlp.py +1 -1
  121. warp/tests/tile/test_tile_shared_memory.py +5 -5
  122. warp/tests/unittest_suites.py +6 -0
  123. warp/tests/walkthrough_debug.py +1 -1
  124. warp/thirdparty/unittest_parallel.py +108 -9
  125. warp/types.py +554 -264
  126. warp/utils.py +68 -86
  127. {warp_lang-1.8.1.dist-info → warp_lang-1.9.0.dist-info}/METADATA +28 -65
  128. {warp_lang-1.8.1.dist-info → warp_lang-1.9.0.dist-info}/RECORD +131 -121
  129. warp/native/marching.cpp +0 -19
  130. warp/native/marching.cu +0 -514
  131. warp/native/marching.h +0 -19
  132. {warp_lang-1.8.1.dist-info → warp_lang-1.9.0.dist-info}/WHEEL +0 -0
  133. {warp_lang-1.8.1.dist-info → warp_lang-1.9.0.dist-info}/licenses/LICENSE.md +0 -0
  134. {warp_lang-1.8.1.dist-info → warp_lang-1.9.0.dist-info}/top_level.txt +0 -0
@@ -28,6 +28,7 @@ import sys
28
28
  import tempfile
29
29
  import time
30
30
  import unittest
31
+ from concurrent.futures.process import BrokenProcessPool
31
32
  from contextlib import contextmanager
32
33
  from io import StringIO
33
34
 
@@ -160,6 +161,7 @@ def main(argv=None):
160
161
  group_warp.add_argument(
161
162
  "--no-shared-cache", action="store_true", help="Use a separate kernel cache per test process."
162
163
  )
164
+ group_warp.add_argument("--warp-debug", action="store_true", help="Set warp.config.mode to 'debug'")
163
165
  args = parser.parse_args(args=argv)
164
166
 
165
167
  if args.coverage_branch:
@@ -242,15 +244,76 @@ def main(argv=None):
242
244
  test_manager = ParallelTestManager(manager, args, temp_dir)
243
245
  results = pool.map(test_manager.run_tests, test_suites)
244
246
  else:
245
- # NVIDIA Modification added concurrent.futures
246
- with concurrent.futures.ProcessPoolExecutor(
247
- max_workers=process_count,
248
- mp_context=multiprocessing.get_context(method="spawn"),
249
- initializer=initialize_test_process,
250
- initargs=(manager.Lock(), shared_index, args, temp_dir),
251
- ) as executor:
252
- test_manager = ParallelTestManager(manager, args, temp_dir)
253
- results = list(executor.map(test_manager.run_tests, test_suites, timeout=2400))
247
+ # NVIDIA Modification: added concurrent.futures with crash handling and per-suite isolated fallback
248
+ results = []
249
+ parallel_failed = False
250
+
251
+ try:
252
+ with concurrent.futures.ProcessPoolExecutor(
253
+ max_workers=process_count,
254
+ mp_context=multiprocessing.get_context(method="spawn"),
255
+ initializer=initialize_test_process,
256
+ initargs=(manager.Lock(), shared_index, args, temp_dir),
257
+ ) as executor:
258
+ test_manager = ParallelTestManager(manager, args, temp_dir)
259
+ # Try parallel execution first using the original map approach
260
+ results = list(executor.map(test_manager.run_tests, test_suites, timeout=2400))
261
+
262
+ except BrokenProcessPool:
263
+ # Process pool is broken - switch to isolated single-process fallback
264
+ print(
265
+ "Warning: Process pool broken during parallel execution. Switching to isolated single-process fallback.",
266
+ file=sys.stderr,
267
+ )
268
+ parallel_failed = True
269
+ except Exception as e:
270
+ # Handle other pool-level exceptions
271
+ print(
272
+ f"Warning: Process pool error: {e}. Switching to isolated single-process fallback.",
273
+ file=sys.stderr,
274
+ )
275
+ parallel_failed = True
276
+
277
+ # Fallback to isolated single-process execution if parallel failed
278
+ if parallel_failed:
279
+ print("Running all tests in isolated single-process mode...", file=sys.stderr)
280
+ # Run all test suites in isolated single-process pools
281
+ results = []
282
+ for i, suite in enumerate(test_suites):
283
+ try:
284
+ # Create a new single-process pool for each test suite
285
+ with concurrent.futures.ProcessPoolExecutor(
286
+ max_workers=1,
287
+ mp_context=multiprocessing.get_context(method="spawn"),
288
+ initializer=initialize_test_process,
289
+ initargs=(manager.Lock(), shared_index, args, temp_dir),
290
+ ) as executor:
291
+ test_manager = ParallelTestManager(manager, args, temp_dir)
292
+ future = executor.submit(test_manager.run_tests, suite)
293
+ try:
294
+ result = future.result(timeout=2400)
295
+ results.append(result)
296
+ except BrokenProcessPool:
297
+ print(
298
+ f"Warning: Process crashed or was terminated unexpectedly in isolated execution for test suite {i + 1}/{len(test_suites)}. Marking tests as crashed.",
299
+ file=sys.stderr,
300
+ )
301
+ crash_result = create_crash_result(suite)
302
+ results.append(crash_result)
303
+ except Exception as e:
304
+ print(
305
+ f"Warning: Error in isolated test suite {i + 1}/{len(test_suites)}: {e}. Marking tests as crashed.",
306
+ file=sys.stderr,
307
+ )
308
+ error_result = create_crash_result(suite)
309
+ results.append(error_result)
310
+ except Exception as e:
311
+ print(
312
+ f"Warning: Failed to create isolated process for test suite {i + 1}/{len(test_suites)}: {e}. Marking tests as crashed.",
313
+ file=sys.stderr,
314
+ )
315
+ error_result = create_crash_result(suite)
316
+ results.append(error_result)
254
317
  else:
255
318
  # This entire path is an NVIDIA Modification
256
319
 
@@ -259,6 +322,9 @@ def main(argv=None):
259
322
  if args.verbose > 1:
260
323
  print(file=sys.stderr)
261
324
 
325
+ if args.warp_debug:
326
+ wp.config.mode = "debug"
327
+
262
328
  # Run the tests in serial
263
329
  start_time = time.perf_counter()
264
330
 
@@ -423,6 +489,36 @@ def _iter_test_cases(test_suite):
423
489
  yield from _iter_test_cases(suite)
424
490
 
425
491
 
492
+ def create_crash_result(test_suite):
493
+ """Create a result indicating the process crashed or was terminated unexpectedly while running this test suite.
494
+
495
+ This entire function is an NVIDIA modification.
496
+ """
497
+ test_count = test_suite.countTestCases()
498
+ crash_errors = []
499
+
500
+ # Create crash error entries for each test in the suite
501
+ # Note: We don't know which specific test caused the crash, just that the process crashed
502
+ for test in _iter_test_cases(test_suite):
503
+ error_msg = (
504
+ "Process crashed or was terminated unexpectedly while running this test suite "
505
+ f"(unknown which test caused the crash): {test}"
506
+ )
507
+ crash_errors.append(
508
+ "\n".join(
509
+ [
510
+ unittest.TextTestResult.separator1,
511
+ str(test),
512
+ unittest.TextTestResult.separator2,
513
+ error_msg,
514
+ ]
515
+ )
516
+ )
517
+
518
+ # Return the same format as run_tests: (test_count, errors, failures, skipped, expected_failures, unexpected_successes, test_records)
519
+ return (test_count, crash_errors, [], 0, 0, 0, [])
520
+
521
+
426
522
  class ParallelTestManager:
427
523
  def __init__(self, manager, args, temp_dir):
428
524
  self.args = args
@@ -547,6 +643,9 @@ def initialize_test_process(lock, shared_index, args, temp_dir):
547
643
  with _coverage(args, temp_dir):
548
644
  import warp as wp
549
645
 
646
+ if args.warp_debug:
647
+ wp.config.mode = "debug"
648
+
550
649
  if args.no_shared_cache:
551
650
  from warp.thirdparty import appdirs
552
651