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
warp/tests/test_types.py
ADDED
|
@@ -0,0 +1,615 @@
|
|
|
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 sys
|
|
17
|
+
import unittest
|
|
18
|
+
|
|
19
|
+
from warp.tests.unittest_utils import *
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_integers(test, device, dtype):
|
|
23
|
+
value = dtype(0)
|
|
24
|
+
test.assertIsInstance(bool(value), bool)
|
|
25
|
+
test.assertIsInstance(int(value), int)
|
|
26
|
+
test.assertIsInstance(float(value), float)
|
|
27
|
+
test.assertEqual(bool(value), False)
|
|
28
|
+
test.assertEqual(int(value), 0)
|
|
29
|
+
test.assertEqual(float(value), 0.0)
|
|
30
|
+
try:
|
|
31
|
+
ctypes.c_bool(value)
|
|
32
|
+
ctypes.c_int(value)
|
|
33
|
+
ctypes.c_float(value)
|
|
34
|
+
except Exception:
|
|
35
|
+
test.fail()
|
|
36
|
+
|
|
37
|
+
value = dtype(123)
|
|
38
|
+
test.assertIsInstance(bool(value), bool)
|
|
39
|
+
test.assertIsInstance(int(value), int)
|
|
40
|
+
test.assertIsInstance(float(value), float)
|
|
41
|
+
test.assertEqual(bool(value), True)
|
|
42
|
+
test.assertEqual(int(value), 123)
|
|
43
|
+
test.assertEqual(float(value), 123.0)
|
|
44
|
+
try:
|
|
45
|
+
ctypes.c_bool(value)
|
|
46
|
+
ctypes.c_int(value)
|
|
47
|
+
ctypes.c_float(value)
|
|
48
|
+
except Exception:
|
|
49
|
+
test.fail()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_floats(test, device, dtype):
|
|
53
|
+
value = dtype(0.0)
|
|
54
|
+
test.assertIsInstance(bool(value), bool)
|
|
55
|
+
test.assertIsInstance(int(value), int)
|
|
56
|
+
test.assertIsInstance(float(value), float)
|
|
57
|
+
test.assertEqual(bool(value), False)
|
|
58
|
+
test.assertEqual(int(value), 0)
|
|
59
|
+
test.assertEqual(float(value), 0.0)
|
|
60
|
+
try:
|
|
61
|
+
ctypes.c_bool(value)
|
|
62
|
+
ctypes.c_float(value)
|
|
63
|
+
except Exception:
|
|
64
|
+
test.fail()
|
|
65
|
+
|
|
66
|
+
value = dtype(1.25)
|
|
67
|
+
test.assertIsInstance(bool(value), bool)
|
|
68
|
+
test.assertIsInstance(int(value), int)
|
|
69
|
+
test.assertIsInstance(float(value), float)
|
|
70
|
+
test.assertEqual(bool(value), True)
|
|
71
|
+
test.assertEqual(int(value), 1)
|
|
72
|
+
test.assertEqual(float(value), 1.25)
|
|
73
|
+
try:
|
|
74
|
+
ctypes.c_bool(value)
|
|
75
|
+
ctypes.c_float(value)
|
|
76
|
+
except Exception:
|
|
77
|
+
test.fail()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def test_vector(test, device, dtype):
|
|
81
|
+
def make_scalar(x):
|
|
82
|
+
# Cast to the correct integer type to simulate wrapping.
|
|
83
|
+
if dtype in wp._src.types.int_types:
|
|
84
|
+
return dtype._type_(x).value
|
|
85
|
+
|
|
86
|
+
return x
|
|
87
|
+
|
|
88
|
+
def make_vec(*args):
|
|
89
|
+
if dtype in wp._src.types.int_types:
|
|
90
|
+
# Cast to the correct integer type to simulate wrapping.
|
|
91
|
+
return tuple(dtype._type_(x).value for x in args)
|
|
92
|
+
|
|
93
|
+
return args
|
|
94
|
+
|
|
95
|
+
vec3_cls = wp.vec(3, dtype)
|
|
96
|
+
vec4_cls = wp.vec(4, dtype)
|
|
97
|
+
|
|
98
|
+
v = vec4_cls(1, 2, 3, 4)
|
|
99
|
+
test.assertEqual(v[0], make_scalar(1))
|
|
100
|
+
test.assertEqual(v.x, make_scalar(1))
|
|
101
|
+
test.assertEqual(v.y, make_scalar(2))
|
|
102
|
+
test.assertEqual(v.z, make_scalar(3))
|
|
103
|
+
test.assertEqual(v.w, make_scalar(4))
|
|
104
|
+
test.assertSequenceEqual(v[0:2], make_vec(1, 2))
|
|
105
|
+
test.assertSequenceEqual(v, make_vec(1, 2, 3, 4))
|
|
106
|
+
|
|
107
|
+
v[0] = -1
|
|
108
|
+
test.assertEqual(v[0], make_scalar(-1))
|
|
109
|
+
test.assertEqual(v.x, make_scalar(-1))
|
|
110
|
+
test.assertEqual(v.y, make_scalar(2))
|
|
111
|
+
test.assertEqual(v.z, make_scalar(3))
|
|
112
|
+
test.assertEqual(v.w, make_scalar(4))
|
|
113
|
+
test.assertSequenceEqual(v[0:2], make_vec(-1, 2))
|
|
114
|
+
test.assertSequenceEqual(v, make_vec(-1, 2, 3, 4))
|
|
115
|
+
|
|
116
|
+
v[1:3] = (-2, -3)
|
|
117
|
+
test.assertEqual(v[0], make_scalar(-1))
|
|
118
|
+
test.assertEqual(v.x, make_scalar(-1))
|
|
119
|
+
test.assertEqual(v.y, make_scalar(-2))
|
|
120
|
+
test.assertEqual(v.z, make_scalar(-3))
|
|
121
|
+
test.assertEqual(v.w, make_scalar(4))
|
|
122
|
+
test.assertSequenceEqual(v[0:2], make_vec(-1, -2))
|
|
123
|
+
test.assertSequenceEqual(v, make_vec(-1, -2, -3, 4))
|
|
124
|
+
|
|
125
|
+
v.x = 1
|
|
126
|
+
test.assertEqual(v[0], make_scalar(1))
|
|
127
|
+
test.assertEqual(v.x, make_scalar(1))
|
|
128
|
+
test.assertEqual(v.y, make_scalar(-2))
|
|
129
|
+
test.assertEqual(v.z, make_scalar(-3))
|
|
130
|
+
test.assertEqual(v.w, make_scalar(4))
|
|
131
|
+
test.assertSequenceEqual(v[0:2], make_vec(1, -2))
|
|
132
|
+
test.assertSequenceEqual(v, make_vec(1, -2, -3, 4))
|
|
133
|
+
|
|
134
|
+
v = vec3_cls(2, 4, 6)
|
|
135
|
+
test.assertSequenceEqual(+v, make_vec(2, 4, 6))
|
|
136
|
+
test.assertSequenceEqual(-v, make_vec(-2, -4, -6))
|
|
137
|
+
test.assertSequenceEqual(v + vec3_cls(1, 1, 1), make_vec(3, 5, 7))
|
|
138
|
+
test.assertSequenceEqual(v - vec3_cls(1, 1, 1), make_vec(1, 3, 5))
|
|
139
|
+
test.assertSequenceEqual(v * dtype(2), make_vec(4, 8, 12))
|
|
140
|
+
test.assertSequenceEqual(dtype(2) * v, make_vec(4, 8, 12))
|
|
141
|
+
test.assertSequenceEqual(v / dtype(2), make_vec(1, 2, 3))
|
|
142
|
+
test.assertSequenceEqual(dtype(12) / v, make_vec(6, 3, 2))
|
|
143
|
+
|
|
144
|
+
test.assertTrue(v != vec3_cls(1, 2, 3))
|
|
145
|
+
test.assertEqual(str(v), "[{}]".format(", ".join(str(x) for x in v)))
|
|
146
|
+
|
|
147
|
+
# Copy constructor.
|
|
148
|
+
v_copy = vec3_cls(v)
|
|
149
|
+
v_copy[0] = 123
|
|
150
|
+
test.assertSequenceEqual(v, make_vec(2, 4, 6))
|
|
151
|
+
test.assertSequenceEqual(v_copy, make_vec(123, 4, 6))
|
|
152
|
+
|
|
153
|
+
# Check added purely for coverage reasons but is this really a desired
|
|
154
|
+
# behaviour? Not allowing to define new attributes using systems like
|
|
155
|
+
# `__slots__` could help improving memory usage.
|
|
156
|
+
v.foo = 123
|
|
157
|
+
test.assertEqual(v.foo, 123)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
devices = [x for x in get_test_devices() if x.is_cpu]
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class TestTypes(unittest.TestCase):
|
|
164
|
+
def test_bool(self):
|
|
165
|
+
value = wp.bool(False)
|
|
166
|
+
self.assertIsInstance(bool(value), bool)
|
|
167
|
+
self.assertIsInstance(int(value), int)
|
|
168
|
+
self.assertIsInstance(float(value), float)
|
|
169
|
+
self.assertEqual(bool(value), False)
|
|
170
|
+
self.assertEqual(int(value), 0)
|
|
171
|
+
self.assertEqual(float(value), 0.0)
|
|
172
|
+
try:
|
|
173
|
+
ctypes.c_bool(value)
|
|
174
|
+
except Exception:
|
|
175
|
+
self.fail()
|
|
176
|
+
|
|
177
|
+
value = wp.bool(True)
|
|
178
|
+
self.assertIsInstance(bool(value), bool)
|
|
179
|
+
self.assertIsInstance(int(value), int)
|
|
180
|
+
self.assertIsInstance(float(value), float)
|
|
181
|
+
self.assertEqual(bool(value), True)
|
|
182
|
+
self.assertEqual(int(value), 1)
|
|
183
|
+
self.assertEqual(float(value), 1.0)
|
|
184
|
+
try:
|
|
185
|
+
ctypes.c_bool(value)
|
|
186
|
+
except Exception:
|
|
187
|
+
self.fail()
|
|
188
|
+
|
|
189
|
+
value = wp.bool(0.0)
|
|
190
|
+
self.assertIsInstance(bool(value), bool)
|
|
191
|
+
self.assertIsInstance(int(value), int)
|
|
192
|
+
self.assertIsInstance(float(value), float)
|
|
193
|
+
self.assertEqual(bool(value), False)
|
|
194
|
+
self.assertEqual(int(value), 0)
|
|
195
|
+
self.assertEqual(float(value), 0.0)
|
|
196
|
+
try:
|
|
197
|
+
ctypes.c_bool(value)
|
|
198
|
+
except Exception:
|
|
199
|
+
self.fail()
|
|
200
|
+
|
|
201
|
+
value = wp.bool(123)
|
|
202
|
+
self.assertIsInstance(bool(value), bool)
|
|
203
|
+
self.assertIsInstance(int(value), int)
|
|
204
|
+
self.assertIsInstance(float(value), float)
|
|
205
|
+
self.assertEqual(bool(value), True)
|
|
206
|
+
self.assertEqual(int(value), 1)
|
|
207
|
+
self.assertEqual(float(value), 1.0)
|
|
208
|
+
try:
|
|
209
|
+
ctypes.c_bool(value)
|
|
210
|
+
except Exception:
|
|
211
|
+
self.fail()
|
|
212
|
+
|
|
213
|
+
def test_constant(self):
|
|
214
|
+
const = wp.constant(123)
|
|
215
|
+
self.assertEqual(const, 123)
|
|
216
|
+
|
|
217
|
+
const = wp.constant(1.25)
|
|
218
|
+
self.assertEqual(const, 1.25)
|
|
219
|
+
|
|
220
|
+
const = wp.constant(True)
|
|
221
|
+
self.assertEqual(const, True)
|
|
222
|
+
|
|
223
|
+
const = wp.constant(wp.float16(1.25))
|
|
224
|
+
self.assertEqual(const.value, 1.25)
|
|
225
|
+
|
|
226
|
+
const = wp.constant(wp.int16(123))
|
|
227
|
+
self.assertEqual(const.value, 123)
|
|
228
|
+
|
|
229
|
+
const = wp.constant(wp.vec3i(1, 2, 3))
|
|
230
|
+
self.assertEqual(const, wp.vec3i(1, 2, 3))
|
|
231
|
+
|
|
232
|
+
def test_constant_error_invalid_type(self):
|
|
233
|
+
with self.assertRaisesRegex(TypeError, r"Invalid constant type: <class 'tuple'>$"):
|
|
234
|
+
wp.constant((1, 2, 3))
|
|
235
|
+
|
|
236
|
+
def test_vector_assign(self):
|
|
237
|
+
v = wp.vec3s()
|
|
238
|
+
v[0] = 1
|
|
239
|
+
v[1] = wp.int8(2)
|
|
240
|
+
v[2] = np.int8(3)
|
|
241
|
+
self.assertEqual(v, (1, 2, 3))
|
|
242
|
+
|
|
243
|
+
v = wp.vec3h()
|
|
244
|
+
v[0] = 1.0
|
|
245
|
+
v[1] = wp.float16(2.0)
|
|
246
|
+
v[2] = np.float16(3.0)
|
|
247
|
+
self.assertEqual(v, (1.0, 2.0, 3.0))
|
|
248
|
+
|
|
249
|
+
def test_vector_error_invalid_arg_count(self):
|
|
250
|
+
with self.assertRaisesRegex(
|
|
251
|
+
ValueError, r"Invalid number of arguments in vector constructor, expected 3 elements, got 2$"
|
|
252
|
+
):
|
|
253
|
+
wp.vec3(1, 2)
|
|
254
|
+
|
|
255
|
+
def test_vector_error_invalid_ptr(self):
|
|
256
|
+
with self.assertRaisesRegex(RuntimeError, r"NULL pointer exception"):
|
|
257
|
+
wp.vec3.from_ptr(0)
|
|
258
|
+
|
|
259
|
+
def test_vector_error_invalid_get_item_key(self):
|
|
260
|
+
v = wp.vec3(1, 2, 3)
|
|
261
|
+
|
|
262
|
+
with self.assertRaisesRegex(KeyError, r"Invalid key None, expected int or slice"):
|
|
263
|
+
v[None]
|
|
264
|
+
|
|
265
|
+
def test_vector_error_invalid_set_item_key(self):
|
|
266
|
+
v = wp.vec3(1, 2, 3)
|
|
267
|
+
with self.assertRaisesRegex(KeyError, r"Invalid key None, expected int or slice"):
|
|
268
|
+
v[None] = 0
|
|
269
|
+
|
|
270
|
+
def test_vector_error_invalid_set_item_value(self):
|
|
271
|
+
v1 = wp.vec3i(1, 2, 3)
|
|
272
|
+
v2 = wp.vec3h(1, 2, 3)
|
|
273
|
+
|
|
274
|
+
with self.assertRaisesRegex(TypeError, r"Expected to assign a `int32` value but got `str` instead"):
|
|
275
|
+
v1[0] = "123.0"
|
|
276
|
+
|
|
277
|
+
with self.assertRaisesRegex(
|
|
278
|
+
TypeError, r"Expected to assign a slice from a sequence of `int32` values but got `vec3i` instead"
|
|
279
|
+
):
|
|
280
|
+
v1[:1] = (v1,)
|
|
281
|
+
|
|
282
|
+
with self.assertRaisesRegex(ValueError, r"Can only assign sequence of same size"):
|
|
283
|
+
v1[:1] = (1, 2)
|
|
284
|
+
|
|
285
|
+
with self.assertRaisesRegex(
|
|
286
|
+
TypeError, r"Expected to assign a slice from a sequence of `float16` values but got `vec3h` instead"
|
|
287
|
+
):
|
|
288
|
+
v2[:1] = (v2,)
|
|
289
|
+
|
|
290
|
+
def test_matrix(self):
|
|
291
|
+
for dtype in (*wp._src.types.float_types, float):
|
|
292
|
+
|
|
293
|
+
def make_scalar(x, dtype=dtype):
|
|
294
|
+
# Cast to the correct integer type to simulate wrapping.
|
|
295
|
+
if dtype in wp._src.types.int_types:
|
|
296
|
+
return dtype._type_(x).value
|
|
297
|
+
|
|
298
|
+
return x
|
|
299
|
+
|
|
300
|
+
def make_vec(*args, dtype=dtype):
|
|
301
|
+
if dtype in wp._src.types.int_types:
|
|
302
|
+
# Cast to the correct integer type to simulate wrapping.
|
|
303
|
+
return tuple(dtype._type_(x).value for x in args)
|
|
304
|
+
|
|
305
|
+
return args
|
|
306
|
+
|
|
307
|
+
def make_mat(*args, dtype=dtype):
|
|
308
|
+
if dtype in wp._src.types.int_types:
|
|
309
|
+
# Cast to the correct integer type to simulate wrapping.
|
|
310
|
+
return tuple(tuple(dtype._type_(x).value for x in row) for row in args)
|
|
311
|
+
|
|
312
|
+
return args
|
|
313
|
+
|
|
314
|
+
mat22_cls = wp.mat((2, 2), dtype)
|
|
315
|
+
mat33_cls = wp.mat((3, 3), dtype)
|
|
316
|
+
vec2_cls = wp.vec(2, dtype)
|
|
317
|
+
|
|
318
|
+
m = mat33_cls(((1, 2, 3), (4, 5, 6), (7, 8, 9)))
|
|
319
|
+
self.assertEqual(m[0][0], make_scalar(1))
|
|
320
|
+
self.assertEqual(m[0][1], make_scalar(2))
|
|
321
|
+
self.assertEqual(m[0][2], make_scalar(3))
|
|
322
|
+
self.assertEqual(m[1][0], make_scalar(4))
|
|
323
|
+
self.assertEqual(m[1][1], make_scalar(5))
|
|
324
|
+
self.assertEqual(m[1][2], make_scalar(6))
|
|
325
|
+
self.assertEqual(m[2][0], make_scalar(7))
|
|
326
|
+
self.assertEqual(m[2][1], make_scalar(8))
|
|
327
|
+
self.assertEqual(m[2][2], make_scalar(9))
|
|
328
|
+
self.assertEqual(m[0, 0], make_scalar(1))
|
|
329
|
+
self.assertEqual(m[0, 1], make_scalar(2))
|
|
330
|
+
self.assertEqual(m[0, 2], make_scalar(3))
|
|
331
|
+
self.assertEqual(m[1, 0], make_scalar(4))
|
|
332
|
+
self.assertEqual(m[1, 1], make_scalar(5))
|
|
333
|
+
self.assertEqual(m[1, 2], make_scalar(6))
|
|
334
|
+
self.assertEqual(m[2, 0], make_scalar(7))
|
|
335
|
+
self.assertEqual(m[2, 1], make_scalar(8))
|
|
336
|
+
self.assertEqual(m[2, 2], make_scalar(9))
|
|
337
|
+
self.assertSequenceEqual(m[0], make_vec(1, 2, 3))
|
|
338
|
+
self.assertSequenceEqual(m[1], make_vec(4, 5, 6))
|
|
339
|
+
self.assertSequenceEqual(m[2], make_vec(7, 8, 9))
|
|
340
|
+
self.assertSequenceEqual(m[0][1:3], make_vec(2, 3))
|
|
341
|
+
self.assertSequenceEqual(m[1][0:2], make_vec(4, 5))
|
|
342
|
+
self.assertSequenceEqual(m[2][0:3], make_vec(7, 8, 9))
|
|
343
|
+
# self.assertSequenceEqual(m[0, 1:3], make_vec(2, 3))
|
|
344
|
+
# self.assertSequenceEqual(m[1, 0:2], make_vec(4, 5))
|
|
345
|
+
# self.assertSequenceEqual(m[2, 0:3], make_vec(7, 8, 9))
|
|
346
|
+
self.assertSequenceEqual(m, make_mat((1, 2, 3), (4, 5, 6), (7, 8, 9)))
|
|
347
|
+
|
|
348
|
+
m[1, 0] = -4
|
|
349
|
+
self.assertEqual(m[0][0], make_scalar(1))
|
|
350
|
+
self.assertEqual(m[0][1], make_scalar(2))
|
|
351
|
+
self.assertEqual(m[0][2], make_scalar(3))
|
|
352
|
+
self.assertEqual(m[1][0], make_scalar(-4))
|
|
353
|
+
self.assertEqual(m[1][1], make_scalar(5))
|
|
354
|
+
self.assertEqual(m[1][2], make_scalar(6))
|
|
355
|
+
self.assertEqual(m[2][0], make_scalar(7))
|
|
356
|
+
self.assertEqual(m[2][1], make_scalar(8))
|
|
357
|
+
self.assertEqual(m[2][2], make_scalar(9))
|
|
358
|
+
self.assertEqual(m[0, 0], make_scalar(1))
|
|
359
|
+
self.assertEqual(m[0, 1], make_scalar(2))
|
|
360
|
+
self.assertEqual(m[0, 2], make_scalar(3))
|
|
361
|
+
self.assertEqual(m[1, 0], make_scalar(-4))
|
|
362
|
+
self.assertEqual(m[1, 1], make_scalar(5))
|
|
363
|
+
self.assertEqual(m[1, 2], make_scalar(6))
|
|
364
|
+
self.assertEqual(m[2, 0], make_scalar(7))
|
|
365
|
+
self.assertEqual(m[2, 1], make_scalar(8))
|
|
366
|
+
self.assertEqual(m[2, 2], make_scalar(9))
|
|
367
|
+
self.assertSequenceEqual(m[0], make_vec(1, 2, 3))
|
|
368
|
+
self.assertSequenceEqual(m[1], make_vec(-4, 5, 6))
|
|
369
|
+
self.assertSequenceEqual(m[2], make_vec(7, 8, 9))
|
|
370
|
+
self.assertSequenceEqual(m[0][1:3], make_vec(2, 3))
|
|
371
|
+
self.assertSequenceEqual(m[1][0:2], make_vec(-4, 5))
|
|
372
|
+
self.assertSequenceEqual(m[2][0:3], make_vec(7, 8, 9))
|
|
373
|
+
# self.assertSequenceEqual(m[0, 1:3], make_vec(2, 3))
|
|
374
|
+
# self.assertSequenceEqual(m[1, 0:2], make_vec(-4, 5))
|
|
375
|
+
# self.assertSequenceEqual(m[2, 0:3], make_vec(7, 8, 9))
|
|
376
|
+
self.assertSequenceEqual(m, make_mat((1, 2, 3), (-4, 5, 6), (7, 8, 9)))
|
|
377
|
+
|
|
378
|
+
m[2] = (-7, 8, -9)
|
|
379
|
+
self.assertEqual(m[0][0], make_scalar(1))
|
|
380
|
+
self.assertEqual(m[0][1], make_scalar(2))
|
|
381
|
+
self.assertEqual(m[0][2], make_scalar(3))
|
|
382
|
+
self.assertEqual(m[1][0], make_scalar(-4))
|
|
383
|
+
self.assertEqual(m[1][1], make_scalar(5))
|
|
384
|
+
self.assertEqual(m[1][2], make_scalar(6))
|
|
385
|
+
self.assertEqual(m[2][0], make_scalar(-7))
|
|
386
|
+
self.assertEqual(m[2][1], make_scalar(8))
|
|
387
|
+
self.assertEqual(m[2][2], make_scalar(-9))
|
|
388
|
+
self.assertEqual(m[0, 0], make_scalar(1))
|
|
389
|
+
self.assertEqual(m[0, 1], make_scalar(2))
|
|
390
|
+
self.assertEqual(m[0, 2], make_scalar(3))
|
|
391
|
+
self.assertEqual(m[1, 0], make_scalar(-4))
|
|
392
|
+
self.assertEqual(m[1, 1], make_scalar(5))
|
|
393
|
+
self.assertEqual(m[1, 2], make_scalar(6))
|
|
394
|
+
self.assertEqual(m[2, 0], make_scalar(-7))
|
|
395
|
+
self.assertEqual(m[2, 1], make_scalar(8))
|
|
396
|
+
self.assertEqual(m[2, 2], make_scalar(-9))
|
|
397
|
+
self.assertSequenceEqual(m[0], make_vec(1, 2, 3))
|
|
398
|
+
self.assertSequenceEqual(m[1], make_vec(-4, 5, 6))
|
|
399
|
+
self.assertSequenceEqual(m[2], make_vec(-7, 8, -9))
|
|
400
|
+
self.assertSequenceEqual(m[0][1:3], make_vec(2, 3))
|
|
401
|
+
self.assertSequenceEqual(m[1][0:2], make_vec(-4, 5))
|
|
402
|
+
self.assertSequenceEqual(m[2][0:3], make_vec(-7, 8, -9))
|
|
403
|
+
# self.assertSequenceEqual(m[0, 1:3], make_vec(2, 3))
|
|
404
|
+
# self.assertSequenceEqual(m[1, 0:2], make_vec(-4, 5))
|
|
405
|
+
# self.assertSequenceEqual(m[2, 0:3], make_vec(-7, 8, -9))
|
|
406
|
+
self.assertSequenceEqual(m, make_mat((1, 2, 3), (-4, 5, 6), (-7, 8, -9)))
|
|
407
|
+
|
|
408
|
+
m = mat22_cls(2, 4, 6, 8)
|
|
409
|
+
self.assertSequenceEqual(+m, make_mat((2, 4), (6, 8)))
|
|
410
|
+
self.assertSequenceEqual(-m, make_mat((-2, -4), (-6, -8)))
|
|
411
|
+
self.assertSequenceEqual(m + mat22_cls(1, 1, 1, 1), make_mat((3, 5), (7, 9)))
|
|
412
|
+
self.assertSequenceEqual(m - mat22_cls(1, 1, 1, 1), make_mat((1, 3), (5, 7)))
|
|
413
|
+
self.assertSequenceEqual(m * dtype(2), make_mat((4, 8), (12, 16)))
|
|
414
|
+
self.assertSequenceEqual(dtype(2) * m, make_mat((4, 8), (12, 16)))
|
|
415
|
+
self.assertSequenceEqual(m / dtype(2), make_mat((1, 2), (3, 4)))
|
|
416
|
+
self.assertSequenceEqual(dtype(24) / m, make_mat((12, 6), (4, 3)))
|
|
417
|
+
|
|
418
|
+
self.assertSequenceEqual(m * vec2_cls(1, 2), make_vec(10, 22))
|
|
419
|
+
self.assertSequenceEqual(m @ vec2_cls(1, 2), make_vec(10, 22))
|
|
420
|
+
self.assertSequenceEqual(vec2_cls(1, 2) * m, make_vec(14, 20))
|
|
421
|
+
self.assertSequenceEqual(vec2_cls(1, 2) @ m, make_vec(14, 20))
|
|
422
|
+
|
|
423
|
+
self.assertTrue(m != mat22_cls(1, 2, 3, 4))
|
|
424
|
+
self.assertEqual(
|
|
425
|
+
str(m),
|
|
426
|
+
"[{}]".format(",\n ".join("[{}]".format(", ".join(str(y) for y in m[x])) for x in range(m._shape_[0]))),
|
|
427
|
+
)
|
|
428
|
+
|
|
429
|
+
# Copy constructor.
|
|
430
|
+
m_copy = mat22_cls(m)
|
|
431
|
+
m_copy[0, 0] = 123
|
|
432
|
+
self.assertSequenceEqual(m, make_mat((2, 4), (6, 8)))
|
|
433
|
+
self.assertSequenceEqual(m_copy, make_mat((123, 4), (6, 8)))
|
|
434
|
+
|
|
435
|
+
# Check added purely for coverage reasons but is this really a desired
|
|
436
|
+
# behaviour? Not allowing to define new attributes using systems like
|
|
437
|
+
# `__slots__` could help improving memory usage.
|
|
438
|
+
m.foo = 123
|
|
439
|
+
self.assertEqual(m.foo, 123)
|
|
440
|
+
|
|
441
|
+
def test_matrix_error_invalid_arg_count(self):
|
|
442
|
+
with self.assertRaisesRegex(
|
|
443
|
+
ValueError, r"Invalid number of arguments in matrix constructor, expected 4 elements, got 3$"
|
|
444
|
+
):
|
|
445
|
+
wp.mat22(1, 2, 3)
|
|
446
|
+
|
|
447
|
+
def test_matrix_error_invalid_row_count(self):
|
|
448
|
+
with self.assertRaisesRegex(
|
|
449
|
+
TypeError, r"Invalid argument in matrix constructor, expected row of length 2, got \(1, 2, 3\)$"
|
|
450
|
+
):
|
|
451
|
+
wp.mat22((1, 2, 3), (3, 4, 5))
|
|
452
|
+
|
|
453
|
+
def test_matrix_error_invalid_ptr(self):
|
|
454
|
+
with self.assertRaisesRegex(RuntimeError, r"NULL pointer exception"):
|
|
455
|
+
wp.mat22.from_ptr(0)
|
|
456
|
+
|
|
457
|
+
def test_matrix_error_invalid_set_row_index(self):
|
|
458
|
+
m = wp.mat22(1, 2, 3, 4)
|
|
459
|
+
with self.assertRaisesRegex(IndexError, r"Invalid row index$"):
|
|
460
|
+
m.set_row(2, (0, 0))
|
|
461
|
+
|
|
462
|
+
def test_matrix_error_invalid_get_item_key(self):
|
|
463
|
+
m = wp.mat22(1, 2, 3, 4)
|
|
464
|
+
|
|
465
|
+
with self.assertRaisesRegex(KeyError, r"Invalid key None, expected int or pair of ints"):
|
|
466
|
+
m[None]
|
|
467
|
+
|
|
468
|
+
def test_matrix_error_invalid_get_item_key_length(self):
|
|
469
|
+
m = wp.mat22(1, 2, 3, 4)
|
|
470
|
+
|
|
471
|
+
with self.assertRaisesRegex(KeyError, r"Invalid key, expected one or two indices, got 3"):
|
|
472
|
+
m[0, 1, 2]
|
|
473
|
+
|
|
474
|
+
def test_matrix_error_invalid_set_item_key(self):
|
|
475
|
+
m = wp.mat22(1, 2, 3, 4)
|
|
476
|
+
with self.assertRaisesRegex(KeyError, r"Invalid key None, expected int or pair of ints"):
|
|
477
|
+
m[None] = 0
|
|
478
|
+
|
|
479
|
+
def test_matrix_error_invalid_set_item_key_length(self):
|
|
480
|
+
m = wp.mat22(1, 2, 3, 4)
|
|
481
|
+
|
|
482
|
+
with self.assertRaisesRegex(KeyError, r"Invalid key, expected one or two indices, got 3"):
|
|
483
|
+
m[0, 1, 2] = (0, 0)
|
|
484
|
+
|
|
485
|
+
def test_matrix_error_invalid_set_item_value(self):
|
|
486
|
+
m = wp.mat22h(1, 2, 3, 4)
|
|
487
|
+
|
|
488
|
+
with self.assertRaisesRegex(TypeError, r"Expected to assign a `float16` value but got `str` instead"):
|
|
489
|
+
m[0, 0] = "123.0"
|
|
490
|
+
|
|
491
|
+
with self.assertRaisesRegex(TypeError, r"Expected to assign a `float16` value but got `str` instead"):
|
|
492
|
+
m[0][0] = "123.0"
|
|
493
|
+
|
|
494
|
+
with self.assertRaisesRegex(
|
|
495
|
+
TypeError, r"Expected to assign a slice from a sequence of `float16` values but got `mat22h` instead"
|
|
496
|
+
):
|
|
497
|
+
m[0] = (m,)
|
|
498
|
+
|
|
499
|
+
with self.assertRaisesRegex(ValueError, r"Can only assign sequence of same size"):
|
|
500
|
+
m[0][:1] = (1, 2)
|
|
501
|
+
|
|
502
|
+
def test_dtype_from_numpy(self):
|
|
503
|
+
import numpy as np
|
|
504
|
+
|
|
505
|
+
def test_conversions(np_type, warp_type):
|
|
506
|
+
self.assertEqual(wp.dtype_from_numpy(np_type), warp_type)
|
|
507
|
+
self.assertEqual(wp.dtype_from_numpy(np.dtype(np_type)), warp_type)
|
|
508
|
+
|
|
509
|
+
test_conversions(np.float16, wp.float16)
|
|
510
|
+
test_conversions(np.float32, wp.float32)
|
|
511
|
+
test_conversions(np.float64, wp.float64)
|
|
512
|
+
test_conversions(np.int8, wp.int8)
|
|
513
|
+
test_conversions(np.int16, wp.int16)
|
|
514
|
+
test_conversions(np.int32, wp.int32)
|
|
515
|
+
test_conversions(np.int64, wp.int64)
|
|
516
|
+
test_conversions(np.uint8, wp.uint8)
|
|
517
|
+
test_conversions(np.uint16, wp.uint16)
|
|
518
|
+
test_conversions(np.uint32, wp.uint32)
|
|
519
|
+
test_conversions(np.uint64, wp.uint64)
|
|
520
|
+
test_conversions(np.bool_, wp.bool)
|
|
521
|
+
test_conversions(np.byte, wp.int8)
|
|
522
|
+
test_conversions(np.ubyte, wp.uint8)
|
|
523
|
+
|
|
524
|
+
def test_dtype_to_numpy(self):
|
|
525
|
+
import numpy as np
|
|
526
|
+
|
|
527
|
+
def test_conversions(warp_type, np_type):
|
|
528
|
+
self.assertEqual(wp.dtype_to_numpy(warp_type), np_type)
|
|
529
|
+
|
|
530
|
+
test_conversions(wp.float16, np.float16)
|
|
531
|
+
test_conversions(wp.float32, np.float32)
|
|
532
|
+
test_conversions(wp.float64, np.float64)
|
|
533
|
+
test_conversions(wp.int8, np.int8)
|
|
534
|
+
test_conversions(wp.int16, np.int16)
|
|
535
|
+
test_conversions(wp.int32, np.int32)
|
|
536
|
+
test_conversions(wp.int64, np.int64)
|
|
537
|
+
test_conversions(wp.uint8, np.uint8)
|
|
538
|
+
test_conversions(wp.uint16, np.uint16)
|
|
539
|
+
test_conversions(wp.uint32, np.uint32)
|
|
540
|
+
test_conversions(wp.uint64, np.uint64)
|
|
541
|
+
test_conversions(wp.bool, np.bool_)
|
|
542
|
+
|
|
543
|
+
# Only define this test method on Python 3.9+ where lowercase tuple is supported
|
|
544
|
+
if sys.version_info >= (3, 9):
|
|
545
|
+
|
|
546
|
+
def test_tuple_type_code_generation(self):
|
|
547
|
+
"""Test that tuple type annotations generate correct type codes, especially on Python 3.10."""
|
|
548
|
+
import sys
|
|
549
|
+
import types
|
|
550
|
+
from typing import get_origin
|
|
551
|
+
|
|
552
|
+
# Test basic tuple types
|
|
553
|
+
tuple_float_float = tuple[float, float]
|
|
554
|
+
result = wp._src.types.get_type_code(tuple_float_float)
|
|
555
|
+
self.assertEqual(result, "tpl2f4f4", "tuple[float, float] should generate 'tpl2f4f4'")
|
|
556
|
+
|
|
557
|
+
# Test tuple with Warp vector types - the problematic case from Python 3.10
|
|
558
|
+
tuple_mixed = tuple[float, wp.vec3f, wp.vec3f]
|
|
559
|
+
result = wp._src.types.get_type_code(tuple_mixed)
|
|
560
|
+
self.assertEqual(result, "tpl3f4v3f4v3f4", "tuple[float, vec3f, vec3f] should generate 'tpl3f4v3f4v3f4'")
|
|
561
|
+
|
|
562
|
+
# Test homogeneous tuple with ellipsis
|
|
563
|
+
tuple_homogeneous = tuple[wp.vec3f, ...]
|
|
564
|
+
result = wp._src.types.get_type_code(tuple_homogeneous)
|
|
565
|
+
self.assertEqual(result, "tpl2v3f4?", "tuple[vec3f, ...] should generate 'tpl2v3f4?'")
|
|
566
|
+
|
|
567
|
+
# Test single element tuple
|
|
568
|
+
tuple_single = tuple[wp.int32]
|
|
569
|
+
result = wp._src.types.get_type_code(tuple_single)
|
|
570
|
+
self.assertEqual(result, "tpl1i4", "tuple[int32] should generate 'tpl1i4'")
|
|
571
|
+
|
|
572
|
+
# Test tuple with multiple Warp types
|
|
573
|
+
tuple_multi_warp = tuple[wp.vec3f, wp.mat33f, wp.quatf]
|
|
574
|
+
result = wp._src.types.get_type_code(tuple_multi_warp)
|
|
575
|
+
self.assertEqual(
|
|
576
|
+
result, "tpl3v3f4m33f4qf4", "tuple[vec3f, mat33f, quatf] should generate 'tpl3v3f4m33f4qf4'"
|
|
577
|
+
)
|
|
578
|
+
|
|
579
|
+
# Verify the fix works on Python 3.9-3.10 specifically
|
|
580
|
+
if sys.version_info < (3, 11) and hasattr(types, "GenericAlias"):
|
|
581
|
+
# On Python 3.9-3.10, tuple[...] creates types.GenericAlias
|
|
582
|
+
self.assertIsInstance(
|
|
583
|
+
tuple_mixed, types.GenericAlias, "On Python 3.9-3.10, tuple[...] should create types.GenericAlias"
|
|
584
|
+
)
|
|
585
|
+
self.assertIs(tuple_mixed.__origin__, tuple, "GenericAlias origin should be tuple")
|
|
586
|
+
|
|
587
|
+
# Verify our fix catches this case
|
|
588
|
+
self.assertEqual(get_origin(tuple_mixed), tuple, "get_origin should return tuple")
|
|
589
|
+
elif sys.version_info >= (3, 11):
|
|
590
|
+
# On Python 3.11+, the existing code path should handle it
|
|
591
|
+
self.assertEqual(get_origin(tuple_mixed), tuple, "get_origin should return tuple on Python 3.11+")
|
|
592
|
+
|
|
593
|
+
# Test that the fix doesn't break existing functionality
|
|
594
|
+
# Test with built-in Python types
|
|
595
|
+
tuple_builtin = tuple[int, str, bool]
|
|
596
|
+
try:
|
|
597
|
+
# This might fail because str and bool aren't Warp types, but it shouldn't crash
|
|
598
|
+
wp._src.types.get_type_code(tuple_builtin)
|
|
599
|
+
except TypeError as e:
|
|
600
|
+
# Expected to fail for non-Warp types, but should be a clean TypeError
|
|
601
|
+
self.assertIn("Unrecognized type", str(e))
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
for dtype in wp._src.types.int_types:
|
|
605
|
+
add_function_test(TestTypes, f"test_integers_{dtype.__name__}", test_integers, devices=devices, dtype=dtype)
|
|
606
|
+
|
|
607
|
+
for dtype in wp._src.types.float_types:
|
|
608
|
+
add_function_test(TestTypes, f"test_floats_{dtype.__name__}", test_floats, devices=devices, dtype=dtype)
|
|
609
|
+
|
|
610
|
+
for dtype in (*wp._src.types.scalar_types, int, float):
|
|
611
|
+
add_function_test(TestTypes, f"test_vector_{dtype.__name__}", test_vector, devices=devices, dtype=dtype)
|
|
612
|
+
|
|
613
|
+
if __name__ == "__main__":
|
|
614
|
+
wp.clear_kernel_cache()
|
|
615
|
+
unittest.main(verbosity=2)
|