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
@@ -1,8 +1,17 @@
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
+
1
10
  import numpy as np
2
- import warp as wp
3
11
 
4
- from warp.utils import array_sum, array_inner
5
- from warp.tests.test_base import *
12
+ import warp as wp
13
+ from warp.tests.unittest_utils import *
14
+ from warp.utils import array_inner, array_sum
6
15
 
7
16
  wp.init()
8
17
 
@@ -11,9 +20,11 @@ def make_test_array_sum(dtype):
11
20
  N = 1000
12
21
 
13
22
  def test_array_sum(test, device):
23
+ rng = np.random.default_rng(123)
24
+
14
25
  cols = wp.types.type_length(dtype)
15
26
 
16
- values_np = np.random.rand(N, cols)
27
+ values_np = rng.random(size=(N, cols))
17
28
  values = wp.array(values_np, device=device, dtype=dtype)
18
29
 
19
30
  vsum = array_sum(values)
@@ -32,7 +43,9 @@ def make_test_array_sum_axis(dtype):
32
43
  N = I * J * K
33
44
 
34
45
  def test_array_sum(test, device):
35
- values_np = np.random.rand(I, J, K)
46
+ rng = np.random.default_rng(123)
47
+
48
+ values_np = rng.random(size=(I, J, K))
36
49
  values = wp.array(values_np, shape=(I, J, K), device=device, dtype=dtype)
37
50
 
38
51
  for axis in range(3):
@@ -44,14 +57,24 @@ def make_test_array_sum_axis(dtype):
44
57
  return test_array_sum
45
58
 
46
59
 
60
+ def test_array_sum_empty(test, device):
61
+ values = wp.array([], device=device, dtype=wp.vec2)
62
+ assert_np_equal(array_sum(values), np.zeros(2))
63
+
64
+ values = wp.array([], shape=(0, 3), device=device, dtype=float)
65
+ assert_np_equal(array_sum(values, axis=0).numpy(), np.zeros(3))
66
+
67
+
47
68
  def make_test_array_inner(dtype):
48
69
  N = 1000
49
70
 
50
71
  def test_array_inner(test, device):
72
+ rng = np.random.default_rng(123)
73
+
51
74
  cols = wp.types.type_length(dtype)
52
75
 
53
- a_np = np.random.rand(N, cols)
54
- b_np = np.random.rand(N, cols)
76
+ a_np = rng.random(size=(N, cols))
77
+ b_np = rng.random(size=(N, cols))
55
78
 
56
79
  a = wp.array(a_np, device=device, dtype=dtype)
57
80
  b = wp.array(b_np, device=device, dtype=dtype)
@@ -72,8 +95,10 @@ def make_test_array_inner_axis(dtype):
72
95
  N = I * J * K
73
96
 
74
97
  def test_array_inner(test, device):
75
- a_np = np.random.rand(I, J, K)
76
- b_np = np.random.rand(I, J, K)
98
+ rng = np.random.default_rng(123)
99
+
100
+ a_np = rng.random(size=(I, J, K))
101
+ b_np = rng.random(size=(I, J, K))
77
102
 
78
103
  a = wp.array(a_np, shape=(I, J, K), device=device, dtype=dtype)
79
104
  b = wp.array(b_np, shape=(I, J, K), device=device, dtype=dtype)
@@ -93,24 +118,33 @@ def make_test_array_inner_axis(dtype):
93
118
  return test_array_inner
94
119
 
95
120
 
96
- def register(parent):
97
- devices = get_test_devices()
121
+ def test_array_inner_empty(test, device):
122
+ values = wp.array([], device=device, dtype=wp.vec2)
123
+ test.assertEqual(array_inner(values, values), 0.0)
124
+
125
+ values = wp.array([], shape=(0, 3), device=device, dtype=float)
126
+ assert_np_equal(array_inner(values, values, axis=0).numpy(), np.zeros(3))
127
+
128
+
129
+ devices = get_test_devices()
130
+
98
131
 
99
- class TestArraySym(parent):
100
- pass
132
+ class TestArrayReduce(unittest.TestCase):
133
+ pass
101
134
 
102
- add_function_test(TestArraySym, "test_array_sum_double", make_test_array_sum(wp.float64), devices=devices)
103
- add_function_test(TestArraySym, "test_array_sum_vec3", make_test_array_sum(wp.vec3), devices=devices)
104
- add_function_test(TestArraySym, "test_array_sum_axis_float", make_test_array_sum_axis(wp.float32), devices=devices)
105
- add_function_test(TestArraySym, "test_array_inner_double", make_test_array_inner(wp.float64), devices=devices)
106
- add_function_test(TestArraySym, "test_array_inner_vec3", make_test_array_inner(wp.vec3), devices=devices)
107
- add_function_test(
108
- TestArraySym, "test_array_inner_axis_float", make_test_array_inner_axis(wp.float32), devices=devices
109
- )
110
135
 
