warp-lang 1.7.0__py3-none-manylinux_2_28_x86_64.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 +139 -0
- warp/__init__.pyi +1 -0
- warp/autograd.py +1142 -0
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/build.py +557 -0
- warp/build_dll.py +405 -0
- warp/builtins.py +6855 -0
- warp/codegen.py +3969 -0
- warp/config.py +158 -0
- warp/constants.py +57 -0
- warp/context.py +6812 -0
- warp/dlpack.py +462 -0
- warp/examples/__init__.py +24 -0
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cartpole.urdf +110 -0
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nonuniform.usd +0 -0
- warp/examples/assets/nv_ant.xml +92 -0
- warp/examples/assets/nv_humanoid.xml +183 -0
- warp/examples/assets/nvidia_logo.png +0 -0
- warp/examples/assets/pixel.jpg +0 -0
- warp/examples/assets/quadruped.urdf +268 -0
- warp/examples/assets/rocks.nvdb +0 -0
- warp/examples/assets/rocks.usd +0 -0
- warp/examples/assets/sphere.usd +0 -0
- warp/examples/assets/square_cloth.usd +0 -0
- warp/examples/benchmarks/benchmark_api.py +389 -0
- warp/examples/benchmarks/benchmark_cloth.py +296 -0
- warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
- warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
- warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
- warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
- warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
- warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
- warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
- warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
- warp/examples/benchmarks/benchmark_gemm.py +164 -0
- warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
- warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
- warp/examples/benchmarks/benchmark_launches.py +301 -0
- warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
- warp/examples/browse.py +37 -0
- warp/examples/core/example_cupy.py +86 -0
- warp/examples/core/example_dem.py +241 -0
- warp/examples/core/example_fluid.py +299 -0
- warp/examples/core/example_graph_capture.py +150 -0
- warp/examples/core/example_marching_cubes.py +194 -0
- warp/examples/core/example_mesh.py +180 -0
- warp/examples/core/example_mesh_intersect.py +211 -0
- warp/examples/core/example_nvdb.py +182 -0
- warp/examples/core/example_raycast.py +111 -0
- warp/examples/core/example_raymarch.py +205 -0
- warp/examples/core/example_render_opengl.py +193 -0
- warp/examples/core/example_sample_mesh.py +300 -0
- warp/examples/core/example_sph.py +411 -0
- warp/examples/core/example_torch.py +211 -0
- warp/examples/core/example_wave.py +269 -0
- warp/examples/fem/example_adaptive_grid.py +286 -0
- warp/examples/fem/example_apic_fluid.py +423 -0
- warp/examples/fem/example_burgers.py +261 -0
- warp/examples/fem/example_convection_diffusion.py +178 -0
- warp/examples/fem/example_convection_diffusion_dg.py +204 -0
- warp/examples/fem/example_deformed_geometry.py +172 -0
- warp/examples/fem/example_diffusion.py +196 -0
- warp/examples/fem/example_diffusion_3d.py +225 -0
- warp/examples/fem/example_diffusion_mgpu.py +220 -0
- warp/examples/fem/example_distortion_energy.py +228 -0
- warp/examples/fem/example_magnetostatics.py +240 -0
- warp/examples/fem/example_mixed_elasticity.py +291 -0
- warp/examples/fem/example_navier_stokes.py +261 -0
- warp/examples/fem/example_nonconforming_contact.py +298 -0
- warp/examples/fem/example_stokes.py +213 -0
- warp/examples/fem/example_stokes_transfer.py +262 -0
- warp/examples/fem/example_streamlines.py +352 -0
- warp/examples/fem/utils.py +1000 -0
- warp/examples/interop/example_jax_callable.py +116 -0
- warp/examples/interop/example_jax_ffi_callback.py +132 -0
- warp/examples/interop/example_jax_kernel.py +205 -0
- warp/examples/optim/example_bounce.py +266 -0
- warp/examples/optim/example_cloth_throw.py +228 -0
- warp/examples/optim/example_diffray.py +561 -0
- warp/examples/optim/example_drone.py +870 -0
- warp/examples/optim/example_fluid_checkpoint.py +497 -0
- warp/examples/optim/example_inverse_kinematics.py +182 -0
- warp/examples/optim/example_inverse_kinematics_torch.py +191 -0
- warp/examples/optim/example_softbody_properties.py +400 -0
- warp/examples/optim/example_spring_cage.py +245 -0
- warp/examples/optim/example_trajectory.py +227 -0
- warp/examples/sim/example_cartpole.py +143 -0
- warp/examples/sim/example_cloth.py +225 -0
- warp/examples/sim/example_cloth_self_contact.py +322 -0
- warp/examples/sim/example_granular.py +130 -0
- warp/examples/sim/example_granular_collision_sdf.py +202 -0
- warp/examples/sim/example_jacobian_ik.py +244 -0
- warp/examples/sim/example_particle_chain.py +124 -0
- warp/examples/sim/example_quadruped.py +203 -0
- warp/examples/sim/example_rigid_chain.py +203 -0
- warp/examples/sim/example_rigid_contact.py +195 -0
- warp/examples/sim/example_rigid_force.py +133 -0
- warp/examples/sim/example_rigid_gyroscopic.py +115 -0
- warp/examples/sim/example_rigid_soft_contact.py +140 -0
- warp/examples/sim/example_soft_body.py +196 -0
- warp/examples/tile/example_tile_cholesky.py +87 -0
- warp/examples/tile/example_tile_convolution.py +66 -0
- warp/examples/tile/example_tile_fft.py +55 -0
- warp/examples/tile/example_tile_filtering.py +113 -0
- warp/examples/tile/example_tile_matmul.py +85 -0
- warp/examples/tile/example_tile_mlp.py +383 -0
- warp/examples/tile/example_tile_nbody.py +199 -0
- warp/examples/tile/example_tile_walker.py +327 -0
- warp/fabric.py +355 -0
- warp/fem/__init__.py +106 -0
- warp/fem/adaptivity.py +508 -0
- warp/fem/cache.py +572 -0
- warp/fem/dirichlet.py +202 -0
- warp/fem/domain.py +411 -0
- warp/fem/field/__init__.py +125 -0
- warp/fem/field/field.py +619 -0
- warp/fem/field/nodal_field.py +326 -0
- warp/fem/field/restriction.py +37 -0
- warp/fem/field/virtual.py +848 -0
- warp/fem/geometry/__init__.py +32 -0
- warp/fem/geometry/adaptive_nanogrid.py +857 -0
- warp/fem/geometry/closest_point.py +84 -0
- warp/fem/geometry/deformed_geometry.py +221 -0
- warp/fem/geometry/element.py +776 -0
- warp/fem/geometry/geometry.py +362 -0
- warp/fem/geometry/grid_2d.py +392 -0
- warp/fem/geometry/grid_3d.py +452 -0
- warp/fem/geometry/hexmesh.py +911 -0
- warp/fem/geometry/nanogrid.py +571 -0
- warp/fem/geometry/partition.py +389 -0
- warp/fem/geometry/quadmesh.py +663 -0
- warp/fem/geometry/tetmesh.py +855 -0
- warp/fem/geometry/trimesh.py +806 -0
- warp/fem/integrate.py +2335 -0
- warp/fem/linalg.py +419 -0
- warp/fem/operator.py +293 -0
- warp/fem/polynomial.py +229 -0
- warp/fem/quadrature/__init__.py +17 -0
- warp/fem/quadrature/pic_quadrature.py +299 -0
- warp/fem/quadrature/quadrature.py +591 -0
- warp/fem/space/__init__.py +228 -0
- warp/fem/space/basis_function_space.py +468 -0
- warp/fem/space/basis_space.py +667 -0
- warp/fem/space/dof_mapper.py +251 -0
- warp/fem/space/function_space.py +309 -0
- warp/fem/space/grid_2d_function_space.py +177 -0
- warp/fem/space/grid_3d_function_space.py +227 -0
- warp/fem/space/hexmesh_function_space.py +257 -0
- warp/fem/space/nanogrid_function_space.py +201 -0
- warp/fem/space/partition.py +367 -0
- warp/fem/space/quadmesh_function_space.py +223 -0
- warp/fem/space/restriction.py +179 -0
- warp/fem/space/shape/__init__.py +143 -0
- warp/fem/space/shape/cube_shape_function.py +1105 -0
- warp/fem/space/shape/shape_function.py +133 -0
- warp/fem/space/shape/square_shape_function.py +926 -0
- warp/fem/space/shape/tet_shape_function.py +834 -0
- warp/fem/space/shape/triangle_shape_function.py +672 -0
- warp/fem/space/tetmesh_function_space.py +271 -0
- warp/fem/space/topology.py +424 -0
- warp/fem/space/trimesh_function_space.py +194 -0
- warp/fem/types.py +99 -0
- warp/fem/utils.py +420 -0
- warp/jax.py +187 -0
- warp/jax_experimental/__init__.py +16 -0
- warp/jax_experimental/custom_call.py +351 -0
- warp/jax_experimental/ffi.py +698 -0
- warp/jax_experimental/xla_ffi.py +602 -0
- warp/math.py +244 -0
- warp/native/array.h +1145 -0
- warp/native/builtin.h +1800 -0
- warp/native/bvh.cpp +492 -0
- warp/native/bvh.cu +791 -0
- warp/native/bvh.h +554 -0
- warp/native/clang/clang.cpp +536 -0
- warp/native/coloring.cpp +613 -0
- warp/native/crt.cpp +51 -0
- warp/native/crt.h +362 -0
- warp/native/cuda_crt.h +1058 -0
- warp/native/cuda_util.cpp +646 -0
- warp/native/cuda_util.h +307 -0
- warp/native/error.cpp +77 -0
- warp/native/error.h +36 -0
- warp/native/exports.h +1878 -0
- warp/native/fabric.h +245 -0
- warp/native/hashgrid.cpp +311 -0
- warp/native/hashgrid.cu +87 -0
- warp/native/hashgrid.h +240 -0
- warp/native/initializer_array.h +41 -0
- warp/native/intersect.h +1230 -0
- warp/native/intersect_adj.h +375 -0
- warp/native/intersect_tri.h +339 -0
- warp/native/marching.cpp +19 -0
- warp/native/marching.cu +514 -0
- warp/native/marching.h +19 -0
- warp/native/mat.h +2220 -0
- warp/native/mathdx.cpp +87 -0
- warp/native/matnn.h +343 -0
- warp/native/mesh.cpp +266 -0
- warp/native/mesh.cu +404 -0
- warp/native/mesh.h +1980 -0
- warp/native/nanovdb/GridHandle.h +366 -0
- warp/native/nanovdb/HostBuffer.h +590 -0
- warp/native/nanovdb/NanoVDB.h +6624 -0
- warp/native/nanovdb/PNanoVDB.h +3390 -0
- warp/native/noise.h +859 -0
- warp/native/quat.h +1371 -0
- warp/native/rand.h +342 -0
- warp/native/range.h +139 -0
- warp/native/reduce.cpp +174 -0
- warp/native/reduce.cu +364 -0
- warp/native/runlength_encode.cpp +79 -0
- warp/native/runlength_encode.cu +61 -0
- warp/native/scan.cpp +47 -0
- warp/native/scan.cu +53 -0
- warp/native/scan.h +23 -0
- warp/native/solid_angle.h +466 -0
- warp/native/sort.cpp +251 -0
- warp/native/sort.cu +277 -0
- warp/native/sort.h +33 -0
- warp/native/sparse.cpp +378 -0
- warp/native/sparse.cu +524 -0
- warp/native/spatial.h +657 -0
- warp/native/svd.h +702 -0
- warp/native/temp_buffer.h +46 -0
- warp/native/tile.h +2584 -0
- warp/native/tile_reduce.h +264 -0
- warp/native/vec.h +1426 -0
- warp/native/volume.cpp +501 -0
- warp/native/volume.cu +67 -0
- warp/native/volume.h +969 -0
- warp/native/volume_builder.cu +477 -0
- warp/native/volume_builder.h +52 -0
- warp/native/volume_impl.h +70 -0
- warp/native/warp.cpp +1082 -0
- warp/native/warp.cu +3636 -0
- warp/native/warp.h +381 -0
- warp/optim/__init__.py +17 -0
- warp/optim/adam.py +163 -0
- warp/optim/linear.py +1137 -0
- warp/optim/sgd.py +112 -0
- warp/paddle.py +407 -0
- warp/render/__init__.py +18 -0
- warp/render/render_opengl.py +3518 -0
- warp/render/render_usd.py +784 -0
- warp/render/utils.py +160 -0
- warp/sim/__init__.py +65 -0
- warp/sim/articulation.py +793 -0
- warp/sim/collide.py +2395 -0
- warp/sim/graph_coloring.py +300 -0
- warp/sim/import_mjcf.py +790 -0
- warp/sim/import_snu.py +227 -0
- warp/sim/import_urdf.py +579 -0
- warp/sim/import_usd.py +894 -0
- warp/sim/inertia.py +324 -0
- warp/sim/integrator.py +242 -0
- warp/sim/integrator_euler.py +1997 -0
- warp/sim/integrator_featherstone.py +2101 -0
- warp/sim/integrator_vbd.py +2048 -0
- warp/sim/integrator_xpbd.py +3292 -0
- warp/sim/model.py +4791 -0
- warp/sim/particles.py +121 -0
- warp/sim/render.py +427 -0
- warp/sim/utils.py +428 -0
- warp/sparse.py +2057 -0
- warp/stubs.py +3333 -0
- warp/tape.py +1203 -0
- warp/tests/__init__.py +1 -0
- warp/tests/__main__.py +4 -0
- warp/tests/assets/curlnoise_golden.npy +0 -0
- warp/tests/assets/mlp_golden.npy +0 -0
- warp/tests/assets/pixel.npy +0 -0
- warp/tests/assets/pnoise_golden.npy +0 -0
- warp/tests/assets/spiky.usd +0 -0
- warp/tests/assets/test_grid.nvdb +0 -0
- warp/tests/assets/test_index_grid.nvdb +0 -0
- warp/tests/assets/test_int32_grid.nvdb +0 -0
- warp/tests/assets/test_vec_grid.nvdb +0 -0
- warp/tests/assets/torus.nvdb +0 -0
- warp/tests/assets/torus.usda +105 -0
- warp/tests/aux_test_class_kernel.py +34 -0
- warp/tests/aux_test_compile_consts_dummy.py +18 -0
- warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
- warp/tests/aux_test_dependent.py +29 -0
- warp/tests/aux_test_grad_customs.py +29 -0
- warp/tests/aux_test_instancing_gc.py +26 -0
- warp/tests/aux_test_module_unload.py +23 -0
- warp/tests/aux_test_name_clash1.py +40 -0
- warp/tests/aux_test_name_clash2.py +40 -0
- warp/tests/aux_test_reference.py +9 -0
- warp/tests/aux_test_reference_reference.py +8 -0
- warp/tests/aux_test_square.py +16 -0
- warp/tests/aux_test_unresolved_func.py +22 -0
- warp/tests/aux_test_unresolved_symbol.py +22 -0
- warp/tests/cuda/__init__.py +0 -0
- warp/tests/cuda/test_async.py +676 -0
- warp/tests/cuda/test_ipc.py +124 -0
- warp/tests/cuda/test_mempool.py +233 -0
- warp/tests/cuda/test_multigpu.py +169 -0
- warp/tests/cuda/test_peer.py +139 -0
- warp/tests/cuda/test_pinned.py +84 -0
- warp/tests/cuda/test_streams.py +634 -0
- warp/tests/geometry/__init__.py +0 -0
- warp/tests/geometry/test_bvh.py +200 -0
- warp/tests/geometry/test_hash_grid.py +221 -0
- warp/tests/geometry/test_marching_cubes.py +74 -0
- warp/tests/geometry/test_mesh.py +316 -0
- warp/tests/geometry/test_mesh_query_aabb.py +399 -0
- warp/tests/geometry/test_mesh_query_point.py +932 -0
- warp/tests/geometry/test_mesh_query_ray.py +311 -0
- warp/tests/geometry/test_volume.py +1103 -0
- warp/tests/geometry/test_volume_write.py +346 -0
- warp/tests/interop/__init__.py +0 -0
- warp/tests/interop/test_dlpack.py +729 -0
- warp/tests/interop/test_jax.py +371 -0
- warp/tests/interop/test_paddle.py +800 -0
- warp/tests/interop/test_torch.py +1001 -0
- warp/tests/run_coverage_serial.py +39 -0
- warp/tests/sim/__init__.py +0 -0
- warp/tests/sim/disabled_kinematics.py +244 -0
- warp/tests/sim/flaky_test_sim_grad.py +290 -0
- warp/tests/sim/test_collision.py +604 -0
- warp/tests/sim/test_coloring.py +258 -0
- warp/tests/sim/test_model.py +224 -0
- warp/tests/sim/test_sim_grad_bounce_linear.py +212 -0
- warp/tests/sim/test_sim_kinematics.py +98 -0
- warp/tests/sim/test_vbd.py +597 -0
- warp/tests/test_adam.py +163 -0
- warp/tests/test_arithmetic.py +1096 -0
- warp/tests/test_array.py +2972 -0
- warp/tests/test_array_reduce.py +156 -0
- warp/tests/test_assert.py +250 -0
- warp/tests/test_atomic.py +153 -0
- warp/tests/test_bool.py +220 -0
- warp/tests/test_builtins_resolution.py +1298 -0
- warp/tests/test_closest_point_edge_edge.py +327 -0
- warp/tests/test_codegen.py +810 -0
- warp/tests/test_codegen_instancing.py +1495 -0
- warp/tests/test_compile_consts.py +215 -0
- warp/tests/test_conditional.py +252 -0
- warp/tests/test_context.py +42 -0
- warp/tests/test_copy.py +238 -0
- warp/tests/test_ctypes.py +638 -0
- warp/tests/test_dense.py +73 -0
- warp/tests/test_devices.py +97 -0
- warp/tests/test_examples.py +482 -0
- warp/tests/test_fabricarray.py +996 -0
- warp/tests/test_fast_math.py +74 -0
- warp/tests/test_fem.py +2003 -0
- warp/tests/test_fp16.py +136 -0
- warp/tests/test_func.py +454 -0
- warp/tests/test_future_annotations.py +98 -0
- warp/tests/test_generics.py +656 -0
- warp/tests/test_grad.py +893 -0
- warp/tests/test_grad_customs.py +339 -0
- warp/tests/test_grad_debug.py +341 -0
- warp/tests/test_implicit_init.py +411 -0
- warp/tests/test_import.py +45 -0
- warp/tests/test_indexedarray.py +1140 -0
- warp/tests/test_intersect.py +73 -0
- warp/tests/test_iter.py +76 -0
- warp/tests/test_large.py +177 -0
- warp/tests/test_launch.py +411 -0
- warp/tests/test_lerp.py +151 -0
- warp/tests/test_linear_solvers.py +193 -0
- warp/tests/test_lvalue.py +427 -0
- warp/tests/test_mat.py +2089 -0
- warp/tests/test_mat_lite.py +122 -0
- warp/tests/test_mat_scalar_ops.py +2913 -0
- warp/tests/test_math.py +178 -0
- warp/tests/test_mlp.py +282 -0
- warp/tests/test_module_hashing.py +258 -0
- warp/tests/test_modules_lite.py +44 -0
- warp/tests/test_noise.py +252 -0
- warp/tests/test_operators.py +299 -0
- warp/tests/test_options.py +129 -0
- warp/tests/test_overwrite.py +551 -0
- warp/tests/test_print.py +339 -0
- warp/tests/test_quat.py +2315 -0
- warp/tests/test_rand.py +339 -0
- warp/tests/test_reload.py +302 -0
- warp/tests/test_rounding.py +185 -0
- warp/tests/test_runlength_encode.py +196 -0
- warp/tests/test_scalar_ops.py +105 -0
- warp/tests/test_smoothstep.py +108 -0
- warp/tests/test_snippet.py +318 -0
- warp/tests/test_sparse.py +582 -0
- warp/tests/test_spatial.py +2229 -0
- warp/tests/test_special_values.py +361 -0
- warp/tests/test_static.py +592 -0
- warp/tests/test_struct.py +734 -0
- warp/tests/test_tape.py +204 -0
- warp/tests/test_transient_module.py +93 -0
- warp/tests/test_triangle_closest_point.py +145 -0
- warp/tests/test_types.py +562 -0
- warp/tests/test_utils.py +588 -0
- warp/tests/test_vec.py +1487 -0
- warp/tests/test_vec_lite.py +80 -0
- warp/tests/test_vec_scalar_ops.py +2327 -0
- warp/tests/test_verify_fp.py +100 -0
- warp/tests/tile/__init__.py +0 -0
- warp/tests/tile/test_tile.py +780 -0
- warp/tests/tile/test_tile_load.py +407 -0
- warp/tests/tile/test_tile_mathdx.py +208 -0
- warp/tests/tile/test_tile_mlp.py +402 -0
- warp/tests/tile/test_tile_reduce.py +447 -0
- warp/tests/tile/test_tile_shared_memory.py +247 -0
- warp/tests/tile/test_tile_view.py +173 -0
- warp/tests/unittest_serial.py +47 -0
- warp/tests/unittest_suites.py +427 -0
- warp/tests/unittest_utils.py +468 -0
- warp/tests/walkthrough_debug.py +93 -0
- warp/thirdparty/__init__.py +0 -0
- warp/thirdparty/appdirs.py +598 -0
- warp/thirdparty/dlpack.py +145 -0
- warp/thirdparty/unittest_parallel.py +570 -0
- warp/torch.py +391 -0
- warp/types.py +5230 -0
- warp/utils.py +1137 -0
- warp_lang-1.7.0.dist-info/METADATA +516 -0
- warp_lang-1.7.0.dist-info/RECORD +429 -0
- warp_lang-1.7.0.dist-info/WHEEL +5 -0
- warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
- warp_lang-1.7.0.dist-info/top_level.txt +1 -0
warp/tests/test_tape.py
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
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
|
+
import unittest
|
|
17
|
+
|
|
18
|
+
import numpy as np
|
|
19
|
+
|
|
20
|
+
import warp as wp
|
|
21
|
+
from warp.tests.unittest_utils import *
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@wp.kernel
|
|
25
|
+
def mul_constant(x: wp.array(dtype=float), y: wp.array(dtype=float)):
|
|
26
|
+
tid = wp.tid()
|
|
27
|
+
|
|
28
|
+
y[tid] = x[tid] * 2.0
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@wp.struct
|
|
32
|
+
class Multiplicands:
|
|
33
|
+
x: wp.array(dtype=float)
|
|
34
|
+
y: wp.array(dtype=float)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@wp.kernel
|
|
38
|
+
def mul_variable(mutiplicands: Multiplicands, z: wp.array(dtype=float)):
|
|
39
|
+
tid = wp.tid()
|
|
40
|
+
|
|
41
|
+
z[tid] = mutiplicands.x[tid] * mutiplicands.y[tid]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@wp.kernel
|
|
45
|
+
def dot_product(x: wp.array(dtype=float), y: wp.array(dtype=float), z: wp.array(dtype=float)):
|
|
46
|
+
tid = wp.tid()
|
|
47
|
+
|
|
48
|
+
wp.atomic_add(z, 0, x[tid] * y[tid])
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_tape_mul_constant(test, device):
|
|
52
|
+
dim = 8
|
|
53
|
+
iters = 16
|
|
54
|
+
tape = wp.Tape()
|
|
55
|
+
|
|
56
|
+
# record onto tape
|
|
57
|
+
with tape:
|
|
58
|
+
# input data
|
|
59
|
+
x0 = wp.array(np.zeros(dim), dtype=wp.float32, device=device, requires_grad=True)
|
|
60
|
+
x = x0
|
|
61
|
+
|
|
62
|
+
for _i in range(iters):
|
|
63
|
+
y = wp.empty_like(x, requires_grad=True)
|
|
64
|
+
wp.launch(kernel=mul_constant, dim=dim, inputs=[x], outputs=[y], device=device)
|
|
65
|
+
x = y
|
|
66
|
+
|
|
67
|
+
# loss = wp.sum(x)
|
|
68
|
+
x.grad = wp.array(np.ones(dim), device=device, dtype=wp.float32)
|
|
69
|
+
|
|
70
|
+
# run backward
|
|
71
|
+
tape.backward()
|
|
72
|
+
|
|
73
|
+
# grad = 2.0^iters
|
|
74
|
+
assert_np_equal(tape.gradients[x0].numpy(), np.ones(dim) * (2**iters))
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def test_tape_mul_variable(test, device):
|
|
78
|
+
dim = 8
|
|
79
|
+
tape = wp.Tape()
|
|
80
|
+
|
|
81
|
+
# record onto tape
|
|
82
|
+
with tape:
|
|
83
|
+
# input data (Note: We're intentionally testing structs in tapes here)
|
|
84
|
+
multiplicands = Multiplicands()
|
|
85
|
+
multiplicands.x = wp.array(np.ones(dim) * 16.0, dtype=wp.float32, device=device, requires_grad=True)
|
|
86
|
+
multiplicands.y = wp.array(np.ones(dim) * 32.0, dtype=wp.float32, device=device, requires_grad=True)
|
|
87
|
+
z = wp.zeros_like(multiplicands.x)
|
|
88
|
+
|
|
89
|
+
wp.launch(kernel=mul_variable, dim=dim, inputs=[multiplicands], outputs=[z], device=device)
|
|
90
|
+
|
|
91
|
+
# loss = wp.sum(x)
|
|
92
|
+
z.grad = wp.array(np.ones(dim), device=device, dtype=wp.float32)
|
|
93
|
+
|
|
94
|
+
# run backward
|
|
95
|
+
tape.backward()
|
|
96
|
+
|
|
97
|
+
# grad_x=y, grad_y=x
|
|
98
|
+
assert_np_equal(tape.gradients[multiplicands].x.numpy(), multiplicands.y.numpy())
|
|
99
|
+
assert_np_equal(tape.gradients[multiplicands].y.numpy(), multiplicands.x.numpy())
|
|
100
|
+
|
|
101
|
+
# run backward again with different incoming gradient
|
|
102
|
+
# should accumulate the same gradients again onto output
|
|
103
|
+
# so gradients = 2.0*prev
|
|
104
|
+
tape.backward()
|
|
105
|
+
|
|
106
|
+
assert_np_equal(tape.gradients[multiplicands].x.numpy(), multiplicands.y.numpy() * 2.0)
|
|
107
|
+
assert_np_equal(tape.gradients[multiplicands].y.numpy(), multiplicands.x.numpy() * 2.0)
|
|
108
|
+
|
|
109
|
+
# Clear launches and zero out the gradients
|
|
110
|
+
tape.reset()
|
|
111
|
+
assert_np_equal(tape.gradients[multiplicands].x.numpy(), np.zeros_like(tape.gradients[multiplicands].x.numpy()))
|
|
112
|
+
test.assertFalse(tape.launches)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def test_tape_dot_product(test, device):
|
|
116
|
+
dim = 8
|
|
117
|
+
tape = wp.Tape()
|
|
118
|
+
|
|
119
|
+
# record onto tape
|
|
120
|
+
with tape:
|
|
121
|
+
# input data
|
|
122
|
+
x = wp.array(np.ones(dim) * 16.0, dtype=wp.float32, device=device, requires_grad=True)
|
|
123
|
+
y = wp.array(np.ones(dim) * 32.0, dtype=wp.float32, device=device, requires_grad=True)
|
|
124
|
+
z = wp.zeros(n=1, dtype=wp.float32, device=device, requires_grad=True)
|
|
125
|
+
|
|
126
|
+
wp.launch(kernel=dot_product, dim=dim, inputs=[x, y], outputs=[z], device=device)
|
|
127
|
+
|
|
128
|
+
# scalar loss
|
|
129
|
+
tape.backward(loss=z)
|
|
130
|
+
|
|
131
|
+
# grad_x=y, grad_y=x
|
|
132
|
+
assert_np_equal(tape.gradients[x].numpy(), y.numpy())
|
|
133
|
+
assert_np_equal(tape.gradients[y].numpy(), x.numpy())
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
@wp.kernel
|
|
137
|
+
def assign_chain_kernel(x: wp.array(dtype=float), y: wp.array(dtype=float), z: wp.array(dtype=float)):
|
|
138
|
+
tid = wp.tid()
|
|
139
|
+
y[tid] = x[tid]
|
|
140
|
+
z[tid] = y[tid]
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def test_tape_zero_multiple_outputs(test, device):
|
|
144
|
+
x = wp.array(np.arange(3), dtype=float, device=device, requires_grad=True)
|
|
145
|
+
y = wp.zeros_like(x)
|
|
146
|
+
z = wp.zeros_like(x)
|
|
147
|
+
|
|
148
|
+
tape = wp.Tape()
|
|
149
|
+
with tape:
|
|
150
|
+
wp.launch(assign_chain_kernel, dim=3, inputs=[x, y, z], device=device)
|
|
151
|
+
|
|
152
|
+
tape.backward(grads={y: wp.ones_like(x)})
|
|
153
|
+
assert_np_equal(x.grad.numpy(), np.ones(3, dtype=float))
|
|
154
|
+
tape.zero()
|
|
155
|
+
|
|
156
|
+
tape.backward(grads={z: wp.ones_like(x)})
|
|
157
|
+
assert_np_equal(x.grad.numpy(), np.ones(3, dtype=float))
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def test_tape_visualize(test, device):
|
|
161
|
+
dim = 8
|
|
162
|
+
tape = wp.Tape()
|
|
163
|
+
|
|
164
|
+
# record onto tape
|
|
165
|
+
with tape:
|
|
166
|
+
# input data
|
|
167
|
+
x = wp.array(np.ones(dim) * 16.0, dtype=wp.float32, device=device, requires_grad=True)
|
|
168
|
+
y = wp.array(np.ones(dim) * 32.0, dtype=wp.float32, device=device, requires_grad=True)
|
|
169
|
+
z = wp.zeros(n=1, dtype=wp.float32, device=device, requires_grad=True)
|
|
170
|
+
|
|
171
|
+
tape.record_scope_begin("my loop")
|
|
172
|
+
for _ in range(16):
|
|
173
|
+
wp.launch(kernel=dot_product, dim=dim, inputs=[x, y], outputs=[z], device=device)
|
|
174
|
+
tape.record_scope_end()
|
|
175
|
+
|
|
176
|
+
# generate GraphViz diagram code
|
|
177
|
+
dot_code = tape.visualize(simplify_graph=True)
|
|
178
|
+
|
|
179
|
+
assert "repeated 16x" in dot_code
|
|
180
|
+
assert "my loop" in dot_code
|
|
181
|
+
assert dot_code.count("dot_product") == 1
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
devices = get_test_devices()
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class TestTape(unittest.TestCase):
|
|
188
|
+
def test_tape_no_nested_tapes(self):
|
|
189
|
+
with self.assertRaises(RuntimeError):
|
|
190
|
+
with wp.Tape():
|
|
191
|
+
with wp.Tape():
|
|
192
|
+
pass
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
add_function_test(TestTape, "test_tape_mul_constant", test_tape_mul_constant, devices=devices)
|
|
196
|
+
add_function_test(TestTape, "test_tape_mul_variable", test_tape_mul_variable, devices=devices)
|
|
197
|
+
add_function_test(TestTape, "test_tape_dot_product", test_tape_dot_product, devices=devices)
|
|
198
|
+
add_function_test(TestTape, "test_tape_zero_multiple_outputs", test_tape_zero_multiple_outputs, devices=devices)
|
|
199
|
+
add_function_test(TestTape, "test_tape_visualize", test_tape_visualize, devices=devices)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
if __name__ == "__main__":
|
|
203
|
+
wp.clear_kernel_cache()
|
|
204
|
+
unittest.main(verbosity=2)
|
|
@@ -0,0 +1,93 @@
|
|
|
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
|
+
import os
|
|
17
|
+
import tempfile
|
|
18
|
+
import unittest
|
|
19
|
+
from importlib import util
|
|
20
|
+
|
|
21
|
+
import warp as wp
|
|
22
|
+
from warp.tests.unittest_utils import *
|
|
23
|
+
|
|
24
|
+
CODE = """# -*- coding: utf-8 -*-
|
|
25
|
+
|
|
26
|
+
import warp as wp
|
|
27
|
+
|
|
28
|
+
@wp.struct
|
|
29
|
+
class Data:
|
|
30
|
+
x: wp.array(dtype=int)
|
|
31
|
+
|
|
32
|
+
@wp.func
|
|
33
|
+
def increment(x: int):
|
|
34
|
+
# This shouldn't be picked up.
|
|
35
|
+
return x + 123
|
|
36
|
+
|
|
37
|
+
@wp.func
|
|
38
|
+
def increment(x: int):
|
|
39
|
+
return x + 1
|
|
40
|
+
|
|
41
|
+
@wp.kernel
|
|
42
|
+
def compute(data: Data):
|
|
43
|
+
data.x[0] = increment(data.x[0])
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def load_code_as_module(code, name):
|
|
48
|
+
file, file_path = tempfile.mkstemp(suffix=".py")
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
with os.fdopen(file, "w") as f:
|
|
52
|
+
f.write(code)
|
|
53
|
+
|
|
54
|
+
spec = util.spec_from_file_location(name, file_path)
|
|
55
|
+
module = util.module_from_spec(spec)
|
|
56
|
+
spec.loader.exec_module(module)
|
|
57
|
+
finally:
|
|
58
|
+
os.remove(file_path)
|
|
59
|
+
|
|
60
|
+
return module
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_transient_module(test, device):
|
|
64
|
+
module = load_code_as_module(CODE, "")
|
|
65
|
+
# Loading it a second time shouldn't be an issue.
|
|
66
|
+
module = load_code_as_module(CODE, "")
|
|
67
|
+
|
|
68
|
+
assert len(module.compute.module.structs) == 1
|
|
69
|
+
assert len(module.compute.module.functions) == 1
|
|
70
|
+
|
|
71
|
+
data = module.Data()
|
|
72
|
+
data.x = wp.array([123], dtype=int, device=device)
|
|
73
|
+
|
|
74
|
+
wp.set_module_options({"foo": "bar"}, module=module)
|
|
75
|
+
assert wp.get_module_options(module=module).get("foo") == "bar"
|
|
76
|
+
assert module.compute.module.options.get("foo") == "bar"
|
|
77
|
+
|
|
78
|
+
wp.launch(module.compute, dim=1, inputs=[data], device=device)
|
|
79
|
+
assert_np_equal(data.x.numpy(), np.array([124]))
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
devices = get_test_devices()
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class TestTransientModule(unittest.TestCase):
|
|
86
|
+
pass
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
add_function_test(TestTransientModule, "test_transient_module", test_transient_module, devices=devices)
|
|
90
|
+
|
|
91
|
+
if __name__ == "__main__":
|
|
92
|
+
wp.clear_kernel_cache()
|
|
93
|
+
unittest.main(verbosity=2)
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
import unittest
|
|
17
|
+
|
|
18
|
+
from warp.sim.collide import triangle_closest_point_barycentric
|
|
19
|
+
from warp.tests.unittest_utils import *
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# a-b is the edge where the closest point is located at
|
|
23
|
+
@wp.func
|
|
24
|
+
def check_edge_feasible_region(p: wp.vec3, a: wp.vec3, b: wp.vec3, c: wp.vec3, eps: float):
|
|
25
|
+
ap = p - a
|
|
26
|
+
bp = p - b
|
|
27
|
+
ab = b - a
|
|
28
|
+
|
|
29
|
+
if wp.dot(ap, ab) < -eps:
|
|
30
|
+
return False
|
|
31
|
+
|
|
32
|
+
if wp.dot(bp, ab) > eps:
|
|
33
|
+
return False
|
|
34
|
+
|
|
35
|
+
ab_sqr_norm = wp.dot(ab, ab)
|
|
36
|
+
if ab_sqr_norm < eps:
|
|
37
|
+
return False
|
|
38
|
+
|
|
39
|
+
t = wp.dot(ab, c - a) / ab_sqr_norm
|
|
40
|
+
|
|
41
|
+
perpendicular_foot = a + t * ab
|
|
42
|
+
|
|
43
|
+
if wp.dot(c - perpendicular_foot, p - perpendicular_foot) > eps:
|
|
44
|
+
return False
|
|
45
|
+
|
|
46
|
+
return True
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# closest point is a
|
|
50
|
+
@wp.func
|
|
51
|
+
def check_vertex_feasible_region(p: wp.vec3, a: wp.vec3, b: wp.vec3, c: wp.vec3, eps: float):
|
|
52
|
+
ap = p - a
|
|
53
|
+
ba = a - b
|
|
54
|
+
ca = a - c
|
|
55
|
+
|
|
56
|
+
if wp.dot(ap, ba) < -eps:
|
|
57
|
+
return False
|
|
58
|
+
|
|
59
|
+
if wp.dot(p, ca) < -eps:
|
|
60
|
+
return False
|
|
61
|
+
|
|
62
|
+
return True
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@wp.kernel
|
|
66
|
+
def test_triangle_closest_point_kernel(tri: wp.array(dtype=wp.vec3), passed: wp.array(dtype=wp.bool)):
|
|
67
|
+
state = wp.uint32(wp.rand_init(wp.int32(123), wp.int32(0)))
|
|
68
|
+
eps = 1e-5
|
|
69
|
+
|
|
70
|
+
a = tri[0]
|
|
71
|
+
b = tri[1]
|
|
72
|
+
c = tri[2]
|
|
73
|
+
|
|
74
|
+
for _i in range(1000):
|
|
75
|
+
l = wp.float32(0.0)
|
|
76
|
+
while l < eps:
|
|
77
|
+
p = wp.vec3(wp.randn(state), wp.randn(state), wp.randn(state))
|
|
78
|
+
l = wp.length(p)
|
|
79
|
+
|
|
80
|
+
# project to a sphere with r=2
|
|
81
|
+
p = 2.0 * p / l
|
|
82
|
+
|
|
83
|
+
bary = triangle_closest_point_barycentric(tri[0], tri[1], tri[2], p)
|
|
84
|
+
|
|
85
|
+
for dim in range(3):
|
|
86
|
+
v1_index = (dim + 1) % 3
|
|
87
|
+
v2_index = (dim + 2) % 3
|
|
88
|
+
v1 = tri[v1_index]
|
|
89
|
+
v2 = tri[v2_index]
|
|
90
|
+
v3 = tri[dim]
|
|
91
|
+
|
|
92
|
+
# on edge
|
|
93
|
+
if bary[dim] == 0.0 and bary[v1_index] != 0.0 and bary[v2_index] != 0.0:
|
|
94
|
+
if not check_edge_feasible_region(p, v1, v2, v3, eps):
|
|
95
|
+
passed[0] = False
|
|
96
|
+
return
|
|
97
|
+
|
|
98
|
+
# p-closest_p must be perpendicular to v1-v2
|
|
99
|
+
closest_p = a * bary[0] + b * bary[1] + c * bary[2]
|
|
100
|
+
e = v1 - v2
|
|
101
|
+
err = wp.dot(e, closest_p - p)
|
|
102
|
+
if wp.abs(err) > eps:
|
|
103
|
+
passed[0] = False
|
|
104
|
+
return
|
|
105
|
+
|
|
106
|
+
if bary[v1_index] == 0.0 and bary[v2_index] == 0.0:
|
|
107
|
+
if not check_vertex_feasible_region(p, v3, v1, v2, eps):
|
|
108
|
+
passed[0] = False
|
|
109
|
+
return
|
|
110
|
+
|
|
111
|
+
if bary[dim] != 0.0 and bary[v1_index] != 0.0 and bary[v2_index] != 0.0:
|
|
112
|
+
closest_p = a * bary[0] + b * bary[1] + c * bary[2]
|
|
113
|
+
e1 = v1 - v2
|
|
114
|
+
e2 = v1 - v3
|
|
115
|
+
if wp.abs(wp.dot(e1, closest_p - p)) > eps or wp.abs(wp.dot(e2, closest_p - p)) > eps:
|
|
116
|
+
passed[0] = False
|
|
117
|
+
return
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def test_triangle_closest_point(test, device):
|
|
121
|
+
passed = wp.array([True], dtype=wp.bool, device=device)
|
|
122
|
+
|
|
123
|
+
a = wp.vec3(1.0, 0.0, 0.0)
|
|
124
|
+
b = wp.vec3(0.0, 0.0, 0.0)
|
|
125
|
+
c = wp.vec3(0.0, 1.0, 0.0)
|
|
126
|
+
|
|
127
|
+
tri = wp.array([a, b, c], dtype=wp.vec3, device=device)
|
|
128
|
+
wp.launch(test_triangle_closest_point_kernel, dim=1, inputs=[tri, passed], device=device)
|
|
129
|
+
passed = passed.numpy()
|
|
130
|
+
|
|
131
|
+
test.assertTrue(passed.all())
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
devices = get_test_devices()
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class TestTriangleClosestPoint(unittest.TestCase):
|
|
138
|
+
pass
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
add_function_test(TestTriangleClosestPoint, "test_triangle_closest_point", test_triangle_closest_point, devices=devices)
|
|
142
|
+
|
|
143
|
+
if __name__ == "__main__":
|
|
144
|
+
wp.clear_kernel_cache()
|
|
145
|
+
unittest.main(verbosity=2)
|