warp-lang 1.0.0b5__py3-none-manylinux2014_x86_64.whl → 1.0.0b6__py3-none-manylinux2014_x86_64.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.
Files changed (187) hide show
  1. docs/conf.py +3 -4
  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/example_dem.py +28 -26
  6. examples/example_diffray.py +37 -30
  7. examples/example_fluid.py +7 -3
  8. examples/example_jacobian_ik.py +1 -1
  9. examples/example_mesh_intersect.py +10 -7
  10. examples/example_nvdb.py +3 -3
  11. examples/example_render_opengl.py +19 -10
  12. examples/example_sim_cartpole.py +9 -5
  13. examples/example_sim_cloth.py +29 -25
  14. examples/example_sim_fk_grad.py +2 -2
  15. examples/example_sim_fk_grad_torch.py +3 -3
  16. examples/example_sim_grad_bounce.py +11 -8
  17. examples/example_sim_grad_cloth.py +12 -9
  18. examples/example_sim_granular.py +2 -2
  19. examples/example_sim_granular_collision_sdf.py +13 -13
  20. examples/example_sim_neo_hookean.py +3 -3
  21. examples/example_sim_particle_chain.py +2 -2
  22. examples/example_sim_quadruped.py +8 -5
  23. examples/example_sim_rigid_chain.py +8 -5
  24. examples/example_sim_rigid_contact.py +13 -10
  25. examples/example_sim_rigid_fem.py +2 -2
  26. examples/example_sim_rigid_gyroscopic.py +2 -2
  27. examples/example_sim_rigid_kinematics.py +1 -1
  28. examples/example_sim_trajopt.py +3 -2
  29. examples/fem/example_apic_fluid.py +5 -7
  30. examples/fem/example_diffusion_mgpu.py +18 -16
  31. warp/__init__.py +3 -2
  32. warp/bin/warp.so +0 -0
  33. warp/build_dll.py +29 -9
  34. warp/builtins.py +206 -7
  35. warp/codegen.py +58 -38
  36. warp/config.py +3 -1
  37. warp/context.py +234 -128
  38. warp/fem/__init__.py +2 -2
  39. warp/fem/cache.py +2 -1
  40. warp/fem/field/nodal_field.py +18 -17
  41. warp/fem/geometry/hexmesh.py +11 -6
  42. warp/fem/geometry/quadmesh_2d.py +16 -12
  43. warp/fem/geometry/tetmesh.py +19 -8
  44. warp/fem/geometry/trimesh_2d.py +18 -7
  45. warp/fem/integrate.py +341 -196
  46. warp/fem/quadrature/__init__.py +1 -1
  47. warp/fem/quadrature/pic_quadrature.py +138 -53
  48. warp/fem/quadrature/quadrature.py +81 -9
  49. warp/fem/space/__init__.py +1 -1
  50. warp/fem/space/basis_space.py +169 -51
  51. warp/fem/space/grid_2d_function_space.py +2 -2
  52. warp/fem/space/grid_3d_function_space.py +2 -2
  53. warp/fem/space/hexmesh_function_space.py +2 -2
  54. warp/fem/space/partition.py +9 -6
  55. warp/fem/space/quadmesh_2d_function_space.py +2 -2
  56. warp/fem/space/shape/cube_shape_function.py +27 -15
  57. warp/fem/space/shape/square_shape_function.py +29 -18
  58. warp/fem/space/tetmesh_function_space.py +2 -2
  59. warp/fem/space/topology.py +10 -0
  60. warp/fem/space/trimesh_2d_function_space.py +2 -2
  61. warp/fem/utils.py +10 -5
  62. warp/native/array.h +49 -8
  63. warp/native/builtin.h +31 -14
  64. warp/native/cuda_util.cpp +8 -3
  65. warp/native/cuda_util.h +1 -0
  66. warp/native/exports.h +1177 -1108
  67. warp/native/intersect.h +4 -4
  68. warp/native/intersect_adj.h +8 -8
  69. warp/native/mat.h +65 -6
  70. warp/native/mesh.h +126 -5
  71. warp/native/quat.h +28 -4
  72. warp/native/vec.h +76 -14
  73. warp/native/warp.cu +1 -6
  74. warp/render/render_opengl.py +261 -109
  75. warp/sim/import_mjcf.py +13 -7
  76. warp/sim/import_urdf.py +14 -14
  77. warp/sim/inertia.py +17 -18
  78. warp/sim/model.py +67 -67
  79. warp/sim/render.py +1 -1
  80. warp/sparse.py +6 -6
  81. warp/stubs.py +19 -81
  82. warp/tape.py +1 -1
  83. warp/tests/__main__.py +3 -6
  84. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  85. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  86. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  87. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  88. warp/tests/aux_test_unresolved_func.py +14 -0
  89. warp/tests/aux_test_unresolved_symbol.py +14 -0
  90. warp/tests/{test_kinematics.py → disabled_kinematics.py} +10 -12
  91. warp/tests/run_coverage_serial.py +31 -0
  92. warp/tests/test_adam.py +102 -106
  93. warp/tests/test_arithmetic.py +39 -40
  94. warp/tests/test_array.py +46 -48
  95. warp/tests/test_array_reduce.py +25 -19
  96. warp/tests/test_atomic.py +62 -26
  97. warp/tests/test_bool.py +16 -11
  98. warp/tests/test_builtins_resolution.py +1292 -0
  99. warp/tests/test_bvh.py +9 -12
  100. warp/tests/test_closest_point_edge_edge.py +53 -57
  101. warp/tests/test_codegen.py +164 -134
  102. warp/tests/test_compile_consts.py +13 -19
  103. warp/tests/test_conditional.py +30 -32
  104. warp/tests/test_copy.py +9 -12
  105. warp/tests/test_ctypes.py +90 -98
  106. warp/tests/test_dense.py +20 -14
  107. warp/tests/test_devices.py +34 -35
  108. warp/tests/test_dlpack.py +74 -75
  109. warp/tests/test_examples.py +215 -97
  110. warp/tests/test_fabricarray.py +15 -21
  111. warp/tests/test_fast_math.py +14 -11
  112. warp/tests/test_fem.py +280 -97
  113. warp/tests/test_fp16.py +19 -15
  114. warp/tests/test_func.py +177 -194
  115. warp/tests/test_generics.py +71 -77
  116. warp/tests/test_grad.py +83 -32
  117. warp/tests/test_grad_customs.py +7 -9
  118. warp/tests/test_hash_grid.py +6 -10
  119. warp/tests/test_import.py +9 -23
  120. warp/tests/test_indexedarray.py +19 -21
  121. warp/tests/test_intersect.py +15 -9
  122. warp/tests/test_large.py +17 -19
  123. warp/tests/test_launch.py +14 -17
  124. warp/tests/test_lerp.py +63 -63
  125. warp/tests/test_lvalue.py +84 -35
  126. warp/tests/test_marching_cubes.py +9 -13
  127. warp/tests/test_mat.py +388 -3004
  128. warp/tests/test_mat_lite.py +9 -12
  129. warp/tests/test_mat_scalar_ops.py +2889 -0
  130. warp/tests/test_math.py +10 -11
  131. warp/tests/test_matmul.py +104 -100
  132. warp/tests/test_matmul_lite.py +72 -98
  133. warp/tests/test_mesh.py +35 -32
  134. warp/tests/test_mesh_query_aabb.py +18 -25
  135. warp/tests/test_mesh_query_point.py +39 -23
  136. warp/tests/test_mesh_query_ray.py +9 -21
  137. warp/tests/test_mlp.py +8 -9
  138. warp/tests/test_model.py +89 -93
  139. warp/tests/test_modules_lite.py +15 -25
  140. warp/tests/test_multigpu.py +87 -114
  141. warp/tests/test_noise.py +10 -12
  142. warp/tests/test_operators.py +14 -21
  143. warp/tests/test_options.py +10 -11
  144. warp/tests/test_pinned.py +16 -18
  145. warp/tests/test_print.py +16 -20
  146. warp/tests/test_quat.py +121 -88
  147. warp/tests/test_rand.py +12 -13
  148. warp/tests/test_reload.py +27 -32
  149. warp/tests/test_rounding.py +7 -10
  150. warp/tests/test_runlength_encode.py +105 -106
  151. warp/tests/test_smoothstep.py +8 -9
  152. warp/tests/test_snippet.py +13 -22
  153. warp/tests/test_sparse.py +30 -29
  154. warp/tests/test_spatial.py +179 -174
  155. warp/tests/test_streams.py +100 -107
  156. warp/tests/test_struct.py +98 -67
  157. warp/tests/test_tape.py +11 -17
  158. warp/tests/test_torch.py +89 -86
  159. warp/tests/test_transient_module.py +9 -12
  160. warp/tests/test_types.py +328 -50
  161. warp/tests/test_utils.py +217 -218
  162. warp/tests/test_vec.py +133 -2133
  163. warp/tests/test_vec_lite.py +8 -11
  164. warp/tests/test_vec_scalar_ops.py +2099 -0
  165. warp/tests/test_volume.py +391 -382
  166. warp/tests/test_volume_write.py +122 -135
  167. warp/tests/unittest_serial.py +35 -0
  168. warp/tests/unittest_suites.py +291 -0
  169. warp/tests/{test_base.py → unittest_utils.py} +138 -25
  170. warp/tests/{test_misc.py → unused_test_misc.py} +13 -5
  171. warp/tests/{test_debug.py → walkthough_debug.py} +2 -15
  172. warp/thirdparty/unittest_parallel.py +257 -54
  173. warp/types.py +119 -98
  174. warp/utils.py +14 -0
  175. {warp_lang-1.0.0b5.dist-info → warp_lang-1.0.0b6.dist-info}/METADATA +2 -1
  176. {warp_lang-1.0.0b5.dist-info → warp_lang-1.0.0b6.dist-info}/RECORD +182 -178
  177. {warp_lang-1.0.0b5.dist-info → warp_lang-1.0.0b6.dist-info}/WHEEL +1 -1
  178. warp/tests/test_all.py +0 -239
  179. warp/tests/test_conditional_unequal_types_kernels.py +0 -14
  180. warp/tests/test_coverage.py +0 -38
  181. warp/tests/test_unresolved_func.py +0 -7
  182. warp/tests/test_unresolved_symbol.py +0 -7
  183. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  184. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  185. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  186. {warp_lang-1.0.0b5.dist-info → warp_lang-1.0.0b6.dist-info}/LICENSE.md +0 -0
  187. {warp_lang-1.0.0b5.dist-info → warp_lang-1.0.0b6.dist-info}/top_level.txt +0 -0
