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,17 +5,10 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
- # include parent path
9
- import os
10
- import sys
11
- import numpy as np
12
- import math
13
- import ctypes
8
+ import unittest
14
9
 
15
10
  import warp as wp
16
- from warp.tests.test_base import *
17
-
18
- import unittest
11
+ from warp.tests.unittest_utils import *
19
12
 
20
13
  wp.init()
21
14
 
@@ -138,25 +131,116 @@ def test_bool_param_conditional(foo: bool):
138
131
  wp.expect_eq(x, 123)
139
132
 
140
133
 
141
- def register(parent):
142
- devices = get_test_devices()
134
+ @wp.kernel
135
+ def test_conditional_chain_basic():
136
+ x = -1
137
+
138
+ if 0 < x < 1:
139
+ success = False
140
+ else:
141
+ success = True
142
+ wp.expect_eq(success, True)
143
+
144
+
145
+ @wp.kernel
146
+ def test_conditional_chain_empty_range():
147
+ x = -1
148
+ y = 4
149
+
150
+ if -2 <= x <= 10 <= y:
151
+ success = False
152
+ else:
153
+ success = True
154
+ wp.expect_eq(success, True)
155
+
156
+
157
+ @wp.kernel
158
+ def test_conditional_chain_faker():
159
+ x = -1
160
+
161
+ # Not actually a chained inequality
162
+ if (-2 < x) < (1 > 0):
163
+ success = False
164
+ else:
165
+ success = True
166
+ wp.expect_eq(success, True)
167
+
168
+
169
+ @wp.kernel
170
+ def test_conditional_chain_and():
171
+ x = -1
172
+
173
+ if (-2 < x < 0) and (-1 <= x <= -1):
174
+ success = True
175
+ else:
176
+ success = False
177
+ wp.expect_eq(success, True)
178
+
179
+
180
+ @wp.kernel
181
+ def test_conditional_chain_eqs():
182
+ x = wp.int32(10)
183
+ y = 10
184
+ z = -10
185
+
186
+ if x == y != z:
187
+ success = True
188
+ else:
189
+ success = False
190
+ wp.expect_eq(success, True)
191
+
192
+
193
+ @wp.kernel
194
+ def test_conditional_chain_mixed():
195
+ x = 0
196
+
197
+ if x < 10 == 1:
198
+ success = False
199
+ else:
200
+ success = True
201
+ wp.expect_eq(success, True)
202
+
203
+
204
+ def test_conditional_unequal_types(test: unittest.TestCase, device):
205
+ # The bad kernel must be in a separate module, otherwise the current module would fail to load
206
+ from warp.tests.aux_test_conditional_unequal_types_kernels import (
207
+ unequal_types_kernel,
208
+ )
209
+
210
+ with test.assertRaises(TypeError):
211
+ wp.launch(unequal_types_kernel, dim=(1,), inputs=[], device=device)
212
+
213
+ # remove all references to the bad module so that subsequent calls to wp.force_load()
214
+ # won't try to load it unless we explicitly re-import it again
215
+ del wp.context.user_modules["warp.tests.aux_test_conditional_unequal_types_kernels"]
216
+ del sys.modules["warp.tests.aux_test_conditional_unequal_types_kernels"]
217
+
218
+
219
+ devices = get_test_devices()
220
+
143
221
 
144
- class TestConditional(parent):
145
- pass
222
+ class TestConditional(unittest.TestCase):
223
+ pass
146
224
 
147
- add_kernel_test(TestConditional, kernel=test_conditional_if_else, dim=1, devices=devices)
148
- add_kernel_test(TestConditional, kernel=test_conditional_if_else_nested, dim=1, devices=devices)
149
- add_kernel_test(TestConditional, kernel=test_boolean_and, dim=1, devices=devices)
150
- add_kernel_test(TestConditional, kernel=test_boolean_or, dim=1, devices=devices)
151
- add_kernel_test(TestConditional, kernel=test_boolean_compound, dim=1, devices=devices)
152
- add_kernel_test(TestConditional, kernel=test_boolean_literal, dim=1, devices=devices)
153
- add_kernel_test(TestConditional, kernel=test_int_logical_not, dim=1, devices=devices)
154
- add_kernel_test(TestConditional, kernel=test_int_conditional_assign_overload, dim=1, devices=devices)
155
- add_kernel_test(TestConditional, kernel=test_bool_param_conditional, dim=1, inputs=[True], devices=devices)
156
225
 
