warp-lang 1.7.0__py3-none-manylinux_2_34_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of warp-lang might be problematic. Click here for more details.

Files changed (429) hide show
  1. warp/__init__.py +139 -0
  2. warp/__init__.pyi +1 -0
  3. warp/autograd.py +1142 -0
  4. warp/bin/warp-clang.so +0 -0
  5. warp/bin/warp.so +0 -0
  6. warp/build.py +557 -0
  7. warp/build_dll.py +405 -0
  8. warp/builtins.py +6855 -0
  9. warp/codegen.py +3969 -0
  10. warp/config.py +158 -0
  11. warp/constants.py +57 -0
  12. warp/context.py +6812 -0
  13. warp/dlpack.py +462 -0
  14. warp/examples/__init__.py +24 -0
  15. warp/examples/assets/bear.usd +0 -0
  16. warp/examples/assets/bunny.usd +0 -0
  17. warp/examples/assets/cartpole.urdf +110 -0
  18. warp/examples/assets/crazyflie.usd +0 -0
  19. warp/examples/assets/cube.usd +0 -0
  20. warp/examples/assets/nonuniform.usd +0 -0
  21. warp/examples/assets/nv_ant.xml +92 -0
  22. warp/examples/assets/nv_humanoid.xml +183 -0
  23. warp/examples/assets/nvidia_logo.png +0 -0
  24. warp/examples/assets/pixel.jpg +0 -0
  25. warp/examples/assets/quadruped.urdf +268 -0
  26. warp/examples/assets/rocks.nvdb +0 -0
  27. warp/examples/assets/rocks.usd +0 -0
  28. warp/examples/assets/sphere.usd +0 -0
  29. warp/examples/assets/square_cloth.usd +0 -0
  30. warp/examples/benchmarks/benchmark_api.py +389 -0
  31. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  32. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  33. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  34. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  35. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  36. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  37. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  38. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  39. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  40. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  41. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  42. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  43. warp/examples/benchmarks/benchmark_launches.py +301 -0
  44. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  45. warp/examples/browse.py +37 -0
  46. warp/examples/core/example_cupy.py +86 -0
  47. warp/examples/core/example_dem.py +241 -0
  48. warp/examples/core/example_fluid.py +299 -0
  49. warp/examples/core/example_graph_capture.py +150 -0
  50. warp/examples/core/example_marching_cubes.py +194 -0
  51. warp/examples/core/example_mesh.py +180 -0
  52. warp/examples/core/example_mesh_intersect.py +211 -0
  53. warp/examples/core/example_nvdb.py +182 -0
  54. warp/examples/core/example_raycast.py +111 -0
  55. warp/examples/core/example_raymarch.py +205 -0
  56. warp/examples/core/example_render_opengl.py +193 -0
  57. warp/examples/core/example_sample_mesh.py +300 -0
  58. warp/examples/core/example_sph.py +411 -0
  59. warp/examples/core/example_torch.py +211 -0
  60. warp/examples/core/example_wave.py +269 -0
  61. warp/examples/fem/example_adaptive_grid.py +286 -0
  62. warp/examples/fem/example_apic_fluid.py +423 -0
  63. warp/examples/fem/example_burgers.py +261 -0
  64. warp/examples/fem/example_convection_diffusion.py +178 -0
  65. warp/examples/fem/example_convection_diffusion_dg.py +204 -0
  66. warp/examples/fem/example_deformed_geometry.py +172 -0
  67. warp/examples/fem/example_diffusion.py +196 -0
  68. warp/examples/fem/example_diffusion_3d.py +225 -0
  69. warp/examples/fem/example_diffusion_mgpu.py +220 -0
  70. warp/examples/fem/example_distortion_energy.py +228 -0
  71. warp/examples/fem/example_magnetostatics.py +240 -0
  72. warp/examples/fem/example_mixed_elasticity.py +291 -0
  73. warp/examples/fem/example_navier_stokes.py +261 -0
  74. warp/examples/fem/example_nonconforming_contact.py +298 -0
  75. warp/examples/fem/example_stokes.py +213 -0
  76. warp/examples/fem/example_stokes_transfer.py +262 -0
  77. warp/examples/fem/example_streamlines.py +352 -0
  78. warp/examples/fem/utils.py +1000 -0
  79. warp/examples/interop/example_jax_callable.py +116 -0
  80. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  81. warp/examples/interop/example_jax_kernel.py +205 -0
  82. warp/examples/optim/example_bounce.py +266 -0
  83. warp/examples/optim/example_cloth_throw.py +228 -0
  84. warp/examples/optim/example_diffray.py +561 -0
  85. warp/examples/optim/example_drone.py +870 -0
  86. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  87. warp/examples/optim/example_inverse_kinematics.py +182 -0
  88. warp/examples/optim/example_inverse_kinematics_torch.py +191 -0
  89. warp/examples/optim/example_softbody_properties.py +400 -0
  90. warp/examples/optim/example_spring_cage.py +245 -0
  91. warp/examples/optim/example_trajectory.py +227 -0
  92. warp/examples/sim/example_cartpole.py +143 -0
  93. warp/examples/sim/example_cloth.py +225 -0
  94. warp/examples/sim/example_cloth_self_contact.py +322 -0
  95. warp/examples/sim/example_granular.py +130 -0
  96. warp/examples/sim/example_granular_collision_sdf.py +202 -0
  97. warp/examples/sim/example_jacobian_ik.py +244 -0
  98. warp/examples/sim/example_particle_chain.py +124 -0
  99. warp/examples/sim/example_quadruped.py +203 -0
  100. warp/examples/sim/example_rigid_chain.py +203 -0
  101. warp/examples/sim/example_rigid_contact.py +195 -0
  102. warp/examples/sim/example_rigid_force.py +133 -0
  103. warp/examples/sim/example_rigid_gyroscopic.py +115 -0
  104. warp/examples/sim/example_rigid_soft_contact.py +140 -0
  105. warp/examples/sim/example_soft_body.py +196 -0
  106. warp/examples/tile/example_tile_cholesky.py +87 -0
  107. warp/examples/tile/example_tile_convolution.py +66 -0
  108. warp/examples/tile/example_tile_fft.py +55 -0
  109. warp/examples/tile/example_tile_filtering.py +113 -0
  110. warp/examples/tile/example_tile_matmul.py +85 -0
  111. warp/examples/tile/example_tile_mlp.py +383 -0
  112. warp/examples/tile/example_tile_nbody.py +199 -0
  113. warp/examples/tile/example_tile_walker.py +327 -0
  114. warp/fabric.py +355 -0
  115. warp/fem/__init__.py +106 -0
  116. warp/fem/adaptivity.py +508 -0
  117. warp/fem/cache.py +572 -0
  118. warp/fem/dirichlet.py +202 -0
  119. warp/fem/domain.py +411 -0
  120. warp/fem/field/__init__.py +125 -0
  121. warp/fem/field/field.py +619 -0
  122. warp/fem/field/nodal_field.py +326 -0
  123. warp/fem/field/restriction.py +37 -0
  124. warp/fem/field/virtual.py +848 -0
  125. warp/fem/geometry/__init__.py +32 -0
  126. warp/fem/geometry/adaptive_nanogrid.py +857 -0
  127. warp/fem/geometry/closest_point.py +84 -0
  128. warp/fem/geometry/deformed_geometry.py +221 -0
  129. warp/fem/geometry/element.py +776 -0
  130. warp/fem/geometry/geometry.py +362 -0
  131. warp/fem/geometry/grid_2d.py +392 -0
  132. warp/fem/geometry/grid_3d.py +452 -0
  133. warp/fem/geometry/hexmesh.py +911 -0
  134. warp/fem/geometry/nanogrid.py +571 -0
  135. warp/fem/geometry/partition.py +389 -0
  136. warp/fem/geometry/quadmesh.py +663 -0
  137. warp/fem/geometry/tetmesh.py +855 -0
  138. warp/fem/geometry/trimesh.py +806 -0
  139. warp/fem/integrate.py +2335 -0
  140. warp/fem/linalg.py +419 -0
  141. warp/fem/operator.py +293 -0
  142. warp/fem/polynomial.py +229 -0
  143. warp/fem/quadrature/__init__.py +17 -0
  144. warp/fem/quadrature/pic_quadrature.py +299 -0
  145. warp/fem/quadrature/quadrature.py +591 -0
  146. warp/fem/space/__init__.py +228 -0
  147. warp/fem/space/basis_function_space.py +468 -0
  148. warp/fem/space/basis_space.py +667 -0
  149. warp/fem/space/dof_mapper.py +251 -0
  150. warp/fem/space/function_space.py +309 -0
  151. warp/fem/space/grid_2d_function_space.py +177 -0
  152. warp/fem/space/grid_3d_function_space.py +227 -0
  153. warp/fem/space/hexmesh_function_space.py +257 -0
  154. warp/fem/space/nanogrid_function_space.py +201 -0
  155. warp/fem/space/partition.py +367 -0
  156. warp/fem/space/quadmesh_function_space.py +223 -0
  157. warp/fem/space/restriction.py +179 -0
  158. warp/fem/space/shape/__init__.py +143 -0
  159. warp/fem/space/shape/cube_shape_function.py +1105 -0
  160. warp/fem/space/shape/shape_function.py +133 -0
  161. warp/fem/space/shape/square_shape_function.py +926 -0
  162. warp/fem/space/shape/tet_shape_function.py +834 -0
  163. warp/fem/space/shape/triangle_shape_function.py +672 -0
  164. warp/fem/space/tetmesh_function_space.py +271 -0
  165. warp/fem/space/topology.py +424 -0
  166. warp/fem/space/trimesh_function_space.py +194 -0
  167. warp/fem/types.py +99 -0
  168. warp/fem/utils.py +420 -0
  169. warp/jax.py +187 -0
  170. warp/jax_experimental/__init__.py +16 -0
  171. warp/jax_experimental/custom_call.py +351 -0
  172. warp/jax_experimental/ffi.py +698 -0
  173. warp/jax_experimental/xla_ffi.py +602 -0
  174. warp/math.py +244 -0
  175. warp/native/array.h +1145 -0
  176. warp/native/builtin.h +1800 -0
  177. warp/native/bvh.cpp +492 -0
  178. warp/native/bvh.cu +791 -0
  179. warp/native/bvh.h +554 -0
  180. warp/native/clang/clang.cpp +536 -0
  181. warp/native/coloring.cpp +613 -0
  182. warp/native/crt.cpp +51 -0
  183. warp/native/crt.h +362 -0
  184. warp/native/cuda_crt.h +1058 -0
  185. warp/native/cuda_util.cpp +646 -0
  186. warp/native/cuda_util.h +307 -0
  187. warp/native/error.cpp +77 -0
  188. warp/native/error.h +36 -0
  189. warp/native/exports.h +1878 -0
  190. warp/native/fabric.h +245 -0
  191. warp/native/hashgrid.cpp +311 -0
  192. warp/native/hashgrid.cu +87 -0
  193. warp/native/hashgrid.h +240 -0
  194. warp/native/initializer_array.h +41 -0
  195. warp/native/intersect.h +1230 -0
  196. warp/native/intersect_adj.h +375 -0
  197. warp/native/intersect_tri.h +339 -0
  198. warp/native/marching.cpp +19 -0
  199. warp/native/marching.cu +514 -0
  200. warp/native/marching.h +19 -0
  201. warp/native/mat.h +2220 -0
  202. warp/native/mathdx.cpp +87 -0
  203. warp/native/matnn.h +343 -0
  204. warp/native/mesh.cpp +266 -0
  205. warp/native/mesh.cu +404 -0
  206. warp/native/mesh.h +1980 -0
  207. warp/native/nanovdb/GridHandle.h +366 -0
  208. warp/native/nanovdb/HostBuffer.h +590 -0
  209. warp/native/nanovdb/NanoVDB.h +6624 -0
  210. warp/native/nanovdb/PNanoVDB.h +3390 -0
  211. warp/native/noise.h +859 -0
  212. warp/native/quat.h +1371 -0
  213. warp/native/rand.h +342 -0
  214. warp/native/range.h +139 -0
  215. warp/native/reduce.cpp +174 -0
  216. warp/native/reduce.cu +364 -0
  217. warp/native/runlength_encode.cpp +79 -0
  218. warp/native/runlength_encode.cu +61 -0
  219. warp/native/scan.cpp +47 -0
  220. warp/native/scan.cu +53 -0
  221. warp/native/scan.h +23 -0
  222. warp/native/solid_angle.h +466 -0
  223. warp/native/sort.cpp +251 -0
  224. warp/native/sort.cu +277 -0
  225. warp/native/sort.h +33 -0
  226. warp/native/sparse.cpp +378 -0
  227. warp/native/sparse.cu +524 -0
  228. warp/native/spatial.h +657 -0
  229. warp/native/svd.h +702 -0
  230. warp/native/temp_buffer.h +46 -0
  231. warp/native/tile.h +2584 -0
  232. warp/native/tile_reduce.h +264 -0
  233. warp/native/vec.h +1426 -0
  234. warp/native/volume.cpp +501 -0
  235. warp/native/volume.cu +67 -0
  236. warp/native/volume.h +969 -0
  237. warp/native/volume_builder.cu +477 -0
  238. warp/native/volume_builder.h +52 -0
  239. warp/native/volume_impl.h +70 -0
  240. warp/native/warp.cpp +1082 -0
  241. warp/native/warp.cu +3636 -0
  242. warp/native/warp.h +381 -0
  243. warp/optim/__init__.py +17 -0
  244. warp/optim/adam.py +163 -0
  245. warp/optim/linear.py +1137 -0
  246. warp/optim/sgd.py +112 -0
  247. warp/paddle.py +407 -0
  248. warp/render/__init__.py +18 -0
  249. warp/render/render_opengl.py +3518 -0
  250. warp/render/render_usd.py +784 -0
  251. warp/render/utils.py +160 -0
  252. warp/sim/__init__.py +65 -0
  253. warp/sim/articulation.py +793 -0
  254. warp/sim/collide.py +2395 -0
  255. warp/sim/graph_coloring.py +300 -0
  256. warp/sim/import_mjcf.py +790 -0
  257. warp/sim/import_snu.py +227 -0
  258. warp/sim/import_urdf.py +579 -0
  259. warp/sim/import_usd.py +894 -0
  260. warp/sim/inertia.py +324 -0
  261. warp/sim/integrator.py +242 -0
  262. warp/sim/integrator_euler.py +1997 -0
  263. warp/sim/integrator_featherstone.py +2101 -0
  264. warp/sim/integrator_vbd.py +2048 -0
  265. warp/sim/integrator_xpbd.py +3292 -0
  266. warp/sim/model.py +4791 -0
  267. warp/sim/particles.py +121 -0
  268. warp/sim/render.py +427 -0
  269. warp/sim/utils.py +428 -0
  270. warp/sparse.py +2057 -0
  271. warp/stubs.py +3333 -0
  272. warp/tape.py +1203 -0
  273. warp/tests/__init__.py +1 -0
  274. warp/tests/__main__.py +4 -0
  275. warp/tests/assets/curlnoise_golden.npy +0 -0
  276. warp/tests/assets/mlp_golden.npy +0 -0
  277. warp/tests/assets/pixel.npy +0 -0
  278. warp/tests/assets/pnoise_golden.npy +0 -0
  279. warp/tests/assets/spiky.usd +0 -0
  280. warp/tests/assets/test_grid.nvdb +0 -0
  281. warp/tests/assets/test_index_grid.nvdb +0 -0
  282. warp/tests/assets/test_int32_grid.nvdb +0 -0
  283. warp/tests/assets/test_vec_grid.nvdb +0 -0
  284. warp/tests/assets/torus.nvdb +0 -0
  285. warp/tests/assets/torus.usda +105 -0
  286. warp/tests/aux_test_class_kernel.py +34 -0
  287. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  288. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  289. warp/tests/aux_test_dependent.py +29 -0
  290. warp/tests/aux_test_grad_customs.py +29 -0
  291. warp/tests/aux_test_instancing_gc.py +26 -0
  292. warp/tests/aux_test_module_unload.py +23 -0
  293. warp/tests/aux_test_name_clash1.py +40 -0
  294. warp/tests/aux_test_name_clash2.py +40 -0
  295. warp/tests/aux_test_reference.py +9 -0
  296. warp/tests/aux_test_reference_reference.py +8 -0
  297. warp/tests/aux_test_square.py +16 -0
  298. warp/tests/aux_test_unresolved_func.py +22 -0
  299. warp/tests/aux_test_unresolved_symbol.py +22 -0
  300. warp/tests/cuda/__init__.py +0 -0
  301. warp/tests/cuda/test_async.py +676 -0
  302. warp/tests/cuda/test_ipc.py +124 -0
  303. warp/tests/cuda/test_mempool.py +233 -0
  304. warp/tests/cuda/test_multigpu.py +169 -0
  305. warp/tests/cuda/test_peer.py +139 -0
  306. warp/tests/cuda/test_pinned.py +84 -0
  307. warp/tests/cuda/test_streams.py +634 -0
  308. warp/tests/geometry/__init__.py +0 -0
  309. warp/tests/geometry/test_bvh.py +200 -0
  310. warp/tests/geometry/test_hash_grid.py +221 -0
  311. warp/tests/geometry/test_marching_cubes.py +74 -0
  312. warp/tests/geometry/test_mesh.py +316 -0
  313. warp/tests/geometry/test_mesh_query_aabb.py +399 -0
  314. warp/tests/geometry/test_mesh_query_point.py +932 -0
  315. warp/tests/geometry/test_mesh_query_ray.py +311 -0
  316. warp/tests/geometry/test_volume.py +1103 -0
  317. warp/tests/geometry/test_volume_write.py +346 -0
  318. warp/tests/interop/__init__.py +0 -0
  319. warp/tests/interop/test_dlpack.py +729 -0
  320. warp/tests/interop/test_jax.py +371 -0
  321. warp/tests/interop/test_paddle.py +800 -0
  322. warp/tests/interop/test_torch.py +1001 -0
  323. warp/tests/run_coverage_serial.py +39 -0
  324. warp/tests/sim/__init__.py +0 -0
  325. warp/tests/sim/disabled_kinematics.py +244 -0
  326. warp/tests/sim/flaky_test_sim_grad.py +290 -0
  327. warp/tests/sim/test_collision.py +604 -0
  328. warp/tests/sim/test_coloring.py +258 -0
  329. warp/tests/sim/test_model.py +224 -0
  330. warp/tests/sim/test_sim_grad_bounce_linear.py +212 -0
  331. warp/tests/sim/test_sim_kinematics.py +98 -0
  332. warp/tests/sim/test_vbd.py +597 -0
  333. warp/tests/test_adam.py +163 -0
  334. warp/tests/test_arithmetic.py +1096 -0
  335. warp/tests/test_array.py +2972 -0
  336. warp/tests/test_array_reduce.py +156 -0
  337. warp/tests/test_assert.py +250 -0
  338. warp/tests/test_atomic.py +153 -0
  339. warp/tests/test_bool.py +220 -0
  340. warp/tests/test_builtins_resolution.py +1298 -0
  341. warp/tests/test_closest_point_edge_edge.py +327 -0
  342. warp/tests/test_codegen.py +810 -0
  343. warp/tests/test_codegen_instancing.py +1495 -0
  344. warp/tests/test_compile_consts.py +215 -0
  345. warp/tests/test_conditional.py +252 -0
  346. warp/tests/test_context.py +42 -0
  347. warp/tests/test_copy.py +238 -0
  348. warp/tests/test_ctypes.py +638 -0
  349. warp/tests/test_dense.py +73 -0
  350. warp/tests/test_devices.py +97 -0
  351. warp/tests/test_examples.py +482 -0
  352. warp/tests/test_fabricarray.py +996 -0
  353. warp/tests/test_fast_math.py +74 -0
  354. warp/tests/test_fem.py +2003 -0
  355. warp/tests/test_fp16.py +136 -0
  356. warp/tests/test_func.py +454 -0
  357. warp/tests/test_future_annotations.py +98 -0
  358. warp/tests/test_generics.py +656 -0
  359. warp/tests/test_grad.py +893 -0
  360. warp/tests/test_grad_customs.py +339 -0
  361. warp/tests/test_grad_debug.py +341 -0
  362. warp/tests/test_implicit_init.py +411 -0
  363. warp/tests/test_import.py +45 -0
  364. warp/tests/test_indexedarray.py +1140 -0
  365. warp/tests/test_intersect.py +73 -0
  366. warp/tests/test_iter.py +76 -0
  367. warp/tests/test_large.py +177 -0
  368. warp/tests/test_launch.py +411 -0
  369. warp/tests/test_lerp.py +151 -0
  370. warp/tests/test_linear_solvers.py +193 -0
  371. warp/tests/test_lvalue.py +427 -0
  372. warp/tests/test_mat.py +2089 -0
  373. warp/tests/test_mat_lite.py +122 -0
  374. warp/tests/test_mat_scalar_ops.py +2913 -0
  375. warp/tests/test_math.py +178 -0
  376. warp/tests/test_mlp.py +282 -0
  377. warp/tests/test_module_hashing.py +258 -0
  378. warp/tests/test_modules_lite.py +44 -0
  379. warp/tests/test_noise.py +252 -0
  380. warp/tests/test_operators.py +299 -0
  381. warp/tests/test_options.py +129 -0
  382. warp/tests/test_overwrite.py +551 -0
  383. warp/tests/test_print.py +339 -0
  384. warp/tests/test_quat.py +2315 -0
  385. warp/tests/test_rand.py +339 -0
  386. warp/tests/test_reload.py +302 -0
  387. warp/tests/test_rounding.py +185 -0
  388. warp/tests/test_runlength_encode.py +196 -0
  389. warp/tests/test_scalar_ops.py +105 -0
  390. warp/tests/test_smoothstep.py +108 -0
  391. warp/tests/test_snippet.py +318 -0
  392. warp/tests/test_sparse.py +582 -0
  393. warp/tests/test_spatial.py +2229 -0
  394. warp/tests/test_special_values.py +361 -0
  395. warp/tests/test_static.py +592 -0
  396. warp/tests/test_struct.py +734 -0
  397. warp/tests/test_tape.py +204 -0
  398. warp/tests/test_transient_module.py +93 -0
  399. warp/tests/test_triangle_closest_point.py +145 -0
  400. warp/tests/test_types.py +562 -0
  401. warp/tests/test_utils.py +588 -0
  402. warp/tests/test_vec.py +1487 -0
  403. warp/tests/test_vec_lite.py +80 -0
  404. warp/tests/test_vec_scalar_ops.py +2327 -0
  405. warp/tests/test_verify_fp.py +100 -0
  406. warp/tests/tile/__init__.py +0 -0
  407. warp/tests/tile/test_tile.py +780 -0
  408. warp/tests/tile/test_tile_load.py +407 -0
  409. warp/tests/tile/test_tile_mathdx.py +208 -0
  410. warp/tests/tile/test_tile_mlp.py +402 -0
  411. warp/tests/tile/test_tile_reduce.py +447 -0
  412. warp/tests/tile/test_tile_shared_memory.py +247 -0
  413. warp/tests/tile/test_tile_view.py +173 -0
  414. warp/tests/unittest_serial.py +47 -0
  415. warp/tests/unittest_suites.py +427 -0
  416. warp/tests/unittest_utils.py +468 -0
  417. warp/tests/walkthrough_debug.py +93 -0
  418. warp/thirdparty/__init__.py +0 -0
  419. warp/thirdparty/appdirs.py +598 -0
  420. warp/thirdparty/dlpack.py +145 -0
  421. warp/thirdparty/unittest_parallel.py +570 -0
  422. warp/torch.py +391 -0
  423. warp/types.py +5230 -0
  424. warp/utils.py +1137 -0
  425. warp_lang-1.7.0.dist-info/METADATA +516 -0
  426. warp_lang-1.7.0.dist-info/RECORD +429 -0
  427. warp_lang-1.7.0.dist-info/WHEEL +5 -0
  428. warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
  429. warp_lang-1.7.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,191 @@
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 Sim Rigid Kinematics
18
+ #
19
+ # Tests rigid body forward and backwards kinematics through the
20
+ # wp.sim.eval_ik() and wp.sim.eval_fk() methods. Shows how to connect
21
+ # gradients from Warp to PyTorch, through custom autograd nodes.
22
+ #
23
+ ###########################################################################
24
+
25
+ import numpy as np
26
+ import torch
27
+
28
+ import warp as wp
29
+ import warp.sim
30
+ import warp.sim.render
31
+
32
+
33
+ class ForwardKinematics(torch.autograd.Function):
34
+ @staticmethod
35
+ def forward(ctx, joint_q, joint_qd, model):
36
+ ctx.tape = wp.Tape()
37
+ ctx.model = model
38
+ ctx.joint_q = wp.from_torch(joint_q)
39
+ ctx.joint_qd = wp.from_torch(joint_qd)
40
+
41
+ # allocate output
42
+ ctx.state = model.state()
43
+
44
+ with ctx.tape:
45
+ wp.sim.eval_fk(model, ctx.joint_q, ctx.joint_qd, None, ctx.state)
46
+
47
+ return (wp.to_torch(ctx.state.body_q), wp.to_torch(ctx.state.body_qd))
48
+
49
+ @staticmethod
50
+ def backward(ctx, adj_body_q, adj_body_qd):
51
+ # map incoming Torch grads to our output variables
52
+ ctx.state.body_q.grad = wp.from_torch(adj_body_q, dtype=wp.transform)
53
+ ctx.state.body_qd.grad = wp.from_torch(adj_body_qd, dtype=wp.spatial_vector)
54
+
55
+ ctx.tape.backward()
56
+
57
+ # return adjoint w.r.t. inputs
58
+ return (wp.to_torch(ctx.tape.gradients[ctx.joint_q]), wp.to_torch(ctx.tape.gradients[ctx.joint_qd]), None)
59
+
60
+
61
+ class Example:
62
+ def __init__(self, stage_path="example_inverse_kinematics_torch.usd", verbose=False):
63
+ self.verbose = verbose
64
+
65
+ fps = 60
66
+ self.frame_dt = 1.0 / fps
67
+ self.render_time = 0.0
68
+
69
+ builder = wp.sim.ModelBuilder()
70
+ builder.add_articulation()
71
+
72
+ chain_length = 4
73
+ chain_width = 1.0
74
+
75
+ for i in range(chain_length):
76
+ if i == 0:
77
+ parent = -1
78
+ parent_joint_xform = wp.transform([0.0, 0.0, 0.0], wp.quat_identity())
79
+ else:
80
+ parent = builder.joint_count - 1
81
+ parent_joint_xform = wp.transform([chain_width, 0.0, 0.0], wp.quat_identity())
82
+
83
+ # create body
84
+ b = builder.add_body(origin=wp.transform([i, 0.0, 0.0], wp.quat_identity()), armature=0.1)
85
+
86
+ builder.add_joint_revolute(
87
+ parent=parent,
88
+ child=b,
89
+ axis=wp.vec3(0.0, 0.0, 1.0),
90
+ parent_xform=parent_joint_xform,
91
+ child_xform=wp.transform_identity(),
92
+ limit_lower=-np.deg2rad(60.0),
93
+ limit_upper=np.deg2rad(60.0),
94
+ target_ke=0.0,
95
+ target_kd=0.0,
96
+ limit_ke=30.0,
97
+ limit_kd=30.0,
98
+ )
99
+
100
+ if i == chain_length - 1:
101
+ # create end effector
102
+ builder.add_shape_sphere(pos=wp.vec3(0.0, 0.0, 0.0), radius=0.1, density=10.0, body=b)
103
+
104
+ else:
105
+ # create shape
106
+ builder.add_shape_box(
107
+ pos=wp.vec3(chain_width * 0.5, 0.0, 0.0), hx=chain_width * 0.5, hy=0.1, hz=0.1, density=10.0, body=b
108
+ )
109
+
110
+ # finalize model
111
+ self.model = builder.finalize()
112
+ self.model.ground = False
113
+
114
+ self.torch_device = wp.device_to_torch(wp.get_device())
115
+
116
+ if stage_path:
117
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage_path, scaling=50.0)
118
+ else:
119
+ self.renderer = None
120
+
121
+ self.target = torch.from_numpy(np.array((2.0, 1.0, 0.0))).to(self.torch_device)
122
+
123
+ self.body_q = None
124
+ self.body_qd = None
125
+
126
+ # optimization variable
127
+ self.joint_q = torch.zeros(len(self.model.joint_q), requires_grad=True, device=self.torch_device)
128
+ self.joint_qd = torch.zeros(len(self.model.joint_qd), requires_grad=True, device=self.torch_device)
129
+
130
+ self.train_rate = 0.01
131
+
132
+ def forward(self):
133
+ (self.body_q, self.body_qd) = ForwardKinematics.apply(self.joint_q, self.joint_qd, self.model)
134
+ self.loss = torch.norm(self.body_q[self.model.body_count - 1][0:3] - self.target) ** 2.0
135
+
136
+ def step(self):
137
+ with wp.ScopedTimer("step"):
138
+ self.forward()
139
+ self.loss.backward()
140
+
141
+ if self.verbose:
142
+ print(f"loss: {self.loss}")
143
+ print(f"loss: {self.joint_q.grad}")
144
+
145
+ with torch.no_grad():
146
+ self.joint_q -= self.joint_q.grad * self.train_rate
147
+ self.joint_q.grad.zero_()
148
+
149
+ def render(self):
150
+ if self.renderer is None:
151
+ return
152
+
153
+ with wp.ScopedTimer("render"):
154
+ s = self.model.state()
155
+ s.body_q = wp.from_torch(self.body_q, dtype=wp.transform, requires_grad=False)
156
+ s.body_qd = wp.from_torch(self.body_qd, dtype=wp.spatial_vector, requires_grad=False)
157
+
158
+ self.renderer.begin_frame(self.render_time)
159
+ self.renderer.render(s)
160
+ self.renderer.render_sphere(
161
+ name="target", pos=self.target, rot=wp.quat_identity(), radius=0.1, color=(1.0, 0.0, 0.0)
162
+ )
163
+ self.renderer.end_frame()
164
+ self.render_time += self.frame_dt
165
+
166
+
167
+ if __name__ == "__main__":
168
+ import argparse
169
+
170
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
171
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
172
+ parser.add_argument(
173
+ "--stage_path",
174
+ type=lambda x: None if x == "None" else str(x),
175
+ default="example_inverse_kinematics_torch.usd",
176
+ help="Path to the output USD file.",
177
+ )
178
+ parser.add_argument("--train_iters", type=int, default=512, help="Total number of training iterations.")
179
+ parser.add_argument("--verbose", action="store_true", help="Print out additional status messages during execution.")
180
+
181
+ args = parser.parse_known_args()[0]
182
+
183
+ with wp.ScopedDevice(args.device):
184
+ example = Example(stage_path=args.stage_path, verbose=args.verbose)
185
+
186
+ for _ in range(args.train_iters):
187
+ example.step()
188
+ example.render()
189
+
190
+ if example.renderer:
191
+ example.renderer.save()
@@ -0,0 +1,400 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 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 FEM Bounce
18
+ #
19
+ # Shows how to use Warp to optimize for the material parameters of a soft body,
20
+ # such that it bounces off the wall and floor in order to hit a target.
21
+ #
22
+ # This example uses the built-in wp.Tape() object to compute gradients of
23
+ # the distance to target (loss) w.r.t the material parameters, followed by
24
+ # a simple gradient-descent optimization step.
25
+ #
26
+ ###########################################################################
27
+
28
+ import numpy as np
29
+
30
+ import warp as wp
31
+ import warp.optim
32
+ import warp.sim
33
+ import warp.sim.render
34
+
35
+
36
+ @wp.kernel
37
+ def assign_param(params: wp.array(dtype=wp.float32), tet_materials: wp.array2d(dtype=wp.float32)):
38
+ tid = wp.tid()
39
+ params_idx = 2 * wp.tid() % params.shape[0]
40
+ tet_materials[tid, 0] = params[params_idx]
41
+ tet_materials[tid, 1] = params[params_idx + 1]
42
+
43
+
44
+ @wp.kernel
45
+ def com_kernel(particle_q: wp.array(dtype=wp.vec3), com: wp.array(dtype=wp.vec3)):
46
+ tid = wp.tid()
47
+ point = particle_q[tid]
48
+ a = point / wp.float32(particle_q.shape[0])
49
+
50
+ # Atomically add the point coordinates to the accumulator
51
+ wp.atomic_add(com, 0, a)
52
+
53
+
54
+ @wp.kernel
55
+ def loss_kernel(
56
+ target: wp.vec3,
57
+ com: wp.array(dtype=wp.vec3),
58
+ pos_error: wp.array(dtype=float),
59
+ loss: wp.array(dtype=float),
60
+ ):
61
+ diff = com[0] - target
62
+ pos_error[0] = wp.dot(diff, diff)
63
+ norm = pos_error[0]
64
+ loss[0] = norm
65
+
66
+
67
+ @wp.kernel
68
+ def enforce_constraint_kernel(lower_bound: wp.float32, upper_bound: wp.float32, x: wp.array(dtype=wp.float32)):
69
+ tid = wp.tid()
70
+ if x[tid] < lower_bound:
71
+ x[tid] = lower_bound
72
+ elif x[tid] > upper_bound:
73
+ x[tid] = upper_bound
74
+
75
+
76
+ class Example:
77
+ def __init__(
78
+ self,
79
+ stage_path="example_softbody_properties.usd",
80
+ material_behavior="anisotropic",
81
+ verbose=False,
82
+ ):
83
+ self.verbose = verbose
84
+ self.material_behavior = material_behavior
85
+
86
+ # seconds
87
+ sim_duration = 1.0
88
+
89
+ # control frequency
90
+ fps = 60
91
+ self.frame_dt = 1.0 / fps
92
+ frame_steps = int(sim_duration / self.frame_dt)
93
+
94
+ # sim frequency
95
+ self.sim_substeps = 16
96
+ self.sim_steps = frame_steps * self.sim_substeps
97
+ self.sim_dt = self.frame_dt / self.sim_substeps
98
+
99
+ self.iter = 0
100
+ self.render_time = 0.0
101
+
102
+ self.train_rate = 1e7
103
+
104
+ self.losses = []
105
+
106
+ self.hard_lower_bound = wp.float32(500.0)
107
+ self.hard_upper_bound = wp.float32(4e6)
108
+
109
+ # Create FEM model.
110
+ self.cell_dim = 2
111
+ self.cell_size = 0.1
112
+ center = self.cell_size * self.cell_dim * 0.5
113
+ self.grid_origin = wp.vec3(-0.5, 1.0, -center)
114
+ self.create_model()
115
+
116
+ self.integrator = wp.sim.SemiImplicitIntegrator()
117
+
118
+ self.target = wp.vec3(-1.0, 1.5, 0.0)
119
+ # Initialize material parameters
120
+ if self.material_behavior == "anisotropic":
121
+ # Different Lame parameters for each tet
122
+ self.material_params = wp.array(
123
+ self.model.tet_materials.numpy()[:, :2].flatten(),
124
+ dtype=wp.float32,
125
+ requires_grad=True,
126
+ )
127
+ else:
128
+ # Same Lame parameters for all tets
129
+ self.material_params = wp.array(
130
+ self.model.tet_materials.numpy()[0, :2].flatten(),
131
+ dtype=wp.float32,
132
+ requires_grad=True,
133
+ )
134
+
135
+ self.optimizer = wp.optim.SGD(
136
+ [self.material_params],
137
+ lr=self.train_rate,
138
+ nesterov=False,
139
+ )
140
+
141
+ self.com = wp.array([wp.vec3(0.0, 0.0, 0.0)], dtype=wp.vec3, requires_grad=True)
142
+ self.pos_error = wp.zeros(1, dtype=wp.float32, requires_grad=True)
143
+ self.loss = wp.zeros(1, dtype=wp.float32, requires_grad=True)
144
+
145
+ # allocate sim states for trajectory
146
+ self.states = []
147
+ for _i in range(self.sim_steps + 1):
148
+ self.states.append(self.model.state())
149
+
150
+ if stage_path:
151
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage_path, scaling=1.0)
152
+ else:
153
+ self.renderer = None
154
+
155
+ # capture forward/backward passes
156
+ self.use_cuda_graph = wp.get_device().is_cuda
157
+ if self.use_cuda_graph:
158
+ with wp.ScopedCapture() as capture:
159
+ self.tape = wp.Tape()
160
+ with self.tape:
161
+ self.forward()
162
+ self.tape.backward(self.loss)
163
+ self.graph = capture.graph
164
+
165
+ def create_model(self):
166
+ builder = wp.sim.ModelBuilder()
167
+ builder.default_particle_radius = 0.0005
168
+
169
+ total_mass = 0.2
170
+ num_particles = (self.cell_dim + 1) ** 3
171
+ particle_mass = total_mass / num_particles
172
+ particle_density = particle_mass / (self.cell_size**3)
173
+ if self.verbose:
174
+ print(f"Particle density: {particle_density}")
175
+
176
+ young_mod = 1.5 * 1e4
177
+ poisson_ratio = 0.3
178
+ k_mu = 0.5 * young_mod / (1.0 + poisson_ratio)
179
+ k_lambda = young_mod * poisson_ratio / ((1 + poisson_ratio) * (1 - 2 * poisson_ratio))
180
+
181
+ builder.add_soft_grid(
182
+ pos=self.grid_origin,
183
+ rot=wp.quat_identity(),
184
+ vel=wp.vec3(5.0, -5.0, 0.0),
185
+ dim_x=self.cell_dim,
186
+ dim_y=self.cell_dim,
187
+ dim_z=self.cell_dim,
188
+ cell_x=self.cell_size,
189
+ cell_y=self.cell_size,
190
+ cell_z=self.cell_size,
191
+ density=particle_density,
192
+ k_mu=k_mu,
193
+ k_lambda=k_lambda,
194
+ k_damp=0.0,
195
+ tri_ke=1e-4,
196
+ tri_ka=1e-4,
197
+ tri_kd=1e-4,
198
+ tri_drag=0.0,
199
+ tri_lift=0.0,
200
+ fix_bottom=False,
201
+ )
202
+
203
+ ke = 1.0e3
204
+ kf = 0.0
205
+ kd = 1.0e0
206
+ mu = 0.2
207
+ builder.add_shape_box(
208
+ body=-1,
209
+ pos=wp.vec3(2.0, 1.0, 0.0),
210
+ hx=0.25,
211
+ hy=1.0,
212
+ hz=1.0,
213
+ ke=ke,
214
+ kf=kf,
215
+ kd=kd,
216
+ mu=mu,
217
+ )
218
+
219
+ # use `requires_grad=True` to create a model for differentiable simulation
220
+ self.model = builder.finalize(requires_grad=True)
221
+ self.model.ground = True
222
+
223
+ self.model.soft_contact_ke = ke
224
+ self.model.soft_contact_kf = kf
225
+ self.model.soft_contact_kd = kd
226
+ self.model.soft_contact_mu = mu
227
+ self.model.soft_contact_margin = 0.001
228
+ self.model.soft_contact_restitution = 1.0
229
+
230
+ def forward(self):
231
+ wp.launch(
232
+ kernel=assign_param,
233
+ dim=self.model.tet_count,
234
+ inputs=(self.material_params,),
235
+ outputs=(self.model.tet_materials,),
236
+ )
237
+ # run control loop
238
+ for i in range(self.sim_steps):
239
+ wp.sim.collide(self.model, self.states[i])
240
+ self.states[i].clear_forces()
241
+
242
+ self.integrator.simulate(self.model, self.states[i], self.states[i + 1], self.sim_dt)
243
+
244
+ # Update loss
245
+ # Compute the center of mass for the last time step.
246
+ wp.launch(
247
+ kernel=com_kernel,
248
+ dim=self.model.particle_count,
249
+ inputs=(self.states[-1].particle_q,),
250
+ outputs=(self.com,),
251
+ )
252
+
253
+ # calculate loss
254
+ wp.launch(
255
+ kernel=loss_kernel,
256
+ dim=1,
257
+ inputs=(
258
+ self.target,
259
+ self.com,
260
+ ),
261
+ outputs=(self.pos_error, self.loss),
262
+ )
263
+
264
+ return self.loss
265
+
266
+ def step(self):
267
+ with wp.ScopedTimer("step"):
268
+ if self.use_cuda_graph:
269
+ wp.capture_launch(self.graph)
270
+ else:
271
+ self.tape = wp.Tape()
272
+ with self.tape:
273
+ self.forward()
274
+ self.tape.backward(loss=self.loss)
275
+
276
+ if self.verbose:
277
+ self.log_step()
278
+
279
+ self.optimizer.step([self.material_params.grad])
280
+
281
+ wp.launch(
282
+ kernel=enforce_constraint_kernel,
283
+ dim=self.material_params.shape[0],
284
+ inputs=(
285
+ self.hard_lower_bound,
286
+ self.hard_upper_bound,
287
+ ),
288
+ outputs=(self.material_params,),
289
+ )
290
+
291
+ self.losses.append(self.loss.numpy()[0])
292
+
293
+ # clear grads for next iteration
294
+ self.tape.zero()
295
+ self.loss.zero_()
296
+ self.com.zero_()
297
+ self.pos_error.zero_()
298
+
299
+ self.iter = self.iter + 1
300
+
301
+ def log_step(self):
302
+ x = self.material_params.numpy().reshape(-1, 2)
303
+ x_grad = self.material_params.grad.numpy().reshape(-1, 2)
304
+
305
+ print(f"Iter: {self.iter} Loss: {self.loss.numpy()[0]}")
306
+
307
+ print(f"Pos error: {np.sqrt(self.pos_error.numpy()[0])}")
308
+
309
+ print(
310
+ f"Max Mu: {np.max(x[:, 0])}, Min Mu: {np.min(x[:, 0])}, "
311
+ f"Max Lambda: {np.max(x[:, 1])}, Min Lambda: {np.min(x[:, 1])}"
312
+ )
313
+
314
+ print(
315
+ f"Max Mu Grad: {np.max(x_grad[:, 0])}, Min Mu Grad: {np.min(x_grad[:, 0])}, "
316
+ f"Max Lambda Grad: {np.max(x_grad[:, 1])}, Min Lambda Grad: {np.min(x_grad[:, 1])}"
317
+ )
318
+
319
+ def render(self):
320
+ if self.renderer is None:
321
+ return
322
+
323
+ with wp.ScopedTimer("render"):
324
+ # draw trajectory
325
+ traj_verts = [np.mean(self.states[0].particle_q.numpy(), axis=0).tolist()]
326
+ for i in range(0, self.sim_steps, self.sim_substeps):
327
+ traj_verts.append(np.mean(self.states[i].particle_q.numpy(), axis=0).tolist())
328
+
329
+ self.renderer.begin_frame(self.render_time)
330
+ self.renderer.render(self.states[i])
331
+ self.renderer.render_box(
332
+ pos=self.target,
333
+ rot=wp.quat_identity(),
334
+ extents=(0.1, 0.1, 0.1),
335
+ name="target",
336
+ color=(0.0, 0.0, 0.0),
337
+ )
338
+ self.renderer.render_line_strip(
339
+ vertices=traj_verts,
340
+ color=wp.render.bourke_color_map(0.0, self.losses[0], self.losses[-1]),
341
+ radius=0.02,
342
+ name=f"traj_{self.iter - 1}",
343
+ )
344
+ self.renderer.end_frame()
345
+
346
+ from pxr import Gf, UsdGeom
347
+
348
+ particles_prim = self.renderer.stage.GetPrimAtPath("/root/particles")
349
+ particles = UsdGeom.Points.Get(self.renderer.stage, particles_prim.GetPath())
350
+ particles.CreateDisplayColorAttr().Set([Gf.Vec3f(1.0, 1.0, 1.0)], time=self.renderer.time)
351
+
352
+ self.render_time += self.frame_dt
353
+
354
+
355
+ if __name__ == "__main__":
356
+ import argparse
357
+
358
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
359
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
360
+ parser.add_argument(
361
+ "--stage_path",
362
+ type=lambda x: None if x == "None" else str(x),
363
+ default="example_softbody_properties.usd",
364
+ help="Path to the output USD file.",
365
+ )
366
+ parser.add_argument(
367
+ "--train_iters",
368
+ type=int,
369
+ default=300,
370
+ help="Total number of training iterations.",
371
+ )
372
+ parser.add_argument(
373
+ "--material_behavior",
374
+ default="anisotropic",
375
+ choices=["anisotropic", "isotropic"],
376
+ help="Set material behavior to be Anisotropic or Isotropic.",
377
+ )
378
+ parser.add_argument(
379
+ "--verbose",
380
+ action="store_true",
381
+ help="Print out additional status messages during execution.",
382
+ )
383
+
384
+ args = parser.parse_known_args()[0]
385
+
386
+ with wp.ScopedDevice(args.device):
387
+ example = Example(
388
+ stage_path=args.stage_path,
389
+ material_behavior=args.material_behavior,
390
+ verbose=args.verbose,
391
+ )
392
+
393
+ # replay and optimize
394
+ for i in range(args.train_iters):
395
+ example.step()
396
+ if i == 0 or i % 50 == 0 or i == args.train_iters - 1:
397
+ example.render()
398
+
399
+ if example.renderer:
400
+ example.renderer.save()