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
@@ -5,11 +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
+ import unittest
9
+
8
10
  import numpy as np
9
- import warp as wp
10
- from warp.tests.test_base import *
11
11
 
12
- import unittest
12
+ import warp as wp
13
+ from warp.tests.unittest_utils import *
13
14
 
14
15
  wp.init()
15
16
 
@@ -45,6 +46,11 @@ def test_stream_arg_implicit_sync(test, device):
45
46
 
46
47
  new_stream = wp.Stream(device)
47
48
 
49
+ # Exercise code path
50
+ wp.set_stream(new_stream, device)
51
+
52
+ test.assertTrue(wp.get_device(device).has_stream)
53
+
48
54
  # launch work on new stream
49
55
  wp.launch(inc, dim=a.size, inputs=[a], stream=new_stream)
50
56
  wp.copy(b, a, stream=new_stream)
@@ -278,119 +284,138 @@ def test_stream_scope_wait_stream(test, device):
278
284
  assert_np_equal(d.numpy(), np.full(N, fill_value=4.0))
279
285
 
280
286
 
281
- def test_stream_arg_graph_mgpu(test, device):
282
- # resources on GPU 0
283
- stream0 = wp.get_stream("cuda:0")
284
- a0 = wp.zeros(N, dtype=float, device="cuda:0")
285
- b0 = wp.empty(N, dtype=float, device="cuda:0")
286
- c0 = wp.empty(N, dtype=float, device="cuda:0")
287
+ devices = get_unique_cuda_test_devices()
287
288
 
288
- # resources on GPU 1
289
- stream1 = wp.get_stream("cuda:1")
290
- a1 = wp.zeros(N, dtype=float, device="cuda:1")
291
289
 
292
- # start recording on stream0
293
- wp.capture_begin(stream=stream0)
290
+ class TestStreams(unittest.TestCase):
291
+ def test_stream_exceptions(self):
292
+ cpu_device = wp.get_device("cpu")
294
293
 
295
- # branch into stream1
296
- stream1.wait_stream(stream0)
294
+ # Can't set the stream on a CPU device
295
+ with self.assertRaises(RuntimeError):
296
+ stream0 = wp.Stream()
297
+ cpu_device.stream = stream0
297
298
 
298
- # launch concurrent kernels on each stream
299
- wp.launch(inc, dim=N, inputs=[a0], stream=stream0)
300
- wp.launch(inc, dim=N, inputs=[a1], stream=stream1)
299
+ # Can't create a stream on the CPU
300
+ with self.assertRaises(RuntimeError):
301
+ wp.Stream(device="cpu")
301
302
 
302
- # wait for stream1 to finish
303
- stream0.wait_stream(stream1)
303
+ # Can't create an event with CPU device
304
+ with self.assertRaises(RuntimeError):
305
+ wp.Event(device=cpu_device)
304
306
 
305
- # copy values from stream1
306
- wp.copy(b0, a1, stream=stream0)
307
+ # Can't get the stream on a CPU device
308
+ with self.assertRaises(RuntimeError):
309
+ cpu_stream = cpu_device.stream # noqa: F841
307
310
 
308
- # compute sum
309
- wp.launch(sum, dim=N, inputs=[a0, b0, c0], stream=stream0)
311
+ @unittest.skipUnless(len(wp.get_cuda_devices()) > 1, "Requires at least two CUDA devices")
312
+ def test_stream_arg_graph_mgpu(self):
313
+ wp.load_module(device="cuda:0")
314
+ wp.load_module(device="cuda:1")
310
315
 
311
- # finish recording on stream0
312
- g = wp.capture_end(stream=stream0)
316
+ # resources on GPU 0
317
+ stream0 = wp.get_stream("cuda:0")
318
+ a0 = wp.zeros(N, dtype=float, device="cuda:0")
319
+ b0 = wp.empty(N, dtype=float, device="cuda:0")
320
+ c0 = wp.empty(N, dtype=float, device="cuda:0")
313
321
 
