warp-lang 1.7.0__py3-none-manylinux_2_28_x86_64.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,194 @@
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
+ ###########################################################################
17
+ # Example Marching Cubes
18
+ #
19
+ # Shows how use the built-in marching cubes functionality to extract
20
+ # the iso-surface from a density field.
21
+ #
22
+ # Note: requires a CUDA-capable device
23
+ ###########################################################################
24
+
25
+ import warp as wp
26
+ import warp.render
27
+
28
+
29
+ @wp.func
30
+ def sdf_create_box(pos: wp.vec3, size: wp.vec3):
31
+ """Creates a SDF box primitive."""
32
+ # https://iquilezles.org/articles/distfunctions
33
+ q = wp.vec3(
34
+ wp.abs(pos[0]) - size[0],
35
+ wp.abs(pos[1]) - size[1],
36
+ wp.abs(pos[2]) - size[2],
37
+ )
38
+ qp = wp.vec3(wp.max(q[0], 0.0), wp.max(q[1], 0.0), wp.max(q[2], 0.0))
39
+ return wp.length(qp) + wp.min(wp.max(q[0], wp.max(q[1], q[2])), 0.0)
40
+
41
+
42
+ @wp.func
43
+ def sdf_create_torus(pos: wp.vec3, major_radius: float, minor_radius: float):
44
+ """Creates a SDF torus primitive."""
45
+ # https://iquilezles.org/articles/distfunctions
46
+ q = wp.vec2(wp.length(wp.vec2(pos[0], pos[2])) - major_radius, pos[1])
47
+ return wp.length(q) - minor_radius
48
+
49
+
50
+ @wp.func
51
+ def sdf_translate(pos: wp.vec3, offset: wp.vec3):
52
+ """Translates a SDF position vector with an offset."""
53
+ return pos - offset
54
+
55
+
56
+ @wp.func
57
+ def sdf_rotate(pos: wp.vec3, angles: wp.vec3):
58
+ """Rotates a SDF position vector using Euler angles."""
59
+ rot = wp.quat_rpy(
60
+ wp.radians(angles[0]),
61
+ wp.radians(angles[1]),
62
+ wp.radians(angles[2]),
63
+ )
64
+ return wp.quat_rotate_inv(rot, pos)
65
+
66
+
67
+ @wp.func
68
+ def sdf_smooth_min(a: float, b: float, radius: float):
69
+ """Creates a SDF torus primitive."""
70
+ # https://iquilezles.org/articles/smin
71
+ h = wp.max(radius - wp.abs(a - b), 0.0) / radius
72
+ return wp.min(a, b) - h * h * h * radius * (1.0 / 6.0)
73
+
74
+
75
+ @wp.kernel(enable_backward=False)
76
+ def make_field(
77
+ torus_altitude: float,
78
+ torus_major_radius: float,
79
+ torus_minor_radius: float,
80
+ smooth_min_radius: float,
81
+ dim: int,
82
+ time: float,
83
+ out_data: wp.array3d(dtype=float),
84
+ ):
85
+ """Kernel to generate a SDF volume based on primitives."""
86
+ i, j, k = wp.tid()
87
+
88
+ # Retrieve the position of the current cell in a normalized [-1, 1] range
89
+ # for each dimension.
90
+ pos = wp.vec3(
91
+ 2.0 * ((float(i) + 0.5) / float(dim)) - 1.0,
92
+ 2.0 * ((float(j) + 0.5) / float(dim)) - 1.0,
93
+ 2.0 * ((float(k) + 0.5) / float(dim)) - 1.0,
94
+ )
95
+
96
+ box = sdf_create_box(
97
+ sdf_translate(pos, wp.vec3(0.0, -0.7, 0.0)),
98
+ wp.vec3(0.9, 0.3, 0.9),
99
+ )
100
+ torus = sdf_create_torus(
101
+ sdf_rotate(
102
+ sdf_translate(pos, wp.vec3(0.0, torus_altitude, 0.0)),
103
+ wp.vec3(wp.sin(time) * 90.0, wp.cos(time) * 45.0, 0.0),
104
+ ),
105
+ torus_major_radius,
106
+ torus_minor_radius,
107
+ )
108
+ out_data[i, j, k] = sdf_smooth_min(box, torus, smooth_min_radius)
109
+
110
+
111
+ class Example:
112
+ def __init__(self, stage_path="example_marching_cubes.usd", verbose=False):
113
+ self.verbose = verbose
114
+
115
+ self.dim = 64
116
+ self.max_verts = int(1e6)
117
+ self.max_tris = int(1e6)
118
+
119
+ self.torus_altitude = -0.5
120
+ self.torus_major_radius = 0.5
121
+ self.torus_minor_radius = 0.1
122
+ self.smooth_min_radius = 0.5
123
+
124
+ self.fps = 60
125
+ self.frame = 0
126
+
127
+ self.field = wp.zeros((self.dim, self.dim, self.dim), dtype=float)
128
+ self.mc = wp.MarchingCubes(self.dim, self.dim, self.dim, self.max_verts, self.max_tris)
129
+
130
+ self.renderer = None
131
+ if stage_path:
132
+ self.renderer = wp.render.UsdRenderer(stage_path)
133
+
134
+ def step(self):
135
+ with wp.ScopedTimer("step"):
136
+ with wp.ScopedTimer("Update Field", active=self.verbose):
137
+ wp.launch(
138
+ make_field,
139
+ dim=self.field.shape,
140
+ inputs=(
141
+ self.torus_altitude,
142
+ self.torus_major_radius,
143
+ self.torus_minor_radius,
144
+ self.smooth_min_radius,
145
+ self.dim,
146
+ self.frame / self.fps,
147
+ ),
148
+ outputs=(self.field,),
149
+ )
150
+
151
+ with wp.ScopedTimer("Surface Extraction", active=self.verbose):
152
+ self.mc.surface(self.field, 0.0)
153
+
154
+ def render(self):
155
+ if self.renderer is None:
156
+ return
157
+
158
+ with wp.ScopedTimer("Render"):
159
+ self.renderer.begin_frame(self.frame / self.fps)
160
+ self.renderer.render_mesh(
161
+ "surface",
162
+ self.mc.verts.numpy(),
163
+ self.mc.indices.numpy(),
164
+ colors=(0.35, 0.55, 0.9),
165
+ update_topology=True,
166
+ )
167
+ self.renderer.end_frame()
168
+
169
+
170
+ if __name__ == "__main__":
171
+ import argparse
172
+
173
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
174
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
175
+ parser.add_argument(
176
+ "--stage_path",
177
+ type=lambda x: None if x == "None" else str(x),
178
+ default="example_marching_cubes.usd",
179
+ help="Path to the output USD file.",
180
+ )
181
+ parser.add_argument("--num_frames", type=int, default=240, help="Total number of frames.")
182
+ parser.add_argument("--verbose", action="store_true", help="Print out additional status messages during execution.")
183
+
184
+ args = parser.parse_known_args()[0]
185
+
186
+ with wp.ScopedDevice(args.device):
187
+ example = Example(stage_path=args.stage_path, verbose=args.verbose)
188
+ for _ in range(args.num_frames):
189
+ example.step()
190
+ example.render()
191
+ example.frame += 1
192
+
193
+ if example.renderer is not None:
194
+ example.renderer.save()
@@ -0,0 +1,180 @@
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
+ ###########################################################################
17
+ # Example Mesh
18
+ #
19
+ # Shows how to implement a PBD particle simulation with collision against
20
+ # a deforming triangle mesh. The mesh collision uses wp.mesh_query_point_sign_normal()
21
+ # to compute the closest point, and wp.Mesh.refit() to update the mesh
22
+ # object after deformation.
23
+ #
24
+ ###########################################################################
25
+
26
+ import os
27
+
28
+ import numpy as np
29
+ from pxr import Usd, UsdGeom
30
+
31
+ import warp as wp
32
+ import warp.examples
33
+ import warp.render
34
+
35
+
36
+ @wp.kernel
37
+ def deform(positions: wp.array(dtype=wp.vec3), t: float):
38
+ tid = wp.tid()
39
+
40
+ x = positions[tid]
41
+
42
+ offset = -wp.sin(x[0]) * 0.02
43
+ scale = wp.sin(t)
44
+
45
+ x = x + wp.vec3(0.0, offset * scale, 0.0)
46
+
47
+ positions[tid] = x
48
+
49
+
50
+ @wp.kernel
51
+ def simulate(
52
+ positions: wp.array(dtype=wp.vec3),
53
+ velocities: wp.array(dtype=wp.vec3),
54
+ mesh: wp.uint64,
55
+ margin: float,
56
+ dt: float,
57
+ ):
58
+ tid = wp.tid()
59
+
60
+ x = positions[tid]
61
+ v = velocities[tid]
62
+
63
+ v = v + wp.vec3(0.0, 0.0 - 9.8, 0.0) * dt - v * 0.1 * dt
64
+ xpred = x + v * dt
65
+
66
+ max_dist = 1.5
67
+
68
+ query = wp.mesh_query_point_sign_normal(mesh, xpred, max_dist)
69
+ if query.result:
70
+ p = wp.mesh_eval_position(mesh, query.face, query.u, query.v)
71
+
72
+ delta = xpred - p
73
+
74
+ dist = wp.length(delta) * query.sign
75
+ err = dist - margin
76
+
77
+ # mesh collision
78
+ if err < 0.0:
79
+ n = wp.normalize(delta) * query.sign
80
+ xpred = xpred - n * err
81
+
82
+ # pbd update
83
+ v = (xpred - x) * (1.0 / dt)
84
+ x = xpred
85
+
86
+ positions[tid] = x
87
+ velocities[tid] = v
88
+
89
+
90
+ class Example:
91
+ def __init__(self, stage_path="example_mesh.usd"):
92
+ rng = np.random.default_rng(42)
93
+ self.num_particles = 1000
94
+
95
+ self.sim_dt = 1.0 / 60.0
96
+
97
+ self.sim_time = 0.0
98
+ self.sim_timers = {}
99
+
100
+ self.sim_margin = 0.1
101
+
102
+ usd_stage = Usd.Stage.Open(os.path.join(warp.examples.get_asset_directory(), "bunny.usd"))
103
+ usd_geom = UsdGeom.Mesh(usd_stage.GetPrimAtPath("/root/bunny"))
104
+ usd_scale = 10.0
105
+
106
+ # create collision mesh
107
+ self.mesh = wp.Mesh(
108
+ points=wp.array(usd_geom.GetPointsAttr().Get() * usd_scale, dtype=wp.vec3),
109
+ indices=wp.array(usd_geom.GetFaceVertexIndicesAttr().Get(), dtype=int),
110
+ )
111
+
112
+ # random particles
113
+ init_pos = (rng.random((self.num_particles, 3)) - np.array([0.5, -1.5, 0.5])) * 10.0
114
+ init_vel = rng.random((self.num_particles, 3)) * 0.0
115
+
116
+ self.positions = wp.from_numpy(init_pos, dtype=wp.vec3)
117
+ self.velocities = wp.from_numpy(init_vel, dtype=wp.vec3)
118
+
119
+ # renderer
120
+ self.renderer = None
121
+ if stage_path:
122
+ self.renderer = wp.render.UsdRenderer(stage_path)
123
+
124
+ def step(self):
125
+ with wp.ScopedTimer("step", dict=self.sim_timers):
126
+ wp.launch(kernel=deform, dim=len(self.mesh.points), inputs=[self.mesh.points, self.sim_time])
127
+
128
+ # refit the mesh BVH to account for the deformation
129
+ self.mesh.refit()
130
+
131
+ wp.launch(
132
+ kernel=simulate,
133
+ dim=self.num_particles,
134
+ inputs=[self.positions, self.velocities, self.mesh.id, self.sim_margin, self.sim_dt],
135
+ )
136
+
137
+ self.sim_time += self.sim_dt
138
+
139
+ def render(self):
140
+ if self.renderer is None:
141
+ return
142
+
143
+ with wp.ScopedTimer("render"):
144
+ self.renderer.begin_frame(self.sim_time)
145
+ self.renderer.render_mesh(
146
+ name="mesh",
147
+ points=self.mesh.points.numpy(),
148
+ indices=self.mesh.indices.numpy(),
149
+ colors=(0.35, 0.55, 0.9),
150
+ )
151
+ self.renderer.render_points(
152
+ name="points", points=self.positions.numpy(), radius=self.sim_margin, colors=(0.8, 0.3, 0.2)
153
+ )
154
+ self.renderer.end_frame()
155
+
156
+
157
+ if __name__ == "__main__":
158
+ import argparse
159
+
160
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
161
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
162
+ parser.add_argument(
163
+ "--stage_path",
164
+ type=lambda x: None if x == "None" else str(x),
165
+ default="example_mesh.usd",
166
+ help="Path to the output USD file.",
167
+ )
168
+ parser.add_argument("--num_frames", type=int, default=500, help="Total number of frames.")
169
+
170
+ args = parser.parse_known_args()[0]
171
+
172
+ with wp.ScopedDevice(args.device):
173
+ example = Example(stage_path=args.stage_path)
174
+
175
+ for _ in range(args.num_frames):
176
+ example.step()
177
+ example.render()
178
+
179
+ if example.renderer:
180
+ example.renderer.save()
@@ -0,0 +1,211 @@
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
+ #############################################################################
17
+ # Example Mesh Intersection
18
+ #
19
+ # Show how to use built-in BVH query to test if two triangle meshes intersect.
20
+ #
21
+ ##############################################################################
22
+
23
+ import os
24
+
25
+ import numpy as np
26
+ from pxr import Usd, UsdGeom
27
+
28
+ import warp as wp
29
+ import warp.examples
30
+ import warp.render
31
+
32
+
33
+ @wp.func
34
+ def cw_min(a: wp.vec3, b: wp.vec3):
35
+ return wp.vec3(wp.min(a[0], b[0]), wp.min(a[1], b[1]), wp.min(a[2], b[2]))
36
+
37
+
38
+ @wp.func
39
+ def cw_max(a: wp.vec3, b: wp.vec3):
40
+ return wp.vec3(wp.max(a[0], b[0]), wp.max(a[1], b[1]), wp.max(a[2], b[2]))
41
+
42
+
43
+ @wp.kernel
44
+ def intersect(
45
+ mesh_0: wp.uint64,
46
+ mesh_1: wp.uint64,
47
+ num_faces: int,
48
+ xforms: wp.array(dtype=wp.transform),
49
+ result: wp.array(dtype=int),
50
+ ):
51
+ tid = wp.tid()
52
+
53
+ # mesh_0 is assumed to be the query mesh, we launch one thread
54
+ # for each face in mesh_0 and test it against the opposing mesh's BVH
55
+ face = tid % num_faces
56
+ batch = tid // num_faces
57
+
58
+ # transforms from mesh_0 -> mesh_1 space
59
+ xform = xforms[batch]
60
+
61
+ # load query triangles points and transform to mesh_1's space
62
+ v0 = wp.transform_point(xform, wp.mesh_eval_position(mesh_0, face, 1.0, 0.0))
63
+ v1 = wp.transform_point(xform, wp.mesh_eval_position(mesh_0, face, 0.0, 1.0))
64
+ v2 = wp.transform_point(xform, wp.mesh_eval_position(mesh_0, face, 0.0, 0.0))
65
+
66
+ # compute bounds of the query triangle
67
+ lower = cw_min(cw_min(v0, v1), v2)
68
+ upper = cw_max(cw_max(v0, v1), v2)
69
+
70
+ query = wp.mesh_query_aabb(mesh_1, lower, upper)
71
+
72
+ for f in query:
73
+ u0 = wp.mesh_eval_position(mesh_1, f, 1.0, 0.0)
74
+ u1 = wp.mesh_eval_position(mesh_1, f, 0.0, 1.0)
75
+ u2 = wp.mesh_eval_position(mesh_1, f, 0.0, 0.0)
76
+
77
+ # test for triangle intersection
78
+ i = wp.intersect_tri_tri(v0, v1, v2, u0, u1, u2)
79
+
80
+ if i > 0:
81
+ result[batch] = 1
82
+ return
83
+
84
+ # use if you want to count all intersections
85
+ # wp.atomic_add(result, batch, i)
86
+
87
+
88
+ class Example:
89
+ def __init__(self, stage_path="example_mesh_intersect.usd"):
90
+ rng = np.random.default_rng(42)
91
+
92
+ self.query_count = 1024
93
+ self.has_queried = False
94
+
95
+ self.path_0 = os.path.join(warp.examples.get_asset_directory(), "cube.usd")
96
+ self.path_1 = os.path.join(warp.examples.get_asset_directory(), "sphere.usd")
97
+
98
+ self.mesh_0 = self.load_mesh(self.path_0, "/root/cube")
99
+ self.mesh_1 = self.load_mesh(self.path_1, "/root/sphere")
100
+
101
+ self.query_num_faces = int(len(self.mesh_0.indices) / 3)
102
+ self.query_num_points = len(self.mesh_0.points)
103
+
104
+ # generate random relative transforms
105
+ self.xforms = []
106
+
107
+ for _ in range(self.query_count):
108
+ # random offset
109
+ p = wp.vec3(rng.random(size=3) * 0.5 - 0.5) * 5.0
110
+
111
+ # random orientation
112
+ axis = wp.normalize(wp.vec3(rng.random(size=3) * 0.5 - 0.5))
113
+ angle = rng.random()
114
+
115
+ q = wp.quat_from_axis_angle(wp.normalize(axis), angle)
116
+
117
+ self.xforms.append(wp.transform(p, q))
118
+
119
+ self.array_result = wp.zeros(self.query_count, dtype=int)
120
+ self.array_xforms = wp.array(self.xforms, dtype=wp.transform)
121
+
122
+ # renderer
123
+ if stage_path:
124
+ self.renderer = wp.render.UsdRenderer(stage_path)
125
+ else:
126
+ self.renderer = None
127
+
128
+ def step(self):
129
+ with wp.ScopedTimer("step"):
130
+ wp.launch(
131
+ kernel=intersect,
132
+ dim=self.query_num_faces * self.query_count,
133
+ inputs=[self.mesh_0.id, self.mesh_1.id, self.query_num_faces, self.array_xforms, self.array_result],
134
+ )
135
+
136
+ def render(self):
137
+ if self.renderer is None:
138
+ return
139
+
140
+ # bring results back to host
141
+ result = self.array_result.numpy()
142
+
143
+ with wp.ScopedTimer("render", active=True):
144
+ self.renderer.begin_frame(0.0)
145
+
146
+ for i in range(self.query_count):
147
+ spacing = 8.0
148
+ offset = i * spacing
149
+
150
+ xform = self.xforms[i]
151
+ self.renderer.render_ref(
152
+ f"mesh_{i}_0",
153
+ self.path_0,
154
+ pos=wp.vec3(xform.p[0] + offset, xform.p[1], xform.p[2]),
155
+ rot=xform.q,
156
+ scale=wp.vec3(1.0, 1.0, 1.0),
157
+ )
158
+ self.renderer.render_ref(
159
+ f"mesh_{i}_1",
160
+ self.path_1,
161
+ pos=wp.vec3(offset, 0.0, 0.0),
162
+ rot=wp.quat_identity(),
163
+ scale=wp.vec3(1.0, 1.0, 1.0),
164
+ )
165
+
166
+ # if pair intersects then draw a small box above the pair
167
+ if result[i] > 0:
168
+ self.renderer.render_box(
169
+ f"result_{i}",
170
+ pos=wp.vec3(xform.p[0] + offset, xform.p[1] + 5.0, xform.p[2]),
171
+ rot=wp.quat_identity(),
172
+ extents=(0.1, 0.1, 0.1),
173
+ )
174
+
175
+ self.renderer.end_frame()
176
+
177
+ # create collision meshes
178
+ def load_mesh(self, path, prim):
179
+ usd_stage = Usd.Stage.Open(path)
180
+ usd_geom = UsdGeom.Mesh(usd_stage.GetPrimAtPath(prim))
181
+
182
+ mesh = wp.Mesh(
183
+ points=wp.array(usd_geom.GetPointsAttr().Get(), dtype=wp.vec3),
184
+ indices=wp.array(usd_geom.GetFaceVertexIndicesAttr().Get(), dtype=int),
185
+ )
186
+
187
+ return mesh
188
+
189
+
190
+ if __name__ == "__main__":
191
+ import argparse
192
+
193
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
194
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
195
+ parser.add_argument(
196
+ "--stage_path",
197
+ type=lambda x: None if x == "None" else str(x),
198
+ default="example_mesh_intersect.usd",
199
+ help="Path to the output USD file.",
200
+ )
201
+
202
+ args = parser.parse_known_args()[0]
203
+
204
+ with wp.ScopedDevice(args.device):
205
+ example = Example(stage_path=args.stage_path)
206
+
207
+ example.step()
208
+ example.render()
209
+
210
+ if example.renderer:
211
+ example.renderer.save()