warp-lang 0.10.1__py3-none-win_amd64.whl → 0.11.0__py3-none-win_amd64.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 +10 -4
- warp/__init__.pyi +1 -0
- warp/bin/warp-clang.dll +0 -0
- warp/bin/warp.dll +0 -0
- warp/build.py +5 -3
- warp/build_dll.py +29 -9
- warp/builtins.py +868 -507
- warp/codegen.py +1074 -638
- warp/config.py +3 -3
- warp/constants.py +6 -0
- warp/context.py +715 -222
- warp/fabric.py +326 -0
- warp/fem/__init__.py +27 -0
- warp/fem/cache.py +389 -0
- warp/fem/dirichlet.py +181 -0
- warp/fem/domain.py +263 -0
- warp/fem/field/__init__.py +101 -0
- warp/fem/field/field.py +149 -0
- warp/fem/field/nodal_field.py +299 -0
- warp/fem/field/restriction.py +21 -0
- warp/fem/field/test.py +181 -0
- warp/fem/field/trial.py +183 -0
- warp/fem/geometry/__init__.py +19 -0
- warp/fem/geometry/closest_point.py +70 -0
- warp/fem/geometry/deformed_geometry.py +271 -0
- warp/fem/geometry/element.py +744 -0
- warp/fem/geometry/geometry.py +186 -0
- warp/fem/geometry/grid_2d.py +373 -0
- warp/fem/geometry/grid_3d.py +435 -0
- warp/fem/geometry/hexmesh.py +953 -0
- warp/fem/geometry/partition.py +376 -0
- warp/fem/geometry/quadmesh_2d.py +532 -0
- warp/fem/geometry/tetmesh.py +840 -0
- warp/fem/geometry/trimesh_2d.py +577 -0
- warp/fem/integrate.py +1616 -0
- warp/fem/operator.py +191 -0
- warp/fem/polynomial.py +213 -0
- warp/fem/quadrature/__init__.py +2 -0
- warp/fem/quadrature/pic_quadrature.py +245 -0
- warp/fem/quadrature/quadrature.py +294 -0
- warp/fem/space/__init__.py +292 -0
- warp/fem/space/basis_space.py +489 -0
- warp/fem/space/collocated_function_space.py +105 -0
- warp/fem/space/dof_mapper.py +236 -0
- warp/fem/space/function_space.py +145 -0
- warp/fem/space/grid_2d_function_space.py +267 -0
- warp/fem/space/grid_3d_function_space.py +306 -0
- warp/fem/space/hexmesh_function_space.py +352 -0
- warp/fem/space/partition.py +350 -0
- warp/fem/space/quadmesh_2d_function_space.py +369 -0
- warp/fem/space/restriction.py +160 -0
- warp/fem/space/shape/__init__.py +15 -0
- warp/fem/space/shape/cube_shape_function.py +738 -0
- warp/fem/space/shape/shape_function.py +103 -0
- warp/fem/space/shape/square_shape_function.py +611 -0
- warp/fem/space/shape/tet_shape_function.py +567 -0
- warp/fem/space/shape/triangle_shape_function.py +429 -0
- warp/fem/space/tetmesh_function_space.py +292 -0
- warp/fem/space/topology.py +295 -0
- warp/fem/space/trimesh_2d_function_space.py +221 -0
- warp/fem/types.py +77 -0
- warp/fem/utils.py +495 -0
- warp/native/array.h +147 -44
- warp/native/builtin.h +122 -149
- warp/native/bvh.cpp +73 -325
- warp/native/bvh.cu +406 -23
- warp/native/bvh.h +34 -43
- warp/native/clang/clang.cpp +13 -8
- warp/native/crt.h +2 -0
- warp/native/cuda_crt.h +5 -0
- warp/native/cuda_util.cpp +15 -3
- warp/native/cuda_util.h +3 -1
- warp/native/cutlass/tools/library/scripts/conv2d_operation.py +463 -0
- warp/native/cutlass/tools/library/scripts/conv3d_operation.py +321 -0
- warp/native/cutlass/tools/library/scripts/gemm_operation.py +988 -0
- warp/native/cutlass/tools/library/scripts/generator.py +4625 -0
- warp/native/cutlass/tools/library/scripts/library.py +799 -0
- warp/native/cutlass/tools/library/scripts/manifest.py +402 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/docs/source/conf.py +96 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/profile/conv/conv2d_f16_sm80.py +106 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/profile/gemm/gemm_f32_sm80.py +91 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/setup.py +80 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/__init__.py +48 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/arguments.py +118 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/c_types.py +241 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/compiler.py +432 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/conv2d_operation.py +631 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/epilogue.py +1026 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/frontend.py +104 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/gemm_operation.py +1276 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/library.py +744 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/memory_manager.py +74 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/operation.py +110 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/parser.py +619 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/reduction_operation.py +398 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/tensor_ref.py +70 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/__init__.py +4 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/conv2d_testbed.py +646 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_grouped_testbed.py +235 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_testbed.py +557 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/profiler.py +70 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/type_hint.py +39 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/__init__.py +1 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/device.py +76 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/reference_model.py +255 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/__init__.py +0 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +201 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +177 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +98 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +95 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_few_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +163 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_fixed_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +187 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +309 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +54 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_strided_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +253 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +97 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +242 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/run_all_tests.py +10 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/frontend/test_frontend.py +146 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/__init__.py +0 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_bf16_sm80.py +96 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f16_sm80.py +447 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f32_sm80.py +146 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f64_sm80.py +102 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_grouped_sm80.py +203 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_s8_sm80.py +229 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/run_all_tests.py +9 -0
- warp/native/cutlass/tools/library/scripts/pycutlass/test/unit/test_sm80.py +453 -0
- warp/native/cutlass/tools/library/scripts/rank_2k_operation.py +398 -0
- warp/native/cutlass/tools/library/scripts/rank_k_operation.py +387 -0
- warp/native/cutlass/tools/library/scripts/rt.py +796 -0
- warp/native/cutlass/tools/library/scripts/symm_operation.py +400 -0
- warp/native/cutlass/tools/library/scripts/trmm_operation.py +407 -0
- warp/native/cutlass_gemm.cu +5 -3
- warp/native/exports.h +1240 -952
- warp/native/fabric.h +228 -0
- warp/native/hashgrid.cpp +4 -4
- warp/native/hashgrid.h +22 -2
- warp/native/intersect.h +22 -7
- warp/native/intersect_adj.h +8 -8
- warp/native/intersect_tri.h +1 -1
- warp/native/marching.cu +157 -161
- warp/native/mat.h +80 -19
- warp/native/matnn.h +2 -2
- warp/native/mesh.cpp +33 -108
- warp/native/mesh.cu +114 -23
- warp/native/mesh.h +446 -46
- warp/native/noise.h +272 -329
- warp/native/quat.h +51 -8
- warp/native/rand.h +45 -35
- warp/native/range.h +6 -2
- warp/native/reduce.cpp +1 -1
- warp/native/reduce.cu +10 -12
- warp/native/runlength_encode.cu +6 -10
- warp/native/scan.cu +8 -11
- warp/native/sparse.cpp +4 -4
- warp/native/sparse.cu +164 -154
- warp/native/spatial.h +2 -2
- warp/native/temp_buffer.h +14 -30
- warp/native/vec.h +107 -23
- warp/native/volume.h +120 -0
- warp/native/warp.cpp +560 -30
- warp/native/warp.cu +431 -44
- warp/native/warp.h +13 -4
- warp/optim/__init__.py +1 -0
- warp/optim/linear.py +922 -0
- warp/optim/sgd.py +92 -0
- warp/render/render_opengl.py +335 -119
- warp/render/render_usd.py +11 -11
- warp/sim/__init__.py +2 -2
- warp/sim/articulation.py +385 -185
- warp/sim/collide.py +8 -0
- warp/sim/import_mjcf.py +297 -106
- warp/sim/import_urdf.py +389 -210
- warp/sim/import_usd.py +198 -97
- warp/sim/inertia.py +17 -18
- warp/sim/integrator_euler.py +14 -8
- warp/sim/integrator_xpbd.py +158 -16
- warp/sim/model.py +795 -291
- warp/sim/render.py +3 -3
- warp/sim/utils.py +3 -0
- warp/sparse.py +640 -150
- warp/stubs.py +606 -267
- warp/tape.py +61 -10
- warp/tests/__main__.py +3 -6
- warp/tests/assets/curlnoise_golden.npy +0 -0
- warp/tests/assets/pnoise_golden.npy +0 -0
- warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
- warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
- warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
- warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
- warp/tests/aux_test_unresolved_func.py +14 -0
- warp/tests/aux_test_unresolved_symbol.py +14 -0
- warp/tests/disabled_kinematics.py +239 -0
- warp/tests/run_coverage_serial.py +31 -0
- warp/tests/test_adam.py +103 -106
- warp/tests/test_arithmetic.py +128 -74
- warp/tests/test_array.py +212 -97
- warp/tests/test_array_reduce.py +57 -23
- warp/tests/test_atomic.py +64 -28
- warp/tests/test_bool.py +99 -0
- warp/tests/test_builtins_resolution.py +1292 -0
- warp/tests/test_bvh.py +42 -18
- warp/tests/test_closest_point_edge_edge.py +54 -57
- warp/tests/test_codegen.py +208 -130
- warp/tests/test_compile_consts.py +28 -20
- warp/tests/test_conditional.py +108 -24
- warp/tests/test_copy.py +10 -12
- warp/tests/test_ctypes.py +112 -88
- warp/tests/test_dense.py +21 -14
- warp/tests/test_devices.py +98 -0
- warp/tests/test_dlpack.py +75 -75
- warp/tests/test_examples.py +277 -0
- warp/tests/test_fabricarray.py +955 -0
- warp/tests/test_fast_math.py +15 -11
- warp/tests/test_fem.py +1271 -0
- warp/tests/test_fp16.py +53 -19
- warp/tests/test_func.py +187 -86
- warp/tests/test_generics.py +194 -49
- warp/tests/test_grad.py +178 -109
- warp/tests/test_grad_customs.py +176 -0
- warp/tests/test_hash_grid.py +52 -37
- warp/tests/test_import.py +10 -23
- warp/tests/test_indexedarray.py +32 -31
- warp/tests/test_intersect.py +18 -9
- warp/tests/test_large.py +141 -0
- warp/tests/test_launch.py +14 -41
- warp/tests/test_lerp.py +64 -65
- warp/tests/test_linear_solvers.py +154 -0
- warp/tests/test_lvalue.py +493 -0
- warp/tests/test_marching_cubes.py +12 -13
- warp/tests/test_mat.py +517 -2898
- warp/tests/test_mat_lite.py +115 -0
- warp/tests/test_mat_scalar_ops.py +2889 -0
- warp/tests/test_math.py +103 -9
- warp/tests/test_matmul.py +305 -69
- warp/tests/test_matmul_lite.py +410 -0
- warp/tests/test_mesh.py +71 -14
- warp/tests/test_mesh_query_aabb.py +41 -25
- warp/tests/test_mesh_query_point.py +140 -22
- warp/tests/test_mesh_query_ray.py +39 -22
- warp/tests/test_mlp.py +30 -22
- warp/tests/test_model.py +92 -89
- warp/tests/test_modules_lite.py +39 -0
- warp/tests/test_multigpu.py +88 -114
- warp/tests/test_noise.py +12 -11
- warp/tests/test_operators.py +16 -20
- warp/tests/test_options.py +11 -11
- warp/tests/test_pinned.py +17 -18
- warp/tests/test_print.py +32 -11
- warp/tests/test_quat.py +275 -129
- warp/tests/test_rand.py +18 -16
- warp/tests/test_reload.py +38 -34
- warp/tests/test_rounding.py +50 -43
- warp/tests/test_runlength_encode.py +168 -20
- warp/tests/test_smoothstep.py +9 -11
- warp/tests/test_snippet.py +143 -0
- warp/tests/test_sparse.py +261 -63
- warp/tests/test_spatial.py +276 -243
- warp/tests/test_streams.py +110 -85
- warp/tests/test_struct.py +268 -63
- warp/tests/test_tape.py +39 -21
- warp/tests/test_torch.py +118 -89
- warp/tests/test_transient_module.py +12 -13
- warp/tests/test_types.py +614 -0
- warp/tests/test_utils.py +494 -0
- warp/tests/test_vec.py +354 -2050
- warp/tests/test_vec_lite.py +73 -0
- warp/tests/test_vec_scalar_ops.py +2099 -0
- warp/tests/test_volume.py +457 -293
- warp/tests/test_volume_write.py +124 -134
- warp/tests/unittest_serial.py +35 -0
- warp/tests/unittest_suites.py +341 -0
- warp/tests/unittest_utils.py +568 -0
- warp/tests/unused_test_misc.py +71 -0
- warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
- warp/thirdparty/appdirs.py +36 -45
- warp/thirdparty/unittest_parallel.py +549 -0
- warp/torch.py +9 -6
- warp/types.py +1089 -366
- warp/utils.py +93 -387
- warp_lang-0.11.0.dist-info/METADATA +238 -0
- warp_lang-0.11.0.dist-info/RECORD +332 -0
- {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/WHEEL +1 -1
- warp/tests/test_all.py +0 -219
- warp/tests/test_array_scan.py +0 -60
- warp/tests/test_base.py +0 -208
- warp/tests/test_unresolved_func.py +0 -7
- warp/tests/test_unresolved_symbol.py +0 -7
- warp_lang-0.10.1.dist-info/METADATA +0 -21
- warp_lang-0.10.1.dist-info/RECORD +0 -188
- /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
- /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
- /warp/tests/{test_square.py → aux_test_square.py} +0 -0
- {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/LICENSE.md +0 -0
- {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/top_level.txt +0 -0
warp/tape.py
CHANGED
|
@@ -5,11 +5,39 @@
|
|
|
5
5
|
# distribution of this software and related documentation without an express
|
|
6
6
|
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
7
|
|
|
8
|
-
import numpy as np
|
|
9
8
|
import warp as wp
|
|
10
9
|
|
|
11
10
|
|
|
12
11
|
class Tape:
|
|
12
|
+
"""
|
|
13
|
+
Record kernel launches within a Tape scope to enable automatic differentiation.
|
|
14
|
+
Gradients can be computed after the operations have been recorded on the tape via
|
|
15
|
+
``tape.backward()``.
|
|
16
|
+
|
|
17
|
+
Example
|
|
18
|
+
-------
|
|
19
|
+
|
|
20
|
+
.. code-block:: python
|
|
21
|
+
|
|
22
|
+
tape = wp.Tape()
|
|
23
|
+
|
|
24
|
+
# forward pass
|
|
25
|
+
with tape:
|
|
26
|
+
wp.launch(kernel=compute1, inputs=[a, b], device="cuda")
|
|
27
|
+
wp.launch(kernel=compute2, inputs=[c, d], device="cuda")
|
|
28
|
+
wp.launch(kernel=loss, inputs=[d, l], device="cuda")
|
|
29
|
+
|
|
30
|
+
# reverse pass
|
|
31
|
+
tape.backward(l)
|
|
32
|
+
|
|
33
|
+
Gradients can be accessed via the ``tape.gradients`` dictionary, e.g.:
|
|
34
|
+
|
|
35
|
+
.. code-block:: python
|
|
36
|
+
|
|
37
|
+
print(tape.gradients[a])
|
|
38
|
+
|
|
39
|
+
"""
|
|
40
|
+
|
|
13
41
|
def __init__(self):
|
|
14
42
|
self.gradients = {}
|
|
15
43
|
self.const_gradients = set()
|
|
@@ -37,13 +65,24 @@ class Tape:
|
|
|
37
65
|
# adj_tensor = tape.gradients[tensor]
|
|
38
66
|
#
|
|
39
67
|
def backward(self, loss: wp.array = None, grads: dict = None):
|
|
68
|
+
"""
|
|
69
|
+
Evaluate the backward pass of the recorded operations on the tape.
|
|
70
|
+
A single-element array ``loss`` or a dictionary of arrays ``grads``
|
|
71
|
+
can be provided to assign the incoming gradients for the reverse-mode
|
|
72
|
+
automatic differentiation pass.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
loss (wp.array): A single-element array that holds the loss function value whose gradient is to be computed
|
|
76
|
+
grads (dict): A dictionary of arrays that map from Warp arrays to their incoming gradients
|
|
77
|
+
|
|
78
|
+
"""
|
|
40
79
|
# if scalar loss is specified then initialize
|
|
41
80
|
# a 'seed' array for it, with gradient of one
|
|
42
81
|
if loss:
|
|
43
82
|
if loss.size > 1 or wp.types.type_length(loss.dtype) > 1:
|
|
44
83
|
raise RuntimeError("Can only return gradients for scalar loss functions.")
|
|
45
84
|
|
|
46
|
-
if loss.requires_grad
|
|
85
|
+
if not loss.requires_grad:
|
|
47
86
|
raise RuntimeError(
|
|
48
87
|
"Scalar loss arrays should have requires_grad=True set before calling Tape.backward()"
|
|
49
88
|
)
|
|
@@ -67,9 +106,10 @@ class Tape:
|
|
|
67
106
|
else:
|
|
68
107
|
kernel = launch[0]
|
|
69
108
|
dim = launch[1]
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
109
|
+
max_blocks = launch[2]
|
|
110
|
+
inputs = launch[3]
|
|
111
|
+
outputs = launch[4]
|
|
112
|
+
device = launch[5]
|
|
73
113
|
|
|
74
114
|
adj_inputs = []
|
|
75
115
|
adj_outputs = []
|
|
@@ -91,16 +131,21 @@ class Tape:
|
|
|
91
131
|
adj_outputs=adj_outputs,
|
|
92
132
|
device=device,
|
|
93
133
|
adjoint=True,
|
|
134
|
+
max_blocks=max_blocks,
|
|
94
135
|
)
|
|
95
136
|
|
|
96
137
|
# record a kernel launch on the tape
|
|
97
|
-
def record_launch(self, kernel, dim, inputs, outputs, device):
|
|
98
|
-
self.launches.append([kernel, dim, inputs, outputs, device])
|
|
138
|
+
def record_launch(self, kernel, dim, max_blocks, inputs, outputs, device):
|
|
139
|
+
self.launches.append([kernel, dim, max_blocks, inputs, outputs, device])
|
|
99
140
|
|
|
100
|
-
# records a custom function for the backward pass, can be any
|
|
101
|
-
# Callable python object. Callee should also pass arrays that
|
|
102
|
-
# take part in the function for gradient tracking.
|
|
103
141
|
def record_func(self, backward, arrays):
|
|
142
|
+
"""
|
|
143
|
+
Records a custom function to be executed only in the backward pass.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
backward (Callable): A callable Python object (can be any function) that will be executed in the backward pass.
|
|
147
|
+
arrays (list): A list of arrays that are used by the function for gradient tracking.
|
|
148
|
+
"""
|
|
104
149
|
self.launches.append(backward)
|
|
105
150
|
|
|
106
151
|
for a in arrays:
|
|
@@ -145,10 +190,16 @@ class Tape:
|
|
|
145
190
|
return None
|
|
146
191
|
|
|
147
192
|
def reset(self):
|
|
193
|
+
"""
|
|
194
|
+
Clear all operations recorded on the tape and zero out all gradients.
|
|
195
|
+
"""
|
|
148
196
|
self.launches = []
|
|
149
197
|
self.zero()
|
|
150
198
|
|
|
151
199
|
def zero(self):
|
|
200
|
+
"""
|
|
201
|
+
Zero out all gradients recorded on the tape.
|
|
202
|
+
"""
|
|
152
203
|
for a, g in self.gradients.items():
|
|
153
204
|
if a not in self.const_gradients:
|
|
154
205
|
if isinstance(a, wp.codegen.StructInstance):
|
warp/tests/__main__.py
CHANGED
|
Binary file
|
|
Binary file
|
|
@@ -1,7 +1,15 @@
|
|
|
1
|
+
# Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
+
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
+
# and proprietary rights in and to this software, related documentation
|
|
4
|
+
# and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
+
# distribution of this software and related documentation without an express
|
|
6
|
+
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
+
|
|
8
|
+
"""Dummy class used in test_reload.py"""
|
|
9
|
+
|
|
1
10
|
import warp as wp
|
|
2
11
|
|
|
3
12
|
|
|
4
|
-
# dummy class used in test_reload.py
|
|
5
13
|
class ClassKernelTest:
|
|
6
14
|
def __init__(self, device):
|
|
7
15
|
# 3x3 frames in the rest pose:
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Copyright (c) 2023 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
+
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
+
# and proprietary rights in and to this software, related documentation
|
|
4
|
+
# and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
+
# distribution of this software and related documentation without an express
|
|
6
|
+
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
+
|
|
8
|
+
"""This file defines a kernel that fails on codegen.py"""
|
|
9
|
+
|
|
10
|
+
import warp as wp
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@wp.kernel
|
|
14
|
+
def unequal_types_kernel():
|
|
15
|
+
x = wp.int32(10)
|
|
16
|
+
y = 10
|
|
17
|
+
z = True
|
|
18
|
+
|
|
19
|
+
# Throws a TypeError
|
|
20
|
+
if x == y == z:
|
|
21
|
+
pass
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
# distribution of this software and related documentation without an express
|
|
6
6
|
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
"""This file is used to test reloading module references."""
|
|
9
9
|
|
|
10
10
|
import warp as wp
|
|
11
|
-
import warp.tests.
|
|
11
|
+
import warp.tests.aux_test_reference as ref
|
|
12
12
|
|
|
13
13
|
wp.init()
|
|
14
14
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
+
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
+
# and proprietary rights in and to this software, related documentation
|
|
4
|
+
# and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
+
# distribution of this software and related documentation without an express
|
|
6
|
+
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
+
|
|
8
|
+
import warp as wp
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@wp.kernel
|
|
12
|
+
def unresolved_func_kernel():
|
|
13
|
+
# this should trigger an exception due to unresolved function
|
|
14
|
+
x = wp.missing_func(42)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
+
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
+
# and proprietary rights in and to this software, related documentation
|
|
4
|
+
# and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
+
# distribution of this software and related documentation without an express
|
|
6
|
+
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
+
|
|
8
|
+
import warp as wp
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@wp.kernel
|
|
12
|
+
def unresolved_symbol_kernel():
|
|
13
|
+
# this should trigger an exception due to unresolved symbol
|
|
14
|
+
x = missing_symbol
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
+
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
+
# and proprietary rights in and to this software, related documentation
|
|
4
|
+
# and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
+
# distribution of this software and related documentation without an express
|
|
6
|
+
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
+
|
|
8
|
+
import math
|
|
9
|
+
import unittest
|
|
10
|
+
|
|
11
|
+
import warp as wp
|
|
12
|
+
import warp.sim
|
|
13
|
+
from warp.tests.unittest_utils import *
|
|
14
|
+
|
|
15
|
+
wp.init()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def build_ant(num_envs):
|
|
19
|
+
builder = wp.sim.ModelBuilder()
|
|
20
|
+
for i in range(num_envs):
|
|
21
|
+
wp.sim.parse_mjcf(
|
|
22
|
+
os.path.join(os.path.dirname(__file__), "../../examples/assets/nv_ant.xml"),
|
|
23
|
+
builder,
|
|
24
|
+
up_axis="y",
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
coord_count = 15
|
|
28
|
+
dof_count = 14
|
|
29
|
+
|
|
30
|
+
coord_start = i * coord_count
|
|
31
|
+
dof_start = i * dof_count
|
|
32
|
+
|
|
33
|
+
# base
|
|
34
|
+
builder.joint_q[coord_start : coord_start + 3] = [i * 2.0, 0.70, 0.0]
|
|
35
|
+
builder.joint_q[coord_start + 3 : coord_start + 7] = wp.quat_from_axis_angle((1.0, 0.0, 0.0), -math.pi * 0.5)
|
|
36
|
+
|
|
37
|
+
# joints
|
|
38
|
+
builder.joint_q[coord_start + 7 : coord_start + coord_count] = [0.0, 1.0, 0.0, -1.0, 0.0, -1.0, 0.0, 1.0]
|
|
39
|
+
builder.joint_qd[dof_start + 6 : dof_start + dof_count] = [1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0]
|
|
40
|
+
|
|
41
|
+
return builder
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def build_complex_joint_mechanism(chain_length):
|
|
45
|
+
builder = wp.sim.ModelBuilder()
|
|
46
|
+
com0 = wp.vec3(1.0, 2.0, 3.0)
|
|
47
|
+
com1 = wp.vec3(4.0, 5.0, 6.0)
|
|
48
|
+
com2 = wp.vec3(7.0, 8.0, 9.0)
|
|
49
|
+
ax0 = wp.normalize(wp.vec3(-1.0, 2.0, 3.0))
|
|
50
|
+
ax1 = wp.normalize(wp.vec3(4.0, -1.0, 2.0))
|
|
51
|
+
ax2 = wp.normalize(wp.vec3(-3.0, 4.0, -1.0))
|
|
52
|
+
# declare some transforms with nonzero translation and orientation
|
|
53
|
+
tf0 = wp.transform(wp.vec3(1.0, 2.0, 3.0), wp.quat_from_axis_angle((1.0, 0.0, 0.0), math.pi * 0.25))
|
|
54
|
+
tf1 = wp.transform(wp.vec3(4.0, 5.0, 6.0), wp.quat_from_axis_angle((0.0, 1.0, 0.0), math.pi * 0.5))
|
|
55
|
+
tf2 = wp.transform(wp.vec3(7.0, 8.0, 9.0), wp.quat_from_axis_angle((0.0, 0.0, 1.0), math.pi * 0.75))
|
|
56
|
+
|
|
57
|
+
parent = -1
|
|
58
|
+
for i in range(chain_length):
|
|
59
|
+
b0 = builder.add_body(com=com0)
|
|
60
|
+
builder.add_joint_fixed(parent=parent, child=b0, parent_xform=tf1, child_xform=tf0)
|
|
61
|
+
assert builder.articulation_count == 1
|
|
62
|
+
|
|
63
|
+
b1 = builder.add_body(com=com1)
|
|
64
|
+
builder.add_joint_revolute(parent=b0, child=b1, parent_xform=tf1, child_xform=tf2, axis=ax1)
|
|
65
|
+
builder.joint_q[-1] = 0.3
|
|
66
|
+
builder.joint_qd[-1] = 1.0
|
|
67
|
+
|
|
68
|
+
b2 = builder.add_body(com=com2)
|
|
69
|
+
builder.add_joint_universal(parent=b1, child=b2, parent_xform=tf2, child_xform=tf0, axis_0=ax0, axis_1=ax1)
|
|
70
|
+
builder.joint_q[-2:] = [0.3, 0.5]
|
|
71
|
+
builder.joint_qd[-2:] = [1.0, -1.0]
|
|
72
|
+
|
|
73
|
+
b3 = builder.add_body(com=com0)
|
|
74
|
+
builder.add_joint_ball(parent=b2, child=b3, parent_xform=tf0, child_xform=tf1)
|
|
75
|
+
builder.joint_q[-4:] = list(wp.quat_from_axis_angle(ax0, 0.7))
|
|
76
|
+
builder.joint_qd[-3:] = [1.0, -0.6, 1.5]
|
|
77
|
+
|
|
78
|
+
b4 = builder.add_body(com=com1)
|
|
79
|
+
builder.add_joint_compound(
|
|
80
|
+
parent=b3,
|
|
81
|
+
child=b4,
|
|
82
|
+
parent_xform=tf2,
|
|
83
|
+
child_xform=tf1,
|
|
84
|
+
axis_0=(0, 0, 1),
|
|
85
|
+
axis_1=(1, 0, 0),
|
|
86
|
+
axis_2=(0, 1, 0),
|
|
87
|
+
)
|
|
88
|
+
builder.joint_q[-3:] = [0.3, 0.5, 0.27]
|
|
89
|
+
builder.joint_qd[-3:] = [1.23, -1.0, 0.5]
|
|
90
|
+
|
|
91
|
+
b5 = builder.add_body(com=com2)
|
|
92
|
+
builder.add_joint_prismatic(
|
|
93
|
+
parent=b4,
|
|
94
|
+
child=b5,
|
|
95
|
+
parent_xform=tf2,
|
|
96
|
+
child_xform=tf0,
|
|
97
|
+
axis=ax0,
|
|
98
|
+
)
|
|
99
|
+
builder.joint_q[-1] = 0.92
|
|
100
|
+
builder.joint_qd[-1] = -0.63
|
|
101
|
+
|
|
102
|
+
b6 = builder.add_body(com=com0)
|
|
103
|
+
builder.add_joint_d6(
|
|
104
|
+
parent=b5,
|
|
105
|
+
child=b6,
|
|
106
|
+
parent_xform=tf0,
|
|
107
|
+
child_xform=tf2,
|
|
108
|
+
linear_axes=[ax0, ax1, wp.cross(ax0, ax1)],
|
|
109
|
+
angular_axes=[ax1, ax2, wp.cross(ax1, ax2)],
|
|
110
|
+
)
|
|
111
|
+
builder.joint_q[-6:] = [0.3, 0.5, 0.7, 0.9, 1.1, 1.3]
|
|
112
|
+
builder.joint_qd[-6:] = [1.0, -1.0, 0.5, 0.8, -0.3, 0.1]
|
|
113
|
+
|
|
114
|
+
b7 = builder.add_body(com=com1)
|
|
115
|
+
builder.add_joint_free(
|
|
116
|
+
parent=b6,
|
|
117
|
+
child=b7,
|
|
118
|
+
parent_xform=tf1,
|
|
119
|
+
child_xform=tf2,
|
|
120
|
+
)
|
|
121
|
+
builder.joint_q[-7:] = [0.5, -0.9, 1.4] + list(wp.quat_rpy(0.3, -0.5, 0.7))
|
|
122
|
+
builder.joint_qd[-6:] = [1.0, -1.0, 0.5, 0.8, -0.3, 0.1]
|
|
123
|
+
|
|
124
|
+
b8 = builder.add_body(com=com2)
|
|
125
|
+
builder.add_joint_distance(
|
|
126
|
+
parent=b7,
|
|
127
|
+
child=b8,
|
|
128
|
+
parent_xform=tf1,
|
|
129
|
+
child_xform=tf2,
|
|
130
|
+
)
|
|
131
|
+
builder.joint_q[-7:] = [-0.3, -0.7, 0.2] + list(wp.quat_rpy(0.1, 0.1, 0.4))
|
|
132
|
+
builder.joint_qd[-6:] = [-0.34, 0.5, -0.6, -0.4, 0.2, 0.1]
|
|
133
|
+
|
|
134
|
+
# D6 joint that behaves like a fixed joint
|
|
135
|
+
b9 = builder.add_body(com=com0)
|
|
136
|
+
builder.add_joint_d6(
|
|
137
|
+
parent=b8,
|
|
138
|
+
child=b9,
|
|
139
|
+
parent_xform=tf0,
|
|
140
|
+
child_xform=tf2,
|
|
141
|
+
linear_axes=[],
|
|
142
|
+
angular_axes=[],
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
b10 = builder.add_body(com=com0)
|
|
146
|
+
builder.add_joint_d6(
|
|
147
|
+
parent=b9,
|
|
148
|
+
child=b10,
|
|
149
|
+
parent_xform=tf1,
|
|
150
|
+
child_xform=tf2,
|
|
151
|
+
linear_axes=[ax1],
|
|
152
|
+
angular_axes=[ax2, ax0],
|
|
153
|
+
)
|
|
154
|
+
builder.joint_q[-3:] = [0.3, 0.5, 0.7]
|
|
155
|
+
builder.joint_qd[-3:] = [1.0, -1.0, 0.5]
|
|
156
|
+
|
|
157
|
+
b11 = builder.add_body(com=com1)
|
|
158
|
+
builder.add_joint_d6(
|
|
159
|
+
parent=b10,
|
|
160
|
+
child=b11,
|
|
161
|
+
parent_xform=tf1,
|
|
162
|
+
child_xform=tf2,
|
|
163
|
+
linear_axes=[ax1, ax0, wp.cross(ax1, ax0)],
|
|
164
|
+
angular_axes=[],
|
|
165
|
+
)
|
|
166
|
+
builder.joint_q[-3:] = [0.3, 0.5, 0.7]
|
|
167
|
+
builder.joint_qd[-3:] = [1.0, -1.0, 0.5]
|
|
168
|
+
|
|
169
|
+
b12 = builder.add_body(com=com2)
|
|
170
|
+
builder.add_joint_d6(
|
|
171
|
+
parent=b11,
|
|
172
|
+
child=b12,
|
|
173
|
+
parent_xform=tf1,
|
|
174
|
+
child_xform=tf2,
|
|
175
|
+
linear_axes=[],
|
|
176
|
+
angular_axes=[ax1, ax2, wp.cross(ax1, ax2)],
|
|
177
|
+
)
|
|
178
|
+
builder.joint_q[-3:] = [0.3, 0.5, 0.7]
|
|
179
|
+
builder.joint_qd[-3:] = [1.0, -1.0, 0.5]
|
|
180
|
+
|
|
181
|
+
parent = b12
|
|
182
|
+
|
|
183
|
+
return builder
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def check_fk_ik(builder, device):
|
|
187
|
+
model = builder.finalize(device)
|
|
188
|
+
state = model.state()
|
|
189
|
+
|
|
190
|
+
q_fk = model.joint_q.numpy()
|
|
191
|
+
qd_fk = model.joint_qd.numpy()
|
|
192
|
+
|
|
193
|
+
wp.sim.eval_fk(model, model.joint_q, model.joint_qd, None, state)
|
|
194
|
+
|
|
195
|
+
q_ik = wp.zeros_like(model.joint_q)
|
|
196
|
+
qd_ik = wp.zeros_like(model.joint_qd)
|
|
197
|
+
|
|
198
|
+
wp.sim.eval_ik(model, state, q_ik, qd_ik)
|
|
199
|
+
|
|
200
|
+
# adjust numpy print settings
|
|
201
|
+
# np.set_printoptions(precision=4, floatmode="fixed", suppress=True)
|
|
202
|
+
# print("q:")
|
|
203
|
+
# print(np.array(q_fk))
|
|
204
|
+
# print(q_ik.numpy())
|
|
205
|
+
|
|
206
|
+
# print("qd:")
|
|
207
|
+
# print(np.array(qd_fk))
|
|
208
|
+
# print(qd_ik.numpy())
|
|
209
|
+
|
|
210
|
+
assert_np_equal(q_ik.numpy(), q_fk, tol=1e-4)
|
|
211
|
+
assert_np_equal(qd_ik.numpy(), qd_fk, tol=1e-4)
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def test_fk_ik_ant(test, device):
|
|
215
|
+
builder = build_ant(3)
|
|
216
|
+
check_fk_ik(builder, device)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def test_fk_ik_complex_joint_mechanism(test, device):
|
|
220
|
+
builder = build_complex_joint_mechanism(2)
|
|
221
|
+
check_fk_ik(builder, device)
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
devices = get_test_devices()
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
class TestKinematics(unittest.TestCase):
|
|
228
|
+
pass
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
add_function_test(TestKinematics, "test_fk_ik_ant", test_fk_ik_ant, devices=devices)
|
|
232
|
+
add_function_test(
|
|
233
|
+
TestKinematics, "test_fk_ik_complex_joint_mechanism", test_fk_ik_complex_joint_mechanism, devices=devices
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
if __name__ == "__main__":
|
|
238
|
+
wp.build.clear_kernel_cache()
|
|
239
|
+
unittest.main(verbosity=2, failfast=False)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Copyright (c) 2023 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
+
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
+
# and proprietary rights in and to this software, related documentation
|
|
4
|
+
# and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
+
# distribution of this software and related documentation without an express
|
|
6
|
+
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
+
|
|
8
|
+
"""Serial code-coverage runner
|
|
9
|
+
|
|
10
|
+
This script is used to generate code-coverage reports by running Warp tests.
|
|
11
|
+
It runs in serial so can take over an hour to finish. To generate a coverage
|
|
12
|
+
report in parallel, use the warp/thirdparty./unittest_parallel.py script
|
|
13
|
+
instead with the --coverage option, e.g. python -m warp.tests --coverage
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import coverage
|
|
17
|
+
|
|
18
|
+
cover = coverage.Coverage(config_file=True, messages=True)
|
|
19
|
+
|
|
20
|
+
cover.start()
|
|
21
|
+
|
|
22
|
+
with cover.collect():
|
|
23
|
+
import unittest_serial # noqa: E402
|
|
24
|
+
|
|
25
|
+
unittest_serial.run_specified()
|
|
26
|
+
|
|
27
|
+
cover.save()
|
|
28
|
+
|
|
29
|
+
cover.report()
|
|
30
|
+
|
|
31
|
+
cover.html_report(title="Warp Testing Code Coverage Report")
|