314
- # replay
315
- num_iters = 10
316
- for _ in range(num_iters):
317
- wp.capture_launch(g, stream=stream0)
322
+ # resources on GPU 1
323
+ stream1 = wp.get_stream("cuda:1")
324
+ a1 = wp.zeros(N, dtype=float, device="cuda:1")
318
325
 
319
- # check results
320
- assert_np_equal(c0.numpy(), np.full(N, fill_value=2 * num_iters))
326
+ # start recording on stream0
327
+ wp.capture_begin(stream=stream0, force_module_load=False)
328
+ try:
329
+ # branch into stream1
330
+ stream1.wait_stream(stream0)
321
331
 
332
+ # launch concurrent kernels on each stream
333
+ wp.launch(inc, dim=N, inputs=[a0], stream=stream0)
334
+ wp.launch(inc, dim=N, inputs=[a1], stream=stream1)
322
335
 
323
- def test_stream_scope_graph_mgpu(test, device):
324
- # resources on GPU 0
325
- with wp.ScopedDevice("cuda:0"):
326
- stream0 = wp.get_stream()
327
- a0 = wp.zeros(N, dtype=float)
328
- b0 = wp.empty(N, dtype=float)
329
- c0 = wp.empty(N, dtype=float)
336
+ # wait for stream1 to finish
337
+ stream0.wait_stream(stream1)
330
338
 
331
- # resources on GPU 1
332
- with wp.ScopedDevice("cuda:1"):
333
- stream1 = wp.get_stream()
334
- a1 = wp.zeros(N, dtype=float)
339
+ # copy values from stream1
340
+ wp.copy(b0, a1, stream=stream0)
335
341
 
336
- # capture graph
337
- with wp.ScopedDevice("cuda:0"):
338
- # start recording
339
- wp.capture_begin()
342
+ # compute sum
343
+ wp.launch(sum, dim=N, inputs=[a0, b0, c0], stream=stream0)
344
+ finally:
345
+ # finish recording on stream0
346
+ g = wp.capture_end(stream=stream0)
340
347
 
341
- with wp.ScopedDevice("cuda:1"):
342
- # branch into stream1
343
- wp.wait_stream(stream0)
348
+ # replay
349
+ num_iters = 10
350
+ for _ in range(num_iters):
351
+ wp.capture_launch(g, stream=stream0)
344
352
 
345
- wp.launch(inc, dim=N, inputs=[a1])
353
+ # check results
354
+ assert_np_equal(c0.numpy(), np.full(N, fill_value=2 * num_iters))
346
355
 
347
- wp.launch(inc, dim=N, inputs=[a0])
356
+ @unittest.skipUnless(len(wp.get_cuda_devices()) > 1, "Requires at least two CUDA devices")
357
+ def test_stream_scope_graph_mgpu(self):
358
+ wp.load_module(device="cuda:0")
359
+ wp.load_module(device="cuda:1")
348
360
 
349
- # wait for stream1 to finish
350
- wp.wait_stream(stream1)
361
+ # resources on GPU 0
362
+ with wp.ScopedDevice("cuda:0"):
363
+ stream0 = wp.get_stream()
364
+ a0 = wp.zeros(N, dtype=float)
365
+ b0 = wp.empty(N, dtype=float)
366
+ c0 = wp.empty(N, dtype=float)
351
367
 
352
- # copy values from stream1
353
- wp.copy(b0, a1)
368
+ # resources on GPU 1
369
+ with wp.ScopedDevice("cuda:1"):
370
+ stream1 = wp.get_stream()
371
+ a1 = wp.zeros(N, dtype=float)
354
372
 
355
- # compute sum
356
- wp.launch(sum, dim=N, inputs=[a0, b0, c0])
373
+ # capture graph
374
+ with wp.ScopedDevice("cuda:0"):
375
+ # start recording
376
+ wp.capture_begin(force_module_load=False)
377
+ try:
378
+ with wp.ScopedDevice("cuda:1"):
379
+ # branch into stream1
380
+ wp.wait_stream(stream0)
357
381
 