157
- return TestConditional
226
+ add_kernel_test(TestConditional, kernel=test_conditional_if_else, dim=1, devices=devices)
227
+ add_kernel_test(TestConditional, kernel=test_conditional_if_else_nested, dim=1, devices=devices)
228
+ add_kernel_test(TestConditional, kernel=test_boolean_and, dim=1, devices=devices)
229
+ add_kernel_test(TestConditional, kernel=test_boolean_or, dim=1, devices=devices)
230
+ add_kernel_test(TestConditional, kernel=test_boolean_compound, dim=1, devices=devices)
231
+ add_kernel_test(TestConditional, kernel=test_boolean_literal, dim=1, devices=devices)
232
+ add_kernel_test(TestConditional, kernel=test_int_logical_not, dim=1, devices=devices)
233
+ add_kernel_test(TestConditional, kernel=test_int_conditional_assign_overload, dim=1, devices=devices)
234
+ add_kernel_test(TestConditional, kernel=test_bool_param_conditional, dim=1, inputs=[True], devices=devices)
235
+ add_kernel_test(TestConditional, kernel=test_conditional_chain_basic, dim=1, devices=devices)
236
+ add_kernel_test(TestConditional, kernel=test_conditional_chain_empty_range, dim=1, devices=devices)
237
+ add_kernel_test(TestConditional, kernel=test_conditional_chain_faker, dim=1, devices=devices)
238
+ add_kernel_test(TestConditional, kernel=test_conditional_chain_and, dim=1, devices=devices)
239
+ add_kernel_test(TestConditional, kernel=test_conditional_chain_eqs, dim=1, devices=devices)
240
+ add_kernel_test(TestConditional, kernel=test_conditional_chain_mixed, dim=1, devices=devices)
241
+ add_function_test(TestConditional, "test_conditional_unequal_types", test_conditional_unequal_types, devices=devices)
158
242
 
159
243
 
160
244
  if __name__ == "__main__":
161
- c = register(unittest.TestCase)
245
+ wp.build.clear_kernel_cache()
162
246
  unittest.main(verbosity=2)
warp/tests/test_copy.py CHANGED
@@ -5,13 +5,12 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
- # include parent path
8
+ import unittest
9
+
9
10
  import numpy as np
10
11
 
11
12
  import warp as wp
12
- from warp.tests.test_base import *
13
-
14
- import unittest
13
+ from warp.tests.unittest_utils import *
15
14
 
16
15
  wp.init()
17
16
 
@@ -200,18 +199,17 @@ def test_copy_indexed(test, device):
200
199
  assert_np_equal(a4.numpy(), expected4 * s)
201
200
 
202
201
 
203
- def register(parent):
204
- devices = get_test_devices()
202
+ devices = get_test_devices()
203
+
205
204
 
206
- class TestCopy(parent):
207
- pass
205
+ class TestCopy(unittest.TestCase):
206
+ pass
208
207
 
209
- add_function_test(TestCopy, "test_copy_strided", test_copy_strided, devices=devices)
210
- add_function_test(TestCopy, "test_copy_indexed", test_copy_indexed, devices=devices)
211
208
 
212
- return TestCopy
209
+ add_function_test(TestCopy, "test_copy_strided", test_copy_strided, devices=devices)
210
+ add_function_test(TestCopy, "test_copy_indexed", test_copy_indexed, devices=devices)
213
211
 
214
212
 
215
213
  if __name__ == "__main__":
