warp-lang 1.9.1__py3-none-manylinux_2_34_aarch64.whl → 1.10.0rc2__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 (346) hide show
  1. warp/__init__.py +301 -287
  2. warp/__init__.pyi +794 -305
  3. warp/_src/__init__.py +14 -0
  4. warp/_src/autograd.py +1075 -0
  5. warp/_src/build.py +618 -0
  6. warp/_src/build_dll.py +640 -0
  7. warp/{builtins.py → _src/builtins.py} +1382 -377
  8. warp/_src/codegen.py +4359 -0
  9. warp/{config.py → _src/config.py} +178 -169
  10. warp/_src/constants.py +57 -0
  11. warp/_src/context.py +8294 -0
  12. warp/_src/dlpack.py +462 -0
  13. warp/_src/fabric.py +355 -0
  14. warp/_src/fem/__init__.py +14 -0
  15. warp/_src/fem/adaptivity.py +508 -0
  16. warp/_src/fem/cache.py +687 -0
  17. warp/_src/fem/dirichlet.py +188 -0
  18. warp/{fem → _src/fem}/domain.py +40 -30
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +701 -0
  21. warp/{fem → _src/fem}/field/nodal_field.py +30 -15
  22. warp/{fem → _src/fem}/field/restriction.py +1 -1
  23. warp/{fem → _src/fem}/field/virtual.py +53 -27
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +77 -163
  26. warp/_src/fem/geometry/closest_point.py +97 -0
  27. warp/{fem → _src/fem}/geometry/deformed_geometry.py +14 -22
  28. warp/{fem → _src/fem}/geometry/element.py +32 -10
  29. warp/{fem → _src/fem}/geometry/geometry.py +48 -20
  30. warp/{fem → _src/fem}/geometry/grid_2d.py +12 -23
  31. warp/{fem → _src/fem}/geometry/grid_3d.py +12 -23
  32. warp/{fem → _src/fem}/geometry/hexmesh.py +40 -63
  33. warp/{fem → _src/fem}/geometry/nanogrid.py +255 -248
  34. warp/{fem → _src/fem}/geometry/partition.py +121 -63
  35. warp/{fem → _src/fem}/geometry/quadmesh.py +26 -45
  36. warp/{fem → _src/fem}/geometry/tetmesh.py +40 -63
  37. warp/{fem → _src/fem}/geometry/trimesh.py +26 -45
  38. warp/{fem → _src/fem}/integrate.py +164 -158
  39. warp/_src/fem/linalg.py +383 -0
  40. warp/_src/fem/operator.py +396 -0
  41. warp/_src/fem/polynomial.py +229 -0
  42. warp/{fem → _src/fem}/quadrature/pic_quadrature.py +15 -20
  43. warp/{fem → _src/fem}/quadrature/quadrature.py +95 -47
  44. warp/_src/fem/space/__init__.py +248 -0
  45. warp/{fem → _src/fem}/space/basis_function_space.py +20 -11
  46. warp/_src/fem/space/basis_space.py +679 -0
  47. warp/{fem → _src/fem}/space/dof_mapper.py +3 -3
  48. warp/{fem → _src/fem}/space/function_space.py +14 -13
  49. warp/{fem → _src/fem}/space/grid_2d_function_space.py +4 -7
  50. warp/{fem → _src/fem}/space/grid_3d_function_space.py +4 -4
  51. warp/{fem → _src/fem}/space/hexmesh_function_space.py +4 -10
  52. warp/{fem → _src/fem}/space/nanogrid_function_space.py +3 -9
  53. warp/{fem → _src/fem}/space/partition.py +117 -60
  54. warp/{fem → _src/fem}/space/quadmesh_function_space.py +4 -10
  55. warp/{fem → _src/fem}/space/restriction.py +66 -33
  56. warp/_src/fem/space/shape/__init__.py +152 -0
  57. warp/{fem → _src/fem}/space/shape/cube_shape_function.py +9 -9
  58. warp/{fem → _src/fem}/space/shape/shape_function.py +8 -9
  59. warp/{fem → _src/fem}/space/shape/square_shape_function.py +6 -6
  60. warp/{fem → _src/fem}/space/shape/tet_shape_function.py +3 -3
  61. warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +3 -3
  62. warp/{fem → _src/fem}/space/tetmesh_function_space.py +3 -9
  63. warp/_src/fem/space/topology.py +459 -0
  64. warp/{fem → _src/fem}/space/trimesh_function_space.py +3 -9
  65. warp/_src/fem/types.py +112 -0
  66. warp/_src/fem/utils.py +486 -0
  67. warp/_src/jax.py +186 -0
  68. warp/_src/jax_experimental/__init__.py +14 -0
  69. warp/_src/jax_experimental/custom_call.py +387 -0
  70. warp/_src/jax_experimental/ffi.py +1284 -0
  71. warp/_src/jax_experimental/xla_ffi.py +656 -0
  72. warp/_src/marching_cubes.py +708 -0
  73. warp/_src/math.py +414 -0
  74. warp/_src/optim/__init__.py +14 -0
  75. warp/_src/optim/adam.py +163 -0
  76. warp/_src/optim/linear.py +1606 -0
  77. warp/_src/optim/sgd.py +112 -0
  78. warp/_src/paddle.py +406 -0
  79. warp/_src/render/__init__.py +14 -0
  80. warp/_src/render/imgui_manager.py +289 -0
  81. warp/_src/render/render_opengl.py +3636 -0
  82. warp/_src/render/render_usd.py +937 -0
  83. warp/_src/render/utils.py +160 -0
  84. warp/_src/sparse.py +2716 -0
  85. warp/_src/tape.py +1206 -0
  86. warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
  87. warp/_src/torch.py +391 -0
  88. warp/_src/types.py +5870 -0
  89. warp/_src/utils.py +1693 -0
  90. warp/autograd.py +12 -1054
  91. warp/bin/warp-clang.so +0 -0
  92. warp/bin/warp.so +0 -0
  93. warp/build.py +8 -588
  94. warp/build_dll.py +6 -721
  95. warp/codegen.py +6 -4251
  96. warp/constants.py +6 -39
  97. warp/context.py +12 -8062
  98. warp/dlpack.py +6 -444
  99. warp/examples/distributed/example_jacobi_mpi.py +4 -5
  100. warp/examples/fem/example_adaptive_grid.py +1 -1
  101. warp/examples/fem/example_apic_fluid.py +1 -1
  102. warp/examples/fem/example_burgers.py +8 -8
  103. warp/examples/fem/example_diffusion.py +1 -1
  104. warp/examples/fem/example_distortion_energy.py +1 -1
  105. warp/examples/fem/example_mixed_elasticity.py +2 -2
  106. warp/examples/fem/example_navier_stokes.py +1 -1
  107. warp/examples/fem/example_nonconforming_contact.py +7 -7
  108. warp/examples/fem/example_stokes.py +1 -1
  109. warp/examples/fem/example_stokes_transfer.py +1 -1
  110. warp/examples/fem/utils.py +2 -2
  111. warp/examples/interop/example_jax_callable.py +1 -1
  112. warp/examples/interop/example_jax_ffi_callback.py +1 -1
  113. warp/examples/interop/example_jax_kernel.py +1 -1
  114. warp/examples/tile/example_tile_mcgp.py +191 -0
  115. warp/fabric.py +6 -337
  116. warp/fem/__init__.py +159 -97
  117. warp/fem/adaptivity.py +7 -489
  118. warp/fem/cache.py +9 -648
  119. warp/fem/dirichlet.py +6 -184
  120. warp/fem/field/__init__.py +8 -109
  121. warp/fem/field/field.py +7 -652
  122. warp/fem/geometry/__init__.py +7 -18
  123. warp/fem/geometry/closest_point.py +11 -77
  124. warp/fem/linalg.py +18 -366
  125. warp/fem/operator.py +11 -369
  126. warp/fem/polynomial.py +9 -209
  127. warp/fem/space/__init__.py +5 -211
  128. warp/fem/space/basis_space.py +6 -662
  129. warp/fem/space/shape/__init__.py +41 -118
  130. warp/fem/space/topology.py +6 -437
  131. warp/fem/types.py +6 -81
  132. warp/fem/utils.py +11 -444
  133. warp/jax.py +8 -165
  134. warp/jax_experimental/__init__.py +14 -1
  135. warp/jax_experimental/custom_call.py +8 -365
  136. warp/jax_experimental/ffi.py +17 -873
  137. warp/jax_experimental/xla_ffi.py +5 -605
  138. warp/marching_cubes.py +5 -689
  139. warp/math.py +16 -393
  140. warp/native/array.h +385 -37
  141. warp/native/builtin.h +314 -37
  142. warp/native/bvh.cpp +43 -9
  143. warp/native/bvh.cu +62 -27
  144. warp/native/bvh.h +310 -309
  145. warp/native/clang/clang.cpp +102 -97
  146. warp/native/coloring.cpp +0 -1
  147. warp/native/crt.h +208 -0
  148. warp/native/exports.h +156 -0
  149. warp/native/hashgrid.cu +2 -0
  150. warp/native/intersect.h +24 -1
  151. warp/native/intersect_tri.h +44 -35
  152. warp/native/mat.h +1456 -276
  153. warp/native/mesh.cpp +4 -4
  154. warp/native/mesh.cu +4 -2
  155. warp/native/mesh.h +176 -61
  156. warp/native/quat.h +0 -52
  157. warp/native/scan.cu +2 -0
  158. warp/native/sparse.cu +7 -3
  159. warp/native/spatial.h +12 -0
  160. warp/native/tile.h +681 -89
  161. warp/native/tile_radix_sort.h +1 -1
  162. warp/native/tile_reduce.h +394 -46
  163. warp/native/tile_scan.h +4 -4
  164. warp/native/vec.h +469 -0
  165. warp/native/version.h +23 -0
  166. warp/native/volume.cpp +1 -1
  167. warp/native/volume.cu +1 -0
  168. warp/native/volume.h +1 -1
  169. warp/native/volume_builder.cu +2 -0
  170. warp/native/warp.cpp +57 -29
  171. warp/native/warp.cu +253 -171
  172. warp/native/warp.h +11 -8
  173. warp/optim/__init__.py +6 -3
  174. warp/optim/adam.py +6 -145
  175. warp/optim/linear.py +14 -1585
  176. warp/optim/sgd.py +6 -94
  177. warp/paddle.py +6 -388
  178. warp/render/__init__.py +8 -4
  179. warp/render/imgui_manager.py +7 -267
  180. warp/render/render_opengl.py +6 -3618
  181. warp/render/render_usd.py +6 -919
  182. warp/render/utils.py +6 -142
  183. warp/sparse.py +37 -2563
  184. warp/tape.py +6 -1188
  185. warp/tests/__main__.py +1 -1
  186. warp/tests/cuda/test_async.py +4 -4
  187. warp/tests/cuda/test_conditional_captures.py +1 -1
  188. warp/tests/cuda/test_multigpu.py +1 -1
  189. warp/tests/cuda/test_streams.py +58 -1
  190. warp/tests/geometry/test_bvh.py +157 -22
  191. warp/tests/geometry/test_marching_cubes.py +0 -1
  192. warp/tests/geometry/test_mesh.py +5 -3
  193. warp/tests/geometry/test_mesh_query_aabb.py +5 -12
  194. warp/tests/geometry/test_mesh_query_point.py +5 -2
  195. warp/tests/geometry/test_mesh_query_ray.py +15 -3
  196. warp/tests/geometry/test_volume_write.py +5 -5
  197. warp/tests/interop/test_dlpack.py +14 -14
  198. warp/tests/interop/test_jax.py +772 -49
  199. warp/tests/interop/test_paddle.py +1 -1
  200. warp/tests/test_adam.py +0 -1
  201. warp/tests/test_arithmetic.py +9 -9
  202. warp/tests/test_array.py +527 -100
  203. warp/tests/test_array_reduce.py +3 -3
  204. warp/tests/test_atomic.py +12 -8
  205. warp/tests/test_atomic_bitwise.py +209 -0
  206. warp/tests/test_atomic_cas.py +4 -4
  207. warp/tests/test_bool.py +2 -2
  208. warp/tests/test_builtins_resolution.py +5 -571
  209. warp/tests/test_codegen.py +33 -14
  210. warp/tests/test_conditional.py +1 -1
  211. warp/tests/test_context.py +6 -6
  212. warp/tests/test_copy.py +242 -161
  213. warp/tests/test_ctypes.py +3 -3
  214. warp/tests/test_devices.py +24 -2
  215. warp/tests/test_examples.py +16 -84
  216. warp/tests/test_fabricarray.py +35 -35
  217. warp/tests/test_fast_math.py +0 -2
  218. warp/tests/test_fem.py +56 -10
  219. warp/tests/test_fixedarray.py +3 -3
  220. warp/tests/test_func.py +8 -5
  221. warp/tests/test_generics.py +1 -1
  222. warp/tests/test_indexedarray.py +24 -24
  223. warp/tests/test_intersect.py +39 -9
  224. warp/tests/test_large.py +1 -1
  225. warp/tests/test_lerp.py +3 -1
  226. warp/tests/test_linear_solvers.py +1 -1
  227. warp/tests/test_map.py +35 -4
  228. warp/tests/test_mat.py +52 -62
  229. warp/tests/test_mat_constructors.py +4 -5
  230. warp/tests/test_mat_lite.py +1 -1
  231. warp/tests/test_mat_scalar_ops.py +121 -121
  232. warp/tests/test_math.py +34 -0
  233. warp/tests/test_module_aot.py +4 -4
  234. warp/tests/test_modules_lite.py +28 -2
  235. warp/tests/test_print.py +11 -11
  236. warp/tests/test_quat.py +93 -58
  237. warp/tests/test_runlength_encode.py +1 -1
  238. warp/tests/test_scalar_ops.py +38 -10
  239. warp/tests/test_smoothstep.py +1 -1
  240. warp/tests/test_sparse.py +126 -15
  241. warp/tests/test_spatial.py +105 -87
  242. warp/tests/test_special_values.py +6 -6
  243. warp/tests/test_static.py +7 -7
  244. warp/tests/test_struct.py +13 -2
  245. warp/tests/test_triangle_closest_point.py +48 -1
  246. warp/tests/test_types.py +27 -15
  247. warp/tests/test_utils.py +52 -52
  248. warp/tests/test_vec.py +29 -29
  249. warp/tests/test_vec_constructors.py +5 -5
  250. warp/tests/test_vec_scalar_ops.py +97 -97
  251. warp/tests/test_version.py +75 -0
  252. warp/tests/tile/test_tile.py +178 -0
  253. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  254. warp/tests/tile/test_tile_cholesky.py +7 -4
  255. warp/tests/tile/test_tile_load.py +26 -2
  256. warp/tests/tile/test_tile_mathdx.py +3 -3
  257. warp/tests/tile/test_tile_matmul.py +1 -1
  258. warp/tests/tile/test_tile_mlp.py +2 -4
  259. warp/tests/tile/test_tile_reduce.py +214 -13
  260. warp/tests/unittest_suites.py +6 -14
  261. warp/tests/unittest_utils.py +10 -9
  262. warp/tests/walkthrough_debug.py +3 -1
  263. warp/torch.py +6 -373
  264. warp/types.py +29 -5764
  265. warp/utils.py +10 -1659
  266. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/METADATA +46 -99
  267. warp_lang-1.10.0rc2.dist-info/RECORD +468 -0
  268. warp_lang-1.10.0rc2.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  269. warp_lang-1.10.0rc2.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  270. warp_lang-1.10.0rc2.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  271. warp_lang-1.10.0rc2.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  272. warp_lang-1.10.0rc2.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  273. warp_lang-1.10.0rc2.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  274. warp_lang-1.10.0rc2.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  275. warp_lang-1.10.0rc2.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  276. warp_lang-1.10.0rc2.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  277. warp_lang-1.10.0rc2.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  278. warp_lang-1.10.0rc2.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  279. warp_lang-1.10.0rc2.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  280. warp_lang-1.10.0rc2.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  281. warp_lang-1.10.0rc2.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  282. warp_lang-1.10.0rc2.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  283. warp/examples/assets/cartpole.urdf +0 -110
  284. warp/examples/assets/crazyflie.usd +0 -0
  285. warp/examples/assets/nv_ant.xml +0 -92
  286. warp/examples/assets/nv_humanoid.xml +0 -183
  287. warp/examples/assets/quadruped.urdf +0 -268
  288. warp/examples/optim/example_bounce.py +0 -266
  289. warp/examples/optim/example_cloth_throw.py +0 -228
  290. warp/examples/optim/example_drone.py +0 -870
  291. warp/examples/optim/example_inverse_kinematics.py +0 -182
  292. warp/examples/optim/example_inverse_kinematics_torch.py +0 -191
  293. warp/examples/optim/example_softbody_properties.py +0 -400
  294. warp/examples/optim/example_spring_cage.py +0 -245
  295. warp/examples/optim/example_trajectory.py +0 -227
  296. warp/examples/sim/example_cartpole.py +0 -143
  297. warp/examples/sim/example_cloth.py +0 -225
  298. warp/examples/sim/example_cloth_self_contact.py +0 -316
  299. warp/examples/sim/example_granular.py +0 -130
  300. warp/examples/sim/example_granular_collision_sdf.py +0 -202
  301. warp/examples/sim/example_jacobian_ik.py +0 -244
  302. warp/examples/sim/example_particle_chain.py +0 -124
  303. warp/examples/sim/example_quadruped.py +0 -203
  304. warp/examples/sim/example_rigid_chain.py +0 -203
  305. warp/examples/sim/example_rigid_contact.py +0 -195
  306. warp/examples/sim/example_rigid_force.py +0 -133
  307. warp/examples/sim/example_rigid_gyroscopic.py +0 -115
  308. warp/examples/sim/example_rigid_soft_contact.py +0 -140
  309. warp/examples/sim/example_soft_body.py +0 -196
  310. warp/examples/tile/example_tile_walker.py +0 -327
  311. warp/sim/__init__.py +0 -74
  312. warp/sim/articulation.py +0 -793
  313. warp/sim/collide.py +0 -2570
  314. warp/sim/graph_coloring.py +0 -307
  315. warp/sim/import_mjcf.py +0 -791
  316. warp/sim/import_snu.py +0 -227
  317. warp/sim/import_urdf.py +0 -579
  318. warp/sim/import_usd.py +0 -898
  319. warp/sim/inertia.py +0 -357
  320. warp/sim/integrator.py +0 -245
  321. warp/sim/integrator_euler.py +0 -2000
  322. warp/sim/integrator_featherstone.py +0 -2101
  323. warp/sim/integrator_vbd.py +0 -2487
  324. warp/sim/integrator_xpbd.py +0 -3295
  325. warp/sim/model.py +0 -4821
  326. warp/sim/particles.py +0 -121
  327. warp/sim/render.py +0 -431
  328. warp/sim/utils.py +0 -431
  329. warp/tests/sim/disabled_kinematics.py +0 -244
  330. warp/tests/sim/test_cloth.py +0 -863
  331. warp/tests/sim/test_collision.py +0 -743
  332. warp/tests/sim/test_coloring.py +0 -347
  333. warp/tests/sim/test_inertia.py +0 -161
  334. warp/tests/sim/test_model.py +0 -226
  335. warp/tests/sim/test_sim_grad.py +0 -287
  336. warp/tests/sim/test_sim_grad_bounce_linear.py +0 -212
  337. warp/tests/sim/test_sim_kinematics.py +0 -98
  338. warp/thirdparty/__init__.py +0 -0
  339. warp_lang-1.9.1.dist-info/RECORD +0 -456
  340. /warp/{fem → _src/fem}/quadrature/__init__.py +0 -0
  341. /warp/{tests/sim → _src/thirdparty}/__init__.py +0 -0
  342. /warp/{thirdparty → _src/thirdparty}/appdirs.py +0 -0
  343. /warp/{thirdparty → _src/thirdparty}/dlpack.py +0 -0
  344. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/WHEEL +0 -0
  345. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/licenses/LICENSE.md +0 -0
  346. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,85 +13,19 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- from typing import Any