358
- # finish recording
359
- g = wp.capture_end()
382
+ wp.launch(inc, dim=N, inputs=[a1])
360
383
 
361
- # replay
362
- with wp.ScopedDevice("cuda:0"):
363
- num_iters = 10
364
- for _ in range(num_iters):
365
- wp.capture_launch(g)
384
+ wp.launch(inc, dim=N, inputs=[a0])
366
385
 
367
- # check results
368
- assert_np_equal(c0.numpy(), np.full(N, fill_value=2 * num_iters))
386
+ # wait for stream1 to finish
387
+ wp.wait_stream(stream1)
369
388
 
389
+ # copy values from stream1
390
+ wp.copy(b0, a1)
370
391
 
371
- def register(parent):
372
- devices = wp.get_cuda_devices()
392
+ # compute sum
393
+ wp.launch(sum, dim=N, inputs=[a0, b0, c0])
394
+ finally:
395
+ # finish recording
396
+ g = wp.capture_end()
373
397
 
374
- class TestStreams(parent):
375
- pass
398
+ # replay
399
+ with wp.ScopedDevice("cuda:0"):
400
+ num_iters = 10
401
+ for _ in range(num_iters):
402
+ wp.capture_launch(g)
376
403
 
377
- add_function_test(TestStreams, "test_stream_arg_implicit_sync", test_stream_arg_implicit_sync, devices=devices)
378
- add_function_test(TestStreams, "test_stream_scope_implicit_sync", test_stream_scope_implicit_sync, devices=devices)
404
+ # check results
405
+ assert_np_equal(c0.numpy(), np.full(N, fill_value=2 * num_iters))
379
406
 
380
- add_function_test(TestStreams, "test_stream_arg_synchronize", test_stream_arg_synchronize, devices=devices)
381
- add_function_test(TestStreams, "test_stream_arg_wait_event", test_stream_arg_wait_event, devices=devices)
382
- add_function_test(TestStreams, "test_stream_arg_wait_stream", test_stream_arg_wait_stream, devices=devices)
383
- add_function_test(TestStreams, "test_stream_scope_synchronize", test_stream_scope_synchronize, devices=devices)
384
- add_function_test(TestStreams, "test_stream_scope_wait_event", test_stream_scope_wait_event, devices=devices)
385
- add_function_test(TestStreams, "test_stream_scope_wait_stream", test_stream_scope_wait_stream, devices=devices)
386
407
 
387
- if len(devices) > 1:
388
- add_function_test(TestStreams, "test_stream_arg_graph_mgpu", test_stream_arg_graph_mgpu)
389
- add_function_test(TestStreams, "test_stream_scope_graph_mgpu", test_stream_scope_graph_mgpu)
408
+ add_function_test(TestStreams, "test_stream_arg_implicit_sync", test_stream_arg_implicit_sync, devices=devices)
409
+ add_function_test(TestStreams, "test_stream_scope_implicit_sync", test_stream_scope_implicit_sync, devices=devices)
390
410
 
391
- return TestStreams
411
+ add_function_test(TestStreams, "test_stream_arg_synchronize", test_stream_arg_synchronize, devices=devices)
412
+ add_function_test(TestStreams, "test_stream_arg_wait_event", test_stream_arg_wait_event, devices=devices)
413
+ add_function_test(TestStreams, "test_stream_arg_wait_stream", test_stream_arg_wait_stream, devices=devices)
414
+ add_function_test(TestStreams, "test_stream_scope_synchronize", test_stream_scope_synchronize, devices=devices)
415
+ add_function_test(TestStreams, "test_stream_scope_wait_event", test_stream_scope_wait_event, devices=devices)
416
+ add_function_test(TestStreams, "test_stream_scope_wait_stream", test_stream_scope_wait_stream, devices=devices)
392
417
 
