warp-lang 1.7.0__py3-none-manylinux_2_28_x86_64.whl

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

Potentially problematic release.


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

Files changed (429) hide show
  1. warp/__init__.py +139 -0
  2. warp/__init__.pyi +1 -0
  3. warp/autograd.py +1142 -0
  4. warp/bin/warp-clang.so +0 -0
  5. warp/bin/warp.so +0 -0
  6. warp/build.py +557 -0
  7. warp/build_dll.py +405 -0
  8. warp/builtins.py +6855 -0
  9. warp/codegen.py +3969 -0
  10. warp/config.py +158 -0
  11. warp/constants.py +57 -0
  12. warp/context.py +6812 -0
  13. warp/dlpack.py +462 -0
  14. warp/examples/__init__.py +24 -0
  15. warp/examples/assets/bear.usd +0 -0
  16. warp/examples/assets/bunny.usd +0 -0
  17. warp/examples/assets/cartpole.urdf +110 -0
  18. warp/examples/assets/crazyflie.usd +0 -0
  19. warp/examples/assets/cube.usd +0 -0
  20. warp/examples/assets/nonuniform.usd +0 -0
  21. warp/examples/assets/nv_ant.xml +92 -0
  22. warp/examples/assets/nv_humanoid.xml +183 -0
  23. warp/examples/assets/nvidia_logo.png +0 -0
  24. warp/examples/assets/pixel.jpg +0 -0
  25. warp/examples/assets/quadruped.urdf +268 -0
  26. warp/examples/assets/rocks.nvdb +0 -0
  27. warp/examples/assets/rocks.usd +0 -0
  28. warp/examples/assets/sphere.usd +0 -0
  29. warp/examples/assets/square_cloth.usd +0 -0
  30. warp/examples/benchmarks/benchmark_api.py +389 -0
  31. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  32. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  33. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  34. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  35. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  36. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  37. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  38. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  39. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  40. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  41. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  42. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  43. warp/examples/benchmarks/benchmark_launches.py +301 -0
  44. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  45. warp/examples/browse.py +37 -0
  46. warp/examples/core/example_cupy.py +86 -0
  47. warp/examples/core/example_dem.py +241 -0
  48. warp/examples/core/example_fluid.py +299 -0
  49. warp/examples/core/example_graph_capture.py +150 -0
  50. warp/examples/core/example_marching_cubes.py +194 -0
  51. warp/examples/core/example_mesh.py +180 -0
  52. warp/examples/core/example_mesh_intersect.py +211 -0
  53. warp/examples/core/example_nvdb.py +182 -0
  54. warp/examples/core/example_raycast.py +111 -0
  55. warp/examples/core/example_raymarch.py +205 -0
  56. warp/examples/core/example_render_opengl.py +193 -0
  57. warp/examples/core/example_sample_mesh.py +300 -0
  58. warp/examples/core/example_sph.py +411 -0
  59. warp/examples/core/example_torch.py +211 -0
  60. warp/examples/core/example_wave.py +269 -0
  61. warp/examples/fem/example_adaptive_grid.py +286 -0
  62. warp/examples/fem/example_apic_fluid.py +423 -0
  63. warp/examples/fem/example_burgers.py +261 -0
  64. warp/examples/fem/example_convection_diffusion.py +178 -0
  65. warp/examples/fem/example_convection_diffusion_dg.py +204 -0
  66. warp/examples/fem/example_deformed_geometry.py +172 -0
  67. warp/examples/fem/example_diffusion.py +196 -0
  68. warp/examples/fem/example_diffusion_3d.py +225 -0
  69. warp/examples/fem/example_diffusion_mgpu.py +220 -0
  70. warp/examples/fem/example_distortion_energy.py +228 -0
  71. warp/examples/fem/example_magnetostatics.py +240 -0
  72. warp/examples/fem/example_mixed_elasticity.py +291 -0
  73. warp/examples/fem/example_navier_stokes.py +261 -0
  74. warp/examples/fem/example_nonconforming_contact.py +298 -0
  75. warp/examples/fem/example_stokes.py +213 -0
  76. warp/examples/fem/example_stokes_transfer.py +262 -0
  77. warp/examples/fem/example_streamlines.py +352 -0
  78. warp/examples/fem/utils.py +1000 -0
  79. warp/examples/interop/example_jax_callable.py +116 -0
  80. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  81. warp/examples/interop/example_jax_kernel.py +205 -0
  82. warp/examples/optim/example_bounce.py +266 -0
  83. warp/examples/optim/example_cloth_throw.py +228 -0
  84. warp/examples/optim/example_diffray.py +561 -0
  85. warp/examples/optim/example_drone.py +870 -0
  86. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  87. warp/examples/optim/example_inverse_kinematics.py +182 -0
  88. warp/examples/optim/example_inverse_kinematics_torch.py +191 -0
  89. warp/examples/optim/example_softbody_properties.py +400 -0
  90. warp/examples/optim/example_spring_cage.py +245 -0
  91. warp/examples/optim/example_trajectory.py +227 -0
  92. warp/examples/sim/example_cartpole.py +143 -0
  93. warp/examples/sim/example_cloth.py +225 -0
  94. warp/examples/sim/example_cloth_self_contact.py +322 -0
  95. warp/examples/sim/example_granular.py +130 -0
  96. warp/examples/sim/example_granular_collision_sdf.py +202 -0
  97. warp/examples/sim/example_jacobian_ik.py +244 -0
  98. warp/examples/sim/example_particle_chain.py +124 -0
  99. warp/examples/sim/example_quadruped.py +203 -0
  100. warp/examples/sim/example_rigid_chain.py +203 -0
  101. warp/examples/sim/example_rigid_contact.py +195 -0
  102. warp/examples/sim/example_rigid_force.py +133 -0
  103. warp/examples/sim/example_rigid_gyroscopic.py +115 -0
  104. warp/examples/sim/example_rigid_soft_contact.py +140 -0
  105. warp/examples/sim/example_soft_body.py +196 -0
  106. warp/examples/tile/example_tile_cholesky.py +87 -0
  107. warp/examples/tile/example_tile_convolution.py +66 -0
  108. warp/examples/tile/example_tile_fft.py +55 -0
  109. warp/examples/tile/example_tile_filtering.py +113 -0
  110. warp/examples/tile/example_tile_matmul.py +85 -0
  111. warp/examples/tile/example_tile_mlp.py +383 -0
  112. warp/examples/tile/example_tile_nbody.py +199 -0
  113. warp/examples/tile/example_tile_walker.py +327 -0
  114. warp/fabric.py +355 -0
  115. warp/fem/__init__.py +106 -0
  116. warp/fem/adaptivity.py +508 -0
  117. warp/fem/cache.py +572 -0
  118. warp/fem/dirichlet.py +202 -0
  119. warp/fem/domain.py +411 -0
  120. warp/fem/field/__init__.py +125 -0
  121. warp/fem/field/field.py +619 -0
  122. warp/fem/field/nodal_field.py +326 -0
  123. warp/fem/field/restriction.py +37 -0
  124. warp/fem/field/virtual.py +848 -0
  125. warp/fem/geometry/__init__.py +32 -0
  126. warp/fem/geometry/adaptive_nanogrid.py +857 -0
  127. warp/fem/geometry/closest_point.py +84 -0
  128. warp/fem/geometry/deformed_geometry.py +221 -0
  129. warp/fem/geometry/element.py +776 -0
  130. warp/fem/geometry/geometry.py +362 -0
  131. warp/fem/geometry/grid_2d.py +392 -0
  132. warp/fem/geometry/grid_3d.py +452 -0
  133. warp/fem/geometry/hexmesh.py +911 -0
  134. warp/fem/geometry/nanogrid.py +571 -0
  135. warp/fem/geometry/partition.py +389 -0
  136. warp/fem/geometry/quadmesh.py +663 -0
  137. warp/fem/geometry/tetmesh.py +855 -0
  138. warp/fem/geometry/trimesh.py +806 -0
  139. warp/fem/integrate.py +2335 -0
  140. warp/fem/linalg.py +419 -0
  141. warp/fem/operator.py +293 -0
  142. warp/fem/polynomial.py +229 -0
  143. warp/fem/quadrature/__init__.py +17 -0
  144. warp/fem/quadrature/pic_quadrature.py +299 -0
  145. warp/fem/quadrature/quadrature.py +591 -0
  146. warp/fem/space/__init__.py +228 -0
  147. warp/fem/space/basis_function_space.py +468 -0
  148. warp/fem/space/basis_space.py +667 -0
  149. warp/fem/space/dof_mapper.py +251 -0
  150. warp/fem/space/function_space.py +309 -0
  151. warp/fem/space/grid_2d_function_space.py +177 -0
  152. warp/fem/space/grid_3d_function_space.py +227 -0
  153. warp/fem/space/hexmesh_function_space.py +257 -0
  154. warp/fem/space/nanogrid_function_space.py +201 -0
  155. warp/fem/space/partition.py +367 -0
  156. warp/fem/space/quadmesh_function_space.py +223 -0
  157. warp/fem/space/restriction.py +179 -0
  158. warp/fem/space/shape/__init__.py +143 -0
  159. warp/fem/space/shape/cube_shape_function.py +1105 -0
  160. warp/fem/space/shape/shape_function.py +133 -0
  161. warp/fem/space/shape/square_shape_function.py +926 -0
  162. warp/fem/space/shape/tet_shape_function.py +834 -0
  163. warp/fem/space/shape/triangle_shape_function.py +672 -0
  164. warp/fem/space/tetmesh_function_space.py +271 -0
  165. warp/fem/space/topology.py +424 -0
  166. warp/fem/space/trimesh_function_space.py +194 -0
  167. warp/fem/types.py +99 -0
  168. warp/fem/utils.py +420 -0
  169. warp/jax.py +187 -0
  170. warp/jax_experimental/__init__.py +16 -0
  171. warp/jax_experimental/custom_call.py +351 -0
  172. warp/jax_experimental/ffi.py +698 -0
  173. warp/jax_experimental/xla_ffi.py +602 -0
  174. warp/math.py +244 -0
  175. warp/native/array.h +1145 -0
  176. warp/native/builtin.h +1800 -0
  177. warp/native/bvh.cpp +492 -0
  178. warp/native/bvh.cu +791 -0
  179. warp/native/bvh.h +554 -0
  180. warp/native/clang/clang.cpp +536 -0
  181. warp/native/coloring.cpp +613 -0
  182. warp/native/crt.cpp +51 -0
  183. warp/native/crt.h +362 -0
  184. warp/native/cuda_crt.h +1058 -0
  185. warp/native/cuda_util.cpp +646 -0
  186. warp/native/cuda_util.h +307 -0
  187. warp/native/error.cpp +77 -0
  188. warp/native/error.h +36 -0
  189. warp/native/exports.h +1878 -0
  190. warp/native/fabric.h +245 -0
  191. warp/native/hashgrid.cpp +311 -0
  192. warp/native/hashgrid.cu +87 -0
  193. warp/native/hashgrid.h +240 -0
  194. warp/native/initializer_array.h +41 -0
  195. warp/native/intersect.h +1230 -0
  196. warp/native/intersect_adj.h +375 -0
  197. warp/native/intersect_tri.h +339 -0
  198. warp/native/marching.cpp +19 -0
  199. warp/native/marching.cu +514 -0
  200. warp/native/marching.h +19 -0
  201. warp/native/mat.h +2220 -0
  202. warp/native/mathdx.cpp +87 -0
  203. warp/native/matnn.h +343 -0
  204. warp/native/mesh.cpp +266 -0
  205. warp/native/mesh.cu +404 -0
  206. warp/native/mesh.h +1980 -0
  207. warp/native/nanovdb/GridHandle.h +366 -0
  208. warp/native/nanovdb/HostBuffer.h +590 -0
  209. warp/native/nanovdb/NanoVDB.h +6624 -0
  210. warp/native/nanovdb/PNanoVDB.h +3390 -0
  211. warp/native/noise.h +859 -0
  212. warp/native/quat.h +1371 -0
  213. warp/native/rand.h +342 -0
  214. warp/native/range.h +139 -0
  215. warp/native/reduce.cpp +174 -0
  216. warp/native/reduce.cu +364 -0
  217. warp/native/runlength_encode.cpp +79 -0
  218. warp/native/runlength_encode.cu +61 -0
  219. warp/native/scan.cpp +47 -0
  220. warp/native/scan.cu +53 -0
  221. warp/native/scan.h +23 -0
  222. warp/native/solid_angle.h +466 -0
  223. warp/native/sort.cpp +251 -0
  224. warp/native/sort.cu +277 -0
  225. warp/native/sort.h +33 -0
  226. warp/native/sparse.cpp +378 -0
  227. warp/native/sparse.cu +524 -0
  228. warp/native/spatial.h +657 -0
  229. warp/native/svd.h +702 -0
  230. warp/native/temp_buffer.h +46 -0
  231. warp/native/tile.h +2584 -0
  232. warp/native/tile_reduce.h +264 -0
  233. warp/native/vec.h +1426 -0
  234. warp/native/volume.cpp +501 -0
  235. warp/native/volume.cu +67 -0
  236. warp/native/volume.h +969 -0
  237. warp/native/volume_builder.cu +477 -0
  238. warp/native/volume_builder.h +52 -0
  239. warp/native/volume_impl.h +70 -0
  240. warp/native/warp.cpp +1082 -0
  241. warp/native/warp.cu +3636 -0
  242. warp/native/warp.h +381 -0
  243. warp/optim/__init__.py +17 -0
  244. warp/optim/adam.py +163 -0
  245. warp/optim/linear.py +1137 -0
  246. warp/optim/sgd.py +112 -0
  247. warp/paddle.py +407 -0
  248. warp/render/__init__.py +18 -0
  249. warp/render/render_opengl.py +3518 -0
  250. warp/render/render_usd.py +784 -0
  251. warp/render/utils.py +160 -0
  252. warp/sim/__init__.py +65 -0
  253. warp/sim/articulation.py +793 -0
  254. warp/sim/collide.py +2395 -0
  255. warp/sim/graph_coloring.py +300 -0
  256. warp/sim/import_mjcf.py +790 -0
  257. warp/sim/import_snu.py +227 -0
  258. warp/sim/import_urdf.py +579 -0
  259. warp/sim/import_usd.py +894 -0
  260. warp/sim/inertia.py +324 -0
  261. warp/sim/integrator.py +242 -0
  262. warp/sim/integrator_euler.py +1997 -0
  263. warp/sim/integrator_featherstone.py +2101 -0
  264. warp/sim/integrator_vbd.py +2048 -0
  265. warp/sim/integrator_xpbd.py +3292 -0
  266. warp/sim/model.py +4791 -0
  267. warp/sim/particles.py +121 -0
  268. warp/sim/render.py +427 -0
  269. warp/sim/utils.py +428 -0
  270. warp/sparse.py +2057 -0
  271. warp/stubs.py +3333 -0
  272. warp/tape.py +1203 -0
  273. warp/tests/__init__.py +1 -0
  274. warp/tests/__main__.py +4 -0
  275. warp/tests/assets/curlnoise_golden.npy +0 -0
  276. warp/tests/assets/mlp_golden.npy +0 -0
  277. warp/tests/assets/pixel.npy +0 -0
  278. warp/tests/assets/pnoise_golden.npy +0 -0
  279. warp/tests/assets/spiky.usd +0 -0
  280. warp/tests/assets/test_grid.nvdb +0 -0
  281. warp/tests/assets/test_index_grid.nvdb +0 -0
  282. warp/tests/assets/test_int32_grid.nvdb +0 -0
  283. warp/tests/assets/test_vec_grid.nvdb +0 -0
  284. warp/tests/assets/torus.nvdb +0 -0
  285. warp/tests/assets/torus.usda +105 -0
  286. warp/tests/aux_test_class_kernel.py +34 -0
  287. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  288. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  289. warp/tests/aux_test_dependent.py +29 -0
  290. warp/tests/aux_test_grad_customs.py +29 -0
  291. warp/tests/aux_test_instancing_gc.py +26 -0
  292. warp/tests/aux_test_module_unload.py +23 -0
  293. warp/tests/aux_test_name_clash1.py +40 -0
  294. warp/tests/aux_test_name_clash2.py +40 -0
  295. warp/tests/aux_test_reference.py +9 -0
  296. warp/tests/aux_test_reference_reference.py +8 -0
  297. warp/tests/aux_test_square.py +16 -0
  298. warp/tests/aux_test_unresolved_func.py +22 -0
  299. warp/tests/aux_test_unresolved_symbol.py +22 -0
  300. warp/tests/cuda/__init__.py +0 -0
  301. warp/tests/cuda/test_async.py +676 -0
  302. warp/tests/cuda/test_ipc.py +124 -0
  303. warp/tests/cuda/test_mempool.py +233 -0
  304. warp/tests/cuda/test_multigpu.py +169 -0
  305. warp/tests/cuda/test_peer.py +139 -0
  306. warp/tests/cuda/test_pinned.py +84 -0
  307. warp/tests/cuda/test_streams.py +634 -0
  308. warp/tests/geometry/__init__.py +0 -0
  309. warp/tests/geometry/test_bvh.py +200 -0
  310. warp/tests/geometry/test_hash_grid.py +221 -0
  311. warp/tests/geometry/test_marching_cubes.py +74 -0
  312. warp/tests/geometry/test_mesh.py +316 -0
  313. warp/tests/geometry/test_mesh_query_aabb.py +399 -0
  314. warp/tests/geometry/test_mesh_query_point.py +932 -0
  315. warp/tests/geometry/test_mesh_query_ray.py +311 -0
  316. warp/tests/geometry/test_volume.py +1103 -0
  317. warp/tests/geometry/test_volume_write.py +346 -0
  318. warp/tests/interop/__init__.py +0 -0
  319. warp/tests/interop/test_dlpack.py +729 -0
  320. warp/tests/interop/test_jax.py +371 -0
  321. warp/tests/interop/test_paddle.py +800 -0
  322. warp/tests/interop/test_torch.py +1001 -0
  323. warp/tests/run_coverage_serial.py +39 -0
  324. warp/tests/sim/__init__.py +0 -0
  325. warp/tests/sim/disabled_kinematics.py +244 -0
  326. warp/tests/sim/flaky_test_sim_grad.py +290 -0
  327. warp/tests/sim/test_collision.py +604 -0
  328. warp/tests/sim/test_coloring.py +258 -0
  329. warp/tests/sim/test_model.py +224 -0
  330. warp/tests/sim/test_sim_grad_bounce_linear.py +212 -0
  331. warp/tests/sim/test_sim_kinematics.py +98 -0
  332. warp/tests/sim/test_vbd.py +597 -0
  333. warp/tests/test_adam.py +163 -0
  334. warp/tests/test_arithmetic.py +1096 -0
  335. warp/tests/test_array.py +2972 -0
  336. warp/tests/test_array_reduce.py +156 -0
  337. warp/tests/test_assert.py +250 -0
  338. warp/tests/test_atomic.py +153 -0
  339. warp/tests/test_bool.py +220 -0
  340. warp/tests/test_builtins_resolution.py +1298 -0
  341. warp/tests/test_closest_point_edge_edge.py +327 -0
  342. warp/tests/test_codegen.py +810 -0
  343. warp/tests/test_codegen_instancing.py +1495 -0
  344. warp/tests/test_compile_consts.py +215 -0
  345. warp/tests/test_conditional.py +252 -0
  346. warp/tests/test_context.py +42 -0
  347. warp/tests/test_copy.py +238 -0
  348. warp/tests/test_ctypes.py +638 -0
  349. warp/tests/test_dense.py +73 -0
  350. warp/tests/test_devices.py +97 -0
  351. warp/tests/test_examples.py +482 -0
  352. warp/tests/test_fabricarray.py +996 -0
  353. warp/tests/test_fast_math.py +74 -0
  354. warp/tests/test_fem.py +2003 -0
  355. warp/tests/test_fp16.py +136 -0
  356. warp/tests/test_func.py +454 -0
  357. warp/tests/test_future_annotations.py +98 -0
  358. warp/tests/test_generics.py +656 -0
  359. warp/tests/test_grad.py +893 -0
  360. warp/tests/test_grad_customs.py +339 -0
  361. warp/tests/test_grad_debug.py +341 -0
  362. warp/tests/test_implicit_init.py +411 -0
  363. warp/tests/test_import.py +45 -0
  364. warp/tests/test_indexedarray.py +1140 -0
  365. warp/tests/test_intersect.py +73 -0
  366. warp/tests/test_iter.py +76 -0
  367. warp/tests/test_large.py +177 -0
  368. warp/tests/test_launch.py +411 -0
  369. warp/tests/test_lerp.py +151 -0
  370. warp/tests/test_linear_solvers.py +193 -0
  371. warp/tests/test_lvalue.py +427 -0
  372. warp/tests/test_mat.py +2089 -0
  373. warp/tests/test_mat_lite.py +122 -0
  374. warp/tests/test_mat_scalar_ops.py +2913 -0
  375. warp/tests/test_math.py +178 -0
  376. warp/tests/test_mlp.py +282 -0
  377. warp/tests/test_module_hashing.py +258 -0
  378. warp/tests/test_modules_lite.py +44 -0
  379. warp/tests/test_noise.py +252 -0
  380. warp/tests/test_operators.py +299 -0
  381. warp/tests/test_options.py +129 -0
  382. warp/tests/test_overwrite.py +551 -0
  383. warp/tests/test_print.py +339 -0
  384. warp/tests/test_quat.py +2315 -0
  385. warp/tests/test_rand.py +339 -0
  386. warp/tests/test_reload.py +302 -0
  387. warp/tests/test_rounding.py +185 -0
  388. warp/tests/test_runlength_encode.py +196 -0
  389. warp/tests/test_scalar_ops.py +105 -0
  390. warp/tests/test_smoothstep.py +108 -0
  391. warp/tests/test_snippet.py +318 -0
  392. warp/tests/test_sparse.py +582 -0
  393. warp/tests/test_spatial.py +2229 -0
  394. warp/tests/test_special_values.py +361 -0
  395. warp/tests/test_static.py +592 -0
  396. warp/tests/test_struct.py +734 -0
  397. warp/tests/test_tape.py +204 -0
  398. warp/tests/test_transient_module.py +93 -0
  399. warp/tests/test_triangle_closest_point.py +145 -0
  400. warp/tests/test_types.py +562 -0
  401. warp/tests/test_utils.py +588 -0
  402. warp/tests/test_vec.py +1487 -0
  403. warp/tests/test_vec_lite.py +80 -0
  404. warp/tests/test_vec_scalar_ops.py +2327 -0
  405. warp/tests/test_verify_fp.py +100 -0
  406. warp/tests/tile/__init__.py +0 -0
  407. warp/tests/tile/test_tile.py +780 -0
  408. warp/tests/tile/test_tile_load.py +407 -0
  409. warp/tests/tile/test_tile_mathdx.py +208 -0
  410. warp/tests/tile/test_tile_mlp.py +402 -0
  411. warp/tests/tile/test_tile_reduce.py +447 -0
  412. warp/tests/tile/test_tile_shared_memory.py +247 -0
  413. warp/tests/tile/test_tile_view.py +173 -0
  414. warp/tests/unittest_serial.py +47 -0
  415. warp/tests/unittest_suites.py +427 -0
  416. warp/tests/unittest_utils.py +468 -0
  417. warp/tests/walkthrough_debug.py +93 -0
  418. warp/thirdparty/__init__.py +0 -0
  419. warp/thirdparty/appdirs.py +598 -0
  420. warp/thirdparty/dlpack.py +145 -0
  421. warp/thirdparty/unittest_parallel.py +570 -0
  422. warp/torch.py +391 -0
  423. warp/types.py +5230 -0
  424. warp/utils.py +1137 -0
  425. warp_lang-1.7.0.dist-info/METADATA +516 -0
  426. warp_lang-1.7.0.dist-info/RECORD +429 -0
  427. warp_lang-1.7.0.dist-info/WHEEL +5 -0
  428. warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
  429. warp_lang-1.7.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,73 @@
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 unittest
17
+
18
+ import warp as wp
19
+ from warp.tests.unittest_utils import *
20
+
21
+
22
+ @wp.kernel
23
+ def eval_dense_gemm(
24
+ m: int,
25
+ n: int,
26
+ p: int,
27
+ t1: int,
28
+ t2: int,
29
+ A: wp.array(dtype=float),
30
+ B: wp.array(dtype=float),
31
+ C: wp.array(dtype=float),
32
+ ):
33
+ wp.dense_gemm(m, n, p, t1, t2, A, B, C)
34
+
35
+
36
+ @wp.kernel
37
+ def eval_dense_cholesky(n: int, A: wp.array(dtype=float), regularization: float, L: wp.array(dtype=float)):
38
+ wp.dense_chol(n, A, regularization, L)
39
+
40
+
41
+ @wp.kernel
42
+ def eval_dense_subs(n: int, L: wp.array(dtype=float), b: wp.array(dtype=float), x: wp.array(dtype=float)):
43
+ wp.dense_subs(n, L, b, x)
44
+
45
+
46
+ # helper that propagates gradients back to A, treating L as a constant / temporary variable
47
+ # allows us to reuse the Cholesky decomposition from the forward pass
48
+ @wp.kernel
49
+ def eval_dense_solve(
50
+ n: int, A: wp.array(dtype=float), L: wp.array(dtype=float), b: wp.array(dtype=float), x: wp.array(dtype=float)
51
+ ):
52
+ wp.dense_solve(n, A, L, b, x)
53
+
54
+
55
+ def test_dense_compilation(test, device):
56
+ # just testing compilation of the dense matrix routines
57
+ # most are deprecated / WIP
58
+ wp.load_module(device=device)
59
+
60
+
61
+ devices = get_test_devices()
62
+
63
+
64
+ class TestDense(unittest.TestCase):
65
+ pass
66
+
67
+
68
+ add_function_test(TestDense, "test_dense_compilation", test_dense_compilation, devices=devices)
69
+
70
+
71
+ if __name__ == "__main__":
72
+ wp.clear_kernel_cache()
73
+ unittest.main(verbosity=2)
@@ -0,0 +1,97 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2023 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 unittest
17
+
18
+ import warp as wp
19
+ from warp.tests.unittest_utils import *
20
+
21
+
22
+ def test_devices_get_cuda_device_functions(test, device):
23
+ test.assertTrue(device.is_cuda)
24
+ test.assertTrue(wp.is_device_available(device))
25
+
26
+ device_ordinal = device.ordinal
27
+ current_device = wp.get_cuda_device(device_ordinal)
28
+ test.assertEqual(current_device, device)
29
+ current_device = wp.get_cuda_device() # No-ordinal version
30
+ test.assertTrue(wp.is_device_available(current_device))
31
+
32
+ if device == current_device:
33
+ test.assertEqual(device, "cuda")
34
+ else:
35
+ test.assertNotEqual(device, "cuda")
36
+
37
+ preferred_device = wp.get_preferred_device()
38
+ test.assertTrue(wp.is_device_available(preferred_device))
39
+
40
+
41
+ def test_devices_map_cuda_device(test, device):
42
+ with wp.ScopedDevice(device):
43
+ saved_alias = device.alias
44
+ # Map alias twice to check code path
45
+ wp.map_cuda_device("new_alias")
46
+ wp.map_cuda_device("new_alias")
47
+ wp.context.runtime.rename_device(device, saved_alias)
48
+
49
+
50
+ def test_devices_verify_cuda_device(test, device):
51
+ verify_cuda_saved = wp.config.verify_cuda
52
+
53
+ wp.config.verify_cuda = True
54
+
55
+ wp.context.runtime.verify_cuda_device(device)
56
+
57
+ wp.config.verify_cuda = verify_cuda_saved
58
+
59
+
60
+ @unittest.skipUnless(wp.is_cuda_available(), "Requires CUDA")
61
+ def test_devices_can_access_self(test, device):
62
+ test.assertTrue(device.can_access(device))
63
+
64
+ for warp_device in wp.get_devices():
65
+ device_str = str(warp_device)
66
+
67
+ if (device.is_cpu and warp_device.is_cuda) or (device.is_cuda and warp_device.is_cpu):
68
+ test.assertFalse(device.can_access(warp_device))
69
+ test.assertNotEqual(device, warp_device)
70
+ test.assertNotEqual(device, device_str)
71
+
72
+
73
+ devices = get_test_devices()
74
+
75
+
76
+ class TestDevices(unittest.TestCase):
77
+ def test_devices_unmap_imaginary_device(self):
78
+ with self.assertRaises(RuntimeError):
79
+ wp.unmap_cuda_device("imaginary_device:0")
80
+
81
+
82
+ add_function_test(
83
+ TestDevices,
84
+ "test_devices_get_cuda_device_functions",
85
+ test_devices_get_cuda_device_functions,
86
+ devices=get_selected_cuda_test_devices(),
87
+ )
88
+ add_function_test(
89
+ TestDevices, "test_devices_map_cuda_device", test_devices_map_cuda_device, devices=get_selected_cuda_test_devices()
90
+ )
91
+ add_function_test(TestDevices, "test_devices_verify_cuda_device", test_devices_verify_cuda_device, devices=devices)
92
+ add_function_test(TestDevices, "test_devices_can_access_self", test_devices_can_access_self, devices=devices)
93
+
94
+
95
+ if __name__ == "__main__":
96
+ wp.clear_kernel_cache()
97
+ unittest.main(verbosity=2)
@@ -0,0 +1,482 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2023 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
+ """Test Warp examples with unittest.
16
+
17
+ This module tests the Warp examples registered in it using the unittest
18
+ framework. When registering tests with add_example_test(), three optional
19
+ dictionaries can be provided: test_options, test_options_cuda, and
20
+ test_options_cpu. These are added to the command line arguments in-order, so
21
+ if a parameter is specified in both test_options and test_options_cuda, the
22
+ one in test_options_cuda will take precedence due to how argparse works.
23
+
24
+ Generally the test_options[_cpu,_cuda] dictionaries should be used to prevent
25
+ graphical windows from being open by the example {"headless": True} and to
26
+ override example defaults so the example can run in less than ten seconds.
27
+
28
+ To skip tests if the optional dependencies are not found, use the following keys:
29
+ - {"usd_required": True} (requires usd-core)
30
+ - {"torch_required": True} (requires torch)
31
+ - {"pillow_required": True} (requires pillow)
32
+
33
+ Use the "num_frames" and "train_iters" keys to control the number of steps.
34
+
35
+ Use "test_timeout" to override the default test timeout threshold of 600 seconds.
36
+ """
37
+
38
+ import os
39
+ import subprocess
40
+ import sys
41
+ import unittest
42
+ from typing import Any, Dict, Optional, Type
43
+
44
+ import warp as wp
45
+ import warp.tests.unittest_utils
46
+ from warp.tests.unittest_utils import (
47
+ USD_AVAILABLE,
48
+ get_selected_cuda_test_devices,
49
+ get_test_devices,
50
+ sanitize_identifier,
51
+ )
52
+ from warp.utils import check_p2p
53
+
54
+ wp.init() # For wp.context.runtime.core.is_debug_enabled()
55
+
56
+
57
+ def _build_command_line_options(test_options: Dict[str, Any]) -> list:
58
+ """Helper function to build command-line options from the test options dictionary."""
59
+ additional_options = []
60
+
61
+ for key, value in test_options.items():
62
+ if key == "headless" and value:
63
+ additional_options.extend(["--headless"])
64
+ else:
65
+ # Just add --key value
66
+ additional_options.extend(["--" + key, str(value)])
67
+
68
+ return additional_options
69
+
70
+
71
+ def _merge_options(base_options: Dict[str, Any], device_options: Dict[str, Any]) -> Dict[str, Any]:
72
+ """Helper function to merge base test options with device-specific test options."""
73
+ merged_options = base_options.copy()
74
+
75
+ # Update options with device-specific dictionary, overwriting existing keys with the more-specific values
76
+ merged_options.update(device_options)
77
+ return merged_options
78
+
79
+
80
+ def add_example_test(
81
+ cls: Type,
82
+ name: str,
83
+ devices: Optional[list] = None,
84
+ test_options: Optional[Dict[str, Any]] = None,
85
+ test_options_cpu: Optional[Dict[str, Any]] = None,
86
+ test_options_cuda: Optional[Dict[str, Any]] = None,
87
+ ):
88
+ """Registers a Warp example to run on ``devices`` as a TestCase."""
89
+
90
+ if test_options is None:
91
+ test_options = {}
92
+ if test_options_cpu is None:
93
+ test_options_cpu = {}
94
+ if test_options_cuda is None:
95
+ test_options_cuda = {}
96
+
97
+ def run(test, device):
98
+ if wp.get_device(device).is_cuda:
99
+ options = _merge_options(test_options, test_options_cuda)
100
+ else:
101
+ options = _merge_options(test_options, test_options_cpu)
102
+
103
+ # Mark the test as skipped if Torch is not installed but required
104
+ torch_required = options.pop("torch_required", False)
105
+ if torch_required:
106
+ try:
107
+ import torch
108
+
109
+ if wp.get_device(device).is_cuda and not torch.cuda.is_available():
110
+ # Ensure torch has CUDA support
111
+ test.skipTest("Torch not compiled with CUDA support")
112
+
113
+ except Exception as e:
114
+ test.skipTest(f"{e}")
115
+
116
+ # Mark the test as skipped if USD is not installed but required
117
+ usd_required = options.pop("usd_required", False)
118
+ if usd_required and not USD_AVAILABLE:
119
+ test.skipTest("Requires usd-core")
120
+
121
+ # Mark the test as skipped if pillow is not installed but required
122
+ pillow_required = options.pop("pillow_required", False)
123
+ if pillow_required:
124
+ try:
125
+ import PIL # noqa: F401
126
+ except ImportError:
127
+ test.skipTest("Requires pillow")
128
+
129
+ # Find the current Warp cache
130
+ warp_cache_path = wp.config.kernel_cache_dir
131
+
132
+ env_vars = os.environ.copy()
133
+ if warp_cache_path is not None:
134
+ env_vars["WARP_CACHE_PATH"] = warp_cache_path
135
+
136
+ if warp.tests.unittest_utils.coverage_enabled:
137
+ import tempfile
138
+
139
+ # Generate a random coverage data file name - file is deleted along with containing directory
140
+ with tempfile.NamedTemporaryFile(
141
+ dir=warp.tests.unittest_utils.coverage_temp_dir, delete=False
142
+ ) as coverage_file:
143
+ pass
144
+
145
+ command = ["coverage", "run", f"--data-file={coverage_file.name}"]
146
+
147
+ if warp.tests.unittest_utils.coverage_branch:
148
+ command.append("--branch")
149
+
150
+ else:
151
+ command = [sys.executable]
152
+
153
+ # Append Warp commands
154
+ command.extend(["-m", f"warp.examples.{name}", "--device", str(device)])
155
+
156
+ stage_path = (
157
+ options.pop(
158
+ "stage_path",
159
+ os.path.join(os.path.dirname(__file__), f"outputs/{name}_{sanitize_identifier(device)}.usd"),
160
+ )
161
+ if USD_AVAILABLE
162
+ else "None"
163
+ )
164
+
165
+ if stage_path:
166
+ command.extend(["--stage_path", stage_path])
167
+ try:
168
+ os.remove(stage_path)
169
+ except OSError:
170
+ pass
171
+
172
+ command.extend(_build_command_line_options(options))
173
+
174
+ # Set the test timeout in seconds
175
+ test_timeout = options.pop("test_timeout", 600)
176
+
177
+ # with wp.ScopedTimer(f"{name}_{sanitize_identifier(device)}"):
178
+ # Run the script as a subprocess
179
+ result = subprocess.run(
180
+ command, capture_output=True, text=True, env=env_vars, timeout=test_timeout, check=False
181
+ )
182
+
183
+ # Check the return code (0 is standard for success)
184
+ test.assertEqual(
185
+ result.returncode,
186
+ 0,
187
+ msg=f"Failed with return code {result.returncode}, command: {' '.join(command)}\n\nOutput:\n{result.stdout}\n{result.stderr}",
188
+ )
189
+
190
+ # If the test succeeded, try to clean up the output by default
191
+ if stage_path and result.returncode == 0:
192
+ try:
193
+ os.remove(stage_path)
194
+ except OSError:
195
+ pass
196
+
197
+ from warp.tests.unittest_utils import add_function_test
198
+
199
+ add_function_test(cls, f"test_{name}", run, devices=devices, check_output=False)
200
+
201
+
202
+ cuda_test_devices = get_selected_cuda_test_devices(mode="basic") # Don't test on multiple GPUs to save time
203
+ test_devices = get_test_devices(mode="basic")
204
+
205
+ # NOTE: To give the parallel test runner more opportunities to parallelize test cases,
206
+ # we break up the tests into multiple TestCase classes
207
+
208
+
209
+ class TestCoreExamples(unittest.TestCase):
210
+ pass
211
+
212
+
213
+ # Exclude unless we can run headless somehow
214
+ # add_example_test(TestCoreExamples, name="example_render_opengl")
215
+
216
+ add_example_test(TestCoreExamples, name="core.example_dem", devices=test_devices, test_options_cpu={"num_frames": 2})
217
+ add_example_test(
218
+ TestCoreExamples,
219
+ name="core.example_fluid",
220
+ devices=test_devices,
221
+ test_options={"num_frames": 100, "headless": True},
222
+ )
223
+ add_example_test(
224
+ TestCoreExamples,
225
+ name="core.example_graph_capture",
226
+ devices=test_devices,
227
+ test_options={"headless": True},
228
+ test_options_cpu={"num_frames": 100},
229
+ )
230
+ add_example_test(TestCoreExamples, name="core.example_marching_cubes", devices=cuda_test_devices)
231
+ add_example_test(TestCoreExamples, name="core.example_mesh", devices=test_devices, test_options={"usd_required": True})
232
+ add_example_test(
233
+ TestCoreExamples, name="core.example_mesh_intersect", devices=test_devices, test_options={"usd_required": True}
234
+ )
235
+ add_example_test(TestCoreExamples, name="core.example_nvdb", devices=test_devices)
236
+ add_example_test(
237
+ TestCoreExamples,
238
+ name="core.example_raycast",
239
+ devices=test_devices,
240
+ test_options={"usd_required": True, "headless": True},
241
+ )
242
+ add_example_test(
243
+ TestCoreExamples,
244
+ name="core.example_raymarch",
245
+ devices=test_devices,
246
+ test_options={"height": 512, "width": 1024, "headless": True},
247
+ )
248
+ add_example_test(
249
+ TestCoreExamples,
250
+ name="core.example_sample_mesh",
251
+ devices=test_devices,
252
+ test_options_cpu={"num_frames": 1},
253
+ )
254
+ add_example_test(
255
+ TestCoreExamples,
256
+ name="core.example_sph",
257
+ devices=test_devices,
258
+ test_options_cpu={"num_frames": 1},
259
+ )
260
+ add_example_test(
261
+ TestCoreExamples,
262
+ name="core.example_torch",
263
+ devices=test_devices,
264
+ test_options={"headless": True, "num_frames": 1000, "torch_required": True},
265
+ )
266
+ add_example_test(TestCoreExamples, name="core.example_wave", devices=test_devices)
267
+
268
+
269
+ class TestOptimExamples(unittest.TestCase):
270
+ pass
271
+
272
+
273
+ add_example_test(
274
+ TestOptimExamples,
275
+ name="optim.example_bounce",
276
+ devices=test_devices,
277
+ test_options_cpu={"train_iters": 3},
278
+ )
279
+ add_example_test(
280
+ TestOptimExamples,
281
+ name="optim.example_drone",
282
+ devices=test_devices,
283
+ test_options={"headless": True},
284
+ test_options_cpu={"num_frames": 10},
285
+ )
286
+ add_example_test(
287
+ TestOptimExamples,
288
+ name="optim.example_cloth_throw",
289
+ devices=test_devices,
290
+ test_options_cpu={"train_iters": 3},
291
+ )
292
+ add_example_test(
293
+ TestOptimExamples,
294
+ name="optim.example_diffray",
295
+ devices=test_devices,
296
+ test_options={"usd_required": True, "headless": True},
297
+ test_options_cpu={"train_iters": 2},
298
+ )
299
+ add_example_test(
300
+ TestOptimExamples,
301
+ name="optim.example_fluid_checkpoint",
302
+ devices=cuda_test_devices,
303
+ test_options={"headless": True, "train_iters": 5, "num_frames": 300, "pillow_required": True},
304
+ )
305
+ add_example_test(TestOptimExamples, name="optim.example_inverse_kinematics", devices=test_devices)
306
+ add_example_test(
307
+ TestOptimExamples,
308
+ name="optim.example_inverse_kinematics_torch",
309
+ devices=test_devices,
310
+ test_options={"torch_required": True},
311
+ )
312
+ add_example_test(TestOptimExamples, name="optim.example_spring_cage", devices=test_devices)
313
+ add_example_test(
314
+ TestOptimExamples,
315
+ name="optim.example_trajectory",
316
+ devices=test_devices,
317
+ test_options={"headless": True, "train_iters": 50},
318
+ )
319
+ add_example_test(
320
+ TestOptimExamples,
321
+ name="optim.example_softbody_properties",
322
+ devices=test_devices,
323
+ test_options_cuda={
324
+ "train_iters": 1 if warp.context.runtime.core.is_debug_enabled() else 3,
325
+ },
326
+ test_options_cpu={"train_iters": 1},
327
+ )
328
+
329
+
330
+ class TestSimExamples(unittest.TestCase):
331
+ pass
332
+
333
+
334
+ add_example_test(TestSimExamples, name="sim.example_cartpole", devices=test_devices)
335
+ add_example_test(
336
+ TestSimExamples,
337
+ name="sim.example_cloth",
338
+ devices=test_devices,
339
+ test_options={"usd_required": True},
340
+ test_options_cpu={"num_frames": 10},
341
+ )
342
+ add_example_test(
343
+ TestSimExamples, name="sim.example_granular", devices=test_devices, test_options_cpu={"num_frames": 10}
344
+ )
345
+ add_example_test(TestSimExamples, name="sim.example_granular_collision_sdf", devices=cuda_test_devices)
346
+ add_example_test(TestSimExamples, name="sim.example_jacobian_ik", devices=test_devices)
347
+ add_example_test(TestSimExamples, name="sim.example_particle_chain", devices=test_devices)
348
+ add_example_test(
349
+ TestSimExamples, name="sim.example_quadruped", devices=test_devices, test_options_cpu={"num_frames": 100}
350
+ )
351
+ add_example_test(TestSimExamples, name="sim.example_rigid_chain", devices=test_devices)
352
+ add_example_test(
353
+ TestSimExamples,
354
+ name="sim.example_rigid_contact",
355
+ devices=test_devices,
356
+ test_options={"usd_required": True},
357
+ test_options_cpu={"num_frames": 3},
358
+ )
359
+ add_example_test(
360
+ TestSimExamples, name="sim.example_rigid_soft_contact", devices=test_devices, test_options_cpu={"num_frames": 10}
361
+ )
362
+ add_example_test(TestSimExamples, name="sim.example_rigid_force", devices=test_devices)
363
+ add_example_test(TestSimExamples, name="sim.example_rigid_gyroscopic", devices=test_devices)
364
+ add_example_test(
365
+ TestSimExamples, name="sim.example_soft_body", devices=test_devices, test_options_cpu={"num_frames": 10}
366
+ )
367
+
368
+
369
+ class TestFemExamples(unittest.TestCase):
370
+ pass
371
+
372
+
373
+ class TestFemDiffusionExamples(unittest.TestCase):
374
+ pass
375
+
376
+
377
+ # MGPU tests may fail on systems where P2P transfers are misconfigured
378
+ if check_p2p():
379
+ add_example_test(
380
+ TestFemDiffusionExamples,
381
+ name="fem.example_diffusion_mgpu",
382
+ devices=get_selected_cuda_test_devices(mode="basic"),
383
+ test_options={"headless": True},
384
+ )
385
+
386
+ add_example_test(
387
+ TestFemExamples,
388
+ name="fem.example_apic_fluid",
389
+ devices=get_selected_cuda_test_devices(mode="basic"),
390
+ test_options={"num_frames": 5, "voxel_size": 2.0},
391
+ )
392
+ add_example_test(
393
+ TestFemExamples,
394
+ name="fem.example_adaptive_grid",
395
+ devices=get_selected_cuda_test_devices(mode="basic"),
396
+ test_options={"headless": True, "div_conforming": True},
397
+ )
398
+
399
+ # The following examples do not need CUDA
400
+ add_example_test(
401
+ TestFemDiffusionExamples,
402
+ name="fem.example_diffusion",
403
+ devices=test_devices,
404
+ test_options={"resolution": 10, "mesh": "tri", "headless": True},
405
+ )
406
+ add_example_test(
407
+ TestFemDiffusionExamples, name="fem.example_diffusion_3d", devices=test_devices, test_options={"headless": True}
408
+ )
409
+ add_example_test(
410
+ TestFemExamples,
411
+ name="fem.example_deformed_geometry",
412
+ devices=test_devices,
413
+ test_options={"resolution": 10, "mesh": "tri", "headless": True},
414
+ )
415
+ add_example_test(
416
+ TestFemExamples,
417
+ name="fem.example_convection_diffusion",
418
+ devices=test_devices,
419
+ test_options={"resolution": 20, "headless": True},
420
+ )
421
+ add_example_test(
422
+ TestFemExamples,
423
+ name="fem.example_burgers",
424
+ devices=test_devices,
425
+ test_options={"resolution": 20, "num_frames": 25, "degree": 1, "headless": True},
426
+ )
427
+ add_example_test(
428
+ TestFemExamples,
429
+ name="fem.example_convection_diffusion_dg",
430
+ devices=test_devices,
431
+ test_options={"resolution": 20, "num_frames": 25, "headless": True},
432
+ )
433
+ add_example_test(
434
+ TestFemExamples,
435
+ name="fem.example_mixed_elasticity",
436
+ devices=test_devices,
437
+ test_options={"nonconforming_stresses": True, "mesh": "quad", "headless": True},
438
+ )
439
+ add_example_test(
440
+ TestFemExamples, name="fem.example_stokes_transfer", devices=test_devices, test_options={"headless": True}
441
+ )
442
+ add_example_test(
443
+ TestFemExamples,
444
+ name="fem.example_stokes",
445
+ devices=test_devices,
446
+ test_options={"resolution": 10, "nonconforming_pressures": True, "headless": True},
447
+ )
448
+ add_example_test(
449
+ TestFemExamples,
450
+ name="fem.example_navier_stokes",
451
+ devices=test_devices,
452
+ test_options={"num_frames": 101, "resolution": 10, "tri_mesh": True, "headless": True},
453
+ )
454
+ add_example_test(
455
+ TestFemExamples,
456
+ name="fem.example_streamlines",
457
+ devices=get_selected_cuda_test_devices(),
458
+ test_options={"headless": True},
459
+ )
460
+ add_example_test(
461
+ TestFemExamples,
462
+ name="fem.example_distortion_energy",
463
+ devices=get_selected_cuda_test_devices(),
464
+ test_options={"headless": True, "resolution": 16},
465
+ )
466
+ add_example_test(
467
+ TestFemExamples,
468
+ name="fem.example_magnetostatics",
469
+ devices=test_devices,
470
+ test_options={"headless": True, "resolution": 16},
471
+ )
472
+ add_example_test(
473
+ TestFemExamples,
474
+ name="fem.example_nonconforming_contact",
475
+ devices=test_devices,
476
+ test_options={"headless": True, "resolution": 16, "num_steps": 2},
477
+ )
478
+
479
+ if __name__ == "__main__":
480
+ # force rebuild of all kernels
481
+ wp.clear_kernel_cache()
482
+ unittest.main(verbosity=2)