16
+ # isort: skip_file
17
17
 
18
- import warp as wp
19
- from warp.fem.types import Coords
18
+ from warp._src.fem.geometry.closest_point import project_on_seg_at_origin as project_on_seg_at_origin
19
+ from warp._src.fem.geometry.closest_point import project_on_tri_at_origin as project_on_tri_at_origin
20
+ from warp._src.fem.geometry.closest_point import project_on_tet_at_origin as project_on_tet_at_origin
21
+ from warp._src.fem.geometry.closest_point import project_on_box_at_origin as project_on_box_at_origin
20
22
 
23
+ # TODO: Remove after cleaning up the public API.
21
24
 
22
- @wp.func
23
- def project_on_seg_at_origin(q: Any, seg: Any, len_sq: float):
24
- s = wp.clamp(wp.dot(q, seg) / len_sq, 0.0, 1.0)
25
- return wp.length_sq(q - s * seg), s
25
+ from warp._src.fem.geometry import closest_point as _closest_point
26
26
 
27
27
 
28
- @wp.func
29
- def project_on_tri_at_origin(q: Any, e1: Any, e2: Any):
30
- e1e1 = wp.dot(e1, e1)
31
- e1e2 = wp.dot(e1, e2)
32
- e2e2 = wp.dot(e2, e2)
28
+ def __getattr__(name):
29
+ from warp._src.utils import get_deprecated_api
33
30
 
