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,13 @@
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 warp as wp
9
- from warp.tests.test_base import *
8
+ import unittest
10
9
 
11
10
  import numpy as np
12
11
 
12
+ import warp as wp
13
+ from warp.tests.unittest_utils import *
14
+
13
15
  wp.init()
14
16
  # wp.config.cache_kernels = False
15
17
 
@@ -137,139 +139,127 @@ def test_volume_tile_readback_v(volume: wp.uint64, tiles: wp.array2d(dtype=wp.in
137
139
  values[tid * 512 + r] = wp.volume_lookup_v(volume, ii, jj, kk)
138
140
 
139
141
 
140
- rng = np.random.default_rng(101215)
141
-
142
-
143
- def register(parent):
144
- devices = get_test_devices()
145
-
146
- class TestVolumes(parent):
147
- def test_volume_allocation(self):
148
- voxel_size = 0.125
149
- background_value = 123.456
150
- translation = wp.vec3(-12.3, 4.56, -789)
151
-
152
- axis = np.linspace(-11, 11, 23)
153
- points_ref = np.array([[x, y, z] for x in axis for y in axis for z in axis])
154
- values_ref = np.array([x + 100 * y + 10000 * z for x in axis for y in axis for z in axis])
155
- num_points = len(points_ref)
156
- bb_max = np.array([11, 11, 11])
157
- for device in devices:
158
- if device.is_cpu:
159
- continue
160
-
161
- volume_a = wp.Volume.allocate(
162
- -bb_max,
163
- bb_max,
164
- voxel_size=voxel_size,
165
- bg_value=background_value,
166
- translation=translation,
167
- device=device,
168
- )
169
- volume_b = wp.Volume.allocate(
170
- -bb_max * voxel_size + translation,
171
- bb_max * voxel_size + translation,
172
- voxel_size=voxel_size,
173
- bg_value=background_value,
174
- translation=translation,
175
- points_in_world_space=True,
176
- device=device,
177
- )
178
- points = wp.array(points_ref, dtype=wp.vec3, device=device)
179
- values_a = wp.empty(num_points, dtype=wp.float32, device=device)
180
- values_b = wp.empty(num_points, dtype=wp.float32, device=device)
181
- wp.launch(test_volume_store_f, dim=num_points, inputs=[volume_a.id, points], device=device)
182
- wp.launch(test_volume_store_f, dim=num_points, inputs=[volume_b.id, points], device=device)
183
- wp.launch(test_volume_readback_f, dim=num_points, inputs=[volume_a.id, points, values_a], device=device)
184
- wp.launch(test_volume_readback_f, dim=num_points, inputs=[volume_b.id, points, values_b], device=device)
185
-
186
- np.testing.assert_equal(values_a.numpy(), values_ref)
187
- np.testing.assert_equal(values_b.numpy(), values_ref)
188
-
189
- def test_volume_allocate_by_tiles_f(self):
190
- voxel_size = 0.125
191
- background_value = 123.456
192
- translation = wp.vec3(-12.3, 4.56, -789)
193
-
194
- num_tiles = 1000
195
- tiles = rng.integers(-512, 512, size=(num_tiles, 3), dtype=np.int32)
196
- points_is = tiles * 8 # points in index space
197
- points_ws = points_is * voxel_size + translation # points in world space
198
-
199
- values_ref = np.empty(num_tiles * 512)
200
- for t in range(num_tiles):
201
- ti, tj, tk = points_is[t]
202
- for i in range(8):
203
- for j in range(8):
204
- for k in range(8):
205
- values_ref[t * 512 + i * 64 + j * 8 + k] = float(100 * (ti + i) + 10 * (tj + j) + (tk + k))
206
-
207
- for device in devices:
208
- if device.is_cpu:
209
- continue
210
-
211
- points_is_d = wp.array(points_is, dtype=wp.int32, device=device)
212
- points_ws_d = wp.array(points_ws, dtype=wp.vec3, device=device)
213
- volume_a = wp.Volume.allocate_by_tiles(
214
- points_is_d, voxel_size, background_value, translation, device=device
215
- )
216
- volume_b = wp.Volume.allocate_by_tiles(
217
- points_ws_d, voxel_size, background_value, translation, device=device
218
- )
219
- values_a = wp.empty(num_tiles * 512, dtype=wp.float32, device=device)
220
- values_b = wp.empty(num_tiles * 512, dtype=wp.float32, device=device)
221
-
222
- wp.launch(test_volume_tile_store_f, dim=num_tiles, inputs=[volume_a.id, points_is_d], device=device)
223
- wp.launch(test_volume_tile_store_ws_f, dim=num_tiles, inputs=[volume_b.id, points_ws_d], device=device)
224
- wp.launch(
225
- test_volume_tile_readback_f,
226
- dim=num_tiles,
227
- inputs=[volume_a.id, points_is_d, values_a],
228
- device=device,
229
- )
230
- wp.launch(
231
- test_volume_tile_readback_f,
232
- dim=num_tiles,
233
- inputs=[volume_b.id, points_is_d, values_b],
234
- device=device,
235
- )
236
-
237
- np.testing.assert_equal(values_a.numpy(), values_ref)
238
- np.testing.assert_equal(values_b.numpy(), values_ref)
239
-
240
- def test_volume_allocate_by_tiles_v(self):
241
- num_tiles = 1000
242
- tiles = rng.integers(-512, 512, size=(num_tiles, 3), dtype=np.int32)
243
- points_is = tiles * 8
244
-
245
- values_ref = np.empty((len(tiles) * 512, 3))
246
- for t in range(len(tiles)):
247
- ti, tj, tk = points_is[t]
248
- for i in range(8):
249
- for j in range(8):
250
- for k in range(8):
251
- values_ref[t * 512 + i * 64 + j * 8 + k] = [ti + i, tj + j, tk + k]
252
-
253
- for device in devices:
254
- if device.is_cpu:
255
- continue
256
-
257
- points_d = wp.array(points_is, dtype=wp.int32, device=device)
258
- volume = wp.Volume.allocate_by_tiles(points_d, 0.1, wp.vec3(1, 2, 3), device=device)
259
- values = wp.empty(len(points_d) * 512, dtype=wp.vec3, device=device)
260
-
261
- wp.launch(test_volume_tile_store_v, dim=len(points_d), inputs=[volume.id, points_d], device=device)
262
- wp.launch(
263
- test_volume_tile_readback_v, dim=len(points_d), inputs=[volume.id, points_d, values], device=device
264
- )
265
-
266
- values_res = values.numpy()
267
- np.testing.assert_equal(values_res, values_ref)
268
-
269
- return TestVolumes
142
+ def test_volume_allocation(test, device):
143
+ voxel_size = 0.125
144
+ background_value = 123.456
145
+ translation = wp.vec3(-12.3, 4.56, -789)
146
+
147
+ axis = np.linspace(-11, 11, 23)
148
+ points_ref = np.array([[x, y, z] for x in axis for y in axis for z in axis])
149
+ values_ref = np.array([x + 100 * y + 10000 * z for x in axis for y in axis for z in axis])
150
+ num_points = len(points_ref)
151
+ bb_max = np.array([11, 11, 11])
152
+ volume_a = wp.Volume.allocate(
153
+ -bb_max,
154
+ bb_max,
155
+ voxel_size=voxel_size,
156
+ bg_value=background_value,
157
+ translation=translation,
158
+ device=device,
159
+ )
160
+ volume_b = wp.Volume.allocate(
161
+ -bb_max * voxel_size + translation,
162
+ bb_max * voxel_size + translation,
163
+ voxel_size=voxel_size,
164
+ bg_value=background_value,
165
+ translation=translation,
166
+ points_in_world_space=True,
167
+ device=device,
168
+ )
169
+ points = wp.array(points_ref, dtype=wp.vec3, device=device)
170
+ values_a = wp.empty(num_points, dtype=wp.float32, device=device)
171
+ values_b = wp.empty(num_points, dtype=wp.float32, device=device)
172
+ wp.launch(test_volume_store_f, dim=num_points, inputs=[volume_a.id, points], device=device)
173
+ wp.launch(test_volume_store_f, dim=num_points, inputs=[volume_b.id, points], device=device)
174
+ wp.launch(test_volume_readback_f, dim=num_points, inputs=[volume_a.id, points, values_a], device=device)
175
+ wp.launch(test_volume_readback_f, dim=num_points, inputs=[volume_b.id, points, values_b], device=device)
176
+
177
+ np.testing.assert_equal(values_a.numpy(), values_ref)
178
+ np.testing.assert_equal(values_b.numpy(), values_ref)
179
+
180
+
181
+ def test_volume_allocate_by_tiles_f(test, device):
182
+ voxel_size = 0.125
183
+ background_value = 123.456
184
+ translation = wp.vec3(-12.3, 4.56, -789)
185
+
186
+ num_tiles = 1000
187
+ rng = np.random.default_rng(101215)
188
+ tiles = rng.integers(-512, 512, size=(num_tiles, 3), dtype=np.int32)
189
+ points_is = tiles * 8 # points in index space
190
+ points_ws = points_is * voxel_size + translation # points in world space
191
+
192
+ values_ref = np.empty(num_tiles * 512)
193
+ for t in range(num_tiles):
194
+ ti, tj, tk = points_is[t]
195
+ for i in range(8):
196
+ for j in range(8):
197
+ for k in range(8):
198
+ values_ref[t * 512 + i * 64 + j * 8 + k] = float(100 * (ti + i) + 10 * (tj + j) + (tk + k))
199
+
200
+ points_is_d = wp.array(points_is, dtype=wp.int32, device=device)
201
+ points_ws_d = wp.array(points_ws, dtype=wp.vec3, device=device)
202
+ volume_a = wp.Volume.allocate_by_tiles(points_is_d, voxel_size, background_value, translation, device=device)
203
+ volume_b = wp.Volume.allocate_by_tiles(points_ws_d, voxel_size, background_value, translation, device=device)
204
+ values_a = wp.empty(num_tiles * 512, dtype=wp.float32, device=device)
205
+ values_b = wp.empty(num_tiles * 512, dtype=wp.float32, device=device)
206
+
207
+ wp.launch(test_volume_tile_store_f, dim=num_tiles, inputs=[volume_a.id, points_is_d], device=device)
208
+ wp.launch(test_volume_tile_store_ws_f, dim=num_tiles, inputs=[volume_b.id, points_ws_d], device=device)
209
+ wp.launch(
210
+ test_volume_tile_readback_f,
211
+ dim=num_tiles,
212
+ inputs=[volume_a.id, points_is_d, values_a],
213
+ device=device,
214
+ )
215
+ wp.launch(
216
+ test_volume_tile_readback_f,
217
+ dim=num_tiles,
218
+ inputs=[volume_b.id, points_is_d, values_b],
219
+ device=device,
220
+ )
221
+
222
+ np.testing.assert_equal(values_a.numpy(), values_ref)
223
+ np.testing.assert_equal(values_b.numpy(), values_ref)
224
+
225
+
226
+ def test_volume_allocate_by_tiles_v(test, device):
227
+ num_tiles = 1000
228
+ rng = np.random.default_rng(101215)
229
+ tiles = rng.integers(-512, 512, size=(num_tiles, 3), dtype=np.int32)
230
+ points_is = tiles * 8
231
+
232
+ values_ref = np.empty((len(tiles) * 512, 3))
233
+ for t in range(len(tiles)):
234
+ ti, tj, tk = points_is[t]
235
+ for i in range(8):
236
+ for j in range(8):
237
+ for k in range(8):
238
+ values_ref[t * 512 + i * 64 + j * 8 + k] = [ti + i, tj + j, tk + k]
239
+
240
+ points_d = wp.array(points_is, dtype=wp.int32, device=device)
241
+ volume = wp.Volume.allocate_by_tiles(points_d, 0.1, wp.vec3(1, 2, 3), device=device)
242
+ values = wp.empty(len(points_d) * 512, dtype=wp.vec3, device=device)
243
+
244
+ wp.launch(test_volume_tile_store_v, dim=len(points_d), inputs=[volume.id, points_d], device=device)
245
+ wp.launch(test_volume_tile_readback_v, dim=len(points_d), inputs=[volume.id, points_d, values], device=device)
246
+
247
+ values_res = values.numpy()
248
+ np.testing.assert_equal(values_res, values_ref)
249
+
250
+
251
+ devices = get_unique_cuda_test_devices()
252
+
253
+
254
+ class TestVolumeWrite(unittest.TestCase):
255
+ pass
256
+
257
+
258
+ add_function_test(TestVolumeWrite, "test_volume_allocation", test_volume_allocation, devices=devices)
259
+ add_function_test(TestVolumeWrite, "test_volume_allocate_by_tiles_f", test_volume_allocate_by_tiles_f, devices=devices)
260
+ add_function_test(TestVolumeWrite, "test_volume_allocate_by_tiles_v", test_volume_allocate_by_tiles_v, devices=devices)
270
261
 
271
262
 
272
263
  if __name__ == "__main__":
273
- wp.force_load()
274
- c = register(unittest.TestCase)
264
+ wp.build.clear_kernel_cache()
275
265
  unittest.main(verbosity=2)
@@ -0,0 +1,35 @@
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 warp as wp
9
+ from warp.tests.unittest_utils import TeamCityTestRunner
10
+
11
+
12
+ def run_suite() -> bool:
13
+ """Run a test suite"""
14
+
15
+ import warp.tests.unittest_suites
16
+
17
+ # force rebuild of all kernels
18
+ wp.build.clear_kernel_cache()
19
+ print("Cleared Warp kernel cache")
20
+
21
+ runner = TeamCityTestRunner(verbosity=2, failfast=False)
22
+
23
+ # Can swap out warp.tests.unittest_suites.explicit_suite()
24
+ suite = warp.tests.unittest_suites.auto_discover_suite()
25
+ print(f"Test suite has {suite.countTestCases()} tests")
26
+
27
+ ret = not runner.run(suite, "WarpTests").wasSuccessful()
28
+ return ret
29
+
30
+
31
+ if __name__ == "__main__":
32
+ ret = run_suite()
33
+ import sys
34
+
35
+ sys.exit(ret)
@@ -0,0 +1,291 @@
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
+ """Warp Test Suites
9
+
10
+ This file is intended to define functions that return TestSuite objects, which
11
+ can be used in parallel or serial unit tests (with optional code coverage)
12
+ """
13
+
14
+ import os
15
+ import unittest
16
+
17
+ START_DIRECTORY = os.path.realpath(os.path.dirname(__file__))
18
+ TOP_LEVEL_DIRECTORY = os.path.realpath(os.path.join(START_DIRECTORY, "..", ".."))
19
+
20
+
21
+ def _create_suite_from_test_classes(test_classes):
22
+ suite = unittest.TestSuite()
23
+
24
+ for test in test_classes:
25
+ sub_suite = unittest.TestSuite()
26
+ sub_suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(test))
27
+ suite.addTest(sub_suite)
28
+
29
+ return suite
30
+
31
+
32
+ def auto_discover_suite(loader=unittest.defaultTestLoader, pattern="test*.py"):
33
+ """Uses unittest auto-discovery to build a test suite (test_*.py pattern)"""
34
+
35
+ return loader.discover(start_dir=START_DIRECTORY, pattern=pattern, top_level_dir=TOP_LEVEL_DIRECTORY)
36
+
37
+
38
+ def explicit_suite():
39
+ """Example of a manually constructed test suite.
40
+
41
+ Intended to be modified to create additional test suites
42
+ """
43
+ from warp.tests.test_adam import TestAdam
44
+ from warp.tests.test_arithmetic import TestArithmetic
45
+ from warp.tests.test_array import TestArray
46
+ from warp.tests.test_array_reduce import TestArrayReduce
47
+ from warp.tests.test_atomic import TestAtomic
48
+ from warp.tests.test_bool import TestBool
49
+ from warp.tests.test_builtins_resolution import TestBuiltinsResolution
50
+ from warp.tests.test_bvh import TestBvh
51
+ from warp.tests.test_closest_point_edge_edge import TestClosestPointEdgeEdgeMethods
52
+ from warp.tests.test_codegen import TestCodeGen
53
+ from warp.tests.test_compile_consts import TestConstants
54
+ from warp.tests.test_conditional import TestConditional
55
+ from warp.tests.test_copy import TestCopy
56
+ from warp.tests.test_ctypes import TestCTypes
57
+ from warp.tests.test_dense import TestDense
58
+ from warp.tests.test_devices import TestDevices
59
+ from warp.tests.test_dlpack import TestDLPack
60
+ from warp.tests.test_examples import TestExamples, TestFemExamples, TestSimExamples
61
+ from warp.tests.test_fabricarray import TestFabricArray
62
+ from warp.tests.test_fast_math import TestFastMath
63
+ from warp.tests.test_fem import TestFem
64
+ from warp.tests.test_fp16 import TestFp16
65
+ from warp.tests.test_func import TestFunc
66
+ from warp.tests.test_generics import TestGenerics
67
+ from warp.tests.test_grad import TestGrad
68
+ from warp.tests.test_grad_customs import TestGradCustoms
69
+ from warp.tests.test_hash_grid import TestHashGrid
70
+ from warp.tests.test_import import TestImport
71
+ from warp.tests.test_indexedarray import TestIndexedArray
72
+ from warp.tests.test_intersect import TestIntersect
73
+ from warp.tests.test_large import TestLarge
74
+ from warp.tests.test_launch import TestLaunch
75
+ from warp.tests.test_lerp import TestLerp
76
+ from warp.tests.test_lvalue import TestLValue
77
+ from warp.tests.test_marching_cubes import TestMarchingCubes
78
+ from warp.tests.test_mat import TestMat
79
+ from warp.tests.test_mat_lite import TestMatLite
80
+ from warp.tests.test_mat_scalar_ops import TestMatScalarOps
81
+ from warp.tests.test_math import TestMath
82
+ from warp.tests.test_matmul import TestMatmul
83
+ from warp.tests.test_matmul_lite import TestMatmulLite
84
+ from warp.tests.test_mesh import TestMesh
85
+ from warp.tests.test_mesh_query_aabb import TestMeshQueryAABBMethods
86
+ from warp.tests.test_mesh_query_point import TestMeshQueryPoint
87
+ from warp.tests.test_mesh_query_ray import TestMeshQueryRay
88
+ from warp.tests.test_mlp import TestMLP
89
+ from warp.tests.test_model import TestModel
90
+ from warp.tests.test_modules_lite import TestModuleLite
91
+ from warp.tests.test_multigpu import TestMultiGPU
92
+ from warp.tests.test_noise import TestNoise
93
+ from warp.tests.test_operators import TestOperators
94
+ from warp.tests.test_options import TestOptions
95
+ from warp.tests.test_pinned import TestPinned
96
+ from warp.tests.test_print import TestPrint
97
+ from warp.tests.test_quat import TestQuat
98
+ from warp.tests.test_rand import TestRand
99
+ from warp.tests.test_reload import TestReload
100
+ from warp.tests.test_rounding import TestRounding
101
+ from warp.tests.test_runlength_encode import TestRunlengthEncode
102
+ from warp.tests.test_smoothstep import TestSmoothstep
103
+ from warp.tests.test_snippet import TestSnippets
104
+ from warp.tests.test_sparse import TestSparse
105
+ from warp.tests.test_spatial import TestSpatial
106
+ from warp.tests.test_streams import TestStreams
107
+ from warp.tests.test_struct import TestStruct
108
+ from warp.tests.test_tape import TestTape
109
+ from warp.tests.test_torch import TestTorch
110
+ from warp.tests.test_transient_module import TestTransientModule
111
+ from warp.tests.test_types import TestTypes
112
+ from warp.tests.test_utils import TestUtils
113
+ from warp.tests.test_vec import TestVec
114
+ from warp.tests.test_vec_lite import TestVecLite
115
+ from warp.tests.test_vec_scalar_ops import TestVecScalarOps
116
+ from warp.tests.test_volume import TestVolume
117
+ from warp.tests.test_volume_write import TestVolumeWrite
118
+
119
+ test_classes = [
120
+ TestAdam,
121
+ TestArithmetic,
122
+ TestArray,
123
+ TestArrayReduce,
124
+ TestAtomic,
125
+ TestBool,
126
+ TestBuiltinsResolution,
127
+ TestBvh,
128
+ TestClosestPointEdgeEdgeMethods,
129
+ TestCodeGen,
130
+ TestConstants,
131
+ TestConditional,
132
+ TestCopy,
133
+ TestCTypes,
134
+ TestDense,
135
+ TestDevices,
136
+ TestDLPack,
137
+ TestExamples,
138
+ TestFemExamples,
139
+ TestSimExamples,
140
+ TestFabricArray,
141
+ TestFastMath,
142
+ TestFem,
143
+ TestFp16,
144
+ TestFunc,
145
+ TestGenerics,
146
+ TestGrad,
147
+ TestGradCustoms,
148
+ TestHashGrid,
149
+ TestImport,
150
+ TestIndexedArray,
151
+ TestIntersect,
152
+ TestLarge,
153
+ TestLaunch,
154
+ TestLerp,
155
+ TestLValue,
156
+ TestMarchingCubes,
157
+ TestMat,
158
+ TestMatLite,
159
+ TestMatScalarOps,
160
+ TestMath,
161
+ TestMatmul,
162
+ TestMatmulLite,
163
+ TestMesh,
164
+ TestMeshQueryAABBMethods,
165
+ TestMeshQueryPoint,
166
+ TestMeshQueryRay,
167
+ TestMLP,
168
+ TestModel,
169
+ TestModuleLite,
170
+ TestMultiGPU,
171
+ TestNoise,
172
+ TestOperators,
173
+ TestOptions,
174
+ TestPinned,
175
+ TestPrint,
176
+ TestQuat,
177
+ TestRand,
178
+ TestReload,
179
+ TestRounding,
180
+ TestRunlengthEncode,
181
+ TestSmoothstep,
182
+ TestSparse,
183
+ TestSnippets,
184
+ TestSpatial,
185
+ TestStreams,
186
+ TestStruct,
187
+ TestTape,
188
+ TestTorch,
189
+ TestTransientModule,
190
+ TestTypes,
191
+ TestUtils,
192
+ TestVec,
193
+ TestVecLite,
194
+ TestVecScalarOps,
195
+ TestVolume,
196
+ TestVolumeWrite,
197
+ ]
198
+
199
+ return _create_suite_from_test_classes(test_classes)
200
+
201
+
202
+ def kit_suite():
203
+ """Tries to mimic the test suite used for testing omni.warp.core in Kit
204
+
205
+ Requires manual updates with test_ext.py for now.
206
+ """
207
+ from warp.tests.test_array import TestArray
208
+ from warp.tests.test_array_reduce import TestArrayReduce
209
+ from warp.tests.test_bvh import TestBvh
210
+ from warp.tests.test_codegen import TestCodeGen
211
+ from warp.tests.test_compile_consts import TestConstants
212
+ from warp.tests.test_conditional import TestConditional
213
+ from warp.tests.test_ctypes import TestCTypes
214
+ from warp.tests.test_devices import TestDevices
215
+ from warp.tests.test_dlpack import TestDLPack
216
+ from warp.tests.test_fabricarray import TestFabricArray
217
+ from warp.tests.test_func import TestFunc
218
+ from warp.tests.test_generics import TestGenerics
219
+ from warp.tests.test_grad_customs import TestGradCustoms
220
+ from warp.tests.test_hash_grid import TestHashGrid
221
+ from warp.tests.test_indexedarray import TestIndexedArray
222
+ from warp.tests.test_launch import TestLaunch
223
+ from warp.tests.test_marching_cubes import TestMarchingCubes
224
+ from warp.tests.test_mat_lite import TestMatLite
225
+ from warp.tests.test_math import TestMath
226
+ from warp.tests.test_matmul_lite import TestMatmulLite
227
+ from warp.tests.test_mesh import TestMesh
228
+ from warp.tests.test_mesh_query_aabb import TestMeshQueryAABBMethods
229
+ from warp.tests.test_mesh_query_point import TestMeshQuery
230
+ from warp.tests.test_mesh_query_ray import TestMeshQueryRay
231
+ from warp.tests.test_modules_lite import TestModuleLite
232
+ from warp.tests.test_noise import TestNoise
233
+ from warp.tests.test_operators import TestOperators
234
+ from warp.tests.test_quat import TestQuat
235
+ from warp.tests.test_rand import TestRand
236
+ from warp.tests.test_rounding import TestRounding
237
+ from warp.tests.test_runlength_encode import TestRunlengthEncode
238
+ from warp.tests.test_sparse import TestSparse
239
+ from warp.tests.test_streams import TestStreams
240
+ from warp.tests.test_tape import TestTape
241
+ from warp.tests.test_transient_module import TestTransientModule
242
+ from warp.tests.test_types import TestTypes
243
+ from warp.tests.test_utils import TestUtils
244
+ from warp.tests.test_vec_lite import TestVecLite
245
+ from warp.tests.test_volume import TestVolume
246
+ from warp.tests.test_volume_write import TestVolumeWrite
247
+
248
+ test_classes = [
249
+ TestArray,
250
+ TestArrayReduce,
251
+ TestBvh,
252
+ TestCodeGen,
253
+ TestConstants,
254
+ TestConditional,
255
+ TestCTypes,
256
+ TestDevices,
257
+ TestDLPack,
258
+ TestFabricArray,
259
+ TestFunc,
260
+ TestGenerics,
261
+ TestGradCustoms,
262
+ TestHashGrid,
263
+ TestIndexedArray,
264
+ TestLaunch,
265
+ TestMarchingCubes,
266
+ TestMatLite,
267
+ TestMath,
268
+ TestMatmulLite,
269
+ TestMesh,
270
+ TestMeshQueryAABBMethods,
271
+ TestMeshQuery,
272
+ TestMeshQueryRay,
273
+ TestModuleLite,
274
+ TestNoise,
275
+ TestOperators,
276
+ TestQuat,
277
+ TestRand,
278
+ TestRounding,
279
+ TestRunlengthEncode,
280
+ TestSparse,
281
+ TestStreams,
282
+ TestTape,
283
+ TestTransientModule,
284
+ TestTypes,
285
+ TestUtils,
286
+ TestVecLite,
287
+ TestVolume,
288
+ TestVolumeWrite,
289
+ ]
290
+
291
+ return _create_suite_from_test_classes(test_classes)