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.

Files changed (271) hide show
  1. docs/conf.py +17 -5
  2. examples/env/env_ant.py +1 -1
  3. examples/env/env_cartpole.py +1 -1
  4. examples/env/env_humanoid.py +1 -1
  5. examples/env/env_usd.py +4 -1
  6. examples/env/environment.py +8 -9
  7. examples/example_dem.py +34 -33
  8. examples/example_diffray.py +364 -337
  9. examples/example_fluid.py +32 -23
  10. examples/example_jacobian_ik.py +97 -93
  11. examples/example_marching_cubes.py +6 -16
  12. examples/example_mesh.py +6 -16
  13. examples/example_mesh_intersect.py +16 -14
  14. examples/example_nvdb.py +14 -16
  15. examples/example_raycast.py +14 -13
  16. examples/example_raymarch.py +16 -23
  17. examples/example_render_opengl.py +19 -10
  18. examples/example_sim_cartpole.py +82 -78
  19. examples/example_sim_cloth.py +45 -48
  20. examples/example_sim_fk_grad.py +51 -44
  21. examples/example_sim_fk_grad_torch.py +47 -40
  22. examples/example_sim_grad_bounce.py +108 -133
  23. examples/example_sim_grad_cloth.py +99 -113
  24. examples/example_sim_granular.py +5 -6
  25. examples/{example_sim_sdf_shape.py → example_sim_granular_collision_sdf.py} +37 -26
  26. examples/example_sim_neo_hookean.py +51 -55
  27. examples/example_sim_particle_chain.py +4 -4
  28. examples/example_sim_quadruped.py +126 -81
  29. examples/example_sim_rigid_chain.py +54 -61
  30. examples/example_sim_rigid_contact.py +66 -70
  31. examples/example_sim_rigid_fem.py +3 -3
  32. examples/example_sim_rigid_force.py +1 -1
  33. examples/example_sim_rigid_gyroscopic.py +3 -4
  34. examples/example_sim_rigid_kinematics.py +28 -39
  35. examples/example_sim_trajopt.py +112 -110
  36. examples/example_sph.py +9 -8
  37. examples/example_wave.py +7 -7
  38. examples/fem/bsr_utils.py +30 -17
  39. examples/fem/example_apic_fluid.py +85 -69
  40. examples/fem/example_convection_diffusion.py +97 -93
  41. examples/fem/example_convection_diffusion_dg.py +142 -149
  42. examples/fem/example_convection_diffusion_dg0.py +141 -136
  43. examples/fem/example_deformed_geometry.py +146 -0
  44. examples/fem/example_diffusion.py +115 -84
  45. examples/fem/example_diffusion_3d.py +116 -86
  46. examples/fem/example_diffusion_mgpu.py +102 -79
  47. examples/fem/example_mixed_elasticity.py +139 -100
  48. examples/fem/example_navier_stokes.py +175 -162
  49. examples/fem/example_stokes.py +143 -111
  50. examples/fem/example_stokes_transfer.py +186 -157
  51. examples/fem/mesh_utils.py +59 -97
  52. examples/fem/plot_utils.py +138 -17
  53. tools/ci/publishing/build_nodes_info.py +54 -0
  54. warp/__init__.py +4 -3
  55. warp/__init__.pyi +1 -0
  56. warp/bin/warp-clang.dll +0 -0
  57. warp/bin/warp.dll +0 -0
  58. warp/build.py +5 -3
  59. warp/build_dll.py +29 -9
  60. warp/builtins.py +836 -492
  61. warp/codegen.py +864 -553
  62. warp/config.py +3 -1
  63. warp/context.py +389 -172
  64. warp/fem/__init__.py +24 -6
  65. warp/fem/cache.py +318 -25
  66. warp/fem/dirichlet.py +7 -3
  67. warp/fem/domain.py +14 -0
  68. warp/fem/field/__init__.py +30 -38
  69. warp/fem/field/field.py +149 -0
  70. warp/fem/field/nodal_field.py +244 -138
  71. warp/fem/field/restriction.py +8 -6
  72. warp/fem/field/test.py +127 -59
  73. warp/fem/field/trial.py +117 -60
  74. warp/fem/geometry/__init__.py +5 -1
  75. warp/fem/geometry/deformed_geometry.py +271 -0
  76. warp/fem/geometry/element.py +24 -1
  77. warp/fem/geometry/geometry.py +86 -14
  78. warp/fem/geometry/grid_2d.py +112 -54
  79. warp/fem/geometry/grid_3d.py +134 -65
  80. warp/fem/geometry/hexmesh.py +953 -0
  81. warp/fem/geometry/partition.py +85 -33
  82. warp/fem/geometry/quadmesh_2d.py +532 -0
  83. warp/fem/geometry/tetmesh.py +451 -115
  84. warp/fem/geometry/trimesh_2d.py +197 -92
  85. warp/fem/integrate.py +534 -268
  86. warp/fem/operator.py +58 -31
  87. warp/fem/polynomial.py +11 -0
  88. warp/fem/quadrature/__init__.py +1 -1
  89. warp/fem/quadrature/pic_quadrature.py +150 -58
  90. warp/fem/quadrature/quadrature.py +209 -57
  91. warp/fem/space/__init__.py +230 -53
  92. warp/fem/space/basis_space.py +489 -0
  93. warp/fem/space/collocated_function_space.py +105 -0
  94. warp/fem/space/dof_mapper.py +49 -2
  95. warp/fem/space/function_space.py +90 -39
  96. warp/fem/space/grid_2d_function_space.py +149 -496
  97. warp/fem/space/grid_3d_function_space.py +173 -538
  98. warp/fem/space/hexmesh_function_space.py +352 -0
  99. warp/fem/space/partition.py +129 -76
  100. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  101. warp/fem/space/restriction.py +46 -34
  102. warp/fem/space/shape/__init__.py +15 -0
  103. warp/fem/space/shape/cube_shape_function.py +738 -0
  104. warp/fem/space/shape/shape_function.py +103 -0
  105. warp/fem/space/shape/square_shape_function.py +611 -0
  106. warp/fem/space/shape/tet_shape_function.py +567 -0
  107. warp/fem/space/shape/triangle_shape_function.py +429 -0
  108. warp/fem/space/tetmesh_function_space.py +132 -1039
  109. warp/fem/space/topology.py +295 -0
  110. warp/fem/space/trimesh_2d_function_space.py +104 -742
  111. warp/fem/types.py +13 -11
  112. warp/fem/utils.py +335 -60
  113. warp/native/array.h +120 -34
  114. warp/native/builtin.h +101 -72
  115. warp/native/bvh.cpp +73 -325
  116. warp/native/bvh.cu +406 -23
  117. warp/native/bvh.h +22 -40
  118. warp/native/clang/clang.cpp +1 -0
  119. warp/native/crt.h +2 -0
  120. warp/native/cuda_util.cpp +8 -3
  121. warp/native/cuda_util.h +1 -0
  122. warp/native/exports.h +1522 -1243
  123. warp/native/intersect.h +19 -4
  124. warp/native/intersect_adj.h +8 -8
  125. warp/native/mat.h +76 -17
  126. warp/native/mesh.cpp +33 -108
  127. warp/native/mesh.cu +114 -18
  128. warp/native/mesh.h +395 -40
  129. warp/native/noise.h +272 -329
  130. warp/native/quat.h +51 -8
  131. warp/native/rand.h +44 -34
  132. warp/native/reduce.cpp +1 -1
  133. warp/native/sparse.cpp +4 -4
  134. warp/native/sparse.cu +163 -155
  135. warp/native/spatial.h +2 -2
  136. warp/native/temp_buffer.h +18 -14
  137. warp/native/vec.h +103 -21
  138. warp/native/warp.cpp +2 -1
  139. warp/native/warp.cu +28 -3
  140. warp/native/warp.h +4 -3
  141. warp/render/render_opengl.py +261 -109
  142. warp/sim/__init__.py +1 -2
  143. warp/sim/articulation.py +385 -185
  144. warp/sim/import_mjcf.py +59 -48
  145. warp/sim/import_urdf.py +15 -15
  146. warp/sim/import_usd.py +174 -102
  147. warp/sim/inertia.py +17 -18
  148. warp/sim/integrator_xpbd.py +4 -3
  149. warp/sim/model.py +330 -250
  150. warp/sim/render.py +1 -1
  151. warp/sparse.py +625 -152
  152. warp/stubs.py +341 -309
  153. warp/tape.py +9 -6
  154. warp/tests/__main__.py +3 -6
  155. warp/tests/assets/curlnoise_golden.npy +0 -0
  156. warp/tests/assets/pnoise_golden.npy +0 -0
  157. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  158. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  159. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  160. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  161. warp/tests/aux_test_unresolved_func.py +14 -0
  162. warp/tests/aux_test_unresolved_symbol.py +14 -0
  163. warp/tests/disabled_kinematics.py +239 -0
  164. warp/tests/run_coverage_serial.py +31 -0
  165. warp/tests/test_adam.py +103 -106
  166. warp/tests/test_arithmetic.py +94 -74
  167. warp/tests/test_array.py +82 -101
  168. warp/tests/test_array_reduce.py +57 -23
  169. warp/tests/test_atomic.py +64 -28
  170. warp/tests/test_bool.py +22 -12
  171. warp/tests/test_builtins_resolution.py +1292 -0
  172. warp/tests/test_bvh.py +18 -18
  173. warp/tests/test_closest_point_edge_edge.py +54 -57
  174. warp/tests/test_codegen.py +165 -134
  175. warp/tests/test_compile_consts.py +28 -20
  176. warp/tests/test_conditional.py +108 -24
  177. warp/tests/test_copy.py +10 -12
  178. warp/tests/test_ctypes.py +112 -88
  179. warp/tests/test_dense.py +21 -14
  180. warp/tests/test_devices.py +98 -0
  181. warp/tests/test_dlpack.py +75 -75
  182. warp/tests/test_examples.py +237 -0
  183. warp/tests/test_fabricarray.py +22 -24
  184. warp/tests/test_fast_math.py +15 -11
  185. warp/tests/test_fem.py +1034 -124
  186. warp/tests/test_fp16.py +23 -16
  187. warp/tests/test_func.py +187 -86
  188. warp/tests/test_generics.py +194 -49
  189. warp/tests/test_grad.py +123 -181
  190. warp/tests/test_grad_customs.py +176 -0
  191. warp/tests/test_hash_grid.py +35 -34
  192. warp/tests/test_import.py +10 -23
  193. warp/tests/test_indexedarray.py +24 -25
  194. warp/tests/test_intersect.py +18 -9
  195. warp/tests/test_large.py +141 -0
  196. warp/tests/test_launch.py +14 -41
  197. warp/tests/test_lerp.py +64 -65
  198. warp/tests/test_lvalue.py +493 -0
  199. warp/tests/test_marching_cubes.py +12 -13
  200. warp/tests/test_mat.py +517 -2898
  201. warp/tests/test_mat_lite.py +115 -0
  202. warp/tests/test_mat_scalar_ops.py +2889 -0
  203. warp/tests/test_math.py +103 -9
  204. warp/tests/test_matmul.py +304 -69
  205. warp/tests/test_matmul_lite.py +410 -0
  206. warp/tests/test_mesh.py +60 -22
  207. warp/tests/test_mesh_query_aabb.py +21 -25
  208. warp/tests/test_mesh_query_point.py +111 -22
  209. warp/tests/test_mesh_query_ray.py +12 -24
  210. warp/tests/test_mlp.py +30 -22
  211. warp/tests/test_model.py +92 -89
  212. warp/tests/test_modules_lite.py +39 -0
  213. warp/tests/test_multigpu.py +88 -114
  214. warp/tests/test_noise.py +12 -11
  215. warp/tests/test_operators.py +16 -20
  216. warp/tests/test_options.py +11 -11
  217. warp/tests/test_pinned.py +17 -18
  218. warp/tests/test_print.py +32 -11
  219. warp/tests/test_quat.py +275 -129
  220. warp/tests/test_rand.py +18 -16
  221. warp/tests/test_reload.py +38 -34
  222. warp/tests/test_rounding.py +50 -43
  223. warp/tests/test_runlength_encode.py +168 -20
  224. warp/tests/test_smoothstep.py +9 -11
  225. warp/tests/test_snippet.py +143 -0
  226. warp/tests/test_sparse.py +261 -63
  227. warp/tests/test_spatial.py +276 -243
  228. warp/tests/test_streams.py +110 -85
  229. warp/tests/test_struct.py +268 -63
  230. warp/tests/test_tape.py +39 -21
  231. warp/tests/test_torch.py +90 -86
  232. warp/tests/test_transient_module.py +10 -12
  233. warp/tests/test_types.py +363 -0
  234. warp/tests/test_utils.py +451 -0
  235. warp/tests/test_vec.py +354 -2050
  236. warp/tests/test_vec_lite.py +73 -0
  237. warp/tests/test_vec_scalar_ops.py +2099 -0
  238. warp/tests/test_volume.py +418 -376
  239. warp/tests/test_volume_write.py +124 -134
  240. warp/tests/unittest_serial.py +35 -0
  241. warp/tests/unittest_suites.py +291 -0
  242. warp/tests/unittest_utils.py +342 -0
  243. warp/tests/{test_misc.py → unused_test_misc.py} +13 -5
  244. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  245. warp/thirdparty/appdirs.py +36 -45
  246. warp/thirdparty/unittest_parallel.py +589 -0
  247. warp/types.py +622 -211
  248. warp/utils.py +54 -393
  249. warp_lang-1.0.0b6.dist-info/METADATA +238 -0
  250. warp_lang-1.0.0b6.dist-info/RECORD +409 -0
  251. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/WHEEL +1 -1
  252. examples/example_cache_management.py +0 -40
  253. examples/example_multigpu.py +0 -54
  254. examples/example_struct.py +0 -65
  255. examples/fem/example_stokes_transfer_3d.py +0 -210
  256. warp/bin/warp-clang.so +0 -0
  257. warp/bin/warp.so +0 -0
  258. warp/fem/field/discrete_field.py +0 -80
  259. warp/fem/space/nodal_function_space.py +0 -233
  260. warp/tests/test_all.py +0 -223
  261. warp/tests/test_array_scan.py +0 -60
  262. warp/tests/test_base.py +0 -208
  263. warp/tests/test_unresolved_func.py +0 -7
  264. warp/tests/test_unresolved_symbol.py +0 -7
  265. warp_lang-1.0.0b2.dist-info/METADATA +0 -26
  266. warp_lang-1.0.0b2.dist-info/RECORD +0 -380
  267. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  268. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  269. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  270. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/LICENSE.md +0 -0
  271. {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.test_base import *
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
- for test_data in TEST_DATA[data_type]:
190
- a = wp.array(
191
- [test_data.a],
192
- dtype=data_type,
193
- device=device,
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
- assert_np_equal(
225
- out.numpy(),
226
- np.array([test_data.expected]),
227
- tol=1e-6,
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
- assert_np_equal(
239
- tape.gradients[b].numpy(),
240
- np.array([test_data.expected_adj_b]),
241
- tol=1e-6,
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
- tape.gradients[t].numpy(),
245
- np.array([test_data.expected_adj_t]),
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
- def register(parent):
251
- devices = get_test_devices()
252
+ class TestLerp(unittest.TestCase):
253
+ pass
252
254
 
253
- class TestLerp(parent):
254
- pass
255
255
 
256
- add_function_test(TestLerp, "test_lerp", test_lerp, devices=devices)
257
- return TestLerp
256
+ add_function_test(TestLerp, "test_lerp", test_lerp, devices=devices)
258
257
 
259
258
 
260
259
  if __name__ == "__main__":
261
- _ = register(unittest.TestCase)
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
- # include parent path
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.test_base import *
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="cuda")
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
- class TestMarchingCubes(parent):
57
- pass
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
- return TestMarchingCubes
60
+ add_function_test(TestMarchingCubes, "test_marching_cubes", test_marching_cubes, devices=devices)
62
61
 
63
62
 
64
63
  if __name__ == "__main__":
65
- c = register(unittest.TestCase)
64
+ wp.build.clear_kernel_cache()
66
65
  unittest.main(verbosity=2)