warp-lang 1.7.0__py3-none-manylinux_2_34_aarch64.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 (429) hide show
  1. warp/__init__.py +139 -0
  2. warp/__init__.pyi +1 -0
  3. warp/autograd.py +1142 -0
  4. warp/bin/warp-clang.so +0 -0
  5. warp/bin/warp.so +0 -0
  6. warp/build.py +557 -0
  7. warp/build_dll.py +405 -0
  8. warp/builtins.py +6855 -0
  9. warp/codegen.py +3969 -0
  10. warp/config.py +158 -0
  11. warp/constants.py +57 -0
  12. warp/context.py +6812 -0
  13. warp/dlpack.py +462 -0
  14. warp/examples/__init__.py +24 -0
  15. warp/examples/assets/bear.usd +0 -0
  16. warp/examples/assets/bunny.usd +0 -0
  17. warp/examples/assets/cartpole.urdf +110 -0
  18. warp/examples/assets/crazyflie.usd +0 -0
  19. warp/examples/assets/cube.usd +0 -0
  20. warp/examples/assets/nonuniform.usd +0 -0
  21. warp/examples/assets/nv_ant.xml +92 -0
  22. warp/examples/assets/nv_humanoid.xml +183 -0
  23. warp/examples/assets/nvidia_logo.png +0 -0
  24. warp/examples/assets/pixel.jpg +0 -0
  25. warp/examples/assets/quadruped.urdf +268 -0
  26. warp/examples/assets/rocks.nvdb +0 -0
  27. warp/examples/assets/rocks.usd +0 -0
  28. warp/examples/assets/sphere.usd +0 -0
  29. warp/examples/assets/square_cloth.usd +0 -0
  30. warp/examples/benchmarks/benchmark_api.py +389 -0
  31. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  32. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  33. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  34. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  35. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  36. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  37. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  38. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  39. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  40. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  41. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  42. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  43. warp/examples/benchmarks/benchmark_launches.py +301 -0
  44. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  45. warp/examples/browse.py +37 -0
  46. warp/examples/core/example_cupy.py +86 -0
  47. warp/examples/core/example_dem.py +241 -0
  48. warp/examples/core/example_fluid.py +299 -0
  49. warp/examples/core/example_graph_capture.py +150 -0
  50. warp/examples/core/example_marching_cubes.py +194 -0
  51. warp/examples/core/example_mesh.py +180 -0
  52. warp/examples/core/example_mesh_intersect.py +211 -0
  53. warp/examples/core/example_nvdb.py +182 -0
  54. warp/examples/core/example_raycast.py +111 -0
  55. warp/examples/core/example_raymarch.py +205 -0
  56. warp/examples/core/example_render_opengl.py +193 -0
  57. warp/examples/core/example_sample_mesh.py +300 -0
  58. warp/examples/core/example_sph.py +411 -0
  59. warp/examples/core/example_torch.py +211 -0
  60. warp/examples/core/example_wave.py +269 -0
  61. warp/examples/fem/example_adaptive_grid.py +286 -0
  62. warp/examples/fem/example_apic_fluid.py +423 -0
  63. warp/examples/fem/example_burgers.py +261 -0
  64. warp/examples/fem/example_convection_diffusion.py +178 -0
  65. warp/examples/fem/example_convection_diffusion_dg.py +204 -0
  66. warp/examples/fem/example_deformed_geometry.py +172 -0
  67. warp/examples/fem/example_diffusion.py +196 -0
  68. warp/examples/fem/example_diffusion_3d.py +225 -0
  69. warp/examples/fem/example_diffusion_mgpu.py +220 -0
  70. warp/examples/fem/example_distortion_energy.py +228 -0
  71. warp/examples/fem/example_magnetostatics.py +240 -0
  72. warp/examples/fem/example_mixed_elasticity.py +291 -0
  73. warp/examples/fem/example_navier_stokes.py +261 -0
  74. warp/examples/fem/example_nonconforming_contact.py +298 -0
  75. warp/examples/fem/example_stokes.py +213 -0
  76. warp/examples/fem/example_stokes_transfer.py +262 -0
  77. warp/examples/fem/example_streamlines.py +352 -0
  78. warp/examples/fem/utils.py +1000 -0
  79. warp/examples/interop/example_jax_callable.py +116 -0
  80. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  81. warp/examples/interop/example_jax_kernel.py +205 -0
  82. warp/examples/optim/example_bounce.py +266 -0
  83. warp/examples/optim/example_cloth_throw.py +228 -0
  84. warp/examples/optim/example_diffray.py +561 -0
  85. warp/examples/optim/example_drone.py +870 -0
  86. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  87. warp/examples/optim/example_inverse_kinematics.py +182 -0
  88. warp/examples/optim/example_inverse_kinematics_torch.py +191 -0
  89. warp/examples/optim/example_softbody_properties.py +400 -0
  90. warp/examples/optim/example_spring_cage.py +245 -0
  91. warp/examples/optim/example_trajectory.py +227 -0
  92. warp/examples/sim/example_cartpole.py +143 -0
  93. warp/examples/sim/example_cloth.py +225 -0
  94. warp/examples/sim/example_cloth_self_contact.py +322 -0
  95. warp/examples/sim/example_granular.py +130 -0
  96. warp/examples/sim/example_granular_collision_sdf.py +202 -0
  97. warp/examples/sim/example_jacobian_ik.py +244 -0
  98. warp/examples/sim/example_particle_chain.py +124 -0
  99. warp/examples/sim/example_quadruped.py +203 -0
  100. warp/examples/sim/example_rigid_chain.py +203 -0
  101. warp/examples/sim/example_rigid_contact.py +195 -0
  102. warp/examples/sim/example_rigid_force.py +133 -0
  103. warp/examples/sim/example_rigid_gyroscopic.py +115 -0
  104. warp/examples/sim/example_rigid_soft_contact.py +140 -0
  105. warp/examples/sim/example_soft_body.py +196 -0
  106. warp/examples/tile/example_tile_cholesky.py +87 -0
  107. warp/examples/tile/example_tile_convolution.py +66 -0
  108. warp/examples/tile/example_tile_fft.py +55 -0
  109. warp/examples/tile/example_tile_filtering.py +113 -0
  110. warp/examples/tile/example_tile_matmul.py +85 -0
  111. warp/examples/tile/example_tile_mlp.py +383 -0
  112. warp/examples/tile/example_tile_nbody.py +199 -0
  113. warp/examples/tile/example_tile_walker.py +327 -0
  114. warp/fabric.py +355 -0
  115. warp/fem/__init__.py +106 -0
  116. warp/fem/adaptivity.py +508 -0
  117. warp/fem/cache.py +572 -0
  118. warp/fem/dirichlet.py +202 -0
  119. warp/fem/domain.py +411 -0
  120. warp/fem/field/__init__.py +125 -0
  121. warp/fem/field/field.py +619 -0
  122. warp/fem/field/nodal_field.py +326 -0
  123. warp/fem/field/restriction.py +37 -0
  124. warp/fem/field/virtual.py +848 -0
  125. warp/fem/geometry/__init__.py +32 -0
  126. warp/fem/geometry/adaptive_nanogrid.py +857 -0
  127. warp/fem/geometry/closest_point.py +84 -0
  128. warp/fem/geometry/deformed_geometry.py +221 -0
  129. warp/fem/geometry/element.py +776 -0
  130. warp/fem/geometry/geometry.py +362 -0
  131. warp/fem/geometry/grid_2d.py +392 -0
  132. warp/fem/geometry/grid_3d.py +452 -0
  133. warp/fem/geometry/hexmesh.py +911 -0
  134. warp/fem/geometry/nanogrid.py +571 -0
  135. warp/fem/geometry/partition.py +389 -0
  136. warp/fem/geometry/quadmesh.py +663 -0
  137. warp/fem/geometry/tetmesh.py +855 -0
  138. warp/fem/geometry/trimesh.py +806 -0
  139. warp/fem/integrate.py +2335 -0
  140. warp/fem/linalg.py +419 -0
  141. warp/fem/operator.py +293 -0
  142. warp/fem/polynomial.py +229 -0
  143. warp/fem/quadrature/__init__.py +17 -0
  144. warp/fem/quadrature/pic_quadrature.py +299 -0
  145. warp/fem/quadrature/quadrature.py +591 -0
  146. warp/fem/space/__init__.py +228 -0
  147. warp/fem/space/basis_function_space.py +468 -0
  148. warp/fem/space/basis_space.py +667 -0
  149. warp/fem/space/dof_mapper.py +251 -0
  150. warp/fem/space/function_space.py +309 -0
  151. warp/fem/space/grid_2d_function_space.py +177 -0
  152. warp/fem/space/grid_3d_function_space.py +227 -0
  153. warp/fem/space/hexmesh_function_space.py +257 -0
  154. warp/fem/space/nanogrid_function_space.py +201 -0
  155. warp/fem/space/partition.py +367 -0
  156. warp/fem/space/quadmesh_function_space.py +223 -0
  157. warp/fem/space/restriction.py +179 -0
  158. warp/fem/space/shape/__init__.py +143 -0
  159. warp/fem/space/shape/cube_shape_function.py +1105 -0
  160. warp/fem/space/shape/shape_function.py +133 -0
  161. warp/fem/space/shape/square_shape_function.py +926 -0
  162. warp/fem/space/shape/tet_shape_function.py +834 -0
  163. warp/fem/space/shape/triangle_shape_function.py +672 -0
  164. warp/fem/space/tetmesh_function_space.py +271 -0
  165. warp/fem/space/topology.py +424 -0
  166. warp/fem/space/trimesh_function_space.py +194 -0
  167. warp/fem/types.py +99 -0
  168. warp/fem/utils.py +420 -0
  169. warp/jax.py +187 -0
  170. warp/jax_experimental/__init__.py +16 -0
  171. warp/jax_experimental/custom_call.py +351 -0
  172. warp/jax_experimental/ffi.py +698 -0
  173. warp/jax_experimental/xla_ffi.py +602 -0
  174. warp/math.py +244 -0
  175. warp/native/array.h +1145 -0
  176. warp/native/builtin.h +1800 -0
  177. warp/native/bvh.cpp +492 -0
  178. warp/native/bvh.cu +791 -0
  179. warp/native/bvh.h +554 -0
  180. warp/native/clang/clang.cpp +536 -0
  181. warp/native/coloring.cpp +613 -0
  182. warp/native/crt.cpp +51 -0
  183. warp/native/crt.h +362 -0
  184. warp/native/cuda_crt.h +1058 -0
  185. warp/native/cuda_util.cpp +646 -0
  186. warp/native/cuda_util.h +307 -0
  187. warp/native/error.cpp +77 -0
  188. warp/native/error.h +36 -0
  189. warp/native/exports.h +1878 -0
  190. warp/native/fabric.h +245 -0
  191. warp/native/hashgrid.cpp +311 -0
  192. warp/native/hashgrid.cu +87 -0
  193. warp/native/hashgrid.h +240 -0
  194. warp/native/initializer_array.h +41 -0
  195. warp/native/intersect.h +1230 -0
  196. warp/native/intersect_adj.h +375 -0
  197. warp/native/intersect_tri.h +339 -0
  198. warp/native/marching.cpp +19 -0
  199. warp/native/marching.cu +514 -0
  200. warp/native/marching.h +19 -0
  201. warp/native/mat.h +2220 -0
  202. warp/native/mathdx.cpp +87 -0
  203. warp/native/matnn.h +343 -0
  204. warp/native/mesh.cpp +266 -0
  205. warp/native/mesh.cu +404 -0
  206. warp/native/mesh.h +1980 -0
  207. warp/native/nanovdb/GridHandle.h +366 -0
  208. warp/native/nanovdb/HostBuffer.h +590 -0
  209. warp/native/nanovdb/NanoVDB.h +6624 -0
  210. warp/native/nanovdb/PNanoVDB.h +3390 -0
  211. warp/native/noise.h +859 -0
  212. warp/native/quat.h +1371 -0
  213. warp/native/rand.h +342 -0
  214. warp/native/range.h +139 -0
  215. warp/native/reduce.cpp +174 -0
  216. warp/native/reduce.cu +364 -0
  217. warp/native/runlength_encode.cpp +79 -0
  218. warp/native/runlength_encode.cu +61 -0
  219. warp/native/scan.cpp +47 -0
  220. warp/native/scan.cu +53 -0
  221. warp/native/scan.h +23 -0
  222. warp/native/solid_angle.h +466 -0
  223. warp/native/sort.cpp +251 -0
  224. warp/native/sort.cu +277 -0
  225. warp/native/sort.h +33 -0
  226. warp/native/sparse.cpp +378 -0
  227. warp/native/sparse.cu +524 -0
  228. warp/native/spatial.h +657 -0
  229. warp/native/svd.h +702 -0
  230. warp/native/temp_buffer.h +46 -0
  231. warp/native/tile.h +2584 -0
  232. warp/native/tile_reduce.h +264 -0
  233. warp/native/vec.h +1426 -0
  234. warp/native/volume.cpp +501 -0
  235. warp/native/volume.cu +67 -0
  236. warp/native/volume.h +969 -0
  237. warp/native/volume_builder.cu +477 -0
  238. warp/native/volume_builder.h +52 -0
  239. warp/native/volume_impl.h +70 -0
  240. warp/native/warp.cpp +1082 -0
  241. warp/native/warp.cu +3636 -0
  242. warp/native/warp.h +381 -0
  243. warp/optim/__init__.py +17 -0
  244. warp/optim/adam.py +163 -0
  245. warp/optim/linear.py +1137 -0
  246. warp/optim/sgd.py +112 -0
  247. warp/paddle.py +407 -0
  248. warp/render/__init__.py +18 -0
  249. warp/render/render_opengl.py +3518 -0
  250. warp/render/render_usd.py +784 -0
  251. warp/render/utils.py +160 -0
  252. warp/sim/__init__.py +65 -0
  253. warp/sim/articulation.py +793 -0
  254. warp/sim/collide.py +2395 -0
  255. warp/sim/graph_coloring.py +300 -0
  256. warp/sim/import_mjcf.py +790 -0
  257. warp/sim/import_snu.py +227 -0
  258. warp/sim/import_urdf.py +579 -0
  259. warp/sim/import_usd.py +894 -0
  260. warp/sim/inertia.py +324 -0
  261. warp/sim/integrator.py +242 -0
  262. warp/sim/integrator_euler.py +1997 -0
  263. warp/sim/integrator_featherstone.py +2101 -0
  264. warp/sim/integrator_vbd.py +2048 -0
  265. warp/sim/integrator_xpbd.py +3292 -0
  266. warp/sim/model.py +4791 -0
  267. warp/sim/particles.py +121 -0
  268. warp/sim/render.py +427 -0
  269. warp/sim/utils.py +428 -0
  270. warp/sparse.py +2057 -0
  271. warp/stubs.py +3333 -0
  272. warp/tape.py +1203 -0
  273. warp/tests/__init__.py +1 -0
  274. warp/tests/__main__.py +4 -0
  275. warp/tests/assets/curlnoise_golden.npy +0 -0
  276. warp/tests/assets/mlp_golden.npy +0 -0
  277. warp/tests/assets/pixel.npy +0 -0
  278. warp/tests/assets/pnoise_golden.npy +0 -0
  279. warp/tests/assets/spiky.usd +0 -0
  280. warp/tests/assets/test_grid.nvdb +0 -0
  281. warp/tests/assets/test_index_grid.nvdb +0 -0
  282. warp/tests/assets/test_int32_grid.nvdb +0 -0
  283. warp/tests/assets/test_vec_grid.nvdb +0 -0
  284. warp/tests/assets/torus.nvdb +0 -0
  285. warp/tests/assets/torus.usda +105 -0
  286. warp/tests/aux_test_class_kernel.py +34 -0
  287. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  288. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  289. warp/tests/aux_test_dependent.py +29 -0
  290. warp/tests/aux_test_grad_customs.py +29 -0
  291. warp/tests/aux_test_instancing_gc.py +26 -0
  292. warp/tests/aux_test_module_unload.py +23 -0
  293. warp/tests/aux_test_name_clash1.py +40 -0
  294. warp/tests/aux_test_name_clash2.py +40 -0
  295. warp/tests/aux_test_reference.py +9 -0
  296. warp/tests/aux_test_reference_reference.py +8 -0
  297. warp/tests/aux_test_square.py +16 -0
  298. warp/tests/aux_test_unresolved_func.py +22 -0
  299. warp/tests/aux_test_unresolved_symbol.py +22 -0
  300. warp/tests/cuda/__init__.py +0 -0
  301. warp/tests/cuda/test_async.py +676 -0
  302. warp/tests/cuda/test_ipc.py +124 -0
  303. warp/tests/cuda/test_mempool.py +233 -0
  304. warp/tests/cuda/test_multigpu.py +169 -0
  305. warp/tests/cuda/test_peer.py +139 -0
  306. warp/tests/cuda/test_pinned.py +84 -0
  307. warp/tests/cuda/test_streams.py +634 -0
  308. warp/tests/geometry/__init__.py +0 -0
  309. warp/tests/geometry/test_bvh.py +200 -0
  310. warp/tests/geometry/test_hash_grid.py +221 -0
  311. warp/tests/geometry/test_marching_cubes.py +74 -0
  312. warp/tests/geometry/test_mesh.py +316 -0
  313. warp/tests/geometry/test_mesh_query_aabb.py +399 -0
  314. warp/tests/geometry/test_mesh_query_point.py +932 -0
  315. warp/tests/geometry/test_mesh_query_ray.py +311 -0
  316. warp/tests/geometry/test_volume.py +1103 -0
  317. warp/tests/geometry/test_volume_write.py +346 -0
  318. warp/tests/interop/__init__.py +0 -0
  319. warp/tests/interop/test_dlpack.py +729 -0
  320. warp/tests/interop/test_jax.py +371 -0
  321. warp/tests/interop/test_paddle.py +800 -0
  322. warp/tests/interop/test_torch.py +1001 -0
  323. warp/tests/run_coverage_serial.py +39 -0
  324. warp/tests/sim/__init__.py +0 -0
  325. warp/tests/sim/disabled_kinematics.py +244 -0
  326. warp/tests/sim/flaky_test_sim_grad.py +290 -0
  327. warp/tests/sim/test_collision.py +604 -0
  328. warp/tests/sim/test_coloring.py +258 -0
  329. warp/tests/sim/test_model.py +224 -0
  330. warp/tests/sim/test_sim_grad_bounce_linear.py +212 -0
  331. warp/tests/sim/test_sim_kinematics.py +98 -0
  332. warp/tests/sim/test_vbd.py +597 -0
  333. warp/tests/test_adam.py +163 -0
  334. warp/tests/test_arithmetic.py +1096 -0
  335. warp/tests/test_array.py +2972 -0
  336. warp/tests/test_array_reduce.py +156 -0
  337. warp/tests/test_assert.py +250 -0
  338. warp/tests/test_atomic.py +153 -0
  339. warp/tests/test_bool.py +220 -0
  340. warp/tests/test_builtins_resolution.py +1298 -0
  341. warp/tests/test_closest_point_edge_edge.py +327 -0
  342. warp/tests/test_codegen.py +810 -0
  343. warp/tests/test_codegen_instancing.py +1495 -0
  344. warp/tests/test_compile_consts.py +215 -0
  345. warp/tests/test_conditional.py +252 -0
  346. warp/tests/test_context.py +42 -0
  347. warp/tests/test_copy.py +238 -0
  348. warp/tests/test_ctypes.py +638 -0
  349. warp/tests/test_dense.py +73 -0
  350. warp/tests/test_devices.py +97 -0
  351. warp/tests/test_examples.py +482 -0
  352. warp/tests/test_fabricarray.py +996 -0
  353. warp/tests/test_fast_math.py +74 -0
  354. warp/tests/test_fem.py +2003 -0
  355. warp/tests/test_fp16.py +136 -0
  356. warp/tests/test_func.py +454 -0
  357. warp/tests/test_future_annotations.py +98 -0
  358. warp/tests/test_generics.py +656 -0
  359. warp/tests/test_grad.py +893 -0
  360. warp/tests/test_grad_customs.py +339 -0
  361. warp/tests/test_grad_debug.py +341 -0
  362. warp/tests/test_implicit_init.py +411 -0
  363. warp/tests/test_import.py +45 -0
  364. warp/tests/test_indexedarray.py +1140 -0
  365. warp/tests/test_intersect.py +73 -0
  366. warp/tests/test_iter.py +76 -0
  367. warp/tests/test_large.py +177 -0
  368. warp/tests/test_launch.py +411 -0
  369. warp/tests/test_lerp.py +151 -0
  370. warp/tests/test_linear_solvers.py +193 -0
  371. warp/tests/test_lvalue.py +427 -0
  372. warp/tests/test_mat.py +2089 -0
  373. warp/tests/test_mat_lite.py +122 -0
  374. warp/tests/test_mat_scalar_ops.py +2913 -0
  375. warp/tests/test_math.py +178 -0
  376. warp/tests/test_mlp.py +282 -0
  377. warp/tests/test_module_hashing.py +258 -0
  378. warp/tests/test_modules_lite.py +44 -0
  379. warp/tests/test_noise.py +252 -0
  380. warp/tests/test_operators.py +299 -0
  381. warp/tests/test_options.py +129 -0
  382. warp/tests/test_overwrite.py +551 -0
  383. warp/tests/test_print.py +339 -0
  384. warp/tests/test_quat.py +2315 -0
  385. warp/tests/test_rand.py +339 -0
  386. warp/tests/test_reload.py +302 -0
  387. warp/tests/test_rounding.py +185 -0
  388. warp/tests/test_runlength_encode.py +196 -0
  389. warp/tests/test_scalar_ops.py +105 -0
  390. warp/tests/test_smoothstep.py +108 -0
  391. warp/tests/test_snippet.py +318 -0
  392. warp/tests/test_sparse.py +582 -0
  393. warp/tests/test_spatial.py +2229 -0
  394. warp/tests/test_special_values.py +361 -0
  395. warp/tests/test_static.py +592 -0
  396. warp/tests/test_struct.py +734 -0
  397. warp/tests/test_tape.py +204 -0
  398. warp/tests/test_transient_module.py +93 -0
  399. warp/tests/test_triangle_closest_point.py +145 -0
  400. warp/tests/test_types.py +562 -0
  401. warp/tests/test_utils.py +588 -0
  402. warp/tests/test_vec.py +1487 -0
  403. warp/tests/test_vec_lite.py +80 -0
  404. warp/tests/test_vec_scalar_ops.py +2327 -0
  405. warp/tests/test_verify_fp.py +100 -0
  406. warp/tests/tile/__init__.py +0 -0
  407. warp/tests/tile/test_tile.py +780 -0
  408. warp/tests/tile/test_tile_load.py +407 -0
  409. warp/tests/tile/test_tile_mathdx.py +208 -0
  410. warp/tests/tile/test_tile_mlp.py +402 -0
  411. warp/tests/tile/test_tile_reduce.py +447 -0
  412. warp/tests/tile/test_tile_shared_memory.py +247 -0
  413. warp/tests/tile/test_tile_view.py +173 -0
  414. warp/tests/unittest_serial.py +47 -0
  415. warp/tests/unittest_suites.py +427 -0
  416. warp/tests/unittest_utils.py +468 -0
  417. warp/tests/walkthrough_debug.py +93 -0
  418. warp/thirdparty/__init__.py +0 -0
  419. warp/thirdparty/appdirs.py +598 -0
  420. warp/thirdparty/dlpack.py +145 -0
  421. warp/thirdparty/unittest_parallel.py +570 -0
  422. warp/torch.py +391 -0
  423. warp/types.py +5230 -0
  424. warp/utils.py +1137 -0
  425. warp_lang-1.7.0.dist-info/METADATA +516 -0
  426. warp_lang-1.7.0.dist-info/RECORD +429 -0
  427. warp_lang-1.7.0.dist-info/WHEEL +5 -0
  428. warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
  429. warp_lang-1.7.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,200 @@
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 bvh_query_aabb(bvh_id: wp.uint64, lower: wp.vec3, upper: wp.vec3, bounds_intersected: wp.array(dtype=int)):
26
+ query = wp.bvh_query_aabb(bvh_id, lower, upper)
27
+ bounds_nr = int(0)
28
+
29
+ while wp.bvh_query_next(query, bounds_nr):
30
+ bounds_intersected[bounds_nr] = 1
31
+
32
+
33
+ @wp.kernel
34
+ def bvh_query_ray(bvh_id: wp.uint64, start: wp.vec3, dir: wp.vec3, bounds_intersected: wp.array(dtype=int)):
35
+ query = wp.bvh_query_ray(bvh_id, start, dir)
36
+ bounds_nr = int(0)
37
+
38
+ while wp.bvh_query_next(query, bounds_nr):
39
+ bounds_intersected[bounds_nr] = 1
40
+
41
+
42
+ def aabb_overlap(a_lower, a_upper, b_lower, b_upper):
43
+ if (
44
+ a_lower[0] > b_upper[0]
45
+ or a_lower[1] > b_upper[1]
46
+ or a_lower[2] > b_upper[2]
47
+ or a_upper[0] < b_lower[0]
48
+ or a_upper[1] < b_lower[1]
49
+ or a_upper[2] < b_lower[2]
50
+ ):
51
+ return 0
52
+ else:
53
+ return 1
54
+
55
+
56
+ def intersect_ray_aabb(start, rcp_dir, lower, upper):
57
+ l1 = (lower[0] - start[0]) * rcp_dir[0]
58
+ l2 = (upper[0] - start[0]) * rcp_dir[0]
59
+ lmin = min(l1, l2)
60
+ lmax = max(l1, l2)
61
+
62
+ l1 = (lower[1] - start[1]) * rcp_dir[1]
63
+ l2 = (upper[1] - start[1]) * rcp_dir[1]
64
+ lmin = max(min(l1, l2), lmin)
65
+ lmax = min(max(l1, l2), lmax)
66
+
67
+ l1 = (lower[2] - start[2]) * rcp_dir[2]
68
+ l2 = (upper[2] - start[2]) * rcp_dir[2]
69
+ lmin = max(min(l1, l2), lmin)
70
+ lmax = min(max(l1, l2), lmax)
71
+
72
+ if lmax >= 0.0 and lmax >= lmin:
73
+ return 1
74
+ else:
75
+ return 0
76
+
77
+
78
+ def test_bvh(test, type, device):
79
+ rng = np.random.default_rng(123)
80
+
81
+ num_bounds = 100
82
+ lowers = rng.random(size=(num_bounds, 3)) * 5.0
83
+ uppers = lowers + rng.random(size=(num_bounds, 3)) * 5.0
84
+
85
+ device_lowers = wp.array(lowers, dtype=wp.vec3, device=device)
86
+ device_uppers = wp.array(uppers, dtype=wp.vec3, device=device)
87
+
88
+ bvh = wp.Bvh(device_lowers, device_uppers)
89
+
90
+ bounds_intersected = wp.zeros(shape=(num_bounds), dtype=int, device=device)
91
+
92
+ query_lower = wp.vec3(2.0, 2.0, 2.0)
93
+ query_upper = wp.vec3(8.0, 8.0, 8.0)
94
+
95
+ query_start = wp.vec3(0.0, 0.0, 0.0)
96
+ query_dir = wp.normalize(wp.vec3(1.0, 1.0, 1.0))
97
+
98
+ for test_case in range(2):
99
+ if type == "AABB":
100
+ wp.launch(
101
+ kernel=bvh_query_aabb,
102
+ dim=1,
103
+ inputs=[bvh.id, query_lower, query_upper, bounds_intersected],
104
+ device=device,
105
+ )
106
+ else:
107
+ wp.launch(
108
+ kernel=bvh_query_ray, dim=1, inputs=[bvh.id, query_start, query_dir, bounds_intersected], device=device
109
+ )
110
+
111
+ device_intersected = bounds_intersected.numpy()
112
+
113
+ for i in range(num_bounds):
114
+ lower = lowers[i]
115
+ upper = uppers[i]
116
+ if type == "AABB":
117
+ host_intersected = aabb_overlap(lower, upper, query_lower, query_upper)
118
+ else:
119
+ host_intersected = intersect_ray_aabb(query_start, 1.0 / query_dir, lower, upper)
120
+
121
+ test.assertEqual(host_intersected, device_intersected[i])
122
+
123
+ if test_case == 0:
124
+ lowers = rng.random(size=(num_bounds, 3)) * 5.0
125
+ uppers = lowers + rng.random(size=(num_bounds, 3)) * 5.0
126
+ wp.copy(device_lowers, wp.array(lowers, dtype=wp.vec3, device=device))
127
+ wp.copy(device_uppers, wp.array(uppers, dtype=wp.vec3, device=device))
128
+ bvh.refit()
129
+ bounds_intersected.zero_()
130
+
131
+
132
+ def test_bvh_query_aabb(test, device):
133
+ test_bvh(test, "AABB", device)
134
+
135
+
136
+ def test_bvh_query_ray(test, device):
137
+ test_bvh(test, "ray", device)
138
+
139
+
140
+ def test_gh_288(test, device):
141
+ num_bounds = 1
142
+ lowers = ((0.5, -1.0, -1.0),) * num_bounds
143
+ uppers = ((1.0, 1.0, 1.0),) * num_bounds
144
+
145
+ device_lowers = wp.array(lowers, dtype=wp.vec3f, device=device)
146
+ device_uppers = wp.array(uppers, dtype=wp.vec3f, device=device)
147
+
148
+ bvh = wp.Bvh(device_lowers, device_uppers)
149
+
150
+ bounds_intersected = wp.zeros(shape=num_bounds, dtype=int, device=device)
151
+
152
+ for x in (0.0, 0.75):
153
+ query_start = wp.vec3(x, 0.0, 0.0)
154
+ query_dir = wp.vec3(1.0, 0.0, 0.0)
155
+
156
+ wp.launch(
157
+ kernel=bvh_query_ray, dim=1, inputs=[bvh.id, query_start, query_dir, bounds_intersected], device=device
158
+ )
159
+
160
+ device_intersected = bounds_intersected.numpy()
161
+ test.assertEqual(device_intersected.sum(), num_bounds)
162
+
163
+
164
+ devices = get_test_devices()
165
+
166
+
167
+ class TestBvh(unittest.TestCase):
168
+ def test_bvh_codegen_adjoints_with_select(self):
169
+ def kernel_fn(bvh: wp.uint64):
170
+ v = wp.vec3(0.0, 0.0, 0.0)
171
+ bounds_nr = int(0)
172
+
173
+ if True:
174
+ query_1 = wp.bvh_query_aabb(bvh, v, v)
175
+ query_2 = wp.bvh_query_ray(bvh, v, v)
176
+
177
+ wp.bvh_query_next(query_1, bounds_nr)
178
+ wp.bvh_query_next(query_2, bounds_nr)
179
+ else:
180
+ query_1 = wp.bvh_query_aabb(bvh, v, v)
181
+ query_2 = wp.bvh_query_ray(bvh, v, v)
182
+
183
+ wp.bvh_query_next(query_1, bounds_nr)
184
+ wp.bvh_query_next(query_2, bounds_nr)
185
+
186
+ wp.Kernel(func=kernel_fn)
187
+
188
+ def test_bvh_new_del(self):
189
+ # test the scenario in which a bvh is created but not initialized before gc
190
+ instance = wp.Bvh.__new__(wp.Bvh)
191
+ instance.__del__()
192
+
193
+
194
+ add_function_test(TestBvh, "test_bvh_aabb", test_bvh_query_aabb, devices=devices)
195
+ add_function_test(TestBvh, "test_bvh_ray", test_bvh_query_ray, devices=devices)
196
+ add_function_test(TestBvh, "test_gh_288", test_gh_288, devices=devices)
197
+
198
+ if __name__ == "__main__":
199
+ wp.clear_kernel_cache()
200
+ unittest.main(verbosity=2)
@@ -0,0 +1,221 @@
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
+ num_points = 4096
24
+ dim_x = 128
25
+ dim_y = 128
26
+ dim_z = 128
27
+
28
+ scale = 150.0
29
+
30
+ cell_radius = 8.0
31
+ query_radius = 8.0
32
+
33
+ num_runs = 4
34
+
35
+ print_enabled = False
36
+
37
+
38
+ @wp.kernel
39
+ def count_neighbors(grid: wp.uint64, radius: float, points: wp.array(dtype=wp.vec3), counts: wp.array(dtype=int)):
40
+ tid = wp.tid()
41
+
42
+ # order threads by cell
43
+ i = wp.hash_grid_point_id(grid, tid)
44
+
45
+ # query point
46
+ p = points[i]
47
+ count = int(0)
48
+
49
+ # construct query around point p
50
+ for index in wp.hash_grid_query(grid, p, radius):
51
+ # compute distance to point
52
+ d = wp.length(p - points[index])
53
+
54
+ if d <= radius:
55
+ count += 1
56
+
57
+ counts[i] = count
58
+
59
+
60
+ @wp.kernel
61
+ def count_neighbors_reference(
62
+ radius: float, points: wp.array(dtype=wp.vec3), counts: wp.array(dtype=int), num_points: int
63
+ ):
64
+ tid = wp.tid()
65
+
66
+ i = tid % num_points
67
+ j = tid // num_points
68
+
69
+ # query point
70
+ p = points[i]
71
+ q = points[j]
72
+
73
+ # compute distance to point
74
+ d = wp.length(p - q)
75
+
76
+ if d <= radius:
77
+ wp.atomic_add(counts, i, 1)
78
+
79
+
80
+ def particle_grid(dim_x, dim_y, dim_z, lower, radius, jitter):
81
+ rng = np.random.default_rng(123)
82
+ points = np.meshgrid(np.linspace(0, dim_x, dim_x), np.linspace(0, dim_y, dim_y), np.linspace(0, dim_z, dim_z))
83
+ points_t = np.array((points[0], points[1], points[2])).T * radius * 2.0 + np.array(lower)
84
+ points_t = points_t + rng.random(size=points_t.shape) * radius * jitter
85
+
86
+ return points_t.reshape((-1, 3))
87
+
88
+
89
+ def test_hashgrid_query(test, device):
90
+ wp.load_module(device=device)
91
+
92
+ grid = wp.HashGrid(dim_x, dim_y, dim_z, device)
93
+
94
+ for i in range(num_runs):
95
+ if print_enabled:
96
+ print(f"Run: {i + 1}")
97
+ print("---------")
98
+
99
+ points = particle_grid(16, 32, 16, (0.0, 0.3, 0.0), cell_radius * 0.25, 0.1)
100
+
101
+ points_arr = wp.array(points, dtype=wp.vec3, device=device)
102
+ counts_arr = wp.zeros(len(points), dtype=int, device=device)
103
+ counts_arr_ref = wp.zeros(len(points), dtype=int, device=device)
104
+
105
+ profiler = {}
106
+
107
+ with wp.ScopedTimer("grid operations", print=print_enabled, dict=profiler, synchronize=True):
108
+ with wp.ScopedTimer("brute", print=print_enabled, dict=profiler, synchronize=True):
109
+ wp.launch(
110
+ kernel=count_neighbors_reference,
111
+ dim=len(points) * len(points),
112
+ inputs=[query_radius, points_arr, counts_arr_ref, len(points)],
113
+ device=device,
114
+ )
115
+ wp.synchronize_device(device)
116
+
117
+ with wp.ScopedTimer("grid build", print=print_enabled, dict=profiler, synchronize=True):
118
+ grid.build(points_arr, cell_radius)
119
+
120
+ with wp.ScopedTimer("grid query", print=print_enabled, dict=profiler, synchronize=True):
121
+ wp.launch(
122
+ kernel=count_neighbors,
123
+ dim=len(points),
124
+ inputs=[grid.id, query_radius, points_arr, counts_arr],
125
+ device=device,
126
+ )
127
+
128
+ counts = counts_arr.numpy()
129
+ counts_ref = counts_arr_ref.numpy()
130
+
131
+ if print_enabled:
132
+ print(f"Grid min: {np.min(counts)} max: {np.max(counts)} avg: {np.mean(counts)}")
133
+ print(f"Ref min: {np.min(counts_ref)} max: {np.max(counts_ref)} avg: {np.mean(counts_ref)}")
134
+
135
+ print(f"Passed: {np.array_equal(counts, counts_ref)}")
136
+
137
+ assert_np_equal(counts, counts_ref)
138
+
139
+
140
+ def test_hashgrid_inputs(test, device):
141
+ points = particle_grid(16, 32, 16, (0.0, 0.3, 0.0), cell_radius * 0.25, 0.1)
142
+ points_ref = wp.array(points, dtype=wp.vec3, device=device)
143
+ counts_ref = wp.zeros(len(points), dtype=int, device=device)
144
+
145
+ grid = wp.HashGrid(dim_x, dim_y, dim_z, device)
146
+ grid.build(points_ref, cell_radius)
147
+
148
+ # get reference counts
149
+ wp.launch(
150
+ kernel=count_neighbors, dim=len(points), inputs=[grid.id, query_radius, points_ref, counts_ref], device=device
151
+ )
152
+
153
+ # test with strided 1d input arrays
154
+ for stride in [2, 3]:
155
+ with test.subTest(msg=f"stride_{stride}"):
156
+ points_buffer = wp.zeros(len(points) * stride, dtype=wp.vec3, device=device)
157
+ points_strided = points_buffer[::stride]
158
+ wp.copy(points_strided, points_ref)
159
+ counts_strided = wp.zeros(len(points), dtype=int, device=device)
160
+
161
+ grid = wp.HashGrid(dim_x, dim_y, dim_z, device)
162
+ grid.build(points_strided, cell_radius)
163
+
164
+ wp.launch(
165
+ kernel=count_neighbors,
166
+ dim=len(points),
167
+ inputs=[grid.id, query_radius, points_ref, counts_strided],
168
+ device=device,
169
+ )
170
+
171
+ assert_array_equal(counts_strided, counts_ref)
172
+
173
+ # test with multidimensional input arrays
174
+ for ndim in [2, 3, 4]:
175
+ with test.subTest(msg=f"ndim_{ndim}"):
176
+ shape = (len(points) // (2 ** (ndim - 1)), *((ndim - 1) * (2,)))
177
+ points_ndim = wp.zeros(shape, dtype=wp.vec3, device=device)
178
+ wp.copy(points_ndim, points_ref)
179
+ counts_ndim = wp.zeros(len(points), dtype=int, device=device)
180
+
181
+ grid = wp.HashGrid(dim_x, dim_y, dim_z, device)
182
+ grid.build(points_ndim, cell_radius)
183
+
184
+ wp.launch(
185
+ kernel=count_neighbors,
186
+ dim=len(points),
187
+ inputs=[grid.id, query_radius, points_ref, counts_ndim],
188
+ device=device,
189
+ )
190
+
191
+ assert_array_equal(counts_ndim, counts_ref)
192
+
193
+
194
+ devices = get_test_devices()
195
+
196
+
197
+ class TestHashGrid(unittest.TestCase):
198
+ def test_hashgrid_codegen_adjoints_with_select(self):
199
+ def kernel_fn(grid: wp.uint64):
200
+ v = wp.vec3(0.0, 0.0, 0.0)
201
+
202
+ if True:
203
+ query = wp.hash_grid_query(grid, v, 0.0)
204
+ else:
205
+ query = wp.hash_grid_query(grid, v, 0.0)
206
+
207
+ wp.Kernel(func=kernel_fn)
208
+
209
+ def test_hashgrid_new_del(self):
210
+ # test the scenario in which a hashgrid is created but not initialized before gc
211
+ instance = wp.HashGrid.__new__(wp.HashGrid)
212
+ instance.__del__()
213
+
214
+
215
+ add_function_test(TestHashGrid, "test_hashgrid_query", test_hashgrid_query, devices=devices)
216
+ add_function_test(TestHashGrid, "test_hashgrid_inputs", test_hashgrid_inputs, devices=devices)
217
+
218
+
219
+ if __name__ == "__main__":
220
+ wp.clear_kernel_cache()
221
+ unittest.main(verbosity=2, failfast=False)
@@ -0,0 +1,74 @@
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(field: wp.array3d(dtype=float), center: wp.vec3, radius: float):
26
+ i, j, k = wp.tid()
27
+
28
+ p = wp.vec3(float(i), float(j), float(k))
29
+
30
+ d = wp.length(p - center) - radius
31
+
32
+ field[i, j, k] = d
33
+
34
+
35
+ def test_marching_cubes(test, device):
36
+ dim = 64
37
+ max_verts = 10**6
38
+ max_tris = 10**6
39
+
40
+ field = wp.zeros(shape=(dim, dim, dim), dtype=float, device=device)
41
+
42
+ iso = wp.MarchingCubes(nx=dim, ny=dim, nz=dim, max_verts=max_verts, max_tris=max_tris, device=device)
43
+
44
+ radius = dim / 4.0
45
+
46
+ wp.launch(make_field, dim=field.shape, inputs=[field, wp.vec3(dim / 2, dim / 2, dim / 2), radius], device=device)
47
+
48
+ iso.surface(field=field, threshold=0.0)
49
+
50
+ # check that all returned vertices lie on the surface of the sphere
51
+ length = np.linalg.norm(iso.verts.numpy() - np.array([dim / 2, dim / 2, dim / 2]), axis=1)
52
+ error = np.abs(length - radius)
53
+
54
+ test.assertTrue(np.max(error) < 1.0)
55
+
56
+ iso.resize(nx=dim * 2, ny=dim * 2, nz=dim * 2, max_verts=max_verts, max_tris=max_tris)
57
+
58
+
59
+ devices = get_selected_cuda_test_devices()
60
+
61
+
62
+ class TestMarchingCubes(unittest.TestCase):
63
+ def test_marching_cubes_new_del(self):
64
+ # test the scenario in which a MarchingCubes instance is created but not initialized before gc
65
+ instance = wp.MarchingCubes.__new__(wp.MarchingCubes)
66
+ instance.__del__()
67
+
68
+
69
+ add_function_test(TestMarchingCubes, "test_marching_cubes", test_marching_cubes, devices=devices)
70
+
71
+
72
+ if __name__ == "__main__":
73
+ wp.clear_kernel_cache()
74
+ unittest.main(verbosity=2)