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
@@ -5,14 +5,14 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
- # include parent path
9
- import numpy as np
8
+ import unittest
10
9
  from typing import Any
11
10
 
12
- import warp as wp
13
- from warp.tests.test_base import *
11
+ import numpy as np
14
12
 
15
- import unittest
13
+ import warp as wp
14
+ from warp.tests.test_array import FillStruct
15
+ from warp.tests.unittest_utils import *
16
16
 
17
17
  wp.init()
18
18
 
@@ -36,7 +36,7 @@ def test_indexedarray_1d(test, device):
36
36
 
37
37
  indices = wp.array([1, 3, 5, 7, 9], dtype=int, device=device)
38
38
 
39
- iarr = wp.indexedarray(arr, [indices])
39
+ iarr = wp.indexedarray1d(arr, [indices])
40
40
 
41
41
  test.assertEqual(iarr.dtype, arr.dtype)
42
42
  test.assertEqual(iarr.ndim, 1)
@@ -72,7 +72,7 @@ def test_indexedarray_2d(test, device):
72
72
  indices0 = wp.array([1, 3], dtype=int, device=device)
73
73
  indices1 = wp.array([2, 4, 8], dtype=int, device=device)
74
74
 
75
- iarr = wp.indexedarray(arr, [indices0, indices1])
75
+ iarr = wp.indexedarray2d(arr, [indices0, indices1])
76
76
 
77
77
  test.assertEqual(iarr.dtype, arr.dtype)
78
78
  test.assertEqual(iarr.ndim, 2)
@@ -112,7 +112,7 @@ def test_indexedarray_3d(test, device):
112
112
  indices1 = wp.array([2, 4, 8], dtype=int, device=device)
113
113
  indices2 = wp.array([0, 5], dtype=int, device=device)
114
114
 
115
- iarr = wp.indexedarray(arr, [indices0, indices1, indices2])
115
+ iarr = wp.indexedarray3d(arr, [indices0, indices1, indices2])
116
116
 
117
117
  test.assertEqual(iarr.dtype, arr.dtype)
118
118
  test.assertEqual(iarr.ndim, 3)
@@ -157,7 +157,7 @@ def test_indexedarray_4d(test, device):
157
157
  indices2 = wp.array([0, 5], dtype=int, device=device)
158
158
  indices3 = wp.array([6, 7, 9], dtype=int, device=device)
159
159
 
160
- iarr = wp.indexedarray(arr, [indices0, indices1, indices2, indices3])
160
+ iarr = wp.indexedarray4d(arr, [indices0, indices1, indices2, indices3])
161
161
 
162
162
  test.assertEqual(iarr.dtype, arr.dtype)
163
163
  test.assertEqual(iarr.ndim, 4)
@@ -557,25 +557,578 @@ def test_indexedarray_generics(test, device):
557
557
  assert_np_equal(ia4.numpy(), np.full((2, 2, 2, 2), 2, dtype=np.int32))
558
558
 
559
559
 
560
- def register(parent):
561
- devices = get_test_devices()
560
+ def test_indexedarray_empty(test, device):
561
+ # Test whether common operations work with empty (zero-sized) indexed arrays
562
+ # without throwing exceptions.
563
+
564
+ def test_empty_ops(ndim, nrows, ncols, wptype, nptype):
565
+ data_shape = (1,) * ndim
566
+ dtype_shape = ()
567
+
568
+ if wptype in wp.types.scalar_types:
569
+ # scalar, vector, or matrix
570
+ if ncols > 0:
571
+ if nrows > 0:
572
+ wptype = wp.types.matrix((nrows, ncols), wptype)
573
+ else:
574
+ wptype = wp.types.vector(ncols, wptype)
575
+ dtype_shape = wptype._shape_
576
+ fill_value = wptype(42)
577
+ else:
578
+ # struct
579
+ fill_value = wptype()
580
+
581
+ # create a data array
582
+ data = wp.empty(data_shape, dtype=wptype, device=device, requires_grad=True)
583
+
584
+ # create a zero-sized array of indices
585
+ indices = wp.empty(0, dtype=int, device=device)
586
+
587
+ a = data[indices]
588
+
589
+ # we expect dim to be zero for the empty indexed array, unchanged otherwise
590
+ expected_shape = (0, *data_shape[1:])
591
+
592
+ test.assertEqual(a.size, 0)
593
+ test.assertEqual(a.shape, expected_shape)
594
+
595
+ # all of these methods should succeed with zero-sized arrays
596
+ a.zero_()
597
+ a.fill_(fill_value)
598
+ b = a.contiguous()
599
+
600
+ b = wp.empty_like(a)
601
+ b = wp.zeros_like(a)
602
+ b = wp.full_like(a, fill_value)
603
+ b = wp.clone(a)
604
+
605
+ wp.copy(a, b)
606
+ a.assign(b)
607
+
608
+ na = a.numpy()
609
+ test.assertEqual(na.size, 0)
610
+ test.assertEqual(na.shape, (*expected_shape, *dtype_shape))
611
+ test.assertEqual(na.dtype, nptype)
562
612
 