393
418
 
394
419
  if __name__ == "__main__":
395
- c = register(unittest.TestCase)
420
+ wp.build.clear_kernel_cache()
396
421
  unittest.main(verbosity=2)
warp/tests/test_struct.py CHANGED
@@ -5,11 +5,15 @@
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
9
+ from typing import Any
10
+
8
11
  import numpy as np
12
+
9
13
  import warp as wp
10
- from warp.tests.test_base import *
14
+ from warp.tests.unittest_utils import *
11
15
 
12
- import unittest
16
+ from warp.fem import Sample as StructFromAnotherModule
13
17
 
14
18
  wp.init()
15
19
 
@@ -47,6 +51,8 @@ def kernel_step_with_copy(state_in: State, state_out: State, model: Model):
47
51
 
48
52
 
49
53
  def test_step(test, device):
54
+ rng = np.random.default_rng(123)
55
+
50
56
  dim = 5
51
57
 
52
58
  dt = 0.01
@@ -61,9 +67,8 @@ def test_step(test, device):
61
67
  model.dt = dt
62
68
  model.gravity = wp.vec3(0, 0, -9.81)
63
69
 
64
- np.random.seed(0)
65
- x = np.random.normal(size=(dim, 3))
66
- v = np.random.normal(size=(dim, 3))
70
+ x = rng.normal(size=(dim, 3))
71
+ v = rng.normal(size=(dim, 3))
67
72
 
68
73
  x_expected = x + (v + gravity / m[:, None] * dt) * dt
69
74
 
@@ -92,13 +97,14 @@ def kernel_loss(x: wp.array(dtype=wp.vec3), loss: wp.array(dtype=float)):
92
97
 
93
98
 
94
99
  def test_step_grad(test, device):
100
+ rng = np.random.default_rng(123)
101
+
95
102
  dim = 5
96
103
 
97
104
  dt = 0.01
98
105
  gravity = np.array([0, 0, -9.81])
99
106
 
100
- np.random.seed(0)
101
- m = np.random.rand(dim) + 0.1
107
+ m = rng.random(size=dim) + 0.1
102
108
 
103
109
  m_model = wp.array(m, dtype=float, device=device, requires_grad=True)
104
110
 
@@ -107,8 +113,8 @@ def test_step_grad(test, device):
107
113
  model.dt = dt
108
114
  model.gravity = wp.vec3(0, 0, -9.81)
109
115
 
110
- x = np.random.normal(size=(dim, 3))
111
- v = np.random.normal(size=(dim, 3))
116
+ x = rng.normal(size=(dim, 3))
117
+ v = rng.normal(size=(dim, 3))
112
118
 
113
119
  x_in = wp.array(x, dtype=wp.vec3, device=device, requires_grad=True)
114
120
  v_in = wp.array(v, dtype=wp.vec3, device=device, requires_grad=True)
@@ -218,6 +224,20 @@ def test_nested_struct(test, device):
218
224
  )
219
225
 
220
226
 
227
+ def test_struct_attribute_error(test, device):
228
+ @wp.kernel
229
+ def kernel(foo: Foo):
230
+ _ = foo.nonexisting
231
+
232
+ with test.assertRaisesRegex(AttributeError, r"`nonexisting` is not an attribute of 'foo' \([\w.]+\.Foo\)$"):
233
+ wp.launch(
234
+ kernel,
235
+ dim=1,
236
+ inputs=[Foo()],
237
+ device=device,
238
+ )
239
+
240
+
221
241
  @wp.kernel
222
242
  def test_struct_instantiate(data: wp.array(dtype=int)):
223
243
  baz = Baz(data, wp.vec3(0.0, 0.0, 26.0))
@@ -272,7 +292,7 @@ def test_struct_math_conversions(test, device):
272
292
  s.m5 = [10, 20, 30, 40]