34
- det = e1e1 * e2e2 - e1e2 * e1e2
35
-
36
- if det > e1e1 * e2e2 * 1.0e-6:
37
- e1p = wp.dot(e1, q)
38
- e2p = wp.dot(e2, q)
39
-
40
- s = (e2e2 * e1p - e1e2 * e2p) / det
41
- t = (e1e1 * e2p - e1e2 * e1p) / det
42
-
43
- if s >= 0.0 and t >= 0.0 and s + t <= 1.0:
44
- # point inside triangle (distance can be non-zero in 3D case)
45
- return wp.length_sq(q - s * e1 - t * e2), Coords(1.0 - s - t, s, t)
46
-
47
- d1, s1 = project_on_seg_at_origin(q, e1, e1e1)
48
- d2, s2 = project_on_seg_at_origin(q, e2, e2e2)
49
- d12, s12 = project_on_seg_at_origin(q - e1, e2 - e1, wp.length_sq(e2 - e1))
50
-
51
- if d1 <= d2:
52
- if d1 <= d12:
53
- return d1, Coords(1.0 - s1, s1, 0.0)
54
- elif d2 <= d12:
55
- return d2, Coords(1.0 - s2, 0.0, s2)
56
-
57
- return d12, Coords(0.0, 1.0 - s12, s12)
58
-
59
-
60
- @wp.func
61
- def project_on_tet_at_origin(q: wp.vec3, e1: wp.vec3, e2: wp.vec3, e3: wp.vec3):
62
- mat = wp.inverse(wp.matrix_from_cols(e1, e2, e3))
63
- coords = mat * q
64
-
65
- if wp.min(coords) >= 0.0 and coords[0] + coords[1] + coords[2] <= 1.0:
66
- return 0.0, coords
67
-
68
- # Not inside tet, compare closest point on each tri
69
-
70
- d12, s12 = project_on_tri_at_origin(q, e1, e2)
71
- d23, s23 = project_on_tri_at_origin(q, e2, e3)
72
- d31, s31 = project_on_tri_at_origin(q, e3, e1)
73
- d123, s123 = project_on_tri_at_origin(q - e1, e2 - e1, e3 - e1)
74
-
75
- dmin = wp.min(wp.vec4(d12, d23, d31, d123))
76
-
77
- if dmin == d12:
78
- return dmin, Coords(s12[1], s12[2], 0.0)
79
- elif dmin == d23:
80
- return dmin, Coords(0.0, s23[1], s23[2])
81
- elif dmin == d31:
82
- return dmin, Coords(s31[2], 0.0, s31[1])
83
- else:
84
- return dmin, s123
85
-
86
-
87
- @wp.func
88
- def project_on_box_at_origin(coords: wp.vec3, sizes: wp.vec3):
89
- proj_coords = wp.min(wp.max(coords, wp.vec3(0.0)), sizes)
90
- return wp.length_sq(coords - proj_coords), wp.cw_div(proj_coords, sizes)
91
-
92
-
93
- @wp.func
94
- def project_on_box_at_origin(coords: wp.vec2, sizes: wp.vec2):
95
- proj_coords = wp.min(wp.max(coords, wp.vec2(0.0)), sizes)
96
- norm_coords = wp.cw_div(proj_coords, sizes)
97
- return wp.length_sq(coords - proj_coords), Coords(norm_coords[0], norm_coords[1], 0.0)
31
+ return get_deprecated_api(_closest_point, "wp.fem.geometry", name)
warp/fem/linalg.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,374 +13,26 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- from typing import Any
16
+ # isort: skip_file
17
17
 