563
- class TestIndexedArray(parent):
564
- pass
613
+ test.assertEqual(a.list(), [])
565
614
 
566
- add_function_test(TestIndexedArray, "test_indexedarray_1d", test_indexedarray_1d, devices=devices)
567
- add_function_test(TestIndexedArray, "test_indexedarray_2d", test_indexedarray_2d, devices=devices)
568
- add_function_test(TestIndexedArray, "test_indexedarray_3d", test_indexedarray_3d, devices=devices)
569
- add_function_test(TestIndexedArray, "test_indexedarray_4d", test_indexedarray_4d, devices=devices)
570
- add_function_test(TestIndexedArray, "test_indexedarray_mixed", test_indexedarray_mixed, devices=devices)
571
- add_function_test(TestIndexedArray, "test_indexedarray_shape", test_indexedarray_shape, devices=devices)
572
- add_function_test(TestIndexedArray, "test_indexedarray_getitem", test_indexedarray_getitem, devices=devices)
573
- add_function_test(TestIndexedArray, "test_indexedarray_slicing", test_indexedarray_slicing, devices=devices)
574
- add_function_test(TestIndexedArray, "test_indexedarray_generics", test_indexedarray_generics, devices=devices)
615
+ for ndim in range(1, 5):
616
+ # test with scalars, vectors, and matrices
617
+ for nptype, wptype in wp.types.np_dtype_to_warp_type.items():
618
+ # scalars
619
+ test_empty_ops(ndim, 0, 0, wptype, nptype)
620
+
621
+ for ncols in [2, 3, 4, 5]:
622
+ # vectors
623
+ test_empty_ops(ndim, 0, ncols, wptype, nptype)
624
+ # square matrices
625
+ test_empty_ops(ndim, ncols, ncols, wptype, nptype)
626
+
627
+ # non-square matrices
628
+ test_empty_ops(ndim, 2, 3, wptype, nptype)
629
+ test_empty_ops(ndim, 3, 2, wptype, nptype)
630
+ test_empty_ops(ndim, 3, 4, wptype, nptype)
631
+ test_empty_ops(ndim, 4, 3, wptype, nptype)
575
632
 