216
- c = register(unittest.TestCase)
214
+ wp.build.clear_kernel_cache()
217
215
  unittest.main(verbosity=2)
warp/tests/test_ctypes.py CHANGED
@@ -5,14 +5,12 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
- # include parent path
8
+ import unittest
9
+
9
10
  import numpy as np
10
- import math
11
11
 
12
12
  import warp as wp
13
- from warp.tests.test_base import *
14
-
15
- import unittest
13
+ from warp.tests.unittest_utils import *
16
14
 
17
15
  wp.init()
18
16
 
@@ -24,11 +22,11 @@ def add_vec2(dest: wp.array(dtype=wp.vec2), c: wp.vec2):
24
22
 
25
23
 
26
24
  @wp.kernel
27
- def transform_vec2(dest: wp.array(dtype=wp.vec2), m: wp.mat22, v: wp.vec2):
25
+ def transform_vec2(dest_right: wp.array(dtype=wp.vec2), dest_left: wp.array(dtype=wp.vec2), m: wp.mat22, v: wp.vec2):
28
26
  tid = wp.tid()
29
27
 
30
- p = wp.mul(m, v)
31
- dest[tid] = p
28
+ dest_right[tid] = wp.mul(m, v)
29
+ dest_left[tid] = wp.mul(v, m)
32
30
 
33
31
 
34
32
  @wp.kernel
@@ -38,11 +36,11 @@ def add_vec3(dest: wp.array(dtype=wp.vec3), c: wp.vec3):
38
36
 
39
37
 
40
38
  @wp.kernel
41
- def transform_vec3(dest: wp.array(dtype=wp.vec3), m: wp.mat33, v: wp.vec3):
39
+ def transform_vec3(dest_right: wp.array(dtype=wp.vec3), dest_left: wp.array(dtype=wp.vec3), m: wp.mat33, v: wp.vec3):
42
40
  tid = wp.tid()
43
41
 
44
- p = wp.mul(m, v)
45
- dest[tid] = p
42
+ dest_right[tid] = wp.mul(m, v)
43
+ dest_left[tid] = wp.mul(v, m)
46
44
 
47
45
 
48
46
  @wp.kernel
@@ -63,12 +61,14 @@ def test_vec2_arg(test, device, n):
63
61
 
64
62
 
65
63
  def test_vec2_transform(test, device, n):
66
- dest = wp.zeros(n=n, dtype=wp.vec2, device=device)
64
+ dest_right = wp.zeros(n=n, dtype=wp.vec2, device=device)
65
+ dest_left = wp.zeros(n=n, dtype=wp.vec2, device=device)
67
66
  c = np.array((1.0, 2.0))
68
67
  m = np.array(((3.0, -1.0), (2.5, 4.0)))
69
68
 
70
- wp.launch(transform_vec2, dim=n, inputs=[dest, m, c], device=device)
71
- test.assertTrue(np.array_equal(dest.numpy(), np.tile(m @ c, (n, 1))))
69
+ wp.launch(transform_vec2, dim=n, inputs=[dest_right, dest_left, m, c], device=device)
70
+ test.assertTrue(np.array_equal(dest_right.numpy(), np.tile(m @ c, (n, 1))))
71
+ test.assertTrue(np.array_equal(dest_left.numpy(), np.tile(c @ m, (n, 1))))
72
72
 
73
73
 
74
74
  def test_vec3_arg(test, device, n):
@@ -80,25 +80,45 @@ def test_vec3_arg(test, device, n):
80
80
 
81
81
 
82
82
  def test_vec3_transform(test, device, n):
83
- dest = wp.zeros(n=n, dtype=wp.vec3, device=device)
83
+ dest_right = wp.zeros(n=n, dtype=wp.vec3, device=device)
84
+ dest_left = wp.zeros(n=n, dtype=wp.vec3, device=device)
84
85
  c = np.array((1.0, 2.0, 3.0))
85
86
  m = np.array(((1.0, 2.0, 3.0), (4.0, 5.0, 6.0), (7.0, 8.0, 9.0)))
