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,203 @@
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 Quadruped
18
+ #
19
+ # Shows how to set up a simulation of a rigid-body quadruped articulation
20
+ # from a URDF using the wp.sim.ModelBuilder().
21
+ # Note this example does not include a trained policy.
22
+ #
23
+ ###########################################################################
24
+
25
+ import math
26
+ import os
27
+
28
+ import numpy as np
29
+
30
+ import warp as wp
31
+ import warp.examples
32
+ import warp.sim
33
+ import warp.sim.render
34
+
35
+
36
+ # Taken from env/environment.py
37
+ def compute_env_offsets(num_envs, env_offset=(5.0, 0.0, 5.0), up_axis="Y"):
38
+ # compute positional offsets per environment
39
+ env_offset = np.array(env_offset)
40
+ nonzeros = np.nonzero(env_offset)[0]
41
+ num_dim = nonzeros.shape[0]
42
+ if num_dim > 0:
43
+ side_length = int(np.ceil(num_envs ** (1.0 / num_dim)))
44
+ env_offsets = []
45
+ else:
46
+ env_offsets = np.zeros((num_envs, 3))
47
+ if num_dim == 1:
48
+ for i in range(num_envs):
49
+ env_offsets.append(i * env_offset)
50
+ elif num_dim == 2:
51
+ for i in range(num_envs):
52
+ d0 = i // side_length
53
+ d1 = i % side_length
54
+ offset = np.zeros(3)
55
+ offset[nonzeros[0]] = d0 * env_offset[nonzeros[0]]
56
+ offset[nonzeros[1]] = d1 * env_offset[nonzeros[1]]
57
+ env_offsets.append(offset)
58
+ elif num_dim == 3:
59
+ for i in range(num_envs):
60
+ d0 = i // (side_length * side_length)
61
+ d1 = (i // side_length) % side_length
62
+ d2 = i % side_length
63
+ offset = np.zeros(3)
64
+ offset[0] = d0 * env_offset[0]
65
+ offset[1] = d1 * env_offset[1]
66
+ offset[2] = d2 * env_offset[2]
67
+ env_offsets.append(offset)
68
+ env_offsets = np.array(env_offsets)
69
+ min_offsets = np.min(env_offsets, axis=0)
70
+ correction = min_offsets + (np.max(env_offsets, axis=0) - min_offsets) / 2.0
71
+ if isinstance(up_axis, str):
72
+ up_axis = "XYZ".index(up_axis.upper())
73
+ correction[up_axis] = 0.0 # ensure the envs are not shifted below the ground plane
74
+ env_offsets -= correction
75
+ return env_offsets
76
+
77
+
78
+ class Example:
79
+ def __init__(self, stage_path="example_quadruped.usd", num_envs=8):
80
+ articulation_builder = wp.sim.ModelBuilder()
81
+ wp.sim.parse_urdf(
82
+ os.path.join(warp.examples.get_asset_directory(), "quadruped.urdf"),
83
+ articulation_builder,
84
+ xform=wp.transform([0.0, 0.7, 0.0], wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), -math.pi * 0.5)),
85
+ floating=True,
86
+ density=1000,
87
+ armature=0.01,
88
+ stiffness=200,
89
+ damping=1,
90
+ contact_ke=1.0e4,
91
+ contact_kd=1.0e2,
92
+ contact_kf=1.0e2,
93
+ contact_mu=1.0,
94
+ limit_ke=1.0e4,
95
+ limit_kd=1.0e1,
96
+ )
97
+
98
+ builder = wp.sim.ModelBuilder()
99
+
100
+ self.sim_time = 0.0
101
+ fps = 100
102
+ self.frame_dt = 1.0 / fps
103
+
104
+ self.sim_substeps = 10
105
+ self.sim_dt = self.frame_dt / self.sim_substeps
106
+
107
+ self.num_envs = num_envs
108
+
109
+ offsets = compute_env_offsets(self.num_envs)
110
+ for i in range(self.num_envs):
111
+ builder.add_builder(articulation_builder, xform=wp.transform(offsets[i], wp.quat_identity()))
112
+
113
+ builder.joint_q[-12:] = [0.2, 0.4, -0.6, -0.2, -0.4, 0.6, -0.2, 0.4, -0.6, 0.2, -0.4, 0.6]
114
+
115
+ builder.joint_axis_mode = [wp.sim.JOINT_MODE_TARGET_POSITION] * len(builder.joint_axis_mode)
116
+ builder.joint_act[-12:] = [0.2, 0.4, -0.6, -0.2, -0.4, 0.6, -0.2, 0.4, -0.6, 0.2, -0.4, 0.6]
117
+
118
+ np.set_printoptions(suppress=True)
119
+ # finalize model
120
+ self.model = builder.finalize()
121
+ self.model.ground = True
122
+ # self.model.gravity = 0.0
123
+
124
+ self.model.joint_attach_ke = 16000.0
125
+ self.model.joint_attach_kd = 200.0
126
+ self.use_tile_gemm = False
127
+ self.fuse_cholesky = False
128
+
129
+ # self.integrator = wp.sim.XPBDIntegrator()
130
+ # self.integrator = wp.sim.SemiImplicitIntegrator()
131
+ self.integrator = wp.sim.FeatherstoneIntegrator(
132
+ self.model, use_tile_gemm=self.use_tile_gemm, fuse_cholesky=self.fuse_cholesky
133
+ )
134
+
135
+ if stage_path:
136
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage_path)
137
+ else:
138
+ self.renderer = None
139
+
140
+ self.state_0 = self.model.state()
141
+ self.state_1 = self.model.state()
142
+
143
+ wp.sim.eval_fk(self.model, self.model.joint_q, self.model.joint_qd, None, self.state_0)
144
+
145
+ # simulate() allocates memory via a clone, so we can't use graph capture if the device does not support mempools
146
+ self.use_cuda_graph = wp.get_device().is_cuda and wp.is_mempool_enabled(wp.get_device())
147
+ if self.use_cuda_graph:
148
+ with wp.ScopedCapture() as capture:
149
+ self.simulate()
150
+ self.graph = capture.graph
151
+ else:
152
+ self.graph = None
153
+
154
+ def simulate(self):
155
+ for _ in range(self.sim_substeps):
156
+ self.state_0.clear_forces()
157
+ wp.sim.collide(self.model, self.state_0)
158
+ self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
159
+ self.state_0, self.state_1 = self.state_1, self.state_0
160
+
161
+ def step(self):
162
+ with wp.ScopedTimer("step"):
163
+ if self.use_cuda_graph:
164
+ wp.capture_launch(self.graph)
165
+ else:
166
+ self.simulate()
167
+ self.sim_time += self.frame_dt
168
+
169
+ def render(self):
170
+ if self.renderer is None:
171
+ return
172
+
173
+ with wp.ScopedTimer("render"):
174
+ self.renderer.begin_frame(self.sim_time)
175
+ self.renderer.render(self.state_0)
176
+ self.renderer.end_frame()
177
+
178
+
179
+ if __name__ == "__main__":
180
+ import argparse
181
+
182
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
183
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
184
+ parser.add_argument(
185
+ "--stage_path",
186
+ type=lambda x: None if x == "None" else str(x),
187
+ default="example_quadruped.usd",
188
+ help="Path to the output USD file.",
189
+ )
190
+ parser.add_argument("--num_frames", type=int, default=300, help="Total number of frames.")
191
+ parser.add_argument("--num_envs", type=int, default=8, help="Total number of simulated environments.")
192
+
193
+ args = parser.parse_known_args()[0]
194
+
195
+ with wp.ScopedDevice(args.device):
196
+ example = Example(stage_path=args.stage_path, num_envs=args.num_envs)
197
+
198
+ for _ in range(args.num_frames):
199
+ example.step()
200
+ example.render()
201
+
202
+ if example.renderer:
203
+ example.renderer.save()
@@ -0,0 +1,203 @@
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 Chain
18
+ #
19
+ # Shows how to set up a chain of rigid bodies connected by different joint
20
+ # types using wp.sim.ModelBuilder(). There is one chain for each joint
21
+ # type, including fixed joints which act as a flexible beam.
22
+ #
23
+ ###########################################################################
24
+
25
+ import numpy as np
26
+
27
+ import warp as wp
28
+ import warp.sim
29
+ import warp.sim.render
30
+
31
+
32
+ class Example:
33
+ def __init__(self, stage_path="example_rigid_chain.usd"):
34
+ self.chain_length = 8
35
+ self.chain_width = 1.0
36
+ self.chain_types = [
37
+ wp.sim.JOINT_REVOLUTE,
38
+ wp.sim.JOINT_FIXED,
39
+ wp.sim.JOINT_BALL,
40
+ wp.sim.JOINT_UNIVERSAL,
41
+ wp.sim.JOINT_COMPOUND,
42
+ ]
43
+
44
+ builder = wp.sim.ModelBuilder()
45
+
46
+ self.sim_time = 0.0
47
+ fps = 100
48
+ self.frame_dt = 1.0 / fps
49
+
50
+ self.sim_substeps = 10
51
+ self.sim_dt = self.frame_dt / self.sim_substeps
52
+
53
+ for c, t in enumerate(self.chain_types):
54
+ # start a new articulation
55
+ builder.add_articulation()
56
+
57
+ for i in range(self.chain_length):
58
+ if i == 0:
59
+ parent = -1
60
+ parent_joint_xform = wp.transform([0.0, 0.0, c * 1.0], wp.quat_identity())
61
+ else:
62
+ parent = builder.joint_count - 1
63
+ parent_joint_xform = wp.transform([self.chain_width, 0.0, 0.0], wp.quat_identity())
64
+
65
+ # create body
66
+ b = builder.add_body(origin=wp.transform([i, 0.0, c * 1.0], wp.quat_identity()), armature=0.1)
67
+
68
+ # create shape
69
+ builder.add_shape_box(
70
+ pos=wp.vec3(self.chain_width * 0.5, 0.0, 0.0),
71
+ hx=self.chain_width * 0.5,
72
+ hy=0.1,
73
+ hz=0.1,
74
+ density=10.0,
75
+ body=b,
76
+ )
77
+
78
+ joint_type = t
79
+
80
+ if joint_type == wp.sim.JOINT_REVOLUTE:
81
+ joint_limit_lower = -np.deg2rad(60.0)
82
+ joint_limit_upper = np.deg2rad(60.0)
83
+ builder.add_joint_revolute(
84
+ parent=parent,
85
+ child=b,
86
+ axis=(0.0, 0.0, 1.0),
87
+ parent_xform=parent_joint_xform,
88
+ child_xform=wp.transform_identity(),
89
+ limit_lower=joint_limit_lower,
90
+ limit_upper=joint_limit_upper,
91
+ target_ke=0.0,
92
+ target_kd=0.0,
93
+ limit_ke=1e5,
94
+ limit_kd=1.0,
95
+ )
96
+
97
+ elif joint_type == wp.sim.JOINT_UNIVERSAL:
98
+ builder.add_joint_universal(
99
+ parent=parent,
100
+ child=b,
101
+ axis_0=wp.sim.JointAxis((1.0, 0.0, 0.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
102
+ axis_1=wp.sim.JointAxis((0.0, 0.0, 1.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
103
+ parent_xform=parent_joint_xform,
104
+ child_xform=wp.transform_identity(),
105
+ )
106
+
107
+ elif joint_type == wp.sim.JOINT_BALL:
108
+ builder.add_joint_ball(
109
+ parent=parent,
110
+ child=b,
111
+ parent_xform=parent_joint_xform,
112
+ child_xform=wp.transform_identity(),
113
+ )
114
+
115
+ elif joint_type == wp.sim.JOINT_FIXED:
116
+ builder.add_joint_fixed(
117
+ parent=parent,
118
+ child=b,
119
+ parent_xform=parent_joint_xform,
120
+ child_xform=wp.transform_identity(),
121
+ )
122
+
123
+ elif joint_type == wp.sim.JOINT_COMPOUND:
124
+ builder.add_joint_compound(
125
+ parent=parent,
126
+ child=b,
127
+ axis_0=wp.sim.JointAxis((1.0, 0.0, 0.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
128
+ axis_1=wp.sim.JointAxis((0.0, 1.0, 0.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
129
+ axis_2=wp.sim.JointAxis((0.0, 0.0, 1.0), -np.deg2rad(60.0), np.deg2rad(60.0)),
130
+ parent_xform=parent_joint_xform,
131
+ child_xform=wp.transform_identity(),
132
+ )
133
+
134
+ self.model = builder.finalize()
135
+ self.model.ground = False
136
+
137
+ self.integrator = wp.sim.FeatherstoneIntegrator(self.model)
138
+
139
+ if stage_path:
140
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage_path, scaling=20.0)
141
+ else:
142
+ self.renderer = None
143
+
144
+ self.state_0 = self.model.state()
145
+ self.state_1 = self.model.state()
146
+
147
+ wp.sim.eval_fk(self.model, self.model.joint_q, self.model.joint_qd, None, self.state_0)
148
+
149
+ # simulate() allocates memory via a clone, so we can't use graph capture if the device does not support mempools
150
+ self.use_cuda_graph = wp.get_device().is_cuda and wp.is_mempool_enabled(wp.get_device())
151
+ if self.use_cuda_graph:
152
+ with wp.ScopedCapture() as capture:
153
+ self.simulate()
154
+ self.graph = capture.graph
155
+
156
+ def simulate(self):
157
+ for _ in range(self.sim_substeps):
158
+ self.state_0.clear_forces()
159
+ self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
160
+ self.state_0, self.state_1 = self.state_1, self.state_0
161
+
162
+ def step(self):
163
+ with wp.ScopedTimer("step"):
164
+ if self.use_cuda_graph:
165
+ wp.capture_launch(self.graph)
166
+ else:
167
+ self.simulate()
168
+ self.sim_time += self.frame_dt
169
+
170
+ def render(self):
171
+ if self.renderer is None:
172
+ return
173
+
174
+ with wp.ScopedTimer("render"):
175
+ self.renderer.begin_frame(self.sim_time)
176
+ self.renderer.render(self.state_0)
177
+ self.renderer.end_frame()
178
+
179
+
180
+ if __name__ == "__main__":
181
+ import argparse
182
+
183
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
184
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
185
+ parser.add_argument(
186
+ "--stage_path",
187
+ type=lambda x: None if x == "None" else str(x),
188
+ default="example_rigid_chain.usd",
189
+ help="Path to the output USD file.",
190
+ )
191
+ parser.add_argument("--num_frames", type=int, default=500, help="Total number of frames.")
192
+
193
+ args = parser.parse_known_args()[0]
194
+
195
+ with wp.ScopedDevice(args.device):
196
+ example = Example(stage_path=args.stage_path)
197
+
198
+ for _ in range(args.num_frames):
199
+ example.step()
200
+ example.render()
201
+
202
+ if example.renderer:
203
+ example.renderer.save()
@@ -0,0 +1,195 @@
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 Contact
18
+ #
19
+ # Shows how to set up free rigid bodies with different shape types falling
20
+ # and colliding against each other and the ground using wp.sim.ModelBuilder().
21
+ #
22
+ ###########################################################################
23
+
24
+ import math
25
+ import os
26
+
27
+ import numpy as np
28
+ from pxr import Usd, UsdGeom
29
+
30
+ import warp as wp
31
+ import warp.examples
32
+ import warp.sim
33
+ import warp.sim.render
34
+
35
+
36
+ class Example:
37
+ def __init__(self, stage_path="example_rigid_contact.usd"):
38
+ builder = wp.sim.ModelBuilder()
39
+
40
+ self.sim_time = 0.0
41
+ fps = 60
42
+ self.frame_dt = 1.0 / fps
43
+
44
+ self.sim_substeps = 10
45
+ self.sim_dt = self.frame_dt / self.sim_substeps
46
+
47
+ self.num_bodies = 8
48
+ self.scale = 0.8
49
+ self.ke = 1.0e5
50
+ self.kd = 250.0
51
+ self.kf = 500.0
52
+
53
+ # boxes
54
+ for i in range(self.num_bodies):
55
+ b = builder.add_body(origin=wp.transform((i, 1.0, 0.0), wp.quat_identity()))
56
+
57
+ builder.add_shape_box(
58
+ pos=wp.vec3(0.0, 0.0, 0.0),
59
+ hx=0.5 * self.scale,
60
+ hy=0.2 * self.scale,
61
+ hz=0.2 * self.scale,
62
+ body=i,
63
+ ke=self.ke,
64
+ kd=self.kd,
65
+ kf=self.kf,
66
+ )
67
+
68
+ # spheres
69
+ for i in range(self.num_bodies):
70
+ b = builder.add_body(origin=wp.transform((i, 1.0, 2.0), wp.quat_identity()))
71
+
72
+ builder.add_shape_sphere(
73
+ pos=wp.vec3(0.0, 0.0, 0.0), radius=0.25 * self.scale, body=b, ke=self.ke, kd=self.kd, kf=self.kf
74
+ )
75
+
76
+ # capsules
77
+ for i in range(self.num_bodies):
78
+ b = builder.add_body(origin=wp.transform((i, 1.0, 6.0), wp.quat_identity()))
79
+
80
+ builder.add_shape_capsule(
81
+ pos=wp.vec3(0.0, 0.0, 0.0),
82
+ radius=0.25 * self.scale,
83
+ half_height=self.scale * 0.5,
84
+ up_axis=0,
85
+ body=b,
86
+ ke=self.ke,
87
+ kd=self.kd,
88
+ kf=self.kf,
89
+ )
90
+
91
+ # initial spin
92
+ for i in range(len(builder.body_qd)):
93
+ builder.body_qd[i] = (0.0, 2.0, 10.0, 0.0, 0.0, 0.0)
94
+
95
+ # meshes
96
+ bunny = self.load_mesh(os.path.join(warp.examples.get_asset_directory(), "bunny.usd"), "/root/bunny")
97
+ for i in range(self.num_bodies):
98
+ b = builder.add_body(
99
+ origin=wp.transform(
100
+ (i * 0.5 * self.scale, 1.0 + i * 1.7 * self.scale, 4.0 + i * 0.5 * self.scale),
101
+ wp.quat_from_axis_angle(wp.vec3(0.0, 1.0, 0.0), math.pi * 0.1 * i),
102
+ )
103
+ )
104
+
105
+ builder.add_shape_mesh(
106
+ body=b,
107
+ mesh=bunny,
108
+ pos=wp.vec3(0.0, 0.0, 0.0),
109
+ scale=wp.vec3(self.scale, self.scale, self.scale),
110
+ ke=self.ke,
111
+ kd=self.kd,
112
+ kf=self.kf,
113
+ density=1e3,
114
+ )
115
+
116
+ # finalize model
117
+ self.model = builder.finalize()
118
+ self.model.ground = True
119
+
120
+ self.integrator = wp.sim.SemiImplicitIntegrator()
121
+
122
+ if stage_path:
123
+ self.renderer = wp.sim.render.SimRenderer(self.model, stage_path, scaling=0.5)
124
+ else:
125
+ self.renderer = None
126
+
127
+ self.state_0 = self.model.state()
128
+ self.state_1 = self.model.state()
129
+
130
+ wp.sim.eval_fk(self.model, self.model.joint_q, self.model.joint_qd, None, self.state_0)
131
+
132
+ self.use_cuda_graph = wp.get_device().is_cuda
133
+ if self.use_cuda_graph:
134
+ with wp.ScopedCapture() as capture:
135
+ self.simulate()
136
+ self.graph = capture.graph
137
+
138
+ def load_mesh(self, filename, path):
139
+ asset_stage = Usd.Stage.Open(filename)
140
+ mesh_geom = UsdGeom.Mesh(asset_stage.GetPrimAtPath(path))
141
+
142
+ points = np.array(mesh_geom.GetPointsAttr().Get())
143
+ indices = np.array(mesh_geom.GetFaceVertexIndicesAttr().Get()).flatten()
144
+
145
+ return wp.sim.Mesh(points, indices)
146
+
147
+ def simulate(self):
148
+ for _ in range(self.sim_substeps):
149
+ self.state_0.clear_forces()
150
+ wp.sim.collide(self.model, self.state_0)
151
+ self.integrator.simulate(self.model, self.state_0, self.state_1, self.sim_dt)
152
+ self.state_0, self.state_1 = self.state_1, self.state_0
153
+
154
+ def step(self):
155
+ with wp.ScopedTimer("step", active=True):
156
+ if self.use_cuda_graph:
157
+ wp.capture_launch(self.graph)
158
+ else:
159
+ self.simulate()
160
+ self.sim_time += self.frame_dt
161
+
162
+ def render(self):
163
+ if self.renderer is None:
164
+ return
165
+
166
+ with wp.ScopedTimer("render", active=True):
167
+ self.renderer.begin_frame(self.sim_time)
168
+ self.renderer.render(self.state_0)
169
+ self.renderer.end_frame()
170
+
171
+
172
+ if __name__ == "__main__":
173
+ import argparse
174
+
175
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
176
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
177
+ parser.add_argument(
178
+ "--stage_path",
179
+ type=lambda x: None if x == "None" else str(x),
180
+ default="example_rigid_contact.usd",
181
+ help="Path to the output USD file.",
182
+ )
183
+ parser.add_argument("--num_frames", type=int, default=300, help="Total number of frames.")
184
+
185
+ args = parser.parse_known_args()[0]
186
+
187
+ with wp.ScopedDevice(args.device):
188
+ example = Example(stage_path=args.stage_path)
189
+
190
+ for _ in range(args.num_frames):
191
+ example.step()
192
+ example.render()
193
+
194
+ if example.renderer:
195
+ example.renderer.save()