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

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

Potentially problematic release.


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

Files changed (346) hide show
  1. warp/__init__.py +108 -97
  2. warp/__init__.pyi +1 -1
  3. warp/bin/warp-clang.so +0 -0
  4. warp/bin/warp.so +0 -0
  5. warp/build.py +115 -113
  6. warp/build_dll.py +383 -375
  7. warp/builtins.py +3425 -3354
  8. warp/codegen.py +2878 -2792
  9. warp/config.py +40 -36
  10. warp/constants.py +45 -45
  11. warp/context.py +5194 -5102
  12. warp/dlpack.py +442 -442
  13. warp/examples/__init__.py +16 -16
  14. warp/examples/assets/bear.usd +0 -0
  15. warp/examples/assets/bunny.usd +0 -0
  16. warp/examples/assets/cartpole.urdf +110 -110
  17. warp/examples/assets/crazyflie.usd +0 -0
  18. warp/examples/assets/cube.usd +0 -0
  19. warp/examples/assets/nv_ant.xml +92 -92
  20. warp/examples/assets/nv_humanoid.xml +183 -183
  21. warp/examples/assets/quadruped.urdf +267 -267
  22. warp/examples/assets/rocks.nvdb +0 -0
  23. warp/examples/assets/rocks.usd +0 -0
  24. warp/examples/assets/sphere.usd +0 -0
  25. warp/examples/benchmarks/benchmark_api.py +383 -383
  26. warp/examples/benchmarks/benchmark_cloth.py +278 -279
  27. warp/examples/benchmarks/benchmark_cloth_cupy.py +88 -88
  28. warp/examples/benchmarks/benchmark_cloth_jax.py +97 -100
  29. warp/examples/benchmarks/benchmark_cloth_numba.py +146 -142
  30. warp/examples/benchmarks/benchmark_cloth_numpy.py +77 -77
  31. warp/examples/benchmarks/benchmark_cloth_pytorch.py +86 -86
  32. warp/examples/benchmarks/benchmark_cloth_taichi.py +112 -112
  33. warp/examples/benchmarks/benchmark_cloth_warp.py +146 -146
  34. warp/examples/benchmarks/benchmark_launches.py +295 -295
  35. warp/examples/browse.py +29 -28
  36. warp/examples/core/example_dem.py +234 -221
  37. warp/examples/core/example_fluid.py +293 -267
  38. warp/examples/core/example_graph_capture.py +144 -129
  39. warp/examples/core/example_marching_cubes.py +188 -176
  40. warp/examples/core/example_mesh.py +174 -154
  41. warp/examples/core/example_mesh_intersect.py +205 -193
  42. warp/examples/core/example_nvdb.py +176 -169
  43. warp/examples/core/example_raycast.py +105 -89
  44. warp/examples/core/example_raymarch.py +199 -178
  45. warp/examples/core/example_render_opengl.py +185 -141
  46. warp/examples/core/example_sph.py +405 -389
  47. warp/examples/core/example_torch.py +222 -181
  48. warp/examples/core/example_wave.py +263 -249
  49. warp/examples/fem/bsr_utils.py +378 -380
  50. warp/examples/fem/example_apic_fluid.py +407 -391
  51. warp/examples/fem/example_convection_diffusion.py +182 -168
  52. warp/examples/fem/example_convection_diffusion_dg.py +219 -209
  53. warp/examples/fem/example_convection_diffusion_dg0.py +204 -194
  54. warp/examples/fem/example_deformed_geometry.py +177 -159
  55. warp/examples/fem/example_diffusion.py +201 -173
  56. warp/examples/fem/example_diffusion_3d.py +177 -152
  57. warp/examples/fem/example_diffusion_mgpu.py +221 -214
  58. warp/examples/fem/example_mixed_elasticity.py +244 -222
  59. warp/examples/fem/example_navier_stokes.py +259 -243
  60. warp/examples/fem/example_stokes.py +220 -192
  61. warp/examples/fem/example_stokes_transfer.py +265 -249
  62. warp/examples/fem/mesh_utils.py +133 -109
  63. warp/examples/fem/plot_utils.py +292 -287
  64. warp/examples/optim/example_bounce.py +260 -248
  65. warp/examples/optim/example_cloth_throw.py +222 -210
  66. warp/examples/optim/example_diffray.py +566 -535
  67. warp/examples/optim/example_drone.py +864 -835
  68. warp/examples/optim/example_inverse_kinematics.py +176 -169
  69. warp/examples/optim/example_inverse_kinematics_torch.py +185 -170
  70. warp/examples/optim/example_spring_cage.py +239 -234
  71. warp/examples/optim/example_trajectory.py +223 -201
  72. warp/examples/optim/example_walker.py +306 -292
  73. warp/examples/sim/example_cartpole.py +139 -128
  74. warp/examples/sim/example_cloth.py +196 -184
  75. warp/examples/sim/example_granular.py +124 -113
  76. warp/examples/sim/example_granular_collision_sdf.py +197 -185
  77. warp/examples/sim/example_jacobian_ik.py +236 -213
  78. warp/examples/sim/example_particle_chain.py +118 -106
  79. warp/examples/sim/example_quadruped.py +193 -179
  80. warp/examples/sim/example_rigid_chain.py +197 -189
  81. warp/examples/sim/example_rigid_contact.py +189 -176
  82. warp/examples/sim/example_rigid_force.py +127 -126
  83. warp/examples/sim/example_rigid_gyroscopic.py +109 -97
  84. warp/examples/sim/example_rigid_soft_contact.py +134 -124
  85. warp/examples/sim/example_soft_body.py +190 -178
  86. warp/fabric.py +337 -335
  87. warp/fem/__init__.py +60 -27
  88. warp/fem/cache.py +401 -388
  89. warp/fem/dirichlet.py +178 -179
  90. warp/fem/domain.py +262 -263
  91. warp/fem/field/__init__.py +100 -101
  92. warp/fem/field/field.py +148 -149
  93. warp/fem/field/nodal_field.py +298 -299
  94. warp/fem/field/restriction.py +22 -21
  95. warp/fem/field/test.py +180 -181
  96. warp/fem/field/trial.py +183 -183
  97. warp/fem/geometry/__init__.py +15 -19
  98. warp/fem/geometry/closest_point.py +69 -70
  99. warp/fem/geometry/deformed_geometry.py +270 -271
  100. warp/fem/geometry/element.py +744 -744
  101. warp/fem/geometry/geometry.py +184 -186
  102. warp/fem/geometry/grid_2d.py +380 -373
  103. warp/fem/geometry/grid_3d.py +441 -435
  104. warp/fem/geometry/hexmesh.py +953 -953
  105. warp/fem/geometry/partition.py +374 -376
  106. warp/fem/geometry/quadmesh_2d.py +532 -532
  107. warp/fem/geometry/tetmesh.py +840 -840
  108. warp/fem/geometry/trimesh_2d.py +577 -577
  109. warp/fem/integrate.py +1630 -1615
  110. warp/fem/operator.py +190 -191
  111. warp/fem/polynomial.py +214 -213
  112. warp/fem/quadrature/__init__.py +2 -2
  113. warp/fem/quadrature/pic_quadrature.py +243 -245
  114. warp/fem/quadrature/quadrature.py +295 -294
  115. warp/fem/space/__init__.py +294 -292
  116. warp/fem/space/basis_space.py +488 -489
  117. warp/fem/space/collocated_function_space.py +100 -105
  118. warp/fem/space/dof_mapper.py +236 -236
  119. warp/fem/space/function_space.py +148 -145
  120. warp/fem/space/grid_2d_function_space.py +267 -267
  121. warp/fem/space/grid_3d_function_space.py +305 -306
  122. warp/fem/space/hexmesh_function_space.py +350 -352
  123. warp/fem/space/partition.py +350 -350
  124. warp/fem/space/quadmesh_2d_function_space.py +368 -369
  125. warp/fem/space/restriction.py +158 -160
  126. warp/fem/space/shape/__init__.py +13 -15
  127. warp/fem/space/shape/cube_shape_function.py +738 -738
  128. warp/fem/space/shape/shape_function.py +102 -103
  129. warp/fem/space/shape/square_shape_function.py +611 -611
  130. warp/fem/space/shape/tet_shape_function.py +565 -567
  131. warp/fem/space/shape/triangle_shape_function.py +429 -429
  132. warp/fem/space/tetmesh_function_space.py +294 -292
  133. warp/fem/space/topology.py +297 -295
  134. warp/fem/space/trimesh_2d_function_space.py +223 -221
  135. warp/fem/types.py +77 -77
  136. warp/fem/utils.py +495 -495
  137. warp/jax.py +166 -141
  138. warp/jax_experimental.py +341 -339
  139. warp/native/array.h +1072 -1025
  140. warp/native/builtin.h +1560 -1560
  141. warp/native/bvh.cpp +398 -398
  142. warp/native/bvh.cu +525 -525
  143. warp/native/bvh.h +429 -429
  144. warp/native/clang/clang.cpp +495 -464
  145. warp/native/crt.cpp +31 -31
  146. warp/native/crt.h +334 -334
  147. warp/native/cuda_crt.h +1049 -1049
  148. warp/native/cuda_util.cpp +549 -540
  149. warp/native/cuda_util.h +288 -203
  150. warp/native/cutlass_gemm.cpp +34 -34
  151. warp/native/cutlass_gemm.cu +372 -372
  152. warp/native/error.cpp +66 -66
  153. warp/native/error.h +27 -27
  154. warp/native/fabric.h +228 -228
  155. warp/native/hashgrid.cpp +301 -278
  156. warp/native/hashgrid.cu +78 -77
  157. warp/native/hashgrid.h +227 -227
  158. warp/native/initializer_array.h +32 -32
  159. warp/native/intersect.h +1204 -1204
  160. warp/native/intersect_adj.h +365 -365
  161. warp/native/intersect_tri.h +322 -322
  162. warp/native/marching.cpp +2 -2
  163. warp/native/marching.cu +497 -497
  164. warp/native/marching.h +2 -2
  165. warp/native/mat.h +1498 -1498
  166. warp/native/matnn.h +333 -333
  167. warp/native/mesh.cpp +203 -203
  168. warp/native/mesh.cu +293 -293
  169. warp/native/mesh.h +1887 -1887
  170. warp/native/nanovdb/NanoVDB.h +4782 -4782
  171. warp/native/nanovdb/PNanoVDB.h +2553 -2553
  172. warp/native/nanovdb/PNanoVDBWrite.h +294 -294
  173. warp/native/noise.h +850 -850
  174. warp/native/quat.h +1084 -1084
  175. warp/native/rand.h +299 -299
  176. warp/native/range.h +108 -108
  177. warp/native/reduce.cpp +156 -156
  178. warp/native/reduce.cu +348 -348
  179. warp/native/runlength_encode.cpp +61 -61
  180. warp/native/runlength_encode.cu +46 -46
  181. warp/native/scan.cpp +30 -30
  182. warp/native/scan.cu +36 -36
  183. warp/native/scan.h +7 -7
  184. warp/native/solid_angle.h +442 -442
  185. warp/native/sort.cpp +94 -94
  186. warp/native/sort.cu +97 -97
  187. warp/native/sort.h +14 -14
  188. warp/native/sparse.cpp +337 -337
  189. warp/native/sparse.cu +544 -544
  190. warp/native/spatial.h +630 -630
  191. warp/native/svd.h +562 -562
  192. warp/native/temp_buffer.h +30 -30
  193. warp/native/vec.h +1132 -1132
  194. warp/native/volume.cpp +297 -297
  195. warp/native/volume.cu +32 -32
  196. warp/native/volume.h +538 -538
  197. warp/native/volume_builder.cu +425 -425
  198. warp/native/volume_builder.h +19 -19
  199. warp/native/warp.cpp +1057 -1052
  200. warp/native/warp.cu +2943 -2828
  201. warp/native/warp.h +313 -305
  202. warp/optim/__init__.py +9 -9
  203. warp/optim/adam.py +120 -120
  204. warp/optim/linear.py +1104 -939
  205. warp/optim/sgd.py +104 -92
  206. warp/render/__init__.py +10 -10
  207. warp/render/render_opengl.py +3217 -3204
  208. warp/render/render_usd.py +768 -749
  209. warp/render/utils.py +152 -150
  210. warp/sim/__init__.py +52 -59
  211. warp/sim/articulation.py +685 -685
  212. warp/sim/collide.py +1594 -1590
  213. warp/sim/import_mjcf.py +489 -481
  214. warp/sim/import_snu.py +220 -221
  215. warp/sim/import_urdf.py +536 -516
  216. warp/sim/import_usd.py +887 -881
  217. warp/sim/inertia.py +316 -317
  218. warp/sim/integrator.py +234 -233
  219. warp/sim/integrator_euler.py +1956 -1956
  220. warp/sim/integrator_featherstone.py +1910 -1991
  221. warp/sim/integrator_xpbd.py +3294 -3312
  222. warp/sim/model.py +4473 -4314
  223. warp/sim/particles.py +113 -112
  224. warp/sim/render.py +417 -403
  225. warp/sim/utils.py +413 -410
  226. warp/sparse.py +1227 -1227
  227. warp/stubs.py +2109 -2469
  228. warp/tape.py +1162 -225
  229. warp/tests/__init__.py +1 -1
  230. warp/tests/__main__.py +4 -4
  231. warp/tests/assets/torus.usda +105 -105
  232. warp/tests/aux_test_class_kernel.py +26 -26
  233. warp/tests/aux_test_compile_consts_dummy.py +10 -10
  234. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -21
  235. warp/tests/aux_test_dependent.py +22 -22
  236. warp/tests/aux_test_grad_customs.py +23 -23
  237. warp/tests/aux_test_reference.py +11 -11
  238. warp/tests/aux_test_reference_reference.py +10 -10
  239. warp/tests/aux_test_square.py +17 -17
  240. warp/tests/aux_test_unresolved_func.py +14 -14
  241. warp/tests/aux_test_unresolved_symbol.py +14 -14
  242. warp/tests/disabled_kinematics.py +239 -239
  243. warp/tests/run_coverage_serial.py +31 -31
  244. warp/tests/test_adam.py +157 -157
  245. warp/tests/test_arithmetic.py +1124 -1124
  246. warp/tests/test_array.py +2417 -2326
  247. warp/tests/test_array_reduce.py +150 -150
  248. warp/tests/test_async.py +668 -656
  249. warp/tests/test_atomic.py +141 -141
  250. warp/tests/test_bool.py +204 -149
  251. warp/tests/test_builtins_resolution.py +1292 -1292
  252. warp/tests/test_bvh.py +164 -171
  253. warp/tests/test_closest_point_edge_edge.py +228 -228
  254. warp/tests/test_codegen.py +566 -553
  255. warp/tests/test_compile_consts.py +97 -101
  256. warp/tests/test_conditional.py +246 -246
  257. warp/tests/test_copy.py +232 -215
  258. warp/tests/test_ctypes.py +632 -632
  259. warp/tests/test_dense.py +67 -67
  260. warp/tests/test_devices.py +91 -98
  261. warp/tests/test_dlpack.py +530 -529
  262. warp/tests/test_examples.py +400 -378
  263. warp/tests/test_fabricarray.py +955 -955
  264. warp/tests/test_fast_math.py +62 -54
  265. warp/tests/test_fem.py +1277 -1278
  266. warp/tests/test_fp16.py +130 -130
  267. warp/tests/test_func.py +338 -337
  268. warp/tests/test_generics.py +571 -571
  269. warp/tests/test_grad.py +746 -640
  270. warp/tests/test_grad_customs.py +333 -336
  271. warp/tests/test_hash_grid.py +210 -164
  272. warp/tests/test_import.py +39 -39
  273. warp/tests/test_indexedarray.py +1134 -1134
  274. warp/tests/test_intersect.py +67 -67
  275. warp/tests/test_jax.py +307 -307
  276. warp/tests/test_large.py +167 -164
  277. warp/tests/test_launch.py +354 -354
  278. warp/tests/test_lerp.py +261 -261
  279. warp/tests/test_linear_solvers.py +191 -171
  280. warp/tests/test_lvalue.py +421 -493
  281. warp/tests/test_marching_cubes.py +65 -65
  282. warp/tests/test_mat.py +1801 -1827
  283. warp/tests/test_mat_lite.py +115 -115
  284. warp/tests/test_mat_scalar_ops.py +2907 -2889
  285. warp/tests/test_math.py +126 -193
  286. warp/tests/test_matmul.py +500 -499
  287. warp/tests/test_matmul_lite.py +410 -410
  288. warp/tests/test_mempool.py +188 -190
  289. warp/tests/test_mesh.py +284 -324
  290. warp/tests/test_mesh_query_aabb.py +228 -241
  291. warp/tests/test_mesh_query_point.py +692 -702
  292. warp/tests/test_mesh_query_ray.py +292 -303
  293. warp/tests/test_mlp.py +276 -276
  294. warp/tests/test_model.py +110 -110
  295. warp/tests/test_modules_lite.py +39 -39
  296. warp/tests/test_multigpu.py +163 -163
  297. warp/tests/test_noise.py +248 -248
  298. warp/tests/test_operators.py +250 -250
  299. warp/tests/test_options.py +123 -125
  300. warp/tests/test_peer.py +133 -137
  301. warp/tests/test_pinned.py +78 -78
  302. warp/tests/test_print.py +54 -54
  303. warp/tests/test_quat.py +2086 -2086
  304. warp/tests/test_rand.py +288 -288
  305. warp/tests/test_reload.py +217 -217
  306. warp/tests/test_rounding.py +179 -179
  307. warp/tests/test_runlength_encode.py +190 -190
  308. warp/tests/test_sim_grad.py +243 -0
  309. warp/tests/test_sim_kinematics.py +91 -97
  310. warp/tests/test_smoothstep.py +168 -168
  311. warp/tests/test_snippet.py +305 -266
  312. warp/tests/test_sparse.py +468 -460
  313. warp/tests/test_spatial.py +2148 -2148
  314. warp/tests/test_streams.py +486 -473
  315. warp/tests/test_struct.py +710 -675
  316. warp/tests/test_tape.py +173 -148
  317. warp/tests/test_torch.py +743 -743
  318. warp/tests/test_transient_module.py +87 -87
  319. warp/tests/test_types.py +556 -659
  320. warp/tests/test_utils.py +490 -499
  321. warp/tests/test_vec.py +1264 -1268
  322. warp/tests/test_vec_lite.py +73 -73
  323. warp/tests/test_vec_scalar_ops.py +2099 -2099
  324. warp/tests/test_verify_fp.py +94 -94
  325. warp/tests/test_volume.py +737 -736
  326. warp/tests/test_volume_write.py +255 -265
  327. warp/tests/unittest_serial.py +37 -37
  328. warp/tests/unittest_suites.py +363 -359
  329. warp/tests/unittest_utils.py +603 -578
  330. warp/tests/unused_test_misc.py +71 -71
  331. warp/tests/walkthrough_debug.py +85 -85
  332. warp/thirdparty/appdirs.py +598 -598
  333. warp/thirdparty/dlpack.py +143 -143
  334. warp/thirdparty/unittest_parallel.py +566 -561
  335. warp/torch.py +321 -295
  336. warp/types.py +4504 -4450
  337. warp/utils.py +1008 -821
  338. {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/LICENSE.md +126 -126
  339. {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/METADATA +338 -400
  340. warp_lang-1.1.0.dist-info/RECORD +352 -0
  341. warp/examples/assets/cube.usda +0 -42
  342. warp/examples/assets/sphere.usda +0 -56
  343. warp/examples/assets/torus.usda +0 -105
  344. warp_lang-1.0.1.dist-info/RECORD +0 -352
  345. {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/WHEEL +0 -0
  346. {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/top_level.txt +0 -0
warp/tests/test_ctypes.py CHANGED
@@ -1,632 +1,632 @@
1
- # Copyright (c) 2022 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 unittest
9
-
10
- import numpy as np
11
-
12
- import warp as wp
13
- from warp.tests.unittest_utils import *
14
-
15
- wp.init()
16
-
17
-
18
- @wp.kernel
19
- def add_vec2(dest: wp.array(dtype=wp.vec2), c: wp.vec2):
20
- tid = wp.tid()
21
- dest[tid] = c
22
-
23
-
24
- @wp.kernel
25
- def transform_vec2(dest_right: wp.array(dtype=wp.vec2), dest_left: wp.array(dtype=wp.vec2), m: wp.mat22, v: wp.vec2):
26
- tid = wp.tid()
27
-
28
- dest_right[tid] = wp.mul(m, v)
29
- dest_left[tid] = wp.mul(v, m)
30
-
31
-
32
- @wp.kernel
33
- def add_vec3(dest: wp.array(dtype=wp.vec3), c: wp.vec3):
34
- tid = wp.tid()
35
- dest[tid] = c
36
-
37
-
38
- @wp.kernel
39
- def transform_vec3(dest_right: wp.array(dtype=wp.vec3), dest_left: wp.array(dtype=wp.vec3), m: wp.mat33, v: wp.vec3):
40
- tid = wp.tid()
41
-
42
- dest_right[tid] = wp.mul(m, v)
43
- dest_left[tid] = wp.mul(v, m)
44
-
45
-
46
- @wp.kernel
47
- def transform_multiply(xforms: wp.array(dtype=wp.transform), a: wp.transform):
48
- tid = wp.tid()
49
-
50
- xforms[tid] = wp.transform_multiply(xforms[tid], a)
51
-
52
-
53
- def test_vec2_arg(test, device, n):
54
- dest = wp.zeros(n=n, dtype=wp.vec2, device=device)
55
- c = np.array((1.0, 2.0))
56
-
57
- wp.launch(add_vec2, dim=n, inputs=[dest, c], device=device)
58
-
59
- # ensure type can round-trip from Python->GPU->Python
60
- test.assertTrue(np.array_equal(dest.numpy(), np.tile(c, (n, 1))))
61
-
62
-
63
- def test_vec2_transform(test, device, n):
64
- dest_right = wp.zeros(n=n, dtype=wp.vec2, device=device)
65
- dest_left = wp.zeros(n=n, dtype=wp.vec2, device=device)
66
- c = np.array((1.0, 2.0))
67
- m = np.array(((3.0, -1.0), (2.5, 4.0)))
68
-
69
- wp.launch(transform_vec2, dim=n, inputs=[dest_right, dest_left, m, c], device=device)
70
- test.assertTrue(np.array_equal(dest_right.numpy(), np.tile(m @ c, (n, 1))))
71
- test.assertTrue(np.array_equal(dest_left.numpy(), np.tile(c @ m, (n, 1))))
72
-
73
-
74
- def test_vec3_arg(test, device, n):
75
- dest = wp.zeros(n=n, dtype=wp.vec3, device=device)
76
- c = np.array((1.0, 2.0, 3.0))
77
-
78
- wp.launch(add_vec3, dim=n, inputs=[dest, c], device=device)
79
- test.assertTrue(np.array_equal(dest.numpy(), np.tile(c, (n, 1))))
80
-
81
-
82
- def test_vec3_transform(test, device, n):
83
- dest_right = wp.zeros(n=n, dtype=wp.vec3, device=device)
84
- dest_left = wp.zeros(n=n, dtype=wp.vec3, device=device)
85
- c = np.array((1.0, 2.0, 3.0))
86
- m = np.array(((1.0, 2.0, 3.0), (4.0, 5.0, 6.0), (7.0, 8.0, 9.0)))
87
-
88
- wp.launch(transform_vec3, dim=n, inputs=[dest_right, dest_left, m, c], device=device)
89
- test.assertTrue(np.array_equal(dest_right.numpy(), np.tile(m @ c, (n, 1))))
90
- test.assertTrue(np.array_equal(dest_left.numpy(), np.tile(c @ m, (n, 1))))
91
-
92
-
93
- def test_transform_multiply(test, device, n):
94
- a = wp.transform((0.0, 1.0, 0.0), wp.quat_identity())
95
-
96
- x = []
97
- for i in range(10):
98
- x.append(wp.transform_identity())
99
-
100
- xforms = wp.array(x, dtype=wp.transform, device=device)
101
- wp.launch(transform_multiply, dim=n, inputs=[xforms, a], device=device)
102
-
103
-
104
- transformf = wp.types.transformation(dtype=wp.float32)
105
-
106
-
107
- @wp.kernel
108
- def test_transformation_constructor():
109
- a = wp.transformation(wp.vec3(0.0), wp.quat_identity())
110
- b = transformf(wp.vec3(0.0), wp.quat_identity())
111
- c = wp.transform_identity(dtype=wp.float64)
112
-
113
-
114
- spatial_vector = wp.types.vector(length=6, dtype=wp.float32)
115
-
116
-
117
- @wp.kernel
118
- def test_spatial_vector_constructor():
119
- a = wp.spatial_vector(wp.vec3(0.0), wp.vec3(0.0))
120
-
121
-
122
- # construct kernel + test harness for given matrix / vector types
123
- def make_matrix_test(dim, matrix, vector):
124
- def test_matrix_kernel(
125
- a: wp.array(dtype=matrix),
126
- b: wp.array(dtype=matrix),
127
- c: wp.array(dtype=matrix),
128
- x: wp.array(dtype=vector),
129
- result_m: wp.array(dtype=matrix),
130
- result_i: wp.array(dtype=matrix),
131
- result_d: wp.array(dtype=float),
132
- result_x: wp.array(dtype=vector),
133
- ):
134
- tid = wp.tid()
135
-
136
- m = a[tid] * b[tid] + c[tid] * 2.0
137
-
138
- result_m[tid] = m
139
- result_x[tid] = m * x[tid]
140
-
141
- result_d[tid] = wp.determinant(m)
142
-
143
- invm = wp.inverse(m)
144
- result_i[tid] = m * invm
145
-
146
- # register a custom kernel (no decorator) function
147
- # this lets us register the same function definition
148
- # against multiple symbols, with different arg types
149
- kernel = wp.Kernel(func=test_matrix_kernel, key=f"test_mat{dim}{dim}_kernel")
150
-
151
- def test_matrix(test, device):
152
- rng = np.random.default_rng(42)
153
-
154
- n = 1024
155
-
156
- a = rng.random(size=(n, dim, dim), dtype=float)
157
- b = rng.random(size=(n, dim, dim), dtype=float)
158
- c = rng.random(size=(n, dim, dim), dtype=float)
159
- x = rng.random(size=(n, dim, 1), dtype=float)
160
-
161
- a_array = wp.array(a, dtype=matrix, device=device)
162
- b_array = wp.array(b, dtype=matrix, device=device)
163
- c_array = wp.array(c, dtype=matrix, device=device)
164
-
165
- x_array = wp.array(x, dtype=vector, device=device)
166
-
167
- result_m_array = wp.zeros_like(a_array)
168
- result_i_array = wp.zeros_like(a_array)
169
- result_x_array = wp.zeros_like(x_array)
170
- result_d_array = wp.zeros(n, dtype=float, device=device)
171
-
172
- wp.launch(
173
- kernel,
174
- n,
175
- inputs=[a_array, b_array, c_array, x_array, result_m_array, result_i_array, result_d_array, result_x_array],
176
- device=device,
177
- )
178
-
179
- # numpy reference result
180
- result_m = np.matmul(a, b) + c * 2.0
181
- result_x = np.matmul(result_m, x)
182
- result_i = np.array([np.eye(dim)] * n)
183
- result_d = np.linalg.det(result_m)
184
-
185
- assert_np_equal(result_m_array.numpy(), result_m, tol=1.0e-5)
186
- assert_np_equal(result_i_array.numpy(), result_i, tol=1.0e-3)
187
- assert_np_equal(result_d_array.numpy(), result_d, tol=1.0e-3)
188
- assert_np_equal(result_x_array.numpy(), result_x, tol=1.0e-5)
189
-
190
- return test_matrix
191
-
192
-
193
- # generate test functions for matrix types
194
- test_mat22 = make_matrix_test(2, wp.mat22, wp.vec2)
195
- test_mat33 = make_matrix_test(3, wp.mat33, wp.vec3)
196
- test_mat44 = make_matrix_test(4, wp.mat44, wp.vec4)
197
-
198
-
199
- def test_scalar_array(test, device):
200
- scalar_list = (0.0, 1.0, 2.0)
201
- scalar_array = wp.array(scalar_list, device=device)
202
-
203
- assert_np_equal(np.array(scalar_list), scalar_array.numpy())
204
-
205
-
206
- def test_vector_array(test, device):
207
- vector_list = [(0.0, 0.0, 0.0), (1.0, 1.0, 1.0), (2.0, 2.0, 2.0)]
208
-
209
- vector_array = wp.array(vector_list, dtype=wp.vec3, device=device)
210
-
211
- assert_np_equal(np.array(vector_list), vector_array.numpy())
212
-
213
-
214
- @wp.kernel
215
- def test_vector_arg_types(v2: wp.vec2, v3: wp.vec3, v4: wp.vec4, m22: wp.mat22, m33: wp.mat33, m44: wp.mat44):
216
- wp.expect_eq(v2, wp.vec2(1.0, 2.0))
217
- wp.expect_eq(v3, wp.vec3(1.0, 2.0, 3.0))
218
- wp.expect_eq(v4, wp.vec4(1.0, 2.0, 3.0, 4.0))
219
-
220
- wp.expect_eq(m22, wp.mat22(1.0, 2.0, 3.0, 4.0))
221
-
222
- wp.expect_eq(m33, wp.mat33(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0))
223
-
224
- wp.expect_eq(m44, wp.mat44(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0))
225
-
226
-
227
- @wp.kernel
228
- def test_scalar_arg_types(
229
- i8: wp.int8,
230
- u8: wp.uint8,
231
- i16: wp.int16,
232
- u16: wp.uint16,
233
- i32: wp.int32,
234
- u32: wp.uint32,
235
- i64: wp.int64,
236
- u64: wp.uint64,
237
- f32: wp.float32,
238
- f64: wp.float64,
239
- ):
240
- wp.expect_eq(int(i8), -64)
241
- wp.expect_eq(int(u8), 255)
242
- wp.expect_eq(int(i16), -64)
243
- wp.expect_eq(int(u16), 255)
244
- wp.expect_eq(int(i32), -64)
245
- wp.expect_eq(int(u32), 255)
246
- wp.expect_eq(int(i64), -64)
247
- wp.expect_eq(int(u64), 255)
248
- wp.expect_eq(int(f32), 3)
249
- wp.expect_eq(int(f64), 3)
250
- wp.expect_eq(float(f32), 3.14159)
251
- wp.expect_eq(float(f64), 3.14159)
252
-
253
-
254
- @wp.kernel
255
- def test_scalar_array_types_load(
256
- i8: wp.array(dtype=wp.int8),
257
- u8: wp.array(dtype=wp.uint8),
258
- i16: wp.array(dtype=wp.int16),
259
- u16: wp.array(dtype=wp.uint16),
260
- i32: wp.array(dtype=wp.int32),
261
- u32: wp.array(dtype=wp.uint32),
262
- i64: wp.array(dtype=wp.int64),
263
- u64: wp.array(dtype=wp.uint64),
264
- f32: wp.array(dtype=wp.float32),
265
- f64: wp.array(dtype=wp.float64),
266
- ):
267
- tid = wp.tid()
268
-
269
- wp.expect_eq(int(i8[tid]), tid)
270
- wp.expect_eq(int(u8[tid]), tid)
271
- wp.expect_eq(int(i16[tid]), tid)
272
- wp.expect_eq(int(u16[tid]), tid)
273
- wp.expect_eq(int(i32[tid]), tid)
274
- wp.expect_eq(int(u32[tid]), tid)
275
- wp.expect_eq(int(i64[tid]), tid)
276
- wp.expect_eq(int(u64[tid]), tid)
277
- wp.expect_eq(float(f32[tid]), float(tid))
278
- wp.expect_eq(float(f64[tid]), float(tid))
279
-
280
-
281
- @wp.kernel
282
- def test_scalar_array_types_store(
283
- i8: wp.array(dtype=wp.int8),
284
- u8: wp.array(dtype=wp.uint8),
285
- i16: wp.array(dtype=wp.int16),
286
- u16: wp.array(dtype=wp.uint16),
287
- i32: wp.array(dtype=wp.int32),
288
- u32: wp.array(dtype=wp.uint32),
289
- i64: wp.array(dtype=wp.int64),
290
- u64: wp.array(dtype=wp.uint64),
291
- f32: wp.array(dtype=wp.float32),
292
- f64: wp.array(dtype=wp.float64),
293
- ):
294
- tid = wp.tid()
295
-
296
- i8[tid] = wp.int8(tid)
297
- u8[tid] = wp.uint8(tid)
298
- i16[tid] = wp.int16(tid)
299
- u16[tid] = wp.uint16(tid)
300
- i32[tid] = wp.int32(tid)
301
- u32[tid] = wp.uint32(tid)
302
- i64[tid] = wp.int64(tid)
303
- u64[tid] = wp.uint64(tid)
304
- f32[tid] = wp.float32(tid)
305
- f64[tid] = wp.float64(tid)
306
-
307
- # check round-trip
308
- wp.expect_eq(int(i8[tid]), tid)
309
- wp.expect_eq(int(u8[tid]), tid)
310
- wp.expect_eq(int(i16[tid]), tid)
311
- wp.expect_eq(int(u16[tid]), tid)
312
- wp.expect_eq(int(i32[tid]), tid)
313
- wp.expect_eq(int(u32[tid]), tid)
314
- wp.expect_eq(int(i64[tid]), tid)
315
- wp.expect_eq(int(u64[tid]), tid)
316
- wp.expect_eq(float(f32[tid]), float(tid))
317
- wp.expect_eq(float(f64[tid]), float(tid))
318
-
319
-
320
- @wp.kernel
321
- def test_type_conversions():
322
- # below tests auto-generated by the following snippet:
323
-
324
- # scalar_types_all = [*wp.types.scalar_types, int, float]
325
- # for t in scalar_types_all:
326
- # for u in scalar_types_all:
327
-
328
- # def prefix(t):
329
- # if t == int or t == float:
330
- # return t.__name__
331
- # else:
332
- # return "wp." + t.__name__
333
-
334
- # print(f"wp.expect_eq({prefix(t)}(2.0), {prefix(t)}({prefix(u)}(2.0)))")
335
-
336
- wp.expect_eq(wp.int8(2.0), wp.int8(wp.int8(2.0)))
337
- wp.expect_eq(wp.int8(2.0), wp.int8(wp.uint8(2.0)))
338
- wp.expect_eq(wp.int8(2.0), wp.int8(wp.int16(2.0)))
339
- wp.expect_eq(wp.int8(2.0), wp.int8(wp.uint16(2.0)))
340
- wp.expect_eq(wp.int8(2.0), wp.int8(wp.int32(2.0)))
341
- wp.expect_eq(wp.int8(2.0), wp.int8(wp.uint32(2.0)))
342
- wp.expect_eq(wp.int8(2.0), wp.int8(wp.int64(2.0)))
343
- wp.expect_eq(wp.int8(2.0), wp.int8(wp.uint64(2.0)))
344
- wp.expect_eq(wp.int8(2.0), wp.int8(wp.float16(2.0)))
345
- wp.expect_eq(wp.int8(2.0), wp.int8(wp.float32(2.0)))
346
- wp.expect_eq(wp.int8(2.0), wp.int8(wp.float64(2.0)))
347
- wp.expect_eq(wp.int8(2.0), wp.int8(int(2.0)))
348
- wp.expect_eq(wp.int8(2.0), wp.int8(float(2.0)))
349
- wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.int8(2.0)))
350
- wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.uint8(2.0)))
351
- wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.int16(2.0)))
352
- wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.uint16(2.0)))
353
- wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.int32(2.0)))
354
- wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.uint32(2.0)))
355
- wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.int64(2.0)))
356
- wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.uint64(2.0)))
357
- wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.float16(2.0)))
358
- wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.float32(2.0)))
359
- wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.float64(2.0)))
360
- wp.expect_eq(wp.uint8(2.0), wp.uint8(int(2.0)))
361
- wp.expect_eq(wp.uint8(2.0), wp.uint8(float(2.0)))
362
- wp.expect_eq(wp.int16(2.0), wp.int16(wp.int8(2.0)))
363
- wp.expect_eq(wp.int16(2.0), wp.int16(wp.uint8(2.0)))
364
- wp.expect_eq(wp.int16(2.0), wp.int16(wp.int16(2.0)))
365
- wp.expect_eq(wp.int16(2.0), wp.int16(wp.uint16(2.0)))
366
- wp.expect_eq(wp.int16(2.0), wp.int16(wp.int32(2.0)))
367
- wp.expect_eq(wp.int16(2.0), wp.int16(wp.uint32(2.0)))
368
- wp.expect_eq(wp.int16(2.0), wp.int16(wp.int64(2.0)))
369
- wp.expect_eq(wp.int16(2.0), wp.int16(wp.uint64(2.0)))
370
- wp.expect_eq(wp.int16(2.0), wp.int16(wp.float16(2.0)))
371
- wp.expect_eq(wp.int16(2.0), wp.int16(wp.float32(2.0)))
372
- wp.expect_eq(wp.int16(2.0), wp.int16(wp.float64(2.0)))
373
- wp.expect_eq(wp.int16(2.0), wp.int16(int(2.0)))
374
- wp.expect_eq(wp.int16(2.0), wp.int16(float(2.0)))
375
- wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.int8(2.0)))
376
- wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.uint8(2.0)))
377
- wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.int16(2.0)))
378
- wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.uint16(2.0)))
379
- wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.int32(2.0)))
380
- wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.uint32(2.0)))
381
- wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.int64(2.0)))
382
- wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.uint64(2.0)))
383
- wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.float16(2.0)))
384
- wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.float32(2.0)))
385
- wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.float64(2.0)))
386
- wp.expect_eq(wp.uint16(2.0), wp.uint16(int(2.0)))
387
- wp.expect_eq(wp.uint16(2.0), wp.uint16(float(2.0)))
388
- wp.expect_eq(wp.int32(2.0), wp.int32(wp.int8(2.0)))
389
- wp.expect_eq(wp.int32(2.0), wp.int32(wp.uint8(2.0)))
390
- wp.expect_eq(wp.int32(2.0), wp.int32(wp.int16(2.0)))
391
- wp.expect_eq(wp.int32(2.0), wp.int32(wp.uint16(2.0)))
392
- wp.expect_eq(wp.int32(2.0), wp.int32(wp.int32(2.0)))
393
- wp.expect_eq(wp.int32(2.0), wp.int32(wp.uint32(2.0)))
394
- wp.expect_eq(wp.int32(2.0), wp.int32(wp.int64(2.0)))
395
- wp.expect_eq(wp.int32(2.0), wp.int32(wp.uint64(2.0)))
396
- wp.expect_eq(wp.int32(2.0), wp.int32(wp.float16(2.0)))
397
- wp.expect_eq(wp.int32(2.0), wp.int32(wp.float32(2.0)))
398
- wp.expect_eq(wp.int32(2.0), wp.int32(wp.float64(2.0)))
399
- wp.expect_eq(wp.int32(2.0), wp.int32(int(2.0)))
400
- wp.expect_eq(wp.int32(2.0), wp.int32(float(2.0)))
401
- wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.int8(2.0)))
402
- wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.uint8(2.0)))
403
- wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.int16(2.0)))
404
- wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.uint16(2.0)))
405
- wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.int32(2.0)))
406
- wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.uint32(2.0)))
407
- wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.int64(2.0)))
408
- wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.uint64(2.0)))
409
- wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.float16(2.0)))
410
- wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.float32(2.0)))
411
- wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.float64(2.0)))
412
- wp.expect_eq(wp.uint32(2.0), wp.uint32(int(2.0)))
413
- wp.expect_eq(wp.uint32(2.0), wp.uint32(float(2.0)))
414
- wp.expect_eq(wp.int64(2.0), wp.int64(wp.int8(2.0)))
415
- wp.expect_eq(wp.int64(2.0), wp.int64(wp.uint8(2.0)))
416
- wp.expect_eq(wp.int64(2.0), wp.int64(wp.int16(2.0)))
417
- wp.expect_eq(wp.int64(2.0), wp.int64(wp.uint16(2.0)))
418
- wp.expect_eq(wp.int64(2.0), wp.int64(wp.int32(2.0)))
419
- wp.expect_eq(wp.int64(2.0), wp.int64(wp.uint32(2.0)))
420
- wp.expect_eq(wp.int64(2.0), wp.int64(wp.int64(2.0)))
421
- wp.expect_eq(wp.int64(2.0), wp.int64(wp.uint64(2.0)))
422
- wp.expect_eq(wp.int64(2.0), wp.int64(wp.float16(2.0)))
423
- wp.expect_eq(wp.int64(2.0), wp.int64(wp.float32(2.0)))
424
- wp.expect_eq(wp.int64(2.0), wp.int64(wp.float64(2.0)))
425
- wp.expect_eq(wp.int64(2.0), wp.int64(int(2.0)))
426
- wp.expect_eq(wp.int64(2.0), wp.int64(float(2.0)))
427
- wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.int8(2.0)))
428
- wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.uint8(2.0)))
429
- wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.int16(2.0)))
430
- wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.uint16(2.0)))
431
- wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.int32(2.0)))
432
- wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.uint32(2.0)))
433
- wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.int64(2.0)))
434
- wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.uint64(2.0)))
435
- wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.float16(2.0)))
436
- wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.float32(2.0)))
437
- wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.float64(2.0)))
438
- wp.expect_eq(wp.uint64(2.0), wp.uint64(int(2.0)))
439
- wp.expect_eq(wp.uint64(2.0), wp.uint64(float(2.0)))
440
- wp.expect_eq(wp.float16(2.0), wp.float16(wp.int8(2.0)))
441
- wp.expect_eq(wp.float16(2.0), wp.float16(wp.uint8(2.0)))
442
- wp.expect_eq(wp.float16(2.0), wp.float16(wp.int16(2.0)))
443
- wp.expect_eq(wp.float16(2.0), wp.float16(wp.uint16(2.0)))
444
- wp.expect_eq(wp.float16(2.0), wp.float16(wp.int32(2.0)))
445
- wp.expect_eq(wp.float16(2.0), wp.float16(wp.uint32(2.0)))
446
- wp.expect_eq(wp.float16(2.0), wp.float16(wp.int64(2.0)))
447
- wp.expect_eq(wp.float16(2.0), wp.float16(wp.uint64(2.0)))
448
- wp.expect_eq(wp.float16(2.0), wp.float16(wp.float16(2.0)))
449
- wp.expect_eq(wp.float16(2.0), wp.float16(wp.float32(2.0)))
450
- wp.expect_eq(wp.float16(2.0), wp.float16(wp.float64(2.0)))
451
- wp.expect_eq(wp.float16(2.0), wp.float16(int(2.0)))
452
- wp.expect_eq(wp.float16(2.0), wp.float16(float(2.0)))
453
- wp.expect_eq(wp.float32(2.0), wp.float32(wp.int8(2.0)))
454
- wp.expect_eq(wp.float32(2.0), wp.float32(wp.uint8(2.0)))
455
- wp.expect_eq(wp.float32(2.0), wp.float32(wp.int16(2.0)))
456
- wp.expect_eq(wp.float32(2.0), wp.float32(wp.uint16(2.0)))
457
- wp.expect_eq(wp.float32(2.0), wp.float32(wp.int32(2.0)))
458
- wp.expect_eq(wp.float32(2.0), wp.float32(wp.uint32(2.0)))
459
- wp.expect_eq(wp.float32(2.0), wp.float32(wp.int64(2.0)))
460
- wp.expect_eq(wp.float32(2.0), wp.float32(wp.uint64(2.0)))
461
- wp.expect_eq(wp.float32(2.0), wp.float32(wp.float16(2.0)))
462
- wp.expect_eq(wp.float32(2.0), wp.float32(wp.float32(2.0)))
463
- wp.expect_eq(wp.float32(2.0), wp.float32(wp.float64(2.0)))
464
- wp.expect_eq(wp.float32(2.0), wp.float32(int(2.0)))
465
- wp.expect_eq(wp.float32(2.0), wp.float32(float(2.0)))
466
- wp.expect_eq(wp.float64(2.0), wp.float64(wp.int8(2.0)))
467
- wp.expect_eq(wp.float64(2.0), wp.float64(wp.uint8(2.0)))
468
- wp.expect_eq(wp.float64(2.0), wp.float64(wp.int16(2.0)))
469
- wp.expect_eq(wp.float64(2.0), wp.float64(wp.uint16(2.0)))
470
- wp.expect_eq(wp.float64(2.0), wp.float64(wp.int32(2.0)))
471
- wp.expect_eq(wp.float64(2.0), wp.float64(wp.uint32(2.0)))
472
- wp.expect_eq(wp.float64(2.0), wp.float64(wp.int64(2.0)))
473
- wp.expect_eq(wp.float64(2.0), wp.float64(wp.uint64(2.0)))
474
- wp.expect_eq(wp.float64(2.0), wp.float64(wp.float16(2.0)))
475
- wp.expect_eq(wp.float64(2.0), wp.float64(wp.float32(2.0)))
476
- wp.expect_eq(wp.float64(2.0), wp.float64(wp.float64(2.0)))
477
- wp.expect_eq(wp.float64(2.0), wp.float64(int(2.0)))
478
- wp.expect_eq(wp.float64(2.0), wp.float64(float(2.0)))
479
- wp.expect_eq(int(2.0), int(wp.int8(2.0)))
480
- wp.expect_eq(int(2.0), int(wp.uint8(2.0)))
481
- wp.expect_eq(int(2.0), int(wp.int16(2.0)))
482
- wp.expect_eq(int(2.0), int(wp.uint16(2.0)))
483
- wp.expect_eq(int(2.0), int(wp.int32(2.0)))
484
- wp.expect_eq(int(2.0), int(wp.uint32(2.0)))
485
- wp.expect_eq(int(2.0), int(wp.int64(2.0)))
486
- wp.expect_eq(int(2.0), int(wp.uint64(2.0)))
487
- wp.expect_eq(int(2.0), int(wp.float16(2.0)))
488
- wp.expect_eq(int(2.0), int(wp.float32(2.0)))
489
- wp.expect_eq(int(2.0), int(wp.float64(2.0)))
490
- wp.expect_eq(int(2.0), int(int(2.0)))
491
- wp.expect_eq(int(2.0), int(float(2.0)))
492
- wp.expect_eq(float(2.0), float(wp.int8(2.0)))
493
- wp.expect_eq(float(2.0), float(wp.uint8(2.0)))
494
- wp.expect_eq(float(2.0), float(wp.int16(2.0)))
495
- wp.expect_eq(float(2.0), float(wp.uint16(2.0)))
496
- wp.expect_eq(float(2.0), float(wp.int32(2.0)))
497
- wp.expect_eq(float(2.0), float(wp.uint32(2.0)))
498
- wp.expect_eq(float(2.0), float(wp.int64(2.0)))
499
- wp.expect_eq(float(2.0), float(wp.uint64(2.0)))
500
- wp.expect_eq(float(2.0), float(wp.float16(2.0)))
501
- wp.expect_eq(float(2.0), float(wp.float32(2.0)))
502
- wp.expect_eq(float(2.0), float(wp.float64(2.0)))
503
- wp.expect_eq(float(2.0), float(int(2.0)))
504
- wp.expect_eq(float(2.0), float(float(2.0)))
505
-
506
-
507
- def test_scalar_array_types(test, device, load, store):
508
- dim = 64
509
-
510
- i8 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.int8), device=device)
511
- u8 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.uint8), device=device)
512
- i16 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.int16), device=device)
513
- u16 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.uint16), device=device)
514
- i32 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.int32), device=device)
515
- u32 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.uint32), device=device)
516
- i64 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.int64), device=device)
517
- u64 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.uint64), device=device)
518
- f32 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.float32), device=device)
519
- f64 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.float64), device=device)
520
-
521
- if load:
522
- wp.launch(
523
- test_scalar_array_types_load,
524
- dim=dim,
525
- inputs=[i8, u8, i16, u16, i32, u32, i64, u64, f32, f64],
526
- device=device,
527
- )
528
-
529
- if store:
530
- wp.launch(
531
- test_scalar_array_types_store,
532
- dim=dim,
533
- inputs=[i8, u8, i16, u16, i32, u32, i64, u64, f32, f64],
534
- device=device,
535
- )
536
-
537
-
538
- @wp.kernel
539
- def test_transform_matrix():
540
- r = wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), 0.5)
541
- t = wp.vec3(0.25, 0.5, -0.75)
542
- s = wp.vec3(2.0, 0.5, 0.75)
543
-
544
- m = wp.mat44(t, r, s)
545
-
546
- p = wp.vec3(1.0, 2.0, 3.0)
547
-
548
- r_0 = wp.quat_rotate(r, wp.cw_mul(s, p)) + t
549
- r_1 = wp.transform_point(m, p)
550
-
551
- r_2 = wp.transform_vector(m, p)
552
-
553
- wp.expect_near(r_0, r_1, 1.0e-4)
554
- wp.expect_near(r_2, r_0 - t, 1.0e-4)
555
-
556
-
557
- devices = get_test_devices()
558
-
559
-
560
- class TestCTypes(unittest.TestCase):
561
- pass
562
-
563
-
564
- inputs = [
565
- wp.vec2(1.0, 2.0),
566
- wp.vec3(1.0, 2.0, 3.0),
567
- wp.vec4(1.0, 2.0, 3.0, 4.0),
568
- wp.mat22(1.0, 2.0, 3.0, 4.0),
569
- wp.mat33(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0),
570
- wp.mat44(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0),
571
- ]
572
-
573
- add_function_test(TestCTypes, "test_mat22", test_mat22, devices=devices)
574
- add_function_test(TestCTypes, "test_mat33", test_mat33, devices=devices)
575
- add_function_test(TestCTypes, "test_mat44", test_mat44, devices=devices)
576
- add_kernel_test(
577
- TestCTypes, name="test_transformation_constructor", kernel=test_transformation_constructor, dim=1, devices=devices
578
- )
579
- add_kernel_test(
580
- TestCTypes, name="test_spatial_vector_constructor", kernel=test_spatial_vector_constructor, dim=1, devices=devices
581
- )
582
- add_kernel_test(
583
- TestCTypes,
584
- name="test_scalar_arg_types",
585
- kernel=test_scalar_arg_types,
586
- dim=1,
587
- inputs=[-64, 255, -64, 255, -64, 255, -64, 255, 3.14159, 3.14159],
588
- devices=devices,
589
- )
590
- add_kernel_test(
591
- TestCTypes,
592
- name="test_scalar_arg_types_explicit",
593
- kernel=test_scalar_arg_types,
594
- dim=1,
595
- inputs=[
596
- wp.int8(-64),
597
- wp.uint8(255),
598
- wp.int16(-64),
599
- wp.uint16(255),
600
- wp.int32(-64),
601
- wp.uint32(255),
602
- wp.int64(-64),
603
- wp.uint64(255),
604
- wp.float32(3.14159),
605
- wp.float64(3.14159),
606
- ],
607
- devices=devices,
608
- )
609
- add_kernel_test(
610
- TestCTypes, name="test_vector_arg_types", kernel=test_vector_arg_types, dim=1, inputs=inputs, devices=devices
611
- )
612
- add_kernel_test(TestCTypes, name="test_type_convesrions", kernel=test_type_conversions, dim=1, devices=devices)
613
-
614
- add_function_test(
615
- TestCTypes, "test_scalar_array_load", test_scalar_array_types, devices=devices, load=True, store=False
616
- )
617
- add_function_test(
618
- TestCTypes, "test_scalar_array_store", test_scalar_array_types, devices=devices, load=False, store=True
619
- )
620
- add_function_test(TestCTypes, "test_vec2_arg", test_vec2_arg, devices=devices, n=8)
621
- add_function_test(TestCTypes, "test_vec2_transform", test_vec2_transform, devices=devices, n=8)
622
- add_function_test(TestCTypes, "test_vec3_arg", test_vec3_arg, devices=devices, n=8)
623
- add_function_test(TestCTypes, "test_vec3_transform", test_vec3_transform, devices=devices, n=8)
624
- add_function_test(TestCTypes, "test_transform_multiply", test_transform_multiply, devices=devices, n=8)
625
- add_kernel_test(TestCTypes, name="test_transform_matrix", kernel=test_transform_matrix, dim=1, devices=devices)
626
- add_function_test(TestCTypes, "test_scalar_array", test_scalar_array, devices=devices)
627
- add_function_test(TestCTypes, "test_vector_array", test_vector_array, devices=devices)
628
-
629
-
630
- if __name__ == "__main__":
631
- wp.build.clear_kernel_cache()
632
- unittest.main(verbosity=2)
1
+ # Copyright (c) 2022 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 unittest
9
+
10
+ import numpy as np
11
+
12
+ import warp as wp
13
+ from warp.tests.unittest_utils import *
14
+
15
+ wp.init()
16
+
17
+
18
+ @wp.kernel
19
+ def add_vec2(dest: wp.array(dtype=wp.vec2), c: wp.vec2):
20
+ tid = wp.tid()
21
+ dest[tid] = c
22
+
23
+
24
+ @wp.kernel
25
+ def transform_vec2(dest_right: wp.array(dtype=wp.vec2), dest_left: wp.array(dtype=wp.vec2), m: wp.mat22, v: wp.vec2):
26
+ tid = wp.tid()
27
+
28
+ dest_right[tid] = wp.mul(m, v)
29
+ dest_left[tid] = wp.mul(v, m)
30
+
31
+
32
+ @wp.kernel
33
+ def add_vec3(dest: wp.array(dtype=wp.vec3), c: wp.vec3):
34
+ tid = wp.tid()
35
+ dest[tid] = c
36
+
37
+
38
+ @wp.kernel
39
+ def transform_vec3(dest_right: wp.array(dtype=wp.vec3), dest_left: wp.array(dtype=wp.vec3), m: wp.mat33, v: wp.vec3):
40
+ tid = wp.tid()
41
+
42
+ dest_right[tid] = wp.mul(m, v)
43
+ dest_left[tid] = wp.mul(v, m)
44
+
45
+
46
+ @wp.kernel
47
+ def transform_multiply(xforms: wp.array(dtype=wp.transform), a: wp.transform):
48
+ tid = wp.tid()
49
+
50
+ xforms[tid] = wp.transform_multiply(xforms[tid], a)
51
+
52
+
53
+ def test_vec2_arg(test, device, n):
54
+ dest = wp.zeros(n=n, dtype=wp.vec2, device=device)
55
+ c = np.array((1.0, 2.0))
56
+
57
+ wp.launch(add_vec2, dim=n, inputs=[dest, c], device=device)
58
+
59
+ # ensure type can round-trip from Python->GPU->Python
60
+ test.assertTrue(np.array_equal(dest.numpy(), np.tile(c, (n, 1))))
61
+
62
+
63
+ def test_vec2_transform(test, device, n):
64
+ dest_right = wp.zeros(n=n, dtype=wp.vec2, device=device)
65
+ dest_left = wp.zeros(n=n, dtype=wp.vec2, device=device)
66
+ c = np.array((1.0, 2.0))
67
+ m = np.array(((3.0, -1.0), (2.5, 4.0)))
68
+
69
+ wp.launch(transform_vec2, dim=n, inputs=[dest_right, dest_left, m, c], device=device)
70
+ test.assertTrue(np.array_equal(dest_right.numpy(), np.tile(m @ c, (n, 1))))
71
+ test.assertTrue(np.array_equal(dest_left.numpy(), np.tile(c @ m, (n, 1))))
72
+
73
+
74
+ def test_vec3_arg(test, device, n):
75
+ dest = wp.zeros(n=n, dtype=wp.vec3, device=device)
76
+ c = np.array((1.0, 2.0, 3.0))
77
+
78
+ wp.launch(add_vec3, dim=n, inputs=[dest, c], device=device)
79
+ test.assertTrue(np.array_equal(dest.numpy(), np.tile(c, (n, 1))))
80
+
81
+
82
+ def test_vec3_transform(test, device, n):
83
+ dest_right = wp.zeros(n=n, dtype=wp.vec3, device=device)
84
+ dest_left = wp.zeros(n=n, dtype=wp.vec3, device=device)
85
+ c = np.array((1.0, 2.0, 3.0))
86
+ m = np.array(((1.0, 2.0, 3.0), (4.0, 5.0, 6.0), (7.0, 8.0, 9.0)))
87
+
88
+ wp.launch(transform_vec3, dim=n, inputs=[dest_right, dest_left, m, c], device=device)
89
+ test.assertTrue(np.array_equal(dest_right.numpy(), np.tile(m @ c, (n, 1))))
90
+ test.assertTrue(np.array_equal(dest_left.numpy(), np.tile(c @ m, (n, 1))))
91
+
92
+
93
+ def test_transform_multiply(test, device, n):
94
+ a = wp.transform((0.0, 1.0, 0.0), wp.quat_identity())
95
+
96
+ x = []
97
+ for _i in range(10):
98
+ x.append(wp.transform_identity())
99
+
100
+ xforms = wp.array(x, dtype=wp.transform, device=device)
101
+ wp.launch(transform_multiply, dim=n, inputs=[xforms, a], device=device)
102
+
103
+
104
+ transformf = wp.types.transformation(dtype=wp.float32)
105
+
106
+
107
+ @wp.kernel
108
+ def test_transformation_constructor():
109
+ a = wp.transformation(wp.vec3(0.0), wp.quat_identity())
110
+ b = transformf(wp.vec3(0.0), wp.quat_identity())
111
+ c = wp.transform_identity(dtype=wp.float64)
112
+
113
+
114
+ spatial_vector = wp.types.vector(length=6, dtype=wp.float32)
115
+
116
+
117
+ @wp.kernel
118
+ def test_spatial_vector_constructor():
119
+ a = wp.spatial_vector(wp.vec3(0.0), wp.vec3(0.0))
120
+
121
+
122
+ # construct kernel + test harness for given matrix / vector types
123
+ def make_matrix_test(dim, matrix, vector):
124
+ def test_matrix_kernel(
125
+ a: wp.array(dtype=matrix),
126
+ b: wp.array(dtype=matrix),
127
+ c: wp.array(dtype=matrix),
128
+ x: wp.array(dtype=vector),
129
+ result_m: wp.array(dtype=matrix),
130
+ result_i: wp.array(dtype=matrix),
131
+ result_d: wp.array(dtype=float),
132
+ result_x: wp.array(dtype=vector),
133
+ ):
134
+ tid = wp.tid()
135
+
136
+ m = a[tid] * b[tid] + c[tid] * 2.0
137
+
138
+ result_m[tid] = m
139
+ result_x[tid] = m * x[tid]
140
+
141
+ result_d[tid] = wp.determinant(m)
142
+
143
+ invm = wp.inverse(m)
144
+ result_i[tid] = m * invm
145
+
146
+ # register a custom kernel (no decorator) function
147
+ # this lets us register the same function definition
148
+ # against multiple symbols, with different arg types
149
+ kernel = wp.Kernel(func=test_matrix_kernel, key=f"test_mat{dim}{dim}_kernel")
150
+
151
+ def test_matrix(test, device):
152
+ rng = np.random.default_rng(42)
153
+
154
+ n = 1024
155
+
156
+ a = rng.random(size=(n, dim, dim), dtype=float)
157
+ b = rng.random(size=(n, dim, dim), dtype=float)
158
+ c = rng.random(size=(n, dim, dim), dtype=float)
159
+ x = rng.random(size=(n, dim, 1), dtype=float)
160
+
161
+ a_array = wp.array(a, dtype=matrix, device=device)
162
+ b_array = wp.array(b, dtype=matrix, device=device)
163
+ c_array = wp.array(c, dtype=matrix, device=device)
164
+
165
+ x_array = wp.array(x, dtype=vector, device=device)
166
+
167
+ result_m_array = wp.zeros_like(a_array)
168
+ result_i_array = wp.zeros_like(a_array)
169
+ result_x_array = wp.zeros_like(x_array)
170
+ result_d_array = wp.zeros(n, dtype=float, device=device)
171
+
172
+ wp.launch(
173
+ kernel,
174
+ n,
175
+ inputs=[a_array, b_array, c_array, x_array, result_m_array, result_i_array, result_d_array, result_x_array],
176
+ device=device,
177
+ )
178
+
179
+ # numpy reference result
180
+ result_m = np.matmul(a, b) + c * 2.0
181
+ result_x = np.matmul(result_m, x)
182
+ result_i = np.array([np.eye(dim)] * n)
183
+ result_d = np.linalg.det(result_m)
184
+
185
+ assert_np_equal(result_m_array.numpy(), result_m, tol=1.0e-5)
186
+ assert_np_equal(result_i_array.numpy(), result_i, tol=1.0e-3)
187
+ assert_np_equal(result_d_array.numpy(), result_d, tol=1.0e-3)
188
+ assert_np_equal(result_x_array.numpy(), result_x, tol=1.0e-5)
189
+
190
+ return test_matrix
191
+
192
+
193
+ # generate test functions for matrix types
194
+ test_mat22 = make_matrix_test(2, wp.mat22, wp.vec2)
195
+ test_mat33 = make_matrix_test(3, wp.mat33, wp.vec3)
196
+ test_mat44 = make_matrix_test(4, wp.mat44, wp.vec4)
197
+
198
+
199
+ def test_scalar_array(test, device):
200
+ scalar_list = (0.0, 1.0, 2.0)
201
+ scalar_array = wp.array(scalar_list, device=device)
202
+
203
+ assert_np_equal(np.array(scalar_list), scalar_array.numpy())
204
+
205
+
206
+ def test_vector_array(test, device):
207
+ vector_list = [(0.0, 0.0, 0.0), (1.0, 1.0, 1.0), (2.0, 2.0, 2.0)]
208
+
209
+ vector_array = wp.array(vector_list, dtype=wp.vec3, device=device)
210
+
211
+ assert_np_equal(np.array(vector_list), vector_array.numpy())
212
+
213
+
214
+ @wp.kernel
215
+ def test_vector_arg_types(v2: wp.vec2, v3: wp.vec3, v4: wp.vec4, m22: wp.mat22, m33: wp.mat33, m44: wp.mat44):
216
+ wp.expect_eq(v2, wp.vec2(1.0, 2.0))
217
+ wp.expect_eq(v3, wp.vec3(1.0, 2.0, 3.0))
218
+ wp.expect_eq(v4, wp.vec4(1.0, 2.0, 3.0, 4.0))
219
+
220
+ wp.expect_eq(m22, wp.mat22(1.0, 2.0, 3.0, 4.0))
221
+
222
+ wp.expect_eq(m33, wp.mat33(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0))
223
+
224
+ wp.expect_eq(m44, wp.mat44(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0))
225
+
226
+
227
+ @wp.kernel
228
+ def test_scalar_arg_types(
229
+ i8: wp.int8,
230
+ u8: wp.uint8,
231
+ i16: wp.int16,
232
+ u16: wp.uint16,
233
+ i32: wp.int32,
234
+ u32: wp.uint32,
235
+ i64: wp.int64,
236
+ u64: wp.uint64,
237
+ f32: wp.float32,
238
+ f64: wp.float64,
239
+ ):
240
+ wp.expect_eq(int(i8), -64)
241
+ wp.expect_eq(int(u8), 255)
242
+ wp.expect_eq(int(i16), -64)
243
+ wp.expect_eq(int(u16), 255)
244
+ wp.expect_eq(int(i32), -64)
245
+ wp.expect_eq(int(u32), 255)
246
+ wp.expect_eq(int(i64), -64)
247
+ wp.expect_eq(int(u64), 255)
248
+ wp.expect_eq(int(f32), 3)
249
+ wp.expect_eq(int(f64), 3)
250
+ wp.expect_eq(float(f32), 3.14159)
251
+ wp.expect_eq(float(f64), 3.14159)
252
+
253
+
254
+ @wp.kernel
255
+ def test_scalar_array_types_load(
256
+ i8: wp.array(dtype=wp.int8),
257
+ u8: wp.array(dtype=wp.uint8),
258
+ i16: wp.array(dtype=wp.int16),
259
+ u16: wp.array(dtype=wp.uint16),
260
+ i32: wp.array(dtype=wp.int32),
261
+ u32: wp.array(dtype=wp.uint32),
262
+ i64: wp.array(dtype=wp.int64),
263
+ u64: wp.array(dtype=wp.uint64),
264
+ f32: wp.array(dtype=wp.float32),
265
+ f64: wp.array(dtype=wp.float64),
266
+ ):
267
+ tid = wp.tid()
268
+
269
+ wp.expect_eq(int(i8[tid]), tid)
270
+ wp.expect_eq(int(u8[tid]), tid)
271
+ wp.expect_eq(int(i16[tid]), tid)
272
+ wp.expect_eq(int(u16[tid]), tid)
273
+ wp.expect_eq(int(i32[tid]), tid)
274
+ wp.expect_eq(int(u32[tid]), tid)
275
+ wp.expect_eq(int(i64[tid]), tid)
276
+ wp.expect_eq(int(u64[tid]), tid)
277
+ wp.expect_eq(float(f32[tid]), float(tid))
278
+ wp.expect_eq(float(f64[tid]), float(tid))
279
+
280
+
281
+ @wp.kernel
282
+ def test_scalar_array_types_store(
283
+ i8: wp.array(dtype=wp.int8),
284
+ u8: wp.array(dtype=wp.uint8),
285
+ i16: wp.array(dtype=wp.int16),
286
+ u16: wp.array(dtype=wp.uint16),
287
+ i32: wp.array(dtype=wp.int32),
288
+ u32: wp.array(dtype=wp.uint32),
289
+ i64: wp.array(dtype=wp.int64),
290
+ u64: wp.array(dtype=wp.uint64),
291
+ f32: wp.array(dtype=wp.float32),
292
+ f64: wp.array(dtype=wp.float64),
293
+ ):
294
+ tid = wp.tid()
295
+
296
+ i8[tid] = wp.int8(tid)
297
+ u8[tid] = wp.uint8(tid)
298
+ i16[tid] = wp.int16(tid)
299
+ u16[tid] = wp.uint16(tid)
300
+ i32[tid] = wp.int32(tid)
301
+ u32[tid] = wp.uint32(tid)
302
+ i64[tid] = wp.int64(tid)
303
+ u64[tid] = wp.uint64(tid)
304
+ f32[tid] = wp.float32(tid)
305
+ f64[tid] = wp.float64(tid)
306
+
307
+ # check round-trip
308
+ wp.expect_eq(int(i8[tid]), tid)
309
+ wp.expect_eq(int(u8[tid]), tid)
310
+ wp.expect_eq(int(i16[tid]), tid)
311
+ wp.expect_eq(int(u16[tid]), tid)
312
+ wp.expect_eq(int(i32[tid]), tid)
313
+ wp.expect_eq(int(u32[tid]), tid)
314
+ wp.expect_eq(int(i64[tid]), tid)
315
+ wp.expect_eq(int(u64[tid]), tid)
316
+ wp.expect_eq(float(f32[tid]), float(tid))
317
+ wp.expect_eq(float(f64[tid]), float(tid))
318
+
319
+
320
+ @wp.kernel
321
+ def test_type_conversions():
322
+ # below tests auto-generated by the following snippet:
323
+
324
+ # scalar_types_all = [*wp.types.scalar_types, int, float]
325
+ # for t in scalar_types_all:
326
+ # for u in scalar_types_all:
327
+
328
+ # def prefix(t):
329
+ # if t == int or t == float:
330
+ # return t.__name__
331
+ # else:
332
+ # return "wp." + t.__name__
333
+
334
+ # print(f"wp.expect_eq({prefix(t)}(2.0), {prefix(t)}({prefix(u)}(2.0)))")
335
+
336
+ wp.expect_eq(wp.int8(2.0), wp.int8(wp.int8(2.0)))
337
+ wp.expect_eq(wp.int8(2.0), wp.int8(wp.uint8(2.0)))
338
+ wp.expect_eq(wp.int8(2.0), wp.int8(wp.int16(2.0)))
339
+ wp.expect_eq(wp.int8(2.0), wp.int8(wp.uint16(2.0)))
340
+ wp.expect_eq(wp.int8(2.0), wp.int8(wp.int32(2.0)))
341
+ wp.expect_eq(wp.int8(2.0), wp.int8(wp.uint32(2.0)))
342
+ wp.expect_eq(wp.int8(2.0), wp.int8(wp.int64(2.0)))
343
+ wp.expect_eq(wp.int8(2.0), wp.int8(wp.uint64(2.0)))
344
+ wp.expect_eq(wp.int8(2.0), wp.int8(wp.float16(2.0)))
345
+ wp.expect_eq(wp.int8(2.0), wp.int8(wp.float32(2.0)))
346
+ wp.expect_eq(wp.int8(2.0), wp.int8(wp.float64(2.0)))
347
+ wp.expect_eq(wp.int8(2.0), wp.int8(int(2.0)))
348
+ wp.expect_eq(wp.int8(2.0), wp.int8(float(2.0)))
349
+ wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.int8(2.0)))
350
+ wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.uint8(2.0)))
351
+ wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.int16(2.0)))
352
+ wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.uint16(2.0)))
353
+ wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.int32(2.0)))
354
+ wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.uint32(2.0)))
355
+ wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.int64(2.0)))
356
+ wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.uint64(2.0)))
357
+ wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.float16(2.0)))
358
+ wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.float32(2.0)))
359
+ wp.expect_eq(wp.uint8(2.0), wp.uint8(wp.float64(2.0)))
360
+ wp.expect_eq(wp.uint8(2.0), wp.uint8(int(2.0)))
361
+ wp.expect_eq(wp.uint8(2.0), wp.uint8(float(2.0)))
362
+ wp.expect_eq(wp.int16(2.0), wp.int16(wp.int8(2.0)))
363
+ wp.expect_eq(wp.int16(2.0), wp.int16(wp.uint8(2.0)))
364
+ wp.expect_eq(wp.int16(2.0), wp.int16(wp.int16(2.0)))
365
+ wp.expect_eq(wp.int16(2.0), wp.int16(wp.uint16(2.0)))
366
+ wp.expect_eq(wp.int16(2.0), wp.int16(wp.int32(2.0)))
367
+ wp.expect_eq(wp.int16(2.0), wp.int16(wp.uint32(2.0)))
368
+ wp.expect_eq(wp.int16(2.0), wp.int16(wp.int64(2.0)))
369
+ wp.expect_eq(wp.int16(2.0), wp.int16(wp.uint64(2.0)))
370
+ wp.expect_eq(wp.int16(2.0), wp.int16(wp.float16(2.0)))
371
+ wp.expect_eq(wp.int16(2.0), wp.int16(wp.float32(2.0)))
372
+ wp.expect_eq(wp.int16(2.0), wp.int16(wp.float64(2.0)))
373
+ wp.expect_eq(wp.int16(2.0), wp.int16(int(2.0)))
374
+ wp.expect_eq(wp.int16(2.0), wp.int16(float(2.0)))
375
+ wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.int8(2.0)))
376
+ wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.uint8(2.0)))
377
+ wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.int16(2.0)))
378
+ wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.uint16(2.0)))
379
+ wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.int32(2.0)))
380
+ wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.uint32(2.0)))
381
+ wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.int64(2.0)))
382
+ wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.uint64(2.0)))
383
+ wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.float16(2.0)))
384
+ wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.float32(2.0)))
385
+ wp.expect_eq(wp.uint16(2.0), wp.uint16(wp.float64(2.0)))
386
+ wp.expect_eq(wp.uint16(2.0), wp.uint16(int(2.0)))
387
+ wp.expect_eq(wp.uint16(2.0), wp.uint16(float(2.0)))
388
+ wp.expect_eq(wp.int32(2.0), wp.int32(wp.int8(2.0)))
389
+ wp.expect_eq(wp.int32(2.0), wp.int32(wp.uint8(2.0)))
390
+ wp.expect_eq(wp.int32(2.0), wp.int32(wp.int16(2.0)))
391
+ wp.expect_eq(wp.int32(2.0), wp.int32(wp.uint16(2.0)))
392
+ wp.expect_eq(wp.int32(2.0), wp.int32(wp.int32(2.0)))
393
+ wp.expect_eq(wp.int32(2.0), wp.int32(wp.uint32(2.0)))
394
+ wp.expect_eq(wp.int32(2.0), wp.int32(wp.int64(2.0)))
395
+ wp.expect_eq(wp.int32(2.0), wp.int32(wp.uint64(2.0)))
396
+ wp.expect_eq(wp.int32(2.0), wp.int32(wp.float16(2.0)))
397
+ wp.expect_eq(wp.int32(2.0), wp.int32(wp.float32(2.0)))
398
+ wp.expect_eq(wp.int32(2.0), wp.int32(wp.float64(2.0)))
399
+ wp.expect_eq(wp.int32(2.0), wp.int32(int(2.0)))
400
+ wp.expect_eq(wp.int32(2.0), wp.int32(float(2.0)))
401
+ wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.int8(2.0)))
402
+ wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.uint8(2.0)))
403
+ wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.int16(2.0)))
404
+ wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.uint16(2.0)))
405
+ wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.int32(2.0)))
406
+ wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.uint32(2.0)))
407
+ wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.int64(2.0)))
408
+ wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.uint64(2.0)))
409
+ wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.float16(2.0)))
410
+ wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.float32(2.0)))
411
+ wp.expect_eq(wp.uint32(2.0), wp.uint32(wp.float64(2.0)))
412
+ wp.expect_eq(wp.uint32(2.0), wp.uint32(int(2.0)))
413
+ wp.expect_eq(wp.uint32(2.0), wp.uint32(float(2.0)))
414
+ wp.expect_eq(wp.int64(2.0), wp.int64(wp.int8(2.0)))
415
+ wp.expect_eq(wp.int64(2.0), wp.int64(wp.uint8(2.0)))
416
+ wp.expect_eq(wp.int64(2.0), wp.int64(wp.int16(2.0)))
417
+ wp.expect_eq(wp.int64(2.0), wp.int64(wp.uint16(2.0)))
418
+ wp.expect_eq(wp.int64(2.0), wp.int64(wp.int32(2.0)))
419
+ wp.expect_eq(wp.int64(2.0), wp.int64(wp.uint32(2.0)))
420
+ wp.expect_eq(wp.int64(2.0), wp.int64(wp.int64(2.0)))
421
+ wp.expect_eq(wp.int64(2.0), wp.int64(wp.uint64(2.0)))
422
+ wp.expect_eq(wp.int64(2.0), wp.int64(wp.float16(2.0)))
423
+ wp.expect_eq(wp.int64(2.0), wp.int64(wp.float32(2.0)))
424
+ wp.expect_eq(wp.int64(2.0), wp.int64(wp.float64(2.0)))
425
+ wp.expect_eq(wp.int64(2.0), wp.int64(int(2.0)))
426
+ wp.expect_eq(wp.int64(2.0), wp.int64(float(2.0)))
427
+ wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.int8(2.0)))
428
+ wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.uint8(2.0)))
429
+ wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.int16(2.0)))
430
+ wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.uint16(2.0)))
431
+ wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.int32(2.0)))
432
+ wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.uint32(2.0)))
433
+ wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.int64(2.0)))
434
+ wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.uint64(2.0)))
435
+ wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.float16(2.0)))
436
+ wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.float32(2.0)))
437
+ wp.expect_eq(wp.uint64(2.0), wp.uint64(wp.float64(2.0)))
438
+ wp.expect_eq(wp.uint64(2.0), wp.uint64(int(2.0)))
439
+ wp.expect_eq(wp.uint64(2.0), wp.uint64(float(2.0)))
440
+ wp.expect_eq(wp.float16(2.0), wp.float16(wp.int8(2.0)))
441
+ wp.expect_eq(wp.float16(2.0), wp.float16(wp.uint8(2.0)))
442
+ wp.expect_eq(wp.float16(2.0), wp.float16(wp.int16(2.0)))
443
+ wp.expect_eq(wp.float16(2.0), wp.float16(wp.uint16(2.0)))
444
+ wp.expect_eq(wp.float16(2.0), wp.float16(wp.int32(2.0)))
445
+ wp.expect_eq(wp.float16(2.0), wp.float16(wp.uint32(2.0)))
446
+ wp.expect_eq(wp.float16(2.0), wp.float16(wp.int64(2.0)))
447
+ wp.expect_eq(wp.float16(2.0), wp.float16(wp.uint64(2.0)))
448
+ wp.expect_eq(wp.float16(2.0), wp.float16(wp.float16(2.0)))
449
+ wp.expect_eq(wp.float16(2.0), wp.float16(wp.float32(2.0)))
450
+ wp.expect_eq(wp.float16(2.0), wp.float16(wp.float64(2.0)))
451
+ wp.expect_eq(wp.float16(2.0), wp.float16(int(2.0)))
452
+ wp.expect_eq(wp.float16(2.0), wp.float16(float(2.0)))
453
+ wp.expect_eq(wp.float32(2.0), wp.float32(wp.int8(2.0)))
454
+ wp.expect_eq(wp.float32(2.0), wp.float32(wp.uint8(2.0)))
455
+ wp.expect_eq(wp.float32(2.0), wp.float32(wp.int16(2.0)))
456
+ wp.expect_eq(wp.float32(2.0), wp.float32(wp.uint16(2.0)))
457
+ wp.expect_eq(wp.float32(2.0), wp.float32(wp.int32(2.0)))
458
+ wp.expect_eq(wp.float32(2.0), wp.float32(wp.uint32(2.0)))
459
+ wp.expect_eq(wp.float32(2.0), wp.float32(wp.int64(2.0)))
460
+ wp.expect_eq(wp.float32(2.0), wp.float32(wp.uint64(2.0)))
461
+ wp.expect_eq(wp.float32(2.0), wp.float32(wp.float16(2.0)))
462
+ wp.expect_eq(wp.float32(2.0), wp.float32(wp.float32(2.0)))
463
+ wp.expect_eq(wp.float32(2.0), wp.float32(wp.float64(2.0)))
464
+ wp.expect_eq(wp.float32(2.0), wp.float32(int(2.0)))
465
+ wp.expect_eq(wp.float32(2.0), wp.float32(float(2.0)))
466
+ wp.expect_eq(wp.float64(2.0), wp.float64(wp.int8(2.0)))
467
+ wp.expect_eq(wp.float64(2.0), wp.float64(wp.uint8(2.0)))
468
+ wp.expect_eq(wp.float64(2.0), wp.float64(wp.int16(2.0)))
469
+ wp.expect_eq(wp.float64(2.0), wp.float64(wp.uint16(2.0)))
470
+ wp.expect_eq(wp.float64(2.0), wp.float64(wp.int32(2.0)))
471
+ wp.expect_eq(wp.float64(2.0), wp.float64(wp.uint32(2.0)))
472
+ wp.expect_eq(wp.float64(2.0), wp.float64(wp.int64(2.0)))
473
+ wp.expect_eq(wp.float64(2.0), wp.float64(wp.uint64(2.0)))
474
+ wp.expect_eq(wp.float64(2.0), wp.float64(wp.float16(2.0)))
475
+ wp.expect_eq(wp.float64(2.0), wp.float64(wp.float32(2.0)))
476
+ wp.expect_eq(wp.float64(2.0), wp.float64(wp.float64(2.0)))
477
+ wp.expect_eq(wp.float64(2.0), wp.float64(int(2.0)))
478
+ wp.expect_eq(wp.float64(2.0), wp.float64(float(2.0)))
479
+ wp.expect_eq(int(2.0), int(wp.int8(2.0)))
480
+ wp.expect_eq(int(2.0), int(wp.uint8(2.0)))
481
+ wp.expect_eq(int(2.0), int(wp.int16(2.0)))
482
+ wp.expect_eq(int(2.0), int(wp.uint16(2.0)))
483
+ wp.expect_eq(int(2.0), int(wp.int32(2.0)))
484
+ wp.expect_eq(int(2.0), int(wp.uint32(2.0)))
485
+ wp.expect_eq(int(2.0), int(wp.int64(2.0)))
486
+ wp.expect_eq(int(2.0), int(wp.uint64(2.0)))
487
+ wp.expect_eq(int(2.0), int(wp.float16(2.0)))
488
+ wp.expect_eq(int(2.0), int(wp.float32(2.0)))
489
+ wp.expect_eq(int(2.0), int(wp.float64(2.0)))
490
+ wp.expect_eq(int(2.0), int(int(2.0)))
491
+ wp.expect_eq(int(2.0), int(float(2.0)))
492
+ wp.expect_eq(float(2.0), float(wp.int8(2.0)))
493
+ wp.expect_eq(float(2.0), float(wp.uint8(2.0)))
494
+ wp.expect_eq(float(2.0), float(wp.int16(2.0)))
495
+ wp.expect_eq(float(2.0), float(wp.uint16(2.0)))
496
+ wp.expect_eq(float(2.0), float(wp.int32(2.0)))
497
+ wp.expect_eq(float(2.0), float(wp.uint32(2.0)))
498
+ wp.expect_eq(float(2.0), float(wp.int64(2.0)))
499
+ wp.expect_eq(float(2.0), float(wp.uint64(2.0)))
500
+ wp.expect_eq(float(2.0), float(wp.float16(2.0)))
501
+ wp.expect_eq(float(2.0), float(wp.float32(2.0)))
502
+ wp.expect_eq(float(2.0), float(wp.float64(2.0)))
503
+ wp.expect_eq(float(2.0), float(int(2.0)))
504
+ wp.expect_eq(float(2.0), float(float(2.0)))
505
+
506
+
507
+ def test_scalar_array_types(test, device, load, store):
508
+ dim = 64
509
+
510
+ i8 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.int8), device=device)
511
+ u8 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.uint8), device=device)
512
+ i16 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.int16), device=device)
513
+ u16 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.uint16), device=device)
514
+ i32 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.int32), device=device)
515
+ u32 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.uint32), device=device)
516
+ i64 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.int64), device=device)
517
+ u64 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.uint64), device=device)
518
+ f32 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.float32), device=device)
519
+ f64 = wp.array(np.linspace(0, dim, dim, endpoint=False, dtype=np.float64), device=device)
520
+
521
+ if load:
522
+ wp.launch(
523
+ test_scalar_array_types_load,
524
+ dim=dim,
525
+ inputs=[i8, u8, i16, u16, i32, u32, i64, u64, f32, f64],
526
+ device=device,
527
+ )
528
+
529
+ if store:
530
+ wp.launch(
531
+ test_scalar_array_types_store,
532
+ dim=dim,
533
+ inputs=[i8, u8, i16, u16, i32, u32, i64, u64, f32, f64],
534
+ device=device,
535
+ )
536
+
537
+
538
+ @wp.kernel
539
+ def test_transform_matrix():
540
+ r = wp.quat_from_axis_angle(wp.vec3(1.0, 0.0, 0.0), 0.5)
541
+ t = wp.vec3(0.25, 0.5, -0.75)
542
+ s = wp.vec3(2.0, 0.5, 0.75)
543
+
544
+ m = wp.mat44(t, r, s)
545
+
546
+ p = wp.vec3(1.0, 2.0, 3.0)
547
+
548
+ r_0 = wp.quat_rotate(r, wp.cw_mul(s, p)) + t
549
+ r_1 = wp.transform_point(m, p)
550
+
551
+ r_2 = wp.transform_vector(m, p)
552
+
553
+ wp.expect_near(r_0, r_1, 1.0e-4)
554
+ wp.expect_near(r_2, r_0 - t, 1.0e-4)
555
+
556
+
557
+ devices = get_test_devices()
558
+
559
+
560
+ class TestCTypes(unittest.TestCase):
561
+ pass
562
+
563
+
564
+ inputs = [
565
+ wp.vec2(1.0, 2.0),
566
+ wp.vec3(1.0, 2.0, 3.0),
567
+ wp.vec4(1.0, 2.0, 3.0, 4.0),
568
+ wp.mat22(1.0, 2.0, 3.0, 4.0),
569
+ wp.mat33(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0),
570
+ wp.mat44(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0),
571
+ ]
572
+
573
+ add_function_test(TestCTypes, "test_mat22", test_mat22, devices=devices)
574
+ add_function_test(TestCTypes, "test_mat33", test_mat33, devices=devices)
575
+ add_function_test(TestCTypes, "test_mat44", test_mat44, devices=devices)
576
+ add_kernel_test(
577
+ TestCTypes, name="test_transformation_constructor", kernel=test_transformation_constructor, dim=1, devices=devices
578
+ )
579
+ add_kernel_test(
580
+ TestCTypes, name="test_spatial_vector_constructor", kernel=test_spatial_vector_constructor, dim=1, devices=devices
581
+ )
582
+ add_kernel_test(
583
+ TestCTypes,
584
+ name="test_scalar_arg_types",
585
+ kernel=test_scalar_arg_types,
586
+ dim=1,
587
+ inputs=[-64, 255, -64, 255, -64, 255, -64, 255, 3.14159, 3.14159],
588
+ devices=devices,
589
+ )
590
+ add_kernel_test(
591
+ TestCTypes,
592
+ name="test_scalar_arg_types_explicit",
593
+ kernel=test_scalar_arg_types,
594
+ dim=1,
595
+ inputs=[
596
+ wp.int8(-64),
597
+ wp.uint8(255),
598
+ wp.int16(-64),
599
+ wp.uint16(255),
600
+ wp.int32(-64),
601
+ wp.uint32(255),
602
+ wp.int64(-64),
603
+ wp.uint64(255),
604
+ wp.float32(3.14159),
605
+ wp.float64(3.14159),
606
+ ],
607
+ devices=devices,
608
+ )
609
+ add_kernel_test(
610
+ TestCTypes, name="test_vector_arg_types", kernel=test_vector_arg_types, dim=1, inputs=inputs, devices=devices
611
+ )
612
+ add_kernel_test(TestCTypes, name="test_type_convesrions", kernel=test_type_conversions, dim=1, devices=devices)
613
+
614
+ add_function_test(
615
+ TestCTypes, "test_scalar_array_load", test_scalar_array_types, devices=devices, load=True, store=False
616
+ )
617
+ add_function_test(
618
+ TestCTypes, "test_scalar_array_store", test_scalar_array_types, devices=devices, load=False, store=True
619
+ )
620
+ add_function_test(TestCTypes, "test_vec2_arg", test_vec2_arg, devices=devices, n=8)
621
+ add_function_test(TestCTypes, "test_vec2_transform", test_vec2_transform, devices=devices, n=8)
622
+ add_function_test(TestCTypes, "test_vec3_arg", test_vec3_arg, devices=devices, n=8)
623
+ add_function_test(TestCTypes, "test_vec3_transform", test_vec3_transform, devices=devices, n=8)
624
+ add_function_test(TestCTypes, "test_transform_multiply", test_transform_multiply, devices=devices, n=8)
625
+ add_kernel_test(TestCTypes, name="test_transform_matrix", kernel=test_transform_matrix, dim=1, devices=devices)
626
+ add_function_test(TestCTypes, "test_scalar_array", test_scalar_array, devices=devices)
627
+ add_function_test(TestCTypes, "test_vector_array", test_vector_array, devices=devices)
628
+
629
+
630
+ if __name__ == "__main__":
631
+ wp.build.clear_kernel_cache()
632
+ unittest.main(verbosity=2)