86
87
 
87
- wp.launch(transform_vec3, dim=n, inputs=[dest, m, c], device=device)
88
- test.assertTrue(np.array_equal(dest.numpy(), np.tile(m @ c, (n, 1))))
88
+ wp.launch(transform_vec3, dim=n, inputs=[dest_right, dest_left, m, c], device=device)
89
+ test.assertTrue(np.array_equal(dest_right.numpy(), np.tile(m @ c, (n, 1))))
90
+ test.assertTrue(np.array_equal(dest_left.numpy(), np.tile(c @ m, (n, 1))))
89
91
 
90
92
 
91
93
  def test_transform_multiply(test, device, n):
92
- a = wp.transform((0.0, 1.0, 0.0), wp.utils.quat_identity())
94
+ a = wp.transform((0.0, 1.0, 0.0), wp.quat_identity())
93
95
 
94
96
  x = []
95
97
  for i in range(10):
96
- x.append(wp.utils.transform_identity())
98
+ x.append(wp.transform_identity())
97
99
 
98
100
  xforms = wp.array(x, dtype=wp.transform, device=device)
99
101
  wp.launch(transform_multiply, dim=n, inputs=[xforms, a], device=device)
100
102
 
101
103
 
104
+ transformf = wp.types.transformation(dtype=wp.float32)
105
+
106
+
107
+ @wp.kernel
108
+ def test_transformation_constructor():
109
+ a = wp.transformation(wp.vec3(0.0), wp.quat_identity())
110
+ b = transformf(wp.vec3(0.0), wp.quat_identity())
111
+ c = wp.transform_identity(dtype=wp.float64)
112
+
113
+
114
+ spatial_vector = wp.types.vector(length=6, dtype=wp.float32)
115
+
116
+
117
+ @wp.kernel
118
+ def test_spatial_vector_constructor():
119
+ a = wp.spatial_vector(wp.vec3(0.0), wp.vec3(0.0))
120
+
121
+
102
122
  # construct kernel + test harness for given matrix / vector types
103
123
  def make_matrix_test(dim, matrix, vector):
