warp-lang 1.10.0__py3-none-macosx_11_0_arm64.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 (468) hide show
  1. warp/__init__.py +334 -0
  2. warp/__init__.pyi +5856 -0
  3. warp/_src/__init__.py +14 -0
  4. warp/_src/autograd.py +1077 -0
  5. warp/_src/build.py +620 -0
  6. warp/_src/build_dll.py +642 -0
  7. warp/_src/builtins.py +10555 -0
  8. warp/_src/codegen.py +4361 -0
  9. warp/_src/config.py +178 -0
  10. warp/_src/constants.py +59 -0
  11. warp/_src/context.py +8352 -0
  12. warp/_src/dlpack.py +464 -0
  13. warp/_src/fabric.py +362 -0
  14. warp/_src/fem/__init__.py +14 -0
  15. warp/_src/fem/adaptivity.py +510 -0
  16. warp/_src/fem/cache.py +689 -0
  17. warp/_src/fem/dirichlet.py +190 -0
  18. warp/_src/fem/domain.py +553 -0
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +703 -0
  21. warp/_src/fem/field/nodal_field.py +403 -0
  22. warp/_src/fem/field/restriction.py +39 -0
  23. warp/_src/fem/field/virtual.py +1021 -0
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/_src/fem/geometry/adaptive_nanogrid.py +782 -0
  26. warp/_src/fem/geometry/closest_point.py +99 -0
  27. warp/_src/fem/geometry/deformed_geometry.py +277 -0
  28. warp/_src/fem/geometry/element.py +854 -0
  29. warp/_src/fem/geometry/geometry.py +693 -0
  30. warp/_src/fem/geometry/grid_2d.py +478 -0
  31. warp/_src/fem/geometry/grid_3d.py +539 -0
  32. warp/_src/fem/geometry/hexmesh.py +956 -0
  33. warp/_src/fem/geometry/nanogrid.py +660 -0
  34. warp/_src/fem/geometry/partition.py +483 -0
  35. warp/_src/fem/geometry/quadmesh.py +597 -0
  36. warp/_src/fem/geometry/tetmesh.py +762 -0
  37. warp/_src/fem/geometry/trimesh.py +588 -0
  38. warp/_src/fem/integrate.py +2507 -0
  39. warp/_src/fem/linalg.py +385 -0
  40. warp/_src/fem/operator.py +398 -0
  41. warp/_src/fem/polynomial.py +231 -0
  42. warp/_src/fem/quadrature/__init__.py +17 -0
  43. warp/_src/fem/quadrature/pic_quadrature.py +318 -0
  44. warp/_src/fem/quadrature/quadrature.py +665 -0
  45. warp/_src/fem/space/__init__.py +248 -0
  46. warp/_src/fem/space/basis_function_space.py +499 -0
  47. warp/_src/fem/space/basis_space.py +681 -0
  48. warp/_src/fem/space/dof_mapper.py +253 -0
  49. warp/_src/fem/space/function_space.py +312 -0
  50. warp/_src/fem/space/grid_2d_function_space.py +179 -0
  51. warp/_src/fem/space/grid_3d_function_space.py +229 -0
  52. warp/_src/fem/space/hexmesh_function_space.py +255 -0
  53. warp/_src/fem/space/nanogrid_function_space.py +199 -0
  54. warp/_src/fem/space/partition.py +435 -0
  55. warp/_src/fem/space/quadmesh_function_space.py +222 -0
  56. warp/_src/fem/space/restriction.py +221 -0
  57. warp/_src/fem/space/shape/__init__.py +152 -0
  58. warp/_src/fem/space/shape/cube_shape_function.py +1107 -0
  59. warp/_src/fem/space/shape/shape_function.py +134 -0
  60. warp/_src/fem/space/shape/square_shape_function.py +928 -0
  61. warp/_src/fem/space/shape/tet_shape_function.py +829 -0
  62. warp/_src/fem/space/shape/triangle_shape_function.py +674 -0
  63. warp/_src/fem/space/tetmesh_function_space.py +270 -0
  64. warp/_src/fem/space/topology.py +461 -0
  65. warp/_src/fem/space/trimesh_function_space.py +193 -0
  66. warp/_src/fem/types.py +114 -0
  67. warp/_src/fem/utils.py +488 -0
  68. warp/_src/jax.py +188 -0
  69. warp/_src/jax_experimental/__init__.py +14 -0
  70. warp/_src/jax_experimental/custom_call.py +389 -0
  71. warp/_src/jax_experimental/ffi.py +1286 -0
  72. warp/_src/jax_experimental/xla_ffi.py +658 -0
  73. warp/_src/marching_cubes.py +710 -0
  74. warp/_src/math.py +416 -0
  75. warp/_src/optim/__init__.py +14 -0
  76. warp/_src/optim/adam.py +165 -0
  77. warp/_src/optim/linear.py +1608 -0
  78. warp/_src/optim/sgd.py +114 -0
  79. warp/_src/paddle.py +408 -0
  80. warp/_src/render/__init__.py +14 -0
  81. warp/_src/render/imgui_manager.py +291 -0
  82. warp/_src/render/render_opengl.py +3638 -0
  83. warp/_src/render/render_usd.py +939 -0
  84. warp/_src/render/utils.py +162 -0
  85. warp/_src/sparse.py +2718 -0
  86. warp/_src/tape.py +1208 -0
  87. warp/_src/thirdparty/__init__.py +0 -0
  88. warp/_src/thirdparty/appdirs.py +598 -0
  89. warp/_src/thirdparty/dlpack.py +145 -0
  90. warp/_src/thirdparty/unittest_parallel.py +676 -0
  91. warp/_src/torch.py +393 -0
  92. warp/_src/types.py +5888 -0
  93. warp/_src/utils.py +1695 -0
  94. warp/autograd.py +33 -0
  95. warp/bin/libwarp-clang.dylib +0 -0
  96. warp/bin/libwarp.dylib +0 -0
  97. warp/build.py +29 -0
  98. warp/build_dll.py +24 -0
  99. warp/codegen.py +24 -0
  100. warp/constants.py +24 -0
  101. warp/context.py +33 -0
  102. warp/dlpack.py +24 -0
  103. warp/examples/__init__.py +24 -0
  104. warp/examples/assets/bear.usd +0 -0
  105. warp/examples/assets/bunny.usd +0 -0
  106. warp/examples/assets/cube.usd +0 -0
  107. warp/examples/assets/nonuniform.usd +0 -0
  108. warp/examples/assets/nvidia_logo.png +0 -0
  109. warp/examples/assets/pixel.jpg +0 -0
  110. warp/examples/assets/rocks.nvdb +0 -0
  111. warp/examples/assets/rocks.usd +0 -0
  112. warp/examples/assets/sphere.usd +0 -0
  113. warp/examples/assets/square_cloth.usd +0 -0
  114. warp/examples/benchmarks/benchmark_api.py +389 -0
  115. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  116. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  117. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  118. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  119. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  120. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  121. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  122. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  123. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  124. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  125. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  126. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  127. warp/examples/benchmarks/benchmark_launches.py +301 -0
  128. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  129. warp/examples/benchmarks/benchmark_tile_sort.py +155 -0
  130. warp/examples/browse.py +37 -0
  131. warp/examples/core/example_cupy.py +86 -0
  132. warp/examples/core/example_dem.py +241 -0
  133. warp/examples/core/example_fluid.py +299 -0
  134. warp/examples/core/example_graph_capture.py +150 -0
  135. warp/examples/core/example_marching_cubes.py +195 -0
  136. warp/examples/core/example_mesh.py +180 -0
  137. warp/examples/core/example_mesh_intersect.py +211 -0
  138. warp/examples/core/example_nvdb.py +182 -0
  139. warp/examples/core/example_raycast.py +111 -0
  140. warp/examples/core/example_raymarch.py +205 -0
  141. warp/examples/core/example_render_opengl.py +290 -0
  142. warp/examples/core/example_sample_mesh.py +300 -0
  143. warp/examples/core/example_sph.py +411 -0
  144. warp/examples/core/example_spin_lock.py +93 -0
  145. warp/examples/core/example_torch.py +211 -0
  146. warp/examples/core/example_wave.py +269 -0
  147. warp/examples/core/example_work_queue.py +118 -0
  148. warp/examples/distributed/example_jacobi_mpi.py +506 -0
  149. warp/examples/fem/example_adaptive_grid.py +286 -0
  150. warp/examples/fem/example_apic_fluid.py +469 -0
  151. warp/examples/fem/example_burgers.py +261 -0
  152. warp/examples/fem/example_convection_diffusion.py +181 -0
  153. warp/examples/fem/example_convection_diffusion_dg.py +225 -0
  154. warp/examples/fem/example_darcy_ls_optimization.py +489 -0
  155. warp/examples/fem/example_deformed_geometry.py +172 -0
  156. warp/examples/fem/example_diffusion.py +196 -0
  157. warp/examples/fem/example_diffusion_3d.py +225 -0
  158. warp/examples/fem/example_diffusion_mgpu.py +225 -0
  159. warp/examples/fem/example_distortion_energy.py +228 -0
  160. warp/examples/fem/example_elastic_shape_optimization.py +387 -0
  161. warp/examples/fem/example_magnetostatics.py +242 -0
  162. warp/examples/fem/example_mixed_elasticity.py +293 -0
  163. warp/examples/fem/example_navier_stokes.py +263 -0
  164. warp/examples/fem/example_nonconforming_contact.py +300 -0
  165. warp/examples/fem/example_stokes.py +213 -0
  166. warp/examples/fem/example_stokes_transfer.py +262 -0
  167. warp/examples/fem/example_streamlines.py +357 -0
  168. warp/examples/fem/utils.py +1047 -0
  169. warp/examples/interop/example_jax_callable.py +146 -0
  170. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  171. warp/examples/interop/example_jax_kernel.py +232 -0
  172. warp/examples/optim/example_diffray.py +561 -0
  173. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  174. warp/examples/tile/example_tile_block_cholesky.py +502 -0
  175. warp/examples/tile/example_tile_cholesky.py +88 -0
  176. warp/examples/tile/example_tile_convolution.py +66 -0
  177. warp/examples/tile/example_tile_fft.py +55 -0
  178. warp/examples/tile/example_tile_filtering.py +113 -0
  179. warp/examples/tile/example_tile_matmul.py +85 -0
  180. warp/examples/tile/example_tile_mcgp.py +191 -0
  181. warp/examples/tile/example_tile_mlp.py +385 -0
  182. warp/examples/tile/example_tile_nbody.py +199 -0
  183. warp/fabric.py +24 -0
  184. warp/fem/__init__.py +173 -0
  185. warp/fem/adaptivity.py +26 -0
  186. warp/fem/cache.py +30 -0
  187. warp/fem/dirichlet.py +24 -0
  188. warp/fem/field/__init__.py +24 -0
  189. warp/fem/field/field.py +26 -0
  190. warp/fem/geometry/__init__.py +21 -0
  191. warp/fem/geometry/closest_point.py +31 -0
  192. warp/fem/linalg.py +38 -0
  193. warp/fem/operator.py +32 -0
  194. warp/fem/polynomial.py +29 -0
  195. warp/fem/space/__init__.py +22 -0
  196. warp/fem/space/basis_space.py +24 -0
  197. warp/fem/space/shape/__init__.py +68 -0
  198. warp/fem/space/topology.py +24 -0
  199. warp/fem/types.py +24 -0
  200. warp/fem/utils.py +32 -0
  201. warp/jax.py +29 -0
  202. warp/jax_experimental/__init__.py +29 -0
  203. warp/jax_experimental/custom_call.py +29 -0
  204. warp/jax_experimental/ffi.py +39 -0
  205. warp/jax_experimental/xla_ffi.py +24 -0
  206. warp/marching_cubes.py +24 -0
  207. warp/math.py +37 -0
  208. warp/native/array.h +1687 -0
  209. warp/native/builtin.h +2327 -0
  210. warp/native/bvh.cpp +562 -0
  211. warp/native/bvh.cu +826 -0
  212. warp/native/bvh.h +555 -0
  213. warp/native/clang/clang.cpp +541 -0
  214. warp/native/coloring.cpp +622 -0
  215. warp/native/crt.cpp +51 -0
  216. warp/native/crt.h +568 -0
  217. warp/native/cuda_crt.h +1058 -0
  218. warp/native/cuda_util.cpp +677 -0
  219. warp/native/cuda_util.h +313 -0
  220. warp/native/error.cpp +77 -0
  221. warp/native/error.h +36 -0
  222. warp/native/exports.h +2023 -0
  223. warp/native/fabric.h +246 -0
  224. warp/native/hashgrid.cpp +311 -0
  225. warp/native/hashgrid.cu +89 -0
  226. warp/native/hashgrid.h +240 -0
  227. warp/native/initializer_array.h +41 -0
  228. warp/native/intersect.h +1253 -0
  229. warp/native/intersect_adj.h +375 -0
  230. warp/native/intersect_tri.h +348 -0
  231. warp/native/mat.h +5189 -0
  232. warp/native/mathdx.cpp +93 -0
  233. warp/native/matnn.h +221 -0
  234. warp/native/mesh.cpp +266 -0
  235. warp/native/mesh.cu +406 -0
  236. warp/native/mesh.h +2097 -0
  237. warp/native/nanovdb/GridHandle.h +533 -0
  238. warp/native/nanovdb/HostBuffer.h +591 -0
  239. warp/native/nanovdb/NanoVDB.h +6246 -0
  240. warp/native/nanovdb/NodeManager.h +323 -0
  241. warp/native/nanovdb/PNanoVDB.h +3390 -0
  242. warp/native/noise.h +859 -0
  243. warp/native/quat.h +1664 -0
  244. warp/native/rand.h +342 -0
  245. warp/native/range.h +145 -0
  246. warp/native/reduce.cpp +174 -0
  247. warp/native/reduce.cu +363 -0
  248. warp/native/runlength_encode.cpp +79 -0
  249. warp/native/runlength_encode.cu +61 -0
  250. warp/native/scan.cpp +47 -0
  251. warp/native/scan.cu +55 -0
  252. warp/native/scan.h +23 -0
  253. warp/native/solid_angle.h +466 -0
  254. warp/native/sort.cpp +251 -0
  255. warp/native/sort.cu +286 -0
  256. warp/native/sort.h +35 -0
  257. warp/native/sparse.cpp +241 -0
  258. warp/native/sparse.cu +435 -0
  259. warp/native/spatial.h +1306 -0
  260. warp/native/svd.h +727 -0
  261. warp/native/temp_buffer.h +46 -0
  262. warp/native/tile.h +4124 -0
  263. warp/native/tile_radix_sort.h +1112 -0
  264. warp/native/tile_reduce.h +838 -0
  265. warp/native/tile_scan.h +240 -0
  266. warp/native/tuple.h +189 -0
  267. warp/native/vec.h +2199 -0
  268. warp/native/version.h +23 -0
  269. warp/native/volume.cpp +501 -0
  270. warp/native/volume.cu +68 -0
  271. warp/native/volume.h +970 -0
  272. warp/native/volume_builder.cu +483 -0
  273. warp/native/volume_builder.h +52 -0
  274. warp/native/volume_impl.h +70 -0
  275. warp/native/warp.cpp +1143 -0
  276. warp/native/warp.cu +4604 -0
  277. warp/native/warp.h +358 -0
  278. warp/optim/__init__.py +20 -0
  279. warp/optim/adam.py +24 -0
  280. warp/optim/linear.py +35 -0
  281. warp/optim/sgd.py +24 -0
  282. warp/paddle.py +24 -0
  283. warp/py.typed +0 -0
  284. warp/render/__init__.py +22 -0
  285. warp/render/imgui_manager.py +29 -0
  286. warp/render/render_opengl.py +24 -0
  287. warp/render/render_usd.py +24 -0
  288. warp/render/utils.py +24 -0
  289. warp/sparse.py +51 -0
  290. warp/tape.py +24 -0
  291. warp/tests/__init__.py +1 -0
  292. warp/tests/__main__.py +4 -0
  293. warp/tests/assets/curlnoise_golden.npy +0 -0
  294. warp/tests/assets/mlp_golden.npy +0 -0
  295. warp/tests/assets/pixel.npy +0 -0
  296. warp/tests/assets/pnoise_golden.npy +0 -0
  297. warp/tests/assets/spiky.usd +0 -0
  298. warp/tests/assets/test_grid.nvdb +0 -0
  299. warp/tests/assets/test_index_grid.nvdb +0 -0
  300. warp/tests/assets/test_int32_grid.nvdb +0 -0
  301. warp/tests/assets/test_vec_grid.nvdb +0 -0
  302. warp/tests/assets/torus.nvdb +0 -0
  303. warp/tests/assets/torus.usda +105 -0
  304. warp/tests/aux_test_class_kernel.py +34 -0
  305. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  306. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  307. warp/tests/aux_test_dependent.py +29 -0
  308. warp/tests/aux_test_grad_customs.py +29 -0
  309. warp/tests/aux_test_instancing_gc.py +26 -0
  310. warp/tests/aux_test_module_aot.py +7 -0
  311. warp/tests/aux_test_module_unload.py +23 -0
  312. warp/tests/aux_test_name_clash1.py +40 -0
  313. warp/tests/aux_test_name_clash2.py +40 -0
  314. warp/tests/aux_test_reference.py +9 -0
  315. warp/tests/aux_test_reference_reference.py +8 -0
  316. warp/tests/aux_test_square.py +16 -0
  317. warp/tests/aux_test_unresolved_func.py +22 -0
  318. warp/tests/aux_test_unresolved_symbol.py +22 -0
  319. warp/tests/cuda/__init__.py +0 -0
  320. warp/tests/cuda/test_async.py +676 -0
  321. warp/tests/cuda/test_conditional_captures.py +1147 -0
  322. warp/tests/cuda/test_ipc.py +124 -0
  323. warp/tests/cuda/test_mempool.py +233 -0
  324. warp/tests/cuda/test_multigpu.py +169 -0
  325. warp/tests/cuda/test_peer.py +139 -0
  326. warp/tests/cuda/test_pinned.py +84 -0
  327. warp/tests/cuda/test_streams.py +691 -0
  328. warp/tests/geometry/__init__.py +0 -0
  329. warp/tests/geometry/test_bvh.py +335 -0
  330. warp/tests/geometry/test_hash_grid.py +259 -0
  331. warp/tests/geometry/test_marching_cubes.py +294 -0
  332. warp/tests/geometry/test_mesh.py +318 -0
  333. warp/tests/geometry/test_mesh_query_aabb.py +392 -0
  334. warp/tests/geometry/test_mesh_query_point.py +935 -0
  335. warp/tests/geometry/test_mesh_query_ray.py +323 -0
  336. warp/tests/geometry/test_volume.py +1103 -0
  337. warp/tests/geometry/test_volume_write.py +346 -0
  338. warp/tests/interop/__init__.py +0 -0
  339. warp/tests/interop/test_dlpack.py +730 -0
  340. warp/tests/interop/test_jax.py +1673 -0
  341. warp/tests/interop/test_paddle.py +800 -0
  342. warp/tests/interop/test_torch.py +1001 -0
  343. warp/tests/run_coverage_serial.py +39 -0
  344. warp/tests/test_adam.py +162 -0
  345. warp/tests/test_arithmetic.py +1096 -0
  346. warp/tests/test_array.py +3756 -0
  347. warp/tests/test_array_reduce.py +156 -0
  348. warp/tests/test_assert.py +303 -0
  349. warp/tests/test_atomic.py +336 -0
  350. warp/tests/test_atomic_bitwise.py +209 -0
  351. warp/tests/test_atomic_cas.py +312 -0
  352. warp/tests/test_bool.py +220 -0
  353. warp/tests/test_builtins_resolution.py +732 -0
  354. warp/tests/test_closest_point_edge_edge.py +327 -0
  355. warp/tests/test_codegen.py +974 -0
  356. warp/tests/test_codegen_instancing.py +1495 -0
  357. warp/tests/test_compile_consts.py +215 -0
  358. warp/tests/test_conditional.py +298 -0
  359. warp/tests/test_context.py +35 -0
  360. warp/tests/test_copy.py +319 -0
  361. warp/tests/test_ctypes.py +618 -0
  362. warp/tests/test_dense.py +73 -0
  363. warp/tests/test_devices.py +127 -0
  364. warp/tests/test_enum.py +136 -0
  365. warp/tests/test_examples.py +424 -0
  366. warp/tests/test_fabricarray.py +998 -0
  367. warp/tests/test_fast_math.py +72 -0
  368. warp/tests/test_fem.py +2204 -0
  369. warp/tests/test_fixedarray.py +229 -0
  370. warp/tests/test_fp16.py +136 -0
  371. warp/tests/test_func.py +501 -0
  372. warp/tests/test_future_annotations.py +100 -0
  373. warp/tests/test_generics.py +656 -0
  374. warp/tests/test_grad.py +893 -0
  375. warp/tests/test_grad_customs.py +339 -0
  376. warp/tests/test_grad_debug.py +341 -0
  377. warp/tests/test_implicit_init.py +411 -0
  378. warp/tests/test_import.py +45 -0
  379. warp/tests/test_indexedarray.py +1140 -0
  380. warp/tests/test_intersect.py +103 -0
  381. warp/tests/test_iter.py +76 -0
  382. warp/tests/test_large.py +177 -0
  383. warp/tests/test_launch.py +411 -0
  384. warp/tests/test_lerp.py +151 -0
  385. warp/tests/test_linear_solvers.py +223 -0
  386. warp/tests/test_lvalue.py +427 -0
  387. warp/tests/test_map.py +526 -0
  388. warp/tests/test_mat.py +3515 -0
  389. warp/tests/test_mat_assign_copy.py +178 -0
  390. warp/tests/test_mat_constructors.py +573 -0
  391. warp/tests/test_mat_lite.py +122 -0
  392. warp/tests/test_mat_scalar_ops.py +2913 -0
  393. warp/tests/test_math.py +212 -0
  394. warp/tests/test_module_aot.py +287 -0
  395. warp/tests/test_module_hashing.py +258 -0
  396. warp/tests/test_modules_lite.py +70 -0
  397. warp/tests/test_noise.py +252 -0
  398. warp/tests/test_operators.py +299 -0
  399. warp/tests/test_options.py +129 -0
  400. warp/tests/test_overwrite.py +551 -0
  401. warp/tests/test_print.py +408 -0
  402. warp/tests/test_quat.py +2653 -0
  403. warp/tests/test_quat_assign_copy.py +145 -0
  404. warp/tests/test_rand.py +339 -0
  405. warp/tests/test_reload.py +303 -0
  406. warp/tests/test_rounding.py +157 -0
  407. warp/tests/test_runlength_encode.py +196 -0
  408. warp/tests/test_scalar_ops.py +133 -0
  409. warp/tests/test_smoothstep.py +108 -0
  410. warp/tests/test_snippet.py +318 -0
  411. warp/tests/test_sparse.py +845 -0
  412. warp/tests/test_spatial.py +2859 -0
  413. warp/tests/test_spatial_assign_copy.py +160 -0
  414. warp/tests/test_special_values.py +361 -0
  415. warp/tests/test_static.py +640 -0
  416. warp/tests/test_struct.py +901 -0
  417. warp/tests/test_tape.py +242 -0
  418. warp/tests/test_transient_module.py +93 -0
  419. warp/tests/test_triangle_closest_point.py +192 -0
  420. warp/tests/test_tuple.py +361 -0
  421. warp/tests/test_types.py +615 -0
  422. warp/tests/test_utils.py +594 -0
  423. warp/tests/test_vec.py +1408 -0
  424. warp/tests/test_vec_assign_copy.py +143 -0
  425. warp/tests/test_vec_constructors.py +325 -0
  426. warp/tests/test_vec_lite.py +80 -0
  427. warp/tests/test_vec_scalar_ops.py +2327 -0
  428. warp/tests/test_verify_fp.py +100 -0
  429. warp/tests/test_version.py +75 -0
  430. warp/tests/tile/__init__.py +0 -0
  431. warp/tests/tile/test_tile.py +1519 -0
  432. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  433. warp/tests/tile/test_tile_cholesky.py +608 -0
  434. warp/tests/tile/test_tile_load.py +724 -0
  435. warp/tests/tile/test_tile_mathdx.py +156 -0
  436. warp/tests/tile/test_tile_matmul.py +179 -0
  437. warp/tests/tile/test_tile_mlp.py +400 -0
  438. warp/tests/tile/test_tile_reduce.py +950 -0
  439. warp/tests/tile/test_tile_shared_memory.py +376 -0
  440. warp/tests/tile/test_tile_sort.py +121 -0
  441. warp/tests/tile/test_tile_view.py +173 -0
  442. warp/tests/unittest_serial.py +47 -0
  443. warp/tests/unittest_suites.py +430 -0
  444. warp/tests/unittest_utils.py +469 -0
  445. warp/tests/walkthrough_debug.py +95 -0
  446. warp/torch.py +24 -0
  447. warp/types.py +51 -0
  448. warp/utils.py +31 -0
  449. warp_lang-1.10.0.dist-info/METADATA +459 -0
  450. warp_lang-1.10.0.dist-info/RECORD +468 -0
  451. warp_lang-1.10.0.dist-info/WHEEL +5 -0
  452. warp_lang-1.10.0.dist-info/licenses/LICENSE.md +176 -0
  453. warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  454. warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  455. warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  456. warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  457. warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  458. warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  459. warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  460. warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  461. warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  462. warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  463. warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  464. warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  465. warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  466. warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  467. warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  468. warp_lang-1.10.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,676 @@
