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/sim/inertia.py ADDED
@@ -0,0 +1,324 @@
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
+ """Helper functions for computing rigid body inertia properties."""
17
+
18
+ import math
19
+ from typing import List, Union
20
+
21
+ import numpy as np
22
+
23
+ import warp as wp
24
+
25
+
26
+ @wp.func
27
+ def triangle_inertia(
28
+ p: wp.vec3,
29
+ q: wp.vec3,
30
+ r: wp.vec3,
31
+ density: float,
32
+ com: wp.vec3,
33
+ # outputs
34
+ mass: wp.array(dtype=float, ndim=1),
35
+ inertia: wp.array(dtype=wp.mat33, ndim=1),
36
+ ):
37
+ pcom = p - com
38
+ qcom = q - com
39
+ rcom = r - com
40
+
41
+ Dm = wp.mat33(pcom[0], qcom[0], rcom[0], pcom[1], qcom[1], rcom[1], pcom[2], qcom[2], rcom[2])
42
+
43
+ volume = wp.abs(wp.determinant(Dm) / 6.0)
44
+
45
+ # accumulate mass
46
+ wp.atomic_add(mass, 0, 4.0 * density * volume)
47
+
48
+ alpha = wp.sqrt(5.0) / 5.0
49
+ mid = (com + p + q + r) / 4.0
50
+ off_mid = mid - com
51
+
52
+ # displacement of quadrature point from COM
53
+ d0 = alpha * (p - mid) + off_mid
54
+ d1 = alpha * (q - mid) + off_mid
55
+ d2 = alpha * (r - mid) + off_mid
56
+ d3 = alpha * (com - mid) + off_mid
57
+
58
+ # accumulate inertia
59
+ identity = wp.mat33(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0)
60
+ I = wp.dot(d0, d0) * identity - wp.outer(d0, d0)
61
+ I += wp.dot(d1, d1) * identity - wp.outer(d1, d1)
62
+ I += wp.dot(d2, d2) * identity - wp.outer(d2, d2)
63
+ I += wp.dot(d3, d3) * identity - wp.outer(d3, d3)
64
+
65
+ wp.atomic_add(inertia, 0, (density * volume) * I)
66
+
67
+ return volume
68
+
69
+
70
+ @wp.kernel
71
+ def compute_solid_mesh_inertia(
72
+ # inputs
73
+ com: wp.vec3,
74
+ weight: float,
75
+ indices: wp.array(dtype=int, ndim=1),
76
+ vertices: wp.array(dtype=wp.vec3, ndim=1),
77
+ # outputs
78
+ mass: wp.array(dtype=float, ndim=1),
79
+ inertia: wp.array(dtype=wp.mat33, ndim=1),
80
+ volume: wp.array(dtype=float, ndim=1),
81
+ ):
82
+ i = wp.tid()
83
+
84
+ p = vertices[indices[i * 3 + 0]]
85
+ q = vertices[indices[i * 3 + 1]]
86
+ r = vertices[indices[i * 3 + 2]]
87
+
88
+ vol = triangle_inertia(p, q, r, weight, com, mass, inertia)
89
+ wp.atomic_add(volume, 0, vol)
90
+
91
+
92
+ @wp.kernel
93
+ def compute_hollow_mesh_inertia(
94
+ # inputs
95
+ com: wp.vec3,
96
+ density: float,
97
+ indices: wp.array(dtype=int, ndim=1),
98
+ vertices: wp.array(dtype=wp.vec3, ndim=1),
99
+ thickness: wp.array(dtype=float, ndim=1),
100
+ # outputs
101
+ mass: wp.array(dtype=float, ndim=1),
102
+ inertia: wp.array(dtype=wp.mat33, ndim=1),
103
+ volume: wp.array(dtype=float, ndim=1),
104
+ ):
105
+ tid = wp.tid()
106
+ i = indices[tid * 3 + 0]
107
+ j = indices[tid * 3 + 1]
108
+ k = indices[tid * 3 + 2]
109
+
110
+ vi = vertices[i]
111
+ vj = vertices[j]
112
+ vk = vertices[k]
113
+
114
+ normal = -wp.normalize(wp.cross(vj - vi, vk - vi))
115
+ ti = normal * thickness[i]
116
+ tj = normal * thickness[j]
117
+ tk = normal * thickness[k]
118
+
119
+ # wedge vertices
120
+ vi0 = vi - ti
121
+ vi1 = vi + ti
122
+ vj0 = vj - tj
123
+ vj1 = vj + tj
124
+ vk0 = vk - tk
125
+ vk1 = vk + tk
126
+
127
+ triangle_inertia(vi0, vj0, vk0, density, com, mass, inertia)
128
+ triangle_inertia(vj0, vk1, vk0, density, com, mass, inertia)
129
+ triangle_inertia(vj0, vj1, vk1, density, com, mass, inertia)
130
+ triangle_inertia(vj0, vi1, vj1, density, com, mass, inertia)
131
+ triangle_inertia(vj0, vi0, vi1, density, com, mass, inertia)
132
+ triangle_inertia(vj1, vi1, vk1, density, com, mass, inertia)
133
+ triangle_inertia(vi1, vi0, vk0, density, com, mass, inertia)
134
+ triangle_inertia(vi1, vk0, vk1, density, com, mass, inertia)
135
+
136
+ # compute volume
137
+ a = wp.length(wp.cross(vj - vi, vk - vi)) * 0.5
138
+ vol = a * (thickness[i] + thickness[j] + thickness[k]) / 3.0
139
+ wp.atomic_add(volume, 0, vol)
140
+
141
+
142
+ def compute_sphere_inertia(density: float, r: float) -> tuple:
143
+ """Helper to compute mass and inertia of a solid sphere
144
+
145
+ Args:
146
+ density: The sphere density
147
+ r: The sphere radius
148
+
149
+ Returns:
150
+
151
+ A tuple of (mass, inertia) with inertia specified around the origin
152
+ """
153
+
154
+ v = 4.0 / 3.0 * math.pi * r * r * r
155
+
156
+ m = density * v
157
+ Ia = 2.0 / 5.0 * m * r * r
158
+
159
+ I = wp.mat33([[Ia, 0.0, 0.0], [0.0, Ia, 0.0], [0.0, 0.0, Ia]])
160
+
161
+ return (m, wp.vec3(), I)
162
+
163
+
164
+ def compute_capsule_inertia(density: float, r: float, h: float) -> tuple:
165
+ """Helper to compute mass and inertia of a solid capsule extending along the y-axis
166
+
167
+ Args:
168
+ density: The capsule density
169
+ r: The capsule radius
170
+ h: The capsule height (full height of the interior cylinder)
171
+
172
+ Returns:
173
+
174
+ A tuple of (mass, inertia) with inertia specified around the origin
175
+ """
176
+
177
+ ms = density * (4.0 / 3.0) * math.pi * r * r * r
178
+ mc = density * math.pi * r * r * h
179
+
180
+ # total mass
181
+ m = ms + mc
182
+
183
+ # adapted from ODE
184
+ Ia = mc * (0.25 * r * r + (1.0 / 12.0) * h * h) + ms * (0.4 * r * r + 0.375 * r * h + 0.25 * h * h)
185
+ Ib = (mc * 0.5 + ms * 0.4) * r * r
186
+
187
+ I = wp.mat33([[Ia, 0.0, 0.0], [0.0, Ib, 0.0], [0.0, 0.0, Ia]])
188
+
189
+ return (m, wp.vec3(), I)
190
+
191
+
192
+ def compute_cylinder_inertia(density: float, r: float, h: float) -> tuple:
193
+ """Helper to compute mass and inertia of a solid cylinder extending along the y-axis
194
+
195
+ Args:
196
+ density: The cylinder density
197
+ r: The cylinder radius
198
+ h: The cylinder height (extent along the y-axis)
199
+
200
+ Returns:
201
+
202
+ A tuple of (mass, inertia) with inertia specified around the origin
203
+ """
204
+
205
+ m = density * math.pi * r * r * h
206
+
207
+ Ia = 1 / 12 * m * (3 * r * r + h * h)
208
+ Ib = 1 / 2 * m * r * r
209
+
210
+ I = wp.mat33([[Ia, 0.0, 0.0], [0.0, Ib, 0.0], [0.0, 0.0, Ia]])
211
+
212
+ return (m, wp.vec3(), I)
213
+
214
+
215
+ def compute_cone_inertia(density: float, r: float, h: float) -> tuple:
216
+ """Helper to compute mass and inertia of a solid cone extending along the y-axis
217
+
218
+ Args:
219
+ density: The cone density
220
+ r: The cone radius
221
+ h: The cone height (extent along the y-axis)
222
+
223
+ Returns:
224
+
225
+ A tuple of (mass, inertia) with inertia specified around the origin
226
+ """
227
+
228
+ m = density * math.pi * r * r * h / 3.0
229
+
230
+ Ia = 1 / 20 * m * (3 * r * r + 2 * h * h)
231
+ Ib = 3 / 10 * m * r * r
232
+
233
+ I = wp.mat33([[Ia, 0.0, 0.0], [0.0, Ib, 0.0], [0.0, 0.0, Ia]])
234
+
235
+ return (m, wp.vec3(), I)
236
+
237
+
238
+ def compute_box_inertia(density: float, w: float, h: float, d: float) -> tuple:
239
+ """Helper to compute mass and inertia of a solid box
240
+
241
+ Args:
242
+ density: The box density
243
+ w: The box width along the x-axis
244
+ h: The box height along the y-axis
245
+ d: The box depth along the z-axis
246
+
247
+ Returns:
248
+
249
+ A tuple of (mass, inertia) with inertia specified around the origin
250
+ """
251
+
252
+ v = w * h * d
253
+ m = density * v
254
+
255
+ Ia = 1.0 / 12.0 * m * (h * h + d * d)
256
+ Ib = 1.0 / 12.0 * m * (w * w + d * d)
257
+ Ic = 1.0 / 12.0 * m * (w * w + h * h)
258
+
259
+ I = wp.mat33([[Ia, 0.0, 0.0], [0.0, Ib, 0.0], [0.0, 0.0, Ic]])
260
+
261
+ return (m, wp.vec3(), I)
262
+
263
+
264
+ def compute_mesh_inertia(
265
+ density: float, vertices: list, indices: list, is_solid: bool = True, thickness: Union[List[float], float] = 0.001
266
+ ) -> tuple:
267
+ """Computes mass, center of mass, 3x3 inertia matrix, and volume for a mesh."""
268
+ com = wp.vec3(np.mean(vertices, 0))
269
+
270
+ indices = np.array(indices).flatten()
271
+ num_tris = len(indices) // 3
272
+
273
+ # compute signed inertia for each tetrahedron
274
+ # formed with the interior point, using an order-2
275
+ # quadrature: https://www.sciencedirect.com/science/article/pii/S0377042712001604#br000040
276
+
277
+ # Allocating for mass and inertia
278
+ I_warp = wp.zeros(1, dtype=wp.mat33)
279
+ mass_warp = wp.zeros(1, dtype=float)
280
+ vol_warp = wp.zeros(1, dtype=float)
281
+
282
+ if is_solid:
283
+ weight = 0.25
284
+ # alpha = math.sqrt(5.0) / 5.0
285
+ wp.launch(
286
+ kernel=compute_solid_mesh_inertia,
287
+ dim=num_tris,
288
+ inputs=[
289
+ com,
290
+ weight,
291
+ wp.array(indices, dtype=int),
292
+ wp.array(vertices, dtype=wp.vec3),
293
+ ],
294
+ outputs=[mass_warp, I_warp, vol_warp],
295
+ )
296
+ else:
297
+ weight = 0.25 * density
298
+ if isinstance(thickness, float):
299
+ thickness = [thickness] * len(vertices)
300
+ wp.launch(
301
+ kernel=compute_hollow_mesh_inertia,
302
+ dim=num_tris,
303
+ inputs=[
304
+ com,
305
+ weight,
306
+ wp.array(indices, dtype=int),
307
+ wp.array(vertices, dtype=wp.vec3),
308
+ wp.array(thickness, dtype=float),
309
+ ],
310
+ outputs=[mass_warp, I_warp, vol_warp],
311
+ )
312
+
313
+ # Extract mass and inertia and save to class attributes.
314
+ mass = float(mass_warp.numpy()[0] * density)
315
+ I = wp.mat33(*(I_warp.numpy()[0] * density))
316
+ volume = float(vol_warp.numpy()[0])
317
+ return mass, com, I, volume
318
+
319
+
320
+ def transform_inertia(m, I, p, q):
321
+ R = wp.quat_to_matrix(q)
322
+
323
+ # Steiner's theorem
324
+ return R @ I @ wp.transpose(R) + m * (wp.dot(p, p) * wp.mat33(np.eye(3)) - wp.outer(p, p))
warp/sim/integrator.py ADDED
@@ -0,0 +1,242 @@
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 warp as wp
17
+
18
+ from .model import PARTICLE_FLAG_ACTIVE, Control, Model, State
19
+
20
+
21
+ @wp.kernel
22
+ def integrate_particles(
23
+ x: wp.array(dtype=wp.vec3),
24
+ v: wp.array(dtype=wp.vec3),
25
+ f: wp.array(dtype=wp.vec3),
26
+ w: wp.array(dtype=float),
27
+ particle_flags: wp.array(dtype=wp.uint32),
28
+ gravity: wp.vec3,
29
+ dt: float,
30
+ v_max: float,
31
+ x_new: wp.array(dtype=wp.vec3),
32
+ v_new: wp.array(dtype=wp.vec3),
33
+ ):
34
+ tid = wp.tid()
35
+ if (particle_flags[tid] & PARTICLE_FLAG_ACTIVE) == 0:
36
+ return
37
+
38
+ x0 = x[tid]
39
+ v0 = v[tid]
40
+ f0 = f[tid]
41
+
42
+ inv_mass = w[tid]
43
+
44
+ # simple semi-implicit Euler. v1 = v0 + a dt, x1 = x0 + v1 dt
45
+ v1 = v0 + (f0 * inv_mass + gravity * wp.step(-inv_mass)) * dt
46
+ # enforce velocity limit to prevent instability
47
+ v1_mag = wp.length(v1)
48
+ if v1_mag > v_max:
49
+ v1 *= v_max / v1_mag
50
+ x1 = x0 + v1 * dt
51
+
52
+ x_new[tid] = x1
53
+ v_new[tid] = v1
54
+
55
+
56
+ @wp.func
57
+ def integrate_rigid_body(
58
+ q: wp.transform,
59
+ qd: wp.spatial_vector,
60
+ f: wp.spatial_vector,
61
+ com: wp.vec3,
62
+ inertia: wp.mat33,
63
+ inv_mass: float,
64
+ inv_inertia: wp.mat33,
65
+ gravity: wp.vec3,
66
+ angular_damping: float,
67
+ dt: float,
68
+ ):
69
+ # unpack transform
70
+ x0 = wp.transform_get_translation(q)
71
+ r0 = wp.transform_get_rotation(q)
72
+
73
+ # unpack spatial twist
74
+ w0 = wp.spatial_top(qd)
75
+ v0 = wp.spatial_bottom(qd)
76
+
77
+ # unpack spatial wrench
78
+ t0 = wp.spatial_top(f)
79
+ f0 = wp.spatial_bottom(f)
80
+
81
+ x_com = x0 + wp.quat_rotate(r0, com)
82
+
83
+ # linear part
84
+ v1 = v0 + (f0 * inv_mass + gravity * wp.nonzero(inv_mass)) * dt
85
+ x1 = x_com + v1 * dt
86
+
87
+ # angular part (compute in body frame)
88
+ wb = wp.quat_rotate_inv(r0, w0)
89
+ tb = wp.quat_rotate_inv(r0, t0) - wp.cross(wb, inertia * wb) # coriolis forces
90
+
91
+ w1 = wp.quat_rotate(r0, wb + inv_inertia * tb * dt)
92
+ r1 = wp.normalize(r0 + wp.quat(w1, 0.0) * r0 * 0.5 * dt)
93
+
94
+ # angular damping
95
+ w1 *= 1.0 - angular_damping * dt
96
+
97
+ q_new = wp.transform(x1 - wp.quat_rotate(r1, com), r1)
98
+ qd_new = wp.spatial_vector(w1, v1)
99
+
100
+ return q_new, qd_new
101
+
102
+
103
+ # semi-implicit Euler integration
104
+ @wp.kernel
105
+ def integrate_bodies(
106
+ body_q: wp.array(dtype=wp.transform),
107
+ body_qd: wp.array(dtype=wp.spatial_vector),
108
+ body_f: wp.array(dtype=wp.spatial_vector),
109
+ body_com: wp.array(dtype=wp.vec3),
110
+ m: wp.array(dtype=float),
111
+ I: wp.array(dtype=wp.mat33),
112
+ inv_m: wp.array(dtype=float),
113
+ inv_I: wp.array(dtype=wp.mat33),
114
+ gravity: wp.vec3,
115
+ angular_damping: float,
116
+ dt: float,
117
+ # outputs
118
+ body_q_new: wp.array(dtype=wp.transform),
119
+ body_qd_new: wp.array(dtype=wp.spatial_vector),
120
+ ):
121
+ tid = wp.tid()
122
+
123
+ # positions
124
+ q = body_q[tid]
125
+ qd = body_qd[tid]
126
+ f = body_f[tid]
127
+
128
+ # masses
129
+ inv_mass = inv_m[tid] # 1 / mass
130
+
131
+ inertia = I[tid]
132
+ inv_inertia = inv_I[tid] # inverse of 3x3 inertia matrix
133
+
134
+ com = body_com[tid]
135
+
136
+ q_new, qd_new = integrate_rigid_body(
137
+ q,
138
+ qd,
139
+ f,
140
+ com,
141
+ inertia,
142
+ inv_mass,
143
+ inv_inertia,
144
+ gravity,
145
+ angular_damping,
146
+ dt,
147
+ )
148
+
149
+ body_q_new[tid] = q_new
150
+ body_qd_new[tid] = qd_new
151
+
152
+
153
+ class Integrator:
154
+ """
155
+ Generic base class for integrators. Provides methods to integrate rigid bodies and particles.
156
+ """
157
+
158
+ def integrate_bodies(
159
+ self,
160
+ model: Model,
161
+ state_in: State,
162
+ state_out: State,
163
+ dt: float,
164
+ angular_damping: float = 0.0,
165
+ ):
166
+ """
167
+ Integrate the rigid bodies of the model.
168
+
169
+ Args:
170
+ model (Model): The model to integrate.
171
+ state_in (State): The input state.
172
+ state_out (State): The output state.
173
+ dt (float): The time step (typically in seconds).
174
+ angular_damping (float, optional): The angular damping factor. Defaults to 0.0.
175
+ """
176
+ if model.body_count:
177
+ wp.launch(
178
+ kernel=integrate_bodies,
179
+ dim=model.body_count,
180
+ inputs=[
181
+ state_in.body_q,
182
+ state_in.body_qd,
183
+ state_in.body_f,
184
+ model.body_com,
185
+ model.body_mass,
186
+ model.body_inertia,
187
+ model.body_inv_mass,
188
+ model.body_inv_inertia,
189
+ model.gravity,
190
+ angular_damping,
191
+ dt,
192
+ ],
193
+ outputs=[state_out.body_q, state_out.body_qd],
194
+ device=model.device,
195
+ )
196
+
197
+ def integrate_particles(
198
+ self,
199
+ model: Model,
200
+ state_in: State,
201
+ state_out: State,
202
+ dt: float,
203
+ ):
204
+ """
205
+ Integrate the particles of the model.
206
+
207
+ Args:
208
+ model (Model): The model to integrate.
209
+ state_in (State): The input state.
210
+ state_out (State): The output state.
211
+ dt (float): The time step (typically in seconds).
212
+ """
213
+ if model.particle_count:
214
+ wp.launch(
215
+ kernel=integrate_particles,
216
+ dim=model.particle_count,
217
+ inputs=[
218
+ state_in.particle_q,
219
+ state_in.particle_qd,
220
+ state_in.particle_f,
221
+ model.particle_inv_mass,
222
+ model.particle_flags,
223
+ model.gravity,
224
+ dt,
225
+ model.particle_max_velocity,
226
+ ],
227
+ outputs=[state_out.particle_q, state_out.particle_qd],
228
+ device=model.device,
229
+ )
230
+
231
+ def simulate(self, model: Model, state_in: State, state_out: State, dt: float, control: Control = None):
232
+ """
233
+ Simulate the model for a given time step using the given control input.
234
+
235
+ Args:
236
+ model (Model): The model to simulate.
237
+ state_in (State): The input state.
238
+ state_out (State): The output state.
239
+ dt (float): The time step (typically in seconds).
240
+ control (Control): The control input. Defaults to `None` which means the control values from the :class:`Model` are used.
241
+ """
242
+ raise NotImplementedError()