warp-lang 1.10.0__py3-none-macosx_11_0_arm64.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 +334 -0
- warp/__init__.pyi +5856 -0
- warp/_src/__init__.py +14 -0
- warp/_src/autograd.py +1077 -0
- warp/_src/build.py +620 -0
- warp/_src/build_dll.py +642 -0
- warp/_src/builtins.py +10555 -0
- warp/_src/codegen.py +4361 -0
- warp/_src/config.py +178 -0
- warp/_src/constants.py +59 -0
- warp/_src/context.py +8352 -0
- warp/_src/dlpack.py +464 -0
- warp/_src/fabric.py +362 -0
- warp/_src/fem/__init__.py +14 -0
- warp/_src/fem/adaptivity.py +510 -0
- warp/_src/fem/cache.py +689 -0
- warp/_src/fem/dirichlet.py +190 -0
- warp/_src/fem/domain.py +553 -0
- warp/_src/fem/field/__init__.py +131 -0
- warp/_src/fem/field/field.py +703 -0
- warp/_src/fem/field/nodal_field.py +403 -0
- warp/_src/fem/field/restriction.py +39 -0
- warp/_src/fem/field/virtual.py +1021 -0
- warp/_src/fem/geometry/__init__.py +32 -0
- warp/_src/fem/geometry/adaptive_nanogrid.py +782 -0
- warp/_src/fem/geometry/closest_point.py +99 -0
- warp/_src/fem/geometry/deformed_geometry.py +277 -0
- warp/_src/fem/geometry/element.py +854 -0
- warp/_src/fem/geometry/geometry.py +693 -0
- warp/_src/fem/geometry/grid_2d.py +478 -0
- warp/_src/fem/geometry/grid_3d.py +539 -0
- warp/_src/fem/geometry/hexmesh.py +956 -0
- warp/_src/fem/geometry/nanogrid.py +660 -0
- warp/_src/fem/geometry/partition.py +483 -0
- warp/_src/fem/geometry/quadmesh.py +597 -0
- warp/_src/fem/geometry/tetmesh.py +762 -0
- warp/_src/fem/geometry/trimesh.py +588 -0
- warp/_src/fem/integrate.py +2507 -0
- warp/_src/fem/linalg.py +385 -0
- warp/_src/fem/operator.py +398 -0
- warp/_src/fem/polynomial.py +231 -0
- warp/_src/fem/quadrature/__init__.py +17 -0
- warp/_src/fem/quadrature/pic_quadrature.py +318 -0
- warp/_src/fem/quadrature/quadrature.py +665 -0
- warp/_src/fem/space/__init__.py +248 -0
- warp/_src/fem/space/basis_function_space.py +499 -0
- warp/_src/fem/space/basis_space.py +681 -0
- warp/_src/fem/space/dof_mapper.py +253 -0
- warp/_src/fem/space/function_space.py +312 -0
- warp/_src/fem/space/grid_2d_function_space.py +179 -0
- warp/_src/fem/space/grid_3d_function_space.py +229 -0
- warp/_src/fem/space/hexmesh_function_space.py +255 -0
- warp/_src/fem/space/nanogrid_function_space.py +199 -0
- warp/_src/fem/space/partition.py +435 -0
- warp/_src/fem/space/quadmesh_function_space.py +222 -0
- warp/_src/fem/space/restriction.py +221 -0
- warp/_src/fem/space/shape/__init__.py +152 -0
- warp/_src/fem/space/shape/cube_shape_function.py +1107 -0
- warp/_src/fem/space/shape/shape_function.py +134 -0
- warp/_src/fem/space/shape/square_shape_function.py +928 -0
- warp/_src/fem/space/shape/tet_shape_function.py +829 -0
- warp/_src/fem/space/shape/triangle_shape_function.py +674 -0
- warp/_src/fem/space/tetmesh_function_space.py +270 -0
- warp/_src/fem/space/topology.py +461 -0
- warp/_src/fem/space/trimesh_function_space.py +193 -0
- warp/_src/fem/types.py +114 -0
- warp/_src/fem/utils.py +488 -0
- warp/_src/jax.py +188 -0
- warp/_src/jax_experimental/__init__.py +14 -0
- warp/_src/jax_experimental/custom_call.py +389 -0
- warp/_src/jax_experimental/ffi.py +1286 -0
- warp/_src/jax_experimental/xla_ffi.py +658 -0
- warp/_src/marching_cubes.py +710 -0
- warp/_src/math.py +416 -0
- warp/_src/optim/__init__.py +14 -0
- warp/_src/optim/adam.py +165 -0
- warp/_src/optim/linear.py +1608 -0
- warp/_src/optim/sgd.py +114 -0
- warp/_src/paddle.py +408 -0
- warp/_src/render/__init__.py +14 -0
- warp/_src/render/imgui_manager.py +291 -0
- warp/_src/render/render_opengl.py +3638 -0
- warp/_src/render/render_usd.py +939 -0
- warp/_src/render/utils.py +162 -0
- warp/_src/sparse.py +2718 -0
- warp/_src/tape.py +1208 -0
- warp/_src/thirdparty/__init__.py +0 -0
- warp/_src/thirdparty/appdirs.py +598 -0
- warp/_src/thirdparty/dlpack.py +145 -0
- warp/_src/thirdparty/unittest_parallel.py +676 -0
- warp/_src/torch.py +393 -0
- warp/_src/types.py +5888 -0
- warp/_src/utils.py +1695 -0
- warp/autograd.py +33 -0
- warp/bin/libwarp-clang.dylib +0 -0
- warp/bin/libwarp.dylib +0 -0
- warp/build.py +29 -0
- warp/build_dll.py +24 -0
- warp/codegen.py +24 -0
- warp/constants.py +24 -0
- warp/context.py +33 -0
- warp/dlpack.py +24 -0
- warp/examples/__init__.py +24 -0
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nonuniform.usd +0 -0
- warp/examples/assets/nvidia_logo.png +0 -0
- warp/examples/assets/pixel.jpg +0 -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/benchmarks/benchmark_tile_sort.py +155 -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 +195 -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 +290 -0
- warp/examples/core/example_sample_mesh.py +300 -0
- warp/examples/core/example_sph.py +411 -0
- warp/examples/core/example_spin_lock.py +93 -0
- warp/examples/core/example_torch.py +211 -0
- warp/examples/core/example_wave.py +269 -0
- warp/examples/core/example_work_queue.py +118 -0
- warp/examples/distributed/example_jacobi_mpi.py +506 -0
- warp/examples/fem/example_adaptive_grid.py +286 -0
- warp/examples/fem/example_apic_fluid.py +469 -0
- warp/examples/fem/example_burgers.py +261 -0
- warp/examples/fem/example_convection_diffusion.py +181 -0
- warp/examples/fem/example_convection_diffusion_dg.py +225 -0
- warp/examples/fem/example_darcy_ls_optimization.py +489 -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 +225 -0
- warp/examples/fem/example_distortion_energy.py +228 -0
- warp/examples/fem/example_elastic_shape_optimization.py +387 -0
- warp/examples/fem/example_magnetostatics.py +242 -0
- warp/examples/fem/example_mixed_elasticity.py +293 -0
- warp/examples/fem/example_navier_stokes.py +263 -0
- warp/examples/fem/example_nonconforming_contact.py +300 -0
- warp/examples/fem/example_stokes.py +213 -0
- warp/examples/fem/example_stokes_transfer.py +262 -0
- warp/examples/fem/example_streamlines.py +357 -0
- warp/examples/fem/utils.py +1047 -0
- warp/examples/interop/example_jax_callable.py +146 -0
- warp/examples/interop/example_jax_ffi_callback.py +132 -0
- warp/examples/interop/example_jax_kernel.py +232 -0
- warp/examples/optim/example_diffray.py +561 -0
- warp/examples/optim/example_fluid_checkpoint.py +497 -0
- warp/examples/tile/example_tile_block_cholesky.py +502 -0
- warp/examples/tile/example_tile_cholesky.py +88 -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_mcgp.py +191 -0
- warp/examples/tile/example_tile_mlp.py +385 -0
- warp/examples/tile/example_tile_nbody.py +199 -0
- warp/fabric.py +24 -0
- warp/fem/__init__.py +173 -0
- warp/fem/adaptivity.py +26 -0
- warp/fem/cache.py +30 -0
- warp/fem/dirichlet.py +24 -0
- warp/fem/field/__init__.py +24 -0
- warp/fem/field/field.py +26 -0
- warp/fem/geometry/__init__.py +21 -0
- warp/fem/geometry/closest_point.py +31 -0
- warp/fem/linalg.py +38 -0
- warp/fem/operator.py +32 -0
- warp/fem/polynomial.py +29 -0
- warp/fem/space/__init__.py +22 -0
- warp/fem/space/basis_space.py +24 -0
- warp/fem/space/shape/__init__.py +68 -0
- warp/fem/space/topology.py +24 -0
- warp/fem/types.py +24 -0
- warp/fem/utils.py +32 -0
- warp/jax.py +29 -0
- warp/jax_experimental/__init__.py +29 -0
- warp/jax_experimental/custom_call.py +29 -0
- warp/jax_experimental/ffi.py +39 -0
- warp/jax_experimental/xla_ffi.py +24 -0
- warp/marching_cubes.py +24 -0
- warp/math.py +37 -0
- warp/native/array.h +1687 -0
- warp/native/builtin.h +2327 -0
- warp/native/bvh.cpp +562 -0
- warp/native/bvh.cu +826 -0
- warp/native/bvh.h +555 -0
- warp/native/clang/clang.cpp +541 -0
- warp/native/coloring.cpp +622 -0
- warp/native/crt.cpp +51 -0
- warp/native/crt.h +568 -0
- warp/native/cuda_crt.h +1058 -0
- warp/native/cuda_util.cpp +677 -0
- warp/native/cuda_util.h +313 -0
- warp/native/error.cpp +77 -0
- warp/native/error.h +36 -0
- warp/native/exports.h +2023 -0
- warp/native/fabric.h +246 -0
- warp/native/hashgrid.cpp +311 -0
- warp/native/hashgrid.cu +89 -0
- warp/native/hashgrid.h +240 -0
- warp/native/initializer_array.h +41 -0
- warp/native/intersect.h +1253 -0
- warp/native/intersect_adj.h +375 -0
- warp/native/intersect_tri.h +348 -0
- warp/native/mat.h +5189 -0
- warp/native/mathdx.cpp +93 -0
- warp/native/matnn.h +221 -0
- warp/native/mesh.cpp +266 -0
- warp/native/mesh.cu +406 -0
- warp/native/mesh.h +2097 -0
- warp/native/nanovdb/GridHandle.h +533 -0
- warp/native/nanovdb/HostBuffer.h +591 -0
- warp/native/nanovdb/NanoVDB.h +6246 -0
- warp/native/nanovdb/NodeManager.h +323 -0
- warp/native/nanovdb/PNanoVDB.h +3390 -0
- warp/native/noise.h +859 -0
- warp/native/quat.h +1664 -0
- warp/native/rand.h +342 -0
- warp/native/range.h +145 -0
- warp/native/reduce.cpp +174 -0
- warp/native/reduce.cu +363 -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 +55 -0
- warp/native/scan.h +23 -0
- warp/native/solid_angle.h +466 -0
- warp/native/sort.cpp +251 -0
- warp/native/sort.cu +286 -0
- warp/native/sort.h +35 -0
- warp/native/sparse.cpp +241 -0
- warp/native/sparse.cu +435 -0
- warp/native/spatial.h +1306 -0
- warp/native/svd.h +727 -0
- warp/native/temp_buffer.h +46 -0
- warp/native/tile.h +4124 -0
- warp/native/tile_radix_sort.h +1112 -0
- warp/native/tile_reduce.h +838 -0
- warp/native/tile_scan.h +240 -0
- warp/native/tuple.h +189 -0
- warp/native/vec.h +2199 -0
- warp/native/version.h +23 -0
- warp/native/volume.cpp +501 -0
- warp/native/volume.cu +68 -0
- warp/native/volume.h +970 -0
- warp/native/volume_builder.cu +483 -0
- warp/native/volume_builder.h +52 -0
- warp/native/volume_impl.h +70 -0
- warp/native/warp.cpp +1143 -0
- warp/native/warp.cu +4604 -0
- warp/native/warp.h +358 -0
- warp/optim/__init__.py +20 -0
- warp/optim/adam.py +24 -0
- warp/optim/linear.py +35 -0
- warp/optim/sgd.py +24 -0
- warp/paddle.py +24 -0
- warp/py.typed +0 -0
- warp/render/__init__.py +22 -0
- warp/render/imgui_manager.py +29 -0
- warp/render/render_opengl.py +24 -0
- warp/render/render_usd.py +24 -0
- warp/render/utils.py +24 -0
- warp/sparse.py +51 -0
- warp/tape.py +24 -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_aot.py +7 -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_conditional_captures.py +1147 -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 +691 -0
- warp/tests/geometry/__init__.py +0 -0
- warp/tests/geometry/test_bvh.py +335 -0
- warp/tests/geometry/test_hash_grid.py +259 -0
- warp/tests/geometry/test_marching_cubes.py +294 -0
- warp/tests/geometry/test_mesh.py +318 -0
- warp/tests/geometry/test_mesh_query_aabb.py +392 -0
- warp/tests/geometry/test_mesh_query_point.py +935 -0
- warp/tests/geometry/test_mesh_query_ray.py +323 -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 +730 -0
- warp/tests/interop/test_jax.py +1673 -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/test_adam.py +162 -0
- warp/tests/test_arithmetic.py +1096 -0
- warp/tests/test_array.py +3756 -0
- warp/tests/test_array_reduce.py +156 -0
- warp/tests/test_assert.py +303 -0
- warp/tests/test_atomic.py +336 -0
- warp/tests/test_atomic_bitwise.py +209 -0
- warp/tests/test_atomic_cas.py +312 -0
- warp/tests/test_bool.py +220 -0
- warp/tests/test_builtins_resolution.py +732 -0
- warp/tests/test_closest_point_edge_edge.py +327 -0
- warp/tests/test_codegen.py +974 -0
- warp/tests/test_codegen_instancing.py +1495 -0
- warp/tests/test_compile_consts.py +215 -0
- warp/tests/test_conditional.py +298 -0
- warp/tests/test_context.py +35 -0
- warp/tests/test_copy.py +319 -0
- warp/tests/test_ctypes.py +618 -0
- warp/tests/test_dense.py +73 -0
- warp/tests/test_devices.py +127 -0
- warp/tests/test_enum.py +136 -0
- warp/tests/test_examples.py +424 -0
- warp/tests/test_fabricarray.py +998 -0
- warp/tests/test_fast_math.py +72 -0
- warp/tests/test_fem.py +2204 -0
- warp/tests/test_fixedarray.py +229 -0
- warp/tests/test_fp16.py +136 -0
- warp/tests/test_func.py +501 -0
- warp/tests/test_future_annotations.py +100 -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 +103 -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 +223 -0
- warp/tests/test_lvalue.py +427 -0
- warp/tests/test_map.py +526 -0
- warp/tests/test_mat.py +3515 -0
- warp/tests/test_mat_assign_copy.py +178 -0
- warp/tests/test_mat_constructors.py +573 -0
- warp/tests/test_mat_lite.py +122 -0
- warp/tests/test_mat_scalar_ops.py +2913 -0
- warp/tests/test_math.py +212 -0
- warp/tests/test_module_aot.py +287 -0
- warp/tests/test_module_hashing.py +258 -0
- warp/tests/test_modules_lite.py +70 -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 +408 -0
- warp/tests/test_quat.py +2653 -0
- warp/tests/test_quat_assign_copy.py +145 -0
- warp/tests/test_rand.py +339 -0
- warp/tests/test_reload.py +303 -0
- warp/tests/test_rounding.py +157 -0
- warp/tests/test_runlength_encode.py +196 -0
- warp/tests/test_scalar_ops.py +133 -0
- warp/tests/test_smoothstep.py +108 -0
- warp/tests/test_snippet.py +318 -0
- warp/tests/test_sparse.py +845 -0
- warp/tests/test_spatial.py +2859 -0
- warp/tests/test_spatial_assign_copy.py +160 -0
- warp/tests/test_special_values.py +361 -0
- warp/tests/test_static.py +640 -0
- warp/tests/test_struct.py +901 -0
- warp/tests/test_tape.py +242 -0
- warp/tests/test_transient_module.py +93 -0
- warp/tests/test_triangle_closest_point.py +192 -0
- warp/tests/test_tuple.py +361 -0
- warp/tests/test_types.py +615 -0
- warp/tests/test_utils.py +594 -0
- warp/tests/test_vec.py +1408 -0
- warp/tests/test_vec_assign_copy.py +143 -0
- warp/tests/test_vec_constructors.py +325 -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/test_version.py +75 -0
- warp/tests/tile/__init__.py +0 -0
- warp/tests/tile/test_tile.py +1519 -0
- warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
- warp/tests/tile/test_tile_cholesky.py +608 -0
- warp/tests/tile/test_tile_load.py +724 -0
- warp/tests/tile/test_tile_mathdx.py +156 -0
- warp/tests/tile/test_tile_matmul.py +179 -0
- warp/tests/tile/test_tile_mlp.py +400 -0
- warp/tests/tile/test_tile_reduce.py +950 -0
- warp/tests/tile/test_tile_shared_memory.py +376 -0
- warp/tests/tile/test_tile_sort.py +121 -0
- warp/tests/tile/test_tile_view.py +173 -0
- warp/tests/unittest_serial.py +47 -0
- warp/tests/unittest_suites.py +430 -0
- warp/tests/unittest_utils.py +469 -0
- warp/tests/walkthrough_debug.py +95 -0
- warp/torch.py +24 -0
- warp/types.py +51 -0
- warp/utils.py +31 -0
- warp_lang-1.10.0.dist-info/METADATA +459 -0
- warp_lang-1.10.0.dist-info/RECORD +468 -0
- warp_lang-1.10.0.dist-info/WHEEL +5 -0
- warp_lang-1.10.0.dist-info/licenses/LICENSE.md +176 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
- warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
- warp_lang-1.10.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,258 @@
|
|
|
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
|
+
# TODO: add more tests for kernels and generics
|
|
17
|
+
|
|
18
|
+
import os
|
|
19
|
+
import tempfile
|
|
20
|
+
import unittest
|
|
21
|
+
from importlib import util
|
|
22
|
+
|
|
23
|
+
import warp as wp
|
|
24
|
+
from warp.tests.unittest_utils import *
|
|
25
|
+
|
|
26
|
+
FUNC_OVERLOAD_1 = """# -*- coding: utf-8 -*-
|
|
27
|
+
import warp as wp
|
|
28
|
+
|
|
29
|
+
@wp.func
|
|
30
|
+
def fn():
|
|
31
|
+
wp.print(17)
|
|
32
|
+
|
|
33
|
+
@wp.func
|
|
34
|
+
def fn(value: int):
|
|
35
|
+
wp.print(value)
|
|
36
|
+
|
|
37
|
+
@wp.kernel
|
|
38
|
+
def k():
|
|
39
|
+
print(fn())
|
|
40
|
+
print(fn(99))
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
# should be same hash as FUNC_OVERLOAD_1
|
|
44
|
+
FUNC_OVERLOAD_2 = """# -*- coding: utf-8 -*-
|
|
45
|
+
import warp as wp
|
|
46
|
+
|
|
47
|
+
@wp.func
|
|
48
|
+
def fn():
|
|
49
|
+
wp.print(17)
|
|
50
|
+
|
|
51
|
+
@wp.func
|
|
52
|
+
def fn(value: int):
|
|
53
|
+
wp.print(value)
|
|
54
|
+
|
|
55
|
+
@wp.kernel
|
|
56
|
+
def k():
|
|
57
|
+
print(fn())
|
|
58
|
+
print(fn(99))
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
# should be different hash than FUNC_OVERLOAD_1 (first overload is different)
|
|
62
|
+
FUNC_OVERLOAD_3 = """# -*- coding: utf-8 -*-
|
|
63
|
+
import warp as wp
|
|
64
|
+
|
|
65
|
+
@wp.func
|
|
66
|
+
def fn():
|
|
67
|
+
wp.print(42)
|
|
68
|
+
|
|
69
|
+
@wp.func
|
|
70
|
+
def fn(value: int):
|
|
71
|
+
wp.print(value)
|
|
72
|
+
|
|
73
|
+
@wp.kernel
|
|
74
|
+
def k():
|
|
75
|
+
print(fn())
|
|
76
|
+
print(fn(99))
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
# should be different hash than FUNC_OVERLOAD_1 (second overload is different)
|
|
80
|
+
FUNC_OVERLOAD_4 = """# -*- coding: utf-8 -*-
|
|
81
|
+
import warp as wp
|
|
82
|
+
|
|
83
|
+
@wp.func
|
|
84
|
+
def fn():
|
|
85
|
+
wp.print(17)
|
|
86
|
+
|
|
87
|
+
@wp.func
|
|
88
|
+
def fn(value: int):
|
|
89
|
+
wp.print(value + 1)
|
|
90
|
+
|
|
91
|
+
@wp.kernel
|
|
92
|
+
def k():
|
|
93
|
+
print(fn())
|
|
94
|
+
print(fn(99))
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
FUNC_GENERIC_1 = """# -*- coding: utf-8 -*-
|
|
98
|
+
import warp as wp
|
|
99
|
+
|
|
100
|
+
from typing import Any
|
|
101
|
+
|
|
102
|
+
@wp.func
|
|
103
|
+
def generic_fn(x: Any):
|
|
104
|
+
return x * x
|
|
105
|
+
|
|
106
|
+
@wp.func
|
|
107
|
+
def generic_fn(x: Any, y: Any):
|
|
108
|
+
return x * y
|
|
109
|
+
|
|
110
|
+
@wp.kernel
|
|
111
|
+
def k():
|
|
112
|
+
print(generic_fn(17))
|
|
113
|
+
print(generic_fn(17, 42))
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
# should be same hash as FUNC_GENERIC_1
|
|
117
|
+
FUNC_GENERIC_2 = """# -*- coding: utf-8 -*-
|
|
118
|
+
import warp as wp
|
|
119
|
+
|
|
120
|
+
from typing import Any
|
|
121
|
+
|
|
122
|
+
@wp.func
|
|
123
|
+
def generic_fn(x: Any):
|
|
124
|
+
return x * x
|
|
125
|
+
|
|
126
|
+
@wp.func
|
|
127
|
+
def generic_fn(x: Any, y: Any):
|
|
128
|
+
return x * y
|
|
129
|
+
|
|
130
|
+
@wp.kernel
|
|
131
|
+
def k():
|
|
132
|
+
print(generic_fn(17))
|
|
133
|
+
print(generic_fn(17, 42))
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
# should be different hash than FUNC_GENERIC_1 (first overload is different)
|
|
137
|
+
FUNC_GENERIC_3 = """# -*- coding: utf-8 -*-
|
|
138
|
+
import warp as wp
|
|
139
|
+
|
|
140
|
+
from typing import Any
|
|
141
|
+
|
|
142
|
+
@wp.func
|
|
143
|
+
def generic_fn(x: Any):
|
|
144
|
+
return x + x
|
|
145
|
+
|
|
146
|
+
@wp.func
|
|
147
|
+
def generic_fn(x: Any, y: Any):
|
|
148
|
+
return x * y
|
|
149
|
+
|
|
150
|
+
@wp.kernel
|
|
151
|
+
def k():
|
|
152
|
+
print(generic_fn(17))
|
|
153
|
+
print(generic_fn(17, 42))
|
|
154
|
+
"""
|
|
155
|
+
|
|
156
|
+
# should be different hash than FUNC_GENERIC_1 (second overload is different)
|
|
157
|
+
FUNC_GENERIC_4 = """# -*- coding: utf-8 -*-
|
|
158
|
+
import warp as wp
|
|
159
|
+
|
|
160
|
+
from typing import Any
|
|
161
|
+
|
|
162
|
+
@wp.func
|
|
163
|
+
def generic_fn(x: Any):
|
|
164
|
+
return x * x
|
|
165
|
+
|
|
166
|
+
@wp.func
|
|
167
|
+
def generic_fn(x: Any, y: Any):
|
|
168
|
+
return x + y
|
|
169
|
+
|
|
170
|
+
@wp.kernel
|
|
171
|
+
def k():
|
|
172
|
+
print(generic_fn(17))
|
|
173
|
+
print(generic_fn(17, 42))
|
|
174
|
+
"""
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def load_code_as_module(code, name):
|
|
178
|
+
file, file_path = tempfile.mkstemp(suffix=".py")
|
|
179
|
+
|
|
180
|
+
try:
|
|
181
|
+
with os.fdopen(file, "w") as f:
|
|
182
|
+
f.write(code)
|
|
183
|
+
|
|
184
|
+
spec = util.spec_from_file_location(name, file_path)
|
|
185
|
+
module = util.module_from_spec(spec)
|
|
186
|
+
spec.loader.exec_module(module)
|
|
187
|
+
finally:
|
|
188
|
+
os.remove(file_path)
|
|
189
|
+
|
|
190
|
+
return wp.get_module(module.__name__)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def test_function_overload_hashing(test, device):
|
|
194
|
+
m1 = load_code_as_module(FUNC_OVERLOAD_1, "func_overload_1")
|
|
195
|
+
m2 = load_code_as_module(FUNC_OVERLOAD_2, "func_overload_2")
|
|
196
|
+
m3 = load_code_as_module(FUNC_OVERLOAD_3, "func_overload_3")
|
|
197
|
+
m4 = load_code_as_module(FUNC_OVERLOAD_4, "func_overload_4")
|
|
198
|
+
|
|
199
|
+
hash1 = m1.hash_module()
|
|
200
|
+
hash2 = m2.hash_module()
|
|
201
|
+
hash3 = m3.hash_module()
|
|
202
|
+
hash4 = m4.hash_module()
|
|
203
|
+
|
|
204
|
+
test.assertEqual(hash2, hash1)
|
|
205
|
+
test.assertNotEqual(hash3, hash1)
|
|
206
|
+
test.assertNotEqual(hash4, hash1)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def test_function_generic_overload_hashing(test, device):
|
|
210
|
+
m1 = load_code_as_module(FUNC_GENERIC_1, "func_generic_1")
|
|
211
|
+
m2 = load_code_as_module(FUNC_GENERIC_2, "func_generic_2")
|
|
212
|
+
m3 = load_code_as_module(FUNC_GENERIC_3, "func_generic_3")
|
|
213
|
+
m4 = load_code_as_module(FUNC_GENERIC_4, "func_generic_4")
|
|
214
|
+
|
|
215
|
+
hash1 = m1.hash_module()
|
|
216
|
+
hash2 = m2.hash_module()
|
|
217
|
+
hash3 = m3.hash_module()
|
|
218
|
+
hash4 = m4.hash_module()
|
|
219
|
+
|
|
220
|
+
test.assertEqual(hash2, hash1)
|
|
221
|
+
test.assertNotEqual(hash3, hash1)
|
|
222
|
+
test.assertNotEqual(hash4, hash1)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
SIMPLE_MODULE = """# -*- coding: utf-8 -*-
|
|
226
|
+
import warp as wp
|
|
227
|
+
|
|
228
|
+
@wp.kernel
|
|
229
|
+
def k():
|
|
230
|
+
pass
|
|
231
|
+
"""
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def test_module_load(test, device):
|
|
235
|
+
"""Ensure that loading a module does not change its hash"""
|
|
236
|
+
m = load_code_as_module(SIMPLE_MODULE, "simple_module")
|
|
237
|
+
|
|
238
|
+
hash1 = m.hash_module()
|
|
239
|
+
m.load(device)
|
|
240
|
+
hash2 = m.hash_module()
|
|
241
|
+
|
|
242
|
+
test.assertEqual(hash1, hash2)
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
class TestModuleHashing(unittest.TestCase):
|
|
246
|
+
pass
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
devices = get_test_devices()
|
|
250
|
+
|
|
251
|
+
add_function_test(TestModuleHashing, "test_function_overload_hashing", test_function_overload_hashing)
|
|
252
|
+
add_function_test(TestModuleHashing, "test_function_generic_overload_hashing", test_function_generic_overload_hashing)
|
|
253
|
+
add_function_test(TestModuleHashing, "test_module_load", test_module_load, devices=devices)
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
if __name__ == "__main__":
|
|
257
|
+
wp.clear_kernel_cache()
|
|
258
|
+
unittest.main(verbosity=2)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2023 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 warp as wp
|
|
19
|
+
import warp.utils
|
|
20
|
+
from warp.tests.unittest_utils import *
|
|
21
|
+
|
|
22
|
+
devices = get_test_devices()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# This kernel is needed to ensure this test module is registered as a Warp module.
|
|
26
|
+
# wp.load_module() requires the module to contain at least one Warp kernel, function, or struct.
|
|
27
|
+
@wp.kernel
|
|
28
|
+
def print_values():
|
|
29
|
+
i = wp.tid()
|
|
30
|
+
wp.print(i)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class TestModuleLite(unittest.TestCase):
|
|
34
|
+
def test_module_lite_load(self):
|
|
35
|
+
# Load current module
|
|
36
|
+
wp.load_module()
|
|
37
|
+
|
|
38
|
+
# Load named module
|
|
39
|
+
wp.load_module(warp.utils)
|
|
40
|
+
|
|
41
|
+
# Load named module (string)
|
|
42
|
+
wp.load_module("warp.utils", recursive=True)
|
|
43
|
+
|
|
44
|
+
def test_module_lite_options(self):
|
|
45
|
+
wp.set_module_options({"max_unroll": 8})
|
|
46
|
+
module_options = wp.get_module_options()
|
|
47
|
+
self.assertIsInstance(module_options, dict)
|
|
48
|
+
self.assertEqual(module_options["max_unroll"], 8)
|
|
49
|
+
|
|
50
|
+
def test_module_lite_load_nonexistent(self):
|
|
51
|
+
# Test that loading a non-existent module raises RuntimeError
|
|
52
|
+
with self.assertRaises(RuntimeError) as context:
|
|
53
|
+
wp.load_module("nonexistent_module_that_does_not_exist")
|
|
54
|
+
|
|
55
|
+
self.assertIn("does not contain any Warp kernels, functions, or structs", str(context.exception))
|
|
56
|
+
self.assertIn("nonexistent_module_that_does_not_exist", str(context.exception))
|
|
57
|
+
|
|
58
|
+
def test_module_lite_load_no_warp_content(self):
|
|
59
|
+
# Test that loading a module without Warp content raises RuntimeError
|
|
60
|
+
# Use a standard library module that definitely has no Warp kernels
|
|
61
|
+
with self.assertRaises(RuntimeError) as context:
|
|
62
|
+
wp.load_module(unittest)
|
|
63
|
+
|
|
64
|
+
self.assertIn("does not contain any Warp kernels, functions, or structs", str(context.exception))
|
|
65
|
+
self.assertIn("unittest", str(context.exception))
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
if __name__ == "__main__":
|
|
69
|
+
wp.clear_kernel_cache()
|
|
70
|
+
unittest.main(verbosity=2)
|
warp/tests/test_noise.py
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
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 pnoise(
|
|
26
|
+
kernel_seed: int, W: int, px: int, py: int, noise_values: wp.array(dtype=float), pixel_values: wp.array(dtype=float)
|
|
27
|
+
):
|
|
28
|
+
tid = wp.tid()
|
|
29
|
+
|
|
30
|
+
state = wp.rand_init(kernel_seed)
|
|
31
|
+
|
|
32
|
+
x = (float(tid % W) + 0.5) * 0.2
|
|
33
|
+
y = (float(tid / W) + 0.5) * 0.2
|
|
34
|
+
p = wp.vec2(x, y)
|
|
35
|
+
|
|
36
|
+
n = wp.pnoise(state, p, px, py)
|
|
37
|
+
noise_values[tid] = n
|
|
38
|
+
|
|
39
|
+
g = ((n + 1.0) / 2.0) * 255.0
|
|
40
|
+
pixel_values[tid] = g
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@wp.kernel
|
|
44
|
+
def curlnoise(kernel_seed: int, W: int, noise_coords: wp.array(dtype=wp.vec2), noise_vectors: wp.array(dtype=wp.vec2)):
|
|
45
|
+
tid = wp.tid()
|
|
46
|
+
|
|
47
|
+
state = wp.rand_init(kernel_seed)
|
|
48
|
+
|
|
49
|
+
x = (float(tid % W) + 0.5) * 0.2
|
|
50
|
+
y = (float(tid / W) + 0.5) * 0.2
|
|
51
|
+
|
|
52
|
+
p = wp.vec2(x, y)
|
|
53
|
+
v = wp.curlnoise(state, p)
|
|
54
|
+
|
|
55
|
+
noise_coords[tid] = p
|
|
56
|
+
noise_vectors[tid] = v
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def test_pnoise(test, device):
|
|
60
|
+
# image dim
|
|
61
|
+
W = 256
|
|
62
|
+
H = 256
|
|
63
|
+
N = W * H
|
|
64
|
+
seed = 42
|
|
65
|
+
|
|
66
|
+
# periodic perlin noise test
|
|
67
|
+
px = 16
|
|
68
|
+
py = 16
|
|
69
|
+
|
|
70
|
+
noise_values = wp.zeros(N, dtype=float, device=device)
|
|
71
|
+
pixel_values = wp.zeros(N, dtype=float, device=device)
|
|
72
|
+
|
|
73
|
+
wp.launch(kernel=pnoise, dim=N, inputs=[seed, W, px, py, noise_values, pixel_values], outputs=[], device=device)
|
|
74
|
+
|
|
75
|
+
# Perlin theoretical range is [-0.5*sqrt(n), 0.5*sqrt(n)] for n dimensions
|
|
76
|
+
n = noise_values.numpy()
|
|
77
|
+
# max = np.max(n)
|
|
78
|
+
# min = np.min(n)
|
|
79
|
+
|
|
80
|
+
img = pixel_values.numpy()
|
|
81
|
+
img = np.reshape(img, (W, H))
|
|
82
|
+
|
|
83
|
+
### Figure viewing ###
|
|
84
|
+
# img = img.astype(np.uint8)
|
|
85
|
+
# imgplot = plt.imshow(img, 'gray')
|
|
86
|
+
# plt.savefig("pnoise_test.png")
|
|
87
|
+
|
|
88
|
+
### Generating pnoise_test_result_true.npy ###
|
|
89
|
+
# np.save(os.path.join(os.path.dirname(__file__), "assets/pnoise_golden.npy"), img)
|
|
90
|
+
|
|
91
|
+
### Golden image comparison ###
|
|
92
|
+
img_true = np.load(os.path.join(os.path.dirname(__file__), "assets/pnoise_golden.npy"))
|
|
93
|
+
test.assertTrue(img.shape == img_true.shape)
|
|
94
|
+
err = np.max(np.abs(img - img_true))
|
|
95
|
+
tolerance = 1.5e-3
|
|
96
|
+
test.assertTrue(err < tolerance, f"err is {err} which is >= {tolerance}")
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def test_curlnoise(test, device):
|
|
100
|
+
# image dim
|
|
101
|
+
W = 128
|
|
102
|
+
H = 128
|
|
103
|
+
N = W * H
|
|
104
|
+
seed = 42
|
|
105
|
+
|
|
106
|
+
# curl noise test
|
|
107
|
+
quiver_coords_host = wp.zeros(N, dtype=wp.vec2, device="cpu")
|
|
108
|
+
quiver_coords = wp.zeros(N, dtype=wp.vec2, device=device)
|
|
109
|
+
|
|
110
|
+
quiver_arrows_host = wp.zeros(N, dtype=wp.vec2, device="cpu")
|
|
111
|
+
quiver_arrows = wp.zeros(N, dtype=wp.vec2, device=device)
|
|
112
|
+
|
|
113
|
+
wp.launch(kernel=curlnoise, dim=N, inputs=[seed, W, quiver_coords, quiver_arrows], outputs=[], device=device)
|
|
114
|
+
|
|
115
|
+
wp.copy(quiver_coords_host, quiver_coords)
|
|
116
|
+
wp.copy(quiver_arrows_host, quiver_arrows)
|
|
117
|
+
|
|
118
|
+
wp.synchronize()
|
|
119
|
+
|
|
120
|
+
xy_coords = quiver_coords_host.numpy()
|
|
121
|
+
uv_coords = quiver_arrows_host.numpy()
|
|
122
|
+
|
|
123
|
+
# normalize
|
|
124
|
+
norms = uv_coords[:, 0] * uv_coords[:, 0] + uv_coords[:, 1] * uv_coords[:, 1]
|
|
125
|
+
uv_coords = uv_coords / np.sqrt(np.max(norms))
|
|
126
|
+
|
|
127
|
+
X = xy_coords[:, 0]
|
|
128
|
+
Y = xy_coords[:, 1]
|
|
129
|
+
U = uv_coords[:, 0]
|
|
130
|
+
V = uv_coords[:, 1]
|
|
131
|
+
|
|
132
|
+
### Figure viewing ###
|
|
133
|
+
# fig, ax = plt.subplots(figsize=(25,25))
|
|
134
|
+
# ax.quiver(X, Y, U, V)
|
|
135
|
+
# ax.axis([0.0, 25.0, 0.0, 25.0])
|
|
136
|
+
# ax.set_aspect('equal')
|
|
137
|
+
# plt.savefig("curlnoise_test.png")
|
|
138
|
+
|
|
139
|
+
### Generating curlnoise_test_result_true.npy ###
|
|
140
|
+
result = np.stack((xy_coords, uv_coords))
|
|
141
|
+
# np.save(os.path.join(os.path.dirname(__file__), "assets/curlnoise_golden.npy"), result)
|
|
142
|
+
|
|
143
|
+
### Golden image comparison ###
|
|
144
|
+
result_true = np.load(os.path.join(os.path.dirname(__file__), "assets/curlnoise_golden.npy"))
|
|
145
|
+
test.assertTrue(result.shape, result_true.shape)
|
|
146
|
+
err = np.max(np.abs(result - result_true))
|
|
147
|
+
test.assertTrue(err < 1e-04)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
@wp.kernel
|
|
151
|
+
def noise_loss_kernel(
|
|
152
|
+
kernel_seed: int,
|
|
153
|
+
query_positions: wp.array(dtype=wp.vec2),
|
|
154
|
+
noise_values: wp.array(dtype=float),
|
|
155
|
+
noise_loss: wp.array(dtype=float),
|
|
156
|
+
):
|
|
157
|
+
tid = wp.tid()
|
|
158
|
+
state = wp.rand_init(kernel_seed)
|
|
159
|
+
|
|
160
|
+
p = query_positions[tid]
|
|
161
|
+
|
|
162
|
+
n = wp.noise(state, p)
|
|
163
|
+
noise_values[tid] = n
|
|
164
|
+
|
|
165
|
+
wp.atomic_add(noise_loss, 0, n)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
@wp.kernel
|
|
169
|
+
def noise_cd(kernel_seed: int, query_positions: wp.array(dtype=wp.vec2), gradients: wp.array(dtype=wp.vec2)):
|
|
170
|
+
tid = wp.tid()
|
|
171
|
+
state = wp.rand_init(kernel_seed)
|
|
172
|
+
p = query_positions[tid]
|
|
173
|
+
|
|
174
|
+
eps = 1.0e-3
|
|
175
|
+
|
|
176
|
+
pl = wp.vec2(p[0] - eps, p[1])
|
|
177
|
+
pr = wp.vec2(p[0] + eps, p[1])
|
|
178
|
+
pd = wp.vec2(p[0], p[1] - eps)
|
|
179
|
+
pu = wp.vec2(p[0], p[1] + eps)
|
|
180
|
+
|
|
181
|
+
nl = wp.noise(state, pl)
|
|
182
|
+
nr = wp.noise(state, pr)
|
|
183
|
+
nd = wp.noise(state, pd)
|
|
184
|
+
nu = wp.noise(state, pu)
|
|
185
|
+
|
|
186
|
+
gx = (nr - nl) / (2.0 * eps)
|
|
187
|
+
gy = (nu - nd) / (2.0 * eps)
|
|
188
|
+
|
|
189
|
+
gradients[tid] = wp.vec2(gx, gy)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def test_adj_noise(test, device):
|
|
193
|
+
# grid dim
|
|
194
|
+
N = 9
|
|
195
|
+
seed = 42
|
|
196
|
+
|
|
197
|
+
tape = wp.Tape()
|
|
198
|
+
|
|
199
|
+
positions = np.array(
|
|
200
|
+
[
|
|
201
|
+
[-0.1, -0.1],
|
|
202
|
+
[0.0, -0.1],
|
|
203
|
+
[0.1, -0.1],
|
|
204
|
+
[-0.1, 0.0],
|
|
205
|
+
[0.0, 0.0],
|
|
206
|
+
[0.1, 0.0],
|
|
207
|
+
[-0.1, 0.1],
|
|
208
|
+
[0.0, 0.1],
|
|
209
|
+
[0.1, 0.1],
|
|
210
|
+
]
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
with tape:
|
|
214
|
+
query_positions = wp.array(positions, dtype=wp.vec2, device=device, requires_grad=True)
|
|
215
|
+
noise_values = wp.zeros(N, dtype=float, device=device)
|
|
216
|
+
noise_loss = wp.zeros(n=1, dtype=float, device=device, requires_grad=True)
|
|
217
|
+
|
|
218
|
+
wp.launch(
|
|
219
|
+
kernel=noise_loss_kernel, dim=N, inputs=[seed, query_positions, noise_values, noise_loss], device=device
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
# analytic
|
|
223
|
+
tape.backward(loss=noise_loss)
|
|
224
|
+
analytic = tape.gradients[query_positions].numpy().reshape((3, 3, 2))
|
|
225
|
+
|
|
226
|
+
# central difference
|
|
227
|
+
gradients = wp.zeros(N, dtype=wp.vec2, device=device)
|
|
228
|
+
wp.launch(kernel=noise_cd, dim=N, inputs=[seed, query_positions, gradients], device=device)
|
|
229
|
+
|
|
230
|
+
gradients_host = gradients.numpy().reshape((3, 3, 2))
|
|
231
|
+
diff = analytic - gradients_host
|
|
232
|
+
result = np.sum(diff * diff, axis=2)
|
|
233
|
+
|
|
234
|
+
err = np.where(result > 1.0e-3, result, 0).sum()
|
|
235
|
+
test.assertTrue(err < 1.0e-8)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
devices = get_test_devices()
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
class TestNoise(unittest.TestCase):
|
|
242
|
+
pass
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
add_function_test(TestNoise, "test_pnoise", test_pnoise, devices=devices)
|
|
246
|
+
add_function_test(TestNoise, "test_curlnoise", test_curlnoise, devices=devices)
|
|
247
|
+
add_function_test(TestNoise, "test_adj_noise", test_adj_noise, devices=devices)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
if __name__ == "__main__":
|
|
251
|
+
wp.clear_kernel_cache()
|
|
252
|
+
unittest.main(verbosity=2)
|