273
293
  s.m6 = np.array([100, 200, 300, 400])
274
294
 
275
- wp.launch(check_math_conversions, dim=1, inputs=[s])
295
+ wp.launch(check_math_conversions, dim=1, inputs=[s], device=device)
276
296
 
277
297
 
278
298
  @wp.struct
@@ -397,74 +417,259 @@ def test_nested_array_struct(test, device):
397
417
  var2.i = 2
398
418
 
399
419
  struct = ArrayStruct()
400
- struct.array = wp.array([var1, var2], dtype=InnerStruct)
420
+ struct.array = wp.array([var1, var2], dtype=InnerStruct, device=device)
401
421
 
402
- wp.launch(struct2_reader, dim=2, inputs=[struct])
422
+ wp.launch(struct2_reader, dim=2, inputs=[struct], device=device)
403
423
 
404
424
 
405
- def register(parent):
406
- devices = get_test_devices()
425
+ @wp.struct
426
+ class EmptyNest1:
427
+ a: Empty
428
+ z: int
407
429
 
408
- class TestStruct(parent):
409
- pass
410
430
 
411
- add_function_test(TestStruct, "test_step", test_step, devices=devices)
412
- add_function_test(TestStruct, "test_step_grad", test_step_grad, devices=devices)
413
- add_kernel_test(TestStruct, kernel=test_empty, name="test_empty", dim=1, inputs=[Empty()], devices=devices)
414
- add_kernel_test(
415
- TestStruct,
416
- kernel=test_uninitialized,
417
- name="test_uninitialized",
418
- dim=1,
419
- inputs=[Uninitialized()],
420
- devices=devices,
421
- )
422
- add_kernel_test(TestStruct, kernel=test_return, name="test_return", dim=1, inputs=[], devices=devices)
423
- add_function_test(TestStruct, "test_nested_struct", test_nested_struct, devices=devices)
424
- add_function_test(TestStruct, "test_nested_array_struct", test_nested_array_struct, devices=devices)
425
- add_function_test(TestStruct, "test_struct_math_conversions", test_struct_math_conversions, devices=devices)
426
- add_function_test(
427
- TestStruct, "test_struct_default_attributes_python", test_struct_default_attributes_python, devices=devices
428
- )
431
+ @wp.struct
432
+ class EmptyNest2:
433
+ a: Empty
434
+ b: Empty
435
+ z: int
436
+
437
+
438
+ @wp.struct
439
+ class EmptyNest3:
440
+ a: Empty
441
+ b: Empty
442
+ c: Empty
443
+ z: int
444
+
445
+
446
+ @wp.struct
447
+ class EmptyNest4:
448
+ a: Empty
449
+ b: Empty
450
+ c: Empty
451
+ d: Empty
452
+ z: int
453
+
454
+
455
+ @wp.struct
456
+ class EmptyNest5:
457
+ a: Empty
458
+ b: Empty
459
+ c: Empty
460
+ d: Empty
461
+ e: Empty
462
+ z: int
463
+
464
+
465
+ @wp.struct
466
+ class EmptyNest6:
467
+ a: Empty
468
+ b: Empty
469
+ c: Empty
470
+ d: Empty
471
+ e: Empty
472
+ f: Empty
473
+ z: int
474
+
475
+
476
+ @wp.struct
477
+ class EmptyNest7:
478
+ a: Empty
479
+ b: Empty
480
+ c: Empty
481
+ d: Empty
482
+ e: Empty
483
+ f: Empty
484
+ g: Empty
485
+ z: int
486
+
487
+
488
+ @wp.struct
489
+ class EmptyNest8:
490
+ a: Empty
491
+ b: Empty
492
+ c: Empty
493
+ d: Empty
494
+ e: Empty
495
+ f: Empty
496
+ g: Empty
497
+ h: Empty
498
+ z: int
499
+
500
+
501
+ @wp.kernel
502
+ def empty_nest_kernel(s: Any):
503
+ wp.expect_eq(s.z, 42)
504
+
505
+
506
+ wp.overload(empty_nest_kernel, [EmptyNest1])
507
+ wp.overload(empty_nest_kernel, [EmptyNest2])
508
+ wp.overload(empty_nest_kernel, [EmptyNest3])
509
+ wp.overload(empty_nest_kernel, [EmptyNest4])
510
+ wp.overload(empty_nest_kernel, [EmptyNest5])
511
+ wp.overload(empty_nest_kernel, [EmptyNest6])
512
+ wp.overload(empty_nest_kernel, [EmptyNest7])
513
+ wp.overload(empty_nest_kernel, [EmptyNest8])
514
+
515
+
516
+ def test_nested_empty_struct(test, device):
517
+ with wp.ScopedDevice(device):
518
+ e1 = EmptyNest1()
519
+ e1.z = 42
520
+ e2 = EmptyNest2()
521
+ e2.z = 42
522
+ e3 = EmptyNest3()
523
+ e3.z = 42
524
+ e4 = EmptyNest4()
525
+ e4.z = 42
526
+ e5 = EmptyNest5()
527
+ e5.z = 42
528
+ e6 = EmptyNest6()
529
+ e6.z = 42
530
+ e7 = EmptyNest7()
531
+ e7.z = 42
532
+ e8 = EmptyNest8()
533
+ e8.z = 42
534
+
535
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e1])
536
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e2])
537
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e3])
538
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e4])
539
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e5])
540
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e6])
541
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e7])
542
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e8])
543
+
544
+ wp.synchronize_device()
545
+
546
+
547
+ @wp.struct
548
+ class DependentModuleImport_A:
549
+ s: StructFromAnotherModule
550
+
551
+
552
+ @wp.struct
553
+ class DependentModuleImport_B:
554
+ s: StructFromAnotherModule
555
+
556
+
557
+ @wp.struct
558
+ class DependentModuleImport_C:
559
+ a: DependentModuleImport_A
560
+ b: DependentModuleImport_B
561
+
562
+
563
+ @wp.kernel
564
+ def test_dependent_module_import(c: DependentModuleImport_C):
565
+ wp.tid() # nop, we're just testing codegen
566
+
567
+
568
+ devices = get_test_devices()
569
+
570
+
571
+ class TestStruct(unittest.TestCase):
572
+ pass
573
+
574
+
575
+ add_function_test(TestStruct, "test_step", test_step, devices=devices)
576
+ add_function_test(TestStruct, "test_step_grad", test_step_grad, devices=devices)
577
+ add_kernel_test(TestStruct, kernel=test_empty, name="test_empty", dim=1, inputs=[Empty()], devices=devices)
578
+ add_kernel_test(
579
+ TestStruct,
580
+ kernel=test_uninitialized,
581
+ name="test_uninitialized",
582
+ dim=1,
583
+ inputs=[Uninitialized()],
584
+ devices=devices,
585
+ )
586
+ add_kernel_test(TestStruct, kernel=test_return, name="test_return", dim=1, inputs=[], devices=devices)
587
+ add_function_test(TestStruct, "test_nested_struct", test_nested_struct, devices=devices)
588
+ add_function_test(TestStruct, "test_nested_array_struct", test_nested_array_struct, devices=devices)
589
+ add_function_test(TestStruct, "test_nested_empty_struct", test_nested_empty_struct, devices=devices)
590
+ add_function_test(TestStruct, "test_struct_math_conversions", test_struct_math_conversions, devices=devices)
591
+ add_function_test(
592
+ TestStruct, "test_struct_default_attributes_python", test_struct_default_attributes_python, devices=devices
593
+ )
594
+ add_kernel_test(
595
+ TestStruct,
596
+ name="test_struct_default_attributes",
597
+ kernel=test_struct_default_attributes_kernel,
598
+ dim=1,
599
+ inputs=[],
600
+ devices=devices,
601
+ )
602
+
603
+ add_kernel_test(
604
+ TestStruct,
605
+ name="test_struct_mutate_attributes",
606
+ kernel=test_struct_mutate_attributes_kernel,
607
+ dim=1,
608
+ inputs=[],
609
+ devices=devices,
610
+ )
611
+ add_kernel_test(
612
+ TestStruct,
613
+ kernel=test_uninitialized,
614
+ name="test_uninitialized",
615
+ dim=1,
616
+ inputs=[Uninitialized()],
617
+ devices=devices,
618
+ )
619
+ add_kernel_test(TestStruct, kernel=test_return, name="test_return", dim=1, inputs=[], devices=devices)
620
+ add_function_test(TestStruct, "test_nested_struct", test_nested_struct, devices=devices)
621
+ add_function_test(TestStruct, "test_nested_array_struct", test_nested_array_struct, devices=devices)
622
+ add_function_test(TestStruct, "test_nested_empty_struct", test_nested_empty_struct, devices=devices)
623
+ add_function_test(TestStruct, "test_struct_math_conversions", test_struct_math_conversions, devices=devices)
624
+ add_function_test(
625
+ TestStruct, "test_struct_default_attributes_python", test_struct_default_attributes_python, devices=devices
626
+ )
627
+ add_kernel_test(
628
+ TestStruct,
629
+ name="test_struct_default_attributes",
630
+ kernel=test_struct_default_attributes_kernel,
631
+ dim=1,
632
+ inputs=[],
633
+ devices=devices,
634
+ )
635
+
636
+ add_kernel_test(
637
+ TestStruct,
638
+ name="test_struct_mutate_attributes",
639
+ kernel=test_struct_mutate_attributes_kernel,
640
+ dim=1,
641
+ inputs=[],
642
+ devices=devices,
643
+ )
644
+
645
+ for device in devices:
429
646
  add_kernel_test(
430
647
  TestStruct,
431
- name="test_struct_default_attributes",
432
- kernel=test_struct_default_attributes_kernel,
648
+ kernel=test_struct_instantiate,
649
+ name="test_struct_instantiate",
433
650
  dim=1,
434
- inputs=[],
435
- devices=devices,
651
+ inputs=[wp.array([1], dtype=int, device=device)],
652
+ devices=[device],
436
653
  )