1
+ # Licensed under the MIT License
2
+ # https://github.com/craigahobbs/unittest-parallel/blob/main/LICENSE
3
+
4
+ # SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
5
+ # SPDX-License-Identifier: Apache-2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ """
20
+ unittest-parallel command-line script main module
21
+ """
22
+
23
+ import argparse
24
+ import concurrent.futures # NVIDIA Modification
25
+ import multiprocessing
26
+ import os
27
+ import sys
28
+ import tempfile
29
+ import time
30
+ import unittest
31
+ from concurrent.futures.process import BrokenProcessPool
32
+ from contextlib import contextmanager
33
+ from io import StringIO
34
+
35
+ import warp.tests.unittest_suites # NVIDIA Modification
36
+ from warp.tests.unittest_utils import ( # NVIDIA modification
37
+ ParallelJunitTestResult,
38
+ write_junit_results,
39
+ )
40
+
41
+ try:
42
+ import coverage
43
+
44
+ COVERAGE_AVAILABLE = True # NVIDIA Modification
45
+ except ImportError:
46
+ COVERAGE_AVAILABLE = False # NVIDIA Modification
47
+
48
+
49
+ # The following variables are NVIDIA Modifications
50
+ START_DIRECTORY = os.path.join(os.path.dirname(__file__), "..") # The directory to start test discovery
51
+
52
+
53
+ def main(argv=None):
54
+ """
55
+ unittest-parallel command-line script main entry point
56
+ """
57
+
58
+ # Command line arguments
59
+ parser = argparse.ArgumentParser(
60
+ prog="unittest-parallel",
61
+ # NVIDIA Modifications follow:
62
+ formatter_class=argparse.RawTextHelpFormatter,
63
+ epilog="""Example usage:
64
+ python -m warp.tests -s autodetect -p 'test_a*.py'
65
+ python -m warp.tests -s kit
66
+ python -m warp.tests -k 'mgpu' -k 'cuda'
67
+ """,
68
+ )
69
+ # parser.add_argument("-v", "--verbose", action="store_const", const=2, default=1, help="Verbose output")
70
+ parser.add_argument("-q", "--quiet", dest="verbose", action="store_const", const=0, default=2, help="Quiet output")
71
+ parser.add_argument("-f", "--failfast", action="store_true", default=False, help="Stop on first fail or error")
72
+ parser.add_argument(
73
+ "-b", "--buffer", action="store_true", default=False, help="Buffer stdout and stderr during tests"
74
+ )
75
+ parser.add_argument(
76
+ "-k",
77
+ dest="testNamePatterns",
78
+ action="append",
79
+ type=_convert_select_pattern,
80
+ help="Only run tests which match the given substring",
81
+ )
82
+ parser.add_argument(
83
+ "-p",
84
+ "--pattern",
85
+ metavar="PATTERN",
86
+ default="test*.py",
87
+ help="'autodetect' suite only: Pattern to match tests ('test*.py' default)", # NVIDIA Modification
88
+ )
89
+ parser.add_argument(
90
+ "-t",
91
+ "--top-level-directory",
92
+ metavar="TOP",
93
+ help="Top level directory of project (defaults to start directory)",
94
+ )
95
+ parser.add_argument(
96
+ "--junit-report-xml", metavar="FILE", help="Generate JUnit report format XML file"
97
+ ) # NVIDIA Modification
98
+ parser.add_argument(
99
+ "-s",
100
+ "--suite",
101
+ type=str,
102
+ default="default",
103
+ choices=["autodetect", "default", "kit"],
104
+ help="Name of the test suite to run (default is 'default').",
105
+ ) # NVIDIA Modification
106
+ group_parallel = parser.add_argument_group("parallelization options")
107
+ group_parallel.add_argument(
108
+ "-j",
109
+ "--jobs",
110
+ metavar="COUNT",
111
+ type=int,
112
+ default=0,
113
+ help="The number of test processes (default is 0, all cores)",
114
+ )
115
+ group_parallel.add_argument(
116
+ "-m",
117
+ "--maxjobs",
118
+ metavar="MAXCOUNT",
119
+ type=int,
120
+ default=8,
121
+ help="The maximum number of test processes (default is 8)",
122
+ ) # NVIDIA Modification
123
+ group_parallel.add_argument(
124
+ "--level",
125
+ choices=["module", "class", "test"],
126
+ default="class",
127
+ help="Set the test parallelism level (default is 'class')",
128
+ )
129
+ group_parallel.add_argument(
130
+ "--disable-process-pooling",
131
+ action="store_true",
132
+ default=False,
133
+ help="Do not reuse processes used to run test suites",
134
+ )
135
+ group_parallel.add_argument(
136
+ "--disable-concurrent-futures",
137
+ action="store_true",
138
+ default=False,
139
+ help="Use multiprocessing instead of concurrent.futures.",
140
+ ) # NVIDIA Modification
141
+ group_parallel.add_argument(
142
+ "--serial-fallback",
143
+ action="store_true",
144
+ default=False,
145
+ help="Run in a single-process (no spawning) mode without multiprocessing or concurrent.futures.",
146
+ ) # NVIDIA Modification
147
+ group_coverage = parser.add_argument_group("coverage options")
148
+ group_coverage.add_argument("--coverage", action="store_true", help="Run tests with coverage")
149
+ group_coverage.add_argument("--coverage-branch", action="store_true", help="Run tests with branch coverage")
150
+ group_coverage.add_argument(
151
+ "--coverage-html",
152
+ metavar="DIR",
153
+ help="Generate coverage HTML report",
154
+ default=os.path.join(START_DIRECTORY, "..", "..", "htmlcov"),
155
+ )
156
+ group_coverage.add_argument("--coverage-xml", metavar="FILE", help="Generate coverage XML report")
157
+ group_coverage.add_argument(
158
+ "--coverage-fail-under", metavar="MIN", type=float, help="Fail if coverage percentage under min"
159
+ )
160
+ group_warp = parser.add_argument_group("NVIDIA Warp options") # NVIDIA Modification
161
+ group_warp.add_argument(
162
+ "--no-shared-cache", action="store_true", help="Use a separate kernel cache per test process."
163
+ )
164
+ group_warp.add_argument("--warp-debug", action="store_true", help="Set warp.config.mode to 'debug'")
165
+ args = parser.parse_args(args=argv)
166
+
167
+ if args.coverage_branch:
168
+ args.coverage = args.coverage_branch
169
+
170
+ if args.coverage and not COVERAGE_AVAILABLE:
171
+ parser.exit(
172
+ status=2, message="--coverage was used, but coverage was not found. Is it installed?\n"
173
+ ) # NVIDIA Modification
174
+
175
+ process_count = max(0, args.jobs)
176
+ if process_count == 0:
177
+ process_count = multiprocessing.cpu_count()
178
+ process_count = min(process_count, args.maxjobs) # NVIDIA Modification
179
+
180
+ import warp as wp # NVIDIA Modification
181
+
182
+ # Clear the Warp cache (NVIDIA Modification)
183
+ wp.clear_lto_cache()
184
+ wp.clear_kernel_cache()
185
+ print("Cleared Warp kernel cache")
186
+
187
+ # Create the temporary directory (for coverage files)
188
+ with tempfile.TemporaryDirectory() as temp_dir:
189
+ # Discover tests
190
+ with _coverage(args, temp_dir):
191
+ test_loader = unittest.TestLoader()
192
+ if args.testNamePatterns:
193
+ test_loader.testNamePatterns = args.testNamePatterns
194
+
195
+ auto_discover_suite = warp.tests.unittest_suites.auto_discover_suite(
196
+ test_loader, args.pattern
197
+ ) # NVIDIA Modification
198
+
199
+ # NVIDIA Modification
200
+ if args.suite != "autodetect":
201
+ # Print notices for test classes missing from the suite when compared to auto-discovered tests
202
+ discover_suite = warp.tests.unittest_suites.compare_unittest_suites(
203
+ test_loader, args.suite, auto_discover_suite
204
+ )
205
+ else:
206
+ discover_suite = auto_discover_suite
207
+
208
+ # Get the parallelizable test suites
209
+ if args.level == "test":
210
+ test_suites = list(_iter_test_cases(discover_suite))
211
+ elif args.level == "class":
212
+ test_suites = list(_iter_class_suites(discover_suite))
213
+ else: # args.level == 'module'
214
+ test_suites = list(_iter_module_suites(discover_suite))
215
+
216
+ # Don't use more processes than test suites
217
+ process_count = max(1, min(len(test_suites), process_count))
218
+
219
+ if not args.serial_fallback:
220
+ # Report test suites and processes
221
+ print(
222
+ f"Running {len(test_suites)} test suites ({discover_suite.countTestCases()} total tests) across {process_count} processes",
223
+ file=sys.stderr,
224
+ )
225
+ if args.verbose > 1:
226
+ print(file=sys.stderr)
227
+
228
+ # Create the shared index object used in Warp caches (NVIDIA Modification)
229
+ manager = multiprocessing.Manager()
230
+ shared_index = manager.Value("i", -1)
231
+
232
+ # Run the tests in parallel
233
+ start_time = time.perf_counter()
234
+
235
+ if args.disable_concurrent_futures:
236
+ multiprocessing_context = multiprocessing.get_context(method="spawn")
237
+ maxtasksperchild = 1 if args.disable_process_pooling else None
238
+ with multiprocessing_context.Pool(
239
+ process_count,
240
+ maxtasksperchild=maxtasksperchild,
241
+ initializer=initialize_test_process,
242
+ initargs=(manager.Lock(), shared_index, args, temp_dir),
243
+ ) as pool:
244
+ test_manager = ParallelTestManager(manager, args, temp_dir)
245
+ results = pool.map(test_manager.run_tests, test_suites)
246
+ else:
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
+ # Skip fallback in CI/CD environments to respect job timeouts
279
+ in_ci = os.environ.get("CI") or os.environ.get("GITHUB_ACTIONS") or os.environ.get("GITLAB_CI")
280
+ if parallel_failed and in_ci:
281
+ parser.exit(
282
+ status=1,
283
+ message="Error: Parallel execution failed in CI/CD environment. Skipping single-process fallback due to job timeout constraints.\n",
284
+ )
285
+ elif parallel_failed:
286
+ print("Running all tests in isolated single-process mode...", file=sys.stderr)
287
+ # Run all test suites in isolated single-process pools
288
+ results = []
289
+ for i, suite in enumerate(test_suites):
290
+ try:
291
+ # Create a new single-process pool for each test suite
292
+ with concurrent.futures.ProcessPoolExecutor(
293
+ max_workers=1,
294
+ mp_context=multiprocessing.get_context(method="spawn"),
295
+ initializer=initialize_test_process,
296
+ initargs=(manager.Lock(), shared_index, args, temp_dir),
297
+ ) as executor:
298
+ test_manager = ParallelTestManager(manager, args, temp_dir)
299
+ future = executor.submit(test_manager.run_tests, suite)
300
+ try:
301
+ result = future.result(timeout=2400)
302
+ results.append(result)
303
+ except BrokenProcessPool:
304
+ print(
305
+ f"Warning: Process crashed or was terminated unexpectedly in isolated execution for test suite {i + 1}/{len(test_suites)}. Marking tests as crashed.",
306
+ file=sys.stderr,
307
+ )
308
+ crash_result = create_crash_result(suite)
309
+ results.append(crash_result)
310
+ except Exception as e:
311
+ print(
312
+ f"Warning: Error in isolated 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)
317
+ except Exception as e:
318
+ print(
319
+ f"Warning: Failed to create isolated process for test suite {i + 1}/{len(test_suites)}: {e}. Marking tests as crashed.",
320
+ file=sys.stderr,
321
+ )
322
+ error_result = create_crash_result(suite)
323
+ results.append(error_result)
324
+ else:
325
+ # This entire path is an NVIDIA Modification
326
+
327
+ # Report test suites and processes
328
+ print(f"Running {discover_suite.countTestCases()} total tests (serial fallback)", file=sys.stderr)
329
+ if args.verbose > 1:
330
+ print(file=sys.stderr)
331
+
332
+ if args.warp_debug:
333
+ wp.config.mode = "debug"
334
+
335
+ # Run the tests in serial
336
+ start_time = time.perf_counter()
337
+
338
+ with multiprocessing.Manager() as manager:
339
+ test_manager = ParallelTestManager(manager, args, temp_dir)
340
+ results = [test_manager.run_tests(discover_suite)]
341
+
342
+ stop_time = time.perf_counter()
343
+ test_duration = stop_time - start_time
344
+
345
+ # Aggregate parallel test run results
346
+ tests_run = 0
347
+ errors = []
348
+ failures = []
349
+ skipped = 0
350
+ expected_failures = 0
351
+ unexpected_successes = 0
352
+ test_records = [] # NVIDIA Modification
353
+ for result in results:
354
+ tests_run += result[0]
355
+ errors.extend(result[1])
356
+ failures.extend(result[2])
357
+ skipped += result[3]
358
+ expected_failures += result[4]
359
+ unexpected_successes += result[5]
360
+ test_records += result[6] # NVIDIA Modification
361
+ is_success = not (errors or failures or unexpected_successes)
362
+
363
+ # Compute test info
364
+ infos = []
365
+ if failures:
366
+ infos.append(f"failures={len(failures)}")
367
+ if errors:
368
+ infos.append(f"errors={len(errors)}")
369
+ if skipped:
370
+ infos.append(f"skipped={skipped}")
371
+ if expected_failures:
372
+ infos.append(f"expected failures={expected_failures}")
373
+ if unexpected_successes:
374
+ infos.append(f"unexpected successes={unexpected_successes}")
375
+
376
+ # Report test errors
377
+ if errors or failures:
378
+ print(file=sys.stderr)
379
+ for error in errors:
380
+ print(error, file=sys.stderr)
381
+ for failure in failures:
382
+ print(failure, file=sys.stderr)
383
+ elif args.verbose > 0:
384
+ print(file=sys.stderr)
385
+
386
+ # Test report
387
+ print(unittest.TextTestResult.separator2, file=sys.stderr)
388
+ print(f"Ran {tests_run} {'tests' if tests_run > 1 else 'test'} in {test_duration:.3f}s", file=sys.stderr)
389
+ print(file=sys.stderr)
390
+ print(f"{'OK' if is_success else 'FAILED'}{' (' + ', '.join(infos) + ')' if infos else ''}", file=sys.stderr)
391
+
392
+ if test_records and args.junit_report_xml:
393
+ # NVIDIA modification to report results in Junit XML format
394
+ write_junit_results(
395
+ args.junit_report_xml,
396
+ test_records,
397
+ tests_run,
398
+ len(failures) + unexpected_successes,
399
+ len(errors),
400
+ skipped,
401
+ test_duration,
402
+ )
403
+
404
+ # Return an error status on failure
405
+ if not is_success:
406
+ parser.exit(status=len(errors) + len(failures) + unexpected_successes)
407
+
408
+ # Coverage?
409
+ if args.coverage:
410
+ # Combine the coverage files
411
+ cov_options = {}
412
+ cov_options["config_file"] = True # Grab configuration from pyproject.toml (must install coverage[toml])
413
+ cov = coverage.Coverage(**cov_options)
414
+ cov.combine(data_paths=[os.path.join(temp_dir, x) for x in os.listdir(temp_dir)])
415
+
416
+ # Coverage report
417
+ print(file=sys.stderr)
418
+ percent_covered = cov.report(ignore_errors=True, file=sys.stderr)
419
+ print(f"Total coverage is {percent_covered:.2f}%", file=sys.stderr)
420
+
421
+ # HTML coverage report
422
+ if args.coverage_html:
423
+ cov.html_report(directory=args.coverage_html, ignore_errors=True)
424
+
425
+ # XML coverage report
426
+ if args.coverage_xml:
427
+ cov.xml_report(outfile=args.coverage_xml, ignore_errors=True)
428
+
429
+ # Fail under
430
+ if args.coverage_fail_under and percent_covered < args.coverage_fail_under:
431
+ parser.exit(status=2)
432
+
433
+
434
+ def _convert_select_pattern(pattern):
435
+ if "*" not in pattern:
436
+ return f"*{pattern}*"
437
+ return pattern
438
+
439
+
440
+ @contextmanager
441
+ def _coverage(args, temp_dir):
442
+ # Running tests with coverage?
443
+ if args.coverage:
444
+ # Generate a random coverage data file name - file is deleted along with containing directory
445
+ with tempfile.NamedTemporaryFile(dir=temp_dir, delete=False) as coverage_file:
446
+ pass
447
+
448
+ # Create the coverage object
449
+ cov_options = {
450
+ "branch": args.coverage_branch,
451
+ "data_file": coverage_file.name,
452
+ # NVIDIA Modification removed unneeded options
453
+ }
454
+ cov_options["config_file"] = True # Grab configuration from pyproject.toml (must install coverage[toml])
455
+ cov = coverage.Coverage(**cov_options)
456
+ try:
457
+ # Start measuring code coverage
458
+ cov.start()
459
+
460
+ # Yield for unit test running
461
+ yield cov
462
+ finally:
463
+ # Stop measuring code coverage
464
+ cov.stop()
465
+
466
+ # Save the collected coverage data to the data file
467
+ cov.save()
468
+ else:
469
+ # Not running tests with coverage - yield for unit test running
470
+ yield None
471
+
472
+
473
+ # Iterate module-level test suites - all top-level test suites returned from TestLoader.discover
474
+ def _iter_module_suites(test_suite):
475
+ for module_suite in test_suite:
476
+ if module_suite.countTestCases():
477
+ yield module_suite
478
+
479
+
480
+ # Iterate class-level test suites - test suites that contains test cases
481
+ def _iter_class_suites(test_suite):
482
+ has_cases = any(isinstance(suite, unittest.TestCase) for suite in test_suite)
483
+ if has_cases:
484
+ yield test_suite
485
+ else:
486
+ for suite in test_suite:
487
+ yield from _iter_class_suites(suite)
488
+
489
+
490
+ # Iterate test cases (methods)
491
+ def _iter_test_cases(test_suite):
492
+ if isinstance(test_suite, unittest.TestCase):
493
+ yield test_suite
494
+ else:
495
+ for suite in test_suite:
496
+ yield from _iter_test_cases(suite)
497
+
498
+
499
+ def create_crash_result(test_suite):
500
+ """Create a result indicating the process crashed or was terminated unexpectedly while running this test suite.
501
+
502
+ This entire function is an NVIDIA modification.
503
+ """
504
+ test_count = test_suite.countTestCases()
505
+ crash_errors = []
506
+
507
+ # Create crash error entries for each test in the suite
508
+ # Note: We don't know which specific test caused the crash, just that the process crashed
509
+ for test in _iter_test_cases(test_suite):
510
+ error_msg = (
511
+ "Process crashed or was terminated unexpectedly while running this test suite "
512
+ f"(unknown which test caused the crash): {test}"
513
+ )
514
+ crash_errors.append(
515
+ "\n".join(
516
+ [
517
+ unittest.TextTestResult.separator1,
518
+ str(test),
519
+ unittest.TextTestResult.separator2,
520
+ error_msg,
521
+ ]
522
+ )
523
+ )
524
+
525
+ # Return the same format as run_tests: (test_count, errors, failures, skipped, expected_failures, unexpected_successes, test_records)
526
+ return (test_count, crash_errors, [], 0, 0, 0, [])
527
+
528
+
529
+ class ParallelTestManager:
530
+ def __init__(self, manager, args, temp_dir):
531
+ self.args = args
532
+ self.temp_dir = temp_dir
533
+ self.failfast = manager.Event()
534
+
535
+ def run_tests(self, test_suite):
536
+ # Fail fast?
537
+ if self.failfast.is_set():
538
+ return [0, [], [], 0, 0, 0, []] # NVIDIA Modification
539
+
540
+ # NVIDIA Modification for GitLab
541
+ import warp.tests.unittest_utils
542
+
543
+ warp.tests.unittest_utils.coverage_enabled = self.args.coverage
544
+ warp.tests.unittest_utils.coverage_temp_dir = self.temp_dir
545
+ warp.tests.unittest_utils.coverage_branch = self.args.coverage_branch
546
+
547
+ if self.args.junit_report_xml:
548
+ resultclass = ParallelJunitTestResult
549
+ else:
550
+ resultclass = ParallelTextTestResult
551
+
552
+ # Run unit tests
553
+ with _coverage(self.args, self.temp_dir):
554
+ runner = unittest.TextTestRunner(
555
+ stream=StringIO(),
556
+ resultclass=resultclass, # NVIDIA Modification
557
+ verbosity=self.args.verbose,
558
+ failfast=self.args.failfast,
559
+ buffer=self.args.buffer,
560
+ )
561
+ result = runner.run(test_suite)
562
+
563
+ # Set failfast, if necessary
564
+ if result.shouldStop:
565
+ self.failfast.set()
566
+
567
+ # Return (test_count, errors, failures, skipped_count, expected_failure_count, unexpected_success_count)
568
+ return (
569
+ result.testsRun,
570
+ [self._format_error(result, error) for error in result.errors],
571
+ [self._format_error(result, failure) for failure in result.failures],
572
+ len(result.skipped),
573
+ len(result.expectedFailures),
574
+ len(result.unexpectedSuccesses),
575
+ result.test_record, # NVIDIA modification
576
+ )
577
+
578
+ @staticmethod
579
+ def _format_error(result, error):
580
+ return "\n".join(
581
+ [
582
+ unittest.TextTestResult.separator1,
583
+ result.getDescription(error[0]),
584
+ unittest.TextTestResult.separator2,
585
+ error[1],
586
+ ]
587
+ )
588
+
589
+
590
+ class ParallelTextTestResult(unittest.TextTestResult):
591
+ def __init__(self, stream, descriptions, verbosity):
592
+ stream = type(stream)(sys.stderr)
593
+ super().__init__(stream, descriptions, verbosity)
594
+ self.test_record = [] # NVIDIA modification
595
+
596
+ def startTest(self, test):
597
+ if self.showAll:
598
+ self.stream.writeln(f"{self.getDescription(test)} ...")
599
+ self.stream.flush()
600
+ super(unittest.TextTestResult, self).startTest(test)
601
+
602
+ def _add_helper(self, test, dots_message, show_all_message):
603
+ if self.showAll:
604
+ self.stream.writeln(f"{self.getDescription(test)} ... {show_all_message}")
605
+ elif self.dots:
606
+ self.stream.write(dots_message)
607
+ self.stream.flush()
608
+
609
+ def addSuccess(self, test):
610
+ super(unittest.TextTestResult, self).addSuccess(test)
611
+ self._add_helper(test, ".", "ok")
612
+
613
+ def addError(self, test, err):
614
+ super(unittest.TextTestResult, self).addError(test, err)
615
+ self._add_helper(test, "E", "ERROR")
616
+
617
+ def addFailure(self, test, err):
618
+ super(unittest.TextTestResult, self).addFailure(test, err)
619
+ self._add_helper(test, "F", "FAIL")
620
+
621
+ def addSkip(self, test, reason):
622
+ super(unittest.TextTestResult, self).addSkip(test, reason)
623
+ self._add_helper(test, "s", f"skipped {reason!r}")
624
+
625
+ def addExpectedFailure(self, test, err):
626
+ super(unittest.TextTestResult, self).addExpectedFailure(test, err)
627
+ self._add_helper(test, "x", "expected failure")
628
+
629
+ def addUnexpectedSuccess(self, test):
630
+ super(unittest.TextTestResult, self).addUnexpectedSuccess(test)
631
+ self._add_helper(test, "u", "unexpected success")
632
+
633
+ def printErrors(self):
634
+ pass
635
+
636
+
637
+ def initialize_test_process(lock, shared_index, args, temp_dir):
638
+ """Necessary operations to be executed at the start of every test process.
639
+
640
+ Currently this function can be used to set a separate Warp cache. (NVIDIA modification)
641
+ If the environment variable `WARP_CACHE_ROOT` is detected, the cache will be placed in the provided path.
642
+
643
+ It also ensures that Warp is initialized prior to running any tests.
644
+ """
645
+
646
+ with lock:
647
+ shared_index.value += 1
648
+ worker_index = shared_index.value
649
+
650
+ with _coverage(args, temp_dir):
651
+ import warp as wp
652
+
653
+ if args.warp_debug:
654
+ wp.config.mode = "debug"
655
+
656
+ if args.no_shared_cache:
657
+ from warp.thirdparty import appdirs
658
+
659
+ if "WARP_CACHE_ROOT" in os.environ:
660
+ cache_root_dir = os.path.join(os.getenv("WARP_CACHE_ROOT"), f"{wp.config.version}-{worker_index:03d}")
661
+ else:
662
+ cache_root_dir = appdirs.user_cache_dir(
663
+ appname="warp", appauthor="NVIDIA", version=f"{wp.config.version}-{worker_index:03d}"
664
+ )
665
+
666
+ wp.config.kernel_cache_dir = cache_root_dir
667
+
668
+ wp.clear_lto_cache()
669
+ wp.clear_kernel_cache()
670
+ elif "WARP_CACHE_ROOT" in os.environ:
671
+ # Using a shared cache for all test processes
672
+ wp.config.kernel_cache_dir = os.path.join(os.getenv("WARP_CACHE_ROOT"), wp.config.version)
673
+
674
+
675
+ if __name__ == "__main__": # pragma: no cover
676
+ main()