111
- return TestArraySym
136
+ add_function_test(TestArrayReduce, "test_array_sum_double", make_test_array_sum(wp.float64), devices=devices)
137
+ add_function_test(TestArrayReduce, "test_array_sum_vec3", make_test_array_sum(wp.vec3), devices=devices)
138
+ add_function_test(TestArrayReduce, "test_array_sum_axis_float", make_test_array_sum_axis(wp.float32), devices=devices)
139
+ add_function_test(TestArrayReduce, "test_array_sum_empty", test_array_sum_empty, devices=devices)
140
+ add_function_test(TestArrayReduce, "test_array_inner_double", make_test_array_inner(wp.float64), devices=devices)
141
+ add_function_test(TestArrayReduce, "test_array_inner_vec3", make_test_array_inner(wp.vec3), devices=devices)
142
+ add_function_test(
143
+ TestArrayReduce, "test_array_inner_axis_float", make_test_array_inner_axis(wp.float32), devices=devices
144
+ )
145
+ add_function_test(TestArrayReduce, "test_array_inner_empty", test_array_inner_empty, devices=devices)
112
146
 
113
147
 
114
148
  if __name__ == "__main__":
115
- c = register(unittest.TestCase)
149
+ wp.build.clear_kernel_cache()
116
150
  unittest.main(verbosity=2)
warp/tests/test_atomic.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
 
@@ -34,8 +32,7 @@ def make_atomic_test(type):
34
32
  # register a custom kernel (no decorator) function
35
33
  # this lets us register the same function definition
36
34
  # against multiple symbols, with different arg types
37
- module = wp.get_module(test_atomic_kernel.__module__)
38
- kernel = wp.Kernel(func=test_atomic_kernel, key=f"test_atomic_{type.__name__}_kernel", module=module)
35
+ kernel = wp.Kernel(func=test_atomic_kernel, key=f"test_atomic_{type.__name__}_kernel")
39
36
 
40
37
  def test_atomic(test, device):
41
38
  n = 1024
@@ -54,20 +51,60 @@ def make_atomic_test(type):
54
51
  base = rng.random(size=(1, *type._shape_), dtype=float)
55
52
  val = rng.random(size=(n, *type._shape_), dtype=float)
56
53
 
57
- add_array = wp.array(base, dtype=type, device=device)
58
- min_array = wp.array(base, dtype=type, device=device)
59
- max_array = wp.array(base, dtype=type, device=device)
54
+ add_array = wp.array(base, dtype=type, device=device, requires_grad=True)
55
+ min_array = wp.array(base, dtype=type, device=device, requires_grad=True)
56
+ max_array = wp.array(base, dtype=type, device=device, requires_grad=True)
57
+ add_array.zero_()
58
+ min_array.fill_(10000)
59
+ max_array.fill_(-10000)
60
60
 
61
- val_array = wp.array(val, dtype=type, device=device)
61
+ val_array = wp.array(val, dtype=type, device=device, requires_grad=True)
62
62
 
63
- wp.launch(kernel, n, inputs=[add_array, min_array, max_array, val_array], device=device)
64
-
65
- val = np.append(val, [base[0]], axis=0)
63
+ tape = wp.Tape()
64
+ with tape:
65
+ wp.launch(kernel, n, inputs=[add_array, min_array, max_array, val_array], device=device)
66
66
 
67
67
  assert_np_equal(add_array.numpy(), np.sum(val, axis=0), tol=1.0e-2)
68
68
  assert_np_equal(min_array.numpy(), np.min(val, axis=0), tol=1.0e-2)
69
69
  assert_np_equal(max_array.numpy(), np.max(val, axis=0), tol=1.0e-2)
70
70
 
71
+ if type != wp.int32:
72
+ add_array.grad.fill_(1)
73
+ tape.backward()
74
+ assert_np_equal(val_array.grad.numpy(), np.ones_like(val))
75
+ tape.zero()
76
+
77
+ min_array.grad.fill_(1)
78
+ tape.backward()
79
+ min_grad_array = np.zeros_like(val)
80
+ argmin = val.argmin(axis=0)
81
+ if val.ndim == 1:
82
+ min_grad_array[argmin] = 1
83
+ elif val.ndim == 2:
84
+ for i in range(val.shape[1]):
85
+ min_grad_array[argmin[i], i] = 1
86
+ elif val.ndim == 3:
87
+ for i in range(val.shape[1]):
88
+ for j in range(val.shape[2]):
89
+ min_grad_array[argmin[i, j], i, j] = 1
90
+ assert_np_equal(val_array.grad.numpy(), min_grad_array)
91
+ tape.zero()
92
+
93
+ max_array.grad.fill_(1)
94
+ tape.backward()
95
+ max_grad_array = np.zeros_like(val)
96
+ argmax = val.argmax(axis=0)
97
+ if val.ndim == 1:
98
+ max_grad_array[argmax] = 1
99
+ elif val.ndim == 2:
100
+ for i in range(val.shape[1]):
101
+ max_grad_array[argmax[i], i] = 1
102
+ elif val.ndim == 3:
103
+ for i in range(val.shape[1]):
104
+ for j in range(val.shape[2]):
105
+ max_grad_array[argmax[i, j], i, j] = 1
106
+ assert_np_equal(val_array.grad.numpy(), max_grad_array)
107
+
71
108
  return test_atomic
