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,156 @@
|
|
|
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 numpy as np
|
|
19
|
+
|
|
20
|
+
import warp as wp
|
|
21
|
+
from warp._src.utils import array_inner, array_sum
|
|
22
|
+
from warp.tests.unittest_utils import *
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def make_test_array_sum(dtype):
|
|
26
|
+
N = 1000
|
|
27
|
+
|
|
28
|
+
def test_array_sum(test, device):
|
|
29
|
+
rng = np.random.default_rng(123)
|
|
30
|
+
|
|
31
|
+
cols = wp._src.types.type_size(dtype)
|
|
32
|
+
|
|
33
|
+
values_np = rng.random(size=(N, cols))
|
|
34
|
+
values = wp.array(values_np, device=device, dtype=dtype)
|
|
35
|
+
|
|
36
|
+
vsum = array_sum(values)
|
|
37
|
+
ref_vsum = values_np.sum(axis=0)
|
|
38
|
+
|
|
39
|
+
assert_np_equal(vsum / N, ref_vsum / N, 0.0001)
|
|
40
|
+
|
|
41
|
+
return test_array_sum
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def make_test_array_sum_axis(dtype):
|
|
45
|
+
I = 5
|
|
46
|
+
J = 10
|
|
47
|
+
K = 2
|
|
48
|
+
|
|
49
|
+
N = I * J * K
|
|
50
|
+
|
|
51
|
+
def test_array_sum(test, device):
|
|
52
|
+
rng = np.random.default_rng(123)
|
|
53
|
+
|
|
54
|
+
values_np = rng.random(size=(I, J, K))
|
|
55
|
+
values = wp.array(values_np, shape=(I, J, K), device=device, dtype=dtype)
|
|
56
|
+
|
|
57
|
+
for axis in range(3):
|
|
58
|
+
vsum = array_sum(values, axis=axis)
|
|
59
|
+
ref_vsum = values_np.sum(axis=axis)
|
|
60
|
+
|
|
61
|
+
assert_np_equal(vsum.numpy() / N, ref_vsum / N, 0.0001)
|
|
62
|
+
|
|
63
|
+
return test_array_sum
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_array_sum_empty(test, device):
|
|
67
|
+
values = wp.array([], device=device, dtype=wp.vec2)
|
|
68
|
+
assert_np_equal(array_sum(values), np.zeros(2))
|
|
69
|
+
|
|
70
|
+
values = wp.array([], shape=(0, 3), device=device, dtype=float)
|
|
71
|
+
assert_np_equal(array_sum(values, axis=0).numpy(), np.zeros((1, 3)))
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def make_test_array_inner(dtype):
|
|
75
|
+
N = 1000
|
|
76
|
+
|
|
77
|
+
def test_array_inner(test, device):
|
|
78
|
+
rng = np.random.default_rng(123)
|
|
79
|
+
|
|
80
|
+
cols = wp._src.types.type_size(dtype)
|
|
81
|
+
|
|
82
|
+
a_np = rng.random(size=(N, cols))
|
|
83
|
+
b_np = rng.random(size=(N, cols))
|
|
84
|
+
|
|
85
|
+
a = wp.array(a_np, device=device, dtype=dtype)
|
|
86
|
+
b = wp.array(b_np, device=device, dtype=dtype)
|
|
87
|
+
|
|
88
|
+
ab = array_inner(a, b)
|
|
89
|
+
ref_ab = np.dot(a_np.flatten(), b_np.flatten())
|
|
90
|
+
|
|
91
|
+
test.assertAlmostEqual(ab / N, ref_ab / N, places=5)
|
|
92
|
+
|
|
93
|
+
return test_array_inner
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def make_test_array_inner_axis(dtype):
|
|
97
|
+
I = 5
|
|
98
|
+
J = 10
|
|
99
|
+
K = 2
|
|
100
|
+
|
|
101
|
+
N = I * J * K
|
|
102
|
+
|
|
103
|
+
def test_array_inner(test, device):
|
|
104
|
+
rng = np.random.default_rng(123)
|
|
105
|
+
|
|
106
|
+
a_np = rng.random(size=(I, J, K))
|
|
107
|
+
b_np = rng.random(size=(I, J, K))
|
|
108
|
+
|
|
109
|
+
a = wp.array(a_np, shape=(I, J, K), device=device, dtype=dtype)
|
|
110
|
+
b = wp.array(b_np, shape=(I, J, K), device=device, dtype=dtype)
|
|
111
|
+
|
|
112
|
+
ab = array_inner(a, b, axis=0)
|
|
113
|
+
ref_ab = np.einsum(a_np, [0, 1, 2], b_np, [0, 1, 2], [1, 2])
|
|
114
|
+
assert_np_equal(ab.numpy() / N, ref_ab / N, 0.0001)
|
|
115
|
+
|
|
116
|
+
ab = array_inner(a, b, axis=1)
|
|
117
|
+
ref_ab = np.einsum(a_np, [0, 1, 2], b_np, [0, 1, 2], [0, 2])
|
|
118
|
+
assert_np_equal(ab.numpy() / N, ref_ab / N, 0.0001)
|
|
119
|
+
|
|
120
|
+
ab = array_inner(a, b, axis=2)
|
|
121
|
+
ref_ab = np.einsum(a_np, [0, 1, 2], b_np, [0, 1, 2], [0, 1])
|
|
122
|
+
assert_np_equal(ab.numpy() / N, ref_ab / N, 0.0001)
|
|
123
|
+
|
|
124
|
+
return test_array_inner
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def test_array_inner_empty(test, device):
|
|
128
|
+
values = wp.array([], device=device, dtype=wp.vec2)
|
|
129
|
+
test.assertEqual(array_inner(values, values), 0.0)
|
|
130
|
+
|
|
131
|
+
values = wp.array([], shape=(0, 3), device=device, dtype=float)
|
|
132
|
+
assert_np_equal(array_inner(values, values, axis=0).numpy(), np.zeros((1, 3)))
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
devices = get_test_devices()
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class TestArrayReduce(unittest.TestCase):
|
|
139
|
+
pass
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
add_function_test(TestArrayReduce, "test_array_sum_double", make_test_array_sum(wp.float64), devices=devices)
|
|
143
|
+
add_function_test(TestArrayReduce, "test_array_sum_vec3", make_test_array_sum(wp.vec3), devices=devices)
|
|
144
|
+
add_function_test(TestArrayReduce, "test_array_sum_axis_float", make_test_array_sum_axis(wp.float32), devices=devices)
|
|
145
|
+
add_function_test(TestArrayReduce, "test_array_sum_empty", test_array_sum_empty, devices=devices)
|
|
146
|
+
add_function_test(TestArrayReduce, "test_array_inner_double", make_test_array_inner(wp.float64), devices=devices)
|
|
147
|
+
add_function_test(TestArrayReduce, "test_array_inner_vec3", make_test_array_inner(wp.vec3), devices=devices)
|
|
148
|
+
add_function_test(
|
|
149
|
+
TestArrayReduce, "test_array_inner_axis_float", make_test_array_inner_axis(wp.float32), devices=devices
|
|
150
|
+
)
|
|
151
|
+
add_function_test(TestArrayReduce, "test_array_inner_empty", test_array_inner_empty, devices=devices)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
if __name__ == "__main__":
|
|
155
|
+
wp.clear_kernel_cache()
|
|
156
|
+
unittest.main(verbosity=2)
|
|
@@ -0,0 +1,303 @@
|
|
|
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
|
+
import warp as wp
|
|
19
|
+
from warp.tests.unittest_utils import *
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@wp.kernel
|
|
23
|
+
def expect_ones(a: wp.array(dtype=int)):
|
|
24
|
+
i = wp.tid()
|
|
25
|
+
|
|
26
|
+
assert a[i] == 1
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@wp.kernel
|
|
30
|
+
def expect_ones_with_msg(a: wp.array(dtype=int)):
|
|
31
|
+
i = wp.tid()
|
|
32
|
+
|
|
33
|
+
assert a[i] == 1, "Array element must be 1"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@wp.kernel
|
|
37
|
+
def expect_ones_compound(a: wp.array(dtype=int)):
|
|
38
|
+
i = wp.tid()
|
|
39
|
+
|
|
40
|
+
assert a[i] > 0 and a[i] < 2
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@wp.func
|
|
44
|
+
def expect_ones_function(value: int):
|
|
45
|
+
assert value == 1, "Array element must be 1"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@wp.kernel
|
|
49
|
+
def expect_ones_call_function(a: wp.array(dtype=int)):
|
|
50
|
+
i = wp.tid()
|
|
51
|
+
expect_ones_function(a[i])
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class TestAssertRelease(unittest.TestCase):
|
|
55
|
+
"""Assert test cases that are to be run with Warp in release mode."""
|
|
56
|
+
|
|
57
|
+
@classmethod
|
|
58
|
+
def setUpClass(cls):
|
|
59
|
+
cls._saved_mode = wp.get_module_options()["mode"]
|
|
60
|
+
cls._saved_cache_kernels = wp.config.cache_kernels
|
|
61
|
+
|
|
62
|
+
wp.config.mode = "release"
|
|
63
|
+
wp.config.cache_kernels = False
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def tearDownClass(cls):
|
|
67
|
+
wp.set_module_options({"mode": cls._saved_mode})
|
|
68
|
+
wp.config.cache_kernels = cls._saved_cache_kernels
|
|
69
|
+
|
|
70
|
+
def test_basic_assert_false_condition(self):
|
|
71
|
+
with wp.ScopedDevice("cpu"):
|
|
72
|
+
wp.load_module(device=wp.get_device())
|
|
73
|
+
|
|
74
|
+
input_array = wp.zeros(1, dtype=int)
|
|
75
|
+
|
|
76
|
+
capture = StdErrCapture()
|
|
77
|
+
capture.begin()
|
|
78
|
+
|
|
79
|
+
wp.launch(expect_ones, input_array.shape, inputs=[input_array])
|
|
80
|
+
|
|
81
|
+
output = capture.end()
|
|
82
|
+
|
|
83
|
+
self.assertEqual(output, "", f"Kernel should not print anything to stderr, got {output}")
|
|
84
|
+
|
|
85
|
+
def test_basic_assert_with_msg(self):
|
|
86
|
+
with wp.ScopedDevice("cpu"):
|
|
87
|
+
wp.load_module(device=wp.get_device())
|
|
88
|
+
|
|
89
|
+
input_array = wp.zeros(1, dtype=int)
|
|
90
|
+
|
|
91
|
+
capture = StdErrCapture()
|
|
92
|
+
capture.begin()
|
|
93
|
+
|
|
94
|
+
wp.launch(expect_ones_with_msg, input_array.shape, inputs=[input_array])
|
|
95
|
+
|
|
96
|
+
output = capture.end()
|
|
97
|
+
|
|
98
|
+
self.assertEqual(output, "", f"Kernel should not print anything to stderr, got {output}")
|
|
99
|
+
|
|
100
|
+
def test_compound_assert_false_condition(self):
|
|
101
|
+
with wp.ScopedDevice("cpu"):
|
|
102
|
+
wp.load_module(device=wp.get_device())
|
|
103
|
+
|
|
104
|
+
input_array = wp.full(1, value=3, dtype=int)
|
|
105
|
+
|
|
106
|
+
capture = StdErrCapture()
|
|
107
|
+
capture.begin()
|
|
108
|
+
|
|
109
|
+
wp.launch(expect_ones_compound, input_array.shape, inputs=[input_array])
|
|
110
|
+
|
|
111
|
+
output = capture.end()
|
|
112
|
+
|
|
113
|
+
self.assertEqual(output, "", f"Kernel should not print anything to stderr, got {output}")
|
|
114
|
+
|
|
115
|
+
def test_basic_assert_false_condition_function(self):
|
|
116
|
+
with wp.ScopedDevice("cpu"):
|
|
117
|
+
wp.load_module(device=wp.get_device())
|
|
118
|
+
|
|
119
|
+
input_array = wp.full(1, value=3, dtype=int)
|
|
120
|
+
|
|
121
|
+
capture = StdErrCapture()
|
|
122
|
+
capture.begin()
|
|
123
|
+
|
|
124
|
+
wp.launch(expect_ones_call_function, input_array.shape, inputs=[input_array])
|
|
125
|
+
|
|
126
|
+
output = capture.end()
|
|
127
|
+
|
|
128
|
+
self.assertEqual(output, "", f"Kernel should not print anything to stderr, got {output}")
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
# NOTE: Failed assertions on CUDA devices leaves the CUDA context in an unrecoverable state,
|
|
132
|
+
# so we currently do not test them.
|
|
133
|
+
class TestAssertDebug(unittest.TestCase):
|
|
134
|
+
"""Assert test cases that are to be run with Warp in debug mode."""
|
|
135
|
+
|
|
136
|
+
@classmethod
|
|
137
|
+
def setUpClass(cls):
|
|
138
|
+
cls._saved_mode = wp.get_module_options()["mode"]
|
|
139
|
+
cls._saved_cache_kernels = wp.config.cache_kernels
|
|
140
|
+
|
|
141
|
+
wp.set_module_options({"mode": "debug"})
|
|
142
|
+
wp.config.cache_kernels = False
|
|
143
|
+
|
|
144
|
+
@classmethod
|
|
145
|
+
def tearDownClass(cls):
|
|
146
|
+
wp.set_module_options({"mode": cls._saved_mode})
|
|
147
|
+
wp.config.cache_kernels = cls._saved_cache_kernels
|
|
148
|
+
|
|
149
|
+
def test_basic_assert_false_condition(self):
|
|
150
|
+
with wp.ScopedDevice("cpu"):
|
|
151
|
+
wp.load_module(device=wp.get_device())
|
|
152
|
+
|
|
153
|
+
input_array = wp.zeros(1, dtype=int)
|
|
154
|
+
|
|
155
|
+
capture = StdErrCapture()
|
|
156
|
+
capture.begin()
|
|
157
|
+
|
|
158
|
+
wp.launch(expect_ones, input_array.shape, inputs=[input_array])
|
|
159
|
+
|
|
160
|
+
output = capture.end()
|
|
161
|
+
|
|
162
|
+
# Older Windows C runtimes have a bug where stdout sometimes does not get properly flushed.
|
|
163
|
+
if output != "" or sys.platform != "win32":
|
|
164
|
+
self.assertRegex(output, r"Assertion failed: .*assert a\[i\] == 1")
|
|
165
|
+
|
|
166
|
+
def test_basic_assert_true_condition(self):
|
|
167
|
+
with wp.ScopedDevice("cpu"):
|
|
168
|
+
wp.load_module(device=wp.get_device())
|
|
169
|
+
|
|
170
|
+
input_array = wp.ones(1, dtype=int)
|
|
171
|
+
|
|
172
|
+
capture = StdErrCapture()
|
|
173
|
+
capture.begin()
|
|
174
|
+
|
|
175
|
+
wp.launch(expect_ones, input_array.shape, inputs=[input_array])
|
|
176
|
+
|
|
177
|
+
output = capture.end()
|
|
178
|
+
|
|
179
|
+
self.assertEqual(output, "", f"Kernel should not print anything to stderr, got {output}")
|
|
180
|
+
|
|
181
|
+
def test_basic_assert_with_msg(self):
|
|
182
|
+
with wp.ScopedDevice("cpu"):
|
|
183
|
+
wp.load_module(device=wp.get_device())
|
|
184
|
+
|
|
185
|
+
input_array = wp.zeros(1, dtype=int)
|
|
186
|
+
|
|
187
|
+
capture = StdErrCapture()
|
|
188
|
+
capture.begin()
|
|
189
|
+
|
|
190
|
+
wp.launch(expect_ones_with_msg, input_array.shape, inputs=[input_array])
|
|
191
|
+
|
|
192
|
+
output = capture.end()
|
|
193
|
+
|
|
194
|
+
# Older Windows C runtimes have a bug where stdout sometimes does not get properly flushed.
|
|
195
|
+
if output != "" or sys.platform != "win32":
|
|
196
|
+
self.assertRegex(output, r"Assertion failed: .*assert a\[i\] == 1.*Array element must be 1")
|
|
197
|
+
|
|
198
|
+
def test_compound_assert_true_condition(self):
|
|
199
|
+
with wp.ScopedDevice("cpu"):
|
|
200
|
+
wp.load_module(device=wp.get_device())
|
|
201
|
+
|
|
202
|
+
input_array = wp.ones(1, dtype=int)
|
|
203
|
+
|
|
204
|
+
capture = StdErrCapture()
|
|
205
|
+
capture.begin()
|
|
206
|
+
|
|
207
|
+
wp.launch(expect_ones_compound, input_array.shape, inputs=[input_array])
|
|
208
|
+
|
|
209
|
+
output = capture.end()
|
|
210
|
+
|
|
211
|
+
self.assertEqual(output, "", f"Kernel should not print anything to stderr, got {output}")
|
|
212
|
+
|
|
213
|
+
def test_compound_assert_false_condition(self):
|
|
214
|
+
with wp.ScopedDevice("cpu"):
|
|
215
|
+
wp.load_module(device=wp.get_device())
|
|
216
|
+
|
|
217
|
+
input_array = wp.full(1, value=3, dtype=int)
|
|
218
|
+
|
|
219
|
+
capture = StdErrCapture()
|
|
220
|
+
capture.begin()
|
|
221
|
+
|
|
222
|
+
wp.launch(expect_ones_compound, input_array.shape, inputs=[input_array])
|
|
223
|
+
|
|
224
|
+
output = capture.end()
|
|
225
|
+
|
|
226
|
+
# Older Windows C runtimes have a bug where stdout sometimes does not get properly flushed.
|
|
227
|
+
if output != "" or sys.platform != "win32":
|
|
228
|
+
self.assertRegex(output, r"Assertion failed: .*assert a\[i\] > 0 and a\[i\] < 2")
|
|
229
|
+
|
|
230
|
+
def test_basic_assert_false_condition_function(self):
|
|
231
|
+
with wp.ScopedDevice("cpu"):
|
|
232
|
+
wp.load_module(device=wp.get_device())
|
|
233
|
+
|
|
234
|
+
input_array = wp.full(1, value=3, dtype=int)
|
|
235
|
+
|
|
236
|
+
capture = StdErrCapture()
|
|
237
|
+
capture.begin()
|
|
238
|
+
|
|
239
|
+
wp.launch(expect_ones_call_function, input_array.shape, inputs=[input_array])
|
|
240
|
+
|
|
241
|
+
output = capture.end()
|
|
242
|
+
|
|
243
|
+
# Older Windows C runtimes have a bug where stdout sometimes does not get properly flushed.
|
|
244
|
+
if output != "" or sys.platform != "win32":
|
|
245
|
+
self.assertRegex(output, r"Assertion failed: .*assert value == 1.*Array element must be 1")
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
class TestAssertModeSwitch(unittest.TestCase):
|
|
249
|
+
"""Test that switching from release mode to debug mode rebuilds the module with assertions enabled."""
|
|
250
|
+
|
|
251
|
+
@classmethod
|
|
252
|
+
def setUpClass(cls):
|
|
253
|
+
cls._saved_mode = wp.config.mode
|
|
254
|
+
cls._saved_mode_module = wp.get_module_options()["mode"]
|
|
255
|
+
cls._saved_cache_kernels = wp.config.cache_kernels
|
|
256
|
+
|
|
257
|
+
# Don't set any mode initially - use whatever the default is
|
|
258
|
+
wp.config.cache_kernels = False
|
|
259
|
+
|
|
260
|
+
@classmethod
|
|
261
|
+
def tearDownClass(cls):
|
|
262
|
+
wp.config.mode = cls._saved_mode
|
|
263
|
+
wp.set_module_options({"mode": cls._saved_mode_module})
|
|
264
|
+
wp.config.cache_kernels = cls._saved_cache_kernels
|
|
265
|
+
|
|
266
|
+
def test_switch_to_debug_mode(self):
|
|
267
|
+
"""Test that switching from release mode to debug mode rebuilds the module with assertions enabled."""
|
|
268
|
+
with wp.ScopedDevice("cpu"):
|
|
269
|
+
# Create an array that will trigger an assertion
|
|
270
|
+
input_array = wp.zeros(1, dtype=int)
|
|
271
|
+
|
|
272
|
+
# In default mode, this should not assert
|
|
273
|
+
capture = StdErrCapture()
|
|
274
|
+
capture.begin()
|
|
275
|
+
wp.launch(expect_ones, input_array.shape, inputs=[input_array])
|
|
276
|
+
output = capture.end()
|
|
277
|
+
|
|
278
|
+
# Should not have any assertion output in release mode
|
|
279
|
+
self.assertEqual(output, "", f"Kernel should not print anything to stderr in release mode, got {output}")
|
|
280
|
+
|
|
281
|
+
# Now switch to debug mode and have it compile a new kernel
|
|
282
|
+
wp.config.mode = "debug"
|
|
283
|
+
|
|
284
|
+
@wp.kernel
|
|
285
|
+
def expect_ones_debug(a: wp.array(dtype=int)):
|
|
286
|
+
i = wp.tid()
|
|
287
|
+
assert a[i] == 1
|
|
288
|
+
|
|
289
|
+
# In debug mode, this should assert
|
|
290
|
+
capture = StdErrCapture()
|
|
291
|
+
capture.begin()
|
|
292
|
+
wp.launch(expect_ones_debug, input_array.shape, inputs=[input_array])
|
|
293
|
+
output = capture.end()
|
|
294
|
+
|
|
295
|
+
# Should have assertion output in debug mode
|
|
296
|
+
# Older Windows C runtimes have a bug where stdout sometimes does not get properly flushed.
|
|
297
|
+
if output != "" or sys.platform != "win32":
|
|
298
|
+
self.assertRegex(output, r"Assertion failed: .*assert a\[i\] == 1")
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
if __name__ == "__main__":
|
|
302
|
+
wp.clear_kernel_cache()
|
|
303
|
+
unittest.main(verbosity=2)
|