warp-lang 1.0.0b2__py3-none-win_amd64.whl → 1.0.0b6__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.
- docs/conf.py +17 -5
- examples/env/env_ant.py +1 -1
- examples/env/env_cartpole.py +1 -1
- examples/env/env_humanoid.py +1 -1
- examples/env/env_usd.py +4 -1
- examples/env/environment.py +8 -9
- examples/example_dem.py +34 -33
- examples/example_diffray.py +364 -337
- examples/example_fluid.py +32 -23
- examples/example_jacobian_ik.py +97 -93
- examples/example_marching_cubes.py +6 -16
- examples/example_mesh.py +6 -16
- examples/example_mesh_intersect.py +16 -14
- examples/example_nvdb.py +14 -16
- examples/example_raycast.py +14 -13
- examples/example_raymarch.py +16 -23
- examples/example_render_opengl.py +19 -10
- examples/example_sim_cartpole.py +82 -78
- examples/example_sim_cloth.py +45 -48
- examples/example_sim_fk_grad.py +51 -44
- examples/example_sim_fk_grad_torch.py +47 -40
- examples/example_sim_grad_bounce.py +108 -133
- examples/example_sim_grad_cloth.py +99 -113
- examples/example_sim_granular.py +5 -6
- examples/{example_sim_sdf_shape.py → example_sim_granular_collision_sdf.py} +37 -26
- examples/example_sim_neo_hookean.py +51 -55
- examples/example_sim_particle_chain.py +4 -4
- examples/example_sim_quadruped.py +126 -81
- examples/example_sim_rigid_chain.py +54 -61
- examples/example_sim_rigid_contact.py +66 -70
- examples/example_sim_rigid_fem.py +3 -3
- examples/example_sim_rigid_force.py +1 -1
- examples/example_sim_rigid_gyroscopic.py +3 -4
- examples/example_sim_rigid_kinematics.py +28 -39
- examples/example_sim_trajopt.py +112 -110
- examples/example_sph.py +9 -8
- examples/example_wave.py +7 -7
- examples/fem/bsr_utils.py +30 -17
- examples/fem/example_apic_fluid.py +85 -69
- examples/fem/example_convection_diffusion.py +97 -93
- examples/fem/example_convection_diffusion_dg.py +142 -149
- examples/fem/example_convection_diffusion_dg0.py +141 -136
- examples/fem/example_deformed_geometry.py +146 -0
- examples/fem/example_diffusion.py +115 -84
- examples/fem/example_diffusion_3d.py +116 -86
- examples/fem/example_diffusion_mgpu.py +102 -79
- examples/fem/example_mixed_elasticity.py +139 -100
- examples/fem/example_navier_stokes.py +175 -162
- examples/fem/example_stokes.py +143 -111
- examples/fem/example_stokes_transfer.py +186 -157
- examples/fem/mesh_utils.py +59 -97
- examples/fem/plot_utils.py +138 -17
- tools/ci/publishing/build_nodes_info.py +54 -0
- warp/__init__.py +4 -3
- warp/__init__.pyi +1 -0
- warp/bin/warp-clang.dll +0 -0
- warp/bin/warp.dll +0 -0
- warp/build.py +5 -3
- warp/build_dll.py +29 -9
- warp/builtins.py +836 -492
- warp/codegen.py +864 -553
- warp/config.py +3 -1
- warp/context.py +389 -172
- warp/fem/__init__.py +24 -6
- warp/fem/cache.py +318 -25
- warp/fem/dirichlet.py +7 -3
- warp/fem/domain.py +14 -0
- warp/fem/field/__init__.py +30 -38
- warp/fem/field/field.py +149 -0
- warp/fem/field/nodal_field.py +244 -138
- warp/fem/field/restriction.py +8 -6
- warp/fem/field/test.py +127 -59
- warp/fem/field/trial.py +117 -60
- warp/fem/geometry/__init__.py +5 -1
- warp/fem/geometry/deformed_geometry.py +271 -0
- warp/fem/geometry/element.py +24 -1
- warp/fem/geometry/geometry.py +86 -14
- warp/fem/geometry/grid_2d.py +112 -54
- warp/fem/geometry/grid_3d.py +134 -65
- warp/fem/geometry/hexmesh.py +953 -0
- warp/fem/geometry/partition.py +85 -33
- warp/fem/geometry/quadmesh_2d.py +532 -0
- warp/fem/geometry/tetmesh.py +451 -115
- warp/fem/geometry/trimesh_2d.py +197 -92
- warp/fem/integrate.py +534 -268
- warp/fem/operator.py +58 -31
- warp/fem/polynomial.py +11 -0
- warp/fem/quadrature/__init__.py +1 -1
- warp/fem/quadrature/pic_quadrature.py +150 -58
- warp/fem/quadrature/quadrature.py +209 -57
- warp/fem/space/__init__.py +230 -53
- warp/fem/space/basis_space.py +489 -0
- warp/fem/space/collocated_function_space.py +105 -0
- warp/fem/space/dof_mapper.py +49 -2
- warp/fem/space/function_space.py +90 -39
- warp/fem/space/grid_2d_function_space.py +149 -496
- warp/fem/space/grid_3d_function_space.py +173 -538
- warp/fem/space/hexmesh_function_space.py +352 -0
- warp/fem/space/partition.py +129 -76
- warp/fem/space/quadmesh_2d_function_space.py +369 -0
- warp/fem/space/restriction.py +46 -34
- warp/fem/space/shape/__init__.py +15 -0
- warp/fem/space/shape/cube_shape_function.py +738 -0
- warp/fem/space/shape/shape_function.py +103 -0
- warp/fem/space/shape/square_shape_function.py +611 -0
- warp/fem/space/shape/tet_shape_function.py +567 -0
- warp/fem/space/shape/triangle_shape_function.py +429 -0
- warp/fem/space/tetmesh_function_space.py +132 -1039
- warp/fem/space/topology.py +295 -0
- warp/fem/space/trimesh_2d_function_space.py +104 -742
- warp/fem/types.py +13 -11
- warp/fem/utils.py +335 -60
- warp/native/array.h +120 -34
- warp/native/builtin.h +101 -72
- warp/native/bvh.cpp +73 -325
- warp/native/bvh.cu +406 -23
- warp/native/bvh.h +22 -40
- warp/native/clang/clang.cpp +1 -0
- warp/native/crt.h +2 -0
- warp/native/cuda_util.cpp +8 -3
- warp/native/cuda_util.h +1 -0
- warp/native/exports.h +1522 -1243
- warp/native/intersect.h +19 -4
- warp/native/intersect_adj.h +8 -8
- warp/native/mat.h +76 -17
- warp/native/mesh.cpp +33 -108
- warp/native/mesh.cu +114 -18
- warp/native/mesh.h +395 -40
- warp/native/noise.h +272 -329
- warp/native/quat.h +51 -8
- warp/native/rand.h +44 -34
- warp/native/reduce.cpp +1 -1
- warp/native/sparse.cpp +4 -4
- warp/native/sparse.cu +163 -155
- warp/native/spatial.h +2 -2
- warp/native/temp_buffer.h +18 -14
- warp/native/vec.h +103 -21
- warp/native/warp.cpp +2 -1
- warp/native/warp.cu +28 -3
- warp/native/warp.h +4 -3
- warp/render/render_opengl.py +261 -109
- warp/sim/__init__.py +1 -2
- warp/sim/articulation.py +385 -185
- warp/sim/import_mjcf.py +59 -48
- warp/sim/import_urdf.py +15 -15
- warp/sim/import_usd.py +174 -102
- warp/sim/inertia.py +17 -18
- warp/sim/integrator_xpbd.py +4 -3
- warp/sim/model.py +330 -250
- warp/sim/render.py +1 -1
- warp/sparse.py +625 -152
- warp/stubs.py +341 -309
- warp/tape.py +9 -6
- warp/tests/__main__.py +3 -6
- warp/tests/assets/curlnoise_golden.npy +0 -0
- warp/tests/assets/pnoise_golden.npy +0 -0
- warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
- warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
- warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
- warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
- warp/tests/aux_test_unresolved_func.py +14 -0
- warp/tests/aux_test_unresolved_symbol.py +14 -0
- warp/tests/disabled_kinematics.py +239 -0
- warp/tests/run_coverage_serial.py +31 -0
- warp/tests/test_adam.py +103 -106
- warp/tests/test_arithmetic.py +94 -74
- warp/tests/test_array.py +82 -101
- warp/tests/test_array_reduce.py +57 -23
- warp/tests/test_atomic.py +64 -28
- warp/tests/test_bool.py +22 -12
- warp/tests/test_builtins_resolution.py +1292 -0
- warp/tests/test_bvh.py +18 -18
- warp/tests/test_closest_point_edge_edge.py +54 -57
- warp/tests/test_codegen.py +165 -134
- warp/tests/test_compile_consts.py +28 -20
- warp/tests/test_conditional.py +108 -24
- warp/tests/test_copy.py +10 -12
- warp/tests/test_ctypes.py +112 -88
- warp/tests/test_dense.py +21 -14
- warp/tests/test_devices.py +98 -0
- warp/tests/test_dlpack.py +75 -75
- warp/tests/test_examples.py +237 -0
- warp/tests/test_fabricarray.py +22 -24
- warp/tests/test_fast_math.py +15 -11
- warp/tests/test_fem.py +1034 -124
- warp/tests/test_fp16.py +23 -16
- warp/tests/test_func.py +187 -86
- warp/tests/test_generics.py +194 -49
- warp/tests/test_grad.py +123 -181
- warp/tests/test_grad_customs.py +176 -0
- warp/tests/test_hash_grid.py +35 -34
- warp/tests/test_import.py +10 -23
- warp/tests/test_indexedarray.py +24 -25
- warp/tests/test_intersect.py +18 -9
- warp/tests/test_large.py +141 -0
- warp/tests/test_launch.py +14 -41
- warp/tests/test_lerp.py +64 -65
- warp/tests/test_lvalue.py +493 -0
- warp/tests/test_marching_cubes.py +12 -13
- warp/tests/test_mat.py +517 -2898
- warp/tests/test_mat_lite.py +115 -0
- warp/tests/test_mat_scalar_ops.py +2889 -0
- warp/tests/test_math.py +103 -9
- warp/tests/test_matmul.py +304 -69
- warp/tests/test_matmul_lite.py +410 -0
- warp/tests/test_mesh.py +60 -22
- warp/tests/test_mesh_query_aabb.py +21 -25
- warp/tests/test_mesh_query_point.py +111 -22
- warp/tests/test_mesh_query_ray.py +12 -24
- warp/tests/test_mlp.py +30 -22
- warp/tests/test_model.py +92 -89
- warp/tests/test_modules_lite.py +39 -0
- warp/tests/test_multigpu.py +88 -114
- warp/tests/test_noise.py +12 -11
- warp/tests/test_operators.py +16 -20
- warp/tests/test_options.py +11 -11
- warp/tests/test_pinned.py +17 -18
- warp/tests/test_print.py +32 -11
- warp/tests/test_quat.py +275 -129
- warp/tests/test_rand.py +18 -16
- warp/tests/test_reload.py +38 -34
- warp/tests/test_rounding.py +50 -43
- warp/tests/test_runlength_encode.py +168 -20
- warp/tests/test_smoothstep.py +9 -11
- warp/tests/test_snippet.py +143 -0
- warp/tests/test_sparse.py +261 -63
- warp/tests/test_spatial.py +276 -243
- warp/tests/test_streams.py +110 -85
- warp/tests/test_struct.py +268 -63
- warp/tests/test_tape.py +39 -21
- warp/tests/test_torch.py +90 -86
- warp/tests/test_transient_module.py +10 -12
- warp/tests/test_types.py +363 -0
- warp/tests/test_utils.py +451 -0
- warp/tests/test_vec.py +354 -2050
- warp/tests/test_vec_lite.py +73 -0
- warp/tests/test_vec_scalar_ops.py +2099 -0
- warp/tests/test_volume.py +418 -376
- warp/tests/test_volume_write.py +124 -134
- warp/tests/unittest_serial.py +35 -0
- warp/tests/unittest_suites.py +291 -0
- warp/tests/unittest_utils.py +342 -0
- warp/tests/{test_misc.py → unused_test_misc.py} +13 -5
- warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
- warp/thirdparty/appdirs.py +36 -45
- warp/thirdparty/unittest_parallel.py +589 -0
- warp/types.py +622 -211
- warp/utils.py +54 -393
- warp_lang-1.0.0b6.dist-info/METADATA +238 -0
- warp_lang-1.0.0b6.dist-info/RECORD +409 -0
- {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/WHEEL +1 -1
- examples/example_cache_management.py +0 -40
- examples/example_multigpu.py +0 -54
- examples/example_struct.py +0 -65
- examples/fem/example_stokes_transfer_3d.py +0 -210
- warp/bin/warp-clang.so +0 -0
- warp/bin/warp.so +0 -0
- warp/fem/field/discrete_field.py +0 -80
- warp/fem/space/nodal_function_space.py +0 -233
- warp/tests/test_all.py +0 -223
- warp/tests/test_array_scan.py +0 -60
- warp/tests/test_base.py +0 -208
- warp/tests/test_unresolved_func.py +0 -7
- warp/tests/test_unresolved_symbol.py +0 -7
- warp_lang-1.0.0b2.dist-info/METADATA +0 -26
- warp_lang-1.0.0b2.dist-info/RECORD +0 -380
- /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
- /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
- /warp/tests/{test_square.py → aux_test_square.py} +0 -0
- {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/LICENSE.md +0 -0
- {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/top_level.txt +0 -0
warp/tests/test_lerp.py
CHANGED
|
@@ -5,14 +5,16 @@
|
|
|
5
5
|
# distribution of this software and related documentation without an express
|
|
6
6
|
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
7
|
|
|
8
|
+
import unittest
|
|
8
9
|
from dataclasses import dataclass
|
|
9
10
|
from typing import Any
|
|
10
|
-
import unittest
|
|
11
11
|
|
|
12
12
|
import numpy as np
|
|
13
13
|
|
|
14
14
|
import warp as wp
|
|
15
|
-
from warp.tests.
|
|
15
|
+
from warp.tests.unittest_utils import *
|
|
16
|
+
|
|
17
|
+
wp.init()
|
|
16
18
|
|
|
17
19
|
|
|
18
20
|
@dataclass
|
|
@@ -162,8 +164,6 @@ TEST_DATA = {
|
|
|
162
164
|
),
|
|
163
165
|
}
|
|
164
166
|
|
|
165
|
-
wp.init()
|
|
166
|
-
|
|
167
167
|
|
|
168
168
|
def test_lerp(test, device):
|
|
169
169
|
def make_kernel_fn(data_type):
|
|
@@ -179,84 +179,83 @@ def test_lerp(test, device):
|
|
|
179
179
|
|
|
180
180
|
for data_type in TEST_DATA:
|
|
181
181
|
kernel_fn = make_kernel_fn(data_type)
|
|
182
|
-
module = wp.get_module(kernel_fn.__module__)
|
|
183
182
|
kernel = wp.Kernel(
|
|
184
183
|
func=kernel_fn,
|
|
185
184
|
key=f"test_lerp_{data_type.__name__}_kernel",
|
|
186
|
-
module=module,
|
|
187
185
|
)
|
|
188
186
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
requires_grad=True,
|
|
195
|
-
)
|
|
196
|
-
b = wp.array(
|
|
197
|
-
[test_data.b],
|
|
198
|
-
dtype=data_type,
|
|
199
|
-
device=device,
|
|
200
|
-
requires_grad=True,
|
|
201
|
-
)
|
|
202
|
-
t = wp.array(
|
|
203
|
-
[test_data.t],
|
|
204
|
-
dtype=float,
|
|
205
|
-
device=device,
|
|
206
|
-
requires_grad=True,
|
|
207
|
-
)
|
|
208
|
-
out = wp.array(
|
|
209
|
-
[0] * wp.types.type_length(data_type),
|
|
210
|
-
dtype=data_type,
|
|
211
|
-
device=device,
|
|
212
|
-
requires_grad=True,
|
|
213
|
-
)
|
|
214
|
-
|
|
215
|
-
tape = wp.Tape()
|
|
216
|
-
with tape:
|
|
217
|
-
wp.launch(
|
|
218
|
-
kernel,
|
|
219
|
-
dim=1,
|
|
220
|
-
inputs=[a, b, t, out],
|
|
187
|
+
with test.subTest(data_type=data_type):
|
|
188
|
+
for test_data in TEST_DATA[data_type]:
|
|
189
|
+
a = wp.array(
|
|
190
|
+
[test_data.a],
|
|
191
|
+
dtype=data_type,
|
|
221
192
|
device=device,
|
|
193
|
+
requires_grad=True,
|
|
222
194
|
)
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
)
|
|
229
|
-
|
|
230
|
-
if test_data.check_backwards():
|
|
231
|
-
tape.backward(out)
|
|
232
|
-
|
|
233
|
-
assert_np_equal(
|
|
234
|
-
tape.gradients[a].numpy(),
|
|
235
|
-
np.array([test_data.expected_adj_a]),
|
|
236
|
-
tol=1e-6,
|
|
195
|
+
b = wp.array(
|
|
196
|
+
[test_data.b],
|
|
197
|
+
dtype=data_type,
|
|
198
|
+
device=device,
|
|
199
|
+
requires_grad=True,
|
|
237
200
|
)
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
201
|
+
t = wp.array(
|
|
202
|
+
[test_data.t],
|
|
203
|
+
dtype=float,
|
|
204
|
+
device=device,
|
|
205
|
+
requires_grad=True,
|
|
206
|
+
)
|
|
207
|
+
out = wp.array(
|
|
208
|
+
[0] * wp.types.type_length(data_type),
|
|
209
|
+
dtype=data_type,
|
|
210
|
+
device=device,
|
|
211
|
+
requires_grad=True,
|
|
242
212
|
)
|
|
213
|
+
|
|
214
|
+
tape = wp.Tape()
|
|
215
|
+
with tape:
|
|
216
|
+
wp.launch(
|
|
217
|
+
kernel,
|
|
218
|
+
dim=1,
|
|
219
|
+
inputs=[a, b, t, out],
|
|
220
|
+
device=device,
|
|
221
|
+
)
|
|
222
|
+
|
|
243
223
|
assert_np_equal(
|
|
244
|
-
|
|
245
|
-
np.array([test_data.
|
|
224
|
+
out.numpy(),
|
|
225
|
+
np.array([test_data.expected]),
|
|
246
226
|
tol=1e-6,
|
|
247
227
|
)
|
|
248
228
|
|
|
229
|
+
if test_data.check_backwards():
|
|
230
|
+
tape.backward(out)
|
|
231
|
+
|
|
232
|
+
assert_np_equal(
|
|
233
|
+
tape.gradients[a].numpy(),
|
|
234
|
+
np.array([test_data.expected_adj_a]),
|
|
235
|
+
tol=1e-6,
|
|
236
|
+
)
|
|
237
|
+
assert_np_equal(
|
|
238
|
+
tape.gradients[b].numpy(),
|
|
239
|
+
np.array([test_data.expected_adj_b]),
|
|
240
|
+
tol=1e-6,
|
|
241
|
+
)
|
|
242
|
+
assert_np_equal(
|
|
243
|
+
tape.gradients[t].numpy(),
|
|
244
|
+
np.array([test_data.expected_adj_t]),
|
|
245
|
+
tol=1e-6,
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
devices = get_test_devices()
|
|
250
|
+
|
|
249
251
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
+
class TestLerp(unittest.TestCase):
|
|
253
|
+
pass
|
|
252
254
|
|
|
253
|
-
class TestLerp(parent):
|
|
254
|
-
pass
|
|
255
255
|
|
|
256
|
-
|
|
257
|
-
return TestLerp
|
|
256
|
+
add_function_test(TestLerp, "test_lerp", test_lerp, devices=devices)
|
|
258
257
|
|
|
259
258
|
|
|
260
259
|
if __name__ == "__main__":
|
|
261
|
-
|
|
260
|
+
wp.build.clear_kernel_cache()
|
|
262
261
|
unittest.main(verbosity=2)
|
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
# Copyright (c) 2023 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
+
# NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
+
# and proprietary rights in and to this software, related documentation
|
|
4
|
+
# and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
+
# distribution of this software and related documentation without an express
|
|
6
|
+
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
+
|
|
8
|
+
import unittest
|
|
9
|
+
|
|
10
|
+
import warp as wp
|
|
11
|
+
from warp.tests.unittest_utils import *
|
|
12
|
+
|
|
13
|
+
wp.init()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@wp.kernel
|
|
17
|
+
def rmw_array_kernel(foos: wp.array(dtype=wp.uint32)):
|
|
18
|
+
i = wp.tid()
|
|
19
|
+
|
|
20
|
+
foos[i] += wp.uint32(1)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_rmw_array(test, device):
|
|
24
|
+
arr = wp.zeros((10,), dtype=wp.uint32, device=device)
|
|
25
|
+
|
|
26
|
+
wp.launch(
|
|
27
|
+
kernel=rmw_array_kernel,
|
|
28
|
+
dim=(10,),
|
|
29
|
+
inputs=[arr],
|
|
30
|
+
device=device,
|
|
31
|
+
)
|
|
32
|
+
wp.synchronize()
|
|
33
|
+
|
|
34
|
+
for f in arr.list():
|
|
35
|
+
if f != 1:
|
|
36
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@wp.struct
|
|
40
|
+
class RmwFoo:
|
|
41
|
+
field: wp.uint32
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@wp.kernel
|
|
45
|
+
def rmw_array_struct_kernel(foos: wp.array(dtype=RmwFoo)):
|
|
46
|
+
i = wp.tid()
|
|
47
|
+
foos[i].field += wp.uint32(1)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def test_rmw_array_struct(test, device):
|
|
51
|
+
foos = wp.zeros((10,), dtype=RmwFoo, device=device)
|
|
52
|
+
|
|
53
|
+
wp.launch(
|
|
54
|
+
kernel=rmw_array_struct_kernel,
|
|
55
|
+
dim=(10,),
|
|
56
|
+
inputs=[foos],
|
|
57
|
+
device=device,
|
|
58
|
+
)
|
|
59
|
+
wp.synchronize()
|
|
60
|
+
|
|
61
|
+
expected = RmwFoo()
|
|
62
|
+
expected.field = 1
|
|
63
|
+
for f in foos.list():
|
|
64
|
+
if f.field != expected.field:
|
|
65
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
@wp.func
|
|
69
|
+
def lookup(foos: wp.array(dtype=wp.uint32), index: int):
|
|
70
|
+
return foos[index]
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@wp.kernel
|
|
74
|
+
def lookup_kernel(foos: wp.array(dtype=wp.uint32)):
|
|
75
|
+
i = wp.tid()
|
|
76
|
+
|
|
77
|
+
x = lookup(foos, i)
|
|
78
|
+
foos[i] = x + wp.uint32(1)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def test_lookup(test, device):
|
|
82
|
+
arr = wp.zeros((10,), dtype=wp.uint32, device=device)
|
|
83
|
+
|
|
84
|
+
wp.launch(
|
|
85
|
+
kernel=lookup_kernel,
|
|
86
|
+
dim=(10,),
|
|
87
|
+
inputs=[arr],
|
|
88
|
+
device=device,
|
|
89
|
+
)
|
|
90
|
+
wp.synchronize()
|
|
91
|
+
|
|
92
|
+
for f in arr.list():
|
|
93
|
+
if f != 1:
|
|
94
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@wp.func
|
|
98
|
+
def lookup3(foos: wp.array(dtype=wp.float32), index: int):
|
|
99
|
+
return foos[index]
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@wp.kernel
|
|
103
|
+
def grad_kernel(foos: wp.array(dtype=wp.float32), bars: wp.array(dtype=wp.float32)):
|
|
104
|
+
i = wp.tid()
|
|
105
|
+
|
|
106
|
+
x = lookup3(foos, i)
|
|
107
|
+
bars[i] = x * wp.float32(i) + 1.0
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def test_grad(test, device):
|
|
111
|
+
num = 10
|
|
112
|
+
data = np.linspace(20, 20 + num, num, endpoint=False, dtype=np.float32)
|
|
113
|
+
input = wp.array(data, device=device, requires_grad=True)
|
|
114
|
+
output = wp.zeros(num, dtype=wp.float32, device=device)
|
|
115
|
+
|
|
116
|
+
ones = wp.array(np.ones(len(output)), dtype=wp.float32, device=device)
|
|
117
|
+
|
|
118
|
+
tape = wp.Tape()
|
|
119
|
+
with tape:
|
|
120
|
+
wp.launch(
|
|
121
|
+
kernel=grad_kernel,
|
|
122
|
+
dim=(num,),
|
|
123
|
+
inputs=[input],
|
|
124
|
+
outputs=[output],
|
|
125
|
+
device=device,
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
tape.backward(grads={output: ones})
|
|
129
|
+
|
|
130
|
+
wp.synchronize()
|
|
131
|
+
|
|
132
|
+
# test forward results
|
|
133
|
+
for i, f in enumerate(output.list()):
|
|
134
|
+
expected = data[i] * i + 1
|
|
135
|
+
if f != expected:
|
|
136
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
|
|
137
|
+
|
|
138
|
+
# test backward results
|
|
139
|
+
for i, f in enumerate(tape.gradients[input].list()):
|
|
140
|
+
expected = i
|
|
141
|
+
if f != expected:
|
|
142
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
@wp.func
|
|
146
|
+
def lookup2(foos: wp.array(dtype=wp.uint32), index: int):
|
|
147
|
+
if index % 2 == 0:
|
|
148
|
+
x = foos[index]
|
|
149
|
+
x = wp.uint32(0)
|
|
150
|
+
return x
|
|
151
|
+
else:
|
|
152
|
+
return foos[index]
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
@wp.kernel
|
|
156
|
+
def lookup2_kernel(foos: wp.array(dtype=wp.uint32)):
|
|
157
|
+
i = wp.tid()
|
|
158
|
+
|
|
159
|
+
x = lookup2(foos, i)
|
|
160
|
+
foos[i] = x + wp.uint32(1)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def test_lookup2(test, device):
|
|
164
|
+
arr = wp.zeros((10,), dtype=wp.uint32, device=device)
|
|
165
|
+
|
|
166
|
+
wp.launch(
|
|
167
|
+
kernel=lookup2_kernel,
|
|
168
|
+
dim=(10,),
|
|
169
|
+
inputs=[arr],
|
|
170
|
+
device=device,
|
|
171
|
+
)
|
|
172
|
+
wp.synchronize()
|
|
173
|
+
|
|
174
|
+
for f in arr.list():
|
|
175
|
+
if f != 1:
|
|
176
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
@wp.kernel
|
|
180
|
+
def unary_kernel(foos: wp.array(dtype=wp.uint32)):
|
|
181
|
+
i = wp.tid()
|
|
182
|
+
|
|
183
|
+
foos[i] = wp.uint32(-1)
|
|
184
|
+
x = -foos[i]
|
|
185
|
+
foos[i] = x
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def test_unary(test, device):
|
|
189
|
+
arr = wp.zeros((10,), dtype=wp.uint32, device=device)
|
|
190
|
+
|
|
191
|
+
wp.launch(
|
|
192
|
+
kernel=unary_kernel,
|
|
193
|
+
dim=(10,),
|
|
194
|
+
inputs=[arr],
|
|
195
|
+
device=device,
|
|
196
|
+
)
|
|
197
|
+
wp.synchronize()
|
|
198
|
+
|
|
199
|
+
for f in arr.list():
|
|
200
|
+
if f != 1:
|
|
201
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
@wp.kernel
|
|
205
|
+
def rvalue_kernel(foos: wp.array(dtype=wp.uint32)):
|
|
206
|
+
i = wp.tid()
|
|
207
|
+
|
|
208
|
+
if foos[i] < wp.uint32(1):
|
|
209
|
+
foos[i] = wp.uint32(1)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def test_rvalue(test, device):
|
|
213
|
+
arr = wp.zeros((10,), dtype=wp.uint32, device=device)
|
|
214
|
+
|
|
215
|
+
wp.launch(
|
|
216
|
+
kernel=rvalue_kernel,
|
|
217
|
+
dim=(10,),
|
|
218
|
+
inputs=[arr],
|
|
219
|
+
device=device,
|
|
220
|
+
)
|
|
221
|
+
wp.synchronize()
|
|
222
|
+
|
|
223
|
+
for f in arr.list():
|
|
224
|
+
if f != 1:
|
|
225
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
# Tests, among other things, that assigning a reference to a new variable does
|
|
229
|
+
# not create a reference
|
|
230
|
+
@wp.kernel
|
|
231
|
+
def intermediate_kernel(foos: wp.array(dtype=wp.uint32)):
|
|
232
|
+
i = wp.tid()
|
|
233
|
+
|
|
234
|
+
x = foos[i]
|
|
235
|
+
x = x + wp.uint32(1)
|
|
236
|
+
foos[i] = x
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def test_intermediate(test, device):
|
|
240
|
+
arr = wp.zeros((10,), dtype=wp.uint32, device=device)
|
|
241
|
+
|
|
242
|
+
wp.launch(
|
|
243
|
+
kernel=intermediate_kernel,
|
|
244
|
+
dim=(10,),
|
|
245
|
+
inputs=[arr],
|
|
246
|
+
device=device,
|
|
247
|
+
)
|
|
248
|
+
wp.synchronize()
|
|
249
|
+
|
|
250
|
+
for f in arr.list():
|
|
251
|
+
if f != 1:
|
|
252
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
@wp.kernel
|
|
256
|
+
def array_kernel(foos: wp.array(dtype=wp.uint32)):
|
|
257
|
+
i = wp.tid()
|
|
258
|
+
foos[i] = wp.uint32(1)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def test_array_assign(test, device):
|
|
262
|
+
arr = wp.zeros((10,), dtype=wp.uint32, device=device)
|
|
263
|
+
|
|
264
|
+
wp.launch(
|
|
265
|
+
kernel=array_kernel,
|
|
266
|
+
dim=(10,),
|
|
267
|
+
inputs=[arr],
|
|
268
|
+
device=device,
|
|
269
|
+
)
|
|
270
|
+
wp.synchronize()
|
|
271
|
+
|
|
272
|
+
for f in arr.list():
|
|
273
|
+
if f != 1:
|
|
274
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
@wp.func
|
|
278
|
+
def increment(arg: wp.uint32):
|
|
279
|
+
return arg + wp.uint32(1)
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
@wp.kernel
|
|
283
|
+
def array_call_kernel(foos: wp.array(dtype=wp.uint32)):
|
|
284
|
+
i = wp.tid()
|
|
285
|
+
foos[i] = increment(foos[i])
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def test_array_call_assign(test, device):
|
|
289
|
+
arr = wp.zeros((10,), dtype=wp.uint32, device=device)
|
|
290
|
+
|
|
291
|
+
wp.launch(
|
|
292
|
+
kernel=array_kernel,
|
|
293
|
+
dim=(10,),
|
|
294
|
+
inputs=[arr],
|
|
295
|
+
device=device,
|
|
296
|
+
)
|
|
297
|
+
wp.synchronize()
|
|
298
|
+
|
|
299
|
+
for f in arr.list():
|
|
300
|
+
if f != 1:
|
|
301
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
@wp.struct
|
|
305
|
+
class Foo:
|
|
306
|
+
field: wp.uint32
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
@wp.kernel
|
|
310
|
+
def array_struct_kernel(foos: wp.array(dtype=Foo)):
|
|
311
|
+
i = wp.tid()
|
|
312
|
+
foos[i].field = wp.uint32(1)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def test_array_struct_assign(test, device):
|
|
316
|
+
foos = wp.zeros((10,), dtype=Foo, device=device)
|
|
317
|
+
|
|
318
|
+
wp.launch(
|
|
319
|
+
kernel=array_struct_kernel,
|
|
320
|
+
dim=(10,),
|
|
321
|
+
inputs=[foos],
|
|
322
|
+
device=device,
|
|
323
|
+
)
|
|
324
|
+
wp.synchronize()
|
|
325
|
+
|
|
326
|
+
expected = Foo()
|
|
327
|
+
expected.field = 1
|
|
328
|
+
for f in foos.list():
|
|
329
|
+
if f.field != expected.field:
|
|
330
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
@wp.struct
|
|
334
|
+
class Bar:
|
|
335
|
+
field: wp.uint32
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
@wp.struct
|
|
339
|
+
class Baz:
|
|
340
|
+
bar: Bar
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
@wp.kernel
|
|
344
|
+
def array_struct_struct_kernel(foos: wp.array(dtype=Baz)):
|
|
345
|
+
i = wp.tid()
|
|
346
|
+
foos[i].bar.field = wp.uint32(1)
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
def test_array_struct_struct_assign(test, device):
|
|
350
|
+
foos = wp.zeros((10,), dtype=Baz, device=device)
|
|
351
|
+
|
|
352
|
+
wp.launch(
|
|
353
|
+
kernel=array_struct_struct_kernel,
|
|
354
|
+
dim=(10,),
|
|
355
|
+
inputs=[foos],
|
|
356
|
+
device=device,
|
|
357
|
+
)
|
|
358
|
+
wp.synchronize()
|
|
359
|
+
|
|
360
|
+
expected = Baz()
|
|
361
|
+
expected.bar.field = 1
|
|
362
|
+
for f in foos.list():
|
|
363
|
+
if f.bar.field != expected.bar.field:
|
|
364
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
@wp.struct
|
|
368
|
+
class S:
|
|
369
|
+
a: wp.uint32
|
|
370
|
+
b: wp.float32
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
@wp.struct
|
|
374
|
+
class F:
|
|
375
|
+
x: wp.float32
|
|
376
|
+
s: S
|
|
377
|
+
y: wp.int32
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
@wp.kernel
|
|
381
|
+
def complex_kernel(foos: wp.array(dtype=F)):
|
|
382
|
+
i = wp.tid()
|
|
383
|
+
foos[i].x += wp.float32(1.0)
|
|
384
|
+
foos[i].y = wp.int32(2)
|
|
385
|
+
foos[i].s.b += wp.float32(3.0)
|
|
386
|
+
foos[i].s.a = wp.uint32(foos[i].y)
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
def test_complex(test, device):
|
|
390
|
+
foos = wp.zeros((10,), dtype=F, device=device)
|
|
391
|
+
|
|
392
|
+
wp.launch(
|
|
393
|
+
kernel=complex_kernel,
|
|
394
|
+
dim=(10,),
|
|
395
|
+
inputs=[foos],
|
|
396
|
+
device=device,
|
|
397
|
+
)
|
|
398
|
+
wp.synchronize()
|
|
399
|
+
|
|
400
|
+
expected = F()
|
|
401
|
+
expected.x = 1.0
|
|
402
|
+
expected.y = 2
|
|
403
|
+
expected.s.b = 3.0
|
|
404
|
+
expected.s.a = expected.y
|
|
405
|
+
for f in foos.list():
|
|
406
|
+
if f.x != expected.x or f.y != expected.y or f.s.a != expected.s.a or f.s.b != expected.s.b:
|
|
407
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
@wp.struct
|
|
411
|
+
class Svec:
|
|
412
|
+
a: wp.uint32
|
|
413
|
+
b: wp.vec2f
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
@wp.struct
|
|
417
|
+
class Fvec:
|
|
418
|
+
x: wp.vec2f
|
|
419
|
+
s: Svec
|
|
420
|
+
y: wp.int32
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
@wp.kernel
|
|
424
|
+
def swizzle_kernel(foos: wp.array(dtype=Fvec)):
|
|
425
|
+
i = wp.tid()
|
|
426
|
+
|
|
427
|
+
foos[i].x += wp.vec2f(1.0, 2.0)
|
|
428
|
+
foos[i].y = wp.int32(3)
|
|
429
|
+
foos[i].s.b = wp.vec2f(4.0, 5.0)
|
|
430
|
+
foos[i].s.b.y = wp.float32(6.0)
|
|
431
|
+
foos[i].s.b.x = foos[i].x.y
|
|
432
|
+
foos[i].s.a = wp.uint32(foos[i].y)
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
def test_swizzle(test, device):
|
|
436
|
+
foos = wp.zeros((10,), dtype=Fvec, device=device)
|
|
437
|
+
|
|
438
|
+
wp.launch(
|
|
439
|
+
kernel=swizzle_kernel,
|
|
440
|
+
dim=(10,),
|
|
441
|
+
inputs=[foos],
|
|
442
|
+
device=device,
|
|
443
|
+
)
|
|
444
|
+
wp.synchronize()
|
|
445
|
+
|
|
446
|
+
expected = Fvec()
|
|
447
|
+
expected.x = wp.vec2f(1.0, 2.0)
|
|
448
|
+
expected.y = 3
|
|
449
|
+
expected.s.b = wp.vec2f(4.0, 5.0)
|
|
450
|
+
expected.s.b.y = 6.0
|
|
451
|
+
expected.s.b.x = expected.x.y
|
|
452
|
+
expected.s.a = expected.y
|
|
453
|
+
for f in foos.list():
|
|
454
|
+
if f.x != expected.x or f.y != expected.y or f.s.a != expected.s.a or f.s.b != expected.s.b:
|
|
455
|
+
raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
devices = get_test_devices()
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
class TestLValue(unittest.TestCase):
|
|
462
|
+
def test_swizzle_error_invalid_attribute(self):
|
|
463
|
+
v = wp.vec3(1, 2, 3)
|
|
464
|
+
with self.assertRaisesRegex(
|
|
465
|
+
AttributeError,
|
|
466
|
+
r"'vec3f' object has no attribute 'foo'$",
|
|
467
|
+
):
|
|
468
|
+
v.foo
|
|
469
|
+
|
|
470
|
+
try:
|
|
471
|
+
v.bar = 123
|
|
472
|
+
except AttributeError:
|
|
473
|
+
self.fail()
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
add_function_test(TestLValue, "test_rmw_array", test_rmw_array, devices=devices)
|
|
477
|
+
add_function_test(TestLValue, "test_rmw_array_struct", test_rmw_array_struct, devices=devices)
|
|
478
|
+
add_function_test(TestLValue, "test_lookup", test_lookup, devices=devices)
|
|
479
|
+
add_function_test(TestLValue, "test_lookup2", test_lookup2, devices=devices)
|
|
480
|
+
add_function_test(TestLValue, "test_grad", test_grad, devices=devices)
|
|
481
|
+
add_function_test(TestLValue, "test_unary", test_unary, devices=devices)
|
|
482
|
+
add_function_test(TestLValue, "test_rvalue", test_rvalue, devices=devices)
|
|
483
|
+
add_function_test(TestLValue, "test_intermediate", test_intermediate, devices=devices)
|
|
484
|
+
add_function_test(TestLValue, "test_array_assign", test_array_assign, devices=devices)
|
|
485
|
+
add_function_test(TestLValue, "test_array_struct_assign", test_array_struct_assign, devices=devices)
|
|
486
|
+
add_function_test(TestLValue, "test_array_struct_struct_assign", test_array_struct_struct_assign, devices=devices)
|
|
487
|
+
add_function_test(TestLValue, "test_complex", test_complex, devices=devices)
|
|
488
|
+
add_function_test(TestLValue, "test_swizzle", test_swizzle, devices=devices)
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
if __name__ == "__main__":
|
|
492
|
+
wp.build.clear_kernel_cache()
|
|
493
|
+
unittest.main(verbosity=2)
|
|
@@ -5,14 +5,12 @@
|
|
|
5
5
|
# distribution of this software and related documentation without an express
|
|
6
6
|
# license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
import unittest
|
|
9
|
+
|
|
9
10
|
import numpy as np
|
|
10
|
-
import math
|
|
11
11
|
|
|
12
12
|
import warp as wp
|
|
13
|
-
from warp.tests.
|
|
14
|
-
|
|
15
|
-
import unittest
|
|
13
|
+
from warp.tests.unittest_utils import *
|
|
16
14
|
|
|
17
15
|
wp.init()
|
|
18
16
|
|
|
@@ -39,7 +37,7 @@ def test_marching_cubes(test, device):
|
|
|
39
37
|
|
|
40
38
|
radius = dim / 4.0
|
|
41
39
|
|
|
42
|
-
wp.launch(make_field, dim=field.shape, inputs=[field, wp.vec3(dim / 2, dim / 2, dim / 2), radius], device=
|
|
40
|
+
wp.launch(make_field, dim=field.shape, inputs=[field, wp.vec3(dim / 2, dim / 2, dim / 2), radius], device=device)
|
|
43
41
|
|
|
44
42
|
iso.surface(field=field, threshold=0.0)
|
|
45
43
|
|
|
@@ -49,18 +47,19 @@ def test_marching_cubes(test, device):
|
|
|
49
47
|
|
|
50
48
|
test.assertTrue(np.max(error) < 1.0)
|
|
51
49
|
|
|
50
|
+
iso.resize(nx=dim * 2, ny=dim * 2, nz=dim * 2, max_verts=max_verts, max_tris=max_tris)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
devices = get_unique_cuda_test_devices()
|
|
52
54
|
|
|
53
|
-
def register(parent):
|
|
54
|
-
devices = ["cuda"]
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
class TestMarchingCubes(unittest.TestCase):
|
|
57
|
+
pass
|
|
58
58
|
|
|
59
|
-
add_function_test(TestMarchingCubes, "test_marching_cubes", test_marching_cubes, devices=devices)
|
|
60
59
|
|
|
61
|
-
|
|
60
|
+
add_function_test(TestMarchingCubes, "test_marching_cubes", test_marching_cubes, devices=devices)
|
|
62
61
|
|
|
63
62
|
|
|
64
63
|
if __name__ == "__main__":
|
|
65
|
-
|
|
64
|
+
wp.build.clear_kernel_cache()
|
|
66
65
|
unittest.main(verbosity=2)
|