warp-lang 0.9.0__py3-none-win_amd64.whl → 0.11.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 (315) hide show
  1. warp/__init__.py +15 -7
  2. warp/__init__.pyi +1 -0
  3. warp/bin/warp-clang.dll +0 -0
  4. warp/bin/warp.dll +0 -0
  5. warp/build.py +22 -443
  6. warp/build_dll.py +384 -0
  7. warp/builtins.py +998 -488
  8. warp/codegen.py +1307 -739
  9. warp/config.py +5 -3
  10. warp/constants.py +6 -0
  11. warp/context.py +1291 -548
  12. warp/dlpack.py +31 -31
  13. warp/fabric.py +326 -0
  14. warp/fem/__init__.py +27 -0
  15. warp/fem/cache.py +389 -0
  16. warp/fem/dirichlet.py +181 -0
  17. warp/fem/domain.py +263 -0
  18. warp/fem/field/__init__.py +101 -0
  19. warp/fem/field/field.py +149 -0
  20. warp/fem/field/nodal_field.py +299 -0
  21. warp/fem/field/restriction.py +21 -0
  22. warp/fem/field/test.py +181 -0
  23. warp/fem/field/trial.py +183 -0
  24. warp/fem/geometry/__init__.py +19 -0
  25. warp/fem/geometry/closest_point.py +70 -0
  26. warp/fem/geometry/deformed_geometry.py +271 -0
  27. warp/fem/geometry/element.py +744 -0
  28. warp/fem/geometry/geometry.py +186 -0
  29. warp/fem/geometry/grid_2d.py +373 -0
  30. warp/fem/geometry/grid_3d.py +435 -0
  31. warp/fem/geometry/hexmesh.py +953 -0
  32. warp/fem/geometry/partition.py +376 -0
  33. warp/fem/geometry/quadmesh_2d.py +532 -0
  34. warp/fem/geometry/tetmesh.py +840 -0
  35. warp/fem/geometry/trimesh_2d.py +577 -0
  36. warp/fem/integrate.py +1616 -0
  37. warp/fem/operator.py +191 -0
  38. warp/fem/polynomial.py +213 -0
  39. warp/fem/quadrature/__init__.py +2 -0
  40. warp/fem/quadrature/pic_quadrature.py +245 -0
  41. warp/fem/quadrature/quadrature.py +294 -0
  42. warp/fem/space/__init__.py +292 -0
  43. warp/fem/space/basis_space.py +489 -0
  44. warp/fem/space/collocated_function_space.py +105 -0
  45. warp/fem/space/dof_mapper.py +236 -0
  46. warp/fem/space/function_space.py +145 -0
  47. warp/fem/space/grid_2d_function_space.py +267 -0
  48. warp/fem/space/grid_3d_function_space.py +306 -0
  49. warp/fem/space/hexmesh_function_space.py +352 -0
  50. warp/fem/space/partition.py +350 -0
  51. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  52. warp/fem/space/restriction.py +160 -0
  53. warp/fem/space/shape/__init__.py +15 -0
  54. warp/fem/space/shape/cube_shape_function.py +738 -0
  55. warp/fem/space/shape/shape_function.py +103 -0
  56. warp/fem/space/shape/square_shape_function.py +611 -0
  57. warp/fem/space/shape/tet_shape_function.py +567 -0
  58. warp/fem/space/shape/triangle_shape_function.py +429 -0
  59. warp/fem/space/tetmesh_function_space.py +292 -0
  60. warp/fem/space/topology.py +295 -0
  61. warp/fem/space/trimesh_2d_function_space.py +221 -0
  62. warp/fem/types.py +77 -0
  63. warp/fem/utils.py +495 -0
  64. warp/native/array.h +164 -55
  65. warp/native/builtin.h +150 -174
  66. warp/native/bvh.cpp +75 -328
  67. warp/native/bvh.cu +406 -23
  68. warp/native/bvh.h +37 -45
  69. warp/native/clang/clang.cpp +136 -24
  70. warp/native/crt.cpp +1 -76
  71. warp/native/crt.h +111 -104
  72. warp/native/cuda_crt.h +1049 -0
  73. warp/native/cuda_util.cpp +15 -3
  74. warp/native/cuda_util.h +3 -1
  75. warp/native/cutlass/tools/library/scripts/conv2d_operation.py +463 -0
  76. warp/native/cutlass/tools/library/scripts/conv3d_operation.py +321 -0
  77. warp/native/cutlass/tools/library/scripts/gemm_operation.py +988 -0
  78. warp/native/cutlass/tools/library/scripts/generator.py +4625 -0
  79. warp/native/cutlass/tools/library/scripts/library.py +799 -0
  80. warp/native/cutlass/tools/library/scripts/manifest.py +402 -0
  81. warp/native/cutlass/tools/library/scripts/pycutlass/docs/source/conf.py +96 -0
  82. warp/native/cutlass/tools/library/scripts/pycutlass/profile/conv/conv2d_f16_sm80.py +106 -0
  83. warp/native/cutlass/tools/library/scripts/pycutlass/profile/gemm/gemm_f32_sm80.py +91 -0
  84. warp/native/cutlass/tools/library/scripts/pycutlass/setup.py +80 -0
  85. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/__init__.py +48 -0
  86. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/arguments.py +118 -0
  87. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/c_types.py +241 -0
  88. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/compiler.py +432 -0
  89. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/conv2d_operation.py +631 -0
  90. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/epilogue.py +1026 -0
  91. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/frontend.py +104 -0
  92. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/gemm_operation.py +1276 -0
  93. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/library.py +744 -0
  94. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/memory_manager.py +74 -0
  95. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/operation.py +110 -0
  96. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/parser.py +619 -0
  97. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/reduction_operation.py +398 -0
  98. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/tensor_ref.py +70 -0
  99. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/__init__.py +4 -0
  100. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/conv2d_testbed.py +646 -0
  101. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_grouped_testbed.py +235 -0
  102. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_testbed.py +557 -0
  103. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/profiler.py +70 -0
  104. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/type_hint.py +39 -0
  105. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/__init__.py +1 -0
  106. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/device.py +76 -0
  107. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/reference_model.py +255 -0
  108. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/__init__.py +0 -0
  109. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +201 -0
  110. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +177 -0
  111. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +98 -0
  112. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +95 -0
  113. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_few_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +163 -0
  114. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_fixed_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +187 -0
  115. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +309 -0
  116. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +54 -0
  117. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  118. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  119. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_strided_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +253 -0
  120. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +97 -0
  121. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +242 -0
  122. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  123. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  124. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/run_all_tests.py +10 -0
  125. warp/native/cutlass/tools/library/scripts/pycutlass/test/frontend/test_frontend.py +146 -0
  126. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/__init__.py +0 -0
  127. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_bf16_sm80.py +96 -0
  128. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f16_sm80.py +447 -0
  129. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f32_sm80.py +146 -0
  130. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f64_sm80.py +102 -0
  131. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_grouped_sm80.py +203 -0
  132. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_s8_sm80.py +229 -0
  133. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/run_all_tests.py +9 -0
  134. warp/native/cutlass/tools/library/scripts/pycutlass/test/unit/test_sm80.py +453 -0
  135. warp/native/cutlass/tools/library/scripts/rank_2k_operation.py +398 -0
  136. warp/native/cutlass/tools/library/scripts/rank_k_operation.py +387 -0
  137. warp/native/cutlass/tools/library/scripts/rt.py +796 -0
  138. warp/native/cutlass/tools/library/scripts/symm_operation.py +400 -0
  139. warp/native/cutlass/tools/library/scripts/trmm_operation.py +407 -0
  140. warp/native/cutlass_gemm.cu +5 -3
  141. warp/native/exports.h +1240 -949
  142. warp/native/fabric.h +228 -0
  143. warp/native/hashgrid.cpp +4 -4
  144. warp/native/hashgrid.h +22 -2
  145. warp/native/initializer_array.h +2 -2
  146. warp/native/intersect.h +22 -7
  147. warp/native/intersect_adj.h +8 -8
  148. warp/native/intersect_tri.h +13 -16
  149. warp/native/marching.cu +157 -161
  150. warp/native/mat.h +119 -19
  151. warp/native/matnn.h +2 -2
  152. warp/native/mesh.cpp +108 -83
  153. warp/native/mesh.cu +243 -6
  154. warp/native/mesh.h +1547 -458
  155. warp/native/nanovdb/NanoVDB.h +1 -1
  156. warp/native/noise.h +272 -329
  157. warp/native/quat.h +51 -8
  158. warp/native/rand.h +45 -35
  159. warp/native/range.h +6 -2
  160. warp/native/reduce.cpp +157 -0
  161. warp/native/reduce.cu +348 -0
  162. warp/native/runlength_encode.cpp +62 -0
  163. warp/native/runlength_encode.cu +46 -0
  164. warp/native/scan.cu +11 -13
  165. warp/native/scan.h +1 -0
  166. warp/native/solid_angle.h +442 -0
  167. warp/native/sort.cpp +13 -0
  168. warp/native/sort.cu +9 -1
  169. warp/native/sparse.cpp +338 -0
  170. warp/native/sparse.cu +545 -0
  171. warp/native/spatial.h +2 -2
  172. warp/native/temp_buffer.h +30 -0
  173. warp/native/vec.h +126 -24
  174. warp/native/volume.h +120 -0
  175. warp/native/warp.cpp +658 -53
  176. warp/native/warp.cu +660 -68
  177. warp/native/warp.h +112 -12
  178. warp/optim/__init__.py +1 -0
  179. warp/optim/linear.py +922 -0
  180. warp/optim/sgd.py +92 -0
  181. warp/render/render_opengl.py +392 -152
  182. warp/render/render_usd.py +11 -11
  183. warp/sim/__init__.py +2 -2
  184. warp/sim/articulation.py +385 -185
  185. warp/sim/collide.py +21 -8
  186. warp/sim/import_mjcf.py +297 -106
  187. warp/sim/import_urdf.py +389 -210
  188. warp/sim/import_usd.py +198 -97
  189. warp/sim/inertia.py +17 -18
  190. warp/sim/integrator_euler.py +14 -8
  191. warp/sim/integrator_xpbd.py +161 -19
  192. warp/sim/model.py +795 -291
  193. warp/sim/optimizer.py +2 -6
  194. warp/sim/render.py +65 -3
  195. warp/sim/utils.py +3 -0
  196. warp/sparse.py +1227 -0
  197. warp/stubs.py +665 -223
  198. warp/tape.py +66 -15
  199. warp/tests/__main__.py +3 -6
  200. warp/tests/assets/curlnoise_golden.npy +0 -0
  201. warp/tests/assets/pnoise_golden.npy +0 -0
  202. warp/tests/assets/torus.usda +105 -105
  203. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  204. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  205. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  206. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  207. warp/tests/aux_test_unresolved_func.py +14 -0
  208. warp/tests/aux_test_unresolved_symbol.py +14 -0
  209. warp/tests/disabled_kinematics.py +239 -0
  210. warp/tests/run_coverage_serial.py +31 -0
  211. warp/tests/test_adam.py +103 -106
  212. warp/tests/test_arithmetic.py +128 -74
  213. warp/tests/test_array.py +1497 -211
  214. warp/tests/test_array_reduce.py +150 -0
  215. warp/tests/test_atomic.py +64 -28
  216. warp/tests/test_bool.py +99 -0
  217. warp/tests/test_builtins_resolution.py +1292 -0
  218. warp/tests/test_bvh.py +75 -43
  219. warp/tests/test_closest_point_edge_edge.py +54 -57
  220. warp/tests/test_codegen.py +233 -128
  221. warp/tests/test_compile_consts.py +28 -20
  222. warp/tests/test_conditional.py +108 -24
  223. warp/tests/test_copy.py +10 -12
  224. warp/tests/test_ctypes.py +112 -88
  225. warp/tests/test_dense.py +21 -14
  226. warp/tests/test_devices.py +98 -0
  227. warp/tests/test_dlpack.py +136 -108
  228. warp/tests/test_examples.py +277 -0
  229. warp/tests/test_fabricarray.py +955 -0
  230. warp/tests/test_fast_math.py +15 -11
  231. warp/tests/test_fem.py +1271 -0
  232. warp/tests/test_fp16.py +53 -19
  233. warp/tests/test_func.py +187 -74
  234. warp/tests/test_generics.py +194 -49
  235. warp/tests/test_grad.py +180 -116
  236. warp/tests/test_grad_customs.py +176 -0
  237. warp/tests/test_hash_grid.py +52 -37
  238. warp/tests/test_import.py +10 -23
  239. warp/tests/test_indexedarray.py +577 -24
  240. warp/tests/test_intersect.py +18 -9
  241. warp/tests/test_large.py +141 -0
  242. warp/tests/test_launch.py +251 -15
  243. warp/tests/test_lerp.py +64 -65
  244. warp/tests/test_linear_solvers.py +154 -0
  245. warp/tests/test_lvalue.py +493 -0
  246. warp/tests/test_marching_cubes.py +12 -13
  247. warp/tests/test_mat.py +508 -2778
  248. warp/tests/test_mat_lite.py +115 -0
  249. warp/tests/test_mat_scalar_ops.py +2889 -0
  250. warp/tests/test_math.py +103 -9
  251. warp/tests/test_matmul.py +305 -69
  252. warp/tests/test_matmul_lite.py +410 -0
  253. warp/tests/test_mesh.py +71 -14
  254. warp/tests/test_mesh_query_aabb.py +41 -25
  255. warp/tests/test_mesh_query_point.py +325 -34
  256. warp/tests/test_mesh_query_ray.py +39 -22
  257. warp/tests/test_mlp.py +30 -22
  258. warp/tests/test_model.py +92 -89
  259. warp/tests/test_modules_lite.py +39 -0
  260. warp/tests/test_multigpu.py +88 -114
  261. warp/tests/test_noise.py +12 -11
  262. warp/tests/test_operators.py +16 -20
  263. warp/tests/test_options.py +11 -11
  264. warp/tests/test_pinned.py +17 -18
  265. warp/tests/test_print.py +32 -11
  266. warp/tests/test_quat.py +275 -129
  267. warp/tests/test_rand.py +18 -16
  268. warp/tests/test_reload.py +38 -34
  269. warp/tests/test_rounding.py +50 -43
  270. warp/tests/test_runlength_encode.py +190 -0
  271. warp/tests/test_smoothstep.py +9 -11
  272. warp/tests/test_snippet.py +143 -0
  273. warp/tests/test_sparse.py +460 -0
  274. warp/tests/test_spatial.py +276 -243
  275. warp/tests/test_streams.py +110 -85
  276. warp/tests/test_struct.py +331 -85
  277. warp/tests/test_tape.py +39 -21
  278. warp/tests/test_torch.py +118 -89
  279. warp/tests/test_transient_module.py +12 -13
  280. warp/tests/test_types.py +614 -0
  281. warp/tests/test_utils.py +494 -0
  282. warp/tests/test_vec.py +354 -1987
  283. warp/tests/test_vec_lite.py +73 -0
  284. warp/tests/test_vec_scalar_ops.py +2099 -0
  285. warp/tests/test_volume.py +457 -293
  286. warp/tests/test_volume_write.py +124 -134
  287. warp/tests/unittest_serial.py +35 -0
  288. warp/tests/unittest_suites.py +341 -0
  289. warp/tests/unittest_utils.py +568 -0
  290. warp/tests/unused_test_misc.py +71 -0
  291. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  292. warp/thirdparty/appdirs.py +36 -45
  293. warp/thirdparty/unittest_parallel.py +549 -0
  294. warp/torch.py +72 -30
  295. warp/types.py +1744 -713
  296. warp/utils.py +360 -350
  297. warp_lang-0.11.0.dist-info/LICENSE.md +36 -0
  298. warp_lang-0.11.0.dist-info/METADATA +238 -0
  299. warp_lang-0.11.0.dist-info/RECORD +332 -0
  300. {warp_lang-0.9.0.dist-info → warp_lang-0.11.0.dist-info}/WHEEL +1 -1
  301. warp/bin/warp-clang.exp +0 -0
  302. warp/bin/warp-clang.lib +0 -0
  303. warp/bin/warp.exp +0 -0
  304. warp/bin/warp.lib +0 -0
  305. warp/tests/test_all.py +0 -215
  306. warp/tests/test_array_scan.py +0 -60
  307. warp/tests/test_base.py +0 -208
  308. warp/tests/test_unresolved_func.py +0 -7
  309. warp/tests/test_unresolved_symbol.py +0 -7
  310. warp_lang-0.9.0.dist-info/METADATA +0 -20
  311. warp_lang-0.9.0.dist-info/RECORD +0 -177
  312. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  313. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  314. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  315. {warp_lang-0.9.0.dist-info → warp_lang-0.11.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,614 @@
1
+ # Copyright (c) 2023 NVIDIA CORPORATION. All rights reserved.
2
+ # NVIDIA CORPORATION and its licensors retain all intellectual property
3
+ # and proprietary rights in and to this software, related documentation
4
+ # and any modifications thereto. Any use, reproduction, disclosure or
5
+ # distribution of this software and related documentation without an express
6
+ # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
+
8
+ import unittest
9
+
10
+ from warp.tests.unittest_utils import *
11
+
12
+
13
+ wp.init()
14
+
15
+
16
+ def test_bool(test, device):
17
+ value = wp.bool(False)
18
+ test.assertIsInstance(bool(value), bool)
19
+ test.assertIsInstance(int(value), int)
20
+ test.assertIsInstance(float(value), float)
21
+ test.assertEqual(bool(value), False)
22
+ test.assertEqual(int(value), 0)
23
+ test.assertEqual(float(value), 0.0)
24
+ try:
25
+ ctypes.c_bool(value)
26
+ except Exception:
27
+ test.fail()
28
+
29
+ value = wp.bool(True)
30
+ test.assertIsInstance(bool(value), bool)
31
+ test.assertIsInstance(int(value), int)
32
+ test.assertIsInstance(float(value), float)
33
+ test.assertEqual(bool(value), True)
34
+ test.assertEqual(int(value), 1)
35
+ test.assertEqual(float(value), 1.0)
36
+ try:
37
+ ctypes.c_bool(value)
38
+ except Exception:
39
+ test.fail()
40
+
41
+ value = wp.bool(0.0)
42
+ test.assertIsInstance(bool(value), bool)
43
+ test.assertIsInstance(int(value), int)
44
+ test.assertIsInstance(float(value), float)
45
+ test.assertEqual(bool(value), False)
46
+ test.assertEqual(int(value), 0)
47
+ test.assertEqual(float(value), 0.0)
48
+ try:
49
+ ctypes.c_bool(value)
50
+ except Exception:
51
+ test.fail()
52
+
53
+ value = wp.bool(123)
54
+ test.assertIsInstance(bool(value), bool)
55
+ test.assertIsInstance(int(value), int)
56
+ test.assertIsInstance(float(value), float)
57
+ test.assertEqual(bool(value), True)
58
+ test.assertEqual(int(value), 1)
59
+ test.assertEqual(float(value), 1.0)
60
+ try:
61
+ ctypes.c_bool(value)
62
+ except Exception:
63
+ test.fail()
64
+
65
+
66
+ def test_integers(test, device, dtype):
67
+ value = dtype(0)
68
+ test.assertIsInstance(bool(value), bool)
69
+ test.assertIsInstance(int(value), int)
70
+ test.assertIsInstance(float(value), float)
71
+ test.assertEqual(bool(value), False)
72
+ test.assertEqual(int(value), 0)
73
+ test.assertEqual(float(value), 0.0)
74
+ try:
75
+ ctypes.c_bool(value)
76
+ ctypes.c_int(value)
77
+ ctypes.c_float(value)
78
+ except Exception:
79
+ test.fail()
80
+
81
+ value = dtype(123)
82
+ test.assertIsInstance(bool(value), bool)
83
+ test.assertIsInstance(int(value), int)
84
+ test.assertIsInstance(float(value), float)
85
+ test.assertEqual(bool(value), True)
86
+ test.assertEqual(int(value), 123)
87
+ test.assertEqual(float(value), 123.0)
88
+ try:
89
+ ctypes.c_bool(value)
90
+ ctypes.c_int(value)
91
+ ctypes.c_float(value)
92
+ except Exception:
93
+ test.fail()
94
+
95
+
96
+ def test_floats(test, device, dtype):
97
+ value = dtype(0.0)
98
+ test.assertIsInstance(bool(value), bool)
99
+ test.assertIsInstance(int(value), int)
100
+ test.assertIsInstance(float(value), float)
101
+ test.assertEqual(bool(value), False)
102
+ test.assertEqual(int(value), 0)
103
+ test.assertEqual(float(value), 0.0)
104
+ try:
105
+ ctypes.c_bool(value)
106
+ ctypes.c_float(value)
107
+ except Exception:
108
+ test.fail()
109
+
110
+ value = dtype(1.25)
111
+ test.assertIsInstance(bool(value), bool)
112
+ test.assertIsInstance(int(value), int)
113
+ test.assertIsInstance(float(value), float)
114
+ test.assertEqual(bool(value), True)
115
+ test.assertEqual(int(value), 1)
116
+ test.assertEqual(float(value), 1.25)
117
+ try:
118
+ ctypes.c_bool(value)
119
+ ctypes.c_float(value)
120
+ except Exception:
121
+ test.fail()
122
+
123
+
124
+ def test_constant(test, device):
125
+ const = wp.constant(123)
126
+ test.assertEqual(const, 123)
127
+
128
+ const = wp.constant(1.25)
129
+ test.assertEqual(const, 1.25)
130
+
131
+ const = wp.constant(True)
132
+ test.assertEqual(const, True)
133
+
134
+ const = wp.constant(wp.float16(1.25))
135
+ test.assertEqual(const.value, 1.25)
136
+
137
+ const = wp.constant(wp.int16(123))
138
+ test.assertEqual(const.value, 123)
139
+
140
+ const = wp.constant(wp.vec3i(1, 2, 3))
141
+ test.assertEqual(const, wp.vec3i(1, 2, 3))
142
+
143
+
144
+ def test_constant_error_invalid_type(test, device):
145
+ with test.assertRaisesRegex(
146
+ RuntimeError,
147
+ r"Invalid constant type: <class 'tuple'>$",
148
+ ):
149
+ wp.constant((1, 2, 3))
150
+
151
+
152
+ def test_vector(test, device, dtype):
153
+ def make_scalar(x):
154
+ # Cast to the correct integer type to simulate wrapping.
155
+ if dtype in wp.types.int_types:
156
+ return dtype._type_(x).value
157
+
158
+ return x
159
+
160
+ def make_vec(*args):
161
+ if dtype in wp.types.int_types:
162
+ # Cast to the correct integer type to simulate wrapping.
163
+ return tuple(dtype._type_(x).value for x in args)
164
+
165
+ return args
166
+
167
+ vec3_cls = wp.vec(3, dtype)
168
+ vec4_cls = wp.vec(4, dtype)
169
+
170
+ v = vec4_cls(1, 2, 3, 4)
171
+ test.assertEqual(v[0], make_scalar(1))
172
+ test.assertEqual(v.x, make_scalar(1))
173
+ test.assertEqual(v.y, make_scalar(2))
174
+ test.assertEqual(v.z, make_scalar(3))
175
+ test.assertEqual(v.w, make_scalar(4))
176
+ test.assertSequenceEqual(v[0:2], make_vec(1, 2))
177
+ test.assertSequenceEqual(v, make_vec(1, 2, 3, 4))
178
+
179
+ v[0] = -1
180
+ test.assertEqual(v[0], make_scalar(-1))
181
+ test.assertEqual(v.x, make_scalar(-1))
182
+ test.assertEqual(v.y, make_scalar(2))
183
+ test.assertEqual(v.z, make_scalar(3))
184
+ test.assertEqual(v.w, make_scalar(4))
185
+ test.assertSequenceEqual(v[0:2], make_vec(-1, 2))
186
+ test.assertSequenceEqual(v, make_vec(-1, 2, 3, 4))
187
+
188
+ v[1:3] = (-2, -3)
189
+ test.assertEqual(v[0], make_scalar(-1))
190
+ test.assertEqual(v.x, make_scalar(-1))
191
+ test.assertEqual(v.y, make_scalar(-2))
192
+ test.assertEqual(v.z, make_scalar(-3))
193
+ test.assertEqual(v.w, make_scalar(4))
194
+ test.assertSequenceEqual(v[0:2], make_vec(-1, -2))
195
+ test.assertSequenceEqual(v, make_vec(-1, -2, -3, 4))
196
+
197
+ v.x = 1
198
+ test.assertEqual(v[0], make_scalar(1))
199
+ test.assertEqual(v.x, make_scalar(1))
200
+ test.assertEqual(v.y, make_scalar(-2))
201
+ test.assertEqual(v.z, make_scalar(-3))
202
+ test.assertEqual(v.w, make_scalar(4))
203
+ test.assertSequenceEqual(v[0:2], make_vec(1, -2))
204
+ test.assertSequenceEqual(v, make_vec(1, -2, -3, 4))
205
+
206
+ v = vec3_cls(2, 4, 6)
207
+ test.assertSequenceEqual(+v, make_vec(2, 4, 6))
208
+ test.assertSequenceEqual(-v, make_vec(-2, -4, -6))
209
+ test.assertSequenceEqual(v + vec3_cls(1, 1, 1), make_vec(3, 5, 7))
210
+ test.assertSequenceEqual(v - vec3_cls(1, 1, 1), make_vec(1, 3, 5))
211
+ test.assertSequenceEqual(v * dtype(2), make_vec(4, 8, 12))
212
+ test.assertSequenceEqual(dtype(2) * v, make_vec(4, 8, 12))
213
+ test.assertSequenceEqual(v / dtype(2), make_vec(1, 2, 3))
214
+ test.assertSequenceEqual(dtype(12) / v, make_vec(6, 3, 2))
215
+
216
+ test.assertTrue(v != vec3_cls(1, 2, 3))
217
+ test.assertEqual(str(v), "[{}]".format(", ".join(str(x) for x in v)))
218
+
219
+ # Check added purely for coverage reasons but is this really a desired
220
+ # behaviour? Not allowing to define new attributes using systems like
221
+ # `__slots__` could help improving memory usage.
222
+ v.foo = 123
223
+ test.assertEqual(v.foo, 123)
224
+
225
+
226
+ def test_vector_assign(test, device):
227
+ v = wp.vec3s()
228
+ v[0] = 1
229
+ v[1] = wp.int8(2)
230
+ v[2] = np.int8(3)
231
+ test.assertEqual(v, (1, 2, 3))
232
+
233
+ v = wp.vec3h()
234
+ v[0] = 1.0
235
+ v[1] = wp.float16(2.0)
236
+ v[2] = np.float16(3.0)
237
+ test.assertEqual(v, (1.0, 2.0, 3.0))
238
+
239
+
240
+ def test_vector_error_invalid_arg_count(test, device):
241
+ with test.assertRaisesRegex(
242
+ ValueError,
243
+ r"Invalid number of arguments in vector constructor, expected 3 elements, got 2$",
244
+ ):
245
+ wp.vec3(1, 2)
246
+
247
+
248
+ def test_vector_error_invalid_ptr(test, device):
249
+ with test.assertRaisesRegex(
250
+ RuntimeError,
251
+ r"NULL pointer exception",
252
+ ):
253
+ wp.vec3.from_ptr(0)
254
+
255
+
256
+ def test_vector_error_invalid_get_item_key(test, device):
257
+ v = wp.vec3(1, 2, 3)
258
+
259
+ with test.assertRaisesRegex(
260
+ KeyError,
261
+ r"Invalid key None, expected int or slice",
262
+ ):
263
+ v[None]
264
+
265
+
266
+ def test_vector_error_invalid_set_item_key(test, device):
267
+ v = wp.vec3(1, 2, 3)
268
+ with test.assertRaisesRegex(
269
+ KeyError,
270
+ r"Invalid key None, expected int or slice",
271
+ ):
272
+ v[None] = 0
273
+
274
+
275
+ def test_vector_error_invalid_set_item_value(test, device):
276
+ v1 = wp.vec3i(1, 2, 3)
277
+ v2 = wp.vec3h(1, 2, 3)
278
+
279
+ with test.assertRaisesRegex(
280
+ TypeError,
281
+ r"Expected to assign a `int32` value but got `str` instead",
282
+ ):
283
+ v1[0] = "123.0"
284
+
285
+ with test.assertRaisesRegex(
286
+ TypeError,
287
+ r"Expected to assign a slice from a sequence of values but got `int` instead",
288
+ ):
289
+ v1[:] = 123
290
+
291
+ with test.assertRaisesRegex(
292
+ TypeError,
293
+ r"Expected to assign a slice from a sequence of `int32` values but got `vec3i` instead",
294
+ ):
295
+ v1[:1] = (v1,)
296
+
297
+ with test.assertRaisesRegex(
298
+ ValueError,
299
+ r"Can only assign sequence of same size",
300
+ ):
301
+ v1[:1] = (1, 2)
302
+
303
+ with test.assertRaisesRegex(
304
+ TypeError,
305
+ r"Expected to assign a slice from a sequence of `float16` values but got `vec3h` instead",
306
+ ):
307
+ v2[:1] = (v2,)
308
+
309
+
310
+ def test_matrix(test, device):
311
+ for dtype in tuple(wp.types.float_types) + (float,):
312
+
313
+ def make_scalar(x):
314
+ # Cast to the correct integer type to simulate wrapping.
315
+ if dtype in wp.types.int_types:
316
+ return dtype._type_(x).value
317
+
318
+ return x
319
+
320
+ def make_vec(*args):
321
+ if dtype in wp.types.int_types:
322
+ # Cast to the correct integer type to simulate wrapping.
323
+ return tuple(dtype._type_(x).value for x in args)
324
+
325
+ return args
326
+
327
+ def make_mat(*args):
328
+ if dtype in wp.types.int_types:
329
+ # Cast to the correct integer type to simulate wrapping.
330
+ return tuple(tuple(dtype._type_(x).value for x in row) for row in args)
331
+
332
+ return args
333
+
334
+ mat22_cls = wp.mat((2, 2), dtype)
335
+ mat33_cls = wp.mat((3, 3), dtype)
336
+ vec2_cls = wp.vec(2, dtype)
337
+
338
+ m = mat33_cls(((1, 2, 3), (4, 5, 6), (7, 8, 9)))
339
+ test.assertEqual(m[0][0], make_scalar(1))
340
+ test.assertEqual(m[0][1], make_scalar(2))
341
+ test.assertEqual(m[0][2], make_scalar(3))
342
+ test.assertEqual(m[1][0], make_scalar(4))
343
+ test.assertEqual(m[1][1], make_scalar(5))
344
+ test.assertEqual(m[1][2], make_scalar(6))
345
+ test.assertEqual(m[2][0], make_scalar(7))
346
+ test.assertEqual(m[2][1], make_scalar(8))
347
+ test.assertEqual(m[2][2], make_scalar(9))
348
+ test.assertEqual(m[0, 0], make_scalar(1))
349
+ test.assertEqual(m[0, 1], make_scalar(2))
350
+ test.assertEqual(m[0, 2], make_scalar(3))
351
+ test.assertEqual(m[1, 0], make_scalar(4))
352
+ test.assertEqual(m[1, 1], make_scalar(5))
353
+ test.assertEqual(m[1, 2], make_scalar(6))
354
+ test.assertEqual(m[2, 0], make_scalar(7))
355
+ test.assertEqual(m[2, 1], make_scalar(8))
356
+ test.assertEqual(m[2, 2], make_scalar(9))
357
+ test.assertSequenceEqual(m[0], make_vec(1, 2, 3))
358
+ test.assertSequenceEqual(m[1], make_vec(4, 5, 6))
359
+ test.assertSequenceEqual(m[2], make_vec(7, 8, 9))
360
+ test.assertSequenceEqual(m[0][1:3], make_vec(2, 3))
361
+ test.assertSequenceEqual(m[1][0:2], make_vec(4, 5))
362
+ test.assertSequenceEqual(m[2][0:3], make_vec(7, 8, 9))
363
+ # test.assertSequenceEqual(m[0, 1:3], make_vec(2, 3))
364
+ # test.assertSequenceEqual(m[1, 0:2], make_vec(4, 5))
365
+ # test.assertSequenceEqual(m[2, 0:3], make_vec(7, 8, 9))
366
+ test.assertSequenceEqual(m, make_mat((1, 2, 3), (4, 5, 6), (7, 8, 9)))
367
+
368
+ m[1, 0] = -4
369
+ test.assertEqual(m[0][0], make_scalar(1))
370
+ test.assertEqual(m[0][1], make_scalar(2))
371
+ test.assertEqual(m[0][2], make_scalar(3))
372
+ test.assertEqual(m[1][0], make_scalar(-4))
373
+ test.assertEqual(m[1][1], make_scalar(5))
374
+ test.assertEqual(m[1][2], make_scalar(6))
375
+ test.assertEqual(m[2][0], make_scalar(7))
376
+ test.assertEqual(m[2][1], make_scalar(8))
377
+ test.assertEqual(m[2][2], make_scalar(9))
378
+ test.assertEqual(m[0, 0], make_scalar(1))
379
+ test.assertEqual(m[0, 1], make_scalar(2))
380
+ test.assertEqual(m[0, 2], make_scalar(3))
381
+ test.assertEqual(m[1, 0], make_scalar(-4))
382
+ test.assertEqual(m[1, 1], make_scalar(5))
383
+ test.assertEqual(m[1, 2], make_scalar(6))
384
+ test.assertEqual(m[2, 0], make_scalar(7))
385
+ test.assertEqual(m[2, 1], make_scalar(8))
386
+ test.assertEqual(m[2, 2], make_scalar(9))
387
+ test.assertSequenceEqual(m[0], make_vec(1, 2, 3))
388
+ test.assertSequenceEqual(m[1], make_vec(-4, 5, 6))
389
+ test.assertSequenceEqual(m[2], make_vec(7, 8, 9))
390
+ test.assertSequenceEqual(m[0][1:3], make_vec(2, 3))
391
+ test.assertSequenceEqual(m[1][0:2], make_vec(-4, 5))
392
+ test.assertSequenceEqual(m[2][0:3], make_vec(7, 8, 9))
393
+ # test.assertSequenceEqual(m[0, 1:3], make_vec(2, 3))
394
+ # test.assertSequenceEqual(m[1, 0:2], make_vec(-4, 5))
395
+ # test.assertSequenceEqual(m[2, 0:3], make_vec(7, 8, 9))
396
+ test.assertSequenceEqual(m, make_mat((1, 2, 3), (-4, 5, 6), (7, 8, 9)))
397
+
398
+ m[2] = (-7, 8, -9)
399
+ test.assertEqual(m[0][0], make_scalar(1))
400
+ test.assertEqual(m[0][1], make_scalar(2))
401
+ test.assertEqual(m[0][2], make_scalar(3))
402
+ test.assertEqual(m[1][0], make_scalar(-4))
403
+ test.assertEqual(m[1][1], make_scalar(5))
404
+ test.assertEqual(m[1][2], make_scalar(6))
405
+ test.assertEqual(m[2][0], make_scalar(-7))
406
+ test.assertEqual(m[2][1], make_scalar(8))
407
+ test.assertEqual(m[2][2], make_scalar(-9))
408
+ test.assertEqual(m[0, 0], make_scalar(1))
409
+ test.assertEqual(m[0, 1], make_scalar(2))
410
+ test.assertEqual(m[0, 2], make_scalar(3))
411
+ test.assertEqual(m[1, 0], make_scalar(-4))
412
+ test.assertEqual(m[1, 1], make_scalar(5))
413
+ test.assertEqual(m[1, 2], make_scalar(6))
414
+ test.assertEqual(m[2, 0], make_scalar(-7))
415
+ test.assertEqual(m[2, 1], make_scalar(8))
416
+ test.assertEqual(m[2, 2], make_scalar(-9))
417
+ test.assertSequenceEqual(m[0], make_vec(1, 2, 3))
418
+ test.assertSequenceEqual(m[1], make_vec(-4, 5, 6))
419
+ test.assertSequenceEqual(m[2], make_vec(-7, 8, -9))
420
+ test.assertSequenceEqual(m[0][1:3], make_vec(2, 3))
421
+ test.assertSequenceEqual(m[1][0:2], make_vec(-4, 5))
422
+ test.assertSequenceEqual(m[2][0:3], make_vec(-7, 8, -9))
423
+ # test.assertSequenceEqual(m[0, 1:3], make_vec(2, 3))
424
+ # test.assertSequenceEqual(m[1, 0:2], make_vec(-4, 5))
425
+ # test.assertSequenceEqual(m[2, 0:3], make_vec(-7, 8, -9))
426
+ test.assertSequenceEqual(m, make_mat((1, 2, 3), (-4, 5, 6), (-7, 8, -9)))
427
+
428
+ m = mat22_cls(2, 4, 6, 8)
429
+ test.assertSequenceEqual(+m, make_mat((2, 4), (6, 8)))
430
+ test.assertSequenceEqual(-m, make_mat((-2, -4), (-6, -8)))
431
+ test.assertSequenceEqual(m + mat22_cls(1, 1, 1, 1), make_mat((3, 5), (7, 9)))
432
+ test.assertSequenceEqual(m - mat22_cls(1, 1, 1, 1), make_mat((1, 3), (5, 7)))
433
+ test.assertSequenceEqual(m * dtype(2), make_mat((4, 8), (12, 16)))
434
+ test.assertSequenceEqual(dtype(2) * m, make_mat((4, 8), (12, 16)))
435
+ test.assertSequenceEqual(m / dtype(2), make_mat((1, 2), (3, 4)))
436
+ test.assertSequenceEqual(dtype(24) / m, make_mat((12, 6), (4, 3)))
437
+
438
+ test.assertSequenceEqual(m * vec2_cls(1, 2), make_vec(10, 22))
439
+ test.assertSequenceEqual(m @ vec2_cls(1, 2), make_vec(10, 22))
440
+ test.assertSequenceEqual(vec2_cls(1, 2) * m, make_vec(14, 20))
441
+ test.assertSequenceEqual(vec2_cls(1, 2) @ m, make_vec(14, 20))
442
+
443
+ test.assertTrue(m != mat22_cls(1, 2, 3, 4))
444
+ test.assertEqual(
445
+ str(m),
446
+ "[{}]".format(",\n ".join("[{}]".format(", ".join(str(y) for y in m[x])) for x in range(m._shape_[0]))),
447
+ )
448
+
449
+ # Check added purely for coverage reasons but is this really a desired
450
+ # behaviour? Not allowing to define new attributes using systems like
451
+ # `__slots__` could help improving memory usage.
452
+ m.foo = 123
453
+ test.assertEqual(m.foo, 123)
454
+
455
+
456
+ def test_matrix_error_invalid_arg_count(test, device):
457
+ with test.assertRaisesRegex(
458
+ ValueError,
459
+ r"Invalid number of arguments in matrix constructor, expected 4 elements, got 3$",
460
+ ):
461
+ wp.mat22(1, 2, 3)
462
+
463
+
464
+ def test_matrix_error_invalid_row_count(test, device):
465
+ with test.assertRaisesRegex(
466
+ TypeError,
467
+ r"Invalid argument in matrix constructor, expected row of length 2, got \(1, 2, 3\)$",
468
+ ):
469
+ wp.mat22((1, 2, 3), (3, 4, 5))
470
+
471
+
472
+ def test_matrix_error_invalid_ptr(test, device):
473
+ with test.assertRaisesRegex(
474
+ RuntimeError,
475
+ r"NULL pointer exception",
476
+ ):
477
+ wp.mat22.from_ptr(0)
478
+
479
+
480
+ def test_matrix_error_invalid_set_row_index(test, device):
481
+ m = wp.mat22(1, 2, 3, 4)
482
+ with test.assertRaisesRegex(
483
+ IndexError,
484
+ r"Invalid row index$",
485
+ ):
486
+ m.set_row(2, (0, 0))
487
+
488
+
489
+ def test_matrix_error_invalid_get_item_key(test, device):
490
+ m = wp.mat22(1, 2, 3, 4)
491
+
492
+ with test.assertRaisesRegex(
493
+ KeyError,
494
+ r"Invalid key None, expected int or pair of ints",
495
+ ):
496
+ m[None]
497
+
498
+
499
+ def test_matrix_error_invalid_get_item_key_length(test, device):
500
+ m = wp.mat22(1, 2, 3, 4)
501
+
502
+ with test.assertRaisesRegex(
503
+ KeyError,
504
+ r"Invalid key, expected one or two indices, got 3",
505
+ ):
506
+ m[0, 1, 2]
507
+
508
+
509
+ def test_matrix_error_invalid_set_item_key(test, device):
510
+ m = wp.mat22(1, 2, 3, 4)
511
+ with test.assertRaisesRegex(
512
+ KeyError,
513
+ r"Invalid key None, expected int or pair of ints",
514
+ ):
515
+ m[None] = 0
516
+
517
+
518
+ def test_matrix_error_invalid_set_item_key_length(test, device):
519
+ m = wp.mat22(1, 2, 3, 4)
520
+
521
+ with test.assertRaisesRegex(
522
+ KeyError,
523
+ r"Invalid key, expected one or two indices, got 3",
524
+ ):
525
+ m[0, 1, 2] = (0, 0)
526
+
527
+
528
+ def test_matrix_error_invalid_set_item_value(test, device):
529
+ m = wp.mat22h(1, 2, 3, 4)
530
+
531
+ with test.assertRaisesRegex(
532
+ TypeError,
533
+ r"Expected to assign a `float16` value but got `str` instead",
534
+ ):
535
+ m[0, 0] = "123.0"
536
+
537
+ with test.assertRaisesRegex(
538
+ TypeError,
539
+ r"Expected to assign a `float16` value but got `str` instead",
540
+ ):
541
+ m[0][0] = "123.0"
542
+
543
+ with test.assertRaisesRegex(
544
+ TypeError,
545
+ r"Expected to assign a slice from a sequence of values but got `int` instead",
546
+ ):
547
+ m[0] = 123
548
+
549
+ with test.assertRaisesRegex(
550
+ TypeError,
551
+ r"Expected to assign a slice from a sequence of `float16` values but got `mat22h` instead",
552
+ ):
553
+ m[0] = (m,)
554
+
555
+ with test.assertRaisesRegex(
556
+ KeyError,
557
+ r"Slices are not supported when indexing matrices using the `m\[start:end\]` notation",
558
+ ):
559
+ m[:] = 123
560
+
561
+ with test.assertRaisesRegex(
562
+ KeyError,
563
+ r"Slices are not supported when indexing matrices using the `m\[i, j\]` notation",
564
+ ):
565
+ m[0, :1] = (123,)
566
+
567
+ with test.assertRaisesRegex(
568
+ ValueError,
569
+ r"Can only assign sequence of same size",
570
+ ):
571
+ m[0][:1] = (1, 2)
572
+
573
+
574
+ devices = [x for x in get_test_devices() if x.is_cpu]
575
+
576
+
577
+ class TestTypes(unittest.TestCase):
578
+ pass
579
+
580
+
581
+ add_function_test(TestTypes, "test_bool", test_bool, devices=devices)
582
+
583
+ for dtype in wp.types.int_types:
584
+ add_function_test(TestTypes, f"test_integers_{dtype.__name__}", test_integers, devices=devices, dtype=dtype)
585
+
586
+ for dtype in wp.types.float_types:
587
+ add_function_test(TestTypes, f"test_floats_{dtype.__name__}", test_floats, devices=devices, dtype=dtype)
588
+
589
+ add_function_test(TestTypes, "test_constant_error_invalid_type", test_constant_error_invalid_type, devices=devices)
590
+
591
+ for dtype in tuple(wp.types.scalar_types) + (int, float):
592
+ add_function_test(TestTypes, f"test_vector_{dtype.__name__}", test_vector, devices=devices, dtype=dtype)
593
+
594
+ add_function_test(TestTypes, "test_vector_assign", test_vector_assign, devices=devices)
595
+ add_function_test(TestTypes, "test_vector_error_invalid_arg_count", test_vector_error_invalid_arg_count, devices=devices)
596
+ add_function_test(TestTypes, "test_vector_error_invalid_ptr", test_vector_error_invalid_ptr, devices=devices)
597
+ add_function_test(TestTypes, "test_vector_error_invalid_get_item_key", test_vector_error_invalid_get_item_key, devices=devices)
598
+ add_function_test(TestTypes, "test_vector_error_invalid_set_item_key", test_vector_error_invalid_set_item_key, devices=devices)
599
+ add_function_test(TestTypes, "test_vector_error_invalid_set_item_value", test_vector_error_invalid_set_item_value, devices=devices)
600
+ add_function_test(TestTypes, "test_matrix", test_matrix, devices=devices)
601
+ add_function_test(TestTypes, "test_matrix_error_invalid_arg_count", test_matrix_error_invalid_arg_count, devices=devices)
602
+ add_function_test(TestTypes, "test_matrix_error_invalid_row_count", test_matrix_error_invalid_row_count, devices=devices)
603
+ add_function_test(TestTypes, "test_matrix_error_invalid_ptr", test_matrix_error_invalid_ptr, devices=devices)
604
+ add_function_test(TestTypes, "test_matrix_error_invalid_set_row_index", test_matrix_error_invalid_set_row_index, devices=devices)
605
+ add_function_test(TestTypes, "test_matrix_error_invalid_get_item_key", test_matrix_error_invalid_get_item_key, devices=devices)
606
+ add_function_test(TestTypes, "test_matrix_error_invalid_get_item_key_length", test_matrix_error_invalid_get_item_key_length, devices=devices)
607
+ add_function_test(TestTypes, "test_matrix_error_invalid_set_item_key", test_matrix_error_invalid_set_item_key, devices=devices)
608
+ add_function_test(TestTypes, "test_matrix_error_invalid_set_item_key_length", test_matrix_error_invalid_set_item_key_length, devices=devices)
609
+ add_function_test(TestTypes, "test_matrix_error_invalid_set_item_value", test_matrix_error_invalid_set_item_value, devices=devices)
610
+
611
+
612
+ if __name__ == "__main__":
613
+ wp.build.clear_kernel_cache()
614
+ unittest.main(verbosity=2)