104
124
  def test_matrix_kernel(
@@ -126,8 +146,7 @@ def make_matrix_test(dim, matrix, vector):
126
146
  # register a custom kernel (no decorator) function
127
147
  # this lets us register the same function definition
128
148
  # against multiple symbols, with different arg types
129
- module = wp.get_module(test_matrix_kernel.__module__)
130
- kernel = wp.Kernel(func=test_matrix_kernel, key=f"test_mat{dim}{dim}_kernel", module=module)
149
+ kernel = wp.Kernel(func=test_matrix_kernel, key=f"test_mat{dim}{dim}_kernel")
131
150
 
132
151
  def test_matrix(test, device):
133
152
  rng = np.random.default_rng(42)
@@ -535,74 +554,79 @@ def test_transform_matrix():
535
554
  wp.expect_near(r_2, r_0 - t, 1.0e-4)
536
555
 
537
556
 
538
- def register(parent):
539
- devices = get_test_devices()
540
-
541
- class TestCTypes(parent):
542
- pass
543
-
544
- inputs = [
545
- wp.vec2(1.0, 2.0),
546
- wp.vec3(1.0, 2.0, 3.0),
547
- wp.vec4(1.0, 2.0, 3.0, 4.0),
548
- wp.mat22(1.0, 2.0, 3.0, 4.0),
549
- wp.mat33(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0),
550
- wp.mat44(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0),
551
- ]
552
-
553
- add_function_test(TestCTypes, "test_mat22", test_mat22, devices=devices)
554
- add_function_test(TestCTypes, "test_mat33", test_mat33, devices=devices)
555
- add_function_test(TestCTypes, "test_mat44", test_mat44, devices=devices)
556
- add_kernel_test(
557
- TestCTypes,
558
- name="test_scalar_arg_types",
559
- kernel=test_scalar_arg_types,
560
- dim=1,
561
- inputs=[-64, 255, -64, 255, -64, 255, -64, 255, 3.14159, 3.14159],
562
- devices=devices,
563
- )
564
- add_kernel_test(
565
- TestCTypes,
566
- name="test_scalar_arg_types_explicit",
567
- kernel=test_scalar_arg_types,
568
- dim=1,
569
- inputs=[
570
- wp.int8(-64),
571
- wp.uint8(255),
572
- wp.int16(-64),
573
- wp.uint16(255),
574
- wp.int32(-64),
575
- wp.uint32(255),
576
- wp.int64(-64),
577
- wp.uint64(255),
578
- wp.float32(3.14159),
579
- wp.float64(3.14159),
580
- ],
581
- devices=devices,
582
- )
583
- add_kernel_test(
584
- TestCTypes, name="test_vector_arg_types", kernel=test_vector_arg_types, dim=1, inputs=inputs, devices=devices
585
- )
586
- add_kernel_test(TestCTypes, name="test_type_convesrions", kernel=test_type_conversions, dim=1, devices=devices)
587
-
588
- add_function_test(
589
- TestCTypes, "test_scalar_array_load", test_scalar_array_types, devices=devices, load=True, store=False
590
- )
591
- add_function_test(
592
- TestCTypes, "test_scalar_array_store", test_scalar_array_types, devices=devices, load=False, store=True
593
- )
594
- add_function_test(TestCTypes, "test_vec2_arg", test_vec2_arg, devices=devices, n=8)
595
- add_function_test(TestCTypes, "test_vec2_transform", test_vec2_transform, devices=devices, n=8)
596
- add_function_test(TestCTypes, "test_vec3_arg", test_vec3_arg, devices=devices, n=8)
597
- add_function_test(TestCTypes, "test_vec3_transform", test_vec3_transform, devices=devices, n=8)
598
- add_function_test(TestCTypes, "test_transform_multiply", test_transform_multiply, devices=devices, n=8)
599
- add_kernel_test(TestCTypes, name="test_transform_matrix", kernel=test_transform_matrix, dim=1, devices=devices)
600
- add_function_test(TestCTypes, "test_scalar_array", test_scalar_array, devices=devices)
601
- add_function_test(TestCTypes, "test_vector_array", test_vector_array, devices=devices)
602
-
603
- return TestCTypes
557
+ devices = get_test_devices()
558
+
559
+
560
+ class TestCTypes(unittest.TestCase):
561
+ pass
562
+
563
+
564
+ inputs = [
565
+ wp.vec2(1.0, 2.0),
566
+ wp.vec3(1.0, 2.0, 3.0),
567
+ wp.vec4(1.0, 2.0, 3.0, 4.0),
568
+ wp.mat22(1.0, 2.0, 3.0, 4.0),
569
+ wp.mat33(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0),
570
+ wp.mat44(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0),
571
+ ]
572
+
573
+ add_function_test(TestCTypes, "test_mat22", test_mat22, devices=devices)
574
+ add_function_test(TestCTypes, "test_mat33", test_mat33, devices=devices)
575
+ add_function_test(TestCTypes, "test_mat44", test_mat44, devices=devices)
576
+ add_kernel_test(
577
+ TestCTypes, name="test_transformation_constructor", kernel=test_transformation_constructor, dim=1, devices=devices
578
+ )
579
+ add_kernel_test(
580
+ TestCTypes, name="test_spatial_vector_constructor", kernel=test_spatial_vector_constructor, dim=1, devices=devices
581
+ )
582
+ add_kernel_test(
583
+ TestCTypes,
584
+ name="test_scalar_arg_types",
585
+ kernel=test_scalar_arg_types,
586
+ dim=1,
587
+ inputs=[-64, 255, -64, 255, -64, 255, -64, 255, 3.14159, 3.14159],
588
+ devices=devices,
589
+ )
590
+ add_kernel_test(
591
+ TestCTypes,
592
+ name="test_scalar_arg_types_explicit",
593
+ kernel=test_scalar_arg_types,
594
+ dim=1,
595
+ inputs=[
596
+ wp.int8(-64),
597
+ wp.uint8(255),
598
+ wp.int16(-64),
599
+ wp.uint16(255),
600
+ wp.int32(-64),
601
+ wp.uint32(255),
602
+ wp.int64(-64),
603
+ wp.uint64(255),
604
+ wp.float32(3.14159),
605
+ wp.float64(3.14159),
606
+ ],
607
+ devices=devices,
608
+ )
609
+ add_kernel_test(
610
+ TestCTypes, name="test_vector_arg_types", kernel=test_vector_arg_types, dim=1, inputs=inputs, devices=devices
611
+ )
612
+ add_kernel_test(TestCTypes, name="test_type_convesrions", kernel=test_type_conversions, dim=1, devices=devices)
613
+
614
+ add_function_test(
615
+ TestCTypes, "test_scalar_array_load", test_scalar_array_types, devices=devices, load=True, store=False
616
+ )
617
+ add_function_test(
618
+ TestCTypes, "test_scalar_array_store", test_scalar_array_types, devices=devices, load=False, store=True
619
+ )
620
+ add_function_test(TestCTypes, "test_vec2_arg", test_vec2_arg, devices=devices, n=8)
621
+ add_function_test(TestCTypes, "test_vec2_transform", test_vec2_transform, devices=devices, n=8)
622
+ add_function_test(TestCTypes, "test_vec3_arg", test_vec3_arg, devices=devices, n=8)
623
+ add_function_test(TestCTypes, "test_vec3_transform", test_vec3_transform, devices=devices, n=8)
624
+ add_function_test(TestCTypes, "test_transform_multiply", test_transform_multiply, devices=devices, n=8)
625
+ add_kernel_test(TestCTypes, name="test_transform_matrix", kernel=test_transform_matrix, dim=1, devices=devices)
626
+ add_function_test(TestCTypes, "test_scalar_array", test_scalar_array, devices=devices)
627
+ add_function_test(TestCTypes, "test_vector_array", test_vector_array, devices=devices)
604
628
 
605
629
 
606
630
  if __name__ == "__main__":
607
- c = register(unittest.TestCase)
631
+ wp.build.clear_kernel_cache()
608
632
  unittest.main(verbosity=2)
warp/tests/test_dense.py CHANGED
@@ -1,11 +1,15 @@
1
- import numpy as np
2
- import math
3
-
4
- import warp as wp
5
- from warp.tests.test_base import *
1
+ # Copyright (c) 2022 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.
6
7
 
7
8
  import unittest
8
9
 
10
+ import warp as wp
11
+ from warp.tests.unittest_utils import *
12
+
9
13
  wp.init()
10
14
 
11
15
 
@@ -42,19 +46,22 @@ def eval_dense_solve(
42
46
  wp.dense_solve(n, A, L, b, x)
43
47
 
44
48
 
45
- def register(parent):
46
- devices = get_test_devices()
47
-
48
- class TestDense(parent):
49
- pass
50
-
49
+ def test_dense_compilation(test, device):
51
50
  # just testing compilation of the dense matrix routines
52
51
  # most are deprecated / WIP
53
- wp.force_load()
52
+ wp.load_module(device=device)
53
+
54
+
55
+ devices = get_test_devices()
56
+
57
+
58
+ class TestDense(unittest.TestCase):
59
+ pass
60
+
54
61
 
55
- return TestDense
62
+ add_function_test(TestDense, "test_dense_compilation", test_dense_compilation, devices=devices)
56
63
 
57
64
 
58
65
  if __name__ == "__main__":
59
- c = register(unittest.TestCase)
66
+ wp.build.clear_kernel_cache()
60
67
  unittest.main(verbosity=2)
@@ -0,0 +1,98 @@
1
+ # Copyright (c) 2023 NVIDIA CORPORATION. All rights reserved.
2
+ # NVIDIA CORPORATION and its licensors retain all intellectual property
3
+ # and proprietary rights in and to this software, related documentation
4
+ # and any modifications thereto. Any use, reproduction, disclosure or
5
+ # distribution of this software and related documentation without an express
6
+ # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
+
8
+ import unittest
9
+
10
+ import warp as wp
11
+ from warp.tests.unittest_utils import *
12
+
13
+ wp.init()
14
+
15
+
16
+ def test_devices_get_cuda_device_functions(test, device):
17
+ test.assertTrue(device.is_cuda)
18
+ test.assertTrue(wp.is_device_available(device))
19
+
20
+ device_ordinal = device.ordinal
21
+ current_device = wp.get_cuda_device(device_ordinal)
22
+ test.assertEqual(current_device, device)
23
+ current_device = wp.get_cuda_device() # No-ordinal version
24
+ test.assertTrue(wp.is_device_available(current_device))
25
+
26
+ if device == current_device:
27
+ test.assertEqual(device, "cuda")
28
+ else:
29
+ test.assertNotEqual(device, "cuda")
30
+
31
+ preferred_device = wp.get_preferred_device()
32
+ test.assertTrue(wp.is_device_available(preferred_device))
33
+
34
+
35
+ def test_devices_map_cuda_device(test, device):
36
+ with wp.ScopedDevice(device):
37
+ saved_alias = device.alias
38
+ # Map alias twice to check code path
39
+ wp.map_cuda_device("new_alias")
40
+ wp.map_cuda_device("new_alias")
41
+ wp.context.runtime.rename_device(device, saved_alias)
42
+
43
+
44
+ def test_devices_unmap_imaginary_device(test, device):
45
+ with test.assertRaises(RuntimeError):
46
+ wp.unmap_cuda_device("imaginary_device:0")
47
+
48
+
49
+ def test_devices_verify_cuda_device(test, device):
50
+ verify_cuda_saved = wp.config.verify_cuda
51
+
52
+ wp.config.verify_cuda = True
53
+
54
+ wp.context.runtime.verify_cuda_device(device)
55
+
56
+ wp.config.verify_cuda = verify_cuda_saved
57
+
58
+
59
+ @unittest.skipUnless(wp.is_cuda_available(), "Requires CUDA")
60
+ def test_devices_can_access_self(test, device):
61
+ test.assertTrue(device.can_access(device))
62
+
63
+ for warp_device in wp.get_devices():
64
+ device_str = str(warp_device)
65
+
66
+ if (device.is_cpu and warp_device.is_cuda) or (device.is_cuda and warp_device.is_cpu):
67
+ test.assertFalse(device.can_access(warp_device))
68
+ test.assertNotEqual(device, warp_device)
69
+ test.assertNotEqual(device, device_str)
70
+
71
+
72
+ devices = get_test_devices()
73
+
74
+
75
+ class TestDevices(unittest.TestCase):
76
+ pass
77
+
78
+
79
+ add_function_test(
80
+ TestDevices,
81
+ "test_devices_get_cuda_device_functions",
82
+ test_devices_get_cuda_device_functions,
83
+ devices=get_unique_cuda_test_devices(),
84
+ )
85
+ add_function_test(
86
+ TestDevices, "test_devices_map_cuda_device", test_devices_map_cuda_device, devices=get_unique_cuda_test_devices()
87
+ )
88
+ add_function_test(
89
+ TestDevices, "test_devices_unmap_imaginary_device", test_devices_unmap_imaginary_device, devices=devices
90
+ )
91
+ add_function_test(TestDevices, "test_devices_verify_cuda_device", test_devices_verify_cuda_device, devices=devices)
92
+
93
+ add_function_test(TestDevices, "test_devices_can_access_self", test_devices_can_access_self, devices=devices)
94
+
95
+
96
+ if __name__ == "__main__":
97
+ wp.build.clear_kernel_cache()
98
+ unittest.main(verbosity=2)