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,266 +0,0 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2022 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
|
-
###########################################################################
|
|
17
|
-
# Example Sim Grad Bounce
|
|
18
|
-
#
|
|
19
|
-
# Shows how to use Warp to optimize the initial velocity of a particle
|
|
20
|
-
# such that it bounces off the wall and floor in order to hit a target.
|
|
21
|
-
#
|
|
22
|
-
# This example uses the built-in wp.Tape() object to compute gradients of
|
|
23
|
-
# the distance to target (loss) w.r.t the initial velocity, followed by
|
|
24
|
-
# a simple gradient-descent optimization step.
|
|
25
|
-
#
|
|
26
|
-
###########################################################################
|
|
27
|
-
|
|
28
|
-
import numpy as np
|
|
29
|
-
|
|
30
|
-
import warp as wp
|
|
31
|
-
import warp.sim
|
|
32
|
-
import warp.sim.render
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
@wp.kernel
|
|
36
|
-
def loss_kernel(pos: wp.array(dtype=wp.vec3), target: wp.vec3, loss: wp.array(dtype=float)):
|
|
37
|
-
# distance to target
|
|
38
|
-
delta = pos[0] - target
|
|
39
|
-
loss[0] = wp.dot(delta, delta)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
@wp.kernel
|
|
43
|
-
def step_kernel(x: wp.array(dtype=wp.vec3), grad: wp.array(dtype=wp.vec3), alpha: float):
|
|
44
|
-
tid = wp.tid()
|
|
45
|
-
|
|
46
|
-
# gradient descent step
|
|
47
|
-
x[tid] = x[tid] - grad[tid] * alpha
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
class Example:
|
|
51
|
-
def __init__(self, stage_path="example_bounce.usd", verbose=False):
|
|
52
|
-
self.verbose = verbose
|
|
53
|
-
|
|
54
|
-
# seconds
|
|
55
|
-
sim_duration = 0.6
|
|
56
|
-
|
|
57
|
-
# control frequency
|
|
58
|
-
fps = 60
|
|
59
|
-
self.frame_dt = 1.0 / fps
|
|
60
|
-
frame_steps = int(sim_duration / self.frame_dt)
|
|
61
|
-
|
|
62
|
-
# sim frequency
|
|
63
|
-
self.sim_substeps = 8
|
|
64
|
-
self.sim_steps = frame_steps * self.sim_substeps
|
|
65
|
-
self.sim_dt = self.frame_dt / self.sim_substeps
|
|
66
|
-
|
|
67
|
-
self.iter = 0
|
|
68
|
-
self.render_time = 0.0
|
|
69
|
-
|
|
70
|
-
self.train_rate = 0.02
|
|
71
|
-
|
|
72
|
-
ke = 1.0e4
|
|
73
|
-
kf = 0.0
|
|
74
|
-
kd = 1.0e1
|
|
75
|
-
mu = 0.2
|
|
76
|
-
|
|
77
|
-
builder = wp.sim.ModelBuilder()
|
|
78
|
-
builder.add_particle(pos=wp.vec3(-0.5, 1.0, 0.0), vel=wp.vec3(5.0, -5.0, 0.0), mass=1.0)
|
|
79
|
-
builder.add_shape_box(body=-1, pos=wp.vec3(2.0, 1.0, 0.0), hx=0.25, hy=1.0, hz=1.0, ke=ke, kf=kf, kd=kd, mu=mu)
|
|
80
|
-
|
|
81
|
-
# use `requires_grad=True` to create a model for differentiable simulation
|
|
82
|
-
self.model = builder.finalize(requires_grad=True)
|
|
83
|
-
self.model.ground = True
|
|
84
|
-
|
|
85
|
-
self.model.soft_contact_ke = ke
|
|
86
|
-
self.model.soft_contact_kf = kf
|
|
87
|
-
self.model.soft_contact_kd = kd
|
|
88
|
-
self.model.soft_contact_mu = mu
|
|
89
|
-
self.model.soft_contact_margin = 10.0
|
|
90
|
-
self.model.soft_contact_restitution = 1.0
|
|
91
|
-
|
|
92
|
-
self.integrator = wp.sim.SemiImplicitIntegrator()
|
|
93
|
-
|
|
94
|
-
self.target = (-2.0, 1.5, 0.0)
|
|
95
|
-
self.loss = wp.zeros(1, dtype=wp.float32, requires_grad=True)
|
|
96
|
-
|
|
97
|
-
# allocate sim states for trajectory
|
|
98
|
-
self.states = []
|
|
99
|
-
for _i in range(self.sim_steps + 1):
|
|
100
|
-
self.states.append(self.model.state())
|
|
101
|
-
|
|
102
|
-
# one-shot contact creation (valid if we're doing simple collision against a constant normal plane)
|
|
103
|
-
wp.sim.collide(self.model, self.states[0])
|
|
104
|
-
|
|
105
|
-
if stage_path:
|
|
106
|
-
self.renderer = wp.sim.render.SimRenderer(self.model, stage_path, scaling=1.0)
|
|
107
|
-
else:
|
|
108
|
-
self.renderer = None
|
|
109
|
-
|
|
110
|
-
# capture forward/backward passes
|
|
111
|
-
self.use_cuda_graph = wp.get_device().is_cuda
|
|
112
|
-
if self.use_cuda_graph:
|
|
113
|
-
with wp.ScopedCapture() as capture:
|
|
114
|
-
self.tape = wp.Tape()
|
|
115
|
-
with self.tape:
|
|
116
|
-
self.forward()
|
|
117
|
-
self.tape.backward(self.loss)
|
|
118
|
-
self.graph = capture.graph
|
|
119
|
-
|
|
120
|
-
def forward(self):
|
|
121
|
-
# run control loop
|
|
122
|
-
for i in range(self.sim_steps):
|
|
123
|
-
self.states[i].clear_forces()
|
|
124
|
-
self.integrator.simulate(self.model, self.states[i], self.states[i + 1], self.sim_dt)
|
|
125
|
-
|
|
126
|
-
# compute loss on final state
|
|
127
|
-
wp.launch(loss_kernel, dim=1, inputs=[self.states[-1].particle_q, self.target, self.loss])
|
|
128
|
-
|
|
129
|
-
return self.loss
|
|
130
|
-
|
|
131
|
-
def step(self):
|
|
132
|
-
with wp.ScopedTimer("step"):
|
|
133
|
-
if self.use_cuda_graph:
|
|
134
|
-
wp.capture_launch(self.graph)
|
|
135
|
-
else:
|
|
136
|
-
self.tape = wp.Tape()
|
|
137
|
-
with self.tape:
|
|
138
|
-
self.forward()
|
|
139
|
-
self.tape.backward(self.loss)
|
|
140
|
-
|
|
141
|
-
# gradient descent step
|
|
142
|
-
x = self.states[0].particle_qd
|
|
143
|
-
wp.launch(step_kernel, dim=len(x), inputs=[x, x.grad, self.train_rate])
|
|
144
|
-
|
|
145
|
-
x_grad = self.tape.gradients[self.states[0].particle_qd]
|
|
146
|
-
|
|
147
|
-
if self.verbose:
|
|
148
|
-
print(f"Iter: {self.iter} Loss: {self.loss}")
|
|
149
|
-
print(f" x: {x} g: {x_grad}")
|
|
150
|
-
|
|
151
|
-
# clear grads for next iteration
|
|
152
|
-
self.tape.zero()
|
|
153
|
-
|
|
154
|
-
self.iter = self.iter + 1
|
|
155
|
-
|
|
156
|
-
def render(self):
|
|
157
|
-
if self.renderer is None:
|
|
158
|
-
return
|
|
159
|
-
|
|
160
|
-
with wp.ScopedTimer("render"):
|
|
161
|
-
# draw trajectory
|
|
162
|
-
traj_verts = [self.states[0].particle_q.numpy()[0].tolist()]
|
|
163
|
-
|
|
164
|
-
for i in range(0, self.sim_steps, self.sim_substeps):
|
|
165
|
-
traj_verts.append(self.states[i].particle_q.numpy()[0].tolist())
|
|
166
|
-
|
|
167
|
-
self.renderer.begin_frame(self.render_time)
|
|
168
|
-
self.renderer.render(self.states[i])
|
|
169
|
-
self.renderer.render_box(
|
|
170
|
-
pos=self.target,
|
|
171
|
-
rot=wp.quat_identity(),
|
|
172
|
-
extents=(0.1, 0.1, 0.1),
|
|
173
|
-
name="target",
|
|
174
|
-
color=(0.0, 0.0, 0.0),
|
|
175
|
-
)
|
|
176
|
-
self.renderer.render_line_strip(
|
|
177
|
-
vertices=traj_verts,
|
|
178
|
-
color=wp.render.bourke_color_map(0.0, 7.0, self.loss.numpy()[0]),
|
|
179
|
-
radius=0.02,
|
|
180
|
-
name=f"traj_{self.iter - 1}",
|
|
181
|
-
)
|
|
182
|
-
self.renderer.end_frame()
|
|
183
|
-
|
|
184
|
-
from pxr import Gf, UsdGeom
|
|
185
|
-
|
|
186
|
-
particles_prim = self.renderer.stage.GetPrimAtPath("/root/particles")
|
|
187
|
-
particles = UsdGeom.Points.Get(self.renderer.stage, particles_prim.GetPath())
|
|
188
|
-
particles.CreateDisplayColorAttr().Set([Gf.Vec3f(1.0, 1.0, 1.0)], time=self.renderer.time)
|
|
189
|
-
|
|
190
|
-
self.render_time += self.frame_dt
|
|
191
|
-
|
|
192
|
-
def check_grad(self):
|
|
193
|
-
param = self.states[0].particle_qd
|
|
194
|
-
|
|
195
|
-
# initial value
|
|
196
|
-
x_c = param.numpy().flatten()
|
|
197
|
-
|
|
198
|
-
# compute numeric gradient
|
|
199
|
-
x_grad_numeric = np.zeros_like(x_c)
|
|
200
|
-
|
|
201
|
-
for i in range(len(x_c)):
|
|
202
|
-
eps = 1.0e-3
|
|
203
|
-
|
|
204
|
-
step = np.zeros_like(x_c)
|
|
205
|
-
step[i] = eps
|
|
206
|
-
|
|
207
|
-
x_1 = x_c + step
|
|
208
|
-
x_0 = x_c - step
|
|
209
|
-
|
|
210
|
-
param.assign(x_1)
|
|
211
|
-
l_1 = self.forward().numpy()[0]
|
|
212
|
-
|
|
213
|
-
param.assign(x_0)
|
|
214
|
-
l_0 = self.forward().numpy()[0]
|
|
215
|
-
|
|
216
|
-
dldx = (l_1 - l_0) / (eps * 2.0)
|
|
217
|
-
|
|
218
|
-
x_grad_numeric[i] = dldx
|
|
219
|
-
|
|
220
|
-
# reset initial state
|
|
221
|
-
param.assign(x_c)
|
|
222
|
-
|
|
223
|
-
# compute analytic gradient
|
|
224
|
-
tape = wp.Tape()
|
|
225
|
-
with tape:
|
|
226
|
-
l = self.forward()
|
|
227
|
-
|
|
228
|
-
tape.backward(l)
|
|
229
|
-
|
|
230
|
-
x_grad_analytic = tape.gradients[param]
|
|
231
|
-
|
|
232
|
-
print(f"numeric grad: {x_grad_numeric}")
|
|
233
|
-
print(f"analytic grad: {x_grad_analytic}")
|
|
234
|
-
|
|
235
|
-
tape.zero()
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
if __name__ == "__main__":
|
|
239
|
-
import argparse
|
|
240
|
-
|
|
241
|
-
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
242
|
-
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
243
|
-
parser.add_argument(
|
|
244
|
-
"--stage_path",
|
|
245
|
-
type=lambda x: None if x == "None" else str(x),
|
|
246
|
-
default="example_bounce.usd",
|
|
247
|
-
help="Path to the output USD file.",
|
|
248
|
-
)
|
|
249
|
-
parser.add_argument("--train_iters", type=int, default=250, help="Total number of training iterations.")
|
|
250
|
-
parser.add_argument("--verbose", action="store_true", help="Print out additional status messages during execution.")
|
|
251
|
-
|
|
252
|
-
args = parser.parse_known_args()[0]
|
|
253
|
-
|
|
254
|
-
with wp.ScopedDevice(args.device):
|
|
255
|
-
example = Example(stage_path=args.stage_path, verbose=args.verbose)
|
|
256
|
-
|
|
257
|
-
example.check_grad()
|
|
258
|
-
|
|
259
|
-
# replay and optimize
|
|
260
|
-
for i in range(args.train_iters):
|
|
261
|
-
example.step()
|
|
262
|
-
if i % 16 == 0:
|
|
263
|
-
example.render()
|
|
264
|
-
|
|
265
|
-
if example.renderer:
|
|
266
|
-
example.renderer.save()
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: Copyright (c) 2022 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
|
-
###########################################################################
|
|
17
|
-
# Example Sim Grad Cloth
|
|
18
|
-
#
|
|
19
|
-
# Shows how to use Warp to optimize the initial velocities of a piece of
|
|
20
|
-
# cloth such that its center of mass hits a target after a specified time.
|
|
21
|
-
#
|
|
22
|
-
# This example uses the built-in wp.Tape() object to compute gradients of
|
|
23
|
-
# the distance to target (loss) w.r.t the initial velocity, followed by
|
|
24
|
-
# a simple gradient-descent optimization step.
|
|
25
|
-
#
|
|
26
|
-
###########################################################################
|
|
27
|
-
|
|
28
|
-
import math
|
|
29
|
-
|
|
30
|
-
import warp as wp
|
|
31
|
-
import warp.sim
|
|
32
|
-
import warp.sim.render
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
@wp.kernel
|
|
36
|
-
def com_kernel(positions: wp.array(dtype=wp.vec3), n: int, com: wp.array(dtype=wp.vec3)):
|
|
37
|
-
tid = wp.tid()
|
|
38
|
-
|
|
39
|
-
# compute center of mass
|
|
40
|
-
wp.atomic_add(com, 0, positions[tid] / float(n))
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
@wp.kernel
|
|
44
|
-
def loss_kernel(com: wp.array(dtype=wp.vec3), target: wp.vec3, loss: wp.array(dtype=float)):
|
|
45
|
-
# sq. distance to target
|
|
46
|
-
delta = com[0] - target
|
|
47
|
-
|
|
48
|
-
loss[0] = wp.dot(delta, delta)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
@wp.kernel
|
|
52
|
-
def step_kernel(x: wp.array(dtype=wp.vec3), grad: wp.array(dtype=wp.vec3), alpha: float):
|
|
53
|
-
tid = wp.tid()
|
|
54
|
-
|
|
55
|
-
# gradient descent step
|
|
56
|
-
x[tid] = x[tid] - grad[tid] * alpha
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
class Example:
|
|
60
|
-
def __init__(self, stage_path="example_cloth_throw.usd", verbose=False):
|
|
61
|
-
self.verbose = verbose
|
|
62
|
-
|
|
63
|
-
# seconds
|
|
64
|
-
sim_duration = 2.0
|
|
65
|
-
|
|
66
|
-
# control frequency
|
|
67
|
-
fps = 60
|
|
68
|
-
self.frame_dt = 1.0 / fps
|
|
69
|
-
frame_steps = int(sim_duration / self.frame_dt)
|
|
70
|
-
|
|
71
|
-
# sim frequency
|
|
72
|
-
self.sim_substeps = 16
|
|
73
|
-
self.sim_steps = frame_steps * self.sim_substeps
|
|
74
|
-
self.sim_dt = self.frame_dt / self.sim_substeps
|
|
75
|
-
|
|
76
|
-
self.iter = 0
|
|
77
|
-
self.render_time = 0.0
|
|
78
|
-
|
|
79
|
-
self.train_rate = 5.0
|
|
80
|
-
|
|
81
|
-
builder = wp.sim.ModelBuilder()
|
|
82
|
-
builder.default_particle_radius = 0.01
|
|
83
|
-
|
|
84
|
-
dim_x = 16
|
|
85
|
-
dim_y = 16
|
|
86
|
-
|
|
87
|
-
builder.add_cloth_grid(
|
|
88
|
-
pos=wp.vec3(0.0, 0.0, 0.0),
|
|
89
|
-
vel=wp.vec3(0.1, 0.1, 0.0),
|
|
90
|
-
rot=wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), -math.pi * 0.25),
|
|
91
|
-
dim_x=dim_x,
|
|
92
|
-
dim_y=dim_y,
|
|
93
|
-
cell_x=1.0 / dim_x,
|
|
94
|
-
cell_y=1.0 / dim_y,
|
|
95
|
-
mass=1.0,
|
|
96
|
-
tri_ke=10000.0,
|
|
97
|
-
tri_ka=10000.0,
|
|
98
|
-
tri_kd=100.0,
|
|
99
|
-
tri_lift=10.0,
|
|
100
|
-
tri_drag=5.0,
|
|
101
|
-
)
|
|
102
|
-
|
|
103
|
-
self.model = builder.finalize()
|
|
104
|
-
self.model.ground = False
|
|
105
|
-
|
|
106
|
-
self.integrator = wp.sim.SemiImplicitIntegrator()
|
|
107
|
-
|
|
108
|
-
self.target = (8.0, 0.0, 0.0)
|
|
109
|
-
self.com = wp.zeros(1, dtype=wp.vec3, requires_grad=True)
|
|
110
|
-
self.loss = wp.zeros(1, dtype=wp.float32, requires_grad=True)
|
|
111
|
-
|
|
112
|
-
# allocate sim states for trajectory
|
|
113
|
-
self.states = []
|
|
114
|
-
for _i in range(self.sim_steps + 1):
|
|
115
|
-
self.states.append(self.model.state(requires_grad=True))
|
|
116
|
-
|
|
117
|
-
if stage_path:
|
|
118
|
-
self.renderer = wp.sim.render.SimRenderer(self.model, stage_path, scaling=4.0)
|
|
119
|
-
else:
|
|
120
|
-
self.renderer = None
|
|
121
|
-
|
|
122
|
-
# capture forward/backward passes
|
|
123
|
-
self.use_cuda_graph = wp.get_device().is_cuda
|
|
124
|
-
if self.use_cuda_graph:
|
|
125
|
-
with wp.ScopedCapture() as capture:
|
|
126
|
-
self.tape = wp.Tape()
|
|
127
|
-
with self.tape:
|
|
128
|
-
self.forward()
|
|
129
|
-
self.tape.backward(self.loss)
|
|
130
|
-
self.graph = capture.graph
|
|
131
|
-
|
|
132
|
-
def forward(self):
|
|
133
|
-
# run control loop
|
|
134
|
-
for i in range(self.sim_steps):
|
|
135
|
-
self.states[i].clear_forces()
|
|
136
|
-
|
|
137
|
-
self.integrator.simulate(self.model, self.states[i], self.states[i + 1], self.sim_dt)
|
|
138
|
-
|
|
139
|
-
# compute loss on final state
|
|
140
|
-
self.com.zero_()
|
|
141
|
-
wp.launch(
|
|
142
|
-
com_kernel,
|
|
143
|
-
dim=self.model.particle_count,
|
|
144
|
-
inputs=[self.states[-1].particle_q, self.model.particle_count, self.com],
|
|
145
|
-
)
|
|
146
|
-
wp.launch(loss_kernel, dim=1, inputs=[self.com, self.target, self.loss])
|
|
147
|
-
|
|
148
|
-
def step(self):
|
|
149
|
-
with wp.ScopedTimer("step"):
|
|
150
|
-
if self.use_cuda_graph:
|
|
151
|
-
wp.capture_launch(self.graph)
|
|
152
|
-
else:
|
|
153
|
-
self.tape = wp.Tape()
|
|
154
|
-
with self.tape:
|
|
155
|
-
self.forward()
|
|
156
|
-
self.tape.backward(self.loss)
|
|
157
|
-
|
|
158
|
-
# gradient descent step
|
|
159
|
-
x = self.states[0].particle_qd
|
|
160
|
-
|
|
161
|
-
if self.verbose:
|
|
162
|
-
print(f"Iter: {self.iter} Loss: {self.loss}")
|
|
163
|
-
|
|
164
|
-
wp.launch(step_kernel, dim=len(x), inputs=[x, x.grad, self.train_rate])
|
|
165
|
-
|
|
166
|
-
# clear grads for next iteration
|
|
167
|
-
self.tape.zero()
|
|
168
|
-
|
|
169
|
-
self.iter = self.iter + 1
|
|
170
|
-
|
|
171
|
-
def render(self):
|
|
172
|
-
if self.renderer is None:
|
|
173
|
-
return
|
|
174
|
-
|
|
175
|
-
with wp.ScopedTimer("render"):
|
|
176
|
-
# draw trajectory
|
|
177
|
-
traj_verts = [self.states[0].particle_q.numpy().mean(axis=0)]
|
|
178
|
-
|
|
179
|
-
for i in range(0, self.sim_steps, self.sim_substeps):
|
|
180
|
-
traj_verts.append(self.states[i].particle_q.numpy().mean(axis=0))
|
|
181
|
-
|
|
182
|
-
self.renderer.begin_frame(self.render_time)
|
|
183
|
-
self.renderer.render(self.states[i])
|
|
184
|
-
self.renderer.render_box(
|
|
185
|
-
pos=self.target,
|
|
186
|
-
rot=wp.quat_identity(),
|
|
187
|
-
extents=(0.1, 0.1, 0.1),
|
|
188
|
-
name="target",
|
|
189
|
-
color=(1.0, 0.0, 0.0),
|
|
190
|
-
)
|
|
191
|
-
self.renderer.render_line_strip(
|
|
192
|
-
vertices=traj_verts,
|
|
193
|
-
color=wp.render.bourke_color_map(0.0, 269.0, self.loss.numpy()[0]),
|
|
194
|
-
radius=0.02,
|
|
195
|
-
name=f"traj_{self.iter - 1}",
|
|
196
|
-
)
|
|
197
|
-
self.renderer.end_frame()
|
|
198
|
-
|
|
199
|
-
self.render_time += self.frame_dt
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
if __name__ == "__main__":
|
|
203
|
-
import argparse
|
|
204
|
-
|
|
205
|
-
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
206
|
-
parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
|
|
207
|
-
parser.add_argument(
|
|
208
|
-
"--stage_path",
|
|
209
|
-
type=lambda x: None if x == "None" else str(x),
|
|
210
|
-
default="example_cloth_throw.usd",
|
|
211
|
-
help="Path to the output USD file.",
|
|
212
|
-
)
|
|
213
|
-
parser.add_argument("--train_iters", type=int, default=64, help="Total number of training iterations.")
|
|
214
|
-
parser.add_argument("--verbose", action="store_true", help="Print out additional status messages during execution.")
|
|
215
|
-
|
|
216
|
-
args = parser.parse_known_args()[0]
|
|
217
|
-
|
|
218
|
-
with wp.ScopedDevice(args.device):
|
|
219
|
-
example = Example(stage_path=args.stage_path, verbose=args.verbose)
|
|
220
|
-
|
|
221
|
-
# replay and optimize
|
|
222
|
-
for i in range(args.train_iters):
|
|
223
|
-
example.step()
|
|
224
|
-
if i % 4 == 0:
|
|
225
|
-
example.render()
|
|
226
|
-
|
|
227
|
-
if example.renderer:
|
|
228
|
-
example.renderer.save()
|