warp-lang 1.0.2__py3-none-win_amd64.whl → 1.2.0__py3-none-win_amd64.whl

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

Potentially problematic release.


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

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