576
- return TestIndexedArray
633
+ # test with structs
634
+ test_empty_ops(ndim, 0, 0, FillStruct, FillStruct.numpy_dtype())
635
+
636
+
637
+ def test_indexedarray_fill_scalar(test, device):
638
+ dim_x = 4
639
+
640
+ for nptype, wptype in wp.types.np_dtype_to_warp_type.items():
641
+ data1 = wp.zeros(dim_x, dtype=wptype, device=device)
642
+ data2 = wp.zeros((dim_x, dim_x), dtype=wptype, device=device)
643
+ data3 = wp.zeros((dim_x, dim_x, dim_x), dtype=wptype, device=device)
644
+ data4 = wp.zeros((dim_x, dim_x, dim_x, dim_x), dtype=wptype, device=device)
645
+
646
+ indices = wp.array(np.arange(0, dim_x, 2, dtype=np.int32), device=device)
647
+
648
+ a1 = data1[indices]
649
+ a2 = data2[indices]
650
+ a3 = data3[indices]
651
+ a4 = data4[indices]
652
+
653
+ assert_np_equal(a1.numpy(), np.zeros(a1.shape, dtype=nptype))
654
+ assert_np_equal(a2.numpy(), np.zeros(a2.shape, dtype=nptype))
655
+ assert_np_equal(a3.numpy(), np.zeros(a3.shape, dtype=nptype))
656
+ assert_np_equal(a4.numpy(), np.zeros(a4.shape, dtype=nptype))
657
+
658
+ # fill with int value
659
+ fill_value = 42
660
+
661
+ a1.fill_(fill_value)
662
+ a2.fill_(fill_value)
663
+ a3.fill_(fill_value)
664
+ a4.fill_(fill_value)
665
+
666
+ assert_np_equal(a1.numpy(), np.full(a1.shape, fill_value, dtype=nptype))
667
+ assert_np_equal(a2.numpy(), np.full(a2.shape, fill_value, dtype=nptype))
668
+ assert_np_equal(a3.numpy(), np.full(a3.shape, fill_value, dtype=nptype))
669
+ assert_np_equal(a4.numpy(), np.full(a4.shape, fill_value, dtype=nptype))
670
+
671
+ a1.zero_()
672
+ a2.zero_()
673
+ a3.zero_()
674
+ a4.zero_()
675
+
676
+ assert_np_equal(a1.numpy(), np.zeros(a1.shape, dtype=nptype))
677
+ assert_np_equal(a2.numpy(), np.zeros(a2.shape, dtype=nptype))
678
+ assert_np_equal(a3.numpy(), np.zeros(a3.shape, dtype=nptype))
679
+ assert_np_equal(a4.numpy(), np.zeros(a4.shape, dtype=nptype))
680
+
681
+ if wptype in wp.types.float_types:
682
+ # fill with float value
683
+ fill_value = 13.37
684
+
685
+ a1.fill_(fill_value)
686
+ a2.fill_(fill_value)
687
+ a3.fill_(fill_value)
688
+ a4.fill_(fill_value)
689
+
690
+ assert_np_equal(a1.numpy(), np.full(a1.shape, fill_value, dtype=nptype))
691
+ assert_np_equal(a2.numpy(), np.full(a2.shape, fill_value, dtype=nptype))
692
+ assert_np_equal(a3.numpy(), np.full(a3.shape, fill_value, dtype=nptype))
693
+ assert_np_equal(a4.numpy(), np.full(a4.shape, fill_value, dtype=nptype))
694
+
695
+ # fill with Warp scalar value
696
+ fill_value = wptype(17)
697
+
698
+ a1.fill_(fill_value)
699
+ a2.fill_(fill_value)
700
+ a3.fill_(fill_value)
701
+ a4.fill_(fill_value)
702
+
703
+ assert_np_equal(a1.numpy(), np.full(a1.shape, fill_value.value, dtype=nptype))
704
+ assert_np_equal(a2.numpy(), np.full(a2.shape, fill_value.value, dtype=nptype))
705
+ assert_np_equal(a3.numpy(), np.full(a3.shape, fill_value.value, dtype=nptype))
706
+ assert_np_equal(a4.numpy(), np.full(a4.shape, fill_value.value, dtype=nptype))
707
+
708
+
709
+ def test_indexedarray_fill_vector(test, device):
710
+ # test filling a vector array with scalar or vector values (vec_type, list, or numpy array)
711
+
712
+ dim_x = 4
713
+
714
+ for nptype, wptype in wp.types.np_dtype_to_warp_type.items():
715
+ # vector types
716
+ vector_types = [
717
+ wp.types.vector(2, wptype),
718
+ wp.types.vector(3, wptype),
719
+ wp.types.vector(4, wptype),
720
+ wp.types.vector(5, wptype),
721
+ ]
722
+
723
+ for vec_type in vector_types:
724
+ vec_len = vec_type._length_
725
+
726
+ data1 = wp.zeros(dim_x, dtype=vec_type, device=device)
727
+ data2 = wp.zeros((dim_x, dim_x), dtype=vec_type, device=device)
728
+ data3 = wp.zeros((dim_x, dim_x, dim_x), dtype=vec_type, device=device)
729
+ data4 = wp.zeros((dim_x, dim_x, dim_x, dim_x), dtype=vec_type, device=device)
730
+
731
+ indices = wp.array(np.arange(0, dim_x, 2, dtype=np.int32), device=device)
732
+
733
+ a1 = data1[indices]
734
+ a2 = data2[indices]
735
+ a3 = data3[indices]
736
+ a4 = data4[indices]
737
+
738
+ assert_np_equal(a1.numpy(), np.zeros((*a1.shape, vec_len), dtype=nptype))
739
+ assert_np_equal(a2.numpy(), np.zeros((*a2.shape, vec_len), dtype=nptype))
740
+ assert_np_equal(a3.numpy(), np.zeros((*a3.shape, vec_len), dtype=nptype))
741
+ assert_np_equal(a4.numpy(), np.zeros((*a4.shape, vec_len), dtype=nptype))
742
+
743
+ # fill with int scalar
744
+ fill_value = 42
745
+
746
+ a1.fill_(fill_value)
747
+ a2.fill_(fill_value)
748
+ a3.fill_(fill_value)
749
+ a4.fill_(fill_value)
750
+
751
+ assert_np_equal(a1.numpy(), np.full((*a1.shape, vec_len), fill_value, dtype=nptype))
752
+ assert_np_equal(a2.numpy(), np.full((*a2.shape, vec_len), fill_value, dtype=nptype))
753
+ assert_np_equal(a3.numpy(), np.full((*a3.shape, vec_len), fill_value, dtype=nptype))
754
+ assert_np_equal(a4.numpy(), np.full((*a4.shape, vec_len), fill_value, dtype=nptype))
755
+
756
+ # test zeroing
757
+ a1.zero_()
758
+ a2.zero_()
759
+ a3.zero_()
760
+ a4.zero_()
761
+
762
+ assert_np_equal(a1.numpy(), np.zeros((*a1.shape, vec_len), dtype=nptype))
763
+ assert_np_equal(a2.numpy(), np.zeros((*a2.shape, vec_len), dtype=nptype))
764
+ assert_np_equal(a3.numpy(), np.zeros((*a3.shape, vec_len), dtype=nptype))
765
+ assert_np_equal(a4.numpy(), np.zeros((*a4.shape, vec_len), dtype=nptype))
766
+
767
+ # vector values can be passed as a list, numpy array, or Warp vector instance
768
+ fill_list = [17, 42, 99, 101, 127][:vec_len]
769
+ fill_arr = np.array(fill_list, dtype=nptype)
770
+ fill_vec = vec_type(fill_list)
771
+
772
+ expected1 = np.tile(fill_arr, a1.size).reshape((*a1.shape, vec_len))
773
+ expected2 = np.tile(fill_arr, a2.size).reshape((*a2.shape, vec_len))
774
+ expected3 = np.tile(fill_arr, a3.size).reshape((*a3.shape, vec_len))
775
+ expected4 = np.tile(fill_arr, a4.size).reshape((*a4.shape, vec_len))
776
+
777
+ # fill with list of vector length
778
+ a1.fill_(fill_list)
779
+ a2.fill_(fill_list)
780
+ a3.fill_(fill_list)
781
+ a4.fill_(fill_list)
782
+
783
+ assert_np_equal(a1.numpy(), expected1)
784
+ assert_np_equal(a2.numpy(), expected2)
785
+ assert_np_equal(a3.numpy(), expected3)
786
+ assert_np_equal(a4.numpy(), expected4)
787
+
788
+ # clear
789
+ a1.zero_()
790
+ a2.zero_()
791
+ a3.zero_()
792
+ a4.zero_()
793
+
794
+ # fill with numpy array of vector length
795
+ a1.fill_(fill_arr)
796
+ a2.fill_(fill_arr)
797
+ a3.fill_(fill_arr)
798
+ a4.fill_(fill_arr)
799
+
800
+ assert_np_equal(a1.numpy(), expected1)
801
+ assert_np_equal(a2.numpy(), expected2)
802
+ assert_np_equal(a3.numpy(), expected3)
803
+ assert_np_equal(a4.numpy(), expected4)
804
+
805
+ # clear
806
+ a1.zero_()
807
+ a2.zero_()
808
+ a3.zero_()
809
+ a4.zero_()
810
+
811
+ # fill with vec instance
812
+ a1.fill_(fill_vec)
813
+ a2.fill_(fill_vec)
814
+ a3.fill_(fill_vec)
815
+ a4.fill_(fill_vec)
816
+
817
+ assert_np_equal(a1.numpy(), expected1)
818
+ assert_np_equal(a2.numpy(), expected2)
819
+ assert_np_equal(a3.numpy(), expected3)
820
+ assert_np_equal(a4.numpy(), expected4)
821
+
822
+ if wptype in wp.types.float_types:
823
+ # fill with float scalar
824
+ fill_value = 13.37
825
+
826
+ a1.fill_(fill_value)
827
+ a2.fill_(fill_value)
828
+ a3.fill_(fill_value)
829
+ a4.fill_(fill_value)
830
+
831
+ assert_np_equal(a1.numpy(), np.full((*a1.shape, vec_len), fill_value, dtype=nptype))
832
+ assert_np_equal(a2.numpy(), np.full((*a2.shape, vec_len), fill_value, dtype=nptype))
833
+ assert_np_equal(a3.numpy(), np.full((*a3.shape, vec_len), fill_value, dtype=nptype))
834
+ assert_np_equal(a4.numpy(), np.full((*a4.shape, vec_len), fill_value, dtype=nptype))
835
+
836
+ # fill with float list of vector length
837
+ fill_list = [-2.5, -1.25, 1.25, 2.5, 5.0][:vec_len]
838
+
839
+ a1.fill_(fill_list)
840
+ a2.fill_(fill_list)
841
+ a3.fill_(fill_list)
842
+ a4.fill_(fill_list)
843
+
844
+ expected1 = np.tile(np.array(fill_list, dtype=nptype), a1.size).reshape((*a1.shape, vec_len))
845
+ expected2 = np.tile(np.array(fill_list, dtype=nptype), a2.size).reshape((*a2.shape, vec_len))
846
+ expected3 = np.tile(np.array(fill_list, dtype=nptype), a3.size).reshape((*a3.shape, vec_len))
847
+ expected4 = np.tile(np.array(fill_list, dtype=nptype), a4.size).reshape((*a4.shape, vec_len))
848
+
849
+ assert_np_equal(a1.numpy(), expected1)
850
+ assert_np_equal(a2.numpy(), expected2)
851
+ assert_np_equal(a3.numpy(), expected3)
852
+ assert_np_equal(a4.numpy(), expected4)
853
+
854
+
855
+ def test_indexedarray_fill_matrix(test, device):
856
+ # test filling a matrix array with scalar or matrix values (mat_type, nested list, or 2d numpy array)
857
+
858
+ dim_x = 4
859
+
860
+ for nptype, wptype in wp.types.np_dtype_to_warp_type.items():
861
+ # matrix types
862
+ matrix_types = [
863
+ # square matrices
864
+ wp.types.matrix((2, 2), wptype),
865
+ wp.types.matrix((3, 3), wptype),
866
+ wp.types.matrix((4, 4), wptype),
867
+ wp.types.matrix((5, 5), wptype),
868
+ # non-square matrices
869
+ wp.types.matrix((2, 3), wptype),
870
+ wp.types.matrix((3, 2), wptype),
871
+ wp.types.matrix((3, 4), wptype),
872
+ wp.types.matrix((4, 3), wptype),
873
+ ]
874
+
875
+ for mat_type in matrix_types:
876
+ mat_len = mat_type._length_
877
+ mat_shape = mat_type._shape_
878
+
879
+ data1 = wp.zeros(dim_x, dtype=mat_type, device=device)
880
+ data2 = wp.zeros((dim_x, dim_x), dtype=mat_type, device=device)
881
+ data3 = wp.zeros((dim_x, dim_x, dim_x), dtype=mat_type, device=device)
882
+ data4 = wp.zeros((dim_x, dim_x, dim_x, dim_x), dtype=mat_type, device=device)
883
+
884
+ indices = wp.array(np.arange(0, dim_x, 2, dtype=np.int32), device=device)
885
+
886
+ a1 = data1[indices]
887
+ a2 = data2[indices]
888
+ a3 = data3[indices]
889
+ a4 = data4[indices]
890
+
891
+ assert_np_equal(a1.numpy(), np.zeros((*a1.shape, *mat_shape), dtype=nptype))
892
+ assert_np_equal(a2.numpy(), np.zeros((*a2.shape, *mat_shape), dtype=nptype))
893
+ assert_np_equal(a3.numpy(), np.zeros((*a3.shape, *mat_shape), dtype=nptype))
894
+ assert_np_equal(a4.numpy(), np.zeros((*a4.shape, *mat_shape), dtype=nptype))
895
+
896
+ # fill with scalar
897
+ fill_value = 42
898
+
899
+ a1.fill_(fill_value)
900
+ a2.fill_(fill_value)
901
+ a3.fill_(fill_value)
902
+ a4.fill_(fill_value)
903
+
904
+ assert_np_equal(a1.numpy(), np.full((*a1.shape, *mat_shape), fill_value, dtype=nptype))
905
+ assert_np_equal(a2.numpy(), np.full((*a2.shape, *mat_shape), fill_value, dtype=nptype))
906
+ assert_np_equal(a3.numpy(), np.full((*a3.shape, *mat_shape), fill_value, dtype=nptype))
907
+ assert_np_equal(a4.numpy(), np.full((*a4.shape, *mat_shape), fill_value, dtype=nptype))
908
+
909
+ # test zeroing
910
+ a1.zero_()
911
+ a2.zero_()
912
+ a3.zero_()
913
+ a4.zero_()
914
+
915
+ assert_np_equal(a1.numpy(), np.zeros((*a1.shape, *mat_shape), dtype=nptype))
916
+ assert_np_equal(a2.numpy(), np.zeros((*a2.shape, *mat_shape), dtype=nptype))
917
+ assert_np_equal(a3.numpy(), np.zeros((*a3.shape, *mat_shape), dtype=nptype))
918
+ assert_np_equal(a4.numpy(), np.zeros((*a4.shape, *mat_shape), dtype=nptype))
919
+
920
+ # matrix values can be passed as a 1d numpy array, 2d numpy array, flat list, nested list, or Warp matrix instance
921
+ if wptype != wp.bool:
922
+ fill_arr1 = np.arange(mat_len, dtype=nptype)
923
+ else:
924
+ fill_arr1 = np.ones(mat_len, dtype=nptype)
925
+ fill_arr2 = fill_arr1.reshape(mat_shape)
926
+ fill_list1 = list(fill_arr1)
927
+ fill_list2 = [list(row) for row in fill_arr2]
928
+ fill_mat = mat_type(fill_arr1)
929
+
930
+ expected1 = np.tile(fill_arr1, a1.size).reshape((*a1.shape, *mat_shape))
931
+ expected2 = np.tile(fill_arr1, a2.size).reshape((*a2.shape, *mat_shape))
932
+ expected3 = np.tile(fill_arr1, a3.size).reshape((*a3.shape, *mat_shape))
933
+ expected4 = np.tile(fill_arr1, a4.size).reshape((*a4.shape, *mat_shape))
934
+
935
+ # fill with 1d numpy array
936
+ a1.fill_(fill_arr1)
937
+ a2.fill_(fill_arr1)
938
+ a3.fill_(fill_arr1)
939
+ a4.fill_(fill_arr1)
940
+
941
+ assert_np_equal(a1.numpy(), expected1)
942
+ assert_np_equal(a2.numpy(), expected2)
943
+ assert_np_equal(a3.numpy(), expected3)
944
+ assert_np_equal(a4.numpy(), expected4)
945
+
946
+ # clear
947
+ a1.zero_()
948
+ a2.zero_()
949
+ a3.zero_()
950
+ a4.zero_()
951
+
952
+ # fill with 2d numpy array
953
+ a1.fill_(fill_arr2)
954
+ a2.fill_(fill_arr2)
955
+ a3.fill_(fill_arr2)
956
+ a4.fill_(fill_arr2)
957
+
958
+ assert_np_equal(a1.numpy(), expected1)
959
+ assert_np_equal(a2.numpy(), expected2)
960
+ assert_np_equal(a3.numpy(), expected3)
961
+ assert_np_equal(a4.numpy(), expected4)
962
+
963
+ # clear
964
+ a1.zero_()
965
+ a2.zero_()
966
+ a3.zero_()
967
+ a4.zero_()
968
+
969
+ # fill with flat list
970
+ a1.fill_(fill_list1)
971
+ a2.fill_(fill_list1)
972
+ a3.fill_(fill_list1)
973
+ a4.fill_(fill_list1)
974
+
975
+ assert_np_equal(a1.numpy(), expected1)
976
+ assert_np_equal(a2.numpy(), expected2)
977
+ assert_np_equal(a3.numpy(), expected3)
978
+ assert_np_equal(a4.numpy(), expected4)
979
+
980
+ # clear
981
+ a1.zero_()
982
+ a2.zero_()
983
+ a3.zero_()
984
+ a4.zero_()
985
+
986
+ # fill with nested list
987
+ a1.fill_(fill_list2)
988
+ a2.fill_(fill_list2)
989
+ a3.fill_(fill_list2)
990
+ a4.fill_(fill_list2)
991
+
992
+ assert_np_equal(a1.numpy(), expected1)
993
+ assert_np_equal(a2.numpy(), expected2)
994
+ assert_np_equal(a3.numpy(), expected3)
995
+ assert_np_equal(a4.numpy(), expected4)
996
+
997
+ # clear
998
+ a1.zero_()
999
+ a2.zero_()
1000
+ a3.zero_()
1001
+ a4.zero_()
1002
+
1003
+ # fill with mat instance
1004
+ a1.fill_(fill_mat)
1005
+ a2.fill_(fill_mat)
1006
+ a3.fill_(fill_mat)
1007
+ a4.fill_(fill_mat)
1008
+
1009
+ assert_np_equal(a1.numpy(), expected1)
1010
+ assert_np_equal(a2.numpy(), expected2)
1011
+ assert_np_equal(a3.numpy(), expected3)
1012
+ assert_np_equal(a4.numpy(), expected4)
1013
+
1014
+
1015
+ def test_indexedarray_fill_struct(test, device):
1016
+ dim_x = 8
1017
+
1018
+ nptype = FillStruct.numpy_dtype()
1019
+
1020
+ data1 = wp.zeros(dim_x, dtype=FillStruct, device=device)
1021
+ data2 = wp.zeros((dim_x, dim_x), dtype=FillStruct, device=device)
1022
+ data3 = wp.zeros((dim_x, dim_x, dim_x), dtype=FillStruct, device=device)
1023
+ data4 = wp.zeros((dim_x, dim_x, dim_x, dim_x), dtype=FillStruct, device=device)
1024
+
1025
+ indices = wp.array(np.arange(0, dim_x, 2, dtype=np.int32), device=device)
1026
+
1027
+ a1 = data1[indices]
1028
+ a2 = data2[indices]
1029
+ a3 = data3[indices]
1030
+ a4 = data4[indices]
1031
+
1032
+ assert_np_equal(a1.numpy(), np.zeros(a1.shape, dtype=nptype))
1033
+ assert_np_equal(a2.numpy(), np.zeros(a2.shape, dtype=nptype))
1034
+ assert_np_equal(a3.numpy(), np.zeros(a3.shape, dtype=nptype))
1035
+ assert_np_equal(a4.numpy(), np.zeros(a4.shape, dtype=nptype))
1036
+
1037
+ s = FillStruct()
1038
+
1039
+ # fill with default struct value (should be all zeros)
1040
+ a1.fill_(s)
1041
+ a2.fill_(s)
1042
+ a3.fill_(s)
1043
+ a4.fill_(s)
1044
+
1045
+ assert_np_equal(a1.numpy(), np.zeros(a1.shape, dtype=nptype))
1046
+ assert_np_equal(a2.numpy(), np.zeros(a2.shape, dtype=nptype))
1047
+ assert_np_equal(a3.numpy(), np.zeros(a3.shape, dtype=nptype))
1048
+ assert_np_equal(a4.numpy(), np.zeros(a4.shape, dtype=nptype))
1049
+
1050
+ # scalars
1051
+ s.i1 = -17
1052
+ s.i2 = 42
1053
+ s.i4 = 99
1054
+ s.i8 = 101
1055
+ s.f2 = -1.25
1056
+ s.f4 = 13.37
1057
+ s.f8 = 0.125
1058
+ # vectors
1059
+ s.v2 = [21, 22]
1060
+ s.v3 = [31, 32, 33]
1061
+ s.v4 = [41, 42, 43, 44]
1062
+ s.v5 = [51, 52, 53, 54, 55]
1063
+ # matrices
1064
+ s.m2 = [[61, 62]] * 2
1065
+ s.m3 = [[71, 72, 73]] * 3
1066
+ s.m4 = [[81, 82, 83, 84]] * 4
1067
+ s.m5 = [[91, 92, 93, 94, 95]] * 5
1068
+ # arrays
1069
+ s.a1 = wp.zeros((2,) * 1, dtype=float, device=device)
1070
+ s.a2 = wp.zeros((2,) * 2, dtype=float, device=device)
1071
+ s.a3 = wp.zeros((2,) * 3, dtype=float, device=device)
1072
+ s.a4 = wp.zeros((2,) * 4, dtype=float, device=device)
1073
+
1074
+ # fill with custom struct value
1075
+ a1.fill_(s)
1076
+ a2.fill_(s)
1077
+ a3.fill_(s)
1078
+ a4.fill_(s)
1079
+
1080
+ ns = s.numpy_value()
1081
+
1082
+ expected1 = np.empty(a1.shape, dtype=nptype)
1083
+ expected2 = np.empty(a2.shape, dtype=nptype)
1084
+ expected3 = np.empty(a3.shape, dtype=nptype)
1085
+ expected4 = np.empty(a4.shape, dtype=nptype)
1086
+
1087
+ expected1.fill(ns)
1088
+ expected2.fill(ns)
1089
+ expected3.fill(ns)
1090
+ expected4.fill(ns)
1091
+
1092
+ assert_np_equal(a1.numpy(), expected1)
1093
+ assert_np_equal(a2.numpy(), expected2)
1094
+ assert_np_equal(a3.numpy(), expected3)
1095
+ assert_np_equal(a4.numpy(), expected4)
1096
+
1097
+ # test clearing
1098
+ a1.zero_()
1099
+ a2.zero_()
1100
+ a3.zero_()
1101
+ a4.zero_()
1102
+
1103
+ assert_np_equal(a1.numpy(), np.zeros(a1.shape, dtype=nptype))
1104
+ assert_np_equal(a2.numpy(), np.zeros(a2.shape, dtype=nptype))
1105
+ assert_np_equal(a3.numpy(), np.zeros(a3.shape, dtype=nptype))
1106
+ assert_np_equal(a4.numpy(), np.zeros(a4.shape, dtype=nptype))
1107
+
1108
+
1109
+ devices = get_test_devices()
1110
+
1111
+
1112
+ class TestIndexedArray(unittest.TestCase):
1113
+ pass
1114
+
1115
+
1116
+ add_function_test(TestIndexedArray, "test_indexedarray_1d", test_indexedarray_1d, devices=devices)
1117
+ add_function_test(TestIndexedArray, "test_indexedarray_2d", test_indexedarray_2d, devices=devices)
1118
+ add_function_test(TestIndexedArray, "test_indexedarray_3d", test_indexedarray_3d, devices=devices)
1119
+ add_function_test(TestIndexedArray, "test_indexedarray_4d", test_indexedarray_4d, devices=devices)
1120
+ add_function_test(TestIndexedArray, "test_indexedarray_mixed", test_indexedarray_mixed, devices=devices)
1121
+ add_function_test(TestIndexedArray, "test_indexedarray_shape", test_indexedarray_shape, devices=devices)
1122
+ add_function_test(TestIndexedArray, "test_indexedarray_getitem", test_indexedarray_getitem, devices=devices)
1123
+ add_function_test(TestIndexedArray, "test_indexedarray_slicing", test_indexedarray_slicing, devices=devices)
1124
+ add_function_test(TestIndexedArray, "test_indexedarray_generics", test_indexedarray_generics, devices=devices)
1125
+ add_function_test(TestIndexedArray, "test_indexedarray_empty", test_indexedarray_empty, devices=devices)
1126
+ add_function_test(TestIndexedArray, "test_indexedarray_fill_scalar", test_indexedarray_fill_scalar, devices=devices)
1127
+ add_function_test(TestIndexedArray, "test_indexedarray_fill_vector", test_indexedarray_fill_vector, devices=devices)
1128
+ add_function_test(TestIndexedArray, "test_indexedarray_fill_matrix", test_indexedarray_fill_matrix, devices=devices)
1129
+ add_function_test(TestIndexedArray, "test_indexedarray_fill_struct", test_indexedarray_fill_struct, devices=devices)
577
1130
 
