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
@@ -0,0 +1,1292 @@
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 contextlib
9
+ import unittest
10
+
11
+ import numpy as np
12
+
13
+ from warp.tests.unittest_utils import *
14
+
15
+ wp.init()
16
+
17
+
18
+ def nps(dtype, value):
19
+ """Creates a NumPy scalar value based on the given data type."""
20
+ # Workaround to avoid deprecation warning messages for integer overflows.
21
+ return np.array((value,)).astype(dtype)[0]
22
+
23
+
24
+ def npv(dtype, values):
25
+ """Creates a vector of NumPy scalar values based on the given data type."""
26
+ return tuple(nps(dtype, x) for x in values)
27
+
28
+
29
+ def npm(dtype, dim, values):
30
+ """Creates a matrix of NumPy scalar values based on the given data type."""
31
+ return tuple(npv(dtype, values[i * dim : (i + 1) * dim]) for i in range(dim))
32
+
33
+
34
+ def wpv(dtype, values):
35
+ """Creates a vector of Warp scalar values based on the given data type."""
36
+ return tuple(dtype(x) for x in values)
37
+
38
+
39
+ def wpm(dtype, dim, values):
40
+ """Creates a matrix of Warp scalar values based on the given data type."""
41
+ return tuple(wpv(dtype, values[i * dim : (i + 1) * dim]) for i in range(dim))
42
+
43
+
44
+ def test_int_arg_support(test, device, dtype):
45
+ np_type = wp.types.warp_type_to_np_dtype[dtype]
46
+ value = -1234567890123456789
47
+ expected = wp.invert(dtype(value))
48
+
49
+ test.assertEqual(wp.invert(nps(np_type, value)), expected)
50
+
51
+
52
+ def test_float_arg_support(test, device, dtype):
53
+ np_type = wp.types.warp_type_to_np_dtype[dtype]
54
+ value = 1.23
55
+ expected = wp.sin(dtype(value))
56
+
57
+ test.assertEqual(wp.sin(nps(np_type, value)), expected)
58
+
59
+
60
+ def test_int_int_args_support(test, device, dtype):
61
+ np_type = wp.types.warp_type_to_np_dtype[dtype]
62
+ value = -1234567890
63
+ expected = wp.mul(dtype(value), dtype(value))
64
+
65
+ test.assertEqual(wp.mul(dtype(value), dtype(value)), expected)
66
+ test.assertEqual(wp.mul(dtype(value), nps(np_type, value)), expected)
67
+
68
+ test.assertEqual(wp.mul(nps(np_type, value), dtype(value)), expected)
69
+ test.assertEqual(wp.mul(nps(np_type, value), nps(np_type, value)), expected)
70
+
71
+ if dtype is wp.int32:
72
+ test.assertEqual(wp.mul(dtype(value), value), expected)
73
+ test.assertEqual(wp.mul(nps(np_type, value), value), expected)
74
+ test.assertEqual(wp.mul(value, value), expected)
75
+
76
+ test.assertEqual(wp.mul(value, dtype(value)), expected)
77
+ test.assertEqual(wp.mul(value, nps(np_type, value)), expected)
78
+ else:
79
+ with test.assertRaisesRegex(
80
+ RuntimeError,
81
+ rf"Couldn't find a function 'mul' compatible with " rf"the arguments '{dtype.__name__}, int'$",
82
+ ):
83
+ wp.mul(dtype(value), value)
84
+
85
+ with test.assertRaisesRegex(
86
+ RuntimeError,
87
+ rf"Couldn't find a function 'mul' compatible with " rf"the arguments '{np_type.__name__}, int'$",
88
+ ):
89
+ wp.mul(nps(np_type, value), value)
90
+
91
+ with test.assertRaisesRegex(
92
+ RuntimeError,
93
+ rf"Couldn't find a function 'mul' compatible with " rf"the arguments 'int, {dtype.__name__}'$",
94
+ ):
95
+ wp.mul(value, dtype(value))
96
+
97
+ with test.assertRaisesRegex(
98
+ RuntimeError,
99
+ rf"Couldn't find a function 'mul' compatible with " rf"the arguments 'int, {np_type.__name__}'$",
100
+ ):
101
+ wp.mul(value, nps(np_type, value))
102
+
103
+
104
+ def test_mat_arg_support(test, device, dtype):
105
+ np_type = wp.types.warp_type_to_np_dtype[dtype]
106
+ mat_cls = wp.types.matrix((3, 3), dtype)
107
+ values = (1.23, 2.34, 3.45, 4.56, 5.67, 6.78, 7.89, 8.90, 9.01)
108
+ expected = wp.trace(mat_cls(*values))
109
+
110
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
111
+ test.assertEqual(wp.trace(wpv(dtype, values)), expected)
112
+ test.assertEqual(wp.trace(wpm(dtype, 3, values)), expected)
113
+ test.assertEqual(wp.trace(npv(np_type, values)), expected)
114
+ test.assertEqual(wp.trace(npm(np_type, 3, values)), expected)
115
+ test.assertEqual(wp.trace(np.array(npv(np_type, values))), expected)
116
+
117
+
118
+ def test_mat_mat_args_support(test, device, dtype):
119
+ np_type = wp.types.warp_type_to_np_dtype[dtype]
120
+ mat_cls = wp.types.matrix((3, 3), dtype)
121
+ a_values = (0.12, 1.23, 2.34, 0.12, 1.23, 2.34, 0.12, 1.23, 2.34)
122
+ b_values = (2.34, 1.23, 0.12, 2.34, 1.23, 0.12, 2.34, 1.23, 0.12)
123
+ expected = wp.ddot(mat_cls(*a_values), mat_cls(*b_values))
124
+
125
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
126
+ test.assertEqual(wp.ddot(mat_cls(*a_values), mat_cls(*b_values)), expected)
127
+ test.assertEqual(wp.ddot(mat_cls(*a_values), wpv(dtype, b_values)), expected)
128
+ test.assertEqual(wp.ddot(mat_cls(*a_values), wpm(dtype, 3, b_values)), expected)
129
+ test.assertEqual(wp.ddot(mat_cls(*a_values), npv(np_type, b_values)), expected)
130
+ test.assertEqual(wp.ddot(mat_cls(*a_values), npm(np_type, 3, b_values)), expected)
131
+ test.assertEqual(wp.ddot(mat_cls(*a_values), np.array(npv(np_type, b_values))), expected)
132
+
133
+ test.assertEqual(wp.ddot(wpv(dtype, a_values), mat_cls(*b_values)), expected)
134
+ test.assertEqual(wp.ddot(wpv(dtype, a_values), wpv(dtype, b_values)), expected)
135
+ test.assertEqual(wp.ddot(wpv(dtype, a_values), wpm(dtype, 3, b_values)), expected)
136
+ test.assertEqual(wp.ddot(wpv(dtype, a_values), npv(np_type, b_values)), expected)
137
+ test.assertEqual(wp.ddot(wpv(dtype, a_values), npm(np_type, 3, b_values)), expected)
138
+ test.assertEqual(wp.ddot(wpv(dtype, a_values), np.array(npv(np_type, b_values))), expected)
139
+
140
+ test.assertEqual(wp.ddot(wpm(dtype, 3, a_values), mat_cls(*b_values)), expected)
141
+ test.assertEqual(wp.ddot(wpm(dtype, 3, a_values), wpv(dtype, b_values)), expected)
142
+ test.assertEqual(wp.ddot(wpm(dtype, 3, a_values), wpm(dtype, 3, b_values)), expected)
143
+ test.assertEqual(wp.ddot(wpm(dtype, 3, a_values), npv(np_type, b_values)), expected)
144
+ test.assertEqual(wp.ddot(wpm(dtype, 3, a_values), npm(np_type, 3, b_values)), expected)
145
+ test.assertEqual(wp.ddot(wpm(dtype, 3, a_values), np.array(npv(np_type, b_values))), expected)
146
+
147
+ test.assertEqual(wp.ddot(npv(np_type, a_values), mat_cls(*b_values)), expected)
148
+ test.assertEqual(wp.ddot(npv(np_type, a_values), wpv(dtype, b_values)), expected)
149
+ test.assertEqual(wp.ddot(npv(np_type, a_values), wpm(dtype, 3, b_values)), expected)
150
+ test.assertEqual(wp.ddot(npv(np_type, a_values), npv(np_type, b_values)), expected)
151
+ test.assertEqual(wp.ddot(npv(np_type, a_values), npm(np_type, 3, b_values)), expected)
152
+ test.assertEqual(wp.ddot(npv(np_type, a_values), np.array(npv(np_type, b_values))), expected)
153
+
154
+ test.assertEqual(wp.ddot(npm(np_type, 3, a_values), mat_cls(*b_values)), expected)
155
+ test.assertEqual(wp.ddot(npm(np_type, 3, a_values), wpv(dtype, b_values)), expected)
156
+ test.assertEqual(wp.ddot(npm(np_type, 3, a_values), wpm(dtype, 3, b_values)), expected)
157
+ test.assertEqual(wp.ddot(npm(np_type, 3, a_values), npv(np_type, b_values)), expected)
158
+ test.assertEqual(wp.ddot(npm(np_type, 3, a_values), npm(np_type, 3, b_values)), expected)
159
+ test.assertEqual(wp.ddot(npm(np_type, 3, a_values), np.array(npv(np_type, b_values))), expected)
160
+
161
+ test.assertEqual(wp.ddot(np.array(npv(np_type, a_values)), mat_cls(*b_values)), expected)
162
+ test.assertEqual(wp.ddot(np.array(npv(np_type, a_values)), wpv(dtype, b_values)), expected)
163
+ test.assertEqual(wp.ddot(np.array(npv(np_type, a_values)), wpm(dtype, 3, b_values)), expected)
164
+ test.assertEqual(wp.ddot(np.array(npv(np_type, a_values)), npv(np_type, b_values)), expected)
165
+ test.assertEqual(wp.ddot(np.array(npv(np_type, a_values)), npm(np_type, 3, b_values)), expected)
166
+ test.assertEqual(wp.ddot(np.array(npv(np_type, a_values)), np.array(npv(np_type, b_values))), expected)
167
+
168
+ if dtype is wp.float32:
169
+ test.assertEqual(wp.ddot(mat_cls(*a_values), b_values), expected)
170
+ test.assertEqual(wp.ddot(wpv(dtype, a_values), b_values), expected)
171
+ test.assertEqual(wp.ddot(wpm(dtype, 3, a_values), b_values), expected)
172
+ test.assertEqual(wp.ddot(npv(np_type, a_values), b_values), expected)
173
+ test.assertEqual(wp.ddot(npm(np_type, 3, a_values), b_values), expected)
174
+ test.assertEqual(wp.ddot(a_values, b_values), expected)
175
+ test.assertEqual(wp.ddot(np.array(npv(np_type, a_values)), b_values), expected)
176
+
177
+ test.assertEqual(wp.ddot(a_values, mat_cls(*b_values)), expected)
178
+ test.assertEqual(wp.ddot(a_values, wpv(dtype, b_values)), expected)
179
+ test.assertEqual(wp.ddot(a_values, wpm(dtype, 3, b_values)), expected)
180
+ test.assertEqual(wp.ddot(a_values, npv(np_type, b_values)), expected)
181
+ test.assertEqual(wp.ddot(a_values, npm(np_type, 3, b_values)), expected)
182
+ test.assertEqual(wp.ddot(a_values, np.array(npv(np_type, b_values))), expected)
183
+ else:
184
+ with test.assertRaisesRegex(
185
+ RuntimeError,
186
+ r"Couldn't find a function 'ddot' compatible with " r"the arguments 'mat_t, tuple'$",
187
+ ):
188
+ wp.ddot(mat_cls(*a_values), b_values)
189
+
190
+ with test.assertRaisesRegex(
191
+ RuntimeError,
192
+ r"Couldn't find a function 'ddot' compatible with " r"the arguments 'tuple, tuple'$",
193
+ ):
194
+ wp.ddot(wpv(dtype, a_values), b_values)
195
+
196
+ with test.assertRaisesRegex(
197
+ RuntimeError,
198
+ r"Couldn't find a function 'ddot' compatible with " r"the arguments 'tuple, tuple'$",
199
+ ):
200
+ wp.ddot(wpm(dtype, 3, a_values), b_values)
201
+
202
+ with test.assertRaisesRegex(
203
+ RuntimeError,
204
+ r"Couldn't find a function 'ddot' compatible with " r"the arguments 'tuple, tuple'$",
205
+ ):
206
+ wp.ddot(npv(np_type, a_values), b_values)
207
+
208
+ with test.assertRaisesRegex(
209
+ RuntimeError,
210
+ r"Couldn't find a function 'ddot' compatible with " r"the arguments 'tuple, tuple'$",
211
+ ):
212
+ wp.ddot(npm(np_type, 3, a_values), b_values)
213
+
214
+ with test.assertRaisesRegex(
215
+ RuntimeError,
216
+ r"Couldn't find a function 'ddot' compatible with " r"the arguments 'ndarray, tuple'$",
217
+ ):
218
+ wp.ddot(np.array(npv(np_type, a_values)), b_values)
219
+
220
+ with test.assertRaisesRegex(
221
+ RuntimeError,
222
+ r"Couldn't find a function 'ddot' compatible with " r"the arguments 'tuple, mat_t'$",
223
+ ):
224
+ wp.ddot(a_values, mat_cls(*b_values))
225
+
226
+ with test.assertRaisesRegex(
227
+ RuntimeError,
228
+ r"Couldn't find a function 'ddot' compatible with " r"the arguments 'tuple, tuple'$",
229
+ ):
230
+ wp.ddot(a_values, wpv(dtype, b_values))
231
+
232
+ with test.assertRaisesRegex(
233
+ RuntimeError,
234
+ r"Couldn't find a function 'ddot' compatible with " r"the arguments 'tuple, tuple'$",
235
+ ):
236
+ wp.ddot(a_values, wpm(dtype, 3, b_values))
237
+
238
+ with test.assertRaisesRegex(
239
+ RuntimeError,
240
+ r"Couldn't find a function 'ddot' compatible with " r"the arguments 'tuple, tuple'$",
241
+ ):
242
+ wp.ddot(a_values, npv(np_type, b_values))
243
+
244
+ with test.assertRaisesRegex(
245
+ RuntimeError,
246
+ r"Couldn't find a function 'ddot' compatible with " r"the arguments 'tuple, tuple'$",
247
+ ):
248
+ wp.ddot(a_values, npm(np_type, 3, b_values))
249
+
250
+ with test.assertRaisesRegex(
251
+ RuntimeError,
252
+ r"Couldn't find a function 'ddot' compatible with " r"the arguments 'tuple, ndarray'$",
253
+ ):
254
+ wp.ddot(a_values, np.array(npv(np_type, b_values)))
255
+
256
+
257
+ def test_mat_float_args_support(test, device, dtype):
258
+ np_type = wp.types.warp_type_to_np_dtype[dtype]
259
+ mat_cls = wp.types.matrix((3, 3), dtype)
260
+ a_values = (1.23, 2.34, 3.45, 4.56, 5.67, 6.78, 7.89, 8.90, 9.01)
261
+ b_value = 0.12
262
+ expected = wp.mul(mat_cls(*a_values), dtype(b_value))
263
+
264
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
265
+ test.assertEqual(wp.mul(mat_cls(*a_values), dtype(b_value)), expected)
266
+ test.assertEqual(wp.mul(mat_cls(*a_values), nps(np_type, b_value)), expected)
267
+
268
+ test.assertEqual(wp.mul(wpv(dtype, a_values), dtype(b_value)), expected)
269
+ test.assertEqual(wp.mul(wpv(dtype, a_values), nps(np_type, b_value)), expected)
270
+
271
+ test.assertEqual(wp.mul(wpm(dtype, 3, a_values), dtype(b_value)), expected)
272
+ test.assertEqual(wp.mul(wpm(dtype, 3, a_values), nps(np_type, b_value)), expected)
273
+
274
+ test.assertEqual(wp.mul(npv(np_type, a_values), dtype(b_value)), expected)
275
+ test.assertEqual(wp.mul(npv(np_type, a_values), nps(np_type, b_value)), expected)
276
+
277
+ test.assertEqual(wp.mul(npm(np_type, 3, a_values), dtype(b_value)), expected)
278
+ test.assertEqual(wp.mul(npm(np_type, 3, a_values), nps(np_type, b_value)), expected)
279
+
280
+ test.assertEqual(wp.mul(np.array(npv(np_type, a_values)), dtype(b_value)), expected)
281
+ test.assertEqual(wp.mul(np.array(npv(np_type, a_values)), nps(np_type, b_value)), expected)
282
+
283
+ if dtype is wp.float32:
284
+ test.assertEqual(wp.mul(mat_cls(*a_values), b_value), expected)
285
+ test.assertEqual(wp.mul(wpv(dtype, a_values), b_value), expected)
286
+ test.assertEqual(wp.mul(wpm(dtype, 3, a_values), b_value), expected)
287
+ test.assertEqual(wp.mul(npv(np_type, a_values), b_value), expected)
288
+ test.assertEqual(wp.mul(npm(np_type, 3, a_values), b_value), expected)
289
+ test.assertEqual(wp.mul(a_values, b_value), expected)
290
+ test.assertEqual(wp.mul(np.array(npv(np_type, a_values)), b_value), expected)
291
+
292
+ test.assertEqual(wp.mul(a_values, dtype(b_value)), expected)
293
+ test.assertEqual(wp.mul(a_values, nps(np_type, b_value)), expected)
294
+ else:
295
+ with test.assertRaisesRegex(
296
+ RuntimeError,
297
+ r"Couldn't find a function 'mul' compatible with " r"the arguments 'mat_t, float'$",
298
+ ):
299
+ wp.mul(mat_cls(*a_values), b_value)
300
+
301
+ with test.assertRaisesRegex(
302
+ RuntimeError,
303
+ r"Couldn't find a function 'mul' compatible with " r"the arguments 'tuple, float'$",
304
+ ):
305
+ wp.mul(wpv(dtype, a_values), b_value)
306
+
307
+ with test.assertRaisesRegex(
308
+ RuntimeError,
309
+ r"Couldn't find a function 'mul' compatible with " r"the arguments 'tuple, float'$",
310
+ ):
311
+ wp.mul(wpm(dtype, 3, a_values), b_value)
312
+
313
+ with test.assertRaisesRegex(
314
+ RuntimeError,
315
+ r"Couldn't find a function 'mul' compatible with " r"the arguments 'tuple, float'$",
316
+ ):
317
+ wp.mul(npv(np_type, a_values), b_value)
318
+
319
+ with test.assertRaisesRegex(
320
+ RuntimeError,
321
+ r"Couldn't find a function 'mul' compatible with " r"the arguments 'tuple, float'$",
322
+ ):
323
+ wp.mul(npm(np_type, 3, a_values), b_value)
324
+
325
+ with test.assertRaisesRegex(
326
+ RuntimeError,
327
+ r"Couldn't find a function 'mul' compatible with " r"the arguments 'ndarray, float'$",
328
+ ):
329
+ wp.mul(np.array(npv(np_type, a_values)), b_value)
330
+
331
+ with test.assertRaisesRegex(
332
+ RuntimeError,
333
+ rf"Couldn't find a function 'mul' compatible with " rf"the arguments 'tuple, {dtype.__name__}'$",
334
+ ):
335
+ wp.mul(a_values, dtype(b_value))
336
+
337
+ with test.assertRaisesRegex(
338
+ RuntimeError,
339
+ rf"Couldn't find a function 'mul' compatible with " rf"the arguments 'tuple, {np_type.__name__}'$",
340
+ ):
341
+ wp.mul(a_values, nps(np_type, b_value))
342
+
343
+
344
+ def test_vec_arg_support(test, device, dtype):
345
+ np_type = wp.types.warp_type_to_np_dtype[dtype]
346
+ vec_cls = wp.types.vector(3, dtype)
347
+ values = (1.23, 2.34, 3.45)
348
+ expected = wp.length(vec_cls(*values))
349
+
350
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
351
+ test.assertAlmostEqual(wp.length(wpv(dtype, values)), expected)
352
+ test.assertAlmostEqual(wp.length(npv(np_type, values)), expected)
353
+ test.assertAlmostEqual(wp.length(np.array(npv(np_type, values))), expected)
354
+
355
+
356
+ def test_vec_vec_args_support(test, device, dtype):
357
+ np_type = wp.types.warp_type_to_np_dtype[dtype]
358
+ vec_cls = wp.types.vector(3, dtype)
359
+ a_values = (1.23, 2.34, 3.45)
360
+ b_values = (4.56, 5.67, 6.78)
361
+ expected = wp.dot(vec_cls(*a_values), vec_cls(*b_values))
362
+
363
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
364
+ test.assertEqual(wp.dot(vec_cls(*a_values), vec_cls(*b_values)), expected)
365
+ test.assertEqual(wp.dot(vec_cls(*a_values), wpv(dtype, b_values)), expected)
366
+ test.assertEqual(wp.dot(vec_cls(*a_values), npv(np_type, b_values)), expected)
367
+ test.assertEqual(wp.dot(vec_cls(*a_values), np.array(npv(np_type, b_values))), expected)
368
+
369
+ test.assertEqual(wp.dot(wpv(dtype, a_values), vec_cls(*b_values)), expected)
370
+ test.assertEqual(wp.dot(wpv(dtype, a_values), wpv(dtype, b_values)), expected)
371
+ test.assertEqual(wp.dot(wpv(dtype, a_values), npv(np_type, b_values)), expected)
372
+ test.assertEqual(wp.dot(wpv(dtype, a_values), np.array(npv(np_type, b_values))), expected)
373
+
374
+ test.assertEqual(wp.dot(npv(np_type, a_values), vec_cls(*b_values)), expected)
375
+ test.assertEqual(wp.dot(npv(np_type, a_values), wpv(dtype, b_values)), expected)
376
+ test.assertEqual(wp.dot(npv(np_type, a_values), npv(np_type, b_values)), expected)
377
+ test.assertEqual(wp.dot(npv(np_type, a_values), np.array(npv(np_type, b_values))), expected)
378
+
379
+ test.assertEqual(wp.dot(np.array(npv(np_type, a_values)), vec_cls(*b_values)), expected)
380
+ test.assertEqual(wp.dot(np.array(npv(np_type, a_values)), wpv(dtype, b_values)), expected)
381
+ test.assertEqual(wp.dot(np.array(npv(np_type, a_values)), npv(np_type, b_values)), expected)
382
+ test.assertEqual(wp.dot(np.array(npv(np_type, a_values)), np.array(npv(np_type, b_values))), expected)
383
+
384
+ if dtype is wp.float32:
385
+ test.assertEqual(wp.dot(vec_cls(*a_values), b_values), expected)
386
+ test.assertEqual(wp.dot(wpv(dtype, a_values), b_values), expected)
387
+ test.assertEqual(wp.dot(npv(np_type, a_values), b_values), expected)
388
+ test.assertEqual(wp.dot(a_values, b_values), expected)
389
+ test.assertEqual(wp.dot(np.array(npv(np_type, a_values)), b_values), expected)
390
+
391
+ test.assertEqual(wp.dot(a_values, vec_cls(*b_values)), expected)
392
+ test.assertEqual(wp.dot(a_values, wpv(dtype, b_values)), expected)
393
+ test.assertEqual(wp.dot(a_values, npv(np_type, b_values)), expected)
394
+ test.assertEqual(wp.dot(a_values, np.array(npv(np_type, b_values))), expected)
395
+ else:
396
+ with test.assertRaisesRegex(
397
+ RuntimeError,
398
+ r"Couldn't find a function 'dot' compatible with " r"the arguments 'vec_t, tuple'$",
399
+ ):
400
+ wp.dot(vec_cls(*a_values), b_values)
401
+
402
+ with test.assertRaisesRegex(
403
+ RuntimeError,
404
+ r"Couldn't find a function 'dot' compatible with " r"the arguments 'tuple, tuple'$",
405
+ ):
406
+ wp.dot(wpv(dtype, a_values), b_values)
407
+
408
+ with test.assertRaisesRegex(
409
+ RuntimeError,
410
+ r"Couldn't find a function 'dot' compatible with " r"the arguments 'tuple, tuple'$",
411
+ ):
412
+ wp.dot(npv(np_type, a_values), b_values)
413
+
414
+ with test.assertRaisesRegex(
415
+ RuntimeError,
416
+ r"Couldn't find a function 'dot' compatible with " r"the arguments 'ndarray, tuple'$",
417
+ ):
418
+ wp.dot(np.array(npv(np_type, a_values)), b_values)
419
+
420
+ with test.assertRaisesRegex(
421
+ RuntimeError,
422
+ r"Couldn't find a function 'dot' compatible with " r"the arguments 'tuple, vec_t'$",
423
+ ):
424
+ wp.dot(a_values, vec_cls(*b_values))
425
+
426
+ with test.assertRaisesRegex(
427
+ RuntimeError,
428
+ r"Couldn't find a function 'dot' compatible with " r"the arguments 'tuple, tuple'$",
429
+ ):
430
+ wp.dot(a_values, wpv(dtype, b_values))
431
+
432
+ with test.assertRaisesRegex(
433
+ RuntimeError,
434
+ r"Couldn't find a function 'dot' compatible with " r"the arguments 'tuple, tuple'$",
435
+ ):
436
+ wp.dot(a_values, npv(np_type, b_values))
437
+
438
+ with test.assertRaisesRegex(
439
+ RuntimeError,
440
+ r"Couldn't find a function 'dot' compatible with " r"the arguments 'tuple, ndarray'$",
441
+ ):
442
+ wp.dot(a_values, np.array(npv(np_type, b_values)))
443
+
444
+
445
+ def test_vec_float_args_support(test, device, dtype):
446
+ np_type = wp.types.warp_type_to_np_dtype[dtype]
447
+ vec_cls = wp.types.vector(3, dtype)
448
+ a_values = (1.23, 2.34, 3.45)
449
+ b_value = 4.56
450
+ expected = wp.mul(vec_cls(*a_values), dtype(b_value))
451
+
452
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
453
+ test.assertEqual(wp.mul(vec_cls(*a_values), dtype(b_value)), expected)
454
+ test.assertEqual(wp.mul(vec_cls(*a_values), nps(np_type, b_value)), expected)
455
+
456
+ test.assertEqual(wp.mul(wpv(dtype, a_values), dtype(b_value)), expected)
457
+ test.assertEqual(wp.mul(wpv(dtype, a_values), nps(np_type, b_value)), expected)
458
+
459
+ test.assertEqual(wp.mul(npv(np_type, a_values), dtype(b_value)), expected)
460
+ test.assertEqual(wp.mul(npv(np_type, a_values), nps(np_type, b_value)), expected)
461
+
462
+ test.assertEqual(wp.mul(np.array(npv(np_type, a_values)), dtype(b_value)), expected)
463
+ test.assertEqual(wp.mul(np.array(npv(np_type, a_values)), nps(np_type, b_value)), expected)
464
+
465
+ if dtype is wp.float32:
466
+ test.assertEqual(wp.mul(vec_cls(*a_values), b_value), expected)
467
+ test.assertEqual(wp.mul(wpv(dtype, a_values), b_value), expected)
468
+ test.assertEqual(wp.mul(npv(np_type, a_values), b_value), expected)
469
+ test.assertEqual(wp.mul(a_values, b_value), expected)
470
+ test.assertEqual(wp.mul(np.array(npv(np_type, a_values)), b_value), expected)
471
+
472
+ test.assertEqual(wp.mul(a_values, dtype(b_value)), expected)
473
+ test.assertEqual(wp.mul(a_values, nps(np_type, b_value)), expected)
474
+ else:
475
+ with test.assertRaisesRegex(
476
+ RuntimeError,
477
+ r"Couldn't find a function 'mul' compatible with " r"the arguments 'vec_t, float'$",
478
+ ):
479
+ wp.mul(vec_cls(*a_values), b_value)
480
+
481
+ with test.assertRaisesRegex(
482
+ RuntimeError,
483
+ r"Couldn't find a function 'mul' compatible with " r"the arguments 'tuple, float'$",
484
+ ):
485
+ wp.mul(wpv(dtype, a_values), b_value)
486
+
487
+ with test.assertRaisesRegex(
488
+ RuntimeError,
489
+ r"Couldn't find a function 'mul' compatible with " r"the arguments 'tuple, float'$",
490
+ ):
491
+ wp.mul(npv(np_type, a_values), b_value)
492
+
493
+ with test.assertRaisesRegex(
494
+ RuntimeError,
495
+ r"Couldn't find a function 'mul' compatible with " r"the arguments 'ndarray, float'$",
496
+ ):
497
+ wp.mul(np.array(npv(np_type, a_values)), b_value)
498
+
499
+ with test.assertRaisesRegex(
500
+ RuntimeError,
501
+ rf"Couldn't find a function 'mul' compatible with " rf"the arguments 'tuple, {dtype.__name__}'$",
502
+ ):
503
+ wp.mul(a_values, dtype(b_value))
504
+
505
+ with test.assertRaisesRegex(
506
+ RuntimeError,
507
+ rf"Couldn't find a function 'mul' compatible with " rf"the arguments 'tuple, {np_type.__name__}'$",
508
+ ):
509
+ wp.mul(a_values, nps(np_type, b_value))
510
+
511
+
512
+ class TestBuiltinsResolution(unittest.TestCase):
513
+ def test_int_arg_overflow(self):
514
+ value = -1234567890123456789
515
+
516
+ self.assertEqual(wp.invert(wp.int8(value)), 20)
517
+ self.assertEqual(wp.invert(wp.int16(value)), -32492)
518
+ self.assertEqual(wp.invert(wp.int32(value)), 2112454932)
519
+ self.assertEqual(wp.invert(wp.int64(value)), 1234567890123456788)
520
+
521
+ self.assertEqual(wp.invert(wp.uint8(value)), 20)
522
+ self.assertEqual(wp.invert(wp.uint16(value)), 33044)
523
+ self.assertEqual(wp.invert(wp.uint32(value)), 2112454932)
524
+ self.assertEqual(wp.invert(wp.uint64(value)), 1234567890123456788)
525
+
526
+ self.assertEqual(wp.invert(value), wp.invert(wp.int32(value)))
527
+
528
+ def test_float_arg_precision(self):
529
+ value = 1.23
530
+ expected = 0.94248880193169748409
531
+
532
+ result = wp.sin(wp.float64(value))
533
+ self.assertAlmostEqual(result, expected, places=12)
534
+
535
+ result = wp.sin(wp.float32(value))
536
+ self.assertNotAlmostEqual(result, expected, places=12)
537
+ self.assertAlmostEqual(result, expected, places=5)
538
+
539
+ result = wp.sin(wp.float16(value))
540
+ self.assertNotAlmostEqual(result, expected, places=5)
541
+ self.assertAlmostEqual(result, expected, places=1)
542
+
543
+ self.assertEqual(wp.sin(value), wp.sin(wp.float32(value)))
544
+
545
+ def test_int_int_args_overflow(self):
546
+ value = -1234567890
547
+
548
+ self.assertEqual(wp.mul(wp.int8(value), wp.int8(value)), 68)
549
+ self.assertEqual(wp.mul(wp.int16(value), wp.int16(value)), -3004)
550
+ self.assertEqual(wp.mul(wp.int32(value), wp.int32(value)), 304084036)
551
+ self.assertEqual(wp.mul(wp.int64(value), wp.int64(value)), 1524157875019052100)
552
+
553
+ self.assertEqual(wp.mul(wp.uint8(value), wp.uint8(value)), 68)
554
+ self.assertEqual(wp.mul(wp.uint16(value), wp.uint16(value)), 62532)
555
+ self.assertEqual(wp.mul(wp.uint32(value), wp.uint32(value)), 304084036)
556
+ self.assertEqual(wp.mul(wp.uint64(value), wp.uint64(value)), 1524157875019052100)
557
+
558
+ self.assertEqual(wp.mul(value, value), wp.mul(wp.int32(value), wp.int32(value)))
559
+
560
+ def test_mat22_arg_precision(self):
561
+ values = (1.23, 2.34, 3.45, 4.56)
562
+ values_2d = (values[0:2], values[2:4])
563
+ expected = 5.78999999999999914735
564
+
565
+ result = wp.trace(wp.mat22d(*values))
566
+ self.assertAlmostEqual(result, expected, places=12)
567
+
568
+ result = wp.trace(wp.mat22f(*values))
569
+ self.assertNotAlmostEqual(result, expected, places=12)
570
+ self.assertAlmostEqual(result, expected, places=5)
571
+
572
+ result = wp.trace(wp.mat22h(*values))
573
+ self.assertNotAlmostEqual(result, expected, places=5)
574
+ self.assertAlmostEqual(result, expected, places=1)
575
+
576
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
577
+ self.assertEqual(wp.trace(values), wp.trace(wp.mat22f(*values)))
578
+ self.assertEqual(wp.trace(values_2d), wp.trace(wp.mat22f(*values)))
579
+
580
+ def test_mat33_arg_precision(self):
581
+ values = (1.23, 2.34, 3.45, 4.56, 5.67, 6.78, 7.89, 8.90, 9.01)
582
+ values_2d = (values[0:3], values[3:6], values[6:9])
583
+ expected = 15.91000000000000014211
584
+
585
+ result = wp.trace(wp.mat33d(*values))
586
+ self.assertAlmostEqual(result, expected, places=12)
587
+
588
+ result = wp.trace(wp.mat33f(*values))
589
+ self.assertNotAlmostEqual(result, expected, places=12)
590
+ self.assertAlmostEqual(result, expected, places=5)
591
+
592
+ result = wp.trace(wp.mat33h(*values))
593
+ self.assertNotAlmostEqual(result, expected, places=5)
594
+ self.assertAlmostEqual(result, expected, places=1)
595
+
596
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
597
+ self.assertEqual(wp.trace(values), wp.trace(wp.mat33f(*values)))
598
+ self.assertEqual(wp.trace(values_2d), wp.trace(wp.mat33f(*values)))
599
+
600
+ def test_mat44_arg_precision(self):
601
+ values = (1.23, 2.34, 3.45, 4.56, 5.67, 6.78, 7.89, 8.90, 9.01, 10.12, 11.23, 12.34, 13.45, 14.56, 15.67, 16.78)
602
+ values_2d = (values[0:4], values[4:8], values[8:12], values[12:16])
603
+ expected = 36.02000000000000312639
604
+
605
+ result = wp.trace(wp.mat44d(*values))
606
+ self.assertAlmostEqual(result, expected, places=12)
607
+
608
+ result = wp.trace(wp.mat44f(*values))
609
+ self.assertNotAlmostEqual(result, expected, places=12)
610
+ self.assertAlmostEqual(result, expected, places=5)
611
+
612
+ result = wp.trace(wp.mat44h(*values))
613
+ self.assertNotAlmostEqual(result, expected, places=5)
614
+ self.assertAlmostEqual(result, expected, places=1)
615
+
616
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
617
+ self.assertEqual(wp.trace(values), wp.trace(wp.mat44f(*values)))
618
+ self.assertEqual(wp.trace(values_2d), wp.trace(wp.mat44f(*values)))
619
+
620
+ def test_mat22_mat22_args_precision(self):
621
+ a_values = (0.12, 1.23, 0.12, 1.23)
622
+ a_values_2d = (a_values[0:2], a_values[2:4])
623
+ b_values = (1.23, 0.12, 1.23, 0.12)
624
+ b_values_2d = (b_values[0:2], b_values[2:4])
625
+ expected = 0.59039999999999992486
626
+
627
+ result = wp.ddot(wp.mat22d(*a_values), wp.mat22d(*b_values))
628
+ self.assertAlmostEqual(result, expected, places=12)
629
+
630
+ result = wp.ddot(wp.mat22f(*a_values), wp.mat22f(*b_values))
631
+ self.assertNotAlmostEqual(result, expected, places=12)
632
+ self.assertAlmostEqual(result, expected, places=5)
633
+
634
+ result = wp.ddot(wp.mat22h(*a_values), wp.mat22h(*b_values))
635
+ self.assertNotAlmostEqual(result, expected, places=5)
636
+ self.assertAlmostEqual(result, expected, places=1)
637
+
638
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
639
+ self.assertEqual(wp.ddot(a_values, b_values), wp.ddot(wp.mat22f(*a_values), wp.mat22f(*b_values)))
640
+ self.assertEqual(wp.ddot(a_values_2d, b_values_2d), wp.ddot(wp.mat22f(*a_values), wp.mat22f(*b_values)))
641
+ self.assertEqual(wp.ddot(a_values, b_values_2d), wp.ddot(wp.mat22f(*a_values), wp.mat22f(*b_values)))
642
+ self.assertEqual(wp.ddot(a_values_2d, b_values), wp.ddot(wp.mat22f(*a_values), wp.mat22f(*b_values)))
643
+
644
+ def test_mat33_mat33_args_precision(self):
645
+ a_values = (0.12, 1.23, 2.34, 0.12, 1.23, 2.34, 0.12, 1.23, 2.34)
646
+ a_values_2d = (a_values[0:3], a_values[3:6], a_values[6:9])
647
+ b_values = (2.34, 1.23, 0.12, 2.34, 1.23, 0.12, 2.34, 1.23, 0.12)
648
+ b_values_2d = (b_values[0:3], b_values[3:6], b_values[6:9])
649
+ expected = 6.22350000000000047606
650
+
651
+ result = wp.ddot(wp.mat33d(*a_values), wp.mat33d(*b_values))
652
+ self.assertAlmostEqual(result, expected, places=12)
653
+
654
+ result = wp.ddot(wp.mat33f(*a_values), wp.mat33f(*b_values))
655
+ self.assertNotAlmostEqual(result, expected, places=12)
656
+ self.assertAlmostEqual(result, expected, places=5)
657
+
658
+ result = wp.ddot(wp.mat33h(*a_values), wp.mat33h(*b_values))
659
+ self.assertNotAlmostEqual(result, expected, places=5)
660
+ self.assertAlmostEqual(result, expected, places=1)
661
+
662
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
663
+ self.assertEqual(wp.ddot(a_values, b_values), wp.ddot(wp.mat33f(*a_values), wp.mat33f(*b_values)))
664
+ self.assertEqual(wp.ddot(a_values_2d, b_values_2d), wp.ddot(wp.mat33f(*a_values), wp.mat33f(*b_values)))
665
+ self.assertEqual(wp.ddot(a_values, b_values_2d), wp.ddot(wp.mat33f(*a_values), wp.mat33f(*b_values)))
666
+ self.assertEqual(wp.ddot(a_values_2d, b_values), wp.ddot(wp.mat33f(*a_values), wp.mat33f(*b_values)))
667
+
668
+ def test_mat44_mat44_args(self):
669
+ a_values = (0.12, 1.23, 2.34, 3.45, 0.12, 1.23, 2.34, 3.45, 0.12, 1.23, 2.34, 3.45, 0.12, 1.23, 2.34, 3.45)
670
+ a_values_2d = (a_values[0:4], a_values[4:8], a_values[8:12], a_values[12:16])
671
+ b_values = (3.45, 2.34, 1.23, 0.12, 3.45, 2.34, 1.23, 0.12, 3.45, 2.34, 1.23, 0.12, 3.45, 2.34, 1.23, 0.12)
672
+ b_values_2d = (b_values[0:4], b_values[4:8], b_values[8:12], b_values[12:16])
673
+ expected = 26.33760000000000189857
674
+
675
+ result = wp.ddot(wp.mat44d(*a_values), wp.mat44d(*b_values))
676
+ self.assertAlmostEqual(result, expected, places=12)
677
+
678
+ result = wp.ddot(wp.mat44f(*a_values), wp.mat44f(*b_values))
679
+ self.assertNotAlmostEqual(result, expected, places=12)
680
+ self.assertAlmostEqual(result, expected, places=5)
681
+
682
+ result = wp.ddot(wp.mat44h(*a_values), wp.mat44h(*b_values))
683
+ self.assertNotAlmostEqual(result, expected, places=5)
684
+ self.assertAlmostEqual(result, expected, places=1)
685
+
686
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
687
+ self.assertEqual(wp.ddot(a_values, b_values), wp.ddot(wp.mat44f(*a_values), wp.mat44f(*b_values)))
688
+ self.assertEqual(wp.ddot(a_values_2d, b_values_2d), wp.ddot(wp.mat44f(*a_values), wp.mat44f(*b_values)))
689
+ self.assertEqual(wp.ddot(a_values, b_values_2d), wp.ddot(wp.mat44f(*a_values), wp.mat44f(*b_values)))
690
+ self.assertEqual(wp.ddot(a_values_2d, b_values), wp.ddot(wp.mat44f(*a_values), wp.mat44f(*b_values)))
691
+
692
+ def test_mat22_float_args_precision(self):
693
+ a_values = (1.23, 2.34, 3.45, 4.56)
694
+ a_values_2d = (a_values[0:2], a_values[2:4])
695
+ b_value = 0.12
696
+ expected_00 = 0.14759999999999998122
697
+ expected_01 = 0.28079999999999999405
698
+ expected_10 = 0.41399999999999997913
699
+ expected_11 = 0.54719999999999990870
700
+
701
+ result = wp.mul(wp.mat22d(*a_values), wp.float64(b_value))
702
+ self.assertAlmostEqual(result[0][0], expected_00, places=12)
703
+ self.assertAlmostEqual(result[0][1], expected_01, places=12)
704
+ self.assertAlmostEqual(result[1][0], expected_10, places=12)
705
+ self.assertAlmostEqual(result[1][1], expected_11, places=12)
706
+
707
+ result = wp.mul(wp.mat22f(*a_values), wp.float32(b_value))
708
+ self.assertNotAlmostEqual(result[0][0], expected_00, places=12)
709
+ self.assertNotAlmostEqual(result[0][1], expected_01, places=12)
710
+ self.assertNotAlmostEqual(result[1][0], expected_10, places=12)
711
+ self.assertNotAlmostEqual(result[1][1], expected_11, places=12)
712
+ self.assertAlmostEqual(result[0][0], expected_00, places=5)
713
+ self.assertAlmostEqual(result[0][1], expected_01, places=5)
714
+ self.assertAlmostEqual(result[1][0], expected_10, places=5)
715
+ self.assertAlmostEqual(result[1][1], expected_11, places=5)
716
+
717
+ result = wp.mul(wp.mat22h(*a_values), wp.float16(b_value))
718
+ self.assertNotAlmostEqual(result[0][0], expected_00, places=5)
719
+ self.assertNotAlmostEqual(result[0][1], expected_01, places=5)
720
+ self.assertNotAlmostEqual(result[1][0], expected_10, places=5)
721
+ self.assertNotAlmostEqual(result[1][1], expected_11, places=5)
722
+ self.assertAlmostEqual(result[0][0], expected_00, places=1)
723
+ self.assertAlmostEqual(result[0][1], expected_01, places=1)
724
+ self.assertAlmostEqual(result[1][0], expected_10, places=1)
725
+ self.assertAlmostEqual(result[1][1], expected_11, places=1)
726
+
727
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
728
+ # Multiplying a 1-D tuple of length 4 is ambiguous because it could match
729
+ # either the `vec4f` or `mat22f` overload. As a result, only the 2-D variant
730
+ # of the tuple is expected to resolve correctly.
731
+ self.assertEqual(wp.mul(a_values_2d, b_value), wp.mul(wp.mat22f(*a_values), wp.float32(b_value)))
732
+
733
+ def test_mat33_float_args_precision(self):
734
+ a_values = (1.23, 2.34, 3.45, 4.56, 5.67, 6.78, 7.89, 8.90, 9.01)
735
+ a_values_2d = (a_values[0:3], a_values[3:6], a_values[6:9])
736
+ b_value = 0.12
737
+ expected_00 = 0.14759999999999998122
738
+ expected_01 = 0.28079999999999999405
739
+ expected_02 = 0.41399999999999997913
740
+ expected_10 = 0.54719999999999990870
741
+ expected_11 = 0.68040000000000000480
742
+ expected_12 = 0.81359999999999998987
743
+ expected_20 = 0.94679999999999997495
744
+ expected_21 = 1.06800000000000006040
745
+ expected_22 = 1.08119999999999993889
746
+
747
+ result = wp.mul(wp.mat33d(*a_values), wp.float64(b_value))
748
+ self.assertAlmostEqual(result[0][0], expected_00, places=12)
749
+ self.assertAlmostEqual(result[0][1], expected_01, places=12)
750
+ self.assertAlmostEqual(result[0][2], expected_02, places=12)
751
+ self.assertAlmostEqual(result[1][0], expected_10, places=12)
752
+ self.assertAlmostEqual(result[1][1], expected_11, places=12)
753
+ self.assertAlmostEqual(result[1][2], expected_12, places=12)
754
+ self.assertAlmostEqual(result[2][0], expected_20, places=12)
755
+ self.assertAlmostEqual(result[2][1], expected_21, places=12)
756
+ self.assertAlmostEqual(result[2][2], expected_22, places=12)
757
+
758
+ result = wp.mul(wp.mat33f(*a_values), wp.float32(b_value))
759
+ self.assertNotAlmostEqual(result[0][0], expected_00, places=12)
760
+ self.assertNotAlmostEqual(result[0][1], expected_01, places=12)
761
+ self.assertNotAlmostEqual(result[0][2], expected_02, places=12)
762
+ self.assertNotAlmostEqual(result[1][0], expected_10, places=12)
763
+ self.assertNotAlmostEqual(result[1][1], expected_11, places=12)
764
+ self.assertNotAlmostEqual(result[1][2], expected_12, places=12)
765
+ self.assertNotAlmostEqual(result[2][0], expected_20, places=12)
766
+ self.assertNotAlmostEqual(result[2][1], expected_21, places=12)
767
+ self.assertNotAlmostEqual(result[2][2], expected_22, places=12)
768
+ self.assertAlmostEqual(result[0][0], expected_00, places=5)
769
+ self.assertAlmostEqual(result[0][1], expected_01, places=5)
770
+ self.assertAlmostEqual(result[0][2], expected_02, places=5)
771
+ self.assertAlmostEqual(result[1][0], expected_10, places=5)
772
+ self.assertAlmostEqual(result[1][1], expected_11, places=5)
773
+ self.assertAlmostEqual(result[1][2], expected_12, places=5)
774
+ self.assertAlmostEqual(result[2][0], expected_20, places=5)
775
+ self.assertAlmostEqual(result[2][1], expected_21, places=5)
776
+ self.assertAlmostEqual(result[2][2], expected_22, places=5)
777
+
778
+ result = wp.mul(wp.mat33h(*a_values), wp.float16(b_value))
779
+ self.assertNotAlmostEqual(result[0][0], expected_00, places=5)
780
+ self.assertNotAlmostEqual(result[0][1], expected_01, places=5)
781
+ self.assertNotAlmostEqual(result[0][2], expected_02, places=5)
782
+ self.assertNotAlmostEqual(result[1][0], expected_10, places=5)
783
+ self.assertNotAlmostEqual(result[1][1], expected_11, places=5)
784
+ self.assertNotAlmostEqual(result[1][2], expected_12, places=5)
785
+ self.assertNotAlmostEqual(result[2][0], expected_20, places=5)
786
+ self.assertNotAlmostEqual(result[2][1], expected_21, places=5)
787
+ self.assertNotAlmostEqual(result[2][2], expected_22, places=5)
788
+ self.assertAlmostEqual(result[0][0], expected_00, places=1)
789
+ self.assertAlmostEqual(result[0][1], expected_01, places=1)
790
+ self.assertAlmostEqual(result[0][2], expected_02, places=1)
791
+ self.assertAlmostEqual(result[1][0], expected_10, places=1)
792
+ self.assertAlmostEqual(result[1][1], expected_11, places=1)
793
+ self.assertAlmostEqual(result[1][2], expected_12, places=1)
794
+ self.assertAlmostEqual(result[2][0], expected_20, places=1)
795
+ self.assertAlmostEqual(result[2][1], expected_21, places=1)
796
+ self.assertAlmostEqual(result[2][2], expected_22, places=1)
797
+
798
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
799
+ self.assertEqual(wp.mul(a_values, b_value), wp.mul(wp.mat33f(*a_values), wp.float32(b_value)))
800
+ self.assertEqual(wp.mul(a_values_2d, b_value), wp.mul(wp.mat33f(*a_values), wp.float32(b_value)))
801
+
802
+ def test_mat44_float_args_precision(self):
803
+ a_values = (
804
+ 1.23,
805
+ 2.34,
806
+ 3.45,
807
+ 4.56,
808
+ 5.67,
809
+ 6.78,
810
+ 7.89,
811
+ 8.90,
812
+ 9.01,
813
+ 10.12,
814
+ 11.23,
815
+ 12.34,
816
+ 13.45,
817
+ 14.56,
818
+ 15.67,
819
+ 16.78,
820
+ )
821
+ a_values_2d = (a_values[0:4], a_values[4:8], a_values[8:12], a_values[12:16])
822
+ b_value = 0.12
823
+ expected_00 = 0.14759999999999998122
824
+ expected_01 = 0.28079999999999999405
825
+ expected_02 = 0.41399999999999997913
826
+ expected_03 = 0.54719999999999990870
827
+ expected_10 = 0.68040000000000000480
828
+ expected_11 = 0.81359999999999998987
829
+ expected_12 = 0.94679999999999997495
830
+ expected_13 = 1.06800000000000006040
831
+ expected_20 = 1.08119999999999993889
832
+ expected_21 = 1.21439999999999992397
833
+ expected_22 = 1.34759999999999990905
834
+ expected_23 = 1.48079999999999989413
835
+ expected_30 = 1.61399999999999987921
836
+ expected_31 = 1.74720000000000008633
837
+ expected_32 = 1.88039999999999984936
838
+ expected_33 = 2.01360000000000027853
839
+
840
+ result = wp.mul(wp.mat44d(*a_values), wp.float64(b_value))
841
+ self.assertAlmostEqual(result[0][0], expected_00, places=12)
842
+ self.assertAlmostEqual(result[0][1], expected_01, places=12)
843
+ self.assertAlmostEqual(result[0][2], expected_02, places=12)
844
+ self.assertAlmostEqual(result[0][3], expected_03, places=12)
845
+ self.assertAlmostEqual(result[1][0], expected_10, places=12)
846
+ self.assertAlmostEqual(result[1][1], expected_11, places=12)
847
+ self.assertAlmostEqual(result[1][2], expected_12, places=12)
848
+ self.assertAlmostEqual(result[1][3], expected_13, places=12)
849
+ self.assertAlmostEqual(result[2][0], expected_20, places=12)
850
+ self.assertAlmostEqual(result[2][1], expected_21, places=12)
851
+ self.assertAlmostEqual(result[2][2], expected_22, places=12)
852
+ self.assertAlmostEqual(result[2][3], expected_23, places=12)
853
+ self.assertAlmostEqual(result[3][0], expected_30, places=12)
854
+ self.assertAlmostEqual(result[3][1], expected_31, places=12)
855
+ self.assertAlmostEqual(result[3][2], expected_32, places=12)
856
+ self.assertAlmostEqual(result[3][3], expected_33, places=12)
857
+
858
+ result = wp.mul(wp.mat44f(*a_values), wp.float32(b_value))
859
+ self.assertNotAlmostEqual(result[0][0], expected_00, places=12)
860
+ self.assertNotAlmostEqual(result[0][1], expected_01, places=12)
861
+ self.assertNotAlmostEqual(result[0][2], expected_02, places=12)
862
+ self.assertNotAlmostEqual(result[0][3], expected_03, places=12)
863
+ self.assertNotAlmostEqual(result[1][0], expected_10, places=12)
864
+ self.assertNotAlmostEqual(result[1][1], expected_11, places=12)
865
+ self.assertNotAlmostEqual(result[1][2], expected_12, places=12)
866
+ self.assertNotAlmostEqual(result[1][3], expected_13, places=12)
867
+ self.assertNotAlmostEqual(result[2][0], expected_20, places=12)
868
+ self.assertNotAlmostEqual(result[2][1], expected_21, places=12)
869
+ self.assertNotAlmostEqual(result[2][2], expected_22, places=12)
870
+ self.assertNotAlmostEqual(result[2][3], expected_23, places=12)
871
+ self.assertNotAlmostEqual(result[3][0], expected_30, places=12)
872
+ self.assertNotAlmostEqual(result[3][1], expected_31, places=12)
873
+ self.assertNotAlmostEqual(result[3][2], expected_32, places=12)
874
+ self.assertNotAlmostEqual(result[3][3], expected_33, places=12)
875
+ self.assertAlmostEqual(result[0][0], expected_00, places=5)
876
+ self.assertAlmostEqual(result[0][1], expected_01, places=5)
877
+ self.assertAlmostEqual(result[0][2], expected_02, places=5)
878
+ self.assertAlmostEqual(result[0][3], expected_03, places=5)
879
+ self.assertAlmostEqual(result[1][0], expected_10, places=5)
880
+ self.assertAlmostEqual(result[1][1], expected_11, places=5)
881
+ self.assertAlmostEqual(result[1][2], expected_12, places=5)
882
+ self.assertAlmostEqual(result[1][3], expected_13, places=5)
883
+ self.assertAlmostEqual(result[2][0], expected_20, places=5)
884
+ self.assertAlmostEqual(result[2][1], expected_21, places=5)
885
+ self.assertAlmostEqual(result[2][2], expected_22, places=5)
886
+ self.assertAlmostEqual(result[2][3], expected_23, places=5)
887
+ self.assertAlmostEqual(result[3][0], expected_30, places=5)
888
+ self.assertAlmostEqual(result[3][1], expected_31, places=5)
889
+ self.assertAlmostEqual(result[3][2], expected_32, places=5)
890
+ self.assertAlmostEqual(result[3][3], expected_33, places=5)
891
+
892
+ result = wp.mul(wp.mat44h(*a_values), wp.float16(b_value))
893
+ self.assertNotAlmostEqual(result[0][0], expected_00, places=5)
894
+ self.assertNotAlmostEqual(result[0][1], expected_01, places=5)
895
+ self.assertNotAlmostEqual(result[0][2], expected_02, places=5)
896
+ self.assertNotAlmostEqual(result[0][3], expected_03, places=5)
897
+ self.assertNotAlmostEqual(result[1][0], expected_10, places=5)
898
+ self.assertNotAlmostEqual(result[1][1], expected_11, places=5)
899
+ self.assertNotAlmostEqual(result[1][2], expected_12, places=5)
900
+ self.assertNotAlmostEqual(result[1][3], expected_13, places=5)
901
+ self.assertNotAlmostEqual(result[2][0], expected_20, places=5)
902
+ self.assertNotAlmostEqual(result[2][1], expected_21, places=5)
903
+ self.assertNotAlmostEqual(result[2][2], expected_22, places=5)
904
+ self.assertNotAlmostEqual(result[2][3], expected_23, places=5)
905
+ self.assertNotAlmostEqual(result[3][0], expected_30, places=5)
906
+ self.assertNotAlmostEqual(result[3][1], expected_31, places=5)
907
+ self.assertNotAlmostEqual(result[3][2], expected_32, places=5)
908
+ self.assertNotAlmostEqual(result[3][3], expected_33, places=5)
909
+ self.assertAlmostEqual(result[0][0], expected_00, places=1)
910
+ self.assertAlmostEqual(result[0][1], expected_01, places=1)
911
+ self.assertAlmostEqual(result[0][2], expected_02, places=1)
912
+ self.assertAlmostEqual(result[0][3], expected_03, places=1)
913
+ self.assertAlmostEqual(result[1][0], expected_10, places=1)
914
+ self.assertAlmostEqual(result[1][1], expected_11, places=1)
915
+ self.assertAlmostEqual(result[1][2], expected_12, places=1)
916
+ self.assertAlmostEqual(result[1][3], expected_13, places=1)
917
+ self.assertAlmostEqual(result[2][0], expected_20, places=1)
918
+ self.assertAlmostEqual(result[2][1], expected_21, places=1)
919
+ self.assertAlmostEqual(result[2][2], expected_22, places=1)
920
+ self.assertAlmostEqual(result[2][3], expected_23, places=1)
921
+ self.assertAlmostEqual(result[3][0], expected_30, places=1)
922
+ self.assertAlmostEqual(result[3][1], expected_31, places=1)
923
+ self.assertAlmostEqual(result[3][2], expected_32, places=1)
924
+ self.assertAlmostEqual(result[3][3], expected_33, places=1)
925
+
926
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
927
+ self.assertEqual(wp.mul(a_values, b_value), wp.mul(wp.mat44f(*a_values), wp.float32(b_value)))
928
+ self.assertEqual(wp.mul(a_values_2d, b_value), wp.mul(wp.mat44f(*a_values), wp.float32(b_value)))
929
+
930
+ def test_vec2_arg_precision(self):
931
+ values = (1.23, 2.34)
932
+ expected = 2.64357712200722438922
933
+
934
+ result = wp.length(wp.vec2d(*values))
935
+ self.assertAlmostEqual(result, expected, places=12)
936
+
937
+ result = wp.length(wp.vec2f(*values))
938
+ self.assertNotAlmostEqual(result, expected, places=12)
939
+ self.assertAlmostEqual(result, expected, places=5)
940
+
941
+ result = wp.length(wp.vec2h(*values))
942
+ self.assertNotAlmostEqual(result, expected, places=5)
943
+ self.assertAlmostEqual(result, expected, places=1)
944
+
945
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
946
+ self.assertEqual(wp.length(values), wp.length(wp.vec2f(*values)))
947
+
948
+ def test_vec2_arg_overflow(self):
949
+ values = (-1234567890, -1234567890)
950
+
951
+ self.assertEqual(wp.length_sq(wp.vec2b(*values)), -120)
952
+ self.assertEqual(wp.length_sq(wp.vec2s(*values)), -6008)
953
+ self.assertEqual(wp.length_sq(wp.vec2i(*values)), 608168072)
954
+ self.assertEqual(wp.length_sq(wp.vec2l(*values)), 3048315750038104200)
955
+
956
+ self.assertEqual(wp.length_sq(wp.vec2ub(*values)), 136)
957
+ self.assertEqual(wp.length_sq(wp.vec2us(*values)), 59528)
958
+ self.assertEqual(wp.length_sq(wp.vec2ui(*values)), 608168072)
959
+ self.assertEqual(wp.length_sq(wp.vec2ul(*values)), 3048315750038104200)
960
+
961
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
962
+ self.assertEqual(wp.length_sq(values), wp.length_sq(wp.vec2i(*values)))
963
+
964
+ def test_vec3_arg_precision(self):
965
+ values = (1.23, 2.34, 3.45)
966
+ expected = 4.34637780226247727455
967
+
968
+ result = wp.length(wp.vec3d(*values))
969
+ self.assertAlmostEqual(result, expected, places=12)
970
+
971
+ result = wp.length(wp.vec3f(*values))
972
+ self.assertNotAlmostEqual(result, expected, places=12)
973
+ self.assertAlmostEqual(result, expected, places=5)
974
+
975
+ result = wp.length(wp.vec3h(*values))
976
+ self.assertNotAlmostEqual(result, expected, places=5)
977
+ self.assertAlmostEqual(result, expected, places=1)
978
+
979
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
980
+ self.assertEqual(wp.length(values), wp.length(wp.vec3f(*values)))
981
+
982
+ def test_vec3_arg_overflow(self):
983
+ values = (-1234567890, -1234567890, -1234567890)
984
+
985
+ self.assertEqual(wp.length_sq(wp.vec3b(*values)), -52)
986
+ self.assertEqual(wp.length_sq(wp.vec3s(*values)), -9012)
987
+ self.assertEqual(wp.length_sq(wp.vec3i(*values)), 912252108)
988
+ self.assertEqual(wp.length_sq(wp.vec3l(*values)), 4572473625057156300)
989
+
990
+ self.assertEqual(wp.length_sq(wp.vec3ub(*values)), 204)
991
+ self.assertEqual(wp.length_sq(wp.vec3us(*values)), 56524)
992
+ self.assertEqual(wp.length_sq(wp.vec3ui(*values)), 912252108)
993
+ self.assertEqual(wp.length_sq(wp.vec3ul(*values)), 4572473625057156300)
994
+
995
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
996
+ self.assertEqual(wp.length_sq(values), wp.length_sq(wp.vec3i(*values)))
997
+
998
+ def test_vec4_arg_precision(self):
999
+ values = (1.23, 2.34, 3.45, 4.56)
1000
+ expected = 6.29957141399317777086
1001
+
1002
+ result = wp.length(wp.vec4d(*values))
1003
+ self.assertAlmostEqual(result, expected, places=12)
1004
+
1005
+ result = wp.length(wp.vec4f(*values))
1006
+ self.assertNotAlmostEqual(result, expected, places=12)
1007
+ self.assertAlmostEqual(result, expected, places=5)
1008
+
1009
+ result = wp.length(wp.vec4h(*values))
1010
+ self.assertNotAlmostEqual(result, expected, places=5)
1011
+ self.assertAlmostEqual(result, expected, places=1)
1012
+
1013
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
1014
+ self.assertEqual(wp.length(values), wp.length(wp.vec4f(*values)))
1015
+
1016
+ def test_vec4_arg_overflow(self):
1017
+ values = (-1234567890, -1234567890, -1234567890, -1234567890)
1018
+
1019
+ self.assertEqual(wp.length_sq(wp.vec4b(*values)), 16)
1020
+ self.assertEqual(wp.length_sq(wp.vec4s(*values)), -12016)
1021
+ self.assertEqual(wp.length_sq(wp.vec4i(*values)), 1216336144)
1022
+ self.assertEqual(wp.length_sq(wp.vec4l(*values)), 6096631500076208400)
1023
+
1024
+ self.assertEqual(wp.length_sq(wp.vec4ub(*values)), 16)
1025
+ self.assertEqual(wp.length_sq(wp.vec4us(*values)), 53520)
1026
+ self.assertEqual(wp.length_sq(wp.vec4ui(*values)), 1216336144)
1027
+ self.assertEqual(wp.length_sq(wp.vec4ul(*values)), 6096631500076208400)
1028
+
1029
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
1030
+ self.assertEqual(wp.length_sq(values), wp.length_sq(wp.vec4i(*values)))
1031
+
1032
+ def test_vec2_vec2_args_precision(self):
1033
+ a_values = (1.23, 2.34)
1034
+ b_values = (3.45, 4.56)
1035
+ expected = 14.91389999999999815827
1036
+
1037
+ result = wp.dot(wp.vec2d(*a_values), wp.vec2d(*b_values))
1038
+ self.assertAlmostEqual(result, expected, places=12)
1039
+
1040
+ result = wp.dot(wp.vec2f(*a_values), wp.vec2f(*b_values))
1041
+ self.assertNotAlmostEqual(result, expected, places=12)
1042
+ self.assertAlmostEqual(result, expected, places=5)
1043
+
1044
+ result = wp.dot(wp.vec2h(*a_values), wp.vec2h(*b_values))
1045
+ self.assertNotAlmostEqual(result, expected, places=5)
1046
+ self.assertAlmostEqual(result, expected, places=1)
1047
+
1048
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
1049
+ self.assertEqual(wp.dot(a_values, b_values), wp.dot(wp.vec2f(*a_values), wp.vec2f(*b_values)))
1050
+
1051
+ def test_vec2_vec2_args_overflow(self):
1052
+ values = (-1234567890, -1234567890)
1053
+
1054
+ self.assertEqual(wp.dot(wp.vec2b(*values), wp.vec2b(*values)), -120)
1055
+ self.assertEqual(wp.dot(wp.vec2s(*values), wp.vec2s(*values)), -6008)
1056
+ self.assertEqual(wp.dot(wp.vec2i(*values), wp.vec2i(*values)), 608168072)
1057
+ self.assertEqual(wp.dot(wp.vec2l(*values), wp.vec2l(*values)), 3048315750038104200)
1058
+
1059
+ self.assertEqual(wp.dot(wp.vec2ub(*values), wp.vec2ub(*values)), 136)
1060
+ self.assertEqual(wp.dot(wp.vec2us(*values), wp.vec2us(*values)), 59528)
1061
+ self.assertEqual(wp.dot(wp.vec2ui(*values), wp.vec2ui(*values)), 608168072)
1062
+ self.assertEqual(wp.dot(wp.vec2ul(*values), wp.vec2ul(*values)), 3048315750038104200)
1063
+
1064
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
1065
+ self.assertEqual(wp.dot(values, values), wp.dot(wp.vec2i(*values), wp.vec2i(*values)))
1066
+
1067
+ def test_vec3_vec3_args_precision(self):
1068
+ a_values = (1.23, 2.34, 3.45)
1069
+ b_values = (4.56, 5.67, 6.78)
1070
+ expected = 42.26760000000000161435
1071
+
1072
+ result = wp.dot(wp.vec3d(*a_values), wp.vec3d(*b_values))
1073
+ self.assertAlmostEqual(result, expected, places=12)
1074
+
1075
+ result = wp.dot(wp.vec3f(*a_values), wp.vec3f(*b_values))
1076
+ self.assertNotAlmostEqual(result, expected, places=12)
1077
+ self.assertAlmostEqual(result, expected, places=5)
1078
+
1079
+ result = wp.dot(wp.vec3h(*a_values), wp.vec3h(*b_values))
1080
+ self.assertNotAlmostEqual(result, expected, places=5)
1081
+ self.assertAlmostEqual(result, expected, places=1)
1082
+
1083
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
1084
+ self.assertEqual(wp.dot(a_values, b_values), wp.dot(wp.vec3f(*a_values), wp.vec3f(*b_values)))
1085
+
1086
+ def test_vec3_vec3_args_overflow(self):
1087
+ values = (-1234567890, -1234567890, -1234567890)
1088
+
1089
+ self.assertEqual(wp.dot(wp.vec3b(*values), wp.vec3b(*values)), -52)
1090
+ self.assertEqual(wp.dot(wp.vec3s(*values), wp.vec3s(*values)), -9012)
1091
+ self.assertEqual(wp.dot(wp.vec3i(*values), wp.vec3i(*values)), 912252108)
1092
+ self.assertEqual(wp.dot(wp.vec3l(*values), wp.vec3l(*values)), 4572473625057156300)
1093
+
1094
+ self.assertEqual(wp.dot(wp.vec3ub(*values), wp.vec3ub(*values)), 204)
1095
+ self.assertEqual(wp.dot(wp.vec3us(*values), wp.vec3us(*values)), 56524)
1096
+ self.assertEqual(wp.dot(wp.vec3ui(*values), wp.vec3ui(*values)), 912252108)
1097
+ self.assertEqual(wp.dot(wp.vec3ul(*values), wp.vec3ul(*values)), 4572473625057156300)
1098
+
1099
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
1100
+ self.assertEqual(wp.dot(values, values), wp.dot(wp.vec3i(*values), wp.vec3i(*values)))
1101
+
1102
+ def test_vec4_vec4_args_precision(self):
1103
+ a_values = (1.23, 2.34, 3.45, 4.56)
1104
+ b_values = (5.67, 6.78, 7.89, 8.90)
1105
+ expected = 90.64379999999999881766
1106
+
1107
+ result = wp.dot(wp.vec4d(*a_values), wp.vec4d(*b_values))
1108
+ self.assertAlmostEqual(result, expected, places=12)
1109
+
1110
+ result = wp.dot(wp.vec4f(*a_values), wp.vec4f(*b_values))
1111
+ self.assertNotAlmostEqual(result, expected, places=12)
1112
+ self.assertAlmostEqual(result, expected, places=5)
1113
+
1114
+ result = wp.dot(wp.vec4h(*a_values), wp.vec4h(*b_values))
1115
+ self.assertNotAlmostEqual(result, expected, places=5)
1116
+ self.assertAlmostEqual(result, expected, places=1)
1117
+
1118
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
1119
+ self.assertEqual(wp.dot(a_values, b_values), wp.dot(wp.vec4f(*a_values), wp.vec4f(*b_values)))
1120
+
1121
+ def test_vec4_vec4_args_overflow(self):
1122
+ values = (-1234567890, -1234567890, -1234567890, -1234567890)
1123
+
1124
+ self.assertEqual(wp.dot(wp.vec4b(*values), wp.vec4b(*values)), 16)
1125
+ self.assertEqual(wp.dot(wp.vec4s(*values), wp.vec4s(*values)), -12016)
1126
+ self.assertEqual(wp.dot(wp.vec4i(*values), wp.vec4i(*values)), 1216336144)
1127
+ self.assertEqual(wp.dot(wp.vec4l(*values), wp.vec4l(*values)), 6096631500076208400)
1128
+
1129
+ self.assertEqual(wp.dot(wp.vec4ub(*values), wp.vec4ub(*values)), 16)
1130
+ self.assertEqual(wp.dot(wp.vec4us(*values), wp.vec4us(*values)), 53520)
1131
+ self.assertEqual(wp.dot(wp.vec4ui(*values), wp.vec4ui(*values)), 1216336144)
1132
+ self.assertEqual(wp.dot(wp.vec4ul(*values), wp.vec4ul(*values)), 6096631500076208400)
1133
+
1134
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
1135
+ self.assertEqual(wp.dot(values, values), wp.dot(wp.vec4i(*values), wp.vec4i(*values)))
1136
+
1137
+ def test_vec2_float_args_precision(self):
1138
+ a_values = (1.23, 2.34)
1139
+ b_value = 3.45
1140
+ expected_x = 4.24350000000000004974
1141
+ expected_y = 8.07300000000000039790
1142
+
1143
+ result = wp.mul(wp.vec2d(*a_values), wp.float64(b_value))
1144
+ self.assertAlmostEqual(result[0], expected_x, places=12)
1145
+ self.assertAlmostEqual(result[1], expected_y, places=12)
1146
+
1147
+ result = wp.mul(wp.vec2f(*a_values), wp.float32(b_value))
1148
+ self.assertNotAlmostEqual(result[0], expected_x, places=12)
1149
+ self.assertNotAlmostEqual(result[1], expected_y, places=12)
1150
+ self.assertAlmostEqual(result[0], expected_x, places=5)
1151
+ self.assertAlmostEqual(result[1], expected_y, places=5)
1152
+
1153
+ result = wp.mul(wp.vec2h(*a_values), wp.float16(b_value))
1154
+ self.assertNotAlmostEqual(result[0], expected_x, places=5)
1155
+ self.assertNotAlmostEqual(result[1], expected_y, places=5)
1156
+ self.assertAlmostEqual(result[0], expected_x, places=1)
1157
+ self.assertAlmostEqual(result[1], expected_y, places=1)
1158
+
1159
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
1160
+ self.assertEqual(wp.mul(a_values, b_value), wp.mul(wp.vec2f(*a_values), wp.float32(b_value)))
1161
+
1162
+ def test_vec3_float_args_precision(self):
1163
+ a_values = (1.23, 2.34, 3.45)
1164
+ b_value = 4.56
1165
+ expected_x = 5.60879999999999956373
1166
+ expected_y = 10.67039999999999899671
1167
+ expected_z = 15.73199999999999931788
1168
+
1169
+ result = wp.mul(wp.vec3d(*a_values), wp.float64(b_value))
1170
+ self.assertAlmostEqual(result[0], expected_x, places=12)
1171
+ self.assertAlmostEqual(result[1], expected_y, places=12)
1172
+ self.assertAlmostEqual(result[2], expected_z, places=12)
1173
+
1174
+ result = wp.mul(wp.vec3f(*a_values), wp.float32(b_value))
1175
+ self.assertNotAlmostEqual(result[0], expected_x, places=12)
1176
+ self.assertNotAlmostEqual(result[1], expected_y, places=12)
1177
+ self.assertNotAlmostEqual(result[2], expected_z, places=12)
1178
+ self.assertAlmostEqual(result[0], expected_x, places=5)
1179
+ self.assertAlmostEqual(result[1], expected_y, places=5)
1180
+ self.assertAlmostEqual(result[2], expected_z, places=5)
1181
+
1182
+ result = wp.mul(wp.vec3h(*a_values), wp.float16(b_value))
1183
+ self.assertNotAlmostEqual(result[0], expected_x, places=5)
1184
+ self.assertNotAlmostEqual(result[1], expected_y, places=5)
1185
+ self.assertNotAlmostEqual(result[2], expected_z, places=5)
1186
+ self.assertAlmostEqual(result[0], expected_x, places=1)
1187
+ self.assertAlmostEqual(result[1], expected_y, places=1)
1188
+ self.assertAlmostEqual(result[2], expected_z, places=1)
1189
+
1190
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
1191
+ self.assertEqual(wp.mul(a_values, b_value), wp.mul(wp.vec3f(*a_values), wp.float32(b_value)))
1192
+
1193
+ def test_vec4_float_args_precision(self):
1194
+ a_values = (1.23, 2.34, 3.45, 4.56)
1195
+ b_value = 5.67
1196
+ expected_x = 6.97409999999999996589
1197
+ expected_y = 13.26779999999999937188
1198
+ expected_z = 19.56150000000000233058
1199
+ expected_w = 25.85519999999999640750
1200
+
1201
+ result = wp.mul(wp.vec4d(*a_values), wp.float64(b_value))
1202
+ self.assertAlmostEqual(result[0], expected_x, places=12)
1203
+ self.assertAlmostEqual(result[1], expected_y, places=12)
1204
+ self.assertAlmostEqual(result[2], expected_z, places=12)
1205
+ self.assertAlmostEqual(result[3], expected_w, places=12)
1206
+
1207
+ result = wp.mul(wp.vec4f(*a_values), wp.float32(b_value))
1208
+ self.assertNotAlmostEqual(result[0], expected_x, places=12)
1209
+ self.assertNotAlmostEqual(result[1], expected_y, places=12)
1210
+ self.assertNotAlmostEqual(result[2], expected_z, places=12)
1211
+ self.assertNotAlmostEqual(result[3], expected_w, places=12)
1212
+ self.assertAlmostEqual(result[0], expected_x, places=5)
1213
+ self.assertAlmostEqual(result[1], expected_y, places=5)
1214
+ self.assertAlmostEqual(result[2], expected_z, places=5)
1215
+ self.assertAlmostEqual(result[3], expected_w, places=5)
1216
+
1217
+ result = wp.mul(wp.vec4h(*a_values), wp.float16(b_value))
1218
+ self.assertNotAlmostEqual(result[0], expected_x, places=5)
1219
+ self.assertNotAlmostEqual(result[1], expected_y, places=5)
1220
+ self.assertNotAlmostEqual(result[2], expected_z, places=5)
1221
+ self.assertNotAlmostEqual(result[3], expected_w, places=5)
1222
+ self.assertAlmostEqual(result[0], expected_x, places=1)
1223
+ self.assertAlmostEqual(result[1], expected_y, places=1)
1224
+ self.assertAlmostEqual(result[2], expected_z, places=1)
1225
+ self.assertAlmostEqual(result[3], expected_w, places=1)
1226
+
1227
+ with open(os.devnull, "w") as f, contextlib.redirect_stdout(f):
1228
+ self.assertEqual(wp.mul(a_values, b_value), wp.mul(wp.vec4f(*a_values), wp.float32(b_value)))
1229
+
1230
+
1231
+ for dtype in wp.types.int_types:
1232
+ add_function_test(
1233
+ TestBuiltinsResolution,
1234
+ f"test_int_arg_support_{dtype.__name__}",
1235
+ test_int_arg_support,
1236
+ dtype=dtype,
1237
+ )
1238
+ add_function_test(
1239
+ TestBuiltinsResolution,
1240
+ f"test_int_int_args_support_{dtype.__name__}",
1241
+ test_int_int_args_support,
1242
+ dtype=dtype,
1243
+ )
1244
+
1245
+ for dtype in wp.types.float_types:
1246
+ add_function_test(
1247
+ TestBuiltinsResolution,
1248
+ f"test_float_arg_support_{dtype.__name__}",
1249
+ test_float_arg_support,
1250
+ dtype=dtype,
1251
+ )
1252
+ add_function_test(
1253
+ TestBuiltinsResolution,
1254
+ f"test_mat_arg_support_{dtype.__name__}",
1255
+ test_mat_arg_support,
1256
+ dtype=dtype,
1257
+ )
1258
+ add_function_test(
1259
+ TestBuiltinsResolution,
1260
+ f"test_mat_mat_args_support_{dtype.__name__}",
1261
+ test_mat_mat_args_support,
1262
+ dtype=dtype,
1263
+ )
1264
+ add_function_test(
1265
+ TestBuiltinsResolution,
1266
+ f"test_mat_float_args_support_{dtype.__name__}",
1267
+ test_mat_float_args_support,
1268
+ dtype=dtype,
1269
+ )
1270
+ add_function_test(
1271
+ TestBuiltinsResolution,
1272
+ f"test_vec_arg_support_{dtype.__name__}",
1273
+ test_vec_arg_support,
1274
+ dtype=dtype,
1275
+ )
1276
+ add_function_test(
1277
+ TestBuiltinsResolution,
1278
+ f"test_vec_vec_args_support_{dtype.__name__}",
1279
+ test_vec_vec_args_support,
1280
+ dtype=dtype,
1281
+ )
1282
+ add_function_test(
1283
+ TestBuiltinsResolution,
1284
+ f"test_vec_float_args_support_{dtype.__name__}",
1285
+ test_vec_float_args_support,
1286
+ dtype=dtype,
1287
+ )
1288
+
1289
+
1290
+ if __name__ == "__main__":
1291
+ wp.build.clear_kernel_cache()
1292
+ unittest.main(verbosity=2)