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
warp/native/bvh.cpp ADDED
@@ -0,0 +1,492 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include <vector>
19
+ #include <algorithm>
20
+
21
+ #include "bvh.h"
22
+ #include "warp.h"
23
+ #include "cuda_util.h"
24
+
25
+ #include <map>
26
+
27
+ using namespace wp;
28
+
29
+ namespace wp
30
+ {
31
+
32
+
33
+ /////////////////////////////////////////////////////////////////////////////////////////////
34
+
35
+ class TopDownBVHBuilder
36
+ {
37
+ public:
38
+
39
+ void build(BVH& bvh, const vec3* lowers, const vec3* uppers, int n, int in_constructor_type);
40
+
41
+ private:
42
+
43
+ bounds3 calc_bounds(const vec3* lowers, const vec3* uppers, const int* indices, int start, int end);
44
+
45
+ int partition_median(const vec3* lowers, const vec3* uppers, int* indices, int start, int end, bounds3 range_bounds);
46
+ int partition_midpoint(const vec3* lowers, const vec3* uppers, int* indices, int start, int end, bounds3 range_bounds);
47
+ float partition_sah(BVH& bvh, const vec3* lowers, const vec3* uppers,
48
+ int start, int end, bounds3 range_bounds, int& split_axis);
49
+
50
+ int build_recursive(BVH& bvh, const vec3* lowers, const vec3* uppers, int start, int end, int depth, int parent);
51
+
52
+ int constructor_type = -1;
53
+ };
54
+
55
+ //////////////////////////////////////////////////////////////////////
56
+
57
+ void TopDownBVHBuilder::build(BVH& bvh, const vec3* lowers, const vec3* uppers, int n, int in_constructor_type)
58
+ {
59
+ constructor_type = in_constructor_type;
60
+ if (constructor_type != BVH_CONSTRUCTOR_SAH && constructor_type != BVH_CONSTRUCTOR_MEDIAN)
61
+ {
62
+ printf("Unrecognized Constructor type: %d! For CPU constructor it should be either SAH (%d) or Median (%d)!\n",
63
+ constructor_type, BVH_CONSTRUCTOR_SAH, BVH_CONSTRUCTOR_MEDIAN);
64
+ return;
65
+ }
66
+
67
+ bvh.max_depth = 0;
68
+ bvh.max_nodes = 2*n-1;
69
+
70
+ bvh.node_lowers = new BVHPackedNodeHalf[bvh.max_nodes];
71
+ bvh.node_uppers = new BVHPackedNodeHalf[bvh.max_nodes];
72
+ bvh.node_parents = new int[bvh.max_nodes];
73
+ bvh.node_counts = NULL;
74
+
75
+ // root is always in first slot for top down builders
76
+ bvh.root = new int[1];
77
+ bvh.root[0] = 0;
78
+
79
+ if (n == 0)
80
+ return;
81
+
82
+ bvh.primitive_indices = new int[n];
83
+ for (int i = 0; i < n; ++i)
84
+ bvh.primitive_indices[i] = i;
85
+
86
+ build_recursive(bvh, lowers, uppers, 0, n, 0, -1);
87
+ }
88
+
89
+
90
+ bounds3 TopDownBVHBuilder::calc_bounds(const vec3* lowers, const vec3* uppers, const int* indices, int start, int end)
91
+ {
92
+ bounds3 u;
93
+
94
+ for (int i=start; i < end; ++i)
95
+ {
96
+ u.add_bounds(lowers[indices[i]], uppers[indices[i]]);
97
+ }
98
+
99
+ return u;
100
+ }
101
+
102
+ struct PartitionPredicateMedian
103
+ {
104
+ PartitionPredicateMedian(const vec3* lowers, const vec3* uppers, int a) : lowers(lowers), uppers(uppers), axis(a) {}
105
+
106
+ bool operator()(int a, int b) const
107
+ {
108
+ vec3 a_center = 0.5f*(lowers[a] + uppers[a]);
109
+ vec3 b_center = 0.5f*(lowers[b] + uppers[b]);
110
+
111
+ return a_center[axis] < b_center[axis];
112
+ }
113
+
114
+ const vec3* lowers;
115
+ const vec3* uppers;
116
+ int axis;
117
+ };
118
+
119
+
120
+ int TopDownBVHBuilder::partition_median(const vec3* lowers, const vec3* uppers, int* indices, int start, int end, bounds3 range_bounds)
121
+ {
122
+ assert(end-start >= 2);
123
+
124
+ vec3 edges = range_bounds.edges();
125
+
126
+ int axis = longest_axis(edges);
127
+
128
+ const int k = (start+end)/2;
129
+
130
+ std::nth_element(&indices[start], &indices[k], &indices[end], PartitionPredicateMedian(lowers, uppers, axis));
131
+
132
+ return k;
133
+ }
134
+
135
+ struct PartitionPredicateMidPoint
136
+ {
137
+ PartitionPredicateMidPoint(const vec3* lowers, const vec3* uppers, int a, float m) : lowers(lowers), uppers(uppers), axis(a), mid(m) {}
138
+
139
+ bool operator()(int index) const
140
+ {
141
+ vec3 center = 0.5f*(lowers[index] + uppers[index]);
142
+
143
+ return center[axis] <= mid;
144
+ }
145
+
146
+ const vec3* lowers;
147
+ const vec3* uppers;
148
+
149
+ int axis;
150
+ float mid;
151
+ };
152
+
153
+
154
+ int TopDownBVHBuilder::partition_midpoint(const vec3* lowers, const vec3* uppers, int* indices, int start, int end, bounds3 range_bounds)
155
+ {
156
+ assert(end-start >= 2);
157
+
158
+ vec3 edges = range_bounds.edges();
159
+ vec3 center = range_bounds.center();
160
+
161
+ int axis = longest_axis(edges);
162
+ float mid = center[axis];
163
+
164
+ int* upper = std::partition(indices+start, indices+end, PartitionPredicateMidPoint(lowers, uppers, axis, mid));
165
+
166
+ int k = upper-indices;
167
+
168
+ // if we failed to split items then just split in the middle
169
+ if (k == start || k == end)
170
+ k = (start+end)/2;
171
+
172
+ return k;
173
+ }
174
+
175
+ float TopDownBVHBuilder::partition_sah(BVH& bvh, const vec3* lowers, const vec3* uppers, int start, int end, bounds3 range_bounds, int& split_axis)
176
+ {
177
+ int buckets_counts[SAH_NUM_BUCKETS];
178
+ bounds3 buckets[SAH_NUM_BUCKETS];
179
+ float left_areas[SAH_NUM_BUCKETS - 1];
180
+ float right_areas[SAH_NUM_BUCKETS - 1];
181
+
182
+ assert(end - start >= 2);
183
+
184
+ int n = end - start;
185
+ vec3 edges = range_bounds.edges();
186
+
187
+ bounds3 b = calc_bounds(lowers, uppers, bvh.primitive_indices, start, end);
188
+
189
+ split_axis = longest_axis(edges);
190
+
191
+ // compute each bucket
192
+ float range_start = b.lower[split_axis];
193
+ float range_end = b.upper[split_axis];
194
+
195
+ std::fill(buckets_counts, buckets_counts + SAH_NUM_BUCKETS, 0);
196
+ for (int item_idx = start; item_idx < end; item_idx++)
197
+ {
198
+ vec3 item_center = 0.5f * (lowers[bvh.primitive_indices[item_idx]] + uppers[bvh.primitive_indices[item_idx]]);
199
+ int bucket_idx = SAH_NUM_BUCKETS * (item_center[split_axis] - range_start) / (range_end - range_start);
200
+ assert(bucket_idx >= 0 && bucket_idx <= SAH_NUM_BUCKETS);
201
+ // one of them will have the range_end, we put it into the last bucket
202
+ bucket_idx = bucket_idx < SAH_NUM_BUCKETS ? bucket_idx : SAH_NUM_BUCKETS - 1;
203
+
204
+ bounds3 item_bound(lowers[bvh.primitive_indices[item_idx]], uppers[bvh.primitive_indices[item_idx]]);
205
+
206
+ if (buckets_counts[bucket_idx])
207
+ {
208
+ buckets[bucket_idx] = bounds_union(item_bound, buckets[bucket_idx]);
209
+ }
210
+ else
211
+ {
212
+ buckets[bucket_idx] = item_bound;
213
+ }
214
+
215
+ buckets_counts[bucket_idx]++;
216
+ }
217
+
218
+ bounds3 left;
219
+ bounds3 right;
220
+
221
+ // n - 1 division points for n buckets
222
+ int counts_l[SAH_NUM_BUCKETS - 1];
223
+ int counts_r[SAH_NUM_BUCKETS - 1];
224
+
225
+ int count_l = 0;
226
+ int count_r = 0;
227
+ // build cumulative bounds and area from left and right
228
+ for (int i = 0; i < SAH_NUM_BUCKETS - 1; ++i)
229
+ {
230
+ bounds3 bound_start = buckets[i];
231
+ bounds3 bound_end = buckets[SAH_NUM_BUCKETS - i - 1];
232
+
233
+ left = bounds_union(left, bound_start);
234
+ right = bounds_union(right, bound_end);
235
+
236
+ left_areas[i] = left.area();
237
+ right_areas[SAH_NUM_BUCKETS - i - 2] = right.area();
238
+
239
+ count_l += buckets_counts[i];
240
+ count_r += buckets_counts[SAH_NUM_BUCKETS - i - 1];
241
+
242
+ counts_l[i] = count_l;
243
+ counts_r[SAH_NUM_BUCKETS - i - 2] = count_r;
244
+ }
245
+
246
+ float invTotalArea = 1.0f / range_bounds.area();
247
+
248
+ // find split point i that minimizes area(left[i]) * count[left[i]] + area(right[i]) * count[right[i]]
249
+ int minSplit = 0;
250
+ float minCost = FLT_MAX;
251
+ for (int i = 0; i < SAH_NUM_BUCKETS - 1; ++i)
252
+ {
253
+ float pBelow = left_areas[i] * invTotalArea;
254
+ float pAbove = right_areas[i] * invTotalArea;
255
+
256
+ float cost = pBelow * counts_l[i] + pAbove * counts_r[i];
257
+
258
+ if (cost < minCost)
259
+ {
260
+ minCost = cost;
261
+ minSplit = i;
262
+ }
263
+ }
264
+
265
+ // return the dividing
266
+ assert(minSplit >= 0 && minSplit < SAH_NUM_BUCKETS - 1);
267
+ float split_point = range_start + (minSplit + 1) * (range_end - range_start) / SAH_NUM_BUCKETS;
268
+
269
+ return split_point;
270
+ }
271
+
272
+ int TopDownBVHBuilder::build_recursive(BVH& bvh, const vec3* lowers, const vec3* uppers, int start, int end, int depth, int parent)
273
+ {
274
+ assert(start < end);
275
+
276
+ // printf("start %d end %d\n", start, end);
277
+
278
+ const int n = end - start;
279
+ const int node_index = bvh.num_nodes++;
280
+
281
+ assert(node_index < bvh.max_nodes);
282
+
283
+ if (depth > bvh.max_depth)
284
+ bvh.max_depth = depth;
285
+
286
+ bounds3 b = calc_bounds(lowers, uppers, bvh.primitive_indices, start, end);
287
+
288
+ // If the depth exceeds BVH_QUERY_STACK_SIZE, an out-of-bounds access bug may occur during querying.
289
+ // In that case, we merge the following nodes into a single large leaf node.
290
+ if (n <= BVH_LEAF_SIZE || depth >= BVH_QUERY_STACK_SIZE - 1)
291
+ {
292
+ bvh.node_lowers[node_index] = make_node(b.lower, start, true);
293
+ bvh.node_uppers[node_index] = make_node(b.upper, end, false);
294
+ bvh.node_parents[node_index] = parent;
295
+ bvh.num_leaf_nodes++;
296
+ }
297
+ else
298
+ {
299
+ int split = -1;
300
+ if (constructor_type == BVH_CONSTRUCTOR_SAH)
301
+ // SAH constructor
302
+ {
303
+ int split_axis = -1;
304
+ float split_point = partition_sah(bvh, lowers, uppers, start, end, b, split_axis);
305
+ auto boundary = std::partition(bvh.primitive_indices + start, bvh.primitive_indices + end,
306
+ [&](int i) {
307
+ return 0.5f * (lowers[i] + uppers[i])[split_axis] < split_point;
308
+ });
309
+
310
+ split = std::distance(bvh.primitive_indices + start, boundary) + start;
311
+ }
312
+ else if (constructor_type == BVH_CONSTRUCTOR_MEDIAN)
313
+ // Median constructor
314
+ {
315
+ split = partition_median(lowers, uppers, bvh.primitive_indices, start, end, b);
316
+ }
317
+ else
318
+ {
319
+ printf("Unknown type of BVH constructor: %d!\n", constructor_type);
320
+ return -1;
321
+ }
322
+
323
+ if (split == start || split == end)
324
+ {
325
+ // partitioning failed, split down the middle
326
+ split = (start + end) / 2;
327
+ }
328
+
329
+ int left_child = build_recursive(bvh, lowers, uppers, start, split, depth + 1, node_index);
330
+ int right_child = build_recursive(bvh, lowers, uppers, split, end, depth + 1, node_index);
331
+
332
+ bvh.node_lowers[node_index] = make_node(b.lower, left_child, false);
333
+ bvh.node_uppers[node_index] = make_node(b.upper, right_child, false);
334
+ bvh.node_parents[node_index] = parent;
335
+ }
336
+
337
+ return node_index;
338
+ }
339
+
340
+
341
+ void bvh_refit_recursive(BVH& bvh, int index)
342
+ {
343
+ BVHPackedNodeHalf& lower = bvh.node_lowers[index];
344
+ BVHPackedNodeHalf& upper = bvh.node_uppers[index];
345
+
346
+ if (lower.b)
347
+ {
348
+ // update leaf from items
349
+ bounds3 bound;
350
+ for (int item_counter = lower.i; item_counter < upper.i; item_counter++)
351
+ {
352
+ const int item = bvh.primitive_indices[item_counter];
353
+ bound.add_bounds(bvh.item_lowers[item], bvh.item_uppers[item]);
354
+ }
355
+
356
+ (vec3&)lower = bound.lower;
357
+ (vec3&)upper = bound.upper;
358
+ }
359
+ else
360
+ {
361
+ int left_index = lower.i;
362
+ int right_index = upper.i;
363
+
364
+ bvh_refit_recursive(bvh, left_index);
365
+ bvh_refit_recursive(bvh, right_index);
366
+
367
+ // compute union of children
368
+ const vec3& left_lower = (vec3&)bvh.node_lowers[left_index];
369
+ const vec3& left_upper = (vec3&)bvh.node_uppers[left_index];
370
+
371
+ const vec3& right_lower = (vec3&)bvh.node_lowers[right_index];
372
+ const vec3& right_upper = (vec3&)bvh.node_uppers[right_index];
373
+
374
+ // union of child bounds
375
+ vec3 new_lower = min(left_lower, right_lower);
376
+ vec3 new_upper = max(left_upper, right_upper);
377
+
378
+ // write new BVH nodes
379
+ (vec3&)lower = new_lower;
380
+ (vec3&)upper = new_upper;
381
+ }
382
+ }
383
+
384
+ void bvh_refit_host(BVH& bvh)
385
+ {
386
+ bvh_refit_recursive(bvh, 0);
387
+ }
388
+
389
+
390
+ } // namespace wp
391
+
392
+
393
+ // making the class accessible from python
394
+
395
+
396
+ namespace
397
+ {
398
+ // host-side copy of bvh descriptors, maps GPU bvh address (id) to a CPU desc
399
+ std::map<uint64_t, BVH> g_bvh_descriptors;
400
+
401
+ } // anonymous namespace
402
+
403
+
404
+ namespace wp
405
+ {
406
+
407
+ bool bvh_get_descriptor(uint64_t id, BVH& bvh)
408
+ {
409
+ const auto& iter = g_bvh_descriptors.find(id);
410
+ if (iter == g_bvh_descriptors.end())
411
+ return false;
412
+ else
413
+ bvh = iter->second;
414
+ return true;
415
+ }
416
+
417
+ void bvh_add_descriptor(uint64_t id, const BVH& bvh)
418
+ {
419
+ g_bvh_descriptors[id] = bvh;
420
+
421
+ }
422
+
423
+ void bvh_rem_descriptor(uint64_t id)
424
+ {
425
+ g_bvh_descriptors.erase(id);
426
+
427
+ }
428
+
429
+
430
+ // create in-place given existing descriptor
431
+ void bvh_create_host(vec3* lowers, vec3* uppers, int num_items, int constructor_type, BVH& bvh)
432
+ {
433
+ memset(&bvh, 0, sizeof(BVH));
434
+
435
+ bvh.item_lowers = lowers;
436
+ bvh.item_uppers = uppers;
437
+ bvh.num_items = num_items;
438
+
439
+ TopDownBVHBuilder builder;
440
+ builder.build(bvh, lowers, uppers, num_items, constructor_type);
441
+ }
442
+
443
+ void bvh_destroy_host(BVH& bvh)
444
+ {
445
+ delete[] bvh.node_lowers;
446
+ delete[] bvh.node_uppers;
447
+ delete[] bvh.node_parents;
448
+ delete[] bvh.primitive_indices;
449
+ delete[] bvh.root;
450
+
451
+ bvh.node_lowers = NULL;
452
+ bvh.node_uppers = NULL;
453
+ bvh.node_parents = NULL;
454
+ bvh.primitive_indices = NULL;
455
+ bvh.root = NULL;
456
+
457
+ bvh.max_nodes = 0;
458
+ bvh.num_items = 0;
459
+ }
460
+
461
+ } // namespace wp
462
+
463
+ uint64_t bvh_create_host(vec3* lowers, vec3* uppers, int num_items, int constructor_type)
464
+ {
465
+ BVH* bvh = new BVH();
466
+ wp::bvh_create_host(lowers, uppers, num_items, constructor_type, *bvh);
467
+
468
+ return (uint64_t)bvh;
469
+ }
470
+
471
+ void bvh_refit_host(uint64_t id)
472
+ {
473
+ BVH* bvh = (BVH*)(id);
474
+ bvh_refit_host(*bvh);
475
+ }
476
+
477
+ void bvh_destroy_host(uint64_t id)
478
+ {
479
+ BVH* bvh = (BVH*)(id);
480
+ bvh_destroy_host(*bvh);
481
+ delete bvh;
482
+ }
483
+
484
+
485
+ // stubs for non-CUDA platforms
486
+ #if !WP_ENABLE_CUDA
487
+
488
+ uint64_t bvh_create_device(void* context, wp::vec3* lowers, wp::vec3* uppers, int num_items, int constructor_type) { return 0; }
489
+ void bvh_refit_device(uint64_t id) {}
490
+ void bvh_destroy_device(uint64_t id) {}
491
+
492
+ #endif // !WP_ENABLE_CUDA