578
1131
 
579
1132
  if __name__ == "__main__":
580
- c = register(unittest.TestCase)
1133
+ wp.build.clear_kernel_cache()
581
1134
  unittest.main(verbosity=2)
@@ -1,6 +1,16 @@
1
- import warp as wp
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
+
2
10
  import numpy as np
3
- from warp.tests.test_base import *
11
+
12
+ import warp as wp
13
+ from warp.tests.unittest_utils import *
4
14
 
5
15
  wp.init()
6
16
 
@@ -42,17 +52,16 @@ def test_intersect_tri(test, device):
42
52
  assert_np_equal(result.numpy(), np.array([0]))
43
53
 
44
54
 
45
- def register(parent):
46
- devices = get_test_devices()
55
+ devices = get_test_devices()
56
+
47
57
 
48
- class TestIntersect(parent):
49
- pass
58
+ class TestIntersect(unittest.TestCase):
59
+ pass
50
60
 
51
- add_function_test(TestIntersect, "test_intersect_tri", test_intersect_tri, devices=devices)
52
61
 
53
- return TestIntersect
62
+ add_function_test(TestIntersect, "test_intersect_tri", test_intersect_tri, devices=devices)
54
63
 
55
64
 
56
65
  if __name__ == "__main__":
57
- c = register(unittest.TestCase)
66
+ wp.build.clear_kernel_cache()
58
67
  unittest.main(verbosity=2, failfast=False)