437
-
438
654
  add_kernel_test(
439
655
  TestStruct,
440
- name="test_struct_mutate_attributes",
441
- kernel=test_struct_mutate_attributes_kernel,
656
+ kernel=test_return_struct,
657
+ name="test_return_struct",
442
658
  dim=1,
443
- inputs=[],
444
- devices=devices,
659
+ inputs=[wp.zeros(10, dtype=int, device=device)],
660
+ devices=[device],
445
661
  )
446
662
 
447
- for device in devices:
448
- add_kernel_test(
449
- TestStruct,
450
- kernel=test_struct_instantiate,
451
- name="test_struct_instantiate",
452
- dim=1,
453
- inputs=[wp.array([1], dtype=int, device=device)],
454
- devices=[device],
455
- )
456
- add_kernel_test(
457
- TestStruct,
458
- kernel=test_return_struct,
459
- name="test_return_struct",
460
- dim=1,
461
- inputs=[wp.zeros(10, dtype=int, device=device)],
462
- devices=[device],
463
- )
464
-
465
- return TestStruct
663
+ add_kernel_test(
664
+ TestStruct,
665
+ kernel=test_dependent_module_import,
666
+ name="test_dependent_module_import",
667
+ dim=1,
668
+ inputs=[DependentModuleImport_C()],
669
+ devices=devices,
670
+ )
466
671
 
467
672
 
468
673
  if __name__ == "__main__":
469
- c = register(unittest.TestCase)
674
+ wp.build.clear_kernel_cache()
470
675
  unittest.main(verbosity=2)