warp-lang 1.7.0__py3-none-manylinux_2_34_aarch64.whl

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

Potentially problematic release.


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

Files changed (429) hide show
  1. warp/__init__.py +139 -0
  2. warp/__init__.pyi +1 -0
  3. warp/autograd.py +1142 -0
  4. warp/bin/warp-clang.so +0 -0
  5. warp/bin/warp.so +0 -0
  6. warp/build.py +557 -0
  7. warp/build_dll.py +405 -0
  8. warp/builtins.py +6855 -0
  9. warp/codegen.py +3969 -0
  10. warp/config.py +158 -0
  11. warp/constants.py +57 -0
  12. warp/context.py +6812 -0
  13. warp/dlpack.py +462 -0
  14. warp/examples/__init__.py +24 -0
  15. warp/examples/assets/bear.usd +0 -0
  16. warp/examples/assets/bunny.usd +0 -0
  17. warp/examples/assets/cartpole.urdf +110 -0
  18. warp/examples/assets/crazyflie.usd +0 -0
  19. warp/examples/assets/cube.usd +0 -0
  20. warp/examples/assets/nonuniform.usd +0 -0
  21. warp/examples/assets/nv_ant.xml +92 -0
  22. warp/examples/assets/nv_humanoid.xml +183 -0
  23. warp/examples/assets/nvidia_logo.png +0 -0
  24. warp/examples/assets/pixel.jpg +0 -0
  25. warp/examples/assets/quadruped.urdf +268 -0
  26. warp/examples/assets/rocks.nvdb +0 -0
  27. warp/examples/assets/rocks.usd +0 -0
  28. warp/examples/assets/sphere.usd +0 -0
  29. warp/examples/assets/square_cloth.usd +0 -0
  30. warp/examples/benchmarks/benchmark_api.py +389 -0
  31. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  32. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  33. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  34. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  35. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  36. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  37. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  38. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  39. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  40. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  41. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  42. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  43. warp/examples/benchmarks/benchmark_launches.py +301 -0
  44. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  45. warp/examples/browse.py +37 -0
  46. warp/examples/core/example_cupy.py +86 -0
  47. warp/examples/core/example_dem.py +241 -0
  48. warp/examples/core/example_fluid.py +299 -0
  49. warp/examples/core/example_graph_capture.py +150 -0
  50. warp/examples/core/example_marching_cubes.py +194 -0
  51. warp/examples/core/example_mesh.py +180 -0
  52. warp/examples/core/example_mesh_intersect.py +211 -0
  53. warp/examples/core/example_nvdb.py +182 -0
  54. warp/examples/core/example_raycast.py +111 -0
  55. warp/examples/core/example_raymarch.py +205 -0
  56. warp/examples/core/example_render_opengl.py +193 -0
  57. warp/examples/core/example_sample_mesh.py +300 -0
  58. warp/examples/core/example_sph.py +411 -0
  59. warp/examples/core/example_torch.py +211 -0
  60. warp/examples/core/example_wave.py +269 -0
  61. warp/examples/fem/example_adaptive_grid.py +286 -0
  62. warp/examples/fem/example_apic_fluid.py +423 -0
  63. warp/examples/fem/example_burgers.py +261 -0
  64. warp/examples/fem/example_convection_diffusion.py +178 -0
  65. warp/examples/fem/example_convection_diffusion_dg.py +204 -0
  66. warp/examples/fem/example_deformed_geometry.py +172 -0
  67. warp/examples/fem/example_diffusion.py +196 -0
  68. warp/examples/fem/example_diffusion_3d.py +225 -0
  69. warp/examples/fem/example_diffusion_mgpu.py +220 -0
  70. warp/examples/fem/example_distortion_energy.py +228 -0
  71. warp/examples/fem/example_magnetostatics.py +240 -0
  72. warp/examples/fem/example_mixed_elasticity.py +291 -0
  73. warp/examples/fem/example_navier_stokes.py +261 -0
  74. warp/examples/fem/example_nonconforming_contact.py +298 -0
  75. warp/examples/fem/example_stokes.py +213 -0
  76. warp/examples/fem/example_stokes_transfer.py +262 -0
  77. warp/examples/fem/example_streamlines.py +352 -0
  78. warp/examples/fem/utils.py +1000 -0
  79. warp/examples/interop/example_jax_callable.py +116 -0
  80. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  81. warp/examples/interop/example_jax_kernel.py +205 -0
  82. warp/examples/optim/example_bounce.py +266 -0
  83. warp/examples/optim/example_cloth_throw.py +228 -0
  84. warp/examples/optim/example_diffray.py +561 -0
  85. warp/examples/optim/example_drone.py +870 -0
  86. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  87. warp/examples/optim/example_inverse_kinematics.py +182 -0
  88. warp/examples/optim/example_inverse_kinematics_torch.py +191 -0
  89. warp/examples/optim/example_softbody_properties.py +400 -0
  90. warp/examples/optim/example_spring_cage.py +245 -0
  91. warp/examples/optim/example_trajectory.py +227 -0
  92. warp/examples/sim/example_cartpole.py +143 -0
  93. warp/examples/sim/example_cloth.py +225 -0
  94. warp/examples/sim/example_cloth_self_contact.py +322 -0
  95. warp/examples/sim/example_granular.py +130 -0
  96. warp/examples/sim/example_granular_collision_sdf.py +202 -0
  97. warp/examples/sim/example_jacobian_ik.py +244 -0
  98. warp/examples/sim/example_particle_chain.py +124 -0
  99. warp/examples/sim/example_quadruped.py +203 -0
  100. warp/examples/sim/example_rigid_chain.py +203 -0
  101. warp/examples/sim/example_rigid_contact.py +195 -0
  102. warp/examples/sim/example_rigid_force.py +133 -0
  103. warp/examples/sim/example_rigid_gyroscopic.py +115 -0
  104. warp/examples/sim/example_rigid_soft_contact.py +140 -0
  105. warp/examples/sim/example_soft_body.py +196 -0
  106. warp/examples/tile/example_tile_cholesky.py +87 -0
  107. warp/examples/tile/example_tile_convolution.py +66 -0
  108. warp/examples/tile/example_tile_fft.py +55 -0
  109. warp/examples/tile/example_tile_filtering.py +113 -0
  110. warp/examples/tile/example_tile_matmul.py +85 -0
  111. warp/examples/tile/example_tile_mlp.py +383 -0
  112. warp/examples/tile/example_tile_nbody.py +199 -0
  113. warp/examples/tile/example_tile_walker.py +327 -0
  114. warp/fabric.py +355 -0
  115. warp/fem/__init__.py +106 -0
  116. warp/fem/adaptivity.py +508 -0
  117. warp/fem/cache.py +572 -0
  118. warp/fem/dirichlet.py +202 -0
  119. warp/fem/domain.py +411 -0
  120. warp/fem/field/__init__.py +125 -0
  121. warp/fem/field/field.py +619 -0
  122. warp/fem/field/nodal_field.py +326 -0
  123. warp/fem/field/restriction.py +37 -0
  124. warp/fem/field/virtual.py +848 -0
  125. warp/fem/geometry/__init__.py +32 -0
  126. warp/fem/geometry/adaptive_nanogrid.py +857 -0
  127. warp/fem/geometry/closest_point.py +84 -0
  128. warp/fem/geometry/deformed_geometry.py +221 -0
  129. warp/fem/geometry/element.py +776 -0
  130. warp/fem/geometry/geometry.py +362 -0
  131. warp/fem/geometry/grid_2d.py +392 -0
  132. warp/fem/geometry/grid_3d.py +452 -0
  133. warp/fem/geometry/hexmesh.py +911 -0
  134. warp/fem/geometry/nanogrid.py +571 -0
  135. warp/fem/geometry/partition.py +389 -0
  136. warp/fem/geometry/quadmesh.py +663 -0
  137. warp/fem/geometry/tetmesh.py +855 -0
  138. warp/fem/geometry/trimesh.py +806 -0
  139. warp/fem/integrate.py +2335 -0
  140. warp/fem/linalg.py +419 -0
  141. warp/fem/operator.py +293 -0
  142. warp/fem/polynomial.py +229 -0
  143. warp/fem/quadrature/__init__.py +17 -0
  144. warp/fem/quadrature/pic_quadrature.py +299 -0
  145. warp/fem/quadrature/quadrature.py +591 -0
  146. warp/fem/space/__init__.py +228 -0
  147. warp/fem/space/basis_function_space.py +468 -0
  148. warp/fem/space/basis_space.py +667 -0
  149. warp/fem/space/dof_mapper.py +251 -0
  150. warp/fem/space/function_space.py +309 -0
  151. warp/fem/space/grid_2d_function_space.py +177 -0
  152. warp/fem/space/grid_3d_function_space.py +227 -0
  153. warp/fem/space/hexmesh_function_space.py +257 -0
  154. warp/fem/space/nanogrid_function_space.py +201 -0
  155. warp/fem/space/partition.py +367 -0
  156. warp/fem/space/quadmesh_function_space.py +223 -0
  157. warp/fem/space/restriction.py +179 -0
  158. warp/fem/space/shape/__init__.py +143 -0
  159. warp/fem/space/shape/cube_shape_function.py +1105 -0
  160. warp/fem/space/shape/shape_function.py +133 -0
  161. warp/fem/space/shape/square_shape_function.py +926 -0
  162. warp/fem/space/shape/tet_shape_function.py +834 -0
  163. warp/fem/space/shape/triangle_shape_function.py +672 -0
  164. warp/fem/space/tetmesh_function_space.py +271 -0
  165. warp/fem/space/topology.py +424 -0
  166. warp/fem/space/trimesh_function_space.py +194 -0
  167. warp/fem/types.py +99 -0
  168. warp/fem/utils.py +420 -0
  169. warp/jax.py +187 -0
  170. warp/jax_experimental/__init__.py +16 -0
  171. warp/jax_experimental/custom_call.py +351 -0
  172. warp/jax_experimental/ffi.py +698 -0
  173. warp/jax_experimental/xla_ffi.py +602 -0
  174. warp/math.py +244 -0
  175. warp/native/array.h +1145 -0
  176. warp/native/builtin.h +1800 -0
  177. warp/native/bvh.cpp +492 -0
  178. warp/native/bvh.cu +791 -0
  179. warp/native/bvh.h +554 -0
  180. warp/native/clang/clang.cpp +536 -0
  181. warp/native/coloring.cpp +613 -0
  182. warp/native/crt.cpp +51 -0
  183. warp/native/crt.h +362 -0
  184. warp/native/cuda_crt.h +1058 -0
  185. warp/native/cuda_util.cpp +646 -0
  186. warp/native/cuda_util.h +307 -0
  187. warp/native/error.cpp +77 -0
  188. warp/native/error.h +36 -0
  189. warp/native/exports.h +1878 -0
  190. warp/native/fabric.h +245 -0
  191. warp/native/hashgrid.cpp +311 -0
  192. warp/native/hashgrid.cu +87 -0
  193. warp/native/hashgrid.h +240 -0
  194. warp/native/initializer_array.h +41 -0
  195. warp/native/intersect.h +1230 -0
  196. warp/native/intersect_adj.h +375 -0
  197. warp/native/intersect_tri.h +339 -0
  198. warp/native/marching.cpp +19 -0
  199. warp/native/marching.cu +514 -0
  200. warp/native/marching.h +19 -0
  201. warp/native/mat.h +2220 -0
  202. warp/native/mathdx.cpp +87 -0
  203. warp/native/matnn.h +343 -0
  204. warp/native/mesh.cpp +266 -0
  205. warp/native/mesh.cu +404 -0
  206. warp/native/mesh.h +1980 -0
  207. warp/native/nanovdb/GridHandle.h +366 -0
  208. warp/native/nanovdb/HostBuffer.h +590 -0
  209. warp/native/nanovdb/NanoVDB.h +6624 -0
  210. warp/native/nanovdb/PNanoVDB.h +3390 -0
  211. warp/native/noise.h +859 -0
  212. warp/native/quat.h +1371 -0
  213. warp/native/rand.h +342 -0
  214. warp/native/range.h +139 -0
  215. warp/native/reduce.cpp +174 -0
  216. warp/native/reduce.cu +364 -0
  217. warp/native/runlength_encode.cpp +79 -0
  218. warp/native/runlength_encode.cu +61 -0
  219. warp/native/scan.cpp +47 -0
  220. warp/native/scan.cu +53 -0
  221. warp/native/scan.h +23 -0
  222. warp/native/solid_angle.h +466 -0
  223. warp/native/sort.cpp +251 -0
  224. warp/native/sort.cu +277 -0
  225. warp/native/sort.h +33 -0
  226. warp/native/sparse.cpp +378 -0
  227. warp/native/sparse.cu +524 -0
  228. warp/native/spatial.h +657 -0
  229. warp/native/svd.h +702 -0
  230. warp/native/temp_buffer.h +46 -0
  231. warp/native/tile.h +2584 -0
  232. warp/native/tile_reduce.h +264 -0
  233. warp/native/vec.h +1426 -0
  234. warp/native/volume.cpp +501 -0
  235. warp/native/volume.cu +67 -0
  236. warp/native/volume.h +969 -0
  237. warp/native/volume_builder.cu +477 -0
  238. warp/native/volume_builder.h +52 -0
  239. warp/native/volume_impl.h +70 -0
  240. warp/native/warp.cpp +1082 -0
  241. warp/native/warp.cu +3636 -0
  242. warp/native/warp.h +381 -0
  243. warp/optim/__init__.py +17 -0
  244. warp/optim/adam.py +163 -0
  245. warp/optim/linear.py +1137 -0
  246. warp/optim/sgd.py +112 -0
  247. warp/paddle.py +407 -0
  248. warp/render/__init__.py +18 -0
  249. warp/render/render_opengl.py +3518 -0
  250. warp/render/render_usd.py +784 -0
  251. warp/render/utils.py +160 -0
  252. warp/sim/__init__.py +65 -0
  253. warp/sim/articulation.py +793 -0
  254. warp/sim/collide.py +2395 -0
  255. warp/sim/graph_coloring.py +300 -0
  256. warp/sim/import_mjcf.py +790 -0
  257. warp/sim/import_snu.py +227 -0
  258. warp/sim/import_urdf.py +579 -0
  259. warp/sim/import_usd.py +894 -0
  260. warp/sim/inertia.py +324 -0
  261. warp/sim/integrator.py +242 -0
  262. warp/sim/integrator_euler.py +1997 -0
  263. warp/sim/integrator_featherstone.py +2101 -0
  264. warp/sim/integrator_vbd.py +2048 -0
  265. warp/sim/integrator_xpbd.py +3292 -0
  266. warp/sim/model.py +4791 -0
  267. warp/sim/particles.py +121 -0
  268. warp/sim/render.py +427 -0
  269. warp/sim/utils.py +428 -0
  270. warp/sparse.py +2057 -0
  271. warp/stubs.py +3333 -0
  272. warp/tape.py +1203 -0
  273. warp/tests/__init__.py +1 -0
  274. warp/tests/__main__.py +4 -0
  275. warp/tests/assets/curlnoise_golden.npy +0 -0
  276. warp/tests/assets/mlp_golden.npy +0 -0
  277. warp/tests/assets/pixel.npy +0 -0
  278. warp/tests/assets/pnoise_golden.npy +0 -0
  279. warp/tests/assets/spiky.usd +0 -0
  280. warp/tests/assets/test_grid.nvdb +0 -0
  281. warp/tests/assets/test_index_grid.nvdb +0 -0
  282. warp/tests/assets/test_int32_grid.nvdb +0 -0
  283. warp/tests/assets/test_vec_grid.nvdb +0 -0
  284. warp/tests/assets/torus.nvdb +0 -0
  285. warp/tests/assets/torus.usda +105 -0
  286. warp/tests/aux_test_class_kernel.py +34 -0
  287. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  288. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  289. warp/tests/aux_test_dependent.py +29 -0
  290. warp/tests/aux_test_grad_customs.py +29 -0
  291. warp/tests/aux_test_instancing_gc.py +26 -0
  292. warp/tests/aux_test_module_unload.py +23 -0
  293. warp/tests/aux_test_name_clash1.py +40 -0
  294. warp/tests/aux_test_name_clash2.py +40 -0
  295. warp/tests/aux_test_reference.py +9 -0
  296. warp/tests/aux_test_reference_reference.py +8 -0
  297. warp/tests/aux_test_square.py +16 -0
  298. warp/tests/aux_test_unresolved_func.py +22 -0
  299. warp/tests/aux_test_unresolved_symbol.py +22 -0
  300. warp/tests/cuda/__init__.py +0 -0
  301. warp/tests/cuda/test_async.py +676 -0
  302. warp/tests/cuda/test_ipc.py +124 -0
  303. warp/tests/cuda/test_mempool.py +233 -0
  304. warp/tests/cuda/test_multigpu.py +169 -0
  305. warp/tests/cuda/test_peer.py +139 -0
  306. warp/tests/cuda/test_pinned.py +84 -0
  307. warp/tests/cuda/test_streams.py +634 -0
  308. warp/tests/geometry/__init__.py +0 -0
  309. warp/tests/geometry/test_bvh.py +200 -0
  310. warp/tests/geometry/test_hash_grid.py +221 -0
  311. warp/tests/geometry/test_marching_cubes.py +74 -0
  312. warp/tests/geometry/test_mesh.py +316 -0
  313. warp/tests/geometry/test_mesh_query_aabb.py +399 -0
  314. warp/tests/geometry/test_mesh_query_point.py +932 -0
  315. warp/tests/geometry/test_mesh_query_ray.py +311 -0
  316. warp/tests/geometry/test_volume.py +1103 -0
  317. warp/tests/geometry/test_volume_write.py +346 -0
  318. warp/tests/interop/__init__.py +0 -0
  319. warp/tests/interop/test_dlpack.py +729 -0
  320. warp/tests/interop/test_jax.py +371 -0
  321. warp/tests/interop/test_paddle.py +800 -0
  322. warp/tests/interop/test_torch.py +1001 -0
  323. warp/tests/run_coverage_serial.py +39 -0
  324. warp/tests/sim/__init__.py +0 -0
  325. warp/tests/sim/disabled_kinematics.py +244 -0
  326. warp/tests/sim/flaky_test_sim_grad.py +290 -0
  327. warp/tests/sim/test_collision.py +604 -0
  328. warp/tests/sim/test_coloring.py +258 -0
  329. warp/tests/sim/test_model.py +224 -0
  330. warp/tests/sim/test_sim_grad_bounce_linear.py +212 -0
  331. warp/tests/sim/test_sim_kinematics.py +98 -0
  332. warp/tests/sim/test_vbd.py +597 -0
  333. warp/tests/test_adam.py +163 -0
  334. warp/tests/test_arithmetic.py +1096 -0
  335. warp/tests/test_array.py +2972 -0
  336. warp/tests/test_array_reduce.py +156 -0
  337. warp/tests/test_assert.py +250 -0
  338. warp/tests/test_atomic.py +153 -0
  339. warp/tests/test_bool.py +220 -0
  340. warp/tests/test_builtins_resolution.py +1298 -0
  341. warp/tests/test_closest_point_edge_edge.py +327 -0
  342. warp/tests/test_codegen.py +810 -0
  343. warp/tests/test_codegen_instancing.py +1495 -0
  344. warp/tests/test_compile_consts.py +215 -0
  345. warp/tests/test_conditional.py +252 -0
  346. warp/tests/test_context.py +42 -0
  347. warp/tests/test_copy.py +238 -0
  348. warp/tests/test_ctypes.py +638 -0
  349. warp/tests/test_dense.py +73 -0
  350. warp/tests/test_devices.py +97 -0
  351. warp/tests/test_examples.py +482 -0
  352. warp/tests/test_fabricarray.py +996 -0
  353. warp/tests/test_fast_math.py +74 -0
  354. warp/tests/test_fem.py +2003 -0
  355. warp/tests/test_fp16.py +136 -0
  356. warp/tests/test_func.py +454 -0
  357. warp/tests/test_future_annotations.py +98 -0
  358. warp/tests/test_generics.py +656 -0
  359. warp/tests/test_grad.py +893 -0
  360. warp/tests/test_grad_customs.py +339 -0
  361. warp/tests/test_grad_debug.py +341 -0
  362. warp/tests/test_implicit_init.py +411 -0
  363. warp/tests/test_import.py +45 -0
  364. warp/tests/test_indexedarray.py +1140 -0
  365. warp/tests/test_intersect.py +73 -0
  366. warp/tests/test_iter.py +76 -0
  367. warp/tests/test_large.py +177 -0
  368. warp/tests/test_launch.py +411 -0
  369. warp/tests/test_lerp.py +151 -0
  370. warp/tests/test_linear_solvers.py +193 -0
  371. warp/tests/test_lvalue.py +427 -0
  372. warp/tests/test_mat.py +2089 -0
  373. warp/tests/test_mat_lite.py +122 -0
  374. warp/tests/test_mat_scalar_ops.py +2913 -0
  375. warp/tests/test_math.py +178 -0
  376. warp/tests/test_mlp.py +282 -0
  377. warp/tests/test_module_hashing.py +258 -0
  378. warp/tests/test_modules_lite.py +44 -0
  379. warp/tests/test_noise.py +252 -0
  380. warp/tests/test_operators.py +299 -0
  381. warp/tests/test_options.py +129 -0
  382. warp/tests/test_overwrite.py +551 -0
  383. warp/tests/test_print.py +339 -0
  384. warp/tests/test_quat.py +2315 -0
  385. warp/tests/test_rand.py +339 -0
  386. warp/tests/test_reload.py +302 -0
  387. warp/tests/test_rounding.py +185 -0
  388. warp/tests/test_runlength_encode.py +196 -0
  389. warp/tests/test_scalar_ops.py +105 -0
  390. warp/tests/test_smoothstep.py +108 -0
  391. warp/tests/test_snippet.py +318 -0
  392. warp/tests/test_sparse.py +582 -0
  393. warp/tests/test_spatial.py +2229 -0
  394. warp/tests/test_special_values.py +361 -0
  395. warp/tests/test_static.py +592 -0
  396. warp/tests/test_struct.py +734 -0
  397. warp/tests/test_tape.py +204 -0
  398. warp/tests/test_transient_module.py +93 -0
  399. warp/tests/test_triangle_closest_point.py +145 -0
  400. warp/tests/test_types.py +562 -0
  401. warp/tests/test_utils.py +588 -0
  402. warp/tests/test_vec.py +1487 -0
  403. warp/tests/test_vec_lite.py +80 -0
  404. warp/tests/test_vec_scalar_ops.py +2327 -0
  405. warp/tests/test_verify_fp.py +100 -0
  406. warp/tests/tile/__init__.py +0 -0
  407. warp/tests/tile/test_tile.py +780 -0
  408. warp/tests/tile/test_tile_load.py +407 -0
  409. warp/tests/tile/test_tile_mathdx.py +208 -0
  410. warp/tests/tile/test_tile_mlp.py +402 -0
  411. warp/tests/tile/test_tile_reduce.py +447 -0
  412. warp/tests/tile/test_tile_shared_memory.py +247 -0
  413. warp/tests/tile/test_tile_view.py +173 -0
  414. warp/tests/unittest_serial.py +47 -0
  415. warp/tests/unittest_suites.py +427 -0
  416. warp/tests/unittest_utils.py +468 -0
  417. warp/tests/walkthrough_debug.py +93 -0
  418. warp/thirdparty/__init__.py +0 -0
  419. warp/thirdparty/appdirs.py +598 -0
  420. warp/thirdparty/dlpack.py +145 -0
  421. warp/thirdparty/unittest_parallel.py +570 -0
  422. warp/torch.py +391 -0
  423. warp/types.py +5230 -0
  424. warp/utils.py +1137 -0
  425. warp_lang-1.7.0.dist-info/METADATA +516 -0
  426. warp_lang-1.7.0.dist-info/RECORD +429 -0
  427. warp_lang-1.7.0.dist-info/WHEEL +5 -0
  428. warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
  429. warp_lang-1.7.0.dist-info/top_level.txt +1 -0
