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,294 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2022 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 numpy as np
19
+
20
+ import warp as wp
21
+ from warp.tests.unittest_utils import *
22
+
23
+
24
+ @wp.kernel
25
+ def make_field_sphere_sdf(field: wp.array3d(dtype=float), center: wp.vec3, radius: float):
26
+ """Make a sphere SDF for nodes on the integer domain with node coordinates 0,1,2,3,..."""
27
+
28
+ i, j, k = wp.tid()
29
+
30
+ p = wp.vec3(float(i), float(j), float(k))
31
+
32
+ d = wp.length(p - center) - radius
33
+
34
+ field[i, j, k] = d
35
+
36
+
37
+ @wp.kernel
38
+ def make_field_sphere_sdf_unit_domain(
39
+ field: wp.array3d(dtype=float), center: wp.vec3, radius: wp.array(dtype=wp.float32)
40
+ ):
41
+ """Makes a sphere SDF for nodes on the unit domain [-1, 1]^3."""
42
+ i, j, k = wp.tid()
43
+
44
+ nx, ny, nz = field.shape[0], field.shape[1], field.shape[2]
45
+
46
+ p = wp.vec3(
47
+ 2.0 * wp.float32(i) / (wp.float32(nx) - 1.0) - 1.0,
48
+ 2.0 * wp.float32(j) / (wp.float32(ny) - 1.0) - 1.0,
49
+ 2.0 * wp.float32(k) / (wp.float32(nz) - 1.0) - 1.0,
50
+ )
51
+
52
+ d = wp.length(p - center) - radius[0]
53
+
54
+ field[i, j, k] = d
55
+
56
+
57
+ @wp.kernel
58
+ def compute_surface_area(
59
+ verts: wp.array(dtype=wp.vec3), faces: wp.array(dtype=wp.int32), out_area: wp.array(dtype=wp.float32)
60
+ ):
61
+ tid = wp.tid()
62
+ vi = faces[3 * tid + 0]
63
+ vj = faces[3 * tid + 1]
64
+ vk = faces[3 * tid + 2]
65
+
66
+ p0 = verts[vi]
67
+ p1 = verts[vj]
68
+ p2 = verts[vk]
69
+
70
+ # Heron's formula for triangle area
71
+ a = wp.length(p1 - p0)
72
+ b = wp.length(p2 - p0)
73
+ c = wp.length(p2 - p1)
74
+ s = (a + b + c) / 2.0
75
+ area = wp.sqrt(s * (s - a) * (s - b) * (s - c))
76
+
77
+ wp.atomic_add(out_area, 0, area)
78
+
79
+
80
+ def validate_marching_cubes_output(test, verts_np, faces_np, check_nonempty=True):
81
+ # check that the face array seems valid
82
+ if check_nonempty:
83
+ test.assertGreater(faces_np.shape[0], 0) # at least one face
84
+ test.assertEqual(faces_np.shape[1], 3) # all faces triangular
85
+ test.assertTrue((faces_np >= 0).all()) # all face inds nonnegative
86
+ test.assertTrue((faces_np < verts_np.shape[0]).all()) # all face inds are in-bounds on the vertex array
87
+ test.assertTrue((faces_np[:, 0] != faces_np[:, 1]).all()) # all faces have unique vertices
88
+ test.assertTrue((faces_np[:, 0] != faces_np[:, 2]).all()) # all faces have unique vertices
89
+ test.assertTrue((faces_np[:, 1] != faces_np[:, 2]).all()) # all faces have unique vertices
90
+ test.assertTrue(
91
+ (np.unique(faces_np.flatten()) == np.arange(verts_np.shape[0])).all()
92
+ ) # all vertices are used in at least one face
93
+
94
+ # check that the vertex array seems valid
95
+ if check_nonempty:
96
+ test.assertGreater(verts_np.shape[0], 0) # at least one vertex
97
+ test.assertEqual(verts_np.shape[1], 3) # all vertices are 3D
98
+ test.assertTrue(np.isfinite(verts_np).all()) # all vertices are finite
99
+
100
+
101
+ def test_marching_cubes(test, device):
102
+ """Basic test of typical usage."""
103
+ node_dim = 64
104
+ cell_dim = node_dim - 1
105
+ field = wp.zeros(shape=(node_dim, node_dim, node_dim), dtype=float, device=device)
106
+ bounds_low = (0.0, 0.0, 0.0)
107
+ bounds_high = (float(cell_dim), float(cell_dim), float(cell_dim))
108
+
109
+ iso = wp.MarchingCubes(
110
+ nx=node_dim,
111
+ ny=node_dim,
112
+ nz=node_dim,
113
+ device=device,
114
+ domain_bounds_lower_corner=bounds_low,
115
+ domain_bounds_upper_corner=bounds_high,
116
+ )
117
+
118
+ radius = node_dim / 4.0
119
+
120
+ wp.launch(
121
+ make_field_sphere_sdf,
122
+ dim=field.shape,
123
+ inputs=[field, wp.vec3(node_dim / 2, node_dim / 2, node_dim / 2), radius],
124
+ device=device,
125
+ )
126
+
127
+ iso.surface(field=field, threshold=0.0)
128
+ verts_np = iso.verts.numpy()
129
+ faces_np = iso.indices.numpy().reshape(-1, 3)
130
+ test.assertEqual(
131
+ iso.indices.dtype, wp.int32
132
+ ) # make sure we are following Warp convention of using a flat array of indices
133
+ validate_marching_cubes_output(test, verts_np, faces_np)
134
+
135
+ # check that all returned vertices lie on the surface of the sphere
136
+ length = np.linalg.norm(verts_np - np.array([node_dim / 2, node_dim / 2, node_dim / 2]), axis=1)
137
+ error = np.abs(length - radius)
138
+ test.assertTrue(np.max(error) < 1.0)
139
+
140
+ iso.resize(nx=node_dim * 2, ny=node_dim * 2, nz=node_dim * 2) # smoke test for deprecated function
141
+
142
+
143
+ def test_marching_cubes_functional(test, device):
144
+ """Ensure the single-function interface works as expected."""
145
+ node_dim = 64
146
+ cell_dim = node_dim - 1
147
+ field = wp.zeros(shape=(node_dim, node_dim, node_dim), dtype=float, device=device)
148
+ bounds_low = (0.0, 0.0, 0.0)
149
+ bounds_high = (float(cell_dim), float(cell_dim), float(cell_dim))
150
+
151
+ radius = node_dim / 4.0
152
+ wp.launch(
153
+ make_field_sphere_sdf,
154
+ dim=field.shape,
155
+ inputs=[field, wp.vec3(node_dim / 2, node_dim / 2, node_dim / 2), radius],
156
+ device=device,
157
+ )
158
+
159
+ # call via the functional interface
160
+ verts, faces = wp.MarchingCubes.extract_surface_marching_cubes(
161
+ field, threshold=0.0, domain_bounds_lower_corner=bounds_low, domain_bounds_upper_corner=bounds_high
162
+ )
163
+
164
+ verts_np = verts.numpy()
165
+ faces_np = faces.numpy().reshape(-1, 3)
166
+ validate_marching_cubes_output(test, verts_np, faces_np)
167
+
168
+ # check that all returned vertices lie on the surface of the sphere
169
+ length = np.linalg.norm(verts_np - np.array([node_dim / 2, node_dim / 2, node_dim / 2]), axis=1)
170
+ error = np.abs(length - radius)
171
+ test.assertTrue(np.max(error) < 1.0)
172
+
173
+
174
+ def test_marching_cubes_nonuniform(test, device):
175
+ """Test the logic for when the dimensions of the grid are not uniform."""
176
+
177
+ dimX = 64
178
+ dimY = 48
179
+ dimZ = 72
180
+ field = wp.zeros(shape=(dimX, dimY, dimZ), dtype=float, device=device)
181
+
182
+ bounds_low = wp.vec3(0.0, 0.0, 0.0)
183
+ bounds_high = wp.vec3(float(dimX), float(dimY), float(dimZ))
184
+
185
+ iso = wp.MarchingCubes(
186
+ nx=dimX,
187
+ ny=dimY,
188
+ nz=dimZ,
189
+ device=device,
190
+ domain_bounds_lower_corner=bounds_low,
191
+ domain_bounds_upper_corner=bounds_high,
192
+ )
193
+
194
+ radius = dimX / 4.0
195
+ wp.launch(
196
+ make_field_sphere_sdf,
197
+ dim=field.shape,
198
+ inputs=[field, wp.vec3(dimX / 2, dimY / 2, dimZ / 2), radius],
199
+ device=device,
200
+ )
201
+
202
+ iso.surface(field=field, threshold=0.0)
203
+ verts_np = iso.verts.numpy()
204
+ faces_np = iso.indices.numpy().reshape(-1, 3)
205
+ validate_marching_cubes_output(test, verts_np, faces_np)
206
+
207
+
208
+ def test_marching_cubes_empty_output(test, device):
209
+ """Make sure we handle the empty-output case correctly."""
210
+
211
+ dim = 64
212
+ field = wp.zeros(shape=(dim, dim, dim), dtype=float, device=device)
213
+
214
+ iso = wp.MarchingCubes(nx=dim, ny=dim, nz=dim, device=device)
215
+
216
+ wp.launch(make_field_sphere_sdf, dim=field.shape, inputs=[field, wp.vec3(0.5, 0.5, 0.5), 0.25], device=device)
217
+
218
+ iso.surface(field=field, threshold=1000.0) # set threshold to a large value so that no vertices are generated
219
+ verts_np = iso.verts.numpy()
220
+ faces_np = iso.indices.numpy().reshape(-1, 3)
221
+ validate_marching_cubes_output(test, verts_np, faces_np, check_nonempty=False)
222
+
223
+ test.assertEqual(faces_np.shape[0], 0) # no faces
224
+ test.assertEqual(verts_np.shape[0], 0) # no vertices
225
+
226
+
227
+ def test_marching_cubes_differentiable(test, device):
228
+ """Check that marching cubes has reasonable gradients.
229
+
230
+ This test constructs an SDF of sphere, extracts a surface, computes its
231
+ surface area, and then differentiates the surface area with respect to
232
+ the sphere's radius.
233
+ """
234
+ node_dim = 64
235
+ bounds_low = wp.vec3(-1.0, -1.0, -1.0)
236
+ bounds_high = wp.vec3(1.0, 1.0, 1.0)
237
+
238
+ radius = 0.5
239
+ radius_wp = wp.full((1,), value=0.5, dtype=wp.float32, device=device, requires_grad=True)
240
+
241
+ with wp.Tape() as tape:
242
+ field = wp.zeros(shape=(node_dim, node_dim, node_dim), dtype=float, device=device, requires_grad=True)
243
+ wp.launch(
244
+ make_field_sphere_sdf_unit_domain,
245
+ dim=field.shape,
246
+ inputs=[field, wp.vec3(0.0, 0.0, 0.0), radius_wp],
247
+ device=device,
248
+ )
249
+
250
+ # call via the functional interface
251
+ verts, faces = wp.MarchingCubes.extract_surface_marching_cubes(
252
+ field, threshold=0.0, domain_bounds_lower_corner=bounds_low, domain_bounds_upper_corner=bounds_high
253
+ )
254
+
255
+ # compute surface area
256
+ area = wp.zeros(shape=(1,), dtype=float, device=device, requires_grad=True)
257
+ wp.launch(compute_surface_area, dim=faces.shape[0] // 3, inputs=[verts, faces, area], device=device)
258
+
259
+ # confirm surface area is correct vs. the analytical ground truth
260
+ area_np = area.numpy()[0]
261
+ test.assertTrue(np.abs(area_np - 4.0 * np.pi * radius * radius) < 1e-2)
262
+
263
+ # compute the gradient of the surface area with respect to the radius
264
+ tape.backward(area)
265
+
266
+ # confirm the gradient is correct vs. the analytical ground truth
267
+ grad_np = radius_wp.grad.numpy()[0]
268
+ test.assertTrue(np.abs(grad_np - 8.0 * np.pi * radius) < 1e-2)
269
+
270
+
271
+ devices = get_test_devices()
272
+
273
+
274
+ class TestMarchingCubes(unittest.TestCase):
275
+ def test_marching_cubes_new_del(self):
276
+ # test the scenario in which a MarchingCubes instance is created but not initialized before gc
277
+ instance = wp.MarchingCubes.__new__(wp.MarchingCubes)
278
+ instance.__del__()
279
+
280
+
281
+ add_function_test(TestMarchingCubes, "test_marching_cubes", test_marching_cubes, devices=devices)
282
+ add_function_test(TestMarchingCubes, "test_marching_cubes_functional", test_marching_cubes_functional, devices=devices)
283
+ add_function_test(TestMarchingCubes, "test_marching_cubes_nonuniform", test_marching_cubes_nonuniform, devices=devices)
284
+ add_function_test(
285
+ TestMarchingCubes, "test_marching_cubes_empty_output", test_marching_cubes_empty_output, devices=devices
286
+ )
287
+ add_function_test(
288
+ TestMarchingCubes, "test_marching_cubes_differentiable", test_marching_cubes_differentiable, devices=devices
289
+ )
290
+
291
+
292
+ if __name__ == "__main__":
293
+ wp.clear_kernel_cache()
294
+ unittest.main(verbosity=2)
@@ -0,0 +1,318 @@
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
+ import itertools
16
+ import unittest
17
+
18
+ import numpy as np
19
+
20
+ import warp as wp
21
+ from warp.tests.unittest_utils import *
22
+
23
+ # fmt: off
24
+
25
+ POINT_POSITIONS = (
26
+ ( 0.5, -0.5, 0.5),
27
+ (-0.5, -0.5, 0.5),
28
+ ( 0.5, 0.5, 0.5),
29
+ (-0.5, 0.5, 0.5),
30
+ (-0.5, -0.5, -0.5),
31
+ ( 0.5, -0.5, -0.5),
32
+ (-0.5, 0.5, -0.5),
33
+ ( 0.5, 0.5, -0.5),
34
+ )
35
+
36
+ # Right-hand winding order. This corresponds to USD's (and others).
37
+ RIGHT_HANDED_FACE_VERTEX_INDICES = (
38
+ 0, 3, 1,
39
+ 0, 2, 3,
40
+ 4, 7, 5,
41
+ 4, 6, 7,
42
+ 6, 2, 7,
43
+ 6, 3, 2,
44
+ 5, 1, 4,
45
+ 5, 0, 1,
46
+ 5, 2, 0,
47
+ 5, 7, 2,
48
+ 1, 6, 4,
49
+ 1, 3, 6,
50
+ )
51
+
52
+
53
+ # Left-hand winding order. This corresponds to Houdini's (and others).
54
+ LEFT_HANDED_FACE_VERTEX_INDICES = (
55
+ 0, 1, 3,
56
+ 0, 3, 2,
57
+ 4, 5, 7,
58
+ 4, 7, 6,
59
+ 6, 7, 2,
60
+ 6, 2, 3,
61
+ 5, 4, 1,
62
+ 5, 1, 0,
63
+ 5, 0, 2,
64
+ 5, 2, 7,
65
+ 1, 4, 6,
66
+ 1, 6, 3,
67
+ )
68
+
69
+ # fmt: on
70
+
71
+ POINT_COUNT = 8
72
+ VERTEX_COUNT = 36
73
+ FACE_COUNT = 12
74
+
75
+
76
+ @wp.kernel(enable_backward=False)
77
+ def read_points_kernel(
78
+ mesh_id: wp.uint64,
79
+ out_points: wp.array(dtype=wp.vec3),
80
+ ):
81
+ tid = wp.tid()
82
+ mesh = wp.mesh_get(mesh_id)
83
+ out_points[tid] = mesh.points[tid]
84
+
85
+
86
+ @wp.kernel(enable_backward=False)
87
+ def read_indices_kernel(
88
+ mesh_id: wp.uint64,
89
+ out_indices: wp.array(dtype=int),
90
+ ):
91
+ tid = wp.tid()
92
+ mesh = wp.mesh_get(mesh_id)
93
+ out_indices[tid * 3 + 0] = mesh.indices[tid * 3 + 0]
94
+ out_indices[tid * 3 + 1] = mesh.indices[tid * 3 + 1]
95
+ out_indices[tid * 3 + 2] = mesh.indices[tid * 3 + 2]
96
+
97
+
98
+ def test_mesh_read_properties(test, device):
99
+ if device.is_cpu:
100
+ constructors = ["sah", "median"]
101
+ else:
102
+ constructors = ["sah", "median", "lbvh"]
103
+
104
+ for constructor in constructors:
105
+ points = wp.array(POINT_POSITIONS, dtype=wp.vec3, device=device)
106
+ indices = wp.array(RIGHT_HANDED_FACE_VERTEX_INDICES, dtype=int, device=device)
107
+ mesh = wp.Mesh(points=points, indices=indices, bvh_constructor=constructor)
108
+
109
+ assert mesh.points.size == POINT_COUNT
110
+ assert mesh.indices.size == VERTEX_COUNT
111
+ assert int(mesh.indices.size / 3) == FACE_COUNT
112
+
113
+ out_points = wp.empty(POINT_COUNT, dtype=wp.vec3, device=device)
114
+ wp.launch(read_points_kernel, dim=POINT_COUNT, inputs=[mesh.id], outputs=[out_points], device=device)
115
+ assert_np_equal(out_points.numpy(), np.array(POINT_POSITIONS))
116
+
117
+ out_indices = wp.empty(VERTEX_COUNT, dtype=int, device=device)
118
+ wp.launch(read_indices_kernel, dim=FACE_COUNT, inputs=[mesh.id], outputs=[out_indices], device=device)
119
+ assert_np_equal(out_indices.numpy(), np.array(RIGHT_HANDED_FACE_VERTEX_INDICES))
120
+
121
+
122
+ @wp.kernel(enable_backward=False)
123
+ def query_point_kernel(
124
+ mesh_id: wp.uint64,
125
+ expected_sign: float,
126
+ ):
127
+ point = wp.vec3(0.1, 0.2, 0.3)
128
+ expected_pos = wp.vec3(0.1, 0.2, 0.5)
129
+
130
+ sign = float(0.0)
131
+ face = int(0)
132
+ bary_u = float(0.0)
133
+ bary_v = float(0.0)
134
+
135
+ wp.mesh_query_point(mesh_id, point, 1e6, sign, face, bary_u, bary_v)
136
+ pos = wp.mesh_eval_position(mesh_id, face, bary_u, bary_v)
137
+
138
+ wp.expect_eq(wp.sign(sign), expected_sign)
139
+ wp.expect_eq(face, 1)
140
+ wp.expect_near(wp.length(pos - expected_pos), 0.0)
141
+
142
+
143
+ def test_mesh_query_point(test, device):
144
+ if device.is_cpu:
145
+ constructors = ["sah", "median"]
146
+ else:
147
+ constructors = ["sah", "median", "lbvh"]
148
+
149
+ for constructor in constructors:
150
+ points = wp.array(POINT_POSITIONS, dtype=wp.vec3, device=device)
151
+
152
+ indices = wp.array(RIGHT_HANDED_FACE_VERTEX_INDICES, dtype=int, device=device)
153
+ mesh = wp.Mesh(points=points, indices=indices, bvh_constructor=constructor)
154
+ expected_sign = -1.0
155
+ wp.launch(query_point_kernel, dim=1, inputs=[mesh.id, expected_sign], device=device)
156
+
157
+ indices = wp.array(LEFT_HANDED_FACE_VERTEX_INDICES, dtype=int, device=device)
158
+ mesh = wp.Mesh(points=points, indices=indices)
159
+ expected_sign = 1.0
160
+ wp.launch(query_point_kernel, dim=1, inputs=[mesh.id, expected_sign], device=device)
161
+
162
+
163
+ @wp.kernel(enable_backward=False)
164
+ def query_ray_kernel(
165
+ mesh_id: wp.uint64,
166
+ expected_sign: float,
167
+ ):
168
+ start = wp.vec3(0.1, 0.2, 0.3)
169
+ dir = wp.normalize(wp.vec3(-1.2, 2.3, -3.4))
170
+ expected_t = 0.557828
171
+ expected_pos = wp.vec3(-0.0565217, 0.5, -0.143478)
172
+
173
+ t = float(0.0)
174
+ bary_u = float(0.0)
175
+ bary_v = float(0.0)
176
+ sign = float(0.0)
177
+ normal = wp.vec3(0.0, 0.0, 0.0)
178
+ face = int(0)
179
+
180
+ wp.mesh_query_ray(
181
+ mesh_id,
182
+ start,
183
+ dir,
184
+ 1e6,
185
+ t,
186
+ bary_u,
187
+ bary_v,
188
+ sign,
189
+ normal,
190
+ face,
191
+ )
192
+ pos = wp.mesh_eval_position(mesh_id, face, bary_u, bary_v)
193
+
194
+ wp.expect_near(t, expected_t)
195
+ wp.expect_near(t, wp.length(pos - start), 1e-6)
196
+ wp.expect_eq(wp.sign(sign), expected_sign)
197
+ wp.expect_eq(face, 4)
198
+ wp.expect_near(wp.length(pos - expected_pos), 0.0, 1e-6)
199
+
200
+
201
+ def test_mesh_query_ray(test, device):
202
+ if device.is_cpu:
203
+ constructors = ["sah", "median"]
204
+ else:
205
+ constructors = ["sah", "median", "lbvh"]
206
+
207
+ leaf_sizes = [1, 2, 4]
208
+
209
+ for leaf_size, constructor in itertools.product(leaf_sizes, constructors):
210
+ points = wp.array(POINT_POSITIONS, dtype=wp.vec3, device=device)
211
+
212
+ indices = wp.array(RIGHT_HANDED_FACE_VERTEX_INDICES, dtype=int, device=device)
213
+ mesh = wp.Mesh(points=points, indices=indices, bvh_constructor=constructor, bvh_leaf_size=leaf_size)
214
+ expected_sign = -1.0
215
+ wp.launch(
216
+ query_ray_kernel,
217
+ dim=1,
218
+ inputs=[
219
+ mesh.id,
220
+ expected_sign,
221
+ ],
222
+ device=device,
223
+ )
224
+
225
+ indices = wp.array(LEFT_HANDED_FACE_VERTEX_INDICES, dtype=int, device=device)
226
+ mesh = wp.Mesh(points=points, indices=indices)
227
+ expected_sign = 1.0
228
+ wp.launch(
229
+ query_ray_kernel,
230
+ dim=1,
231
+ inputs=[
232
+ mesh.id,
233
+ expected_sign,
234
+ ],
235
+ device=device,
236
+ )
237
+
238
+
239
+ def test_mesh_refit_graph(test, device):
240
+ if device.is_cpu:
241
+ constructors = ["sah", "median"]
242
+ else:
243
+ constructors = ["sah", "median", "lbvh"]
244
+
245
+ for constructor in constructors:
246
+ points = wp.array(POINT_POSITIONS, dtype=wp.vec3, device=device)
247
+
248
+ indices = wp.array(RIGHT_HANDED_FACE_VERTEX_INDICES, dtype=int, device=device)
249
+ mesh = wp.Mesh(points=points, indices=indices, bvh_constructor=constructor)
250
+
251
+ wp.capture_begin(device, force_module_load=False)
252
+ try:
253
+ mesh.refit()
254
+ finally:
255
+ graph = wp.capture_end(device)
256
+
257
+ # replay
258
+ num_iters = 10
259
+ for _ in range(num_iters):
260
+ wp.capture_launch(graph)
261
+
262
+ wp.synchronize_device(device)
263
+
264
+
265
+ def test_mesh_exceptions(test, device):
266
+ # points and indices must be on same device
267
+ with test.assertRaises(RuntimeError):
268
+ points = wp.array(POINT_POSITIONS, dtype=wp.vec3, device="cpu")
269
+ indices = wp.array(RIGHT_HANDED_FACE_VERTEX_INDICES, dtype=int, device=device)
270
+ wp.Mesh(points=points, indices=indices)
271
+
272
+ # points must be vec3
273
+ with test.assertRaises(RuntimeError):
274
+ points = wp.array(POINT_POSITIONS, dtype=wp.vec3d, device=device)
275
+ indices = wp.array(RIGHT_HANDED_FACE_VERTEX_INDICES, dtype=int, device=device)
276
+ wp.Mesh(points=points, indices=indices)
277
+
278
+ # velocities must be vec3
279
+ with test.assertRaises(RuntimeError):
280
+ points = wp.array(POINT_POSITIONS, dtype=wp.vec3, device=device)
281
+ velocities = wp.zeros(points.shape, dtype=wp.vec3d, device=device)
282
+ indices = wp.array(RIGHT_HANDED_FACE_VERTEX_INDICES, dtype=int, device=device)
283
+ wp.Mesh(points=points, indices=indices, velocities=velocities)
284
+
285
+ # indices must be int32
286
+ with test.assertRaises(RuntimeError):
287
+ points = wp.array(POINT_POSITIONS, dtype=wp.vec3, device=device)
288
+ indices = wp.array(RIGHT_HANDED_FACE_VERTEX_INDICES, dtype=wp.int64, device=device)
289
+ wp.Mesh(points=points, indices=indices)
290
+
291
+ # indices must be 1d
292
+ with test.assertRaises(RuntimeError):
293
+ points = wp.array(POINT_POSITIONS, dtype=wp.vec3, device=device)
294
+ indices = wp.array(RIGHT_HANDED_FACE_VERTEX_INDICES, dtype=int, device=device)
295
+ indices = indices.reshape((3, -1))
296
+ wp.Mesh(points=points, indices=indices)
297
+
298
+
299
+ devices = get_test_devices()
300
+
301
+
302
+ class TestMesh(unittest.TestCase):
303
+ def test_mesh_new_del(self):
304
+ # test the scenario in which a mesh is created but not initialized before gc
305
+ instance = wp.Mesh.__new__(wp.Mesh)
306
+ instance.__del__()
307
+
308
+
309
+ add_function_test(TestMesh, "test_mesh_read_properties", test_mesh_read_properties, devices=devices)
310
+ add_function_test(TestMesh, "test_mesh_query_point", test_mesh_query_point, devices=devices)
311
+ add_function_test(TestMesh, "test_mesh_query_ray", test_mesh_query_ray, devices=devices)
312
+ add_function_test(TestMesh, "test_mesh_refit_graph", test_mesh_refit_graph, devices=get_selected_cuda_test_devices())
313
+ add_function_test(TestMesh, "test_mesh_exceptions", test_mesh_exceptions, devices=get_selected_cuda_test_devices())
314
+
315
+
316
+ if __name__ == "__main__":
317
+ wp.clear_kernel_cache()
318
+ unittest.main(verbosity=2)