18
- import warp as wp
19
- import warp.types
18
+ from warp._src.fem.linalg import array_axpy as array_axpy
19
+ from warp._src.fem.linalg import generalized_inner as generalized_inner
20
+ from warp._src.fem.linalg import generalized_outer as generalized_outer
21
+ from warp._src.fem.linalg import spherical_part as spherical_part
22
+ from warp._src.fem.linalg import symmetric_part as symmetric_part
23
+ from warp._src.fem.linalg import skew_part as skew_part
24
+ from warp._src.fem.linalg import householder_make_hessenberg as householder_make_hessenberg
25
+ from warp._src.fem.linalg import householder_qr_decomposition as householder_qr_decomposition
26
+ from warp._src.fem.linalg import inverse_qr as inverse_qr
27
+ from warp._src.fem.linalg import solve_triangular as solve_triangular
28
+ from warp._src.fem.linalg import symmetric_eigenvalues_qr as symmetric_eigenvalues_qr
20
29
 
30
+ # TODO: Remove after cleaning up the public API.
21
31
 
22
- @wp.func
23
- def generalized_outer(x: wp.vec(Any, wp.Scalar), y: wp.vec(Any, wp.Scalar)):
24
- """Generalized outer product allowing for vector or scalar arguments"""
25
- return wp.outer(x, y)
32
+ from warp._src.fem import linalg as _linalg
26
33
 
