warp-lang 1.1.0__py3-none-win_amd64.whl → 1.2.0__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 (218) hide show
  1. warp/bin/warp-clang.dll +0 -0
  2. warp/bin/warp.dll +0 -0
  3. warp/build.py +10 -37
  4. warp/build_dll.py +2 -2
  5. warp/builtins.py +274 -6
  6. warp/codegen.py +51 -4
  7. warp/config.py +2 -2
  8. warp/constants.py +4 -0
  9. warp/context.py +418 -203
  10. warp/examples/benchmarks/benchmark_api.py +0 -2
  11. warp/examples/benchmarks/benchmark_cloth_warp.py +0 -1
  12. warp/examples/benchmarks/benchmark_launches.py +0 -2
  13. warp/examples/core/example_dem.py +0 -2
  14. warp/examples/core/example_fluid.py +0 -2
  15. warp/examples/core/example_graph_capture.py +0 -2
  16. warp/examples/core/example_marching_cubes.py +0 -2
  17. warp/examples/core/example_mesh.py +0 -2
  18. warp/examples/core/example_mesh_intersect.py +0 -2
  19. warp/examples/core/example_nvdb.py +0 -2
  20. warp/examples/core/example_raycast.py +0 -2
  21. warp/examples/core/example_raymarch.py +0 -2
  22. warp/examples/core/example_render_opengl.py +0 -2
  23. warp/examples/core/example_sph.py +0 -2
  24. warp/examples/core/example_torch.py +0 -3
  25. warp/examples/core/example_wave.py +0 -2
  26. warp/examples/fem/example_apic_fluid.py +140 -115
  27. warp/examples/fem/example_burgers.py +262 -0
  28. warp/examples/fem/example_convection_diffusion.py +0 -2
  29. warp/examples/fem/example_convection_diffusion_dg.py +0 -2
  30. warp/examples/fem/example_deformed_geometry.py +0 -2
  31. warp/examples/fem/example_diffusion.py +0 -2
  32. warp/examples/fem/example_diffusion_3d.py +5 -4
  33. warp/examples/fem/example_diffusion_mgpu.py +0 -2
  34. warp/examples/fem/example_mixed_elasticity.py +0 -2
  35. warp/examples/fem/example_navier_stokes.py +0 -2
  36. warp/examples/fem/example_stokes.py +0 -2
  37. warp/examples/fem/example_stokes_transfer.py +0 -2
  38. warp/examples/optim/example_bounce.py +0 -2
  39. warp/examples/optim/example_cloth_throw.py +0 -2
  40. warp/examples/optim/example_diffray.py +0 -2
  41. warp/examples/optim/example_drone.py +0 -2
  42. warp/examples/optim/example_inverse_kinematics.py +0 -2
  43. warp/examples/optim/example_inverse_kinematics_torch.py +0 -2
  44. warp/examples/optim/example_spring_cage.py +0 -2
  45. warp/examples/optim/example_trajectory.py +0 -2
  46. warp/examples/optim/example_walker.py +0 -2
  47. warp/examples/sim/example_cartpole.py +0 -2
  48. warp/examples/sim/example_cloth.py +0 -2
  49. warp/examples/sim/example_granular.py +0 -2
  50. warp/examples/sim/example_granular_collision_sdf.py +0 -2
  51. warp/examples/sim/example_jacobian_ik.py +0 -2
  52. warp/examples/sim/example_particle_chain.py +0 -2
  53. warp/examples/sim/example_quadruped.py +0 -2
  54. warp/examples/sim/example_rigid_chain.py +0 -2
  55. warp/examples/sim/example_rigid_contact.py +0 -2
  56. warp/examples/sim/example_rigid_force.py +0 -2
  57. warp/examples/sim/example_rigid_gyroscopic.py +0 -2
  58. warp/examples/sim/example_rigid_soft_contact.py +0 -2
  59. warp/examples/sim/example_soft_body.py +0 -2
  60. warp/fem/__init__.py +1 -0
  61. warp/fem/cache.py +3 -1
  62. warp/fem/geometry/__init__.py +1 -0
  63. warp/fem/geometry/element.py +4 -0
  64. warp/fem/geometry/grid_3d.py +0 -4
  65. warp/fem/geometry/nanogrid.py +455 -0
  66. warp/fem/integrate.py +63 -9
  67. warp/fem/space/__init__.py +43 -158
  68. warp/fem/space/basis_space.py +34 -0
  69. warp/fem/space/collocated_function_space.py +1 -1
  70. warp/fem/space/grid_2d_function_space.py +13 -132
  71. warp/fem/space/grid_3d_function_space.py +16 -154
  72. warp/fem/space/hexmesh_function_space.py +37 -134
  73. warp/fem/space/nanogrid_function_space.py +202 -0
  74. warp/fem/space/quadmesh_2d_function_space.py +12 -119
  75. warp/fem/space/restriction.py +4 -1
  76. warp/fem/space/shape/__init__.py +77 -0
  77. warp/fem/space/shape/cube_shape_function.py +5 -15
  78. warp/fem/space/tetmesh_function_space.py +6 -76
  79. warp/fem/space/trimesh_2d_function_space.py +6 -76
  80. warp/native/array.h +12 -3
  81. warp/native/builtin.h +48 -5
  82. warp/native/bvh.cpp +14 -10
  83. warp/native/bvh.cu +23 -15
  84. warp/native/bvh.h +1 -0
  85. warp/native/clang/clang.cpp +2 -1
  86. warp/native/crt.cpp +11 -1
  87. warp/native/crt.h +18 -1
  88. warp/native/exports.h +187 -0
  89. warp/native/mat.h +47 -0
  90. warp/native/mesh.cpp +1 -1
  91. warp/native/mesh.cu +1 -2
  92. warp/native/nanovdb/GridHandle.h +366 -0
  93. warp/native/nanovdb/HostBuffer.h +590 -0
  94. warp/native/nanovdb/NanoVDB.h +3999 -2157
  95. warp/native/nanovdb/PNanoVDB.h +936 -99
  96. warp/native/quat.h +28 -1
  97. warp/native/rand.h +5 -1
  98. warp/native/vec.h +45 -1
  99. warp/native/volume.cpp +335 -103
  100. warp/native/volume.cu +39 -13
  101. warp/native/volume.h +725 -303
  102. warp/native/volume_builder.cu +381 -360
  103. warp/native/volume_builder.h +16 -1
  104. warp/native/volume_impl.h +61 -0
  105. warp/native/warp.cu +8 -2
  106. warp/native/warp.h +15 -7
  107. warp/render/render_opengl.py +191 -52
  108. warp/sim/integrator_featherstone.py +10 -3
  109. warp/sim/integrator_xpbd.py +16 -22
  110. warp/sparse.py +89 -27
  111. warp/stubs.py +83 -0
  112. warp/tests/assets/test_index_grid.nvdb +0 -0
  113. warp/tests/aux_test_dependent.py +0 -2
  114. warp/tests/aux_test_grad_customs.py +0 -2
  115. warp/tests/aux_test_reference.py +0 -2
  116. warp/tests/aux_test_reference_reference.py +0 -2
  117. warp/tests/aux_test_square.py +0 -2
  118. warp/tests/disabled_kinematics.py +0 -2
  119. warp/tests/test_adam.py +0 -2
  120. warp/tests/test_arithmetic.py +0 -36
  121. warp/tests/test_array.py +9 -11
  122. warp/tests/test_array_reduce.py +0 -2
  123. warp/tests/test_async.py +0 -2
  124. warp/tests/test_atomic.py +0 -2
  125. warp/tests/test_bool.py +58 -50
  126. warp/tests/test_builtins_resolution.py +0 -2
  127. warp/tests/test_bvh.py +0 -2
  128. warp/tests/test_closest_point_edge_edge.py +0 -1
  129. warp/tests/test_codegen.py +0 -4
  130. warp/tests/test_compile_consts.py +130 -10
  131. warp/tests/test_conditional.py +0 -2
  132. warp/tests/test_copy.py +0 -2
  133. warp/tests/test_ctypes.py +6 -8
  134. warp/tests/test_dense.py +0 -2
  135. warp/tests/test_devices.py +0 -2
  136. warp/tests/test_dlpack.py +9 -11
  137. warp/tests/test_examples.py +42 -39
  138. warp/tests/test_fabricarray.py +0 -3
  139. warp/tests/test_fast_math.py +0 -2
  140. warp/tests/test_fem.py +75 -54
  141. warp/tests/test_fp16.py +0 -2
  142. warp/tests/test_func.py +0 -2
  143. warp/tests/test_generics.py +27 -2
  144. warp/tests/test_grad.py +147 -8
  145. warp/tests/test_grad_customs.py +0 -2
  146. warp/tests/test_hash_grid.py +1 -3
  147. warp/tests/test_import.py +0 -2
  148. warp/tests/test_indexedarray.py +0 -2
  149. warp/tests/test_intersect.py +0 -2
  150. warp/tests/test_jax.py +0 -2
  151. warp/tests/test_large.py +11 -9
  152. warp/tests/test_launch.py +0 -2
  153. warp/tests/test_lerp.py +10 -54
  154. warp/tests/test_linear_solvers.py +3 -5
  155. warp/tests/test_lvalue.py +0 -2
  156. warp/tests/test_marching_cubes.py +0 -2
  157. warp/tests/test_mat.py +0 -2
  158. warp/tests/test_mat_lite.py +0 -2
  159. warp/tests/test_mat_scalar_ops.py +0 -2
  160. warp/tests/test_math.py +0 -2
  161. warp/tests/test_matmul.py +35 -37
  162. warp/tests/test_matmul_lite.py +29 -31
  163. warp/tests/test_mempool.py +0 -2
  164. warp/tests/test_mesh.py +0 -3
  165. warp/tests/test_mesh_query_aabb.py +0 -2
  166. warp/tests/test_mesh_query_point.py +0 -2
  167. warp/tests/test_mesh_query_ray.py +0 -2
  168. warp/tests/test_mlp.py +0 -2
  169. warp/tests/test_model.py +0 -2
  170. warp/tests/test_module_hashing.py +111 -0
  171. warp/tests/test_modules_lite.py +0 -3
  172. warp/tests/test_multigpu.py +0 -2
  173. warp/tests/test_noise.py +0 -4
  174. warp/tests/test_operators.py +0 -2
  175. warp/tests/test_options.py +0 -2
  176. warp/tests/test_peer.py +0 -2
  177. warp/tests/test_pinned.py +0 -2
  178. warp/tests/test_print.py +0 -2
  179. warp/tests/test_quat.py +0 -2
  180. warp/tests/test_rand.py +41 -5
  181. warp/tests/test_reload.py +0 -10
  182. warp/tests/test_rounding.py +0 -2
  183. warp/tests/test_runlength_encode.py +0 -2
  184. warp/tests/test_sim_grad.py +0 -2
  185. warp/tests/test_sim_kinematics.py +0 -2
  186. warp/tests/test_smoothstep.py +0 -2
  187. warp/tests/test_snippet.py +0 -2
  188. warp/tests/test_sparse.py +0 -2
  189. warp/tests/test_spatial.py +0 -2
  190. warp/tests/test_special_values.py +362 -0
  191. warp/tests/test_streams.py +0 -2
  192. warp/tests/test_struct.py +0 -2
  193. warp/tests/test_tape.py +0 -2
  194. warp/tests/test_torch.py +0 -2
  195. warp/tests/test_transient_module.py +0 -2
  196. warp/tests/test_types.py +0 -2
  197. warp/tests/test_utils.py +0 -2
  198. warp/tests/test_vec.py +0 -2
  199. warp/tests/test_vec_lite.py +0 -2
  200. warp/tests/test_vec_scalar_ops.py +0 -2
  201. warp/tests/test_verify_fp.py +0 -2
  202. warp/tests/test_volume.py +237 -13
  203. warp/tests/test_volume_write.py +86 -3
  204. warp/tests/unittest_serial.py +10 -9
  205. warp/tests/unittest_suites.py +6 -2
  206. warp/tests/unittest_utils.py +2 -171
  207. warp/tests/unused_test_misc.py +0 -2
  208. warp/tests/walkthrough_debug.py +1 -1
  209. warp/thirdparty/unittest_parallel.py +37 -40
  210. warp/types.py +514 -77
  211. {warp_lang-1.1.0.dist-info → warp_lang-1.2.0.dist-info}/METADATA +57 -30
  212. warp_lang-1.2.0.dist-info/RECORD +359 -0
  213. warp/examples/fem/example_convection_diffusion_dg0.py +0 -204
  214. warp/native/nanovdb/PNanoVDBWrite.h +0 -295
  215. warp_lang-1.1.0.dist-info/RECORD +0 -352
  216. {warp_lang-1.1.0.dist-info → warp_lang-1.2.0.dist-info}/LICENSE.md +0 -0
  217. {warp_lang-1.1.0.dist-info → warp_lang-1.2.0.dist-info}/WHEEL +0 -0
  218. {warp_lang-1.1.0.dist-info → warp_lang-1.2.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,362 @@
1
+ # Copyright (c) 2024 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 math
9
+ import unittest
10
+
11
+ import warp as wp
12
+ from warp.tests.unittest_utils import *
13
+
14
+ kernel_cache = {}
15
+
16
+
17
+ def getkernel(func, suffix=""):
18
+ key = func.__name__ + "_" + suffix
19
+ if key not in kernel_cache:
20
+ kernel_cache[key] = wp.Kernel(func=func, key=key)
21
+ return kernel_cache[key]
22
+
23
+
24
+ def test_infinity_scalar(test, device, dtype, register_kernels=False):
25
+ def check_infinity(outputs: wp.array(dtype=dtype), bool_outputs: wp.array(dtype=wp.bool)):
26
+ outputs[0] = dtype(wp.inf)
27
+ outputs[1] = dtype(-wp.inf)
28
+ outputs[2] = dtype(2.0 * wp.inf)
29
+ outputs[3] = dtype(-2.0 * wp.inf)
30
+ outputs[4] = dtype(2.0 / 0.0)
31
+ outputs[5] = dtype(-2.0 / 0.0)
32
+ outputs[6] = wp.log(dtype(0))
33
+ outputs[7] = wp.exp(dtype(800))
34
+
35
+ # Fill out bool outputs
36
+ bool_outputs[0] = wp.isinf(dtype(wp.inf))
37
+ bool_outputs[1] = wp.isfinite(dtype(wp.inf))
38
+ bool_outputs[2] = wp.isinf(dtype(-wp.inf))
39
+ bool_outputs[3] = wp.isfinite(dtype(-wp.inf))
40
+ bool_outputs[4] = wp.isinf(dtype(0))
41
+ bool_outputs[5] = wp.isinf(wp.exp(dtype(800)))
42
+
43
+ kernel = getkernel(check_infinity, suffix=dtype.__name__)
44
+
45
+ if register_kernels:
46
+ return
47
+
48
+ outputs = wp.empty(8, dtype=dtype, device=device)
49
+ outputs_bool = wp.empty(6, dtype=wp.bool, device=device)
50
+
51
+ wp.launch(kernel, dim=1, inputs=[], outputs=[outputs, outputs_bool], device=device)
52
+
53
+ outputs_cpu = outputs.to("cpu").list()
54
+
55
+ test.assertEqual(outputs_cpu[0], math.inf)
56
+ test.assertEqual(outputs_cpu[1], -math.inf)
57
+ test.assertEqual(outputs_cpu[2], math.inf)
58
+ test.assertEqual(outputs_cpu[3], -math.inf)
59
+ test.assertEqual(outputs_cpu[4], math.inf)
60
+ test.assertEqual(outputs_cpu[5], -math.inf)
61
+ test.assertEqual(outputs_cpu[6], -math.inf)
62
+ test.assertEqual(outputs_cpu[7], math.inf)
63
+
64
+ outputs_bool_cpu = outputs_bool.to("cpu").list()
65
+
66
+ test.assertTrue(outputs_bool_cpu[0], "wp.isinf(wp.inf) is not True")
67
+ test.assertFalse(outputs_bool_cpu[1], "wp.isfinite(wp.inf) is not False")
68
+ test.assertTrue(outputs_bool_cpu[2], "wp.isinf(-wp.inf) is not True")
69
+ test.assertFalse(outputs_bool_cpu[3], "wp.isfinite(-wp.inf) is not False")
70
+ test.assertFalse(outputs_bool_cpu[4], "wp.isinf(0) is not False")
71
+ test.assertTrue(outputs_bool_cpu[5], "wp.isinf(wp.exp(800)) is not True")
72
+
73
+
74
+ def test_nan_scalar(test, device, dtype, register_kernels=False):
75
+ def check_nan(outputs: wp.array(dtype=dtype), bool_outputs: wp.array(dtype=wp.bool)):
76
+ outputs[0] = dtype(wp.nan)
77
+ outputs[1] = dtype(-wp.nan)
78
+ outputs[2] = dtype(2.0 * wp.nan)
79
+ outputs[3] = dtype(2.0 + wp.nan)
80
+ outputs[4] = dtype(0.0 / 0.0)
81
+ outputs[5] = wp.sqrt(dtype(-1))
82
+ outputs[6] = wp.log(dtype(-1))
83
+ outputs[7] = dtype(wp.inf) - dtype(wp.inf)
84
+
85
+ # Fill out bool outputs
86
+ bool_outputs[0] = dtype(wp.nan) == dtype(wp.nan)
87
+ bool_outputs[1] = dtype(wp.nan) != dtype(wp.nan)
88
+ bool_outputs[2] = dtype(wp.nan) == dtype(1)
89
+ bool_outputs[3] = dtype(wp.nan) != dtype(1)
90
+ bool_outputs[4] = wp.isnan(wp.nan)
91
+ bool_outputs[5] = wp.isnan(dtype(0.0))
92
+ bool_outputs[6] = wp.isnan(dtype(wp.inf))
93
+ bool_outputs[7] = dtype(wp.nan) > dtype(1)
94
+ bool_outputs[8] = dtype(wp.nan) >= dtype(1)
95
+ bool_outputs[9] = dtype(wp.nan) < dtype(1)
96
+ bool_outputs[10] = dtype(wp.nan) <= dtype(1)
97
+ bool_outputs[11] = dtype(wp.nan) > dtype(wp.nan)
98
+ bool_outputs[12] = dtype(wp.nan) >= dtype(wp.nan)
99
+ bool_outputs[13] = dtype(wp.nan) < dtype(wp.nan)
100
+ bool_outputs[14] = dtype(wp.nan) <= dtype(wp.nan)
101
+ bool_outputs[15] = wp.isfinite(dtype(wp.nan))
102
+ bool_outputs[16] = wp.isinf(dtype(wp.nan))
103
+
104
+ kernel = getkernel(check_nan, suffix=dtype.__name__)
105
+
106
+ if register_kernels:
107
+ return
108
+
109
+ outputs = wp.empty(8, dtype=dtype, device=device)
110
+ outputs_bool = wp.empty(17, dtype=wp.bool, device=device)
111
+
112
+ wp.launch(kernel, dim=1, inputs=[], outputs=[outputs, outputs_bool], device=device)
113
+
114
+ outputs_cpu = outputs.to("cpu").list()
115
+
116
+ test.assertTrue(math.isnan(outputs_cpu[0]), "wp.nan is not NaN")
117
+ test.assertTrue(math.isnan(outputs_cpu[1]), "-wp.nan is not NaN")
118
+ test.assertTrue(math.isnan(outputs_cpu[2]), "2.0*wp.nan is not NaN")
119
+ test.assertTrue(math.isnan(outputs_cpu[3]), "2.0+wp.nan is not NaN ")
120
+ test.assertTrue(math.isnan(outputs_cpu[4]), "0.0/0.0 is not NaN")
121
+ test.assertTrue(math.isnan(outputs_cpu[5]), "Sqrt of a negative number is not NaN")
122
+ test.assertTrue(math.isnan(outputs_cpu[6]), "Log of a negative number is not NaN")
123
+ test.assertTrue(math.isnan(outputs_cpu[7]), "Subtracting infinity from infinity is not NaN")
124
+
125
+ outputs_bool_cpu = outputs_bool.to("cpu").list()
126
+
127
+ test.assertFalse(outputs_bool_cpu[0], "wp.nan == wp.nan is not False")
128
+ test.assertTrue(outputs_bool_cpu[1], "wp.nan != wp.nan is not True")
129
+ test.assertFalse(outputs_bool_cpu[2], "wp.nan == 1 is not False")
130
+ test.assertTrue(outputs_bool_cpu[3], "wp.nan != 1 is not True")
131
+ test.assertTrue(outputs_bool_cpu[4], "isnan(wp.nan) is not True")
132
+ test.assertFalse(outputs_bool_cpu[5], "isnan(0.0) is not False")
133
+ test.assertFalse(outputs_bool_cpu[6], "isnan(wp.inf) is not False")
134
+ test.assertFalse(outputs_bool_cpu[7], "wp.nan > 1 is not False")
135
+ test.assertFalse(outputs_bool_cpu[8], "wp.nan >= 1 is not False")
136
+ test.assertFalse(outputs_bool_cpu[9], "wp.nan < 1 is not False")
137
+ test.assertFalse(outputs_bool_cpu[10], "wp.nan <= 1 is not False")
138
+ test.assertFalse(outputs_bool_cpu[11], "wp.nan > wp.nan is not False")
139
+ test.assertFalse(outputs_bool_cpu[12], "wp.nan >= wp.nan is not False")
140
+ test.assertFalse(outputs_bool_cpu[13], "wp.nan < wp.nan is not False")
141
+ test.assertFalse(outputs_bool_cpu[14], "wp.nan <= wp.nan is not False")
142
+ test.assertFalse(outputs_bool_cpu[15], "wp.isfinite(wp.nan) is not False")
143
+ test.assertFalse(outputs_bool_cpu[16], "wp.isinf(wp.nan) is not False")
144
+
145
+
146
+ def test_is_special_vec(test, device, dtype, register_kernels=False):
147
+ vector_type = wp.types.vector(5, dtype)
148
+
149
+ def check_special_vec(bool_outputs: wp.array(dtype=wp.bool)):
150
+ zeros_vector = vector_type()
151
+ bool_outputs[0] = wp.isfinite(zeros_vector)
152
+ bool_outputs[1] = wp.isinf(zeros_vector)
153
+ bool_outputs[2] = wp.isnan(zeros_vector)
154
+
155
+ nan_vector = vector_type()
156
+ nan_vector[0] = dtype(wp.NAN)
157
+ bool_outputs[3] = wp.isfinite(nan_vector)
158
+ bool_outputs[4] = wp.isinf(nan_vector)
159
+ bool_outputs[5] = wp.isnan(nan_vector)
160
+
161
+ inf_vector = vector_type()
162
+ inf_vector[0] = dtype(wp.inf)
163
+ bool_outputs[6] = wp.isfinite(inf_vector)
164
+ bool_outputs[7] = wp.isinf(inf_vector)
165
+ bool_outputs[8] = wp.isnan(inf_vector)
166
+
167
+ kernel = getkernel(check_special_vec, suffix=dtype.__name__)
168
+
169
+ if register_kernels:
170
+ return
171
+
172
+ outputs_bool = wp.empty(9, dtype=wp.bool, device=device)
173
+
174
+ wp.launch(kernel, dim=1, inputs=[outputs_bool], device=device)
175
+
176
+ outputs_bool_cpu = outputs_bool.to("cpu").list()
177
+
178
+ test.assertTrue(outputs_bool_cpu[0], "wp.isfinite(zeros_vector) is not True")
179
+ test.assertFalse(outputs_bool_cpu[1], "wp.isinf(zeros_vector) is not False")
180
+ test.assertFalse(outputs_bool_cpu[2], "wp.isnan(zeros_vector) is not False")
181
+
182
+ test.assertFalse(outputs_bool_cpu[3], "wp.isfinite(nan_vector) is not False")
183
+ test.assertFalse(outputs_bool_cpu[4], "wp.isinf(nan_vector) is not False")
184
+ test.assertTrue(outputs_bool_cpu[5], "wp.isnan(nan_vector) is not True")
185
+
186
+ test.assertFalse(outputs_bool_cpu[6], "wp.isfinite(inf_vector) is not False")
187
+ test.assertTrue(outputs_bool_cpu[7], "wp.isinf(inf_vector) is not True")
188
+ test.assertFalse(outputs_bool_cpu[8], "wp.isnan(inf_vector) is not False")
189
+
190
+
191
+ def test_is_special_mat(test, device, dtype, register_kernels=False):
192
+ mat_type = wp.types.matrix((5, 5), dtype)
193
+
194
+ def check_special_mat(bool_outputs: wp.array(dtype=wp.bool)):
195
+ zeros_mat = mat_type()
196
+ bool_outputs[0] = wp.isfinite(zeros_mat)
197
+ bool_outputs[1] = wp.isinf(zeros_mat)
198
+ bool_outputs[2] = wp.isnan(zeros_mat)
199
+
200
+ nan_mat = mat_type()
201
+ nan_mat[0, 0] = dtype(wp.NAN)
202
+ bool_outputs[3] = wp.isfinite(nan_mat)
203
+ bool_outputs[4] = wp.isinf(nan_mat)
204
+ bool_outputs[5] = wp.isnan(nan_mat)
205
+
206
+ inf_mat = mat_type()
207
+ inf_mat[0, 0] = dtype(wp.inf)
208
+ bool_outputs[6] = wp.isfinite(inf_mat)
209
+ bool_outputs[7] = wp.isinf(inf_mat)
210
+ bool_outputs[8] = wp.isnan(inf_mat)
211
+
212
+ kernel = getkernel(check_special_mat, suffix=dtype.__name__)
213
+
214
+ if register_kernels:
215
+ return
216
+
217
+ outputs_bool = wp.empty(9, dtype=wp.bool, device=device)
218
+
219
+ wp.launch(kernel, dim=1, inputs=[outputs_bool], device=device)
220
+
221
+ outputs_bool_cpu = outputs_bool.to("cpu").list()
222
+
223
+ test.assertTrue(outputs_bool_cpu[0], "wp.isfinite(zeros_mat) is not True")
224
+ test.assertFalse(outputs_bool_cpu[1], "wp.isinf(zeros_mat) is not False")
225
+ test.assertFalse(outputs_bool_cpu[2], "wp.isnan(zeros_mat) is not False")
226
+
227
+ test.assertFalse(outputs_bool_cpu[3], "wp.isfinite(nan_mat) is not False")
228
+ test.assertFalse(outputs_bool_cpu[4], "wp.isinf(nan_mat) is not False")
229
+ test.assertTrue(outputs_bool_cpu[5], "wp.isnan(nan_mat) is not True")
230
+
231
+ test.assertFalse(outputs_bool_cpu[6], "wp.isfinite(inf_mat) is not False")
232
+ test.assertTrue(outputs_bool_cpu[7], "wp.isinf(inf_mat) is not True")
233
+ test.assertFalse(outputs_bool_cpu[8], "wp.isnan(inf_mat) is not False")
234
+
235
+
236
+ def test_is_special_quat(test, device, dtype, register_kernels=False):
237
+ quat_type = wp.types.quaternion(dtype)
238
+
239
+ def check_special_quat(bool_outputs: wp.array(dtype=wp.bool)):
240
+ zeros_quat = quat_type()
241
+ bool_outputs[0] = wp.isfinite(zeros_quat)
242
+ bool_outputs[1] = wp.isinf(zeros_quat)
243
+ bool_outputs[2] = wp.isnan(zeros_quat)
244
+
245
+ nan_quat = quat_type(dtype(wp.NAN), dtype(0), dtype(0), dtype(0))
246
+ bool_outputs[3] = wp.isfinite(nan_quat)
247
+ bool_outputs[4] = wp.isinf(nan_quat)
248
+ bool_outputs[5] = wp.isnan(nan_quat)
249
+
250
+ inf_quat = quat_type(dtype(wp.INF), dtype(0), dtype(0), dtype(0))
251
+ bool_outputs[6] = wp.isfinite(inf_quat)
252
+ bool_outputs[7] = wp.isinf(inf_quat)
253
+ bool_outputs[8] = wp.isnan(inf_quat)
254
+
255
+ kernel = getkernel(check_special_quat, suffix=dtype.__name__)
256
+
257
+ if register_kernels:
258
+ return
259
+
260
+ outputs_bool = wp.empty(9, dtype=wp.bool, device=device)
261
+
262
+ wp.launch(kernel, dim=1, inputs=[outputs_bool], device=device)
263
+
264
+ outputs_bool_cpu = outputs_bool.to("cpu").list()
265
+
266
+ test.assertTrue(outputs_bool_cpu[0], "wp.isfinite(zeros_quat) is not True")
267
+ test.assertFalse(outputs_bool_cpu[1], "wp.isinf(zeros_quat) is not False")
268
+ test.assertFalse(outputs_bool_cpu[2], "wp.isnan(zeros_quat) is not False")
269
+
270
+ test.assertFalse(outputs_bool_cpu[3], "wp.isfinite(nan_quat) is not False")
271
+ test.assertFalse(outputs_bool_cpu[4], "wp.isinf(nan_quat) is not False")
272
+ test.assertTrue(outputs_bool_cpu[5], "wp.isnan(nan_quat) is not True")
273
+
274
+ test.assertFalse(outputs_bool_cpu[6], "wp.isfinite(inf_quat) is not False")
275
+ test.assertTrue(outputs_bool_cpu[7], "wp.isinf(inf_quat) is not True")
276
+ test.assertFalse(outputs_bool_cpu[8], "wp.isnan(inf_quat) is not False")
277
+
278
+
279
+ def test_is_special_int(test, device, dtype, register_kernels=False):
280
+ vector_type = wp.types.vector(5, dtype)
281
+ matrix_type = wp.types.matrix((5, 5), dtype)
282
+ quat_type = wp.types.quaternion(dtype)
283
+
284
+ def check_is_special_int(bool_outputs: wp.array(dtype=wp.bool)):
285
+ bool_outputs[0] = wp.isfinite(dtype(0))
286
+ bool_outputs[1] = wp.isnan(dtype(0))
287
+ bool_outputs[2] = wp.isinf(dtype(0))
288
+
289
+ bool_outputs[3] = wp.isfinite(vector_type())
290
+ bool_outputs[4] = wp.isnan(vector_type())
291
+ bool_outputs[5] = wp.isinf(vector_type())
292
+
293
+ bool_outputs[6] = wp.isfinite(matrix_type())
294
+ bool_outputs[7] = wp.isnan(matrix_type())
295
+ bool_outputs[8] = wp.isinf(matrix_type())
296
+
297
+ bool_outputs[9] = wp.isfinite(quat_type())
298
+ bool_outputs[10] = wp.isnan(quat_type())
299
+ bool_outputs[11] = wp.isinf(quat_type())
300
+
301
+ kernel = getkernel(check_is_special_int, suffix=dtype.__name__)
302
+
303
+ if register_kernels:
304
+ return
305
+
306
+ outputs_bool = wp.empty(12, dtype=wp.bool, device=device)
307
+
308
+ wp.launch(kernel, dim=1, inputs=[outputs_bool], device=device)
309
+
310
+ outputs_bool_cpu = outputs_bool.to("cpu").list()
311
+
312
+ test.assertTrue(outputs_bool_cpu[0], "wp.isfinite(0) is not True")
313
+ test.assertFalse(outputs_bool_cpu[1], "wp.isinf(0) is not False")
314
+ test.assertFalse(outputs_bool_cpu[2], "wp.isnan(0) is not False")
315
+
316
+ test.assertTrue(outputs_bool_cpu[3], "wp.isfinite(vec) is not True")
317
+ test.assertFalse(outputs_bool_cpu[4], "wp.isinf(vec) is not False")
318
+ test.assertFalse(outputs_bool_cpu[5], "wp.isnan(vec) is not False")
319
+
320
+ test.assertTrue(outputs_bool_cpu[6], "wp.isfinite(matrix) is not True")
321
+ test.assertFalse(outputs_bool_cpu[7], "wp.isinf(matrix) is not False")
322
+ test.assertFalse(outputs_bool_cpu[8], "wp.isnan(matrix) is not False")
323
+
324
+ test.assertTrue(outputs_bool_cpu[9], "wp.isfinite(quat) is not True")
325
+ test.assertFalse(outputs_bool_cpu[10], "wp.isinf(quat) is not False")
326
+ test.assertFalse(outputs_bool_cpu[11], "wp.isnan(quat) is not False")
327
+
328
+
329
+ devices = get_test_devices()
330
+
331
+
332
+ class TestSpecialValues(unittest.TestCase):
333
+ pass
334
+
335
+
336
+ for dtype in [wp.float16, wp.float32, wp.float64]:
337
+ add_function_test_register_kernel(
338
+ TestSpecialValues, f"test_infinity_{dtype.__name__}", test_infinity_scalar, devices=devices, dtype=dtype
339
+ )
340
+ add_function_test_register_kernel(
341
+ TestSpecialValues, f"test_nan_{dtype.__name__}", test_nan_scalar, devices=devices, dtype=dtype
342
+ )
343
+ add_function_test_register_kernel(
344
+ TestSpecialValues, f"test_is_special_vec_{dtype.__name__}", test_is_special_vec, devices=devices, dtype=dtype
345
+ )
346
+ add_function_test_register_kernel(
347
+ TestSpecialValues, f"test_is_special_mat_{dtype.__name__}", test_is_special_mat, devices=devices, dtype=dtype
348
+ )
349
+ add_function_test_register_kernel(
350
+ TestSpecialValues, f"test_is_special_quat_{dtype.__name__}", test_is_special_quat, devices=devices, dtype=dtype
351
+ )
352
+
353
+ # Ensure functions like wp.isfinite work on integer types
354
+ for dtype in wp.types.int_types:
355
+ add_function_test_register_kernel(
356
+ TestSpecialValues, f"test_is_special_int_{dtype.__name__}", test_is_special_int, devices=devices, dtype=dtype
357
+ )
358
+
359
+
360
+ if __name__ == "__main__":
361
+ wp.build.clear_kernel_cache()
362
+ unittest.main(verbosity=2, failfast=False)
@@ -13,8 +13,6 @@ import warp as wp
13
13
  from warp.tests.unittest_utils import *
14
14
  from warp.utils import check_iommu
15
15
 
16
- wp.init()
17
-
18
16
 
19
17
  @wp.kernel
20
18
  def inc(a: wp.array(dtype=float)):
warp/tests/test_struct.py CHANGED
@@ -14,8 +14,6 @@ import warp as wp
14
14
  from warp.fem import Sample as StructFromAnotherModule
15
15
  from warp.tests.unittest_utils import *
16
16
 
17
- wp.init()
18
-
19
17
 
20
18
  @wp.struct
21
19
  class Model:
warp/tests/test_tape.py CHANGED
@@ -12,8 +12,6 @@ import numpy as np
12
12
  import warp as wp
13
13
  from warp.tests.unittest_utils import *
14
14
 
15
- wp.init()
16
-
17
15
 
18
16
  @wp.kernel
19
17
  def mul_constant(x: wp.array(dtype=float), y: wp.array(dtype=float)):
warp/tests/test_torch.py CHANGED
@@ -12,8 +12,6 @@ import numpy as np
12
12
  import warp as wp
13
13
  from warp.tests.unittest_utils import *
14
14
 
15
- wp.init()
16
-
17
15
 
18
16
  @wp.kernel
19
17
  def op_kernel(x: wp.array(dtype=float), y: wp.array(dtype=float)):
@@ -35,8 +35,6 @@ def compute(data: Data):
35
35
  data.x[0] = increment(data.x[0])
36
36
  """
37
37
 
38
- wp.init()
39
-
40
38
 
41
39
  def load_code_as_module(code, name):
42
40
  file, file_path = tempfile.mkstemp(suffix=".py")
warp/tests/test_types.py CHANGED
@@ -9,8 +9,6 @@ import unittest
9
9
 
10
10
  from warp.tests.unittest_utils import *
11
11
 
12
- wp.init()
13
-
14
12
 
15
13
  def test_integers(test, device, dtype):
16
14
  value = dtype(0)
warp/tests/test_utils.py CHANGED
@@ -12,8 +12,6 @@ import unittest
12
12
 
13
13
  from warp.tests.unittest_utils import *
14
14
 
15
- wp.init()
16
-
17
15
 
18
16
  def test_array_scan(test, device):
19
17
  rng = np.random.default_rng(123)
warp/tests/test_vec.py CHANGED
@@ -12,8 +12,6 @@ import numpy as np
12
12
  import warp as wp
13
13
  from warp.tests.unittest_utils import *
14
14
 
15
- wp.init()
16
-
17
15
  np_signed_int_types = [
18
16
  np.int8,
19
17
  np.int16,
@@ -10,8 +10,6 @@ import unittest
10
10
  import warp as wp
11
11
  from warp.tests.unittest_utils import *
12
12
 
13
- wp.init()
14
-
15
13
 
16
14
  @wp.kernel
17
15
  def test_vector_constructor_value_func():
@@ -12,8 +12,6 @@ import numpy as np
12
12
  import warp as wp
13
13
  from warp.tests.unittest_utils import *
14
14
 
15
- wp.init()
16
-
17
15
  np_signed_int_types = [
18
16
  np.int8,
19
17
  np.int16,
@@ -10,8 +10,6 @@ import unittest
10
10
  import warp as wp
11
11
  from warp.tests.unittest_utils import *
12
12
 
13
- wp.init()
14
-
15
13
 
16
14
  def setUpModule():
17
15
  wp.config.verify_fp = True # Enable checking floating-point values to be finite