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,127 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import unittest
17
+
18
+ import warp as wp
19
+ from warp.tests.unittest_utils import *
20
+
21
+
22
+ def test_devices_get_cuda_device_functions(test, device):
23
+ test.assertTrue(device.is_cuda)
24
+ test.assertTrue(wp.is_device_available(device))
25
+
26
+ device_ordinal = device.ordinal
27
+ current_device = wp.get_cuda_device(device_ordinal)
28
+ test.assertEqual(current_device, device)
29
+ current_device = wp.get_cuda_device() # No-ordinal version
30
+ test.assertTrue(wp.is_device_available(current_device))
31
+
32
+ if device == current_device:
33
+ test.assertEqual(device, "cuda")
34
+ else:
35
+ test.assertNotEqual(device, "cuda")
36
+
37
+ preferred_device = wp.get_preferred_device()
38
+ test.assertTrue(wp.is_device_available(preferred_device))
39
+
40
+
41
+ def test_devices_map_cuda_device(test, device):
42
+ with wp.ScopedDevice(device):
43
+ saved_alias = device.alias
44
+ # Map alias twice to check code path
45
+ wp.map_cuda_device("new_alias")
46
+ wp.map_cuda_device("new_alias")
47
+ wp._src.context.runtime.rename_device(device, saved_alias)
48
+
49
+
50
+ def test_devices_verify_cuda_device(test, device):
51
+ verify_cuda_saved = wp.config.verify_cuda
52
+
53
+ wp.config.verify_cuda = True
54
+
55
+ wp._src.context.runtime.verify_cuda_device(device)
56
+
57
+ wp.config.verify_cuda = verify_cuda_saved
58
+
59
+
60
+ @unittest.skipUnless(wp.is_cuda_available(), "Requires CUDA")
61
+ def test_devices_can_access_self(test, device):
62
+ test.assertTrue(device.can_access(device))
63
+
64
+ for warp_device in wp.get_devices():
65
+ device_str = str(warp_device)
66
+
67
+ if (device.is_cpu and warp_device.is_cuda) or (device.is_cuda and warp_device.is_cpu):
68
+ test.assertFalse(device.can_access(warp_device))
69
+ test.assertNotEqual(device, warp_device)
70
+ test.assertNotEqual(device, device_str)
71
+
72
+
73
+ def test_devices_sm_count(test, device):
74
+ if device.is_cuda:
75
+ test.assertTrue(device.sm_count > 0)
76
+ else:
77
+ test.assertEqual(device.sm_count, 0)
78
+
79
+
80
+ devices = get_test_devices()
81
+
82
+
83
+ class TestDevices(unittest.TestCase):
84
+ def test_devices_unmap_imaginary_device(self):
85
+ with self.assertRaises(RuntimeError):
86
+ wp.unmap_cuda_device("imaginary_device:0")
87
+
88
+ def test_devices_get_cuda_supported_archs(self):
89
+ if not wp.is_cuda_available():
90
+ self.assertEqual(wp.get_cuda_supported_archs(), [], "Should return empty list when CUDA is not available")
91
+ else:
92
+ archs = wp.get_cuda_supported_archs()
93
+ self.assertTrue(len(archs) > 0, "No CUDA supported architectures found")
94
+
95
+ # Check all elements are integers
96
+ for arch in archs:
97
+ self.assertIsInstance(arch, int, f"Architecture value {arch} should be an integer")
98
+
99
+ # Check the list is sorted
100
+ self.assertEqual(archs, sorted(archs), "Architecture list should be sorted")
101
+
102
+ # Check for no duplicates
103
+ self.assertEqual(len(archs), len(set(archs)), "Architecture list should not contain duplicates")
104
+
105
+ # Check values are reasonable (modern CUDA architectures are >= 50)
106
+ for arch in archs:
107
+ self.assertGreaterEqual(arch, 50, f"Architecture {arch} should be >= 50 (e.g., sm_50)")
108
+ self.assertLessEqual(arch, 150, f"Architecture {arch} seems unreasonably high")
109
+
110
+
111
+ add_function_test(
112
+ TestDevices,
113
+ "test_devices_get_cuda_device_functions",
114
+ test_devices_get_cuda_device_functions,
115
+ devices=get_selected_cuda_test_devices(),
116
+ )
117
+ add_function_test(
118
+ TestDevices, "test_devices_map_cuda_device", test_devices_map_cuda_device, devices=get_selected_cuda_test_devices()
119
+ )
120
+ add_function_test(TestDevices, "test_devices_verify_cuda_device", test_devices_verify_cuda_device, devices=devices)
121
+ add_function_test(TestDevices, "test_devices_can_access_self", test_devices_can_access_self, devices=devices)
122
+ add_function_test(TestDevices, "test_devices_sm_count", test_devices_sm_count, devices=devices)
123
+
124
+
125
+ if __name__ == "__main__":
126
+ wp.clear_kernel_cache()
127
+ unittest.main(verbosity=2)
@@ -0,0 +1,136 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import enum
17
+ import unittest
18
+
19
+ import warp as wp
20
+ from warp.tests.unittest_utils import *
21
+
22
+
23
+ class MyIntEnum(enum.IntEnum):
24
+ A = 1
25
+ B = 2
26
+ C = 3
27
+
28
+
29
+ class MyIntFlag(enum.IntFlag):
30
+ A = 1
31
+ B = enum.auto()
32
+ C = enum.auto()
33
+
34
+
35
+ def test_intenum_ints(test, device):
36
+ @wp.kernel
37
+ def expect_intenum_ints():
38
+ wp.expect_eq(MyIntEnum.A, 1)
39
+ wp.expect_eq(MyIntEnum.B, 2)
40
+ wp.expect_eq(MyIntEnum.C, 3)
41
+ wp.expect_eq(MyIntEnum.A + MyIntEnum.B, MyIntEnum.C)
42
+
43
+ wp.launch(expect_intenum_ints, dim=1, device=device)
44
+
45
+
46
+ def test_intflag_ints(test, device):
47
+ @wp.kernel
48
+ def expect_intflag_ints():
49
+ wp.expect_eq(MyIntFlag.A, 1)
50
+ wp.expect_eq(MyIntFlag.B, 2)
51
+ wp.expect_eq(MyIntFlag.C, 4)
52
+ wp.expect_eq(MyIntFlag.A | MyIntFlag.B, 3)
53
+ wp.expect_eq(MyIntFlag.A | MyIntFlag.B | MyIntFlag.C, 7)
54
+
55
+ wp.launch(expect_intflag_ints, dim=1, device=device)
56
+
57
+
58
+ def test_alternative_accessors(test, device):
59
+ @wp.kernel
60
+ def expect_alternative_accessors():
61
+ wp.expect_eq(int(MyIntEnum.A), 1)
62
+ wp.expect_eq(int(MyIntEnum.B.value), 2)
63
+ wp.expect_eq(MyIntEnum.C.value, 3)
64
+ wp.expect_eq(MyIntEnum.A + int(MyIntEnum.B) + 0, MyIntEnum.C)
65
+ wp.expect_eq(int(MyIntFlag.A), 1)
66
+ wp.expect_eq(int(MyIntFlag.B.value), 2)
67
+ wp.expect_eq(MyIntFlag.C.value, 4)
68
+ wp.expect_eq(MyIntFlag.A | int(MyIntFlag.B), 3)
69
+ wp.expect_eq(MyIntFlag.A | MyIntFlag.B.value | MyIntFlag.C, 7)
70
+
71
+ wp.launch(expect_alternative_accessors, dim=1, device=device)
72
+
73
+
74
+ def test_static_accessors(test, device):
75
+ @wp.kernel
76
+ def expect_static_accessors():
77
+ wp.expect_eq(wp.static(MyIntEnum.A), 1)
78
+ wp.expect_eq(wp.static(int(MyIntEnum.A)), 1)
79
+ wp.expect_eq(wp.static(MyIntEnum.A.value), 1)
80
+ wp.expect_eq(wp.static(MyIntFlag.A), 1)
81
+ wp.expect_eq(wp.static(int(MyIntFlag.A)), 1)
82
+ wp.expect_eq(wp.static(MyIntFlag.A.value), 1)
83
+
84
+ wp.launch(expect_static_accessors, dim=1, device=device)
85
+
86
+
87
+ def test_intflag_compare(test, device):
88
+ @wp.kernel
89
+ def compute_intflag_compare(ins: wp.array(dtype=wp.int32), outs: wp.array(dtype=wp.int32)):
90
+ tid = wp.tid()
91
+ if ins[tid] & MyIntFlag.A:
92
+ outs[tid] += MyIntFlag.A
93
+ if ins[tid] & MyIntFlag.B:
94
+ outs[tid] += MyIntFlag.B
95
+ if ins[tid] & MyIntFlag.C:
96
+ outs[tid] += MyIntFlag.C
97
+
98
+ with wp.ScopedDevice(device):
99
+ ins = wp.array(
100
+ [
101
+ 0,
102
+ MyIntFlag.A,
103
+ MyIntFlag.B,
104
+ MyIntFlag.C,
105
+ MyIntFlag.A | MyIntFlag.B,
106
+ MyIntFlag.A | MyIntFlag.B | MyIntFlag.C,
107
+ ],
108
+ dtype=wp.int32,
109
+ )
110
+ outs = wp.zeros(len(ins), dtype=wp.int32)
111
+ wp.launch(compute_intflag_compare, dim=len(ins), inputs=[ins], outputs=[outs])
112
+ outs = outs.numpy()
113
+ test.assertEqual(outs[0], 0)
114
+ test.assertEqual(outs[1], 1)
115
+ test.assertEqual(outs[2], 2)
116
+ test.assertEqual(outs[3], 4)
117
+ test.assertEqual(outs[4], 3)
118
+ test.assertEqual(outs[5], 7)
119
+
120
+
121
+ class TestEnum(unittest.TestCase):
122
+ pass
123
+
124
+
125
+ devices = get_test_devices()
126
+
127
+ add_function_test(TestEnum, "test_intenum_ints", test_intenum_ints, devices=devices)
128
+ add_function_test(TestEnum, "test_intflag_ints", test_intflag_ints, devices=devices)
129
+ add_function_test(TestEnum, "test_intflag_compare", test_intflag_compare, devices=devices)
130
+ add_function_test(TestEnum, "test_alternative_accessors", test_alternative_accessors, devices=devices)
131
+ add_function_test(TestEnum, "test_static_accessors", test_static_accessors, devices=devices)
132
+
133
+
134
+ if __name__ == "__main__":
135
+ wp.clear_kernel_cache()
136
+ unittest.main(verbosity=2)
@@ -0,0 +1,424 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ """Test Warp examples with unittest.
16
+
17
+ This module tests the Warp examples registered in it using the unittest
18
+ framework. When registering tests with add_example_test(), three optional
19
+ dictionaries can be provided: test_options, test_options_cuda, and
20
+ test_options_cpu. These are added to the command line arguments in-order, so
21
+ if a parameter is specified in both test_options and test_options_cuda, the
22
+ one in test_options_cuda will take precedence due to how argparse works.
23
+
24
+ Generally the test_options[_cpu,_cuda] dictionaries should be used to prevent
25
+ graphical windows from being open by the example {"headless": True} and to
26
+ override example defaults so the example can run in less than ten seconds.
27
+
28
+ To skip tests if the optional dependencies are not found, use the following keys:
29
+ - {"usd_required": True} (requires usd-core)
30
+ - {"torch_required": True} (requires torch)
31
+ - {"pillow_required": True} (requires pillow)
32
+
33
+ Use the "num_frames" and "train_iters" keys to control the number of steps.
34
+
35
+ Use "test_timeout" to override the default test timeout threshold of 600 seconds.
36
+ """
37
+
38
+ import os
39
+ import platform
40
+ import subprocess
41
+ import sys
42
+ import unittest
43
+ from typing import Any, Dict, Optional, Type
44
+
45
+ import warp as wp
46
+ import warp.tests.unittest_utils
47
+ from warp._src.utils import check_p2p
48
+ from warp.tests.unittest_utils import (
49
+ USD_AVAILABLE,
50
+ get_selected_cuda_test_devices,
51
+ get_test_devices,
52
+ sanitize_identifier,
53
+ )
54
+
55
+
56
+ def _build_command_line_options(test_options: Dict[str, Any]) -> list:
57
+ """Helper function to build command-line options from the test options dictionary."""
58
+ additional_options = []
59
+
60
+ for key, value in test_options.items():
61
+ if key == "headless" and value:
62
+ additional_options.extend(["--headless"])
63
+ else:
64
+ # Just add --key value
65
+ additional_options.extend(["--" + key, str(value)])
66
+
67
+ return additional_options
68
+
69
+
70
+ def _merge_options(base_options: Dict[str, Any], device_options: Dict[str, Any]) -> Dict[str, Any]:
71
+ """Helper function to merge base test options with device-specific test options."""
72
+ merged_options = base_options.copy()
73
+
74
+ # Update options with device-specific dictionary, overwriting existing keys with the more-specific values
75
+ merged_options.update(device_options)
76
+ return merged_options
77
+
78
+
79
+ def add_example_test(
80
+ cls: Type,
81
+ name: str,
82
+ devices: Optional[list] = None,
83
+ test_options: Optional[Dict[str, Any]] = None,
84
+ test_options_cpu: Optional[Dict[str, Any]] = None,
85
+ test_options_cuda: Optional[Dict[str, Any]] = None,
86
+ ):
87
+ """Registers a Warp example to run on ``devices`` as a TestCase."""
88
+
89
+ if test_options is None:
90
+ test_options = {}
91
+ if test_options_cpu is None:
92
+ test_options_cpu = {}
93
+ if test_options_cuda is None:
94
+ test_options_cuda = {}
95
+
96
+ def run(test, device):
97
+ if wp.get_device(device).is_cuda:
98
+ options = _merge_options(test_options, test_options_cuda)
99
+ else:
100
+ options = _merge_options(test_options, test_options_cpu)
101
+
102
+ # Mark the test as skipped if Torch is not installed but required
103
+ torch_required = options.pop("torch_required", False)
104
+ if torch_required:
105
+ try:
106
+ import torch
107
+
108
+ if wp.get_device(device).is_cuda and not torch.cuda.is_available():
109
+ # Ensure torch has CUDA support
110
+ test.skipTest("Torch not compiled with CUDA support")
111
+
112
+ except Exception as e:
113
+ test.skipTest(f"{e}")
114
+
115
+ # Mark the test as skipped if USD is not installed but required
116
+ usd_required = options.pop("usd_required", False)
117
+ if usd_required and not USD_AVAILABLE:
118
+ test.skipTest("Requires usd-core")
119
+
120
+ # Mark the test as skipped if pillow is not installed but required
121
+ pillow_required = options.pop("pillow_required", False)
122
+ if pillow_required:
123
+ try:
124
+ import PIL # noqa: F401
125
+ except ImportError:
126
+ test.skipTest("Requires pillow")
127
+
128
+ # Find the current Warp cache
129
+ warp_cache_path = wp.config.kernel_cache_dir
130
+
131
+ env_vars = os.environ.copy()
132
+ if warp_cache_path is not None:
133
+ env_vars["WARP_CACHE_PATH"] = warp_cache_path
134
+
135
+ if warp.tests.unittest_utils.coverage_enabled:
136
+ import tempfile
137
+
138
+ # Generate a random coverage data file name - file is deleted along with containing directory
139
+ with tempfile.NamedTemporaryFile(
140
+ dir=warp.tests.unittest_utils.coverage_temp_dir, delete=False
141
+ ) as coverage_file:
142
+ pass
143
+
144
+ command = ["coverage", "run", f"--data-file={coverage_file.name}"]
145
+
146
+ if warp.tests.unittest_utils.coverage_branch:
147
+ command.append("--branch")
148
+
149
+ else:
150
+ command = [sys.executable]
151
+
152
+ # Append Warp commands
153
+ command.extend(["-m", f"warp.examples.{name}", "--device", str(device)])
154
+
155
+ stage_path = (
156
+ options.pop(
157
+ "stage_path",
158
+ os.path.join(os.path.dirname(__file__), f"outputs/{name}_{sanitize_identifier(device)}.usd"),
159
+ )
160
+ if USD_AVAILABLE
161
+ else "None"
162
+ )
163
+
164
+ if stage_path:
165
+ command.extend(["--stage_path", stage_path])
166
+ try:
167
+ os.remove(stage_path)
168
+ except OSError:
169
+ pass
170
+
171
+ command.extend(_build_command_line_options(options))
172
+
173
+ # Set the test timeout in seconds
174
+ test_timeout = options.pop("test_timeout", 600)
175
+
176
+ # with wp.ScopedTimer(f"{name}_{sanitize_identifier(device)}"):
177
+ # Run the script as a subprocess
178
+ result = subprocess.run(
179
+ command, capture_output=True, text=True, env=env_vars, timeout=test_timeout, check=False
180
+ )
181
+
182
+ # Check the return code (0 is standard for success)
183
+ test.assertEqual(
184
+ result.returncode,
185
+ 0,
186
+ msg=f"Failed with return code {result.returncode}, command: {' '.join(command)}\n\nOutput:\n{result.stdout}\n{result.stderr}",
187
+ )
188
+
189
+ # If the test succeeded, try to clean up the output by default
190
+ if stage_path and result.returncode == 0:
191
+ try:
192
+ os.remove(stage_path)
193
+ except OSError:
194
+ pass
195
+
196
+ from warp.tests.unittest_utils import add_function_test
197
+
198
+ add_function_test(cls, f"test_{name}", run, devices=devices, check_output=False)
199
+
200
+
201
+ cuda_test_devices = get_selected_cuda_test_devices(mode="basic") # Don't test on multiple GPUs to save time
202
+ test_devices = get_test_devices(mode="basic")
203
+
204
+ # NOTE: To give the parallel test runner more opportunities to parallelize test cases,
205
+ # we break up the tests into multiple TestCase classes
206
+
207
+
208
+ class TestCoreExamples(unittest.TestCase):
209
+ pass
210
+
211
+
212
+ # Exclude unless we can run headless somehow
213
+ # add_example_test(TestCoreExamples, name="example_render_opengl")
214
+
215
+ add_example_test(TestCoreExamples, name="core.example_dem", devices=test_devices, test_options_cpu={"num_frames": 2})
216
+ add_example_test(
217
+ TestCoreExamples,
218
+ name="core.example_fluid",
219
+ devices=test_devices,
220
+ test_options={"num_frames": 100, "headless": True},
221
+ )
222
+ add_example_test(
223
+ TestCoreExamples,
224
+ name="core.example_graph_capture",
225
+ devices=test_devices,
226
+ test_options={"headless": True},
227
+ test_options_cpu={"num_frames": 100},
228
+ )
229
+ add_example_test(TestCoreExamples, name="core.example_marching_cubes", devices=cuda_test_devices)
230
+ add_example_test(TestCoreExamples, name="core.example_mesh", devices=test_devices, test_options={"usd_required": True})
231
+ add_example_test(
232
+ TestCoreExamples, name="core.example_mesh_intersect", devices=test_devices, test_options={"usd_required": True}
233
+ )
234
+ add_example_test(TestCoreExamples, name="core.example_nvdb", devices=test_devices)
235
+ add_example_test(
236
+ TestCoreExamples,
237
+ name="core.example_raycast",
238
+ devices=test_devices,
239
+ test_options={"usd_required": True, "headless": True},
240
+ )
241
+ if platform.system() == "Windows":
242
+ # Skip GPU testing because of obscure NVRTC bug with illegal memory access
243
+ add_example_test(
244
+ TestCoreExamples,
245
+ name="core.example_raymarch",
246
+ devices=[wp.get_device("cpu")],
247
+ test_options={"height": 512, "width": 1024, "headless": True},
248
+ )
249
+ else:
250
+ add_example_test(
251
+ TestCoreExamples,
252
+ name="core.example_raymarch",
253
+ devices=test_devices,
254
+ test_options={"height": 512, "width": 1024, "headless": True},
255
+ )
256
+ add_example_test(
257
+ TestCoreExamples,
258
+ name="core.example_sample_mesh",
259
+ devices=test_devices,
260
+ test_options_cpu={"num_frames": 1},
261
+ )
262
+ add_example_test(
263
+ TestCoreExamples,
264
+ name="core.example_sph",
265
+ devices=test_devices,
266
+ test_options_cpu={"num_frames": 1},
267
+ )
268
+ add_example_test(
269
+ TestCoreExamples,
270
+ name="core.example_torch",
271
+ devices=test_devices,
272
+ test_options={"headless": True, "num_frames": 1000, "torch_required": True},
273
+ )
274
+ add_example_test(TestCoreExamples, name="core.example_wave", devices=test_devices)
275
+
276
+
277
+ class TestOptimExamples(unittest.TestCase):
278
+ pass
279
+
280
+
281
+ add_example_test(
282
+ TestOptimExamples,
283
+ name="optim.example_diffray",
284
+ devices=test_devices,
285
+ test_options={"usd_required": True, "headless": True},
286
+ test_options_cpu={"train_iters": 2},
287
+ )
288
+ add_example_test(
289
+ TestOptimExamples,
290
+ name="optim.example_fluid_checkpoint",
291
+ devices=cuda_test_devices,
292
+ test_options={"headless": True, "train_iters": 5, "num_frames": 300, "pillow_required": True},
293
+ )
294
+
295
+
296
+ class TestFemExamples(unittest.TestCase):
297
+ pass
298
+
299
+
300
+ class TestFemDiffusionExamples(unittest.TestCase):
301
+ pass
302
+
303
+
304
+ # MGPU tests may fail on systems where P2P transfers are misconfigured
305
+ if check_p2p():
306
+ add_example_test(
307
+ TestFemDiffusionExamples,
308
+ name="fem.example_diffusion_mgpu",
309
+ devices=get_selected_cuda_test_devices(mode="basic"),
310
+ test_options={"headless": True},
311
+ )
312
+
313
+ add_example_test(
314
+ TestFemExamples,
315
+ name="fem.example_apic_fluid",
316
+ devices=get_selected_cuda_test_devices(mode="basic"),
317
+ test_options={"num_frames": 5, "voxel_size": 2.0},
318
+ )
319
+ add_example_test(
320
+ TestFemExamples,
321
+ name="fem.example_adaptive_grid",
322
+ devices=get_selected_cuda_test_devices(mode="basic"),
323
+ test_options={"headless": True, "div_conforming": True},
324
+ )
325
+
326
+ # The following examples do not need CUDA
327
+ add_example_test(
328
+ TestFemDiffusionExamples,
329
+ name="fem.example_diffusion",
330
+ devices=test_devices,
331
+ test_options={"resolution": 10, "mesh": "tri", "headless": True},
332
+ )
333
+ add_example_test(
334
+ TestFemDiffusionExamples, name="fem.example_diffusion_3d", devices=test_devices, test_options={"headless": True}
335
+ )
336
+ add_example_test(
337
+ TestFemExamples,
338
+ name="fem.example_deformed_geometry",
339
+ devices=test_devices,
340
+ test_options={"resolution": 10, "mesh": "tri", "headless": True},
341
+ )
342
+ add_example_test(
343
+ TestFemExamples,
344
+ name="fem.example_convection_diffusion",
345
+ devices=test_devices,
346
+ test_options={"resolution": 20, "headless": True},
347
+ )
348
+ add_example_test(
349
+ TestFemExamples,
350
+ name="fem.example_burgers",
351
+ devices=test_devices,
352
+ test_options={"resolution": 20, "num_frames": 25, "degree": 1, "headless": True},
353
+ )
354
+ add_example_test(
355
+ TestFemExamples,
356
+ name="fem.example_convection_diffusion_dg",
357
+ devices=test_devices,
358
+ test_options={"resolution": 20, "num_frames": 25, "headless": True},
359
+ )
360
+ add_example_test(
361
+ TestFemExamples,
362
+ name="fem.example_mixed_elasticity",
363
+ devices=test_devices,
364
+ test_options={"nonconforming_stresses": True, "mesh": "quad", "headless": True},
365
+ )
366
+ add_example_test(
367
+ TestFemExamples, name="fem.example_stokes_transfer", devices=test_devices, test_options={"headless": True}
368
+ )
369
+ add_example_test(
370
+ TestFemExamples,
371
+ name="fem.example_stokes",
372
+ devices=test_devices,
373
+ test_options={"resolution": 10, "nonconforming_pressures": True, "headless": True},
374
+ )
375
+ add_example_test(
376
+ TestFemExamples,
377
+ name="fem.example_navier_stokes",
378
+ devices=test_devices,
379
+ test_options={"num_frames": 101, "resolution": 10, "tri_mesh": True, "headless": True},
380
+ )
381
+ add_example_test(
382
+ TestFemExamples,
383
+ name="fem.example_streamlines",
384
+ devices=get_selected_cuda_test_devices(),
385
+ test_options={"headless": True},
386
+ )
387
+ add_example_test(
388
+ TestFemExamples,
389
+ name="fem.example_distortion_energy",
390
+ devices=get_selected_cuda_test_devices(),
391
+ test_options={"headless": True, "resolution": 16},
392
+ )
393
+ add_example_test(
394
+ TestFemExamples,
395
+ name="fem.example_magnetostatics",
396
+ devices=test_devices,
397
+ test_options={"headless": True, "resolution": 16},
398
+ )
399
+ add_example_test(
400
+ TestFemExamples,
401
+ name="fem.example_nonconforming_contact",
402
+ devices=test_devices,
403
+ test_options={"headless": True, "resolution": 16, "num_steps": 2},
404
+ )
405
+
406
+
407
+ class TestTileExamples(unittest.TestCase):
408
+ pass
409
+
410
+
411
+ add_example_test(
412
+ TestTileExamples,
413
+ name="tile.example_tile_mcgp",
414
+ devices=test_devices,
415
+ test_options={"height": 128, "headless": True, "usd_required": True},
416
+ test_options_cpu={"slices": 2},
417
+ test_options_cuda={"slices": 5},
418
+ )
419
+
420
+
421
+ if __name__ == "__main__":
422
+ # force rebuild of all kernels
423
+ wp.clear_kernel_cache()
424
+ unittest.main(verbosity=2)