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