27
34
 
28
- @wp.func
29
- def generalized_outer(x: wp.Scalar, y: wp.vec(Any, wp.Scalar)):
30
- return x * y
35
+ def __getattr__(name):
36
+ from warp._src.utils import get_deprecated_api
31
37
 
32
-
33
- @wp.func
34
- def generalized_outer(x: wp.vec(Any, wp.Scalar), y: wp.Scalar):
35
- return x * y
36
-
37
-
38
- @wp.func
39
- def generalized_outer(x: wp.quatf, y: wp.vec(Any, wp.Scalar)):
40
- return generalized_outer(wp.vec4(x[0], x[1], x[2], x[3]), y)
41
-
42
-
43
- @wp.func
44
- def generalized_inner(x: wp.vec(Any, wp.Scalar), y: wp.vec(Any, wp.Scalar)):
45
- """Generalized inner product allowing for vector, tensor and scalar arguments"""
46
- return wp.dot(x, y)
47
-
48
-
49
- @wp.func
50
- def generalized_inner(x: wp.Scalar, y: wp.Scalar):
51
- return x * y
52
-
53
-
54
- @wp.func
55
- def generalized_inner(x: wp.mat((Any, Any), wp.Scalar), y: wp.vec(Any, wp.Scalar)):
56
- return y @ x
57
-
58
-
59
- @wp.func
60
- def generalized_inner(x: wp.vec(Any, wp.Scalar), y: wp.mat((Any, Any), wp.Scalar)):
61
- return y @ x
62
-
63
-
64
- @wp.func
65
- def basis_coefficient(val: wp.Scalar, i: int):
66
- return val
67
-
68
-
69
- @wp.func
70
- def basis_coefficient(val: wp.mat((Any, Any), wp.Scalar), i: int):
71
- cols = int(type(val[0]).length)
72
- row = i // cols
73
- col = i - row * cols
74
- return val[row, col]
75
-
76
-
77
- @wp.func
78
- def basis_coefficient(val: Any, i: int):
79
- return val[i]
80
-
81
-
82
- @wp.func
83
- def basis_coefficient(val: wp.vec(Any, wp.Scalar), i: int, j: int):
84
- # treat as row vector
85
- return val[j]
86
-
87
-
88
- @wp.func
89
- def basis_coefficient(val: wp.mat((Any, Any), wp.Scalar), i: int, j: int):
90
- return val[i, j]
91
-
92
-
93
- @wp.func
94
- def symmetric_part(x: Any):
95
- """Symmetric part of a square tensor"""
96
- return 0.5 * (x + wp.transpose(x))
97
-
98
-
99
- @wp.func
100
- def spherical_part(x: wp.mat22):
101
- """Spherical part of a square tensor"""
102
- return 0.5 * wp.trace(x) * wp.identity(n=2, dtype=float)
103
-
104
-
105
- @wp.func
106
- def spherical_part(x: wp.mat33):
107
- """Spherical part of a square tensor"""
108
- return (wp.trace(x) / 3.0) * wp.identity(n=3, dtype=float)
109
-
110
-
111
- @wp.func
112
- def skew_part(x: wp.mat22):
113
- """Skew part of a 2x2 tensor as corresponding rotation angle"""
114
- return 0.5 * (x[1, 0] - x[0, 1])
115
-
116
-
117
- @wp.func
118
- def skew_part(x: wp.mat33):
119
- """Skew part of a 3x3 tensor as the corresponding rotation vector"""
120
- a = 0.5 * (x[2, 1] - x[1, 2])
121
- b = 0.5 * (x[0, 2] - x[2, 0])
122
- c = 0.5 * (x[1, 0] - x[0, 1])
123
- return wp.vec3(a, b, c)
124
-
125
-
126
- @wp.func
127
- def householder_qr_decomposition(A: Any):
128
- """
129
- QR decomposition of a square matrix using Householder reflections
130
-
131
- Returns Q and R such that Q R = A, Q orthonormal (such that QQ^T = Id), R upper triangular
132
- """
133
-
134
- x = type(A[0])()
135
- Q = wp.identity(n=type(x).length, dtype=A.dtype)
136
-
137
- zero = x.dtype(0.0)
138
- two = x.dtype(2.0)
139
-
140
- for i in range(type(x).length):
141
- for k in range(type(x).length):
142
- x[k] = wp.where(k < i, zero, A[k, i])
143
-
144
- alpha = wp.length(x) * wp.sign(x[i])
145
- x[i] += alpha
146
- two_over_x_sq = wp.where(alpha == zero, zero, two / wp.length_sq(x))
147
-
148
- A -= wp.outer(two_over_x_sq * x, x * A)
149
- Q -= wp.outer(Q * x, two_over_x_sq * x)
150
-
151
- return Q, A
152
-
153
-
154
- @wp.func
155
- def householder_make_hessenberg(A: Any):
156
- """Transforms a square matrix to Hessenberg form (single lower diagonal) using Householder reflections
157
-
158
- Returns:
159
- Q and H such that Q H Q^T = A, Q orthonormal, H under Hessenberg form
160
- If A is symmetric, H will be tridiagonal
161
- """
162
-
163
- x = type(A[0])()
164
- Q = wp.identity(n=type(x).length, dtype=A.dtype)
165
-
166
- zero = x.dtype(0.0)
167
- two = x.dtype(2.0)
168
-
169
- for i in range(1, type(x).length):
170
- for k in range(type(x).length):
171
- x[k] = wp.where(k < i, zero, A[k, i - 1])
172
-
173
- alpha = wp.length(x) * wp.sign(x[i])
174
- x[i] += alpha
175
- two_over_x_sq = wp.where(alpha == zero, zero, two / wp.length_sq(x))
176
-
177
- # apply on both sides
178
- A -= wp.outer(two_over_x_sq * x, x * A)
179
- A -= wp.outer(A * x, two_over_x_sq * x)
180
- Q -= wp.outer(Q * x, two_over_x_sq * x)
181
-
182
- return Q, A
183
-
184
-
185
- @wp.func
186
- def solve_triangular(R: Any, b: Any):
187
- """Solves for R x = b where R is an upper triangular matrix
188
-
189
- Returns x
190
- """
191
- zero = b.dtype(0)
192
- x = type(b)(b.dtype(0))
193
- for i in range(b.length, 0, -1):
194
- j = i - 1
195
- r = b[j] - wp.dot(R[j], x)
196
- x[j] = wp.where(R[j, j] == zero, zero, r / R[j, j])
197
-
198
- return x
199
-
200
-
201
- @wp.func
202
- def inverse_qr(A: Any):
203
- # Computes a square matrix inverse using QR factorization
204
-
205
- Q, R = householder_qr_decomposition(A)
206
-
207
- A_inv = type(A)()
208
- for i in range(type(A[0]).length):
209
- A_inv[i] = solve_triangular(R, Q[i]) # ith column of Q^T
210
-
211
- return wp.transpose(A_inv)
212
-
213
-
214
- @wp.func
215
- def _wilkinson_shift(a: Any, b: Any, c: Any, tol: Any):
216
- # Wilkinson shift: estimate eigenvalue of 2x2 symmetric matrix [a, c, c, b]
217
- d = (a - b) * type(tol)(0.5)
218
- return b + d - wp.sign(d) * wp.sqrt(d * d + c * c)
219
-
220
-
221
- @wp.func
222
- def _givens_rotation(a: Any, b: Any):
223
- # Givens rotation [[c -s], [s c]] such that sa+cb =0
224
- zero = type(a)(0.0)
225
- one = type(a)(1.0)
226
-
227
- b2 = b * b
228
- if b2 == zero:
229
- # id rotation
230
- return one, zero
231
-
232
- scale = one / wp.sqrt(a * a + b2)
233
- return a * scale, -b * scale
234
-
235
-
236
- @wp.func
237
- def tridiagonal_symmetric_eigenvalues_qr(D: Any, L: Any, Q: Any, tol: Any):
238
- """
239
- Computes the eigenvalues and eigen vectors of a symmetric tridiagonal matrix using the
240
- Symmetric tridiagonal QR algorithm with implicit Wilkinson shift
241
-
242
- Args:
243
- D: Main diagonal of the matrix
244
- L: Lower diagonal of the matrix, indexed such that L[i] = A[i+1, i]
245
- Q: Initialization for the eigenvectors, useful if a pre-transformation has been applied, otherwise may be identity
246
- tol: Tolerance for the diagonalization residual (Linf norm of off-diagonal over diagonal terms)
247
-
248
- Returns a tuple (D: vector of eigenvalues, P: matrix with one eigenvector per row) such that A = P^T D P
249
-
250
-
251
- Ref: Arbenz P, Numerical Methods for Solving Large Scale Eigenvalue Problems, Chapter 4 (QR algorithm, Mar 13, 2018)
252
- """
253
-
254
- two = D.dtype(2.0)
255
-
256
- # so that we can use the type length in expressions
257
- # this will prevent unrolling by warp, but should be ok for native code
258
- m = int(0)
259
- for _ in range(type(D).length):
260
- m += 1
261
-
262
- start = int(0)
263
- y = D.dtype(0.0) # moving buldge
264
- x = D.dtype(0.0) # coeff atop buldge
265
-
266
- for _ in range(32 * m): # failsafe, usually converges faster than that
267
- # Iterate over all independent (deflated) blocks
268
- end = int(-1)
269
-
270
- for k in range(m - 1):
271
- if k >= end:
272
- # Check if new block is starting
273
- if k == end or wp.abs(L[k]) <= tol * (wp.abs(D[k]) + wp.abs(D[k + 1])):
274
- continue
275
-
276
- # Find end of block
277
- start = k
278
- end = start + 1
279
- while end + 1 < m:
280
- if wp.abs(L[end]) <= tol * (wp.abs(D[end + 1]) + wp.abs(D[end])):
281
- break
282
- end += 1
283
-
284
- # Wilkinson shift (an eigenvalue of the last 2x2 block)
285
- shift = _wilkinson_shift(D[end - 1], D[end], L[end - 1], tol)
286
-
287
- # start with eliminating lower diag of first column of shifted matrix
288
- # (i.e. first step of explicit QR factorization)
289
- # Then all further steps eliminate the buldge (second diag) of the non-shifted matrix
290
- x = D[start] - shift
291
- y = L[start]
292
-
293
- c, s = _givens_rotation(x, y)
294
-
295
- # Apply Givens rotation on both sides of tridiagonal matrix
296
-
297
- # middle block
298
- d = D[k] - D[k + 1]
299
- z = (two * c * L[k] + d * s) * s
300
- D[k] -= z
301
- D[k + 1] += z
302
- L[k] = d * c * s + (c * c - s * s) * L[k]
303
-
304
- if k > start:
305
- L[k - 1] = c * x - s * y
306
-
307
- x = L[k]
308
- y = -s * L[k + 1] # new buldge
309
- L[k + 1] *= c
310
-
311
- # apply givens rotation on left of Q
312
- # note: Q is transposed compared to usual impls, as Warp makes it easier to index rows
313
- Qk0 = Q[k]
314
- Qk1 = Q[k + 1]
315
- Q[k] = c * Qk0 - s * Qk1
316
- Q[k + 1] = c * Qk1 + s * Qk0
317
-
318
- if end <= 0:
319
- # We did nothing, so diagonalization must have been achieved
320
- break
321
-
322
- return D, Q
323
-
324
-
325
- @wp.func
326
- def symmetric_eigenvalues_qr(A: Any, tol: Any):
327
- """
328
- Computes the eigenvalues and eigen vectors of a square symmetric matrix A using the QR algorithm
329
-
330
- Args:
331
- A: square symmetric matrix
332
- tol: Tolerance for the diagonalization residual (Linf norm of off-diagonal over diagonal terms)
333
-
334
- Returns a tuple (D: vector of eigenvalues, P: matrix with one eigenvector per row) such that A = P^T D P
335
- """
336
-
337
- # Put A under Hessenberg form (tridiagonal)
338
- Q, H = householder_make_hessenberg(A)
339
-
340
- # tridiagonal storage for H
341
- D = wp.get_diag(H)
342
- L = type(D)(A.dtype(0.0))
343
- for i in range(1, type(D).length):
344
- L[i - 1] = H[i, i - 1]
345
-
346
- Qt = wp.transpose(Q)
347
- ev, P = tridiagonal_symmetric_eigenvalues_qr(D, L, Qt, tol)
348
- return ev, P
349
-
350
-
351
- def array_axpy(x: wp.array, y: wp.array, alpha: float = 1.0, beta: float = 1.0):
352
- """Performs y = alpha*x + beta*y"""
353
-
354
- dtype = wp.types.type_scalar_type(y.dtype)
355
-
356
- alpha = dtype(alpha)
357
- beta = dtype(beta)
358
-
359
- if x.shape != y.shape or x.device != y.device:
360
- raise ValueError("x and y arrays must have the same shape and device")
361
-
362
- # array_axpy requires a custom adjoint; unfortunately we cannot use `wp.func_grad`
363
- # as generic functions are not supported yet. Instead we use a non-differentiable kernel
364
- # and record a custom adjoint function on the tape.
365
-
366
- # temporarily disable tape to avoid printing warning that kernel is not differentiable
367
- (tape, wp.context.runtime.tape) = (wp.context.runtime.tape, None)
368
- wp.launch(kernel=_array_axpy_kernel, dim=x.shape, device=x.device, inputs=[x, y, alpha, beta])
369
- wp.context.runtime.tape = tape
370
-
371
- if tape is not None and (x.requires_grad or y.requires_grad):
372
-
373
- def backward_axpy():
374
- # adj_x += adj_y * alpha
375
- # adj_y = adj_y * beta
376
- array_axpy(x=y.grad, y=x.grad, alpha=alpha, beta=1.0)
377
- if beta != 1.0:
378
- array_axpy(x=y.grad, y=y.grad, alpha=0.0, beta=beta)
379
-
380
- tape.record_func(backward_axpy, arrays=[x, y])
381
-
382
-
383
- @wp.kernel(enable_backward=False)
384
- def _array_axpy_kernel(x: wp.array(dtype=Any), y: wp.array(dtype=Any), alpha: Any, beta: Any):
385
- i = wp.tid()
386
- y[i] = beta * y[i] + alpha * y.dtype(x[i])
38
+ return get_deprecated_api(_linalg, "wp.fem", name)