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.
- warp/__init__.py +301 -287
- warp/__init__.pyi +794 -305
- warp/_src/__init__.py +14 -0
- warp/_src/autograd.py +1075 -0
- warp/_src/build.py +618 -0
- warp/_src/build_dll.py +640 -0
- warp/{builtins.py → _src/builtins.py} +1382 -377
- warp/_src/codegen.py +4359 -0
- warp/{config.py → _src/config.py} +178 -169
- warp/_src/constants.py +57 -0
- warp/_src/context.py +8294 -0
- warp/_src/dlpack.py +462 -0
- warp/_src/fabric.py +355 -0
- warp/_src/fem/__init__.py +14 -0
- warp/_src/fem/adaptivity.py +508 -0
- warp/_src/fem/cache.py +687 -0
- warp/_src/fem/dirichlet.py +188 -0
- warp/{fem → _src/fem}/domain.py +40 -30
- warp/_src/fem/field/__init__.py +131 -0
- warp/_src/fem/field/field.py +701 -0
- warp/{fem → _src/fem}/field/nodal_field.py +30 -15
- warp/{fem → _src/fem}/field/restriction.py +1 -1
- warp/{fem → _src/fem}/field/virtual.py +53 -27
- warp/_src/fem/geometry/__init__.py +32 -0
- warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +77 -163
- warp/_src/fem/geometry/closest_point.py +97 -0
- warp/{fem → _src/fem}/geometry/deformed_geometry.py +14 -22
- warp/{fem → _src/fem}/geometry/element.py +32 -10
- warp/{fem → _src/fem}/geometry/geometry.py +48 -20
- warp/{fem → _src/fem}/geometry/grid_2d.py +12 -23
- warp/{fem → _src/fem}/geometry/grid_3d.py +12 -23
- warp/{fem → _src/fem}/geometry/hexmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/nanogrid.py +255 -248
- warp/{fem → _src/fem}/geometry/partition.py +121 -63
- warp/{fem → _src/fem}/geometry/quadmesh.py +26 -45
- warp/{fem → _src/fem}/geometry/tetmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/trimesh.py +26 -45
- warp/{fem → _src/fem}/integrate.py +164 -158
- warp/_src/fem/linalg.py +383 -0
- warp/_src/fem/operator.py +396 -0
- warp/_src/fem/polynomial.py +229 -0
- warp/{fem → _src/fem}/quadrature/pic_quadrature.py +15 -20
- warp/{fem → _src/fem}/quadrature/quadrature.py +95 -47
- warp/_src/fem/space/__init__.py +248 -0
- warp/{fem → _src/fem}/space/basis_function_space.py +20 -11
- warp/_src/fem/space/basis_space.py +679 -0
- warp/{fem → _src/fem}/space/dof_mapper.py +3 -3
- warp/{fem → _src/fem}/space/function_space.py +14 -13
- warp/{fem → _src/fem}/space/grid_2d_function_space.py +4 -7
- warp/{fem → _src/fem}/space/grid_3d_function_space.py +4 -4
- warp/{fem → _src/fem}/space/hexmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/nanogrid_function_space.py +3 -9
- warp/{fem → _src/fem}/space/partition.py +117 -60
- warp/{fem → _src/fem}/space/quadmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/restriction.py +66 -33
- warp/_src/fem/space/shape/__init__.py +152 -0
- warp/{fem → _src/fem}/space/shape/cube_shape_function.py +9 -9
- warp/{fem → _src/fem}/space/shape/shape_function.py +8 -9
- warp/{fem → _src/fem}/space/shape/square_shape_function.py +6 -6
- warp/{fem → _src/fem}/space/shape/tet_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/tetmesh_function_space.py +3 -9
- warp/_src/fem/space/topology.py +459 -0
- warp/{fem → _src/fem}/space/trimesh_function_space.py +3 -9
- warp/_src/fem/types.py +112 -0
- warp/_src/fem/utils.py +486 -0
- warp/_src/jax.py +186 -0
- warp/_src/jax_experimental/__init__.py +14 -0
- warp/_src/jax_experimental/custom_call.py +387 -0
- warp/_src/jax_experimental/ffi.py +1284 -0
- warp/_src/jax_experimental/xla_ffi.py +656 -0
- warp/_src/marching_cubes.py +708 -0
- warp/_src/math.py +414 -0
- warp/_src/optim/__init__.py +14 -0
- warp/_src/optim/adam.py +163 -0
- warp/_src/optim/linear.py +1606 -0
- warp/_src/optim/sgd.py +112 -0
- warp/_src/paddle.py +406 -0
- warp/_src/render/__init__.py +14 -0
- warp/_src/render/imgui_manager.py +289 -0
- warp/_src/render/render_opengl.py +3636 -0
- warp/_src/render/render_usd.py +937 -0
- warp/_src/render/utils.py +160 -0
- warp/_src/sparse.py +2716 -0
- warp/_src/tape.py +1206 -0
- warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
- warp/_src/torch.py +391 -0
- warp/_src/types.py +5870 -0
- warp/_src/utils.py +1693 -0
- warp/autograd.py +12 -1054
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/build.py +8 -588
- warp/build_dll.py +6 -721
- warp/codegen.py +6 -4251
- warp/constants.py +6 -39
- warp/context.py +12 -8062
- warp/dlpack.py +6 -444
- warp/examples/distributed/example_jacobi_mpi.py +4 -5
- warp/examples/fem/example_adaptive_grid.py +1 -1
- warp/examples/fem/example_apic_fluid.py +1 -1
- warp/examples/fem/example_burgers.py +8 -8
- warp/examples/fem/example_diffusion.py +1 -1
- warp/examples/fem/example_distortion_energy.py +1 -1
- warp/examples/fem/example_mixed_elasticity.py +2 -2
- warp/examples/fem/example_navier_stokes.py +1 -1
- warp/examples/fem/example_nonconforming_contact.py +7 -7
- warp/examples/fem/example_stokes.py +1 -1
- warp/examples/fem/example_stokes_transfer.py +1 -1
- warp/examples/fem/utils.py +2 -2
- warp/examples/interop/example_jax_callable.py +1 -1
- warp/examples/interop/example_jax_ffi_callback.py +1 -1
- warp/examples/interop/example_jax_kernel.py +1 -1
- warp/examples/tile/example_tile_mcgp.py +191 -0
- warp/fabric.py +6 -337
- warp/fem/__init__.py +159 -97
- warp/fem/adaptivity.py +7 -489
- warp/fem/cache.py +9 -648
- warp/fem/dirichlet.py +6 -184
- warp/fem/field/__init__.py +8 -109
- warp/fem/field/field.py +7 -652
- warp/fem/geometry/__init__.py +7 -18
- warp/fem/geometry/closest_point.py +11 -77
- warp/fem/linalg.py +18 -366
- warp/fem/operator.py +11 -369
- warp/fem/polynomial.py +9 -209
- warp/fem/space/__init__.py +5 -211
- warp/fem/space/basis_space.py +6 -662
- warp/fem/space/shape/__init__.py +41 -118
- warp/fem/space/topology.py +6 -437
- warp/fem/types.py +6 -81
- warp/fem/utils.py +11 -444
- warp/jax.py +8 -165
- warp/jax_experimental/__init__.py +14 -1
- warp/jax_experimental/custom_call.py +8 -365
- warp/jax_experimental/ffi.py +17 -873
- warp/jax_experimental/xla_ffi.py +5 -605
- warp/marching_cubes.py +5 -689
- warp/math.py +16 -393
- warp/native/array.h +385 -37
- warp/native/builtin.h +314 -37
- warp/native/bvh.cpp +43 -9
- warp/native/bvh.cu +62 -27
- warp/native/bvh.h +310 -309
- warp/native/clang/clang.cpp +102 -97
- warp/native/coloring.cpp +0 -1
- warp/native/crt.h +208 -0
- warp/native/exports.h +156 -0
- warp/native/hashgrid.cu +2 -0
- warp/native/intersect.h +24 -1
- warp/native/intersect_tri.h +44 -35
- warp/native/mat.h +1456 -276
- warp/native/mesh.cpp +4 -4
- warp/native/mesh.cu +4 -2
- warp/native/mesh.h +176 -61
- warp/native/quat.h +0 -52
- warp/native/scan.cu +2 -0
- warp/native/sparse.cu +7 -3
- warp/native/spatial.h +12 -0
- warp/native/tile.h +681 -89
- warp/native/tile_radix_sort.h +1 -1
- warp/native/tile_reduce.h +394 -46
- warp/native/tile_scan.h +4 -4
- warp/native/vec.h +469 -0
- warp/native/version.h +23 -0
- warp/native/volume.cpp +1 -1
- warp/native/volume.cu +1 -0
- warp/native/volume.h +1 -1
- warp/native/volume_builder.cu +2 -0
- warp/native/warp.cpp +57 -29
- warp/native/warp.cu +253 -171
- warp/native/warp.h +11 -8
- warp/optim/__init__.py +6 -3
- warp/optim/adam.py +6 -145
- warp/optim/linear.py +14 -1585
- warp/optim/sgd.py +6 -94
- warp/paddle.py +6 -388
- warp/render/__init__.py +8 -4
- warp/render/imgui_manager.py +7 -267
- warp/render/render_opengl.py +6 -3618
- warp/render/render_usd.py +6 -919
- warp/render/utils.py +6 -142
- warp/sparse.py +37 -2563
- warp/tape.py +6 -1188
- warp/tests/__main__.py +1 -1
- warp/tests/cuda/test_async.py +4 -4
- warp/tests/cuda/test_conditional_captures.py +1 -1
- warp/tests/cuda/test_multigpu.py +1 -1
- warp/tests/cuda/test_streams.py +58 -1
- warp/tests/geometry/test_bvh.py +157 -22
- warp/tests/geometry/test_marching_cubes.py +0 -1
- warp/tests/geometry/test_mesh.py +5 -3
- warp/tests/geometry/test_mesh_query_aabb.py +5 -12
- warp/tests/geometry/test_mesh_query_point.py +5 -2
- warp/tests/geometry/test_mesh_query_ray.py +15 -3
- warp/tests/geometry/test_volume_write.py +5 -5
- warp/tests/interop/test_dlpack.py +14 -14
- warp/tests/interop/test_jax.py +772 -49
- warp/tests/interop/test_paddle.py +1 -1
- warp/tests/test_adam.py +0 -1
- warp/tests/test_arithmetic.py +9 -9
- warp/tests/test_array.py +527 -100
- warp/tests/test_array_reduce.py +3 -3
- warp/tests/test_atomic.py +12 -8
- warp/tests/test_atomic_bitwise.py +209 -0
- warp/tests/test_atomic_cas.py +4 -4
- warp/tests/test_bool.py +2 -2
- warp/tests/test_builtins_resolution.py +5 -571
- warp/tests/test_codegen.py +33 -14
- warp/tests/test_conditional.py +1 -1
- warp/tests/test_context.py +6 -6
- warp/tests/test_copy.py +242 -161
- warp/tests/test_ctypes.py +3 -3
- warp/tests/test_devices.py +24 -2
- warp/tests/test_examples.py +16 -84
- warp/tests/test_fabricarray.py +35 -35
- warp/tests/test_fast_math.py +0 -2
- warp/tests/test_fem.py +56 -10
- warp/tests/test_fixedarray.py +3 -3
- warp/tests/test_func.py +8 -5
- warp/tests/test_generics.py +1 -1
- warp/tests/test_indexedarray.py +24 -24
- warp/tests/test_intersect.py +39 -9
- warp/tests/test_large.py +1 -1
- warp/tests/test_lerp.py +3 -1
- warp/tests/test_linear_solvers.py +1 -1
- warp/tests/test_map.py +35 -4
- warp/tests/test_mat.py +52 -62
- warp/tests/test_mat_constructors.py +4 -5
- warp/tests/test_mat_lite.py +1 -1
- warp/tests/test_mat_scalar_ops.py +121 -121
- warp/tests/test_math.py +34 -0
- warp/tests/test_module_aot.py +4 -4
- warp/tests/test_modules_lite.py +28 -2
- warp/tests/test_print.py +11 -11
- warp/tests/test_quat.py +93 -58
- warp/tests/test_runlength_encode.py +1 -1
- warp/tests/test_scalar_ops.py +38 -10
- warp/tests/test_smoothstep.py +1 -1
- warp/tests/test_sparse.py +126 -15
- warp/tests/test_spatial.py +105 -87
- warp/tests/test_special_values.py +6 -6
- warp/tests/test_static.py +7 -7
- warp/tests/test_struct.py +13 -2
- warp/tests/test_triangle_closest_point.py +48 -1
- warp/tests/test_types.py +27 -15
- warp/tests/test_utils.py +52 -52
- warp/tests/test_vec.py +29 -29
- warp/tests/test_vec_constructors.py +5 -5
- warp/tests/test_vec_scalar_ops.py +97 -97
- warp/tests/test_version.py +75 -0
- warp/tests/tile/test_tile.py +178 -0
- warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
- warp/tests/tile/test_tile_cholesky.py +7 -4
- warp/tests/tile/test_tile_load.py +26 -2
- warp/tests/tile/test_tile_mathdx.py +3 -3
- warp/tests/tile/test_tile_matmul.py +1 -1
- warp/tests/tile/test_tile_mlp.py +2 -4
- warp/tests/tile/test_tile_reduce.py +214 -13
- warp/tests/unittest_suites.py +6 -14
- warp/tests/unittest_utils.py +10 -9
- warp/tests/walkthrough_debug.py +3 -1
- warp/torch.py +6 -373
- warp/types.py +29 -5764
- warp/utils.py +10 -1659
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/METADATA +46 -99
- warp_lang-1.10.0rc2.dist-info/RECORD +468 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
- warp/examples/assets/cartpole.urdf +0 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/nv_ant.xml +0 -92
- warp/examples/assets/nv_humanoid.xml +0 -183
- warp/examples/assets/quadruped.urdf +0 -268
- warp/examples/optim/example_bounce.py +0 -266
- warp/examples/optim/example_cloth_throw.py +0 -228
- warp/examples/optim/example_drone.py +0 -870
- warp/examples/optim/example_inverse_kinematics.py +0 -182
- warp/examples/optim/example_inverse_kinematics_torch.py +0 -191
- warp/examples/optim/example_softbody_properties.py +0 -400
- warp/examples/optim/example_spring_cage.py +0 -245
- warp/examples/optim/example_trajectory.py +0 -227
- warp/examples/sim/example_cartpole.py +0 -143
- warp/examples/sim/example_cloth.py +0 -225
- warp/examples/sim/example_cloth_self_contact.py +0 -316
- warp/examples/sim/example_granular.py +0 -130
- warp/examples/sim/example_granular_collision_sdf.py +0 -202
- warp/examples/sim/example_jacobian_ik.py +0 -244
- warp/examples/sim/example_particle_chain.py +0 -124
- warp/examples/sim/example_quadruped.py +0 -203
- warp/examples/sim/example_rigid_chain.py +0 -203
- warp/examples/sim/example_rigid_contact.py +0 -195
- warp/examples/sim/example_rigid_force.py +0 -133
- warp/examples/sim/example_rigid_gyroscopic.py +0 -115
- warp/examples/sim/example_rigid_soft_contact.py +0 -140
- warp/examples/sim/example_soft_body.py +0 -196
- warp/examples/tile/example_tile_walker.py +0 -327
- warp/sim/__init__.py +0 -74
- warp/sim/articulation.py +0 -793
- warp/sim/collide.py +0 -2570
- warp/sim/graph_coloring.py +0 -307
- warp/sim/import_mjcf.py +0 -791
- warp/sim/import_snu.py +0 -227
- warp/sim/import_urdf.py +0 -579
- warp/sim/import_usd.py +0 -898
- warp/sim/inertia.py +0 -357
- warp/sim/integrator.py +0 -245
- warp/sim/integrator_euler.py +0 -2000
- warp/sim/integrator_featherstone.py +0 -2101
- warp/sim/integrator_vbd.py +0 -2487
- warp/sim/integrator_xpbd.py +0 -3295
- warp/sim/model.py +0 -4821
- warp/sim/particles.py +0 -121
- warp/sim/render.py +0 -431
- warp/sim/utils.py +0 -431
- warp/tests/sim/disabled_kinematics.py +0 -244
- warp/tests/sim/test_cloth.py +0 -863
- warp/tests/sim/test_collision.py +0 -743
- warp/tests/sim/test_coloring.py +0 -347
- warp/tests/sim/test_inertia.py +0 -161
- warp/tests/sim/test_model.py +0 -226
- warp/tests/sim/test_sim_grad.py +0 -287
- warp/tests/sim/test_sim_grad_bounce_linear.py +0 -212
- warp/tests/sim/test_sim_kinematics.py +0 -98
- warp/thirdparty/__init__.py +0 -0
- warp_lang-1.9.1.dist-info/RECORD +0 -456
- /warp/{fem → _src/fem}/quadrature/__init__.py +0 -0
- /warp/{tests/sim → _src/thirdparty}/__init__.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/appdirs.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/dlpack.py +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/WHEEL +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/licenses/LICENSE.md +0 -0
- {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)
|
|
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
|
-
|
|
16
|
+
# isort: skip_file
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
from warp.fem.
|
|
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
|
-
|
|
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
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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)
|
|
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
|
-
|
|
16
|
+
# isort: skip_file
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
29
|
-
|
|
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)
|