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,251 @@
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 math
17
+ from enum import Enum
18
+ from typing import Any
19
+
20
+ import warp as wp
21
+ import warp.types
22
+
23
+ vec6 = wp.types.vector(length=6, dtype=wp.float32)
24
+
25
+ _SQRT_2 = wp.constant(math.sqrt(2.0))
26
+ _SQRT_3 = wp.constant(math.sqrt(3.0))
27
+ _SQRT_1_2 = wp.constant(math.sqrt(1.0 / 2.0))
28
+ _SQRT_1_3 = wp.constant(math.sqrt(1.0 / 3.0))
29
+
30
+
31
+ class DofMapper:
32
+ """Base class from mapping node degrees of freedom to function values"""
33
+
34
+ value_dtype: type
35
+ dof_dtype: type
36
+ DOF_SIZE: int
37
+
38
+ @wp.func
39
+ def dof_to_value(dof: Any):
40
+ raise NotImplementedError
41
+
42
+ @wp.func
43
+ def value_to_dof(val: Any):
44
+ raise NotImplementedError
45
+
46
+ def __str__(self):
47
+ return f"{self.value_dtype.__name__}_{self.DOF_SIZE}"
48
+
49
+
50
+ class IdentityMapper(DofMapper):
51
+ """Identity mapper"""
52
+
53
+ def __init__(self, dtype: type):
54
+ if dtype == float:
55
+ dtype = wp.float32
56
+
57
+ self.value_dtype = dtype
58
+ self.dof_dtype = dtype
59
+
60
+ size = warp.types.type_length(dtype)
61
+ self.DOF_SIZE = wp.constant(size)
62
+
63
+ @wp.func
64
+ def dof_to_value(dof: Any):
65
+ return dof
66
+
67
+ @wp.func
68
+ def value_to_dof(val: Any):
69
+ return val
70
+
71
+
72
+ class SymmetricTensorMapper(DofMapper):
73
+ """Orthonormal isomorphism from R^{n (n+1)} to nxn symmetric tensors,
74
+ using usual L2 norm for vectors and half Frobenius norm, (tau : tau)/2 for tensors.
75
+ """
76
+
77
+ class Mapping(Enum):
78
+ VOIGT = 0
79
+ """Voigt ordering of vector coefficients:
80
+ first the three diagonal terms, then off-diagonal coefficients"""
81
+ DB16 = 1
82
+ """Ordering that also separates normal from tangential coefficients:
83
+ first trace, then other diagonal terms, then off-diagonal coefficients.
84
+ See [Daviet and Bertails-Descoubes 2016]"""
85
+
86
+ def __init__(self, dtype: type, mapping: Mapping = Mapping.VOIGT):
87
+ self.value_dtype = dtype
88
+ self.mapping = mapping
89
+
90
+ if dtype == wp.mat22:
91
+ self.dof_dtype = wp.vec3
92
+ self.DOF_SIZE = wp.constant(3)
93
+ if mapping == SymmetricTensorMapper.Mapping.VOIGT:
94
+ self.dof_to_value = SymmetricTensorMapper.dof_to_value_2d_voigt
95
+ self.value_to_dof = SymmetricTensorMapper.value_to_dof_2d_voigt
96
+ else:
97
+ self.dof_to_value = SymmetricTensorMapper.dof_to_value_2d
98
+ self.value_to_dof = SymmetricTensorMapper.value_to_dof_2d
99
+ elif dtype == wp.mat33:
100
+ self.dof_dtype = vec6
101
+ self.DOF_SIZE = wp.constant(6)
102
+ if mapping == SymmetricTensorMapper.Mapping.VOIGT:
103
+ self.dof_to_value = SymmetricTensorMapper.dof_to_value_3d_voigt
104
+ self.value_to_dof = SymmetricTensorMapper.value_to_dof_3d_voigt
105
+ else:
106
+ self.dof_to_value = SymmetricTensorMapper.dof_to_value_3d
107
+ self.value_to_dof = SymmetricTensorMapper.value_to_dof_3d
108
+ else:
109
+ raise ValueError("Unsupported value dtype: ", dtype)
110
+
111
+ def __str__(self):
112
+ return f"{self.mapping}_{self.DOF_SIZE}"
113
+
114
+ @wp.func
115
+ def dof_to_value_2d(dof: wp.vec3):
116
+ a = dof[0]
117
+ b = dof[1]
118
+ c = dof[2]
119
+ return wp.mat22(a + b, c, c, a - b)
120
+
121
+ @wp.func
122
+ def value_to_dof_2d(val: wp.mat22):
123
+ a = 0.5 * (val[0, 0] + val[1, 1])
124
+ b = 0.5 * (val[0, 0] - val[1, 1])
125
+ c = 0.5 * (val[0, 1] + val[1, 0])
126
+ return wp.vec3(a, b, c)
127
+
128
+ @wp.func
129
+ def dof_to_value_2d_voigt(dof: wp.vec3):
130
+ a = _SQRT_2 * dof[0]
131
+ b = _SQRT_2 * dof[1]
132
+ c = dof[2]
133
+ return wp.mat22(a, c, c, b)
134
+
135
+ @wp.func
136
+ def value_to_dof_2d_voigt(val: wp.mat22):
137
+ a = _SQRT_1_2 * val[0, 0]
138
+ b = _SQRT_1_2 * val[1, 1]
139
+ c = 0.5 * (val[0, 1] + val[1, 0])
140
+ return wp.vec3(a, b, c)
141
+
142
+ @wp.func
143
+ def dof_to_value_3d(dof: vec6):
144
+ a = dof[0] * _SQRT_2 * _SQRT_1_3
145
+ b = dof[1]
146
+ c = dof[2] * _SQRT_1_3
147
+ d = dof[3]
148
+ e = dof[4]
149
+ f = dof[5]
150
+ return wp.mat33(
151
+ a + b - c,
152
+ f,
153
+ e,
154
+ f,
155
+ a - b - c,
156
+ d,
157
+ e,
158
+ d,
159
+ a + 2.0 * c,
160
+ )
161
+
162
+ @wp.func
163
+ def value_to_dof_3d(val: wp.mat33):
164
+ a = (val[0, 0] + val[1, 1] + val[2, 2]) * _SQRT_1_3 * _SQRT_1_2
165
+ b = 0.5 * (val[0, 0] - val[1, 1])
166
+ c = 0.5 * (val[2, 2] - (val[0, 0] + val[1, 1] + val[2, 2]) / 3.0) * _SQRT_3
167
+
168
+ d = 0.5 * (val[2, 1] + val[1, 2])
169
+ e = 0.5 * (val[0, 2] + val[2, 0])
170
+ f = 0.5 * (val[1, 0] + val[0, 1])
171
+
172
+ return vec6(a, b, c, d, e, f)
173
+
174
+ @wp.func
175
+ def dof_to_value_3d_voigt(dof: vec6):
176
+ a = _SQRT_2 * dof[0]
177
+ b = _SQRT_2 * dof[1]
178
+ c = _SQRT_2 * dof[2]
179
+ d = dof[3]
180
+ e = dof[4]
181
+ f = dof[5]
182
+ return wp.mat33(
183
+ a,
184
+ f,
185
+ e,
186
+ f,
187
+ b,
188
+ d,
189
+ e,
190
+ d,
191
+ c,
192
+ )
193
+
194
+ @wp.func
195
+ def value_to_dof_3d_voigt(val: wp.mat33):
196
+ a = _SQRT_1_2 * val[0, 0]
197
+ b = _SQRT_1_2 * val[1, 1]
198
+ c = _SQRT_1_2 * val[2, 2]
199
+
200
+ d = 0.5 * (val[2, 1] + val[1, 2])
201
+ e = 0.5 * (val[0, 2] + val[2, 0])
202
+ f = 0.5 * (val[1, 0] + val[0, 1])
203
+
204
+ return vec6(a, b, c, d, e, f)
205
+
206
+
207
+ class SkewSymmetricTensorMapper(DofMapper):
208
+ """Orthonormal isomorphism from R^{n (n-1)} to nxn skew-symmetric tensors,
209
+ using usual L2 norm for vectors and half Frobenius norm, (tau : tau)/2 for tensors.
210
+ """
211
+
212
+ def __init__(self, dtype: type):
213
+ self.value_dtype = dtype
214
+
215
+ if dtype == wp.mat22:
216
+ self.dof_dtype = float
217
+ self.DOF_SIZE = wp.constant(1)
218
+ self.dof_to_value = SkewSymmetricTensorMapper.dof_to_value_2d
219
+ self.value_to_dof = SkewSymmetricTensorMapper.value_to_dof_2d
220
+ elif dtype == wp.mat33:
221
+ self.dof_dtype = wp.vec3
222
+ self.DOF_SIZE = wp.constant(3)
223
+ self.dof_to_value = SkewSymmetricTensorMapper.dof_to_value_3d
224
+ self.value_to_dof = SkewSymmetricTensorMapper.value_to_dof_3d
225
+ else:
226
+ raise ValueError("Unsupported value dtype: ", dtype)
227
+
228
+ def __str__(self):
229
+ return f"{self.__class__.__name__}_{self.DOF_SIZE}"
230
+
231
+ @wp.func
232
+ def dof_to_value_2d(dof: float):
233
+ return wp.mat22(0.0, -dof, dof, 0.0)
234
+
235
+ @wp.func
236
+ def value_to_dof_2d(val: wp.mat22):
237
+ return 0.5 * (val[1, 0] - val[0, 1])
238
+
239
+ @wp.func
240
+ def dof_to_value_3d(dof: wp.vec3):
241
+ a = dof[0]
242
+ b = dof[1]
243
+ c = dof[2]
244
+ return wp.mat33(0.0, -c, b, c, 0.0, -a, -b, a, 0.0)
245
+
246
+ @wp.func
247
+ def value_to_dof_3d(val: wp.mat33):
248
+ a = 0.5 * (val[2, 1] - val[1, 2])
249
+ b = 0.5 * (val[0, 2] - val[2, 0])
250
+ c = 0.5 * (val[1, 0] - val[0, 1])
251
+ return wp.vec3(a, b, c)
@@ -0,0 +1,309 @@
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 import cache
20
+ from warp.fem.geometry import Geometry
21
+ from warp.fem.types import Coords, ElementIndex, ElementKind, Sample, make_free_sample
22
+
23
+ from .topology import SpaceTopology
24
+
25
+
26
+ class FunctionSpace:
27
+ """
28
+ Interface class for function spaces, i.e. geometry + interpolation basis
29
+
30
+ The value of a function `f` at a position `x` is generally computed as
31
+ ``f(x) = L(x)[sum_i f_i N_i(x)]``
32
+ with:
33
+ - ``f_i`` the value of the ith node's degrees-of-freedom (dof)
34
+ - ``N_i(x)`` the weight associated to the node at `x`
35
+ - ``L(x)`` local linear transformation from node-space to world-space
36
+ """
37
+
38
+ dtype: type
39
+ """Value type of the interpolation functions"""
40
+
41
+ dof_dtype: type
42
+ """Data type of the degrees of freedom of each node"""
43
+
44
+ SpaceArg: wp.codegen.Struct
45
+ """Structure containing arguments to be passed to device function"""
46
+
47
+ LocalValueMap: type
48
+ """Type of the local map for transforming vector-valued functions from reference to world space"""
49
+
50
+ VALUE_DOF_COUNT: int
51
+ """Number of degrees of freedom per value, as a Warp constant"""
52
+
53
+ NODE_DOF_COUNT: int
54
+ """Number of degrees of freedom per node, as a Warp constant"""
55
+
56
+ ORDER: int
57
+ """Polynomial degree of the function space, used to determine integration order"""
58
+
59
+ def __init__(self, topology: SpaceTopology):
60
+ self._topology = topology
61
+ self.ElementArg = self.topology.ElementArg
62
+
63
+ if self._topology.is_trace:
64
+ self.element_inner_reference_gradient_transform = self.geometry.side_inner_inverse_deformation_gradient
65
+ self.element_outer_reference_gradient_transform = self.geometry.side_outer_inverse_deformation_gradient
66
+ else:
67
+ self.element_inner_reference_gradient_transform = self.geometry.cell_inverse_deformation_gradient
68
+ self.element_outer_reference_gradient_transform = self.geometry.cell_inverse_deformation_gradient
69
+
70
+ def node_count(self) -> int:
71
+ """Number of nodes in the interpolation basis"""
72
+ return self.topology.node_count()
73
+
74
+ def space_arg_value(self, device) -> wp.codegen.StructInstance:
75
+ """Value of the arguments to be passed to device functions"""
76
+ raise NotImplementedError
77
+
78
+ @property
79
+ def topology(self) -> SpaceTopology:
80
+ """Underlying geometry"""
81
+ return self._topology
82
+
83
+ @property
84
+ def geometry(self) -> Geometry:
85
+ """Underlying geometry"""
86
+ return self.topology.geometry
87
+
88
+ @property
89
+ def element_kind(self) -> ElementKind:
90
+ """Kind of element the function space is expressed over"""
91
+ return ElementKind.CELL if self.dimension == self.geometry.dimension else ElementKind.SIDE
92
+
93
+ @property
94
+ def dimension(self) -> int:
95
+ """Function space embedding dimension"""
96
+ return self.topology.dimension
97
+
98
+ @property
99
+ def degree(self) -> int:
100
+ """Maximum polynomial degree of the underlying basis"""
101
+ return self.ORDER
102
+
103
+ @property
104
+ def name(self):
105
+ raise NotImplementedError
106
+
107
+ def __str__(self):
108
+ return self.name
109
+
110
+ def trace(self) -> "FunctionSpace":
111
+ """Trace of the function space over lower-dimensional elements of the geometry"""
112
+ raise NotImplementedError
113
+
114
+ def make_field(self, space_partition=None):
115
+ """Creates a zero-initialized discrete field over the function space holding values for all degrees of freedom of nodes in a space partition
116
+
117
+ Args:
118
+ space_partition: If provided, the subset of nodes to consider
119
+
120
+ See also: :func:`make_space_partition`
121
+ """
122
+ raise NotImplementedError
123
+
124
+ def gradient_valid(self) -> bool:
125
+ """Whether gradient operator can be computed. Only for scalar and vector fields as higher-order tensors are not support yet"""
126
+ return not wp.types.type_is_matrix(self.dtype)
127
+
128
+ def divergence_valid(self) -> bool:
129
+ """Whether divergence of this field can be computed. Only for vector and tensor fields with same dimension as embedding geometry"""
130
+ if wp.types.type_is_vector(self.dtype):
131
+ return wp.types.type_length(self.dtype) == self.geometry.dimension
132
+ if wp.types.type_is_matrix(self.dtype):
133
+ return self.dtype._shape_[0] == self.geometry.dimension
134
+ return False
135
+
136
+ @staticmethod
137
+ def node_basis_element(dof_coord: int):
138
+ """Basis element for node degrees of freedom.
139
+
140
+ Assumes 0 <= dof_coord < NODE_DOF_COUNT
141
+ """
142
+ raise NotImplementedError
143
+
144
+ @staticmethod
145
+ def value_basis_element(dof_coord: int):
146
+ """Basis element for the function space values
147
+
148
+ Assumes 0 <= dof_coord < VALUE_DOF_COUNT
149
+ """
150
+ raise NotImplementedError
151
+
152
+ @staticmethod
153
+ def local_value_map_inner(
154
+ elt_arg: "SpaceTopology.ElementArg",
155
+ element_index: ElementIndex,
156
+ coords: Coords,
157
+ ):
158
+ """Builds the local value map transforming from node to world space"""
159
+ raise NotImplementedError
160
+
161
+ @staticmethod
162
+ def local_value_map_outer(
163
+ elt_arg: "SpaceTopology.ElementArg",
164
+ element_index: ElementIndex,
165
+ coords: Coords,
166
+ ):
167
+ """Builds the local value map transforming vector-valued from node to world space"""
168
+ raise NotImplementedError
169
+
170
+ @staticmethod
171
+ def node_coords_in_element(
172
+ elt_arg: "SpaceTopology.ElementArg",
173
+ space_arg: "SpaceArg", # noqa: F821
174
+ element_index: ElementIndex,
175
+ node_index_in_elt: int,
176
+ ):
177
+ """Coordinates inside element of a given node"""
178
+ raise NotImplementedError
179
+
180
+ @staticmethod
181
+ def node_quadrature_weight(
182
+ elt_arg: "SpaceTopology.ElementArg",
183
+ space_arg: "SpaceArg", # noqa: F821
184
+ element_index: ElementIndex,
185
+ node_index_in_elt: int,
186
+ ):
187
+ """Weight of a given node when used as a quadrature point"""
188
+ raise NotImplementedError
189
+
190
+ @staticmethod
191
+ def element_inner_weight(
192
+ elt_arg: "SpaceTopology.ElementArg",
193
+ space_arg: "SpaceArg", # noqa: F821
194
+ element_index: ElementIndex,
195
+ coords: Coords,
196
+ node_index_in_elt: int,
197
+ ):
198
+ """Inner weight for a node at given coordinates"""
199
+ raise NotImplementedError
200
+
201
+ @staticmethod
202
+ def element_inner_weight_gradient(
203
+ elt_arg: "SpaceTopology.ElementArg",
204
+ space_arg: "SpaceArg", # noqa: F821
205
+ element_index: ElementIndex,
206
+ coords: Coords,
207
+ node_index_in_elt: int,
208
+ ):
209
+ """Inner weight gradient w.r.t. reference space for a node at given coordinates"""
210
+ raise NotImplementedError
211
+
212
+ @staticmethod
213
+ def element_outer_weight(
214
+ elt_arg: "SpaceTopology.ElementArg",
215
+ space_arg: "SpaceArg", # noqa: F821
216
+ element_index: ElementIndex,
217
+ coords: Coords,
218
+ node_index_in_elt: int,
219
+ ):
220
+ """Outer weight for a node at given coordinates"""
221
+ raise NotImplementedError
222
+
223
+ @staticmethod
224
+ def element_outer_weight_gradient(
225
+ elt_arg: "SpaceTopology.ElementArg",
226
+ space_arg: "SpaceArg", # noqa: F821
227
+ element_index: ElementIndex,
228
+ coords: Coords,
229
+ node_index_in_elt: int,
230
+ ):
231
+ """Outer weight gradient w.r.t reference space for a node at given coordinates"""
232
+ raise NotImplementedError
233
+
234
+ def space_value(
235
+ dof_value: "FunctionSpace.dof_dtype",
236
+ node_weight: Any,
237
+ local_value_map: "FunctionSpace.LocalValueMap",
238
+ ):
239
+ """
240
+ Assembles the world-space value of the function space
241
+ Args:
242
+ - dof_value: node value in the degrees-of-freedom basis
243
+ - node_weight: weight associated to the node, as given per `element_(inn|out)er_weight`
244
+ - local_value_map: local transformation from node space to world space, as given per `local_map_value_(inn|out)er`
245
+ """
246
+ raise NotADirectoryError
247
+
248
+ def space_gradient(
249
+ dof_value: "FunctionSpace.dof_dtype",
250
+ node_weight: Any,
251
+ local_value_map: "FunctionSpace.LocalValueMap",
252
+ grad_transform: Any,
253
+ ):
254
+ """
255
+ Assembles the world-space gradient of the function space
256
+ Args:
257
+ - dof_value: node value in the degrees-of-freedom basis
258
+ - node_weight_gradient: gradient of the weight associated to the node, as given per `element_(inn|out)er_weight_gradient`
259
+ - local_value_map: local transformation from node space to world space, as given per `local_map_value_(inn|out)er`
260
+ - grad_transform: transform mapping the reference space gradient to worls-space gradient (inverse deformation gradient)
261
+ """
262
+ raise NotImplementedError
263
+
264
+ def space_divergence(
265
+ dof_value: "FunctionSpace.dof_dtype",
266
+ node_weight: Any,
267
+ local_value_map: "FunctionSpace.LocalValueMap",
268
+ grad_transform: Any,
269
+ ):
270
+ """ "
271
+ Assembles the world-space divergence of the function space
272
+ Args:
273
+ - dof_value: node value in the degrees-of-freedom basis
274
+ - node_weight_gradient: gradient of the weight associated to the node, as given per `element_(inn|out)er_weight_gradient`
275
+ - local_value_map: local transformation from node space to world space, as given per `local_map_value_(inn|out)er`
276
+ - grad_transform: transform mapping the reference space gradient to worls-space gradient (inverse deformation gradient)
277
+ """
278
+ raise NotImplementedError
279
+
280
+ @staticmethod
281
+ def node_dof_value(
282
+ elt_arg: "FunctionSpace.ElementArg",
283
+ space_arg: "FunctionSpace.SpaceArg",
284
+ element_index: ElementIndex,
285
+ node_index_in_elt: int,
286
+ space_value: "FunctionSpace.dtype",
287
+ ):
288
+ """Converts space value to node degrees of freedom"""
289
+ raise NotImplementedError
290
+
291
+ def _make_side_inner_inverse_deformation_gradient(self):
292
+ @cache.dynamic_func(suffix=self.name)
293
+ def side_inner_inverse_deformation_gradient(args: self.ElementArg, s: Sample):
294
+ cell_index = self.side_inner_cell_index(args, s.element_index)
295
+ cell_coords = self.side_inner_cell_coords(args, s.element_index, s.element_coords)
296
+ cell_arg = self.side_to_cell_arg(args)
297
+ return self.geometry.cell_inverse_deformation_gradient(cell_arg, make_free_sample(cell_index, cell_coords))
298
+
299
+ return side_inner_inverse_deformation_gradient
300
+
301
+ def _make_side_outer_inverse_deformation_gradient(self):
302
+ @cache.dynamic_func(suffix=self.name)
303
+ def side_outer_inverse_deformation_gradient(args: self.ElementArg, s: Sample):
304
+ cell_index = self.side_outer_cell_index(args, s.element_index)
305
+ cell_coords = self.side_outer_cell_coords(args, s.element_index, s.element_coords)
306
+ cell_arg = self.side_to_cell_arg(args)
307
+ return self.geometry.cell_inverse_deformation_gradient(cell_arg, make_free_sample(cell_index, cell_coords))
308
+
309
+ return side_outer_inverse_deformation_gradient