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,389 @@
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
17
+
18
+ import warp as wp
19
+ from warp.fem.cache import TemporaryStore, borrow_temporary, cached_arg_value
20
+ from warp.fem.types import NULL_ELEMENT_INDEX, ElementIndex
21
+ from warp.fem.utils import masked_indices
22
+
23
+ from .geometry import Geometry
24
+
25
+ wp.set_module_options({"enable_backward": False})
26
+
27
+
28
+ class GeometryPartition:
29
+ """Base class for geometry partitions, i.e. subset of cells and sides"""
30
+
31
+ class CellArg:
32
+ pass
33
+
34
+ class SideArg:
35
+ pass
36
+
37
+ def __init__(self, geometry: Geometry):
38
+ self.geometry = geometry
39
+
40
+ def cell_count(self) -> int:
41
+ """Number of cells that are 'owned' by this partition"""
42
+ raise NotImplementedError()
43
+
44
+ def side_count(self) -> int:
45
+ """Number of sides that are 'owned' by this partition"""
46
+ raise NotImplementedError()
47
+
48
+ def boundary_side_count(self) -> int:
49
+ """Number of geo-boundary sides that are 'owned' by this partition"""
50
+ raise NotImplementedError()
51
+
52
+ def frontier_side_count(self) -> int:
53
+ """Number of sides with neighbors owned by this and another partition"""
54
+ raise NotImplementedError()
55
+
56
+ @property
57
+ def name(self) -> str:
58
+ return f"{self.geometry.name}_{self.__class__.__name__}"
59
+
60
+ def __str__(self) -> str:
61
+ return self.name
62
+
63
+ def cell_arg_value(self, device):
64
+ raise NotImplementedError()
65
+
66
+ def side_arg_value(self, device):
67
+ raise NotImplementedError()
68
+
69
+ @staticmethod
70
+ def cell_index(args: CellArg, partition_cell_index: int):
71
+ """Index in the geometry of a partition cell"""
72
+ raise NotImplementedError()
73
+
74
+ @staticmethod
75
+ def partition_cell_index(args: CellArg, cell_index: int):
76
+ """Index of a geometry cell in the partition (or ``NULL_ELEMENT_INDEX``)"""
77
+ raise NotImplementedError()
78
+
79
+ @staticmethod
80
+ def side_index(args: SideArg, partition_side_index: int):
81
+ """Partition side to side index"""
82
+ raise NotImplementedError()
83
+
84
+ @staticmethod
85
+ def boundary_side_index(args: SideArg, boundary_side_index: int):
86
+ """Boundary side to side index"""
87
+ raise NotImplementedError()
88
+
89
+ @staticmethod
90
+ def frontier_side_index(args: SideArg, frontier_side_index: int):
91
+ """Frontier side to side index"""
92
+ raise NotImplementedError()
93
+
94
+
95
+ class WholeGeometryPartition(GeometryPartition):
96
+ """Trivial (NOP) partition"""
97
+
98
+ def __init__(
99
+ self,
100
+ geometry: Geometry,
101
+ ):
102
+ super().__init__(geometry)
103
+
104
+ self.SideArg = geometry.SideIndexArg
105
+ self.side_arg_value = geometry.side_index_arg_value
106
+
107
+ self.cell_index = WholeGeometryPartition._identity_element_index
108
+ self.partition_cell_index = WholeGeometryPartition._identity_element_index
109
+
110
+ self.side_index = WholeGeometryPartition._identity_element_index
111
+ self.boundary_side_index = geometry.boundary_side_index
112
+ self.frontier_side_index = WholeGeometryPartition._identity_element_index
113
+
114
+ def __eq__(self, other: GeometryPartition) -> bool:
115
+ # Ensures that two whole partition instances of the same geometry are considered equal
116
+ return isinstance(other, WholeGeometryPartition) and self.geometry == other.geometry
117
+
118
+ def cell_count(self) -> int:
119
+ return self.geometry.cell_count()
120
+
121
+ def side_count(self) -> int:
122
+ return self.geometry.side_count()
123
+
124
+ def boundary_side_count(self) -> int:
125
+ return self.geometry.boundary_side_count()
126
+
127
+ def frontier_side_count(self) -> int:
128
+ return 0
129
+
130
+ @wp.struct
131
+ class CellArg:
132
+ pass
133
+
134
+ def cell_arg_value(self, device):
135
+ arg = WholeGeometryPartition.CellArg()
136
+ return arg
137
+
138
+ @wp.func
139
+ def _identity_element_index(args: Any, idx: ElementIndex):
140
+ return idx
141
+
142
+ @property
143
+ def name(self) -> str:
144
+ return self.geometry.name
145
+
146
+
147
+ class CellBasedGeometryPartition(GeometryPartition):
148
+ """Geometry partition based on a subset of cells. Interior, boundary and frontier sides are automatically categorized."""
149
+
150
+ def __init__(
151
+ self,
152
+ geometry: Geometry,
153
+ device=None,
154
+ ):
155
+ super().__init__(geometry)
156
+
157
+ @wp.struct
158
+ class SideArg:
159
+ partition_side_indices: wp.array(dtype=int)
160
+ boundary_side_indices: wp.array(dtype=int)
161
+ frontier_side_indices: wp.array(dtype=int)
162
+
163
+ def side_count(self) -> int:
164
+ return self._partition_side_indices.array.shape[0]
165
+
166
+ def boundary_side_count(self) -> int:
167
+ return self._boundary_side_indices.array.shape[0]
168
+
169
+ def frontier_side_count(self) -> int:
170
+ return self._frontier_side_indices.array.shape[0]
171
+
172
+ @cached_arg_value
173
+ def side_arg_value(self, device):
174
+ arg = LinearGeometryPartition.SideArg()
175
+ arg.partition_side_indices = self._partition_side_indices.array.to(device)
176
+ arg.boundary_side_indices = self._boundary_side_indices.array.to(device)
177
+ arg.frontier_side_indices = self._frontier_side_indices.array.to(device)
178
+ return arg
179
+
180
+ @wp.func
181
+ def side_index(args: SideArg, partition_side_index: int):
182
+ """partition side to side index"""
183
+ return args.partition_side_indices[partition_side_index]
184
+
185
+ @wp.func
186
+ def boundary_side_index(args: SideArg, boundary_side_index: int):
187
+ """Boundary side to side index"""
188
+ return args.boundary_side_indices[boundary_side_index]
189
+
190
+ @wp.func
191
+ def frontier_side_index(args: SideArg, frontier_side_index: int):
192
+ """Frontier side to side index"""
193
+ return args.frontier_side_indices[frontier_side_index]
194
+
195
+ def compute_side_indices_from_cells(
196
+ self, cell_arg_value: Any, cell_inclusion_test_func: wp.Function, device, temporary_store: TemporaryStore = None
197
+ ):
198
+ from warp.fem import cache
199
+
200
+ cell_arg_type = next(iter(cell_inclusion_test_func.input_types.values()))
201
+
202
+ @cache.dynamic_kernel(suffix=f"{self.geometry.name}_{cell_inclusion_test_func.key}")
203
+ def count_sides(
204
+ geo_arg: self.geometry.SideArg,
205
+ cell_arg_value: cell_arg_type,
206
+ partition_side_mask: wp.array(dtype=int),
207
+ boundary_side_mask: wp.array(dtype=int),
208
+ frontier_side_mask: wp.array(dtype=int),
209
+ ):
210
+ side_index = wp.tid()
211
+ inner_cell_index = self.geometry.side_inner_cell_index(geo_arg, side_index)
212
+ outer_cell_index = self.geometry.side_outer_cell_index(geo_arg, side_index)
213
+
214
+ inner_in = cell_inclusion_test_func(cell_arg_value, inner_cell_index)
215
+ outer_in = cell_inclusion_test_func(cell_arg_value, outer_cell_index)
216
+
217
+ if inner_in:
218
+ # Inner neighbor in partition; count as partition side
219
+ partition_side_mask[side_index] = 1
220
+
221
+ # Inner and outer element as the same -- this is a boundary side
222
+ if inner_cell_index == outer_cell_index:
223
+ boundary_side_mask[side_index] = 1
224
+
225
+ if inner_in != outer_in:
226
+ # Exactly one neighbor in partition; count as frontier side
227
+ frontier_side_mask[side_index] = 1
228
+
229
+ partition_side_mask = borrow_temporary(
230
+ temporary_store,
231
+ shape=(self.geometry.side_count(),),
232
+ dtype=int,
233
+ device=device,
234
+ )
235
+ boundary_side_mask = borrow_temporary(
236
+ temporary_store,
237
+ shape=(self.geometry.side_count(),),
238
+ dtype=int,
239
+ device=device,
240
+ )
241
+ frontier_side_mask = borrow_temporary(
242
+ temporary_store,
243
+ shape=(self.geometry.side_count(),),
244
+ dtype=int,
245
+ device=device,
246
+ )
247
+
248
+ partition_side_mask.array.zero_()
249
+ boundary_side_mask.array.zero_()
250
+ frontier_side_mask.array.zero_()
251
+
252
+ wp.launch(
253
+ dim=partition_side_mask.array.shape[0],
254
+ kernel=count_sides,
255
+ inputs=[
256
+ self.geometry.side_arg_value(device),
257
+ cell_arg_value,
258
+ partition_side_mask.array,
259
+ boundary_side_mask.array,
260
+ frontier_side_mask.array,
261
+ ],
262
+ device=device,
263
+ )
264
+
265
+ # Convert counts to indices
266
+ self._partition_side_indices, _ = masked_indices(partition_side_mask.array, temporary_store=temporary_store)
267
+ self._boundary_side_indices, _ = masked_indices(boundary_side_mask.array, temporary_store=temporary_store)
268
+ self._frontier_side_indices, _ = masked_indices(frontier_side_mask.array, temporary_store=temporary_store)
269
+
270
+ partition_side_mask.release()
271
+ boundary_side_mask.release()
272
+ frontier_side_mask.release()
273
+
274
+
275
+ class LinearGeometryPartition(CellBasedGeometryPartition):
276
+ def __init__(
277
+ self,
278
+ geometry: Geometry,
279
+ partition_rank: int,
280
+ partition_count: int,
281
+ device=None,
282
+ temporary_store: TemporaryStore = None,
283
+ ):
284
+ """Creates a geometry partition by uniformly partionning cell indices
285
+
286
+ Args:
287
+ geometry: the geometry to partition
288
+ partition_rank: the index of the partition being created
289
+ partition_count: the number of partitions that will be created over the geometry
290
+ device: Warp device on which to perform and store computations
291
+ """
292
+ super().__init__(geometry)
293
+
294
+ total_cell_count = geometry.cell_count()
295
+
296
+ cells_per_partition = (total_cell_count + partition_count - 1) // partition_count
297
+ self.cell_begin = cells_per_partition * partition_rank
298
+ self.cell_end = min(self.cell_begin + cells_per_partition, total_cell_count)
299
+
300
+ super().compute_side_indices_from_cells(
301
+ self.cell_arg_value(device),
302
+ LinearGeometryPartition._cell_inclusion_test,
303
+ device,
304
+ temporary_store=temporary_store,
305
+ )
306
+
307
+ def cell_count(self) -> int:
308
+ return self.cell_end - self.cell_begin
309
+
310
+ @wp.struct
311
+ class CellArg:
312
+ cell_begin: int
313
+ cell_end: int
314
+
315
+ def cell_arg_value(self, device):
316
+ arg = LinearGeometryPartition.CellArg()
317
+ arg.cell_begin = self.cell_begin
318
+ arg.cell_end = self.cell_end
319
+ return arg
320
+
321
+ @wp.func
322
+ def cell_index(args: CellArg, partition_cell_index: int):
323
+ """Partition cell to cell index"""
324
+ return args.cell_begin + partition_cell_index
325
+
326
+ @wp.func
327
+ def partition_cell_index(args: CellArg, cell_index: int):
328
+ """Partition cell to cell index"""
329
+ if cell_index > args.cell_end:
330
+ return NULL_ELEMENT_INDEX
331
+
332
+ partition_cell_index = cell_index - args.cell_begin
333
+ if partition_cell_index < 0:
334
+ return NULL_ELEMENT_INDEX
335
+
336
+ return partition_cell_index
337
+
338
+ @wp.func
339
+ def _cell_inclusion_test(arg: CellArg, cell_index: int):
340
+ return cell_index >= arg.cell_begin and cell_index < arg.cell_end
341
+
342
+
343
+ class ExplicitGeometryPartition(CellBasedGeometryPartition):
344
+ def __init__(self, geometry: Geometry, cell_mask: "wp.array(dtype=int)", temporary_store: TemporaryStore = None):
345
+ """Creates a geometry partition by uniformly partionning cell indices
346
+
347
+ Args:
348
+ geometry: the geometry to partition
349
+ cell_mask: warp array of length ``geometry.cell_count()`` indicating which cells are selected. Array values must be either ``1`` (selected) or ``0`` (not selected).
350
+ """
351
+
352
+ super().__init__(geometry)
353
+
354
+ self._cell_mask = cell_mask
355
+ self._cells, self._partition_cells = masked_indices(self._cell_mask, temporary_store=temporary_store)
356
+
357
+ super().compute_side_indices_from_cells(
358
+ self._cell_mask,
359
+ ExplicitGeometryPartition._cell_inclusion_test,
360
+ self._cell_mask.device,
361
+ temporary_store=temporary_store,
362
+ )
363
+
364
+ def cell_count(self) -> int:
365
+ return self._cells.array.shape[0]
366
+
367
+ @wp.struct
368
+ class CellArg:
369
+ cell_index: wp.array(dtype=int)
370
+ partition_cell_index: wp.array(dtype=int)
371
+
372
+ @cached_arg_value
373
+ def cell_arg_value(self, device):
374
+ arg = ExplicitGeometryPartition.CellArg()
375
+ arg.cell_index = self._cells.array.to(device)
376
+ arg.partition_cell_index = self._partition_cells.array.to(device)
377
+ return arg
378
+
379
+ @wp.func
380
+ def cell_index(args: CellArg, partition_cell_index: int):
381
+ return args.cell_index[partition_cell_index]
382
+
383
+ @wp.func
384
+ def partition_cell_index(args: CellArg, cell_index: int):
385
+ return args.partition_cell_index[cell_index]
386
+
387
+ @wp.func
388
+ def _cell_inclusion_test(mask: wp.array(dtype=int), cell_index: int):
389
+ return mask[cell_index] > 0