warp-lang 1.2.2__py3-none-win_amd64.whl → 1.3.0__py3-none-win_amd64.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 +8 -6
- warp/autograd.py +823 -0
- warp/bin/warp-clang.dll +0 -0
- warp/bin/warp.dll +0 -0
- warp/build.py +6 -2
- warp/builtins.py +1410 -886
- warp/codegen.py +503 -166
- warp/config.py +48 -18
- warp/context.py +400 -198
- warp/dlpack.py +8 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/benchmarks/benchmark_cloth_warp.py +1 -1
- warp/examples/benchmarks/benchmark_interop_torch.py +158 -0
- warp/examples/benchmarks/benchmark_launches.py +1 -1
- warp/examples/core/example_cupy.py +78 -0
- warp/examples/fem/example_apic_fluid.py +17 -36
- warp/examples/fem/example_burgers.py +9 -18
- warp/examples/fem/example_convection_diffusion.py +7 -17
- warp/examples/fem/example_convection_diffusion_dg.py +27 -47
- warp/examples/fem/example_deformed_geometry.py +11 -22
- warp/examples/fem/example_diffusion.py +7 -18
- warp/examples/fem/example_diffusion_3d.py +24 -28
- warp/examples/fem/example_diffusion_mgpu.py +7 -14
- warp/examples/fem/example_magnetostatics.py +190 -0
- warp/examples/fem/example_mixed_elasticity.py +111 -80
- warp/examples/fem/example_navier_stokes.py +30 -34
- warp/examples/fem/example_nonconforming_contact.py +290 -0
- warp/examples/fem/example_stokes.py +17 -32
- warp/examples/fem/example_stokes_transfer.py +12 -21
- warp/examples/fem/example_streamlines.py +350 -0
- warp/examples/fem/utils.py +936 -0
- warp/fabric.py +5 -2
- warp/fem/__init__.py +13 -3
- warp/fem/cache.py +161 -11
- warp/fem/dirichlet.py +37 -28
- warp/fem/domain.py +105 -14
- warp/fem/field/__init__.py +14 -3
- warp/fem/field/field.py +454 -11
- warp/fem/field/nodal_field.py +33 -18
- warp/fem/geometry/deformed_geometry.py +50 -15
- warp/fem/geometry/hexmesh.py +12 -24
- warp/fem/geometry/nanogrid.py +106 -31
- warp/fem/geometry/quadmesh_2d.py +6 -11
- warp/fem/geometry/tetmesh.py +103 -61
- warp/fem/geometry/trimesh_2d.py +98 -47
- warp/fem/integrate.py +231 -186
- warp/fem/operator.py +14 -9
- warp/fem/quadrature/pic_quadrature.py +35 -9
- warp/fem/quadrature/quadrature.py +119 -32
- warp/fem/space/basis_space.py +98 -22
- warp/fem/space/collocated_function_space.py +3 -1
- warp/fem/space/function_space.py +7 -2
- warp/fem/space/grid_2d_function_space.py +3 -3
- warp/fem/space/grid_3d_function_space.py +4 -4
- warp/fem/space/hexmesh_function_space.py +3 -2
- warp/fem/space/nanogrid_function_space.py +12 -14
- warp/fem/space/partition.py +45 -47
- warp/fem/space/restriction.py +19 -16
- warp/fem/space/shape/cube_shape_function.py +91 -3
- warp/fem/space/shape/shape_function.py +7 -0
- warp/fem/space/shape/square_shape_function.py +32 -0
- warp/fem/space/shape/tet_shape_function.py +11 -7
- warp/fem/space/shape/triangle_shape_function.py +10 -1
- warp/fem/space/topology.py +116 -42
- warp/fem/types.py +8 -1
- warp/fem/utils.py +301 -83
- warp/native/array.h +16 -0
- warp/native/builtin.h +0 -15
- warp/native/cuda_util.cpp +14 -6
- warp/native/exports.h +1348 -1308
- warp/native/quat.h +79 -0
- warp/native/rand.h +27 -4
- warp/native/sparse.cpp +83 -81
- warp/native/sparse.cu +381 -453
- warp/native/vec.h +64 -0
- warp/native/volume.cpp +40 -49
- warp/native/volume_builder.cu +2 -3
- warp/native/volume_builder.h +12 -17
- warp/native/warp.cu +3 -3
- warp/native/warp.h +69 -59
- warp/render/render_opengl.py +17 -9
- warp/sim/articulation.py +117 -17
- warp/sim/collide.py +35 -29
- warp/sim/model.py +123 -18
- warp/sim/render.py +3 -1
- warp/sparse.py +867 -203
- warp/stubs.py +312 -541
- warp/tape.py +29 -1
- warp/tests/disabled_kinematics.py +1 -1
- warp/tests/test_adam.py +1 -1
- warp/tests/test_arithmetic.py +1 -1
- warp/tests/test_array.py +58 -1
- warp/tests/test_array_reduce.py +1 -1
- warp/tests/test_async.py +1 -1
- warp/tests/test_atomic.py +1 -1
- warp/tests/test_bool.py +1 -1
- warp/tests/test_builtins_resolution.py +1 -1
- warp/tests/test_bvh.py +6 -1
- warp/tests/test_closest_point_edge_edge.py +1 -1
- warp/tests/test_codegen.py +66 -1
- warp/tests/test_compile_consts.py +1 -1
- warp/tests/test_conditional.py +1 -1
- warp/tests/test_copy.py +1 -1
- warp/tests/test_ctypes.py +1 -1
- warp/tests/test_dense.py +1 -1
- warp/tests/test_devices.py +1 -1
- warp/tests/test_dlpack.py +1 -1
- warp/tests/test_examples.py +33 -4
- warp/tests/test_fabricarray.py +5 -2
- warp/tests/test_fast_math.py +1 -1
- warp/tests/test_fem.py +213 -6
- warp/tests/test_fp16.py +1 -1
- warp/tests/test_func.py +1 -1
- warp/tests/test_future_annotations.py +90 -0
- warp/tests/test_generics.py +1 -1
- warp/tests/test_grad.py +1 -1
- warp/tests/test_grad_customs.py +1 -1
- warp/tests/test_grad_debug.py +247 -0
- warp/tests/test_hash_grid.py +6 -1
- warp/tests/test_implicit_init.py +354 -0
- warp/tests/test_import.py +1 -1
- warp/tests/test_indexedarray.py +1 -1
- warp/tests/test_intersect.py +1 -1
- warp/tests/test_jax.py +1 -1
- warp/tests/test_large.py +1 -1
- warp/tests/test_launch.py +1 -1
- warp/tests/test_lerp.py +1 -1
- warp/tests/test_linear_solvers.py +1 -1
- warp/tests/test_lvalue.py +1 -1
- warp/tests/test_marching_cubes.py +5 -2
- warp/tests/test_mat.py +34 -35
- warp/tests/test_mat_lite.py +2 -1
- warp/tests/test_mat_scalar_ops.py +1 -1
- warp/tests/test_math.py +1 -1
- warp/tests/test_matmul.py +20 -16
- warp/tests/test_matmul_lite.py +1 -1
- warp/tests/test_mempool.py +1 -1
- warp/tests/test_mesh.py +5 -2
- warp/tests/test_mesh_query_aabb.py +1 -1
- warp/tests/test_mesh_query_point.py +1 -1
- warp/tests/test_mesh_query_ray.py +1 -1
- warp/tests/test_mlp.py +1 -1
- warp/tests/test_model.py +1 -1
- warp/tests/test_module_hashing.py +77 -1
- warp/tests/test_modules_lite.py +1 -1
- warp/tests/test_multigpu.py +1 -1
- warp/tests/test_noise.py +1 -1
- warp/tests/test_operators.py +1 -1
- warp/tests/test_options.py +1 -1
- warp/tests/test_overwrite.py +542 -0
- warp/tests/test_peer.py +1 -1
- warp/tests/test_pinned.py +1 -1
- warp/tests/test_print.py +1 -1
- warp/tests/test_quat.py +15 -1
- warp/tests/test_rand.py +1 -1
- warp/tests/test_reload.py +1 -1
- warp/tests/test_rounding.py +1 -1
- warp/tests/test_runlength_encode.py +1 -1
- warp/tests/test_scalar_ops.py +95 -0
- warp/tests/test_sim_grad.py +1 -1
- warp/tests/test_sim_kinematics.py +1 -1
- warp/tests/test_smoothstep.py +1 -1
- warp/tests/test_sparse.py +82 -15
- warp/tests/test_spatial.py +1 -1
- warp/tests/test_special_values.py +2 -11
- warp/tests/test_streams.py +11 -1
- warp/tests/test_struct.py +1 -1
- warp/tests/test_tape.py +1 -1
- warp/tests/test_torch.py +194 -1
- warp/tests/test_transient_module.py +1 -1
- warp/tests/test_types.py +1 -1
- warp/tests/test_utils.py +1 -1
- warp/tests/test_vec.py +15 -63
- warp/tests/test_vec_lite.py +2 -1
- warp/tests/test_vec_scalar_ops.py +65 -1
- warp/tests/test_verify_fp.py +1 -1
- warp/tests/test_volume.py +28 -2
- warp/tests/test_volume_write.py +1 -1
- warp/tests/unittest_serial.py +1 -1
- warp/tests/unittest_suites.py +9 -1
- warp/tests/walkthrough_debug.py +1 -1
- warp/thirdparty/unittest_parallel.py +2 -5
- warp/torch.py +103 -41
- warp/types.py +341 -224
- warp/utils.py +11 -2
- {warp_lang-1.2.2.dist-info → warp_lang-1.3.0.dist-info}/METADATA +99 -46
- warp_lang-1.3.0.dist-info/RECORD +368 -0
- warp/examples/fem/bsr_utils.py +0 -378
- warp/examples/fem/mesh_utils.py +0 -133
- warp/examples/fem/plot_utils.py +0 -292
- warp_lang-1.2.2.dist-info/RECORD +0 -359
- {warp_lang-1.2.2.dist-info → warp_lang-1.3.0.dist-info}/LICENSE.md +0 -0
- {warp_lang-1.2.2.dist-info → warp_lang-1.3.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.2.2.dist-info → warp_lang-1.3.0.dist-info}/top_level.txt +0 -0
warp/tests/test_matmul.py
CHANGED
|
@@ -72,17 +72,19 @@ class gemm_test_bed_runner:
|
|
|
72
72
|
ones = wp.zeros_like(D)
|
|
73
73
|
ones.fill_(1.0)
|
|
74
74
|
|
|
75
|
+
np_dtype = wp.types.warp_type_to_np_dtype[self.dtype]
|
|
76
|
+
|
|
75
77
|
if batch_count == 1:
|
|
76
78
|
tape = wp.Tape()
|
|
77
79
|
with tape:
|
|
78
80
|
wp.matmul(A, B, C, D, alpha, beta, False)
|
|
79
81
|
tape.backward(grads={D: ones})
|
|
80
82
|
|
|
81
|
-
D_np = alpha * (A.numpy()
|
|
83
|
+
D_np = alpha * np.matmul(A.numpy(), B.numpy(), dtype=np_dtype) + beta * C.numpy()
|
|
82
84
|
assert_np_equal(D.numpy(), D_np)
|
|
83
85
|
|
|
84
|
-
adj_A_np = alpha * np.matmul(ones.numpy(), B.numpy().transpose())
|
|
85
|
-
adj_B_np = alpha * (A.numpy().transpose()
|
|
86
|
+
adj_A_np = alpha * np.matmul(ones.numpy(), B.numpy().transpose(), dtype=np_dtype)
|
|
87
|
+
adj_B_np = alpha * np.matmul(A.numpy().transpose(), ones.numpy(), dtype=np_dtype)
|
|
86
88
|
adj_C_np = beta * ones.numpy()
|
|
87
89
|
|
|
88
90
|
else:
|
|
@@ -91,11 +93,11 @@ class gemm_test_bed_runner:
|
|
|
91
93
|
wp.batched_matmul(A, B, C, D, alpha, beta, False)
|
|
92
94
|
tape.backward(grads={D: ones})
|
|
93
95
|
|
|
94
|
-
D_np = alpha * np.matmul(A.numpy(), B.numpy()) + beta * C.numpy()
|
|
96
|
+
D_np = alpha * np.matmul(A.numpy(), B.numpy(), dtype=np_dtype) + beta * C.numpy()
|
|
95
97
|
assert_np_equal(D.numpy(), D_np)
|
|
96
98
|
|
|
97
|
-
adj_A_np = alpha * np.matmul(ones.numpy(), B.numpy().transpose((0, 2, 1)))
|
|
98
|
-
adj_B_np = alpha * np.matmul(A.numpy().transpose((0, 2, 1)), ones.numpy())
|
|
99
|
+
adj_A_np = alpha * np.matmul(ones.numpy(), B.numpy().transpose((0, 2, 1)), dtype=np_dtype)
|
|
100
|
+
adj_B_np = alpha * np.matmul(A.numpy().transpose((0, 2, 1)), ones.numpy(), dtype=np_dtype)
|
|
99
101
|
adj_C_np = beta * ones.numpy()
|
|
100
102
|
|
|
101
103
|
assert_np_equal(A.grad.numpy(), adj_A_np)
|
|
@@ -103,9 +105,9 @@ class gemm_test_bed_runner:
|
|
|
103
105
|
assert_np_equal(C.grad.numpy(), adj_C_np)
|
|
104
106
|
|
|
105
107
|
def run(self):
|
|
106
|
-
Ms = [64, 128,
|
|
107
|
-
Ns = [64, 128,
|
|
108
|
-
Ks = [64, 128,
|
|
108
|
+
Ms = [64, 128, 256]
|
|
109
|
+
Ns = [64, 128, 256]
|
|
110
|
+
Ks = [64, 128, 256]
|
|
109
111
|
batch_counts = [1, 4]
|
|
110
112
|
betas = [0.0, 1.0]
|
|
111
113
|
alpha = 1.0
|
|
@@ -188,6 +190,8 @@ class gemm_test_bed_runner_transpose:
|
|
|
188
190
|
ones3 = wp.zeros_like(D3)
|
|
189
191
|
ones3.fill_(1.0)
|
|
190
192
|
|
|
193
|
+
np_dtype = wp.types.warp_type_to_np_dtype[self.dtype]
|
|
194
|
+
|
|
191
195
|
if batch_count == 1:
|
|
192
196
|
ATT1 = AT1.transpose([1, 0])
|
|
193
197
|
BTT1 = BT1.transpose([1, 0])
|
|
@@ -200,13 +204,13 @@ class gemm_test_bed_runner_transpose:
|
|
|
200
204
|
wp.matmul(ATT2, BTT2, C3, D3, alpha, beta, False)
|
|
201
205
|
tape.backward(grads={D1: ones1, D2: ones2, D3: ones3})
|
|
202
206
|
|
|
203
|
-
D_np = alpha * (A.numpy()
|
|
207
|
+
D_np = alpha * np.matmul(A.numpy(), B.numpy(), dtype=np_dtype) + beta * C1.numpy()
|
|
204
208
|
assert_np_equal(D1.numpy(), D_np)
|
|
205
209
|
assert_np_equal(D2.numpy(), D_np)
|
|
206
210
|
assert_np_equal(D3.numpy(), D_np)
|
|
207
211
|
|
|
208
|
-
adj_A_np = alpha * (ones1.numpy()
|
|
209
|
-
adj_B_np = alpha * (A.numpy().transpose()
|
|
212
|
+
adj_A_np = alpha * np.matmul(ones1.numpy(), B.numpy().transpose(), dtype=np_dtype)
|
|
213
|
+
adj_B_np = alpha * np.matmul(A.numpy().transpose(), ones1.numpy(), dtype=np_dtype)
|
|
210
214
|
adj_C_np = beta * ones1.numpy()
|
|
211
215
|
|
|
212
216
|
else:
|
|
@@ -221,13 +225,13 @@ class gemm_test_bed_runner_transpose:
|
|
|
221
225
|
wp.batched_matmul(ATT2, BTT2, C3, D3, alpha, beta, False)
|
|
222
226
|
tape.backward(grads={D1: ones1, D2: ones2, D3: ones3})
|
|
223
227
|
|
|
224
|
-
D_np = alpha * np.matmul(A.numpy(), B.numpy()) + beta * C1.numpy()
|
|
228
|
+
D_np = alpha * np.matmul(A.numpy(), B.numpy(), dtype=np_dtype) + beta * C1.numpy()
|
|
225
229
|
assert_np_equal(D1.numpy(), D_np)
|
|
226
230
|
assert_np_equal(D2.numpy(), D_np)
|
|
227
231
|
assert_np_equal(D3.numpy(), D_np)
|
|
228
232
|
|
|
229
|
-
adj_A_np = alpha * np.matmul(ones1.numpy(), B.numpy().transpose((0, 2, 1)))
|
|
230
|
-
adj_B_np = alpha * np.matmul(A.numpy().transpose((0, 2, 1)), ones1.numpy())
|
|
233
|
+
adj_A_np = alpha * np.matmul(ones1.numpy(), B.numpy().transpose((0, 2, 1)), dtype=np_dtype)
|
|
234
|
+
adj_B_np = alpha * np.matmul(A.numpy().transpose((0, 2, 1)), ones1.numpy(), dtype=np_dtype)
|
|
231
235
|
adj_C_np = beta * ones1.numpy()
|
|
232
236
|
|
|
233
237
|
assert_np_equal(A.grad.numpy(), adj_A_np)
|
|
@@ -494,5 +498,5 @@ add_function_test(TestMatmul, "test_cuda_graph_capture", test_cuda_graph_capture
|
|
|
494
498
|
|
|
495
499
|
|
|
496
500
|
if __name__ == "__main__":
|
|
497
|
-
wp.
|
|
501
|
+
wp.clear_kernel_cache()
|
|
498
502
|
unittest.main(verbosity=2, failfast=False)
|
warp/tests/test_matmul_lite.py
CHANGED
warp/tests/test_mempool.py
CHANGED
warp/tests/test_mesh.py
CHANGED
|
@@ -266,7 +266,10 @@ devices = get_test_devices()
|
|
|
266
266
|
|
|
267
267
|
|
|
268
268
|
class TestMesh(unittest.TestCase):
|
|
269
|
-
|
|
269
|
+
def test_mesh_new_del(self):
|
|
270
|
+
# test the scenario in which a mesh is created but not initialized before gc
|
|
271
|
+
instance = wp.Mesh.__new__(wp.Mesh)
|
|
272
|
+
instance.__del__()
|
|
270
273
|
|
|
271
274
|
|
|
272
275
|
add_function_test(TestMesh, "test_mesh_read_properties", test_mesh_read_properties, devices=devices)
|
|
@@ -277,5 +280,5 @@ add_function_test(TestMesh, "test_mesh_exceptions", test_mesh_exceptions, device
|
|
|
277
280
|
|
|
278
281
|
|
|
279
282
|
if __name__ == "__main__":
|
|
280
|
-
wp.
|
|
283
|
+
wp.clear_kernel_cache()
|
|
281
284
|
unittest.main(verbosity=2)
|
|
@@ -686,5 +686,5 @@ add_function_test(TestMeshQueryPoint, "test_mesh_query_furthest_point", test_mes
|
|
|
686
686
|
add_function_test(TestMeshQueryPoint, "test_adj_mesh_query_point", test_adj_mesh_query_point, devices=devices)
|
|
687
687
|
|
|
688
688
|
if __name__ == "__main__":
|
|
689
|
-
wp.
|
|
689
|
+
wp.clear_kernel_cache()
|
|
690
690
|
unittest.main(verbosity=2)
|
warp/tests/test_mlp.py
CHANGED
warp/tests/test_model.py
CHANGED
|
@@ -66,6 +66,65 @@ def fn(value: int):
|
|
|
66
66
|
wp.print(value + 1)
|
|
67
67
|
"""
|
|
68
68
|
|
|
69
|
+
FUNC_GENERIC_1 = """# -*- coding: utf-8 -*-
|
|
70
|
+
import warp as wp
|
|
71
|
+
|
|
72
|
+
from typing import Any
|
|
73
|
+
|
|
74
|
+
@wp.func
|
|
75
|
+
def generic_fn(x: Any):
|
|
76
|
+
return x * x
|
|
77
|
+
|
|
78
|
+
@wp.func
|
|
79
|
+
def generic_fn(x: Any, y: Any):
|
|
80
|
+
return x * y
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
# should be same hash as FUNC_GENERIC_1
|
|
84
|
+
FUNC_GENERIC_2 = """# -*- coding: utf-8 -*-
|
|
85
|
+
import warp as wp
|
|
86
|
+
|
|
87
|
+
from typing import Any
|
|
88
|
+
|
|
89
|
+
@wp.func
|
|
90
|
+
def generic_fn(x: Any):
|
|
91
|
+
return x * x
|
|
92
|
+
|
|
93
|
+
@wp.func
|
|
94
|
+
def generic_fn(x: Any, y: Any):
|
|
95
|
+
return x * y
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
# should be different hash than FUNC_GENERIC_1 (first overload is different)
|
|
99
|
+
FUNC_GENERIC_3 = """# -*- coding: utf-8 -*-
|
|
100
|
+
import warp as wp
|
|
101
|
+
|
|
102
|
+
from typing import Any
|
|
103
|
+
|
|
104
|
+
@wp.func
|
|
105
|
+
def generic_fn(x: Any):
|
|
106
|
+
return x + x
|
|
107
|
+
|
|
108
|
+
@wp.func
|
|
109
|
+
def generic_fn(x: Any, y: Any):
|
|
110
|
+
return x * y
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
# should be different hash than FUNC_GENERIC_1 (second overload is different)
|
|
114
|
+
FUNC_GENERIC_4 = """# -*- coding: utf-8 -*-
|
|
115
|
+
import warp as wp
|
|
116
|
+
|
|
117
|
+
from typing import Any
|
|
118
|
+
|
|
119
|
+
@wp.func
|
|
120
|
+
def generic_fn(x: Any):
|
|
121
|
+
return x * x
|
|
122
|
+
|
|
123
|
+
@wp.func
|
|
124
|
+
def generic_fn(x: Any, y: Any):
|
|
125
|
+
return x + y
|
|
126
|
+
"""
|
|
127
|
+
|
|
69
128
|
|
|
70
129
|
def load_code_as_module(code, name):
|
|
71
130
|
file, file_path = tempfile.mkstemp(suffix=".py")
|
|
@@ -99,13 +158,30 @@ def test_function_overload_hashing(test, device):
|
|
|
99
158
|
test.assertNotEqual(hash4, hash1)
|
|
100
159
|
|
|
101
160
|
|
|
161
|
+
def test_function_generic_overload_hashing(test, device):
|
|
162
|
+
m1 = load_code_as_module(FUNC_GENERIC_1, "func_generic_1")
|
|
163
|
+
m2 = load_code_as_module(FUNC_GENERIC_2, "func_generic_2")
|
|
164
|
+
m3 = load_code_as_module(FUNC_GENERIC_3, "func_generic_3")
|
|
165
|
+
m4 = load_code_as_module(FUNC_GENERIC_4, "func_generic_4")
|
|
166
|
+
|
|
167
|
+
hash1 = m1.hash_module()
|
|
168
|
+
hash2 = m2.hash_module()
|
|
169
|
+
hash3 = m3.hash_module()
|
|
170
|
+
hash4 = m4.hash_module()
|
|
171
|
+
|
|
172
|
+
test.assertEqual(hash2, hash1)
|
|
173
|
+
test.assertNotEqual(hash3, hash1)
|
|
174
|
+
test.assertNotEqual(hash4, hash1)
|
|
175
|
+
|
|
176
|
+
|
|
102
177
|
class TestModuleHashing(unittest.TestCase):
|
|
103
178
|
pass
|
|
104
179
|
|
|
105
180
|
|
|
106
181
|
add_function_test(TestModuleHashing, "test_function_overload_hashing", test_function_overload_hashing)
|
|
182
|
+
add_function_test(TestModuleHashing, "test_function_generic_overload_hashing", test_function_generic_overload_hashing)
|
|
107
183
|
|
|
108
184
|
|
|
109
185
|
if __name__ == "__main__":
|
|
110
|
-
wp.
|
|
186
|
+
wp.clear_kernel_cache()
|
|
111
187
|
unittest.main(verbosity=2)
|
warp/tests/test_modules_lite.py
CHANGED
warp/tests/test_multigpu.py
CHANGED
warp/tests/test_noise.py
CHANGED
warp/tests/test_operators.py
CHANGED
warp/tests/test_options.py
CHANGED