72
109
 
73
110
 
@@ -82,24 +119,23 @@ test_atomic_mat33 = make_atomic_test(wp.mat33)
82
119
  test_atomic_mat44 = make_atomic_test(wp.mat44)
83
120
 
84
121
 
85
- def register(parent):
86
- devices = get_test_devices()
122
+ devices = get_test_devices()
123
+
87
124
 
88
- class TestAtomic(parent):
89
- pass
125
+ class TestAtomic(unittest.TestCase):
126
+ pass
90
127
 
91
- add_function_test(TestAtomic, "test_atomic_int", test_atomic_int, devices=devices)
92
- add_function_test(TestAtomic, "test_atomic_float", test_atomic_float, devices=devices)
93
- add_function_test(TestAtomic, "test_atomic_vec2", test_atomic_vec2, devices=devices)
94
- add_function_test(TestAtomic, "test_atomic_vec3", test_atomic_vec3, devices=devices)
95
- add_function_test(TestAtomic, "test_atomic_vec4", test_atomic_vec4, devices=devices)
96
- add_function_test(TestAtomic, "test_atomic_mat22", test_atomic_mat22, devices=devices)
97
- add_function_test(TestAtomic, "test_atomic_mat33", test_atomic_mat33, devices=devices)
98
- add_function_test(TestAtomic, "test_atomic_mat44", test_atomic_mat44, devices=devices)
99
128
 
100
- return TestAtomic
129
+ add_function_test(TestAtomic, "test_atomic_int", test_atomic_int, devices=devices)
130
+ add_function_test(TestAtomic, "test_atomic_float", test_atomic_float, devices=devices)
131
+ add_function_test(TestAtomic, "test_atomic_vec2", test_atomic_vec2, devices=devices)
132
+ add_function_test(TestAtomic, "test_atomic_vec3", test_atomic_vec3, devices=devices)
133
+ add_function_test(TestAtomic, "test_atomic_vec4", test_atomic_vec4, devices=devices)
134
+ add_function_test(TestAtomic, "test_atomic_mat22", test_atomic_mat22, devices=devices)
135
+ add_function_test(TestAtomic, "test_atomic_mat33", test_atomic_mat33, devices=devices)
136
+ add_function_test(TestAtomic, "test_atomic_mat44", test_atomic_mat44, devices=devices)
101
137
 
102
138
 
103
139
  if __name__ == "__main__":
104
- c = register(unittest.TestCase)
140
+ wp.build.clear_kernel_cache()
105
141
  unittest.main(verbosity=2)
warp/tests/test_bool.py CHANGED
@@ -1,7 +1,16 @@
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
+
1
10
  import numpy as np
2
11
 
3
12
  import warp as wp
4
- from warp.tests.test_base import *
13
+ from warp.tests.unittest_utils import *
5
14
 
6
15
  wp.init()
7
16
 
@@ -45,9 +54,11 @@ def identity_test(data: wp.array(dtype=wp.bool)):
45
54
 
46
55
 
47
56
  def test_bool_identity_ops(test, device):
57
+ rng = np.random.default_rng(123)
58
+
48
59
  dim_x = 10
49
60
 
50
- rand_np = np.random.rand(dim_x) > 0.5
61
+ rand_np = rng.random(dim_x) > 0.5
51
62
 
52
63
  data_array = wp.array(data=rand_np, device=device)
53
64
 
@@ -67,23 +78,22 @@ def check_compile_constant(result: wp.array(dtype=wp.bool)):
67
78
 
68
79
 
69
80
  def test_bool_constant(test, device):
70
- compile_constant_value = wp.zeros(1, dtype=wp.bool)
71
- wp.launch(check_compile_constant, 1, inputs=[compile_constant_value])
81
+ compile_constant_value = wp.zeros(1, dtype=wp.bool, device=device)
82
+ wp.launch(check_compile_constant, 1, inputs=[compile_constant_value], device=device)
72
83
  test.assertTrue(compile_constant_value.numpy()[0])
73
84
 
74
85
 
75
- def register(parent):
76
- devices = get_test_devices()
86
+ devices = get_test_devices()
87
+
77
88
 
78
- class TestBool(parent):
79
- pass
89
+ class TestBool(unittest.TestCase):
90
+ pass
80
91
 
81
- add_function_test(TestBool, "test_bool_identity_ops", test_bool_identity_ops, devices=devices)
82
- add_function_test(TestBool, "test_bool_constant", test_bool_constant, devices=devices)
83
92
 
84
- return TestBool
93
+ add_function_test(TestBool, "test_bool_identity_ops", test_bool_identity_ops, devices=devices)
94
+ add_function_test(TestBool, "test_bool_constant", test_bool_constant, devices=devices)
85
95
 
86
96
 
87
97
  if __name__ == "__main__":
88
- c = register(unittest.TestCase)
98
+ wp.build.clear_kernel_cache()
89
99
  unittest.main(verbosity=2)