warp-lang 1.9.1__py3-none-manylinux_2_34_aarch64.whl → 1.10.0rc2__py3-none-manylinux_2_34_aarch64.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 +301 -287
- warp/__init__.pyi +794 -305
- warp/_src/__init__.py +14 -0
- warp/_src/autograd.py +1075 -0
- warp/_src/build.py +618 -0
- warp/_src/build_dll.py +640 -0
- warp/{builtins.py → _src/builtins.py} +1382 -377
- warp/_src/codegen.py +4359 -0
- warp/{config.py → _src/config.py} +178 -169
- warp/_src/constants.py +57 -0
- warp/_src/context.py +8294 -0
- warp/_src/dlpack.py +462 -0
- warp/_src/fabric.py +355 -0
- warp/_src/fem/__init__.py +14 -0
- warp/_src/fem/adaptivity.py +508 -0
- warp/_src/fem/cache.py +687 -0
- warp/_src/fem/dirichlet.py +188 -0
- warp/{fem → _src/fem}/domain.py +40 -30
- warp/_src/fem/field/__init__.py +131 -0
- warp/_src/fem/field/field.py +701 -0
- warp/{fem → _src/fem}/field/nodal_field.py +30 -15
- warp/{fem → _src/fem}/field/restriction.py +1 -1
- warp/{fem → _src/fem}/field/virtual.py +53 -27
- warp/_src/fem/geometry/__init__.py +32 -0
- warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +77 -163
- warp/_src/fem/geometry/closest_point.py +97 -0
- warp/{fem → _src/fem}/geometry/deformed_geometry.py +14 -22
- warp/{fem → _src/fem}/geometry/element.py +32 -10
- warp/{fem → _src/fem}/geometry/geometry.py +48 -20
- warp/{fem → _src/fem}/geometry/grid_2d.py +12 -23
- warp/{fem → _src/fem}/geometry/grid_3d.py +12 -23
- warp/{fem → _src/fem}/geometry/hexmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/nanogrid.py +255 -248
- warp/{fem → _src/fem}/geometry/partition.py +121 -63
- warp/{fem → _src/fem}/geometry/quadmesh.py +26 -45
- warp/{fem → _src/fem}/geometry/tetmesh.py +40 -63
- warp/{fem → _src/fem}/geometry/trimesh.py +26 -45
- warp/{fem → _src/fem}/integrate.py +164 -158
- warp/_src/fem/linalg.py +383 -0
- warp/_src/fem/operator.py +396 -0
- warp/_src/fem/polynomial.py +229 -0
- warp/{fem → _src/fem}/quadrature/pic_quadrature.py +15 -20
- warp/{fem → _src/fem}/quadrature/quadrature.py +95 -47
- warp/_src/fem/space/__init__.py +248 -0
- warp/{fem → _src/fem}/space/basis_function_space.py +20 -11
- warp/_src/fem/space/basis_space.py +679 -0
- warp/{fem → _src/fem}/space/dof_mapper.py +3 -3
- warp/{fem → _src/fem}/space/function_space.py +14 -13
- warp/{fem → _src/fem}/space/grid_2d_function_space.py +4 -7
- warp/{fem → _src/fem}/space/grid_3d_function_space.py +4 -4
- warp/{fem → _src/fem}/space/hexmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/nanogrid_function_space.py +3 -9
- warp/{fem → _src/fem}/space/partition.py +117 -60
- warp/{fem → _src/fem}/space/quadmesh_function_space.py +4 -10
- warp/{fem → _src/fem}/space/restriction.py +66 -33
- warp/_src/fem/space/shape/__init__.py +152 -0
- warp/{fem → _src/fem}/space/shape/cube_shape_function.py +9 -9
- warp/{fem → _src/fem}/space/shape/shape_function.py +8 -9
- warp/{fem → _src/fem}/space/shape/square_shape_function.py +6 -6
- warp/{fem → _src/fem}/space/shape/tet_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +3 -3
- warp/{fem → _src/fem}/space/tetmesh_function_space.py +3 -9
- warp/_src/fem/space/topology.py +459 -0
- warp/{fem → _src/fem}/space/trimesh_function_space.py +3 -9
- warp/_src/fem/types.py +112 -0
- warp/_src/fem/utils.py +486 -0
- warp/_src/jax.py +186 -0
- warp/_src/jax_experimental/__init__.py +14 -0
- warp/_src/jax_experimental/custom_call.py +387 -0
- warp/_src/jax_experimental/ffi.py +1284 -0
- warp/_src/jax_experimental/xla_ffi.py +656 -0
- warp/_src/marching_cubes.py +708 -0
- warp/_src/math.py +414 -0
- warp/_src/optim/__init__.py +14 -0
- warp/_src/optim/adam.py +163 -0
- warp/_src/optim/linear.py +1606 -0
- warp/_src/optim/sgd.py +112 -0
- warp/_src/paddle.py +406 -0
- warp/_src/render/__init__.py +14 -0
- warp/_src/render/imgui_manager.py +289 -0
- warp/_src/render/render_opengl.py +3636 -0
- warp/_src/render/render_usd.py +937 -0
- warp/_src/render/utils.py +160 -0
- warp/_src/sparse.py +2716 -0
- warp/_src/tape.py +1206 -0
- warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
- warp/_src/torch.py +391 -0
- warp/_src/types.py +5870 -0
- warp/_src/utils.py +1693 -0
- warp/autograd.py +12 -1054
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/build.py +8 -588
- warp/build_dll.py +6 -721
- warp/codegen.py +6 -4251
- warp/constants.py +6 -39
- warp/context.py +12 -8062
- warp/dlpack.py +6 -444
- warp/examples/distributed/example_jacobi_mpi.py +4 -5
- warp/examples/fem/example_adaptive_grid.py +1 -1
- warp/examples/fem/example_apic_fluid.py +1 -1
- warp/examples/fem/example_burgers.py +8 -8
- warp/examples/fem/example_diffusion.py +1 -1
- warp/examples/fem/example_distortion_energy.py +1 -1
- warp/examples/fem/example_mixed_elasticity.py +2 -2
- warp/examples/fem/example_navier_stokes.py +1 -1
- warp/examples/fem/example_nonconforming_contact.py +7 -7
- warp/examples/fem/example_stokes.py +1 -1
- warp/examples/fem/example_stokes_transfer.py +1 -1
- warp/examples/fem/utils.py +2 -2
- warp/examples/interop/example_jax_callable.py +1 -1
- warp/examples/interop/example_jax_ffi_callback.py +1 -1
- warp/examples/interop/example_jax_kernel.py +1 -1
- warp/examples/tile/example_tile_mcgp.py +191 -0
- warp/fabric.py +6 -337
- warp/fem/__init__.py +159 -97
- warp/fem/adaptivity.py +7 -489
- warp/fem/cache.py +9 -648
- warp/fem/dirichlet.py +6 -184
- warp/fem/field/__init__.py +8 -109
- warp/fem/field/field.py +7 -652
- warp/fem/geometry/__init__.py +7 -18
- warp/fem/geometry/closest_point.py +11 -77
- warp/fem/linalg.py +18 -366
- warp/fem/operator.py +11 -369
- warp/fem/polynomial.py +9 -209
- warp/fem/space/__init__.py +5 -211
- warp/fem/space/basis_space.py +6 -662
- warp/fem/space/shape/__init__.py +41 -118
- warp/fem/space/topology.py +6 -437
- warp/fem/types.py +6 -81
- warp/fem/utils.py +11 -444
- warp/jax.py +8 -165
- warp/jax_experimental/__init__.py +14 -1
- warp/jax_experimental/custom_call.py +8 -365
- warp/jax_experimental/ffi.py +17 -873
- warp/jax_experimental/xla_ffi.py +5 -605
- warp/marching_cubes.py +5 -689
- warp/math.py +16 -393
- warp/native/array.h +385 -37
- warp/native/builtin.h +314 -37
- warp/native/bvh.cpp +43 -9
- warp/native/bvh.cu +62 -27
- warp/native/bvh.h +310 -309
- warp/native/clang/clang.cpp +102 -97
- warp/native/coloring.cpp +0 -1
- warp/native/crt.h +208 -0
- warp/native/exports.h +156 -0
- warp/native/hashgrid.cu +2 -0
- warp/native/intersect.h +24 -1
- warp/native/intersect_tri.h +44 -35
- warp/native/mat.h +1456 -276
- warp/native/mesh.cpp +4 -4
- warp/native/mesh.cu +4 -2
- warp/native/mesh.h +176 -61
- warp/native/quat.h +0 -52
- warp/native/scan.cu +2 -0
- warp/native/sparse.cu +7 -3
- warp/native/spatial.h +12 -0
- warp/native/tile.h +681 -89
- warp/native/tile_radix_sort.h +1 -1
- warp/native/tile_reduce.h +394 -46
- warp/native/tile_scan.h +4 -4
- warp/native/vec.h +469 -0
- warp/native/version.h +23 -0
- warp/native/volume.cpp +1 -1
- warp/native/volume.cu +1 -0
- warp/native/volume.h +1 -1
- warp/native/volume_builder.cu +2 -0
- warp/native/warp.cpp +57 -29
- warp/native/warp.cu +253 -171
- warp/native/warp.h +11 -8
- warp/optim/__init__.py +6 -3
- warp/optim/adam.py +6 -145
- warp/optim/linear.py +14 -1585
- warp/optim/sgd.py +6 -94
- warp/paddle.py +6 -388
- warp/render/__init__.py +8 -4
- warp/render/imgui_manager.py +7 -267
- warp/render/render_opengl.py +6 -3618
- warp/render/render_usd.py +6 -919
- warp/render/utils.py +6 -142
- warp/sparse.py +37 -2563
- warp/tape.py +6 -1188
- warp/tests/__main__.py +1 -1
- warp/tests/cuda/test_async.py +4 -4
- warp/tests/cuda/test_conditional_captures.py +1 -1
- warp/tests/cuda/test_multigpu.py +1 -1
- warp/tests/cuda/test_streams.py +58 -1
- warp/tests/geometry/test_bvh.py +157 -22
- warp/tests/geometry/test_marching_cubes.py +0 -1
- warp/tests/geometry/test_mesh.py +5 -3
- warp/tests/geometry/test_mesh_query_aabb.py +5 -12
- warp/tests/geometry/test_mesh_query_point.py +5 -2
- warp/tests/geometry/test_mesh_query_ray.py +15 -3
- warp/tests/geometry/test_volume_write.py +5 -5
- warp/tests/interop/test_dlpack.py +14 -14
- warp/tests/interop/test_jax.py +772 -49
- warp/tests/interop/test_paddle.py +1 -1
- warp/tests/test_adam.py +0 -1
- warp/tests/test_arithmetic.py +9 -9
- warp/tests/test_array.py +527 -100
- warp/tests/test_array_reduce.py +3 -3
- warp/tests/test_atomic.py +12 -8
- warp/tests/test_atomic_bitwise.py +209 -0
- warp/tests/test_atomic_cas.py +4 -4
- warp/tests/test_bool.py +2 -2
- warp/tests/test_builtins_resolution.py +5 -571
- warp/tests/test_codegen.py +33 -14
- warp/tests/test_conditional.py +1 -1
- warp/tests/test_context.py +6 -6
- warp/tests/test_copy.py +242 -161
- warp/tests/test_ctypes.py +3 -3
- warp/tests/test_devices.py +24 -2
- warp/tests/test_examples.py +16 -84
- warp/tests/test_fabricarray.py +35 -35
- warp/tests/test_fast_math.py +0 -2
- warp/tests/test_fem.py +56 -10
- warp/tests/test_fixedarray.py +3 -3
- warp/tests/test_func.py +8 -5
- warp/tests/test_generics.py +1 -1
- warp/tests/test_indexedarray.py +24 -24
- warp/tests/test_intersect.py +39 -9
- warp/tests/test_large.py +1 -1
- warp/tests/test_lerp.py +3 -1
- warp/tests/test_linear_solvers.py +1 -1
- warp/tests/test_map.py +35 -4
- warp/tests/test_mat.py +52 -62
- warp/tests/test_mat_constructors.py +4 -5
- warp/tests/test_mat_lite.py +1 -1
- warp/tests/test_mat_scalar_ops.py +121 -121
- warp/tests/test_math.py +34 -0
- warp/tests/test_module_aot.py +4 -4
- warp/tests/test_modules_lite.py +28 -2
- warp/tests/test_print.py +11 -11
- warp/tests/test_quat.py +93 -58
- warp/tests/test_runlength_encode.py +1 -1
- warp/tests/test_scalar_ops.py +38 -10
- warp/tests/test_smoothstep.py +1 -1
- warp/tests/test_sparse.py +126 -15
- warp/tests/test_spatial.py +105 -87
- warp/tests/test_special_values.py +6 -6
- warp/tests/test_static.py +7 -7
- warp/tests/test_struct.py +13 -2
- warp/tests/test_triangle_closest_point.py +48 -1
- warp/tests/test_types.py +27 -15
- warp/tests/test_utils.py +52 -52
- warp/tests/test_vec.py +29 -29
- warp/tests/test_vec_constructors.py +5 -5
- warp/tests/test_vec_scalar_ops.py +97 -97
- warp/tests/test_version.py +75 -0
- warp/tests/tile/test_tile.py +178 -0
- warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
- warp/tests/tile/test_tile_cholesky.py +7 -4
- warp/tests/tile/test_tile_load.py +26 -2
- warp/tests/tile/test_tile_mathdx.py +3 -3
- warp/tests/tile/test_tile_matmul.py +1 -1
- warp/tests/tile/test_tile_mlp.py +2 -4
- warp/tests/tile/test_tile_reduce.py +214 -13
- warp/tests/unittest_suites.py +6 -14
- warp/tests/unittest_utils.py +10 -9
- warp/tests/walkthrough_debug.py +3 -1
- warp/torch.py +6 -373
- warp/types.py +29 -5764
- warp/utils.py +10 -1659
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/METADATA +46 -99
- warp_lang-1.10.0rc2.dist-info/RECORD +468 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
- warp_lang-1.10.0rc2.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
- warp/examples/assets/cartpole.urdf +0 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/nv_ant.xml +0 -92
- warp/examples/assets/nv_humanoid.xml +0 -183
- warp/examples/assets/quadruped.urdf +0 -268
- warp/examples/optim/example_bounce.py +0 -266
- warp/examples/optim/example_cloth_throw.py +0 -228
- warp/examples/optim/example_drone.py +0 -870
- warp/examples/optim/example_inverse_kinematics.py +0 -182
- warp/examples/optim/example_inverse_kinematics_torch.py +0 -191
- warp/examples/optim/example_softbody_properties.py +0 -400
- warp/examples/optim/example_spring_cage.py +0 -245
- warp/examples/optim/example_trajectory.py +0 -227
- warp/examples/sim/example_cartpole.py +0 -143
- warp/examples/sim/example_cloth.py +0 -225
- warp/examples/sim/example_cloth_self_contact.py +0 -316
- warp/examples/sim/example_granular.py +0 -130
- warp/examples/sim/example_granular_collision_sdf.py +0 -202
- warp/examples/sim/example_jacobian_ik.py +0 -244
- warp/examples/sim/example_particle_chain.py +0 -124
- warp/examples/sim/example_quadruped.py +0 -203
- warp/examples/sim/example_rigid_chain.py +0 -203
- warp/examples/sim/example_rigid_contact.py +0 -195
- warp/examples/sim/example_rigid_force.py +0 -133
- warp/examples/sim/example_rigid_gyroscopic.py +0 -115
- warp/examples/sim/example_rigid_soft_contact.py +0 -140
- warp/examples/sim/example_soft_body.py +0 -196
- warp/examples/tile/example_tile_walker.py +0 -327
- warp/sim/__init__.py +0 -74
- warp/sim/articulation.py +0 -793
- warp/sim/collide.py +0 -2570
- warp/sim/graph_coloring.py +0 -307
- warp/sim/import_mjcf.py +0 -791
- warp/sim/import_snu.py +0 -227
- warp/sim/import_urdf.py +0 -579
- warp/sim/import_usd.py +0 -898
- warp/sim/inertia.py +0 -357
- warp/sim/integrator.py +0 -245
- warp/sim/integrator_euler.py +0 -2000
- warp/sim/integrator_featherstone.py +0 -2101
- warp/sim/integrator_vbd.py +0 -2487
- warp/sim/integrator_xpbd.py +0 -3295
- warp/sim/model.py +0 -4821
- warp/sim/particles.py +0 -121
- warp/sim/render.py +0 -431
- warp/sim/utils.py +0 -431
- warp/tests/sim/disabled_kinematics.py +0 -244
- warp/tests/sim/test_cloth.py +0 -863
- warp/tests/sim/test_collision.py +0 -743
- warp/tests/sim/test_coloring.py +0 -347
- warp/tests/sim/test_inertia.py +0 -161
- warp/tests/sim/test_model.py +0 -226
- warp/tests/sim/test_sim_grad.py +0 -287
- warp/tests/sim/test_sim_grad_bounce_linear.py +0 -212
- warp/tests/sim/test_sim_kinematics.py +0 -98
- warp/thirdparty/__init__.py +0 -0
- warp_lang-1.9.1.dist-info/RECORD +0 -456
- /warp/{fem → _src/fem}/quadrature/__init__.py +0 -0
- /warp/{tests/sim → _src/thirdparty}/__init__.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/appdirs.py +0 -0
- /warp/{thirdparty → _src/thirdparty}/dlpack.py +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/WHEEL +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/licenses/LICENSE.md +0 -0
- {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/top_level.txt +0 -0
warp/tests/test_codegen.py
CHANGED
|
@@ -385,7 +385,7 @@ def test_unresolved_func(test, device):
|
|
|
385
385
|
|
|
386
386
|
# remove all references to the bad module so that subsequent calls to wp.force_load()
|
|
387
387
|
# won't try to load it unless we explicitly re-import it again
|
|
388
|
-
del wp.context.user_modules["warp.tests.aux_test_unresolved_func"]
|
|
388
|
+
del wp._src.context.user_modules["warp.tests.aux_test_unresolved_func"]
|
|
389
389
|
del sys.modules["warp.tests.aux_test_unresolved_func"]
|
|
390
390
|
|
|
391
391
|
|
|
@@ -399,7 +399,7 @@ def test_unresolved_symbol(test, device):
|
|
|
399
399
|
|
|
400
400
|
# remove all references to the bad module so that subsequent calls to wp.force_load()
|
|
401
401
|
# won't try to load it unless we explicitly re-import it again
|
|
402
|
-
del wp.context.user_modules["warp.tests.aux_test_unresolved_symbol"]
|
|
402
|
+
del wp._src.context.user_modules["warp.tests.aux_test_unresolved_symbol"]
|
|
403
403
|
del sys.modules["warp.tests.aux_test_unresolved_symbol"]
|
|
404
404
|
|
|
405
405
|
|
|
@@ -418,15 +418,15 @@ def test_error_global_var(test, device):
|
|
|
418
418
|
out = wp.empty_like(arr)
|
|
419
419
|
|
|
420
420
|
kernel = wp.Kernel(func=kernel_1_fn)
|
|
421
|
-
with test.assertRaisesRegex(TypeError, r"Invalid external reference type: <class 'warp.types.array'>"):
|
|
421
|
+
with test.assertRaisesRegex(TypeError, r"Invalid external reference type: <class 'warp._src.types.array'>"):
|
|
422
422
|
wp.launch(kernel, dim=out.shape, inputs=(), outputs=(out,), device=device)
|
|
423
423
|
|
|
424
424
|
kernel = wp.Kernel(func=kernel_2_fn)
|
|
425
|
-
with test.assertRaisesRegex(TypeError, r"Invalid external reference type: <class 'warp.types.array'>"):
|
|
425
|
+
with test.assertRaisesRegex(TypeError, r"Invalid external reference type: <class 'warp._src.types.array'>"):
|
|
426
426
|
wp.launch(kernel, dim=out.shape, inputs=(), outputs=(out,), device=device)
|
|
427
427
|
|
|
428
428
|
kernel = wp.Kernel(func=kernel_3_fn)
|
|
429
|
-
with test.assertRaisesRegex(TypeError, r"Invalid external reference type: <class 'warp.types.array'>"):
|
|
429
|
+
with test.assertRaisesRegex(TypeError, r"Invalid external reference type: <class 'warp._src.types.array'>"):
|
|
430
430
|
wp.launch(kernel, dim=out.shape, inputs=(), outputs=(out,), device=device)
|
|
431
431
|
|
|
432
432
|
|
|
@@ -477,7 +477,7 @@ def test_error_mutating_constant_in_dynamic_loop(test, device):
|
|
|
477
477
|
|
|
478
478
|
inputs = wp.array([1.0, 2.0, 3.0], dtype=float, device=device)
|
|
479
479
|
with test.assertRaisesRegex(
|
|
480
|
-
wp.codegen.WarpCodegenError,
|
|
480
|
+
wp._src.codegen.WarpCodegenError,
|
|
481
481
|
r"Error mutating a constant my_constant inside a dynamic loop, use the following syntax\: pi = float\(3\.141\) to declare a dynamic variable",
|
|
482
482
|
):
|
|
483
483
|
wp.launch(dynamic_loop_kernel, dim=1, inputs=[3, inputs], device=device)
|
|
@@ -584,28 +584,28 @@ def test_error_return_annotation_mismatch(test, device):
|
|
|
584
584
|
|
|
585
585
|
kernel = wp.Kernel(func=kernel_1_fn)
|
|
586
586
|
with test.assertRaisesRegex(
|
|
587
|
-
wp.codegen.WarpCodegenError,
|
|
587
|
+
wp._src.codegen.WarpCodegenError,
|
|
588
588
|
r"The function `foo_1` has its return type annotated as `int16` but the code returns a value of type `int8`.",
|
|
589
589
|
):
|
|
590
590
|
wp.launch(kernel, dim=1, device=device)
|
|
591
591
|
|
|
592
592
|
kernel = wp.Kernel(func=kernel_2_fn)
|
|
593
593
|
with test.assertRaisesRegex(
|
|
594
|
-
wp.codegen.WarpCodegenError,
|
|
594
|
+
wp._src.codegen.WarpCodegenError,
|
|
595
595
|
r"The function `foo_2` has its return type annotated as `int` but the code returns 2 values.",
|
|
596
596
|
):
|
|
597
597
|
wp.launch(kernel, dim=1, device=device)
|
|
598
598
|
|
|
599
599
|
kernel = wp.Kernel(func=kernel_3_fn)
|
|
600
600
|
with test.assertRaisesRegex(
|
|
601
|
-
wp.codegen.WarpCodegenError,
|
|
601
|
+
wp._src.codegen.WarpCodegenError,
|
|
602
602
|
r"The function `foo_3` has its return type annotated as `Tuple\[int, int\]` but the code returns a tuple with types `\(int32, float32\)`.",
|
|
603
603
|
):
|
|
604
604
|
wp.launch(kernel, dim=1, device=device)
|
|
605
605
|
|
|
606
606
|
kernel = wp.Kernel(func=kernel_4_fn)
|
|
607
607
|
with test.assertRaisesRegex(
|
|
608
|
-
wp.codegen.WarpCodegenError,
|
|
608
|
+
wp._src.codegen.WarpCodegenError,
|
|
609
609
|
r"The function `foo_4` has its return type annotated as a tuple of 3 elements but the code returns 2 values.",
|
|
610
610
|
):
|
|
611
611
|
wp.launch(kernel, dim=1, device=device)
|
|
@@ -623,10 +623,9 @@ def test_call_syntax():
|
|
|
623
623
|
pos = wp.vec3(1.0, 2.0, 3.0)
|
|
624
624
|
rot = wp.quat(0.0, 0.0, 0.0, 1.0)
|
|
625
625
|
scale = wp.vec3(2.0, 3.0, 4.0)
|
|
626
|
-
wp.expect_eq(wp.
|
|
627
|
-
wp.expect_eq(wp.
|
|
628
|
-
wp.expect_eq(wp.
|
|
629
|
-
wp.expect_eq(wp.matrix(rot=rot, pos=pos, dtype=wp.float32, scale=scale), expected_matrix)
|
|
626
|
+
wp.expect_eq(wp.transform_compose(pos, rot, scale), expected_matrix)
|
|
627
|
+
wp.expect_eq(wp.transform_compose(position=pos, rotation=rot, scale=scale), expected_matrix)
|
|
628
|
+
wp.expect_eq(wp.transform_compose(rotation=rot, position=pos, scale=scale), expected_matrix)
|
|
630
629
|
|
|
631
630
|
|
|
632
631
|
# test shadowing builtin functions
|
|
@@ -807,6 +806,25 @@ def test_multiple_return_values(test, device):
|
|
|
807
806
|
)
|
|
808
807
|
|
|
809
808
|
|
|
809
|
+
@wp.struct
|
|
810
|
+
class Pun:
|
|
811
|
+
f: wp.float16
|
|
812
|
+
i: wp.int16
|
|
813
|
+
|
|
814
|
+
|
|
815
|
+
@wp.kernel
|
|
816
|
+
def test_cast():
|
|
817
|
+
x = wp.int32(0x3FA00000)
|
|
818
|
+
x_casted = wp.cast(x, wp.float32)
|
|
819
|
+
wp.expect_eq(x_casted, 1.25)
|
|
820
|
+
|
|
821
|
+
p = Pun()
|
|
822
|
+
p.f = wp.float16(2.0)
|
|
823
|
+
p.i = wp.int16(123)
|
|
824
|
+
p_casted = wp.cast(p, wp.int32)
|
|
825
|
+
wp.expect_eq(p_casted, 0x007B4000)
|
|
826
|
+
|
|
827
|
+
|
|
810
828
|
class TestCodeGen(unittest.TestCase):
|
|
811
829
|
pass
|
|
812
830
|
|
|
@@ -948,6 +966,7 @@ add_function_test(
|
|
|
948
966
|
name="test_multiple_return_values",
|
|
949
967
|
devices=devices,
|
|
950
968
|
)
|
|
969
|
+
add_kernel_test(TestCodeGen, name="test_cast", kernel=test_cast, dim=1, devices=devices)
|
|
951
970
|
|
|
952
971
|
|
|
953
972
|
if __name__ == "__main__":
|
warp/tests/test_conditional.py
CHANGED
|
@@ -260,7 +260,7 @@ def test_conditional_unequal_types(test: unittest.TestCase, device):
|
|
|
260
260
|
|
|
261
261
|
# remove all references to the bad module so that subsequent calls to wp.force_load()
|
|
262
262
|
# won't try to load it unless we explicitly re-import it again
|
|
263
|
-
del wp.context.user_modules["warp.tests.aux_test_conditional_unequal_types_kernels"]
|
|
263
|
+
del wp._src.context.user_modules["warp.tests.aux_test_conditional_unequal_types_kernels"]
|
|
264
264
|
del sys.modules["warp.tests.aux_test_conditional_unequal_types_kernels"]
|
|
265
265
|
|
|
266
266
|
|
warp/tests/test_context.py
CHANGED
|
@@ -21,13 +21,13 @@ import warp as wp
|
|
|
21
21
|
|
|
22
22
|
class TestContext(unittest.TestCase):
|
|
23
23
|
def test_context_type_str(self):
|
|
24
|
-
self.assertEqual(wp.context.type_str(List[int]), "List[int]")
|
|
25
|
-
self.assertEqual(wp.context.type_str(List[float]), "List[float]")
|
|
24
|
+
self.assertEqual(wp._src.context.type_str(List[int]), "List[int]")
|
|
25
|
+
self.assertEqual(wp._src.context.type_str(List[float]), "List[float]")
|
|
26
26
|
|
|
27
|
-
self.assertEqual(wp.context.type_str(Tuple[int]), "Tuple[int]")
|
|
28
|
-
self.assertEqual(wp.context.type_str(Tuple[float]), "Tuple[float]")
|
|
29
|
-
self.assertEqual(wp.context.type_str(Tuple[int, float]), "Tuple[int, float]")
|
|
30
|
-
self.assertEqual(wp.context.type_str(Tuple[int, ...]), "Tuple[int, ...]")
|
|
27
|
+
self.assertEqual(wp._src.context.type_str(Tuple[int]), "Tuple[int]")
|
|
28
|
+
self.assertEqual(wp._src.context.type_str(Tuple[float]), "Tuple[float]")
|
|
29
|
+
self.assertEqual(wp._src.context.type_str(Tuple[int, float]), "Tuple[int, float]")
|
|
30
|
+
self.assertEqual(wp._src.context.type_str(Tuple[int, ...]), "Tuple[int, ...]")
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
if __name__ == "__main__":
|
warp/tests/test_copy.py
CHANGED
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
+
import gc
|
|
17
|
+
import importlib
|
|
16
18
|
import unittest
|
|
17
19
|
|
|
18
20
|
import numpy as np
|
|
@@ -45,164 +47,217 @@ def mul_4d(a: wp.array4d(dtype=float), s: float):
|
|
|
45
47
|
a[i, j, k, l] = a[i, j, k, l] * s
|
|
46
48
|
|
|
47
49
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
50
|
+
@wp.kernel
|
|
51
|
+
def all_equal_kernel(a: wp.array(dtype=float), value: float, result: wp.array(dtype=int)):
|
|
52
|
+
tid = wp.tid()
|
|
53
|
+
wp.atomic_min(result, 0, int(a[tid] == value))
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def assert_all_equal(a: wp.array(dtype=float), value: float):
|
|
57
|
+
result = wp.ones(1, dtype=int, device=a.device)
|
|
58
|
+
wp.launch(all_equal_kernel, dim=a.shape, inputs=[a, value, result], device=a.device)
|
|
59
|
+
assert result.numpy()[0] == 1
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_copy_strided(test, _, device1, device2):
|
|
63
|
+
np_data1 = np.arange(10, dtype=np.float32)
|
|
64
|
+
np_data2 = np.arange(100, dtype=np.float32).reshape((10, 10))
|
|
65
|
+
np_data3 = np.arange(1000, dtype=np.float32).reshape((10, 10, 10))
|
|
66
|
+
np_data4 = np.arange(10000, dtype=np.float32).reshape((10, 10, 10, 10))
|
|
67
|
+
|
|
68
|
+
wp_data1 = wp.array(data=np_data1, copy=True, device=device1)
|
|
69
|
+
wp_data2 = wp.array(data=np_data2, copy=True, device=device1)
|
|
70
|
+
wp_data3 = wp.array(data=np_data3, copy=True, device=device1)
|
|
71
|
+
wp_data4 = wp.array(data=np_data4, copy=True, device=device1)
|
|
72
|
+
|
|
73
|
+
expected1 = np_data1[1::2]
|
|
74
|
+
expected2 = np_data2[1::2, 1::2]
|
|
75
|
+
expected3 = np_data3[1::2, 1::2, 1::2]
|
|
76
|
+
expected4 = np_data4[1::2, 1::2, 1::2, 1::2]
|
|
77
|
+
|
|
78
|
+
a1 = wp_data1[1::2]
|
|
79
|
+
a2 = wp_data2[1::2, 1::2]
|
|
80
|
+
a3 = wp_data3[1::2, 1::2, 1::2]
|
|
81
|
+
a4 = wp_data4[1::2, 1::2, 1::2, 1::2]
|
|
82
|
+
|
|
83
|
+
assert_np_equal(a1.numpy(), expected1)
|
|
84
|
+
assert_np_equal(a2.numpy(), expected2)
|
|
85
|
+
assert_np_equal(a3.numpy(), expected3)
|
|
86
|
+
assert_np_equal(a4.numpy(), expected4)
|
|
87
|
+
|
|
88
|
+
b1 = wp.zeros_like(a1, device=device2)
|
|
89
|
+
b2 = wp.zeros_like(a2, device=device2)
|
|
90
|
+
b3 = wp.zeros_like(a3, device=device2)
|
|
91
|
+
b4 = wp.zeros_like(a4, device=device2)
|
|
92
|
+
|
|
93
|
+
test.assertFalse(a1.is_contiguous)
|
|
94
|
+
test.assertFalse(a2.is_contiguous)
|
|
95
|
+
test.assertFalse(a3.is_contiguous)
|
|
96
|
+
test.assertFalse(a4.is_contiguous)
|
|
97
|
+
|
|
98
|
+
test.assertTrue(b1.is_contiguous)
|
|
99
|
+
test.assertTrue(b2.is_contiguous)
|
|
100
|
+
test.assertTrue(b3.is_contiguous)
|
|
101
|
+
test.assertTrue(b4.is_contiguous)
|
|
102
|
+
|
|
103
|
+
# copy non-contiguous to contiguous
|
|
104
|
+
wp.synchronize_device(device1)
|
|
105
|
+
wp.copy(b1, a1)
|
|
106
|
+
wp.copy(b2, a2)
|
|
107
|
+
wp.copy(b3, a3)
|
|
108
|
+
wp.copy(b4, a4)
|
|
109
|
+
|
|
110
|
+
assert_np_equal(a1.numpy(), b1.numpy())
|
|
111
|
+
assert_np_equal(a2.numpy(), b2.numpy())
|
|
112
|
+
assert_np_equal(a3.numpy(), b3.numpy())
|
|
113
|
+
assert_np_equal(a4.numpy(), b4.numpy())
|
|
114
|
+
|
|
115
|
+
s = 2.0
|
|
116
|
+
|
|
117
|
+
wp.launch(mul_1d, dim=b1.shape, inputs=[b1, s], device=device2)
|
|
118
|
+
wp.launch(mul_2d, dim=b2.shape, inputs=[b2, s], device=device2)
|
|
119
|
+
wp.launch(mul_3d, dim=b3.shape, inputs=[b3, s], device=device2)
|
|
120
|
+
wp.launch(mul_4d, dim=b4.shape, inputs=[b4, s], device=device2)
|
|
121
|
+
|
|
122
|
+
# copy contiguous to non-contiguous
|
|
123
|
+
wp.synchronize_device(device2)
|
|
124
|
+
wp.copy(a1, b1)
|
|
125
|
+
wp.copy(a2, b2)
|
|
126
|
+
wp.copy(a3, b3)
|
|
127
|
+
wp.copy(a4, b4)
|
|
128
|
+
|
|
129
|
+
assert_np_equal(a1.numpy(), b1.numpy())
|
|
130
|
+
assert_np_equal(a2.numpy(), b2.numpy())
|
|
131
|
+
assert_np_equal(a3.numpy(), b3.numpy())
|
|
132
|
+
assert_np_equal(a4.numpy(), b4.numpy())
|
|
133
|
+
|
|
134
|
+
assert_np_equal(a1.numpy(), expected1 * s)
|
|
135
|
+
assert_np_equal(a2.numpy(), expected2 * s)
|
|
136
|
+
assert_np_equal(a3.numpy(), expected3 * s)
|
|
137
|
+
assert_np_equal(a4.numpy(), expected4 * s)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def test_copy_indexed(test, _, device1, device2):
|
|
141
|
+
np_data1 = np.arange(10, dtype=np.float32)
|
|
142
|
+
np_data2 = np.arange(100, dtype=np.float32).reshape((10, 10))
|
|
143
|
+
np_data3 = np.arange(1000, dtype=np.float32).reshape((10, 10, 10))
|
|
144
|
+
np_data4 = np.arange(10000, dtype=np.float32).reshape((10, 10, 10, 10))
|
|
145
|
+
|
|
146
|
+
wp_data1 = wp.array(data=np_data1, copy=True, device=device1)
|
|
147
|
+
wp_data2 = wp.array(data=np_data2, copy=True, device=device1)
|
|
148
|
+
wp_data3 = wp.array(data=np_data3, copy=True, device=device1)
|
|
149
|
+
wp_data4 = wp.array(data=np_data4, copy=True, device=device1)
|
|
150
|
+
|
|
151
|
+
np_indices = np.array([1, 5, 8, 9])
|
|
152
|
+
wp_indices = wp.array(data=np_indices, dtype=wp.int32, device=device1)
|
|
153
|
+
|
|
154
|
+
# Note: Indexing using multiple index arrays works differently
|
|
155
|
+
# in Numpy and Warp, so the syntax is different.
|
|
156
|
+
|
|
157
|
+
expected1 = np_data1[np_indices]
|
|
158
|
+
expected2 = np_data2[np_indices][:, np_indices]
|
|
159
|
+
expected3 = np_data3[np_indices][:, np_indices][:, :, np_indices]
|
|
160
|
+
expected4 = np_data4[np_indices][:, np_indices][:, :, np_indices][:, :, :, np_indices]
|
|
161
|
+
|
|
162
|
+
a1 = wp_data1[wp_indices]
|
|
163
|
+
a2 = wp_data2[wp_indices, wp_indices]
|
|
164
|
+
a3 = wp_data3[wp_indices, wp_indices, wp_indices]
|
|
165
|
+
a4 = wp_data4[wp_indices, wp_indices, wp_indices, wp_indices]
|
|
166
|
+
|
|
167
|
+
assert_np_equal(a1.numpy(), expected1)
|
|
168
|
+
assert_np_equal(a2.numpy(), expected2)
|
|
169
|
+
assert_np_equal(a3.numpy(), expected3)
|
|
170
|
+
assert_np_equal(a4.numpy(), expected4)
|
|
171
|
+
|
|
172
|
+
b1 = wp.zeros_like(a1, device=device2)
|
|
173
|
+
b2 = wp.zeros_like(a2, device=device2)
|
|
174
|
+
b3 = wp.zeros_like(a3, device=device2)
|
|
175
|
+
b4 = wp.zeros_like(a4, device=device2)
|
|
176
|
+
|
|
177
|
+
test.assertFalse(a1.is_contiguous)
|
|
178
|
+
test.assertFalse(a2.is_contiguous)
|
|
179
|
+
test.assertFalse(a3.is_contiguous)
|
|
180
|
+
test.assertFalse(a4.is_contiguous)
|
|
181
|
+
|
|
182
|
+
test.assertTrue(b1.is_contiguous)
|
|
183
|
+
test.assertTrue(b2.is_contiguous)
|
|
184
|
+
test.assertTrue(b3.is_contiguous)
|
|
185
|
+
test.assertTrue(b4.is_contiguous)
|
|
186
|
+
|
|
187
|
+
# copy non-contiguous to contiguous
|
|
188
|
+
wp.synchronize_device(device1)
|
|
189
|
+
wp.copy(b1, a1)
|
|
190
|
+
wp.copy(b2, a2)
|
|
191
|
+
wp.copy(b3, a3)
|
|
192
|
+
wp.copy(b4, a4)
|
|
193
|
+
|
|
194
|
+
assert_np_equal(a1.numpy(), b1.numpy())
|
|
195
|
+
assert_np_equal(a2.numpy(), b2.numpy())
|
|
196
|
+
assert_np_equal(a3.numpy(), b3.numpy())
|
|
197
|
+
assert_np_equal(a4.numpy(), b4.numpy())
|
|
198
|
+
|
|
199
|
+
s = 2.0
|
|
200
|
+
|
|
201
|
+
wp.launch(mul_1d, dim=b1.shape, inputs=[b1, s], device=device2)
|
|
202
|
+
wp.launch(mul_2d, dim=b2.shape, inputs=[b2, s], device=device2)
|
|
203
|
+
wp.launch(mul_3d, dim=b3.shape, inputs=[b3, s], device=device2)
|
|
204
|
+
wp.launch(mul_4d, dim=b4.shape, inputs=[b4, s], device=device2)
|
|
205
|
+
|
|
206
|
+
# copy contiguous to non-contiguous
|
|
207
|
+
wp.synchronize_device(device2)
|
|
208
|
+
wp.copy(a1, b1)
|
|
209
|
+
wp.copy(a2, b2)
|
|
210
|
+
wp.copy(a3, b3)
|
|
211
|
+
wp.copy(a4, b4)
|
|
212
|
+
|
|
213
|
+
assert_np_equal(a1.numpy(), b1.numpy())
|
|
214
|
+
assert_np_equal(a2.numpy(), b2.numpy())
|
|
215
|
+
assert_np_equal(a3.numpy(), b3.numpy())
|
|
216
|
+
assert_np_equal(a4.numpy(), b4.numpy())
|
|
217
|
+
|
|
218
|
+
assert_np_equal(a1.numpy(), expected1 * s)
|
|
219
|
+
assert_np_equal(a2.numpy(), expected2 * s)
|
|
220
|
+
assert_np_equal(a3.numpy(), expected3 * s)
|
|
221
|
+
assert_np_equal(a4.numpy(), expected4 * s)
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def test_copy_large_stride(test, _, device1, device2):
|
|
225
|
+
# NOTE: This test can use ~8GB of memory. To prevent errors, we skip if there is insufficient memory.
|
|
226
|
+
|
|
227
|
+
gc.collect()
|
|
228
|
+
|
|
229
|
+
if device1.is_cpu or device2.is_cpu:
|
|
230
|
+
if importlib.util.find_spec("psutil") is None:
|
|
231
|
+
test.skipTest("The 'psutil' package is required to check available memory")
|
|
232
|
+
|
|
233
|
+
if device1.free_memory < 12e9 or device2.free_memory < 12e9:
|
|
234
|
+
test.skipTest("Insufficient free memory")
|
|
235
|
+
|
|
236
|
+
N = 500_000_000
|
|
237
|
+
|
|
238
|
+
a_data = wp.empty((N, 2), dtype=wp.float32, device=device1)
|
|
239
|
+
a = a_data[:, 0] # array with a large stride (offsets > 32 bits)
|
|
240
|
+
|
|
241
|
+
b = wp.empty_like(a, device=device2)
|
|
242
|
+
|
|
243
|
+
a.fill_(1)
|
|
244
|
+
b.fill_(2)
|
|
245
|
+
|
|
246
|
+
# NOTE: use a memory-efficient check to avoid running out of memory
|
|
247
|
+
assert_all_equal(a, 1)
|
|
248
|
+
assert_all_equal(b, 2)
|
|
249
|
+
|
|
250
|
+
# copy to large-strided array
|
|
251
|
+
wp.synchronize_device(device2)
|
|
252
|
+
wp.copy(a, b)
|
|
253
|
+
assert_all_equal(a, 2)
|
|
254
|
+
|
|
255
|
+
a.fill_(1)
|
|
256
|
+
|
|
257
|
+
# copy from large-strided array
|
|
258
|
+
wp.synchronize_device(device1)
|
|
259
|
+
wp.copy(b, a)
|
|
260
|
+
assert_all_equal(b, 1)
|
|
206
261
|
|
|
207
262
|
|
|
208
263
|
def test_copy_adjoint(test, device):
|
|
@@ -228,10 +283,36 @@ class TestCopy(unittest.TestCase):
|
|
|
228
283
|
pass
|
|
229
284
|
|
|
230
285
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
286
|
+
for src_device in devices:
|
|
287
|
+
src_name = "cpu" if src_device.is_cpu else f"cuda{src_device.ordinal}"
|
|
288
|
+
for dst_device in devices:
|
|
289
|
+
dst_name = "cpu" if dst_device.is_cpu else f"cuda{dst_device.ordinal}"
|
|
290
|
+
add_function_test(
|
|
291
|
+
TestCopy,
|
|
292
|
+
f"test_copy_strided_{src_name}_{dst_name}",
|
|
293
|
+
test_copy_strided,
|
|
294
|
+
devices=None,
|
|
295
|
+
device1=src_device,
|
|
296
|
+
device2=dst_device,
|
|
297
|
+
)
|
|
298
|
+
add_function_test(
|
|
299
|
+
TestCopy,
|
|
300
|
+
f"test_copy_indexed_{src_name}_{dst_name}",
|
|
301
|
+
test_copy_indexed,
|
|
302
|
+
devices=None,
|
|
303
|
+
device1=src_device,
|
|
304
|
+
device2=dst_device,
|
|
305
|
+
)
|
|
306
|
+
add_function_test(
|
|
307
|
+
TestCopy,
|
|
308
|
+
f"test_copy_large_stride_{src_name}_{dst_name}",
|
|
309
|
+
test_copy_large_stride,
|
|
310
|
+
devices=None,
|
|
311
|
+
device1=src_device,
|
|
312
|
+
device2=dst_device,
|
|
313
|
+
)
|
|
234
314
|
|
|
315
|
+
add_function_test(TestCopy, "test_copy_adjoint", test_copy_adjoint, devices=devices)
|
|
235
316
|
|
|
236
317
|
if __name__ == "__main__":
|
|
237
318
|
wp.clear_kernel_cache()
|
warp/tests/test_ctypes.py
CHANGED
|
@@ -107,7 +107,7 @@ def test_transform_multiply(test, device, n):
|
|
|
107
107
|
wp.launch(transform_multiply, dim=n, inputs=[xforms, a], device=device)
|
|
108
108
|
|
|
109
109
|
|
|
110
|
-
transformf = wp.types.transformation(dtype=wp.float32)
|
|
110
|
+
transformf = wp._src.types.transformation(dtype=wp.float32)
|
|
111
111
|
|
|
112
112
|
|
|
113
113
|
@wp.kernel
|
|
@@ -117,7 +117,7 @@ def test_transformation_constructor():
|
|
|
117
117
|
c = wp.transform_identity(dtype=wp.float64)
|
|
118
118
|
|
|
119
119
|
|
|
120
|
-
spatial_vector = wp.types.vector(length=6, dtype=wp.float32)
|
|
120
|
+
spatial_vector = wp._src.types.vector(length=6, dtype=wp.float32)
|
|
121
121
|
|
|
122
122
|
|
|
123
123
|
@wp.kernel
|
|
@@ -327,7 +327,7 @@ def test_scalar_array_types_store(
|
|
|
327
327
|
def test_type_conversions():
|
|
328
328
|
# below tests auto-generated by the following snippet:
|
|
329
329
|
|
|
330
|
-
# scalar_types_all = [*wp.types.scalar_types, int, float]
|
|
330
|
+
# scalar_types_all = [*wp._src.types.scalar_types, int, float]
|
|
331
331
|
# for t in scalar_types_all:
|
|
332
332
|
# for u in scalar_types_all:
|
|
333
333
|
|
warp/tests/test_devices.py
CHANGED
|
@@ -44,7 +44,7 @@ def test_devices_map_cuda_device(test, device):
|
|
|
44
44
|
# Map alias twice to check code path
|
|
45
45
|
wp.map_cuda_device("new_alias")
|
|
46
46
|
wp.map_cuda_device("new_alias")
|
|
47
|
-
wp.context.runtime.rename_device(device, saved_alias)
|
|
47
|
+
wp._src.context.runtime.rename_device(device, saved_alias)
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
def test_devices_verify_cuda_device(test, device):
|
|
@@ -52,7 +52,7 @@ def test_devices_verify_cuda_device(test, device):
|
|
|
52
52
|
|
|
53
53
|
wp.config.verify_cuda = True
|
|
54
54
|
|
|
55
|
-
wp.context.runtime.verify_cuda_device(device)
|
|
55
|
+
wp._src.context.runtime.verify_cuda_device(device)
|
|
56
56
|
|
|
57
57
|
wp.config.verify_cuda = verify_cuda_saved
|
|
58
58
|
|
|
@@ -85,6 +85,28 @@ class TestDevices(unittest.TestCase):
|
|
|
85
85
|
with self.assertRaises(RuntimeError):
|
|
86
86
|
wp.unmap_cuda_device("imaginary_device:0")
|
|
87
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
|
+
|
|
88
110
|
|
|
89
111
|
add_function_test(
|
|
90
112
|
TestDevices,
|