warp/fem/dirichlet.py ADDED
@@ -0,0 +1,202 @@
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
+ from typing import Any, Optional
17
+
18
+ import warp as wp
19
+ from warp.fem.linalg import array_axpy, symmetric_eigenvalues_qr
20
+ from warp.sparse import BsrMatrix, bsr_assign, bsr_axpy, bsr_copy, bsr_mm, bsr_mv
21
+ from warp.types import type_is_matrix, type_length
22
+
23
+
24
+ def normalize_dirichlet_projector(projector_matrix: BsrMatrix, fixed_value: Optional[wp.array] = None):
25
+ """
26
+ Scale projector so that it becomes idempotent, and apply the same scaling to fixed_value if provided
27
+ """
28
+
29
+ if projector_matrix.nrow < projector_matrix.nnz or projector_matrix.ncol != projector_matrix.nrow:
30
+ raise ValueError("Projector must be a square diagonal matrix, with at most one non-zero block per row")
31
+
32
+ # Cast blocks to matrix type if necessary
33
+ projector_values = projector_matrix.values
34
+ if not type_is_matrix(projector_values.dtype):
35
+ projector_values = wp.array(
36
+ data=None,
37
+ ptr=projector_values.ptr,
38
+ capacity=projector_values.capacity,
39
+ device=projector_values.device,
40
+ dtype=wp.mat(shape=projector_matrix.block_shape, dtype=projector_matrix.scalar_type),
41
+ shape=projector_values.shape[0],
42
+ )
43
+
44
+ if fixed_value is None:
45
+ wp.launch(
46
+ kernel=_normalize_dirichlet_projector_kernel,
47
+ dim=projector_matrix.nrow,
48
+ device=projector_values.device,
49
+ inputs=[projector_matrix.offsets, projector_matrix.columns, projector_values],
50
+ )
51
+
52
+ else:
53
+ if fixed_value.shape[0] != projector_matrix.nrow:
54
+ raise ValueError("Fixed value array must be of length equal to the number of rows of blocks")
55
+
56
+ if type_length(fixed_value.dtype) == 1:
57
+ # array of scalars, convert to 1d array of vectors
58
+ fixed_value = wp.array(
59
+ data=None,
60
+ ptr=fixed_value.ptr,
61
+ capacity=fixed_value.capacity,
62
+ device=fixed_value.device,
63
+ dtype=wp.vec(length=projector_matrix.block_shape[0], dtype=projector_matrix.scalar_type),
64
+ shape=fixed_value.shape[0],
65
+ )
66
+
67
+ wp.launch(
68
+ kernel=_normalize_dirichlet_projector_and_values_kernel,
69
+ dim=projector_matrix.nrow,
70
+ device=projector_values.device,
71
+ inputs=[projector_matrix.offsets, projector_matrix.columns, projector_values, fixed_value],
72
+ )
73
+
74
+
75
+ def project_system_rhs(
76
+ system_matrix: BsrMatrix, system_rhs: wp.array, projector_matrix: BsrMatrix, fixed_value: Optional[wp.array] = None
77
+ ):
78
+ """Projects the right-hand-side of a linear system to enforce Dirichlet boundary conditions
79
+
80
+ ``rhs = (I - projector) * ( rhs - system * projector * fixed_value) + projector * fixed_value``
81
+ """
82
+
83
+ rhs_tmp = wp.empty_like(system_rhs)
84
+ rhs_tmp.assign(system_rhs)
85
+
86
+ if fixed_value is None:
87
+ system_rhs.zero_()
88
+ else:
89
+ bsr_mv(A=projector_matrix, x=fixed_value, y=system_rhs, alpha=1.0, beta=0.0)
90
+
91
+ bsr_mv(A=system_matrix, x=system_rhs, y=rhs_tmp, alpha=-1.0, beta=1.0)
92
+
93
+ # here rhs_tmp = system_rhs - system_matrix * projector * fixed_value
94
+ # system_rhs = projector * fixed_value
95
+ array_axpy(x=rhs_tmp, y=system_rhs, alpha=1.0, beta=1.0)
96
+ bsr_mv(A=projector_matrix, x=rhs_tmp, y=system_rhs, alpha=-1.0, beta=1.0)
97
+
98
+
99
+ def project_system_matrix(system_matrix: BsrMatrix, projector_matrix: BsrMatrix):
100
+ """Projects the right-hand-side of a linear system to enforce Dirichlet boundary conditions
101
+
102
+ ``system = (I - projector) * system * (I - projector) + projector``
103
+ """
104
+
105
+ complement_system = bsr_copy(system_matrix)
106
+ bsr_mm(x=projector_matrix, y=system_matrix, z=complement_system, alpha=-1.0, beta=1.0)
107
+
108
+ bsr_assign(dest=system_matrix, src=complement_system)
109
+ bsr_axpy(x=projector_matrix, y=system_matrix)
110
+ bsr_mm(x=complement_system, y=projector_matrix, z=system_matrix, alpha=-1.0, beta=1.0)
111
+
112
+
113
+ def project_linear_system(
114
+ system_matrix: BsrMatrix,
115
+ system_rhs: wp.array,
116
+ projector_matrix: BsrMatrix,
117
+ fixed_value: Optional[wp.array] = None,
118
+ normalize_projector=True,
119
+ ):
120
+ """
121
+ Projects both the left-hand-side and right-hand-side of a linear system to enforce Dirichlet boundary conditions
122
+
123
+ If normalize_projector is True, first apply scaling so that the projector_matrix is idempotent
124
+ """
125
+ if normalize_projector:
126
+ normalize_dirichlet_projector(projector_matrix, fixed_value)
127
+
128
+ project_system_rhs(system_matrix, system_rhs, projector_matrix, fixed_value)
129
+ project_system_matrix(system_matrix, projector_matrix)
130
+
131
+
132
+ @wp.func
133
+ def _normalize_projector_and_value(A: Any, b: Any):
134
+ # Do a modal decomposition of the left and right hand side,
135
+ # Make lhs an orthogonal projection and apply corresponding scaling to righ-hand-side
136
+
137
+ eps = wp.trace(A) * A.dtype(1.0e-6)
138
+
139
+ diag, ev = symmetric_eigenvalues_qr(A, eps * eps)
140
+
141
+ zero = A.dtype(0)
142
+ A_unitary = type(A)(zero)
143
+ b_normalized = type(b)(zero)
144
+
145
+ for k in range(b.length):
146
+ if diag[k] > eps: # ignore small eigenmodes
147
+ v = ev[k]
148
+ A_unitary += wp.outer(v, v)
149
+ b_normalized += wp.dot(v, b) / diag[k] * v
150
+
151
+ return A_unitary, b_normalized
152
+
153
+
154
+ @wp.kernel
155
+ def _normalize_dirichlet_projector_and_values_kernel(
156
+ offsets: wp.array(dtype=int),
157
+ columns: wp.array(dtype=int),
158
+ block_values: wp.array(dtype=Any),
159
+ fixed_values: wp.array(dtype=Any),
160
+ ):
161
+ row = wp.tid()
162
+
163
+ beg = offsets[row]
164
+ end = offsets[row + 1]
165
+
166
+ if beg == end:
167
+ return
168
+
169
+ diag = wp.lower_bound(columns, beg, end, row)
170
+
171
+ if diag < end:
172
+ if columns[diag] == row:
173
+ P = block_values[diag]
174
+
175
+ P_norm, v_norm = _normalize_projector_and_value(P, fixed_values[row])
176
+
177
+ block_values[diag] = P_norm
178
+ fixed_values[row] = v_norm
179
+
180
+
181
+ @wp.kernel
182
+ def _normalize_dirichlet_projector_kernel(
183
+ offsets: wp.array(dtype=int),
184
+ columns: wp.array(dtype=int),
185
+ block_values: wp.array(dtype=Any),
186
+ ):
187
+ row = wp.tid()
188
+
189
+ beg = offsets[row]
190
+ end = offsets[row + 1]
191
+
192
+ if beg == end:
193
+ return
194
+
195
+ diag = wp.lower_bound(columns, beg, end, row)
196
+
197
+ if diag < end:
198
+ if columns[diag] == row:
199
+ P = block_values[diag]
200
+
201
+ P_norm, v_norm = _normalize_projector_and_value(P, type(P[0])())
202
+ block_values[diag] = P_norm
warp/fem/domain.py ADDED
@@ -0,0 +1,411 @@
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
+ from typing import Any, Optional, Set, Union
17
+
18
+ import warp as wp
19
+ import warp.codegen
20
+ import warp.context
21
+ import warp.fem.cache as cache
22
+ import warp.fem.utils as utils
23
+ from warp.fem.geometry import (
24
+ Element,
25
+ Geometry,
26
+ GeometryPartition,
27
+ WholeGeometryPartition,
28
+ )
29
+ from warp.fem.operator import Operator
30
+ from warp.fem.types import ElementKind
31
+
32
+ GeometryOrPartition = Union[Geometry, GeometryPartition]
33
+
34
+
35
+ class GeometryDomain:
36
+ """Interface class for domains, i.e. (partial) views of elements in a Geometry"""
37
+
38
+ def __init__(self, geometry: GeometryOrPartition):
39
+ if isinstance(geometry, GeometryPartition):
40
+ self.geometry_partition = geometry
41
+ else:
42
+ self.geometry_partition = WholeGeometryPartition(geometry)
43
+
44
+ self.geometry = self.geometry_partition.geometry
45
+
46
+ @property
47
+ def name(self) -> str:
48
+ return f"{self.geometry_partition.name}_{self.__class__.__name__}"
49
+
50
+ def __str__(self) -> str:
51
+ return self.name
52
+
53
+ def __eq__(self, other) -> bool:
54
+ return self.__class__ == other.__class__ and self.geometry_partition == other.geometry_partition
55
+
56
+ @property
57
+ def element_kind(self) -> ElementKind:
58
+ """Kind of elements that this domain contains (cells or sides)"""
59
+ raise NotImplementedError
60
+
61
+ @property
62
+ def dimension(self) -> int:
63
+ """Dimension of the elements of the domain"""
64
+ raise NotImplementedError
65
+
66
+ def element_count(self) -> int:
67
+ """Number of elements in the domain"""
68
+ raise NotImplementedError
69
+
70
+ def geometry_element_count(self) -> int:
71
+ """Number of elements in the underlying geometry"""
72
+ return self.geometry.cell_count()
73
+
74
+ def reference_element(self) -> Element:
75
+ """Protypical element"""
76
+ raise NotImplementedError
77
+
78
+ def element_index_arg_value(self, device: warp.context.Devicelike) -> warp.codegen.StructInstance:
79
+ """Value of the argument to be passed to device functions"""
80
+ raise NotImplementedError
81
+
82
+ def element_arg_value(self, device: warp.context.Devicelike) -> warp.codegen.StructInstance:
83
+ """Value of the argument to be passed to device functions"""
84
+ raise NotImplementedError
85
+
86
+ ElementIndexArg: warp.codegen.Struct
87
+ """Structure containing arguments to be passed to device functions computing element indices"""
88
+
89
+ element_index: wp.Function
90
+ """Device function for retrieving an ElementIndex from a linearized index"""
91
+
92
+ ElementArg: warp.codegen.Struct
93
+ """Structure containing arguments to be passed to device functions computing element geometry"""
94
+
95
+ element_measure: wp.Function
96
+ """Device function returning the measure determinant (e.g. volume, area) at a given point"""
97
+
98
+ element_measure_ratio: wp.Function
99
+ """Device function returning the ratio of the measure of a side to that of its neighbour cells"""
100
+
101
+ element_position: wp.Function
102
+ """Device function returning the element position at a sample point"""
103
+
104
+ element_deformation_gradient: wp.Function
105
+ """Device function returning the gradient of the position with respect to the element's reference space"""
106
+
107
+ element_normal: wp.Function
108
+ """Device function returning the element normal at a sample point"""
109
+
110
+ element_lookup: wp.Function
111
+ """Device function returning the sample point corresponding to a world position"""
112
+
113
+ def notify_operator_usage(self, ops: Set[Operator]):
114
+ """Makes the Domain aware that the operators `ops` will be applied"""
115
+ pass
116
+
117
+
118
+ class Cells(GeometryDomain):
119
+ """A Domain containing all cells of the geometry or geometry partition"""
120
+
121
+ def __init__(self, geometry: GeometryOrPartition):
122
+ super().__init__(geometry)
123
+
124
+ @property
125
+ def element_kind(self) -> ElementKind:
126
+ return ElementKind.CELL
127
+
128
+ @property
129
+ def dimension(self) -> int:
130
+ return self.geometry.dimension
131
+
132
+ def reference_element(self) -> Element:
133
+ return self.geometry.reference_cell()
134
+
135
+ def element_count(self) -> int:
136
+ return self.geometry_partition.cell_count()
137
+
138
+ def geometry_element_count(self) -> int:
139
+ return self.geometry.cell_count()
140
+
141
+ @property
142
+ def ElementIndexArg(self) -> warp.codegen.Struct:
143
+ return self.geometry_partition.CellArg
144
+
145
+ def element_index_arg_value(self, device: warp.context.Devicelike) -> warp.codegen.StructInstance:
146
+ return self.geometry_partition.cell_arg_value(device)
147
+
148
+ @property
149
+ def element_index(self) -> wp.Function:
150
+ return self.geometry_partition.cell_index
151
+
152
+ def element_arg_value(self, device: warp.context.Devicelike) -> warp.codegen.StructInstance:
153
+ return self.geometry.cell_arg_value(device)
154
+
155
+ @property
156
+ def ElementArg(self) -> warp.codegen.Struct:
157
+ return self.geometry.CellArg
158
+
159
+ @property
160
+ def element_position(self) -> wp.Function:
161
+ return self.geometry.cell_position
162
+
163
+ @property
164
+ def element_deformation_gradient(self) -> wp.Function:
165
+ return self.geometry.cell_deformation_gradient
166
+
167
+ @property
168
+ def element_measure(self) -> wp.Function:
169
+ return self.geometry.cell_measure
170
+
171
+ @property
172
+ def element_measure_ratio(self) -> wp.Function:
173
+ return self.geometry.cell_measure_ratio
174
+
175
+ @property
176
+ def element_normal(self) -> wp.Function:
177
+ return self.geometry.cell_normal
178
+
179
+ @property
180
+ def element_lookup(self) -> wp.Function:
181
+ return self.geometry.cell_lookup
182
+
183
+ @property
184
+ def domain_cell_arg(self) -> wp.Function:
185
+ return Cells._identity_fn
186
+
187
+ def cell_domain(self):
188
+ return self
189
+
190
+ @wp.func
191
+ def _identity_fn(x: Any):
192
+ return x
193
+
194
+
195
+ class Sides(GeometryDomain):
196
+ """A Domain containing all (interior and boundary) sides of the geometry or geometry partition"""
197
+
198
+ def __init__(self, geometry: GeometryOrPartition):
199
+ self.geometry = geometry
200
+ super().__init__(geometry)
201
+
202
+ self.element_lookup = None
203
+
204
+ @property
205
+ def element_kind(self) -> ElementKind:
206
+ return ElementKind.SIDE
207
+
208
+ @property
209
+ def dimension(self) -> int:
210
+ return self.geometry.dimension - 1
211
+
212
+ def reference_element(self) -> Element:
213
+ return self.geometry.reference_side()
214
+
215
+ def element_count(self) -> int:
216
+ return self.geometry_partition.side_count()
217
+
218
+ def geometry_element_count(self) -> int:
219
+ return self.geometry.side_count()
220
+
221
+ @property
222
+ def ElementIndexArg(self) -> warp.codegen.Struct:
223
+ return self.geometry_partition.SideArg
224
+
225
+ def element_index_arg_value(self, device: warp.context.Devicelike) -> warp.codegen.StructInstance:
226
+ return self.geometry_partition.side_arg_value(device)
227
+
228
+ @property
229
+ def element_index(self) -> wp.Function:
230
+ return self.geometry_partition.side_index
231
+
232
+ @property
233
+ def ElementArg(self) -> warp.codegen.Struct:
234
+ return self.geometry.SideArg
235
+
236
+ def element_arg_value(self, device: warp.context.Devicelike) -> warp.codegen.StructInstance:
237
+ return self.geometry.side_arg_value(device)
238
+
239
+ @property
240
+ def element_position(self) -> wp.Function:
241
+ return self.geometry.side_position
242
+
243
+ @property
244
+ def element_deformation_gradient(self) -> wp.Function:
245
+ return self.geometry.side_deformation_gradient
246
+
247
+ @property
248
+ def element_measure(self) -> wp.Function:
249
+ return self.geometry.side_measure
250
+
251
+ @property
252
+ def element_measure_ratio(self) -> wp.Function:
253
+ return self.geometry.side_measure_ratio
254
+
255
+ @property
256
+ def element_normal(self) -> wp.Function:
257
+ return self.geometry.side_normal
258
+
259
+ @property
260
+ def element_inner_cell_index(self) -> wp.Function:
261
+ return self.geometry.side_inner_cell_index
262
+
263
+ @property
264
+ def element_outer_cell_index(self) -> wp.Function:
265
+ return self.geometry.side_outer_cell_index
266
+
267
+ @property
268
+ def element_inner_cell_coords(self) -> wp.Function:
269
+ return self.geometry.side_inner_cell_coords
270
+
271
+ @property
272
+ def element_outer_cell_coords(self) -> wp.Function:
273
+ return self.geometry.side_outer_cell_coords
274
+
275
+ @property
276
+ def cell_to_element_coords(self) -> wp.Function:
277
+ return self.geometry.side_from_cell_coords
278
+
279
+ @property
280
+ def domain_cell_arg(self) -> wp.Function:
281
+ return self.geometry.side_to_cell_arg
282
+
283
+ def cell_domain(self):
284
+ return Cells(self.geometry_partition)
285
+
286
+
287
+ class BoundarySides(Sides):
288
+ """A Domain containing boundary sides of the geometry or geometry partition"""
289
+
290
+ def __init__(self, geometry: GeometryOrPartition):
291
+ super().__init__(geometry)
292
+
293
+ def element_count(self) -> int:
294
+ return self.geometry_partition.boundary_side_count()
295
+
296
+ def geometry_element_count(self) -> int:
297
+ return self.geometry.boundary_side_count()
298
+
299
+ @property
300
+ def element_index(self) -> wp.Function:
301
+ return self.geometry_partition.boundary_side_index
302
+
303
+
304
+ class FrontierSides(Sides):
305
+ """A Domain containing frontier sides of the geometry partition (sides shared with at least another partition)"""
306
+
307
+ def __init__(self, geometry: GeometryOrPartition):
308
+ super().__init__(geometry)
309
+
310
+ def element_count(self) -> int:
311
+ return self.geometry_partition.frontier_side_count()
312
+
313
+ def geometry_element_count(self) -> int:
314
+ raise RuntimeError("Frontier sides not defined at the geometry level")
315
+
316
+ @property
317
+ def element_index(self) -> wp.Function:
318
+ return self.geometry_partition.frontier_side_index
319
+
320
+
321
+ class Subdomain(GeometryDomain):
322
+ """Subdomain -- restriction of domain to a subset of its elements"""
323
+
324
+ def __init__(
325
+ self,
326
+ domain: GeometryDomain,
327
+ element_mask: Optional[wp.array] = None,
328
+ element_indices: Optional[wp.array] = None,
329
+ temporary_store: Optional[cache.TemporaryStore] = None,
330
+ ):
331
+ """
332
+ Create a subdomain from a subset of elements.
333
+
334
+ Exactly one of `element_mask` and `element_indices` should be provided.
335
+
336
+ Args:
337
+ domain: the containing domain
338
+ element_mask: Array of length ``domain.element_count()`` indicating which elements should be included. Array values must be either ``1`` (selected) or ``0`` (not selected).
339
+ element_indices: Explicit array of element indices to include
340
+ """
341
+
342
+ super().__init__(domain.geometry_partition)
343
+
344
+ if element_indices is None:
345
+ if element_mask is None:
346
+ raise ValueError("Either 'element_mask' or 'element_indices' should be provided")
347
+ element_indices, _ = utils.masked_indices(mask=element_mask, temporary_store=temporary_store)
348
+ element_indices = element_indices.detach()
349
+ elif element_mask is not None:
350
+ raise ValueError("Only one of 'element_mask' and 'element_indices' should be provided")
351
+
352
+ self._domain = domain
353
+ self._element_indices = element_indices
354
+ self.ElementIndexArg = self._make_element_index_arg()
355
+ self.element_index = self._make_element_index()
356
+
357
+ # forward
358
+ self.ElementArg = self._domain.ElementArg
359
+ self.geometry_element_count = self._domain.geometry_element_count
360
+ self.reference_element = self._domain.reference_element
361
+ self.element_arg_value = self._domain.element_arg_value
362
+ self.element_measure = self._domain.element_measure
363
+ self.element_measure_ratio = self._domain.element_measure_ratio
364
+ self.element_position = self._domain.element_position
365
+ self.element_deformation_gradient = self._domain.element_deformation_gradient
366
+ self.element_lookup = self._domain.element_lookup
367
+ self.element_normal = self._domain.element_normal
368
+
369
+ @property
370
+ def name(self) -> str:
371
+ return f"{self._domain.name}_Subdomain"
372
+
373
+ def __eq__(self, other) -> bool:
374
+ return (
375
+ self.__class__ == other.__class__
376
+ and self.geometry_partition == other.geometry_partition
377
+ and self._element_indices == other._element_indices
378
+ )
379
+
380
+ @property
381
+ def element_kind(self) -> ElementKind:
382
+ return self._domain.element_kind
383
+
384
+ @property
385
+ def dimension(self) -> int:
386
+ return self._domain.dimension
387
+
388
+ def element_count(self) -> int:
389
+ return self._element_indices.shape[0]
390
+
391
+ def _make_element_index_arg(self):
392
+ @cache.dynamic_struct(suffix=self.name)
393
+ class ElementIndexArg:
394
+ domain_arg: self._domain.ElementIndexArg
395
+ element_indices: wp.array(dtype=int)
396
+
397
+ return ElementIndexArg
398
+
399
+ @cache.cached_arg_value
400
+ def element_index_arg_value(self, device: warp.context.Devicelike):
401
+ arg = self.ElementIndexArg()
402
+ arg.domain_arg = self._domain.element_index_arg_value(device)
403
+ arg.element_indices = self._element_indices.to(device)
404
+ return arg
405
+
406
+ def _make_element_index(self) -> wp.Function:
407
+ @cache.dynamic_func(suffix=self.name)
408
+ def element_index(arg: self.ElementIndexArg, index: int):
409
+ return self._domain.element_index(arg.domain_arg, arg.element_indices[index])
410
+
411
+ return element_index