@@ -7,11 +7,11 @@
7
7
 
8
8
  import unittest
9
9
 
10
- import warp as wp
11
- from warp.tests.test_base import *
12
-
13
10
  import numpy as np
14
11
 
12
+ import warp as wp
13
+ from warp.tests.unittest_utils import *
14
+
15
15
  wp.init()
16
16
  # wp.config.cache_kernels = False
17
17
 
@@ -139,140 +139,127 @@ def test_volume_tile_readback_v(volume: wp.uint64, tiles: wp.array2d(dtype=wp.in
139
139
  values[tid * 512 + r] = wp.volume_lookup_v(volume, ii, jj, kk)
140
140
 
141
141
 
142
- rng = np.random.default_rng(101215)
143
-
144
-
145
- def register(parent):
146
- devices = get_test_devices()
147
-
148
- class TestVolumes(parent):
149
- def test_volume_allocation(self):
150
- voxel_size = 0.125
151
- background_value = 123.456
152
- translation = wp.vec3(-12.3, 4.56, -789)
153
-
154
- axis = np.linspace(-11, 11, 23)
155
- points_ref = np.array([[x, y, z] for x in axis for y in axis for z in axis])
156
- values_ref = np.array([x + 100 * y + 10000 * z for x in axis for y in axis for z in axis])
157
- num_points = len(points_ref)
158
- bb_max = np.array([11, 11, 11])
159
- for device in devices:
160
- if device.is_cpu:
161
- continue
162
-
163
- volume_a = wp.Volume.allocate(
164
- -bb_max,
165
- bb_max,
166
- voxel_size=voxel_size,
167
- bg_value=background_value,
168
- translation=translation,
169
- device=device,
170
- )
171
- volume_b = wp.Volume.allocate(
172
- -bb_max * voxel_size + translation,
173
- bb_max * voxel_size + translation,
174
- voxel_size=voxel_size,
175
- bg_value=background_value,
176
- translation=translation,
177
- points_in_world_space=True,
178
- device=device,
179
- )
180
- points = wp.array(points_ref, dtype=wp.vec3, device=device)
181
- values_a = wp.empty(num_points, dtype=wp.float32, device=device)
182
- values_b = wp.empty(num_points, dtype=wp.float32, device=device)
183
- wp.launch(test_volume_store_f, dim=num_points, inputs=[volume_a.id, points], device=device)
184
- wp.launch(test_volume_store_f, dim=num_points, inputs=[volume_b.id, points], device=device)
185
- wp.launch(test_volume_readback_f, dim=num_points, inputs=[volume_a.id, points, values_a], device=device)
186
- wp.launch(test_volume_readback_f, dim=num_points, inputs=[volume_b.id, points, values_b], device=device)
187
-
188
- np.testing.assert_equal(values_a.numpy(), values_ref)
189
- np.testing.assert_equal(values_b.numpy(), values_ref)
190
-
191
- def test_volume_allocate_by_tiles_f(self):
192
- voxel_size = 0.125
193
- background_value = 123.456
194
- translation = wp.vec3(-12.3, 4.56, -789)
195
-
196
- num_tiles = 1000
197
- tiles = rng.integers(-512, 512, size=(num_tiles, 3), dtype=np.int32)
198
- points_is = tiles * 8 # points in index space
199
- points_ws = points_is * voxel_size + translation # points in world space
200
-
201
- values_ref = np.empty(num_tiles * 512)
202
- for t in range(num_tiles):
203
- ti, tj, tk = points_is[t]
204
- for i in range(8):
205
- for j in range(8):
206
- for k in range(8):
207
- values_ref[t * 512 + i * 64 + j * 8 + k] = float(100 * (ti + i) + 10 * (tj + j) + (tk + k))
208
-
209
- for device in devices:
210
- if device.is_cpu:
211
- continue
212
-
213
- points_is_d = wp.array(points_is, dtype=wp.int32, device=device)
214
- points_ws_d = wp.array(points_ws, dtype=wp.vec3, device=device)
215
- volume_a = wp.Volume.allocate_by_tiles(
216
- points_is_d, voxel_size, background_value, translation, device=device
217
- )
218
- volume_b = wp.Volume.allocate_by_tiles(
219
- points_ws_d, voxel_size, background_value, translation, device=device
220
- )
221
- values_a = wp.empty(num_tiles * 512, dtype=wp.float32, device=device)
222
- values_b = wp.empty(num_tiles * 512, dtype=wp.float32, device=device)
223
-
224
- wp.launch(test_volume_tile_store_f, dim=num_tiles, inputs=[volume_a.id, points_is_d], device=device)
225
- wp.launch(test_volume_tile_store_ws_f, dim=num_tiles, inputs=[volume_b.id, points_ws_d], device=device)
226
- wp.launch(
227
- test_volume_tile_readback_f,
228
- dim=num_tiles,
229
- inputs=[volume_a.id, points_is_d, values_a],
230
- device=device,
231
- )
232
- wp.launch(
233
- test_volume_tile_readback_f,
234
- dim=num_tiles,
235
- inputs=[volume_b.id, points_is_d, values_b],
236
- device=device,
237
- )
238
-
239
- np.testing.assert_equal(values_a.numpy(), values_ref)
240
- np.testing.assert_equal(values_b.numpy(), values_ref)
241
-
242
- def test_volume_allocate_by_tiles_v(self):
243
- num_tiles = 1000
244
- tiles = rng.integers(-512, 512, size=(num_tiles, 3), dtype=np.int32)
245
- points_is = tiles * 8
246
-
247
- values_ref = np.empty((len(tiles) * 512, 3))
248
- for t in range(len(tiles)):
249
- ti, tj, tk = points_is[t]
250
- for i in range(8):
251
- for j in range(8):
252
- for k in range(8):
253
- values_ref[t * 512 + i * 64 + j * 8 + k] = [ti + i, tj + j, tk + k]
254
-
255
- for device in devices:
256
- if device.is_cpu:
257
- continue
258
-
259
- points_d = wp.array(points_is, dtype=wp.int32, device=device)
260
- volume = wp.Volume.allocate_by_tiles(points_d, 0.1, wp.vec3(1, 2, 3), device=device)
261
- values = wp.empty(len(points_d) * 512, dtype=wp.vec3, device=device)
262
-
263
- wp.launch(test_volume_tile_store_v, dim=len(points_d), inputs=[volume.id, points_d], device=device)
264
- wp.launch(
265
- test_volume_tile_readback_v, dim=len(points_d), inputs=[volume.id, points_d, values], device=device
266
- )
267
-
268
- values_res = values.numpy()
269
- np.testing.assert_equal(values_res, values_ref)
270
-
271
- 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)
272
261
 
273
262
 
274
263
  if __name__ == "__main__":
275
264
  wp.build.clear_kernel_cache()
276
- wp.force_load()
277
- _ = register(unittest.TestCase)
278
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)