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