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,127 @@
|
|
|
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
|
+
from warp.tests.unittest_utils import *
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_devices_get_cuda_device_functions(test, device):
|
|
23
|
+
test.assertTrue(device.is_cuda)
|
|
24
|
+
test.assertTrue(wp.is_device_available(device))
|
|
25
|
+
|
|
26
|
+
device_ordinal = device.ordinal
|
|
27
|
+
current_device = wp.get_cuda_device(device_ordinal)
|
|
28
|
+
test.assertEqual(current_device, device)
|
|
29
|
+
current_device = wp.get_cuda_device() # No-ordinal version
|
|
30
|
+
test.assertTrue(wp.is_device_available(current_device))
|
|
31
|
+
|
|
32
|
+
if device == current_device:
|
|
33
|
+
test.assertEqual(device, "cuda")
|
|
34
|
+
else:
|
|
35
|
+
test.assertNotEqual(device, "cuda")
|
|
36
|
+
|
|
37
|
+
preferred_device = wp.get_preferred_device()
|
|
38
|
+
test.assertTrue(wp.is_device_available(preferred_device))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_devices_map_cuda_device(test, device):
|
|
42
|
+
with wp.ScopedDevice(device):
|
|
43
|
+
saved_alias = device.alias
|
|
44
|
+
# Map alias twice to check code path
|
|
45
|
+
wp.map_cuda_device("new_alias")
|
|
46
|
+
wp.map_cuda_device("new_alias")
|
|
47
|
+
wp._src.context.runtime.rename_device(device, saved_alias)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def test_devices_verify_cuda_device(test, device):
|
|
51
|
+
verify_cuda_saved = wp.config.verify_cuda
|
|
52
|
+
|
|
53
|
+
wp.config.verify_cuda = True
|
|
54
|
+
|
|
55
|
+
wp._src.context.runtime.verify_cuda_device(device)
|
|
56
|
+
|
|
57
|
+
wp.config.verify_cuda = verify_cuda_saved
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@unittest.skipUnless(wp.is_cuda_available(), "Requires CUDA")
|
|
61
|
+
def test_devices_can_access_self(test, device):
|
|
62
|
+
test.assertTrue(device.can_access(device))
|
|
63
|
+
|
|
64
|
+
for warp_device in wp.get_devices():
|
|
65
|
+
device_str = str(warp_device)
|
|
66
|
+
|
|
67
|
+
if (device.is_cpu and warp_device.is_cuda) or (device.is_cuda and warp_device.is_cpu):
|
|
68
|
+
test.assertFalse(device.can_access(warp_device))
|
|
69
|
+
test.assertNotEqual(device, warp_device)
|
|
70
|
+
test.assertNotEqual(device, device_str)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_devices_sm_count(test, device):
|
|
74
|
+
if device.is_cuda:
|
|
75
|
+
test.assertTrue(device.sm_count > 0)
|
|
76
|
+
else:
|
|
77
|
+
test.assertEqual(device.sm_count, 0)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
devices = get_test_devices()
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class TestDevices(unittest.TestCase):
|
|
84
|
+
def test_devices_unmap_imaginary_device(self):
|
|
85
|
+
with self.assertRaises(RuntimeError):
|
|
86
|
+
wp.unmap_cuda_device("imaginary_device:0")
|
|
87
|
+
|
|
88
|
+
def test_devices_get_cuda_supported_archs(self):
|
|
89
|
+
if not wp.is_cuda_available():
|
|
90
|
+
self.assertEqual(wp.get_cuda_supported_archs(), [], "Should return empty list when CUDA is not available")
|
|
91
|
+
else:
|
|
92
|
+
archs = wp.get_cuda_supported_archs()
|
|
93
|
+
self.assertTrue(len(archs) > 0, "No CUDA supported architectures found")
|
|
94
|
+
|
|
95
|
+
# Check all elements are integers
|
|
96
|
+
for arch in archs:
|
|
97
|
+
self.assertIsInstance(arch, int, f"Architecture value {arch} should be an integer")
|
|
98
|
+
|
|
99
|
+
# Check the list is sorted
|
|
100
|
+
self.assertEqual(archs, sorted(archs), "Architecture list should be sorted")
|
|
101
|
+
|
|
102
|
+
# Check for no duplicates
|
|
103
|
+
self.assertEqual(len(archs), len(set(archs)), "Architecture list should not contain duplicates")
|
|
104
|
+
|
|
105
|
+
# Check values are reasonable (modern CUDA architectures are >= 50)
|
|
106
|
+
for arch in archs:
|
|
107
|
+
self.assertGreaterEqual(arch, 50, f"Architecture {arch} should be >= 50 (e.g., sm_50)")
|
|
108
|
+
self.assertLessEqual(arch, 150, f"Architecture {arch} seems unreasonably high")
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
add_function_test(
|
|
112
|
+
TestDevices,
|
|
113
|
+
"test_devices_get_cuda_device_functions",
|
|
114
|
+
test_devices_get_cuda_device_functions,
|
|
115
|
+
devices=get_selected_cuda_test_devices(),
|
|
116
|
+
)
|
|
117
|
+
add_function_test(
|
|
118
|
+
TestDevices, "test_devices_map_cuda_device", test_devices_map_cuda_device, devices=get_selected_cuda_test_devices()
|
|
119
|
+
)
|
|
120
|
+
add_function_test(TestDevices, "test_devices_verify_cuda_device", test_devices_verify_cuda_device, devices=devices)
|
|
121
|
+
add_function_test(TestDevices, "test_devices_can_access_self", test_devices_can_access_self, devices=devices)
|
|
122
|
+
add_function_test(TestDevices, "test_devices_sm_count", test_devices_sm_count, devices=devices)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
if __name__ == "__main__":
|
|
126
|
+
wp.clear_kernel_cache()
|
|
127
|
+
unittest.main(verbosity=2)
|
warp/tests/test_enum.py
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 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 enum
|
|
17
|
+
import unittest
|
|
18
|
+
|
|
19
|
+
import warp as wp
|
|
20
|
+
from warp.tests.unittest_utils import *
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class MyIntEnum(enum.IntEnum):
|
|
24
|
+
A = 1
|
|
25
|
+
B = 2
|
|
26
|
+
C = 3
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class MyIntFlag(enum.IntFlag):
|
|
30
|
+
A = 1
|
|
31
|
+
B = enum.auto()
|
|
32
|
+
C = enum.auto()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_intenum_ints(test, device):
|
|
36
|
+
@wp.kernel
|
|
37
|
+
def expect_intenum_ints():
|
|
38
|
+
wp.expect_eq(MyIntEnum.A, 1)
|
|
39
|
+
wp.expect_eq(MyIntEnum.B, 2)
|
|
40
|
+
wp.expect_eq(MyIntEnum.C, 3)
|
|
41
|
+
wp.expect_eq(MyIntEnum.A + MyIntEnum.B, MyIntEnum.C)
|
|
42
|
+
|
|
43
|
+
wp.launch(expect_intenum_ints, dim=1, device=device)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def test_intflag_ints(test, device):
|
|
47
|
+
@wp.kernel
|
|
48
|
+
def expect_intflag_ints():
|
|
49
|
+
wp.expect_eq(MyIntFlag.A, 1)
|
|
50
|
+
wp.expect_eq(MyIntFlag.B, 2)
|
|
51
|
+
wp.expect_eq(MyIntFlag.C, 4)
|
|
52
|
+
wp.expect_eq(MyIntFlag.A | MyIntFlag.B, 3)
|
|
53
|
+
wp.expect_eq(MyIntFlag.A | MyIntFlag.B | MyIntFlag.C, 7)
|
|
54
|
+
|
|
55
|
+
wp.launch(expect_intflag_ints, dim=1, device=device)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_alternative_accessors(test, device):
|
|
59
|
+
@wp.kernel
|
|
60
|
+
def expect_alternative_accessors():
|
|
61
|
+
wp.expect_eq(int(MyIntEnum.A), 1)
|
|
62
|
+
wp.expect_eq(int(MyIntEnum.B.value), 2)
|
|
63
|
+
wp.expect_eq(MyIntEnum.C.value, 3)
|
|
64
|
+
wp.expect_eq(MyIntEnum.A + int(MyIntEnum.B) + 0, MyIntEnum.C)
|
|
65
|
+
wp.expect_eq(int(MyIntFlag.A), 1)
|
|
66
|
+
wp.expect_eq(int(MyIntFlag.B.value), 2)
|
|
67
|
+
wp.expect_eq(MyIntFlag.C.value, 4)
|
|
68
|
+
wp.expect_eq(MyIntFlag.A | int(MyIntFlag.B), 3)
|
|
69
|
+
wp.expect_eq(MyIntFlag.A | MyIntFlag.B.value | MyIntFlag.C, 7)
|
|
70
|
+
|
|
71
|
+
wp.launch(expect_alternative_accessors, dim=1, device=device)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def test_static_accessors(test, device):
|
|
75
|
+
@wp.kernel
|
|
76
|
+
def expect_static_accessors():
|
|
77
|
+
wp.expect_eq(wp.static(MyIntEnum.A), 1)
|
|
78
|
+
wp.expect_eq(wp.static(int(MyIntEnum.A)), 1)
|
|
79
|
+
wp.expect_eq(wp.static(MyIntEnum.A.value), 1)
|
|
80
|
+
wp.expect_eq(wp.static(MyIntFlag.A), 1)
|
|
81
|
+
wp.expect_eq(wp.static(int(MyIntFlag.A)), 1)
|
|
82
|
+
wp.expect_eq(wp.static(MyIntFlag.A.value), 1)
|
|
83
|
+
|
|
84
|
+
wp.launch(expect_static_accessors, dim=1, device=device)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def test_intflag_compare(test, device):
|
|
88
|
+
@wp.kernel
|
|
89
|
+
def compute_intflag_compare(ins: wp.array(dtype=wp.int32), outs: wp.array(dtype=wp.int32)):
|
|
90
|
+
tid = wp.tid()
|
|
91
|
+
if ins[tid] & MyIntFlag.A:
|
|
92
|
+
outs[tid] += MyIntFlag.A
|
|
93
|
+
if ins[tid] & MyIntFlag.B:
|
|
94
|
+
outs[tid] += MyIntFlag.B
|
|
95
|
+
if ins[tid] & MyIntFlag.C:
|
|
96
|
+
outs[tid] += MyIntFlag.C
|
|
97
|
+
|
|
98
|
+
with wp.ScopedDevice(device):
|
|
99
|
+
ins = wp.array(
|
|
100
|
+
[
|
|
101
|
+
0,
|
|
102
|
+
MyIntFlag.A,
|
|
103
|
+
MyIntFlag.B,
|
|
104
|
+
MyIntFlag.C,
|
|
105
|
+
MyIntFlag.A | MyIntFlag.B,
|
|
106
|
+
MyIntFlag.A | MyIntFlag.B | MyIntFlag.C,
|
|
107
|
+
],
|
|
108
|
+
dtype=wp.int32,
|
|
109
|
+
)
|
|
110
|
+
outs = wp.zeros(len(ins), dtype=wp.int32)
|
|
111
|
+
wp.launch(compute_intflag_compare, dim=len(ins), inputs=[ins], outputs=[outs])
|
|
112
|
+
outs = outs.numpy()
|
|
113
|
+
test.assertEqual(outs[0], 0)
|
|
114
|
+
test.assertEqual(outs[1], 1)
|
|
115
|
+
test.assertEqual(outs[2], 2)
|
|
116
|
+
test.assertEqual(outs[3], 4)
|
|
117
|
+
test.assertEqual(outs[4], 3)
|
|
118
|
+
test.assertEqual(outs[5], 7)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class TestEnum(unittest.TestCase):
|
|
122
|
+
pass
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
devices = get_test_devices()
|
|
126
|
+
|
|
127
|
+
add_function_test(TestEnum, "test_intenum_ints", test_intenum_ints, devices=devices)
|
|
128
|
+
add_function_test(TestEnum, "test_intflag_ints", test_intflag_ints, devices=devices)
|
|
129
|
+
add_function_test(TestEnum, "test_intflag_compare", test_intflag_compare, devices=devices)
|
|
130
|
+
add_function_test(TestEnum, "test_alternative_accessors", test_alternative_accessors, devices=devices)
|
|
131
|
+
add_function_test(TestEnum, "test_static_accessors", test_static_accessors, devices=devices)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
if __name__ == "__main__":
|
|
135
|
+
wp.clear_kernel_cache()
|
|
136
|
+
unittest.main(verbosity=2)
|
|
@@ -0,0 +1,424 @@
|
|
|
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
|
+
"""Test Warp examples with unittest.
|
|
16
|
+
|
|
17
|
+
This module tests the Warp examples registered in it using the unittest
|
|
18
|
+
framework. When registering tests with add_example_test(), three optional
|
|
19
|
+
dictionaries can be provided: test_options, test_options_cuda, and
|
|
20
|
+
test_options_cpu. These are added to the command line arguments in-order, so
|
|
21
|
+
if a parameter is specified in both test_options and test_options_cuda, the
|
|
22
|
+
one in test_options_cuda will take precedence due to how argparse works.
|
|
23
|
+
|
|
24
|
+
Generally the test_options[_cpu,_cuda] dictionaries should be used to prevent
|
|
25
|
+
graphical windows from being open by the example {"headless": True} and to
|
|
26
|
+
override example defaults so the example can run in less than ten seconds.
|
|
27
|
+
|
|
28
|
+
To skip tests if the optional dependencies are not found, use the following keys:
|
|
29
|
+
- {"usd_required": True} (requires usd-core)
|
|
30
|
+
- {"torch_required": True} (requires torch)
|
|
31
|
+
- {"pillow_required": True} (requires pillow)
|
|
32
|
+
|
|
33
|
+
Use the "num_frames" and "train_iters" keys to control the number of steps.
|
|
34
|
+
|
|
35
|
+
Use "test_timeout" to override the default test timeout threshold of 600 seconds.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
import os
|
|
39
|
+
import platform
|
|
40
|
+
import subprocess
|
|
41
|
+
import sys
|
|
42
|
+
import unittest
|
|
43
|
+
from typing import Any, Dict, Optional, Type
|
|
44
|
+
|
|
45
|
+
import warp as wp
|
|
46
|
+
import warp.tests.unittest_utils
|
|
47
|
+
from warp._src.utils import check_p2p
|
|
48
|
+
from warp.tests.unittest_utils import (
|
|
49
|
+
USD_AVAILABLE,
|
|
50
|
+
get_selected_cuda_test_devices,
|
|
51
|
+
get_test_devices,
|
|
52
|
+
sanitize_identifier,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _build_command_line_options(test_options: Dict[str, Any]) -> list:
|
|
57
|
+
"""Helper function to build command-line options from the test options dictionary."""
|
|
58
|
+
additional_options = []
|
|
59
|
+
|
|
60
|
+
for key, value in test_options.items():
|
|
61
|
+
if key == "headless" and value:
|
|
62
|
+
additional_options.extend(["--headless"])
|
|
63
|
+
else:
|
|
64
|
+
# Just add --key value
|
|
65
|
+
additional_options.extend(["--" + key, str(value)])
|
|
66
|
+
|
|
67
|
+
return additional_options
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _merge_options(base_options: Dict[str, Any], device_options: Dict[str, Any]) -> Dict[str, Any]:
|
|
71
|
+
"""Helper function to merge base test options with device-specific test options."""
|
|
72
|
+
merged_options = base_options.copy()
|
|
73
|
+
|
|
74
|
+
# Update options with device-specific dictionary, overwriting existing keys with the more-specific values
|
|
75
|
+
merged_options.update(device_options)
|
|
76
|
+
return merged_options
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def add_example_test(
|
|
80
|
+
cls: Type,
|
|
81
|
+
name: str,
|
|
82
|
+
devices: Optional[list] = None,
|
|
83
|
+
test_options: Optional[Dict[str, Any]] = None,
|
|
84
|
+
test_options_cpu: Optional[Dict[str, Any]] = None,
|
|
85
|
+
test_options_cuda: Optional[Dict[str, Any]] = None,
|
|
86
|
+
):
|
|
87
|
+
"""Registers a Warp example to run on ``devices`` as a TestCase."""
|
|
88
|
+
|
|
89
|
+
if test_options is None:
|
|
90
|
+
test_options = {}
|
|
91
|
+
if test_options_cpu is None:
|
|
92
|
+
test_options_cpu = {}
|
|
93
|
+
if test_options_cuda is None:
|
|
94
|
+
test_options_cuda = {}
|
|
95
|
+
|
|
96
|
+
def run(test, device):
|
|
97
|
+
if wp.get_device(device).is_cuda:
|
|
98
|
+
options = _merge_options(test_options, test_options_cuda)
|
|
99
|
+
else:
|
|
100
|
+
options = _merge_options(test_options, test_options_cpu)
|
|
101
|
+
|
|
102
|
+
# Mark the test as skipped if Torch is not installed but required
|
|
103
|
+
torch_required = options.pop("torch_required", False)
|
|
104
|
+
if torch_required:
|
|
105
|
+
try:
|
|
106
|
+
import torch
|
|
107
|
+
|
|
108
|
+
if wp.get_device(device).is_cuda and not torch.cuda.is_available():
|
|
109
|
+
# Ensure torch has CUDA support
|
|
110
|
+
test.skipTest("Torch not compiled with CUDA support")
|
|
111
|
+
|
|
112
|
+
except Exception as e:
|
|
113
|
+
test.skipTest(f"{e}")
|
|
114
|
+
|
|
115
|
+
# Mark the test as skipped if USD is not installed but required
|
|
116
|
+
usd_required = options.pop("usd_required", False)
|
|
117
|
+
if usd_required and not USD_AVAILABLE:
|
|
118
|
+
test.skipTest("Requires usd-core")
|
|
119
|
+
|
|
120
|
+
# Mark the test as skipped if pillow is not installed but required
|
|
121
|
+
pillow_required = options.pop("pillow_required", False)
|
|
122
|
+
if pillow_required:
|
|
123
|
+
try:
|
|
124
|
+
import PIL # noqa: F401
|
|
125
|
+
except ImportError:
|
|
126
|
+
test.skipTest("Requires pillow")
|
|
127
|
+
|
|
128
|
+
# Find the current Warp cache
|
|
129
|
+
warp_cache_path = wp.config.kernel_cache_dir
|
|
130
|
+
|
|
131
|
+
env_vars = os.environ.copy()
|
|
132
|
+
if warp_cache_path is not None:
|
|
133
|
+
env_vars["WARP_CACHE_PATH"] = warp_cache_path
|
|
134
|
+
|
|
135
|
+
if warp.tests.unittest_utils.coverage_enabled:
|
|
136
|
+
import tempfile
|
|
137
|
+
|
|
138
|
+
# Generate a random coverage data file name - file is deleted along with containing directory
|
|
139
|
+
with tempfile.NamedTemporaryFile(
|
|
140
|
+
dir=warp.tests.unittest_utils.coverage_temp_dir, delete=False
|
|
141
|
+
) as coverage_file:
|
|
142
|
+
pass
|
|
143
|
+
|
|
144
|
+
command = ["coverage", "run", f"--data-file={coverage_file.name}"]
|
|
145
|
+
|
|
146
|
+
if warp.tests.unittest_utils.coverage_branch:
|
|
147
|
+
command.append("--branch")
|
|
148
|
+
|
|
149
|
+
else:
|
|
150
|
+
command = [sys.executable]
|
|
151
|
+
|
|
152
|
+
# Append Warp commands
|
|
153
|
+
command.extend(["-m", f"warp.examples.{name}", "--device", str(device)])
|
|
154
|
+
|
|
155
|
+
stage_path = (
|
|
156
|
+
options.pop(
|
|
157
|
+
"stage_path",
|
|
158
|
+
os.path.join(os.path.dirname(__file__), f"outputs/{name}_{sanitize_identifier(device)}.usd"),
|
|
159
|
+
)
|
|
160
|
+
if USD_AVAILABLE
|
|
161
|
+
else "None"
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
if stage_path:
|
|
165
|
+
command.extend(["--stage_path", stage_path])
|
|
166
|
+
try:
|
|
167
|
+
os.remove(stage_path)
|
|
168
|
+
except OSError:
|
|
169
|
+
pass
|
|
170
|
+
|
|
171
|
+
command.extend(_build_command_line_options(options))
|
|
172
|
+
|
|
173
|
+
# Set the test timeout in seconds
|
|
174
|
+
test_timeout = options.pop("test_timeout", 600)
|
|
175
|
+
|
|
176
|
+
# with wp.ScopedTimer(f"{name}_{sanitize_identifier(device)}"):
|
|
177
|
+
# Run the script as a subprocess
|
|
178
|
+
result = subprocess.run(
|
|
179
|
+
command, capture_output=True, text=True, env=env_vars, timeout=test_timeout, check=False
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
# Check the return code (0 is standard for success)
|
|
183
|
+
test.assertEqual(
|
|
184
|
+
result.returncode,
|
|
185
|
+
0,
|
|
186
|
+
msg=f"Failed with return code {result.returncode}, command: {' '.join(command)}\n\nOutput:\n{result.stdout}\n{result.stderr}",
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
# If the test succeeded, try to clean up the output by default
|
|
190
|
+
if stage_path and result.returncode == 0:
|
|
191
|
+
try:
|
|
192
|
+
os.remove(stage_path)
|
|
193
|
+
except OSError:
|
|
194
|
+
pass
|
|
195
|
+
|
|
196
|
+
from warp.tests.unittest_utils import add_function_test
|
|
197
|
+
|
|
198
|
+
add_function_test(cls, f"test_{name}", run, devices=devices, check_output=False)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
cuda_test_devices = get_selected_cuda_test_devices(mode="basic") # Don't test on multiple GPUs to save time
|
|
202
|
+
test_devices = get_test_devices(mode="basic")
|
|
203
|
+
|
|
204
|
+
# NOTE: To give the parallel test runner more opportunities to parallelize test cases,
|
|
205
|
+
# we break up the tests into multiple TestCase classes
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
class TestCoreExamples(unittest.TestCase):
|
|
209
|
+
pass
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
# Exclude unless we can run headless somehow
|
|
213
|
+
# add_example_test(TestCoreExamples, name="example_render_opengl")
|
|
214
|
+
|
|
215
|
+
add_example_test(TestCoreExamples, name="core.example_dem", devices=test_devices, test_options_cpu={"num_frames": 2})
|
|
216
|
+
add_example_test(
|
|
217
|
+
TestCoreExamples,
|
|
218
|
+
name="core.example_fluid",
|
|
219
|
+
devices=test_devices,
|
|
220
|
+
test_options={"num_frames": 100, "headless": True},
|
|
221
|
+
)
|
|
222
|
+
add_example_test(
|
|
223
|
+
TestCoreExamples,
|
|
224
|
+
name="core.example_graph_capture",
|
|
225
|
+
devices=test_devices,
|
|
226
|
+
test_options={"headless": True},
|
|
227
|
+
test_options_cpu={"num_frames": 100},
|
|
228
|
+
)
|
|
229
|
+
add_example_test(TestCoreExamples, name="core.example_marching_cubes", devices=cuda_test_devices)
|
|
230
|
+
add_example_test(TestCoreExamples, name="core.example_mesh", devices=test_devices, test_options={"usd_required": True})
|
|
231
|
+
add_example_test(
|
|
232
|
+
TestCoreExamples, name="core.example_mesh_intersect", devices=test_devices, test_options={"usd_required": True}
|
|
233
|
+
)
|
|
234
|
+
add_example_test(TestCoreExamples, name="core.example_nvdb", devices=test_devices)
|
|
235
|
+
add_example_test(
|
|
236
|
+
TestCoreExamples,
|
|
237
|
+
name="core.example_raycast",
|
|
238
|
+
devices=test_devices,
|
|
239
|
+
test_options={"usd_required": True, "headless": True},
|
|
240
|
+
)
|
|
241
|
+
if platform.system() == "Windows":
|
|
242
|
+
# Skip GPU testing because of obscure NVRTC bug with illegal memory access
|
|
243
|
+
add_example_test(
|
|
244
|
+
TestCoreExamples,
|
|
245
|
+
name="core.example_raymarch",
|
|
246
|
+
devices=[wp.get_device("cpu")],
|
|
247
|
+
test_options={"height": 512, "width": 1024, "headless": True},
|
|
248
|
+
)
|
|
249
|
+
else:
|
|
250
|
+
add_example_test(
|
|
251
|
+
TestCoreExamples,
|
|
252
|
+
name="core.example_raymarch",
|
|
253
|
+
devices=test_devices,
|
|
254
|
+
test_options={"height": 512, "width": 1024, "headless": True},
|
|
255
|
+
)
|
|
256
|
+
add_example_test(
|
|
257
|
+
TestCoreExamples,
|
|
258
|
+
name="core.example_sample_mesh",
|
|
259
|
+
devices=test_devices,
|
|
260
|
+
test_options_cpu={"num_frames": 1},
|
|
261
|
+
)
|
|
262
|
+
add_example_test(
|
|
263
|
+
TestCoreExamples,
|
|
264
|
+
name="core.example_sph",
|
|
265
|
+
devices=test_devices,
|
|
266
|
+
test_options_cpu={"num_frames": 1},
|
|
267
|
+
)
|
|
268
|
+
add_example_test(
|
|
269
|
+
TestCoreExamples,
|
|
270
|
+
name="core.example_torch",
|
|
271
|
+
devices=test_devices,
|
|
272
|
+
test_options={"headless": True, "num_frames": 1000, "torch_required": True},
|
|
273
|
+
)
|
|
274
|
+
add_example_test(TestCoreExamples, name="core.example_wave", devices=test_devices)
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
class TestOptimExamples(unittest.TestCase):
|
|
278
|
+
pass
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
add_example_test(
|
|
282
|
+
TestOptimExamples,
|
|
283
|
+
name="optim.example_diffray",
|
|
284
|
+
devices=test_devices,
|
|
285
|
+
test_options={"usd_required": True, "headless": True},
|
|
286
|
+
test_options_cpu={"train_iters": 2},
|
|
287
|
+
)
|
|
288
|
+
add_example_test(
|
|
289
|
+
TestOptimExamples,
|
|
290
|
+
name="optim.example_fluid_checkpoint",
|
|
291
|
+
devices=cuda_test_devices,
|
|
292
|
+
test_options={"headless": True, "train_iters": 5, "num_frames": 300, "pillow_required": True},
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
class TestFemExamples(unittest.TestCase):
|
|
297
|
+
pass
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
class TestFemDiffusionExamples(unittest.TestCase):
|
|
301
|
+
pass
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
# MGPU tests may fail on systems where P2P transfers are misconfigured
|
|
305
|
+
if check_p2p():
|
|
306
|
+
add_example_test(
|
|
307
|
+
TestFemDiffusionExamples,
|
|
308
|
+
name="fem.example_diffusion_mgpu",
|
|
309
|
+
devices=get_selected_cuda_test_devices(mode="basic"),
|
|
310
|
+
test_options={"headless": True},
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
add_example_test(
|
|
314
|
+
TestFemExamples,
|
|
315
|
+
name="fem.example_apic_fluid",
|
|
316
|
+
devices=get_selected_cuda_test_devices(mode="basic"),
|
|
317
|
+
test_options={"num_frames": 5, "voxel_size": 2.0},
|
|
318
|
+
)
|
|
319
|
+
add_example_test(
|
|
320
|
+
TestFemExamples,
|
|
321
|
+
name="fem.example_adaptive_grid",
|
|
322
|
+
devices=get_selected_cuda_test_devices(mode="basic"),
|
|
323
|
+
test_options={"headless": True, "div_conforming": True},
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
# The following examples do not need CUDA
|
|
327
|
+
add_example_test(
|
|
328
|
+
TestFemDiffusionExamples,
|
|
329
|
+
name="fem.example_diffusion",
|
|
330
|
+
devices=test_devices,
|
|
331
|
+
test_options={"resolution": 10, "mesh": "tri", "headless": True},
|
|
332
|
+
)
|
|
333
|
+
add_example_test(
|
|
334
|
+
TestFemDiffusionExamples, name="fem.example_diffusion_3d", devices=test_devices, test_options={"headless": True}
|
|
335
|
+
)
|
|
336
|
+
add_example_test(
|
|
337
|
+
TestFemExamples,
|
|
338
|
+
name="fem.example_deformed_geometry",
|
|
339
|
+
devices=test_devices,
|
|
340
|
+
test_options={"resolution": 10, "mesh": "tri", "headless": True},
|
|
341
|
+
)
|
|
342
|
+
add_example_test(
|
|
343
|
+
TestFemExamples,
|
|
344
|
+
name="fem.example_convection_diffusion",
|
|
345
|
+
devices=test_devices,
|
|
346
|
+
test_options={"resolution": 20, "headless": True},
|
|
347
|
+
)
|
|
348
|
+
add_example_test(
|
|
349
|
+
TestFemExamples,
|
|
350
|
+
name="fem.example_burgers",
|
|
351
|
+
devices=test_devices,
|
|
352
|
+
test_options={"resolution": 20, "num_frames": 25, "degree": 1, "headless": True},
|
|
353
|
+
)
|
|
354
|
+
add_example_test(
|
|
355
|
+
TestFemExamples,
|
|
356
|
+
name="fem.example_convection_diffusion_dg",
|
|
357
|
+
devices=test_devices,
|
|
358
|
+
test_options={"resolution": 20, "num_frames": 25, "headless": True},
|
|
359
|
+
)
|
|
360
|
+
add_example_test(
|
|
361
|
+
TestFemExamples,
|
|
362
|
+
name="fem.example_mixed_elasticity",
|
|
363
|
+
devices=test_devices,
|
|
364
|
+
test_options={"nonconforming_stresses": True, "mesh": "quad", "headless": True},
|
|
365
|
+
)
|
|
366
|
+
add_example_test(
|
|
367
|
+
TestFemExamples, name="fem.example_stokes_transfer", devices=test_devices, test_options={"headless": True}
|
|
368
|
+
)
|
|
369
|
+
add_example_test(
|
|
370
|
+
TestFemExamples,
|
|
371
|
+
name="fem.example_stokes",
|
|
372
|
+
devices=test_devices,
|
|
373
|
+
test_options={"resolution": 10, "nonconforming_pressures": True, "headless": True},
|
|
374
|
+
)
|
|
375
|
+
add_example_test(
|
|
376
|
+
TestFemExamples,
|
|
377
|
+
name="fem.example_navier_stokes",
|
|
378
|
+
devices=test_devices,
|
|
379
|
+
test_options={"num_frames": 101, "resolution": 10, "tri_mesh": True, "headless": True},
|
|
380
|
+
)
|
|
381
|
+
add_example_test(
|
|
382
|
+
TestFemExamples,
|
|
383
|
+
name="fem.example_streamlines",
|
|
384
|
+
devices=get_selected_cuda_test_devices(),
|
|
385
|
+
test_options={"headless": True},
|
|
386
|
+
)
|
|
387
|
+
add_example_test(
|
|
388
|
+
TestFemExamples,
|
|
389
|
+
name="fem.example_distortion_energy",
|
|
390
|
+
devices=get_selected_cuda_test_devices(),
|
|
391
|
+
test_options={"headless": True, "resolution": 16},
|
|
392
|
+
)
|
|
393
|
+
add_example_test(
|
|
394
|
+
TestFemExamples,
|
|
395
|
+
name="fem.example_magnetostatics",
|
|
396
|
+
devices=test_devices,
|
|
397
|
+
test_options={"headless": True, "resolution": 16},
|
|
398
|
+
)
|
|
399
|
+
add_example_test(
|
|
400
|
+
TestFemExamples,
|
|
401
|
+
name="fem.example_nonconforming_contact",
|
|
402
|
+
devices=test_devices,
|
|
403
|
+
test_options={"headless": True, "resolution": 16, "num_steps": 2},
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
class TestTileExamples(unittest.TestCase):
|
|
408
|
+
pass
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
add_example_test(
|
|
412
|
+
TestTileExamples,
|
|
413
|
+
name="tile.example_tile_mcgp",
|
|
414
|
+
devices=test_devices,
|
|
415
|
+
test_options={"height": 128, "headless": True, "usd_required": True},
|
|
416
|
+
test_options_cpu={"slices": 2},
|
|
417
|
+
test_options_cuda={"slices": 5},
|
|
418
|
+
)
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
if __name__ == "__main__":
|
|
422
|
+
# force rebuild of all kernels
|
|
423
|
+
wp.clear_kernel_cache()
|
|
424
|
+
unittest.main(verbosity=2)
|