warp-lang 1.0.2__py3-none-manylinux2014_x86_64.whl → 1.1.0__py3-none-manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of warp-lang might be problematic. Click here for more details.

Files changed (346) hide show
  1. warp/__init__.py +108 -97
  2. warp/__init__.pyi +1 -1
  3. warp/bin/warp-clang.so +0 -0
  4. warp/bin/warp.so +0 -0
  5. warp/build.py +115 -113
  6. warp/build_dll.py +383 -375
  7. warp/builtins.py +3425 -3354
  8. warp/codegen.py +2878 -2792
  9. warp/config.py +40 -36
  10. warp/constants.py +45 -45
  11. warp/context.py +5194 -5102
  12. warp/dlpack.py +442 -442
  13. warp/examples/__init__.py +16 -16
  14. warp/examples/assets/bear.usd +0 -0
  15. warp/examples/assets/bunny.usd +0 -0
  16. warp/examples/assets/cartpole.urdf +110 -110
  17. warp/examples/assets/crazyflie.usd +0 -0
  18. warp/examples/assets/cube.usd +0 -0
  19. warp/examples/assets/nv_ant.xml +92 -92
  20. warp/examples/assets/nv_humanoid.xml +183 -183
  21. warp/examples/assets/quadruped.urdf +267 -267
  22. warp/examples/assets/rocks.nvdb +0 -0
  23. warp/examples/assets/rocks.usd +0 -0
  24. warp/examples/assets/sphere.usd +0 -0
  25. warp/examples/benchmarks/benchmark_api.py +383 -383
  26. warp/examples/benchmarks/benchmark_cloth.py +278 -277
  27. warp/examples/benchmarks/benchmark_cloth_cupy.py +88 -88
  28. warp/examples/benchmarks/benchmark_cloth_jax.py +97 -100
  29. warp/examples/benchmarks/benchmark_cloth_numba.py +146 -142
  30. warp/examples/benchmarks/benchmark_cloth_numpy.py +77 -77
  31. warp/examples/benchmarks/benchmark_cloth_pytorch.py +86 -86
  32. warp/examples/benchmarks/benchmark_cloth_taichi.py +112 -112
  33. warp/examples/benchmarks/benchmark_cloth_warp.py +146 -146
  34. warp/examples/benchmarks/benchmark_launches.py +295 -295
  35. warp/examples/browse.py +29 -29
  36. warp/examples/core/example_dem.py +234 -219
  37. warp/examples/core/example_fluid.py +293 -267
  38. warp/examples/core/example_graph_capture.py +144 -126
  39. warp/examples/core/example_marching_cubes.py +188 -174
  40. warp/examples/core/example_mesh.py +174 -155
  41. warp/examples/core/example_mesh_intersect.py +205 -193
  42. warp/examples/core/example_nvdb.py +176 -170
  43. warp/examples/core/example_raycast.py +105 -90
  44. warp/examples/core/example_raymarch.py +199 -178
  45. warp/examples/core/example_render_opengl.py +185 -141
  46. warp/examples/core/example_sph.py +405 -387
  47. warp/examples/core/example_torch.py +222 -181
  48. warp/examples/core/example_wave.py +263 -248
  49. warp/examples/fem/bsr_utils.py +378 -380
  50. warp/examples/fem/example_apic_fluid.py +407 -389
  51. warp/examples/fem/example_convection_diffusion.py +182 -168
  52. warp/examples/fem/example_convection_diffusion_dg.py +219 -209
  53. warp/examples/fem/example_convection_diffusion_dg0.py +204 -194
  54. warp/examples/fem/example_deformed_geometry.py +177 -159
  55. warp/examples/fem/example_diffusion.py +201 -173
  56. warp/examples/fem/example_diffusion_3d.py +177 -152
  57. warp/examples/fem/example_diffusion_mgpu.py +221 -214
  58. warp/examples/fem/example_mixed_elasticity.py +244 -222
  59. warp/examples/fem/example_navier_stokes.py +259 -243
  60. warp/examples/fem/example_stokes.py +220 -192
  61. warp/examples/fem/example_stokes_transfer.py +265 -249
  62. warp/examples/fem/mesh_utils.py +133 -109
  63. warp/examples/fem/plot_utils.py +292 -287
  64. warp/examples/optim/example_bounce.py +260 -246
  65. warp/examples/optim/example_cloth_throw.py +222 -209
  66. warp/examples/optim/example_diffray.py +566 -536
  67. warp/examples/optim/example_drone.py +864 -835
  68. warp/examples/optim/example_inverse_kinematics.py +176 -168
  69. warp/examples/optim/example_inverse_kinematics_torch.py +185 -169
  70. warp/examples/optim/example_spring_cage.py +239 -231
  71. warp/examples/optim/example_trajectory.py +223 -199
  72. warp/examples/optim/example_walker.py +306 -293
  73. warp/examples/sim/example_cartpole.py +139 -129
  74. warp/examples/sim/example_cloth.py +196 -186
  75. warp/examples/sim/example_granular.py +124 -111
  76. warp/examples/sim/example_granular_collision_sdf.py +197 -186
  77. warp/examples/sim/example_jacobian_ik.py +236 -214
  78. warp/examples/sim/example_particle_chain.py +118 -105
  79. warp/examples/sim/example_quadruped.py +193 -180
  80. warp/examples/sim/example_rigid_chain.py +197 -187
  81. warp/examples/sim/example_rigid_contact.py +189 -177
  82. warp/examples/sim/example_rigid_force.py +127 -125
  83. warp/examples/sim/example_rigid_gyroscopic.py +109 -95
  84. warp/examples/sim/example_rigid_soft_contact.py +134 -122
  85. warp/examples/sim/example_soft_body.py +190 -177
  86. warp/fabric.py +337 -335
  87. warp/fem/__init__.py +60 -27
  88. warp/fem/cache.py +401 -388
  89. warp/fem/dirichlet.py +178 -179
  90. warp/fem/domain.py +262 -263
  91. warp/fem/field/__init__.py +100 -101
  92. warp/fem/field/field.py +148 -149
  93. warp/fem/field/nodal_field.py +298 -299
  94. warp/fem/field/restriction.py +22 -21
  95. warp/fem/field/test.py +180 -181
  96. warp/fem/field/trial.py +183 -183
  97. warp/fem/geometry/__init__.py +15 -19
  98. warp/fem/geometry/closest_point.py +69 -70
  99. warp/fem/geometry/deformed_geometry.py +270 -271
  100. warp/fem/geometry/element.py +744 -744
  101. warp/fem/geometry/geometry.py +184 -186
  102. warp/fem/geometry/grid_2d.py +380 -373
  103. warp/fem/geometry/grid_3d.py +441 -435
  104. warp/fem/geometry/hexmesh.py +953 -953
  105. warp/fem/geometry/partition.py +374 -376
  106. warp/fem/geometry/quadmesh_2d.py +532 -532
  107. warp/fem/geometry/tetmesh.py +840 -840
  108. warp/fem/geometry/trimesh_2d.py +577 -577
  109. warp/fem/integrate.py +1630 -1615
  110. warp/fem/operator.py +190 -191
  111. warp/fem/polynomial.py +214 -213
  112. warp/fem/quadrature/__init__.py +2 -2
  113. warp/fem/quadrature/pic_quadrature.py +243 -245
  114. warp/fem/quadrature/quadrature.py +295 -294
  115. warp/fem/space/__init__.py +294 -292
  116. warp/fem/space/basis_space.py +488 -489
  117. warp/fem/space/collocated_function_space.py +100 -105
  118. warp/fem/space/dof_mapper.py +236 -236
  119. warp/fem/space/function_space.py +148 -145
  120. warp/fem/space/grid_2d_function_space.py +267 -267
  121. warp/fem/space/grid_3d_function_space.py +305 -306
  122. warp/fem/space/hexmesh_function_space.py +350 -352
  123. warp/fem/space/partition.py +350 -350
  124. warp/fem/space/quadmesh_2d_function_space.py +368 -369
  125. warp/fem/space/restriction.py +158 -160
  126. warp/fem/space/shape/__init__.py +13 -15
  127. warp/fem/space/shape/cube_shape_function.py +738 -738
  128. warp/fem/space/shape/shape_function.py +102 -103
  129. warp/fem/space/shape/square_shape_function.py +611 -611
  130. warp/fem/space/shape/tet_shape_function.py +565 -567
  131. warp/fem/space/shape/triangle_shape_function.py +429 -429
  132. warp/fem/space/tetmesh_function_space.py +294 -292
  133. warp/fem/space/topology.py +297 -295
  134. warp/fem/space/trimesh_2d_function_space.py +223 -221
  135. warp/fem/types.py +77 -77
  136. warp/fem/utils.py +495 -495
  137. warp/jax.py +166 -141
  138. warp/jax_experimental.py +341 -339
  139. warp/native/array.h +1072 -1025
  140. warp/native/builtin.h +1560 -1560
  141. warp/native/bvh.cpp +398 -398
  142. warp/native/bvh.cu +525 -525
  143. warp/native/bvh.h +429 -429
  144. warp/native/clang/clang.cpp +495 -464
  145. warp/native/crt.cpp +31 -31
  146. warp/native/crt.h +334 -334
  147. warp/native/cuda_crt.h +1049 -1049
  148. warp/native/cuda_util.cpp +549 -540
  149. warp/native/cuda_util.h +288 -203
  150. warp/native/cutlass_gemm.cpp +34 -34
  151. warp/native/cutlass_gemm.cu +372 -372
  152. warp/native/error.cpp +66 -66
  153. warp/native/error.h +27 -27
  154. warp/native/fabric.h +228 -228
  155. warp/native/hashgrid.cpp +301 -278
  156. warp/native/hashgrid.cu +78 -77
  157. warp/native/hashgrid.h +227 -227
  158. warp/native/initializer_array.h +32 -32
  159. warp/native/intersect.h +1204 -1204
  160. warp/native/intersect_adj.h +365 -365
  161. warp/native/intersect_tri.h +322 -322
  162. warp/native/marching.cpp +2 -2
  163. warp/native/marching.cu +497 -497
  164. warp/native/marching.h +2 -2
  165. warp/native/mat.h +1498 -1498
  166. warp/native/matnn.h +333 -333
  167. warp/native/mesh.cpp +203 -203
  168. warp/native/mesh.cu +293 -293
  169. warp/native/mesh.h +1887 -1887
  170. warp/native/nanovdb/NanoVDB.h +4782 -4782
  171. warp/native/nanovdb/PNanoVDB.h +2553 -2553
  172. warp/native/nanovdb/PNanoVDBWrite.h +294 -294
  173. warp/native/noise.h +850 -850
  174. warp/native/quat.h +1084 -1084
  175. warp/native/rand.h +299 -299
  176. warp/native/range.h +108 -108
  177. warp/native/reduce.cpp +156 -156
  178. warp/native/reduce.cu +348 -348
  179. warp/native/runlength_encode.cpp +61 -61
  180. warp/native/runlength_encode.cu +46 -46
  181. warp/native/scan.cpp +30 -30
  182. warp/native/scan.cu +36 -36
  183. warp/native/scan.h +7 -7
  184. warp/native/solid_angle.h +442 -442
  185. warp/native/sort.cpp +94 -94
  186. warp/native/sort.cu +97 -97
  187. warp/native/sort.h +14 -14
  188. warp/native/sparse.cpp +337 -337
  189. warp/native/sparse.cu +544 -544
  190. warp/native/spatial.h +630 -630
  191. warp/native/svd.h +562 -562
  192. warp/native/temp_buffer.h +30 -30
  193. warp/native/vec.h +1132 -1132
  194. warp/native/volume.cpp +297 -297
  195. warp/native/volume.cu +32 -32
  196. warp/native/volume.h +538 -538
  197. warp/native/volume_builder.cu +425 -425
  198. warp/native/volume_builder.h +19 -19
  199. warp/native/warp.cpp +1057 -1052
  200. warp/native/warp.cu +2943 -2828
  201. warp/native/warp.h +313 -305
  202. warp/optim/__init__.py +9 -9
  203. warp/optim/adam.py +120 -120
  204. warp/optim/linear.py +1104 -939
  205. warp/optim/sgd.py +104 -92
  206. warp/render/__init__.py +10 -10
  207. warp/render/render_opengl.py +3217 -3204
  208. warp/render/render_usd.py +768 -749
  209. warp/render/utils.py +152 -150
  210. warp/sim/__init__.py +52 -59
  211. warp/sim/articulation.py +685 -685
  212. warp/sim/collide.py +1594 -1590
  213. warp/sim/import_mjcf.py +489 -481
  214. warp/sim/import_snu.py +220 -221
  215. warp/sim/import_urdf.py +536 -516
  216. warp/sim/import_usd.py +887 -881
  217. warp/sim/inertia.py +316 -317
  218. warp/sim/integrator.py +234 -233
  219. warp/sim/integrator_euler.py +1956 -1956
  220. warp/sim/integrator_featherstone.py +1910 -1991
  221. warp/sim/integrator_xpbd.py +3294 -3312
  222. warp/sim/model.py +4473 -4314
  223. warp/sim/particles.py +113 -112
  224. warp/sim/render.py +417 -403
  225. warp/sim/utils.py +413 -410
  226. warp/sparse.py +1227 -1227
  227. warp/stubs.py +2109 -2469
  228. warp/tape.py +1162 -225
  229. warp/tests/__init__.py +1 -1
  230. warp/tests/__main__.py +4 -4
  231. warp/tests/assets/torus.usda +105 -105
  232. warp/tests/aux_test_class_kernel.py +26 -26
  233. warp/tests/aux_test_compile_consts_dummy.py +10 -10
  234. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -21
  235. warp/tests/aux_test_dependent.py +22 -22
  236. warp/tests/aux_test_grad_customs.py +23 -23
  237. warp/tests/aux_test_reference.py +11 -11
  238. warp/tests/aux_test_reference_reference.py +10 -10
  239. warp/tests/aux_test_square.py +17 -17
  240. warp/tests/aux_test_unresolved_func.py +14 -14
  241. warp/tests/aux_test_unresolved_symbol.py +14 -14
  242. warp/tests/disabled_kinematics.py +239 -239
  243. warp/tests/run_coverage_serial.py +31 -31
  244. warp/tests/test_adam.py +157 -157
  245. warp/tests/test_arithmetic.py +1124 -1124
  246. warp/tests/test_array.py +2417 -2326
  247. warp/tests/test_array_reduce.py +150 -150
  248. warp/tests/test_async.py +668 -656
  249. warp/tests/test_atomic.py +141 -141
  250. warp/tests/test_bool.py +204 -149
  251. warp/tests/test_builtins_resolution.py +1292 -1292
  252. warp/tests/test_bvh.py +164 -171
  253. warp/tests/test_closest_point_edge_edge.py +228 -228
  254. warp/tests/test_codegen.py +566 -553
  255. warp/tests/test_compile_consts.py +97 -101
  256. warp/tests/test_conditional.py +246 -246
  257. warp/tests/test_copy.py +232 -215
  258. warp/tests/test_ctypes.py +632 -632
  259. warp/tests/test_dense.py +67 -67
  260. warp/tests/test_devices.py +91 -98
  261. warp/tests/test_dlpack.py +530 -529
  262. warp/tests/test_examples.py +400 -378
  263. warp/tests/test_fabricarray.py +955 -955
  264. warp/tests/test_fast_math.py +62 -54
  265. warp/tests/test_fem.py +1277 -1278
  266. warp/tests/test_fp16.py +130 -130
  267. warp/tests/test_func.py +338 -337
  268. warp/tests/test_generics.py +571 -571
  269. warp/tests/test_grad.py +746 -640
  270. warp/tests/test_grad_customs.py +333 -336
  271. warp/tests/test_hash_grid.py +210 -164
  272. warp/tests/test_import.py +39 -39
  273. warp/tests/test_indexedarray.py +1134 -1134
  274. warp/tests/test_intersect.py +67 -67
  275. warp/tests/test_jax.py +307 -307
  276. warp/tests/test_large.py +167 -164
  277. warp/tests/test_launch.py +354 -354
  278. warp/tests/test_lerp.py +261 -261
  279. warp/tests/test_linear_solvers.py +191 -171
  280. warp/tests/test_lvalue.py +421 -493
  281. warp/tests/test_marching_cubes.py +65 -65
  282. warp/tests/test_mat.py +1801 -1827
  283. warp/tests/test_mat_lite.py +115 -115
  284. warp/tests/test_mat_scalar_ops.py +2907 -2889
  285. warp/tests/test_math.py +126 -193
  286. warp/tests/test_matmul.py +500 -499
  287. warp/tests/test_matmul_lite.py +410 -410
  288. warp/tests/test_mempool.py +188 -190
  289. warp/tests/test_mesh.py +284 -324
  290. warp/tests/test_mesh_query_aabb.py +228 -241
  291. warp/tests/test_mesh_query_point.py +692 -702
  292. warp/tests/test_mesh_query_ray.py +292 -303
  293. warp/tests/test_mlp.py +276 -276
  294. warp/tests/test_model.py +110 -110
  295. warp/tests/test_modules_lite.py +39 -39
  296. warp/tests/test_multigpu.py +163 -163
  297. warp/tests/test_noise.py +248 -248
  298. warp/tests/test_operators.py +250 -250
  299. warp/tests/test_options.py +123 -125
  300. warp/tests/test_peer.py +133 -137
  301. warp/tests/test_pinned.py +78 -78
  302. warp/tests/test_print.py +54 -54
  303. warp/tests/test_quat.py +2086 -2086
  304. warp/tests/test_rand.py +288 -288
  305. warp/tests/test_reload.py +217 -217
  306. warp/tests/test_rounding.py +179 -179
  307. warp/tests/test_runlength_encode.py +190 -190
  308. warp/tests/test_sim_grad.py +243 -0
  309. warp/tests/test_sim_kinematics.py +91 -97
  310. warp/tests/test_smoothstep.py +168 -168
  311. warp/tests/test_snippet.py +305 -266
  312. warp/tests/test_sparse.py +468 -460
  313. warp/tests/test_spatial.py +2148 -2148
  314. warp/tests/test_streams.py +486 -473
  315. warp/tests/test_struct.py +710 -675
  316. warp/tests/test_tape.py +173 -148
  317. warp/tests/test_torch.py +743 -743
  318. warp/tests/test_transient_module.py +87 -87
  319. warp/tests/test_types.py +556 -659
  320. warp/tests/test_utils.py +490 -499
  321. warp/tests/test_vec.py +1264 -1268
  322. warp/tests/test_vec_lite.py +73 -73
  323. warp/tests/test_vec_scalar_ops.py +2099 -2099
  324. warp/tests/test_verify_fp.py +94 -94
  325. warp/tests/test_volume.py +737 -736
  326. warp/tests/test_volume_write.py +255 -265
  327. warp/tests/unittest_serial.py +37 -37
  328. warp/tests/unittest_suites.py +363 -359
  329. warp/tests/unittest_utils.py +603 -578
  330. warp/tests/unused_test_misc.py +71 -71
  331. warp/tests/walkthrough_debug.py +85 -85
  332. warp/thirdparty/appdirs.py +598 -598
  333. warp/thirdparty/dlpack.py +143 -143
  334. warp/thirdparty/unittest_parallel.py +566 -561
  335. warp/torch.py +321 -295
  336. warp/types.py +4504 -4450
  337. warp/utils.py +1008 -821
  338. {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/LICENSE.md +126 -126
  339. {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/METADATA +338 -400
  340. warp_lang-1.1.0.dist-info/RECORD +352 -0
  341. warp/examples/assets/cube.usda +0 -42
  342. warp/examples/assets/sphere.usda +0 -56
  343. warp/examples/assets/torus.usda +0 -105
  344. warp_lang-1.0.2.dist-info/RECORD +0 -352
  345. {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/WHEEL +0 -0
  346. {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/top_level.txt +0 -0
@@ -1,1292 +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)
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)