warp-lang 1.10.0__py3-none-macosx_11_0_arm64.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 (468) hide show
  1. warp/__init__.py +334 -0
  2. warp/__init__.pyi +5856 -0
  3. warp/_src/__init__.py +14 -0
  4. warp/_src/autograd.py +1077 -0
  5. warp/_src/build.py +620 -0
  6. warp/_src/build_dll.py +642 -0
  7. warp/_src/builtins.py +10555 -0
  8. warp/_src/codegen.py +4361 -0
  9. warp/_src/config.py +178 -0
  10. warp/_src/constants.py +59 -0
  11. warp/_src/context.py +8352 -0
  12. warp/_src/dlpack.py +464 -0
  13. warp/_src/fabric.py +362 -0
  14. warp/_src/fem/__init__.py +14 -0
  15. warp/_src/fem/adaptivity.py +510 -0
  16. warp/_src/fem/cache.py +689 -0
  17. warp/_src/fem/dirichlet.py +190 -0
  18. warp/_src/fem/domain.py +553 -0
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +703 -0
  21. warp/_src/fem/field/nodal_field.py +403 -0
  22. warp/_src/fem/field/restriction.py +39 -0
  23. warp/_src/fem/field/virtual.py +1021 -0
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/_src/fem/geometry/adaptive_nanogrid.py +782 -0
  26. warp/_src/fem/geometry/closest_point.py +99 -0
  27. warp/_src/fem/geometry/deformed_geometry.py +277 -0
  28. warp/_src/fem/geometry/element.py +854 -0
  29. warp/_src/fem/geometry/geometry.py +693 -0
  30. warp/_src/fem/geometry/grid_2d.py +478 -0
  31. warp/_src/fem/geometry/grid_3d.py +539 -0
  32. warp/_src/fem/geometry/hexmesh.py +956 -0
  33. warp/_src/fem/geometry/nanogrid.py +660 -0
  34. warp/_src/fem/geometry/partition.py +483 -0
  35. warp/_src/fem/geometry/quadmesh.py +597 -0
  36. warp/_src/fem/geometry/tetmesh.py +762 -0
  37. warp/_src/fem/geometry/trimesh.py +588 -0
  38. warp/_src/fem/integrate.py +2507 -0
  39. warp/_src/fem/linalg.py +385 -0
  40. warp/_src/fem/operator.py +398 -0
  41. warp/_src/fem/polynomial.py +231 -0
  42. warp/_src/fem/quadrature/__init__.py +17 -0
  43. warp/_src/fem/quadrature/pic_quadrature.py +318 -0
  44. warp/_src/fem/quadrature/quadrature.py +665 -0
  45. warp/_src/fem/space/__init__.py +248 -0
  46. warp/_src/fem/space/basis_function_space.py +499 -0
  47. warp/_src/fem/space/basis_space.py +681 -0
  48. warp/_src/fem/space/dof_mapper.py +253 -0
  49. warp/_src/fem/space/function_space.py +312 -0
  50. warp/_src/fem/space/grid_2d_function_space.py +179 -0
  51. warp/_src/fem/space/grid_3d_function_space.py +229 -0
  52. warp/_src/fem/space/hexmesh_function_space.py +255 -0
  53. warp/_src/fem/space/nanogrid_function_space.py +199 -0
  54. warp/_src/fem/space/partition.py +435 -0
  55. warp/_src/fem/space/quadmesh_function_space.py +222 -0
  56. warp/_src/fem/space/restriction.py +221 -0
  57. warp/_src/fem/space/shape/__init__.py +152 -0
  58. warp/_src/fem/space/shape/cube_shape_function.py +1107 -0
  59. warp/_src/fem/space/shape/shape_function.py +134 -0
  60. warp/_src/fem/space/shape/square_shape_function.py +928 -0
  61. warp/_src/fem/space/shape/tet_shape_function.py +829 -0
  62. warp/_src/fem/space/shape/triangle_shape_function.py +674 -0
  63. warp/_src/fem/space/tetmesh_function_space.py +270 -0
  64. warp/_src/fem/space/topology.py +461 -0
  65. warp/_src/fem/space/trimesh_function_space.py +193 -0
  66. warp/_src/fem/types.py +114 -0
  67. warp/_src/fem/utils.py +488 -0
  68. warp/_src/jax.py +188 -0
  69. warp/_src/jax_experimental/__init__.py +14 -0
  70. warp/_src/jax_experimental/custom_call.py +389 -0
  71. warp/_src/jax_experimental/ffi.py +1286 -0
  72. warp/_src/jax_experimental/xla_ffi.py +658 -0
  73. warp/_src/marching_cubes.py +710 -0
  74. warp/_src/math.py +416 -0
  75. warp/_src/optim/__init__.py +14 -0
  76. warp/_src/optim/adam.py +165 -0
  77. warp/_src/optim/linear.py +1608 -0
  78. warp/_src/optim/sgd.py +114 -0
  79. warp/_src/paddle.py +408 -0
  80. warp/_src/render/__init__.py +14 -0
  81. warp/_src/render/imgui_manager.py +291 -0
  82. warp/_src/render/render_opengl.py +3638 -0
  83. warp/_src/render/render_usd.py +939 -0
  84. warp/_src/render/utils.py +162 -0
  85. warp/_src/sparse.py +2718 -0
  86. warp/_src/tape.py +1208 -0
  87. warp/_src/thirdparty/__init__.py +0 -0
  88. warp/_src/thirdparty/appdirs.py +598 -0
  89. warp/_src/thirdparty/dlpack.py +145 -0
  90. warp/_src/thirdparty/unittest_parallel.py +676 -0
  91. warp/_src/torch.py +393 -0
  92. warp/_src/types.py +5888 -0
  93. warp/_src/utils.py +1695 -0
  94. warp/autograd.py +33 -0
  95. warp/bin/libwarp-clang.dylib +0 -0
  96. warp/bin/libwarp.dylib +0 -0
  97. warp/build.py +29 -0
  98. warp/build_dll.py +24 -0
  99. warp/codegen.py +24 -0
  100. warp/constants.py +24 -0
  101. warp/context.py +33 -0
  102. warp/dlpack.py +24 -0
  103. warp/examples/__init__.py +24 -0
  104. warp/examples/assets/bear.usd +0 -0
  105. warp/examples/assets/bunny.usd +0 -0
  106. warp/examples/assets/cube.usd +0 -0
  107. warp/examples/assets/nonuniform.usd +0 -0
  108. warp/examples/assets/nvidia_logo.png +0 -0
  109. warp/examples/assets/pixel.jpg +0 -0
  110. warp/examples/assets/rocks.nvdb +0 -0
  111. warp/examples/assets/rocks.usd +0 -0
  112. warp/examples/assets/sphere.usd +0 -0
  113. warp/examples/assets/square_cloth.usd +0 -0
  114. warp/examples/benchmarks/benchmark_api.py +389 -0
  115. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  116. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  117. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  118. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  119. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  120. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  121. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  122. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  123. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  124. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  125. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  126. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  127. warp/examples/benchmarks/benchmark_launches.py +301 -0
  128. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  129. warp/examples/benchmarks/benchmark_tile_sort.py +155 -0
  130. warp/examples/browse.py +37 -0
  131. warp/examples/core/example_cupy.py +86 -0
  132. warp/examples/core/example_dem.py +241 -0
  133. warp/examples/core/example_fluid.py +299 -0
  134. warp/examples/core/example_graph_capture.py +150 -0
  135. warp/examples/core/example_marching_cubes.py +195 -0
  136. warp/examples/core/example_mesh.py +180 -0
  137. warp/examples/core/example_mesh_intersect.py +211 -0
  138. warp/examples/core/example_nvdb.py +182 -0
  139. warp/examples/core/example_raycast.py +111 -0
  140. warp/examples/core/example_raymarch.py +205 -0
  141. warp/examples/core/example_render_opengl.py +290 -0
  142. warp/examples/core/example_sample_mesh.py +300 -0
  143. warp/examples/core/example_sph.py +411 -0
  144. warp/examples/core/example_spin_lock.py +93 -0
  145. warp/examples/core/example_torch.py +211 -0
  146. warp/examples/core/example_wave.py +269 -0
  147. warp/examples/core/example_work_queue.py +118 -0
  148. warp/examples/distributed/example_jacobi_mpi.py +506 -0
  149. warp/examples/fem/example_adaptive_grid.py +286 -0
  150. warp/examples/fem/example_apic_fluid.py +469 -0
  151. warp/examples/fem/example_burgers.py +261 -0
  152. warp/examples/fem/example_convection_diffusion.py +181 -0
  153. warp/examples/fem/example_convection_diffusion_dg.py +225 -0
  154. warp/examples/fem/example_darcy_ls_optimization.py +489 -0
  155. warp/examples/fem/example_deformed_geometry.py +172 -0
  156. warp/examples/fem/example_diffusion.py +196 -0
  157. warp/examples/fem/example_diffusion_3d.py +225 -0
  158. warp/examples/fem/example_diffusion_mgpu.py +225 -0
  159. warp/examples/fem/example_distortion_energy.py +228 -0
  160. warp/examples/fem/example_elastic_shape_optimization.py +387 -0
  161. warp/examples/fem/example_magnetostatics.py +242 -0
  162. warp/examples/fem/example_mixed_elasticity.py +293 -0
  163. warp/examples/fem/example_navier_stokes.py +263 -0
  164. warp/examples/fem/example_nonconforming_contact.py +300 -0
  165. warp/examples/fem/example_stokes.py +213 -0
  166. warp/examples/fem/example_stokes_transfer.py +262 -0
  167. warp/examples/fem/example_streamlines.py +357 -0
  168. warp/examples/fem/utils.py +1047 -0
  169. warp/examples/interop/example_jax_callable.py +146 -0
  170. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  171. warp/examples/interop/example_jax_kernel.py +232 -0
  172. warp/examples/optim/example_diffray.py +561 -0
  173. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  174. warp/examples/tile/example_tile_block_cholesky.py +502 -0
  175. warp/examples/tile/example_tile_cholesky.py +88 -0
  176. warp/examples/tile/example_tile_convolution.py +66 -0
  177. warp/examples/tile/example_tile_fft.py +55 -0
  178. warp/examples/tile/example_tile_filtering.py +113 -0
  179. warp/examples/tile/example_tile_matmul.py +85 -0
  180. warp/examples/tile/example_tile_mcgp.py +191 -0
  181. warp/examples/tile/example_tile_mlp.py +385 -0
  182. warp/examples/tile/example_tile_nbody.py +199 -0
  183. warp/fabric.py +24 -0
  184. warp/fem/__init__.py +173 -0
  185. warp/fem/adaptivity.py +26 -0
  186. warp/fem/cache.py +30 -0
  187. warp/fem/dirichlet.py +24 -0
  188. warp/fem/field/__init__.py +24 -0
  189. warp/fem/field/field.py +26 -0
  190. warp/fem/geometry/__init__.py +21 -0
  191. warp/fem/geometry/closest_point.py +31 -0
  192. warp/fem/linalg.py +38 -0
  193. warp/fem/operator.py +32 -0
  194. warp/fem/polynomial.py +29 -0
  195. warp/fem/space/__init__.py +22 -0
  196. warp/fem/space/basis_space.py +24 -0
  197. warp/fem/space/shape/__init__.py +68 -0
  198. warp/fem/space/topology.py +24 -0
  199. warp/fem/types.py +24 -0
  200. warp/fem/utils.py +32 -0
  201. warp/jax.py +29 -0
  202. warp/jax_experimental/__init__.py +29 -0
  203. warp/jax_experimental/custom_call.py +29 -0
  204. warp/jax_experimental/ffi.py +39 -0
  205. warp/jax_experimental/xla_ffi.py +24 -0
  206. warp/marching_cubes.py +24 -0
  207. warp/math.py +37 -0
  208. warp/native/array.h +1687 -0
  209. warp/native/builtin.h +2327 -0
  210. warp/native/bvh.cpp +562 -0
  211. warp/native/bvh.cu +826 -0
  212. warp/native/bvh.h +555 -0
  213. warp/native/clang/clang.cpp +541 -0
  214. warp/native/coloring.cpp +622 -0
  215. warp/native/crt.cpp +51 -0
  216. warp/native/crt.h +568 -0
  217. warp/native/cuda_crt.h +1058 -0
  218. warp/native/cuda_util.cpp +677 -0
  219. warp/native/cuda_util.h +313 -0
  220. warp/native/error.cpp +77 -0
  221. warp/native/error.h +36 -0
  222. warp/native/exports.h +2023 -0
  223. warp/native/fabric.h +246 -0
  224. warp/native/hashgrid.cpp +311 -0
  225. warp/native/hashgrid.cu +89 -0
  226. warp/native/hashgrid.h +240 -0
  227. warp/native/initializer_array.h +41 -0
  228. warp/native/intersect.h +1253 -0
  229. warp/native/intersect_adj.h +375 -0
  230. warp/native/intersect_tri.h +348 -0
  231. warp/native/mat.h +5189 -0
  232. warp/native/mathdx.cpp +93 -0
  233. warp/native/matnn.h +221 -0
  234. warp/native/mesh.cpp +266 -0
  235. warp/native/mesh.cu +406 -0
  236. warp/native/mesh.h +2097 -0
  237. warp/native/nanovdb/GridHandle.h +533 -0
  238. warp/native/nanovdb/HostBuffer.h +591 -0
  239. warp/native/nanovdb/NanoVDB.h +6246 -0
  240. warp/native/nanovdb/NodeManager.h +323 -0
  241. warp/native/nanovdb/PNanoVDB.h +3390 -0
  242. warp/native/noise.h +859 -0
  243. warp/native/quat.h +1664 -0
  244. warp/native/rand.h +342 -0
  245. warp/native/range.h +145 -0
  246. warp/native/reduce.cpp +174 -0
  247. warp/native/reduce.cu +363 -0
  248. warp/native/runlength_encode.cpp +79 -0
  249. warp/native/runlength_encode.cu +61 -0
  250. warp/native/scan.cpp +47 -0
  251. warp/native/scan.cu +55 -0
  252. warp/native/scan.h +23 -0
  253. warp/native/solid_angle.h +466 -0
  254. warp/native/sort.cpp +251 -0
  255. warp/native/sort.cu +286 -0
  256. warp/native/sort.h +35 -0
  257. warp/native/sparse.cpp +241 -0
  258. warp/native/sparse.cu +435 -0
  259. warp/native/spatial.h +1306 -0
  260. warp/native/svd.h +727 -0
  261. warp/native/temp_buffer.h +46 -0
  262. warp/native/tile.h +4124 -0
  263. warp/native/tile_radix_sort.h +1112 -0
  264. warp/native/tile_reduce.h +838 -0
  265. warp/native/tile_scan.h +240 -0
  266. warp/native/tuple.h +189 -0
  267. warp/native/vec.h +2199 -0
  268. warp/native/version.h +23 -0
  269. warp/native/volume.cpp +501 -0
  270. warp/native/volume.cu +68 -0
  271. warp/native/volume.h +970 -0
  272. warp/native/volume_builder.cu +483 -0
  273. warp/native/volume_builder.h +52 -0
  274. warp/native/volume_impl.h +70 -0
  275. warp/native/warp.cpp +1143 -0
  276. warp/native/warp.cu +4604 -0
  277. warp/native/warp.h +358 -0
  278. warp/optim/__init__.py +20 -0
  279. warp/optim/adam.py +24 -0
  280. warp/optim/linear.py +35 -0
  281. warp/optim/sgd.py +24 -0
  282. warp/paddle.py +24 -0
  283. warp/py.typed +0 -0
  284. warp/render/__init__.py +22 -0
  285. warp/render/imgui_manager.py +29 -0
  286. warp/render/render_opengl.py +24 -0
  287. warp/render/render_usd.py +24 -0
  288. warp/render/utils.py +24 -0
  289. warp/sparse.py +51 -0
  290. warp/tape.py +24 -0
  291. warp/tests/__init__.py +1 -0
  292. warp/tests/__main__.py +4 -0
  293. warp/tests/assets/curlnoise_golden.npy +0 -0
  294. warp/tests/assets/mlp_golden.npy +0 -0
  295. warp/tests/assets/pixel.npy +0 -0
  296. warp/tests/assets/pnoise_golden.npy +0 -0
  297. warp/tests/assets/spiky.usd +0 -0
  298. warp/tests/assets/test_grid.nvdb +0 -0
  299. warp/tests/assets/test_index_grid.nvdb +0 -0
  300. warp/tests/assets/test_int32_grid.nvdb +0 -0
  301. warp/tests/assets/test_vec_grid.nvdb +0 -0
  302. warp/tests/assets/torus.nvdb +0 -0
  303. warp/tests/assets/torus.usda +105 -0
  304. warp/tests/aux_test_class_kernel.py +34 -0
  305. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  306. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  307. warp/tests/aux_test_dependent.py +29 -0
  308. warp/tests/aux_test_grad_customs.py +29 -0
  309. warp/tests/aux_test_instancing_gc.py +26 -0
  310. warp/tests/aux_test_module_aot.py +7 -0
  311. warp/tests/aux_test_module_unload.py +23 -0
  312. warp/tests/aux_test_name_clash1.py +40 -0
  313. warp/tests/aux_test_name_clash2.py +40 -0
  314. warp/tests/aux_test_reference.py +9 -0
  315. warp/tests/aux_test_reference_reference.py +8 -0
  316. warp/tests/aux_test_square.py +16 -0
  317. warp/tests/aux_test_unresolved_func.py +22 -0
  318. warp/tests/aux_test_unresolved_symbol.py +22 -0
  319. warp/tests/cuda/__init__.py +0 -0
  320. warp/tests/cuda/test_async.py +676 -0
  321. warp/tests/cuda/test_conditional_captures.py +1147 -0
  322. warp/tests/cuda/test_ipc.py +124 -0
  323. warp/tests/cuda/test_mempool.py +233 -0
  324. warp/tests/cuda/test_multigpu.py +169 -0
  325. warp/tests/cuda/test_peer.py +139 -0
  326. warp/tests/cuda/test_pinned.py +84 -0
  327. warp/tests/cuda/test_streams.py +691 -0
  328. warp/tests/geometry/__init__.py +0 -0
  329. warp/tests/geometry/test_bvh.py +335 -0
  330. warp/tests/geometry/test_hash_grid.py +259 -0
  331. warp/tests/geometry/test_marching_cubes.py +294 -0
  332. warp/tests/geometry/test_mesh.py +318 -0
  333. warp/tests/geometry/test_mesh_query_aabb.py +392 -0
  334. warp/tests/geometry/test_mesh_query_point.py +935 -0
  335. warp/tests/geometry/test_mesh_query_ray.py +323 -0
  336. warp/tests/geometry/test_volume.py +1103 -0
  337. warp/tests/geometry/test_volume_write.py +346 -0
  338. warp/tests/interop/__init__.py +0 -0
  339. warp/tests/interop/test_dlpack.py +730 -0
  340. warp/tests/interop/test_jax.py +1673 -0
  341. warp/tests/interop/test_paddle.py +800 -0
  342. warp/tests/interop/test_torch.py +1001 -0
  343. warp/tests/run_coverage_serial.py +39 -0
  344. warp/tests/test_adam.py +162 -0
  345. warp/tests/test_arithmetic.py +1096 -0
  346. warp/tests/test_array.py +3756 -0
  347. warp/tests/test_array_reduce.py +156 -0
  348. warp/tests/test_assert.py +303 -0
  349. warp/tests/test_atomic.py +336 -0
  350. warp/tests/test_atomic_bitwise.py +209 -0
  351. warp/tests/test_atomic_cas.py +312 -0
  352. warp/tests/test_bool.py +220 -0
  353. warp/tests/test_builtins_resolution.py +732 -0
  354. warp/tests/test_closest_point_edge_edge.py +327 -0
  355. warp/tests/test_codegen.py +974 -0
  356. warp/tests/test_codegen_instancing.py +1495 -0
  357. warp/tests/test_compile_consts.py +215 -0
  358. warp/tests/test_conditional.py +298 -0
  359. warp/tests/test_context.py +35 -0
  360. warp/tests/test_copy.py +319 -0
  361. warp/tests/test_ctypes.py +618 -0
  362. warp/tests/test_dense.py +73 -0
  363. warp/tests/test_devices.py +127 -0
  364. warp/tests/test_enum.py +136 -0
  365. warp/tests/test_examples.py +424 -0
  366. warp/tests/test_fabricarray.py +998 -0
  367. warp/tests/test_fast_math.py +72 -0
  368. warp/tests/test_fem.py +2204 -0
  369. warp/tests/test_fixedarray.py +229 -0
  370. warp/tests/test_fp16.py +136 -0
  371. warp/tests/test_func.py +501 -0
  372. warp/tests/test_future_annotations.py +100 -0
  373. warp/tests/test_generics.py +656 -0
  374. warp/tests/test_grad.py +893 -0
  375. warp/tests/test_grad_customs.py +339 -0
  376. warp/tests/test_grad_debug.py +341 -0
  377. warp/tests/test_implicit_init.py +411 -0
  378. warp/tests/test_import.py +45 -0
  379. warp/tests/test_indexedarray.py +1140 -0
  380. warp/tests/test_intersect.py +103 -0
  381. warp/tests/test_iter.py +76 -0
  382. warp/tests/test_large.py +177 -0
  383. warp/tests/test_launch.py +411 -0
  384. warp/tests/test_lerp.py +151 -0
  385. warp/tests/test_linear_solvers.py +223 -0
  386. warp/tests/test_lvalue.py +427 -0
  387. warp/tests/test_map.py +526 -0
  388. warp/tests/test_mat.py +3515 -0
  389. warp/tests/test_mat_assign_copy.py +178 -0
  390. warp/tests/test_mat_constructors.py +573 -0
  391. warp/tests/test_mat_lite.py +122 -0
  392. warp/tests/test_mat_scalar_ops.py +2913 -0
  393. warp/tests/test_math.py +212 -0
  394. warp/tests/test_module_aot.py +287 -0
  395. warp/tests/test_module_hashing.py +258 -0
  396. warp/tests/test_modules_lite.py +70 -0
  397. warp/tests/test_noise.py +252 -0
  398. warp/tests/test_operators.py +299 -0
  399. warp/tests/test_options.py +129 -0
  400. warp/tests/test_overwrite.py +551 -0
  401. warp/tests/test_print.py +408 -0
  402. warp/tests/test_quat.py +2653 -0
  403. warp/tests/test_quat_assign_copy.py +145 -0
  404. warp/tests/test_rand.py +339 -0
  405. warp/tests/test_reload.py +303 -0
  406. warp/tests/test_rounding.py +157 -0
  407. warp/tests/test_runlength_encode.py +196 -0
  408. warp/tests/test_scalar_ops.py +133 -0
  409. warp/tests/test_smoothstep.py +108 -0
  410. warp/tests/test_snippet.py +318 -0
  411. warp/tests/test_sparse.py +845 -0
  412. warp/tests/test_spatial.py +2859 -0
  413. warp/tests/test_spatial_assign_copy.py +160 -0
  414. warp/tests/test_special_values.py +361 -0
  415. warp/tests/test_static.py +640 -0
  416. warp/tests/test_struct.py +901 -0
  417. warp/tests/test_tape.py +242 -0
  418. warp/tests/test_transient_module.py +93 -0
  419. warp/tests/test_triangle_closest_point.py +192 -0
  420. warp/tests/test_tuple.py +361 -0
  421. warp/tests/test_types.py +615 -0
  422. warp/tests/test_utils.py +594 -0
  423. warp/tests/test_vec.py +1408 -0
  424. warp/tests/test_vec_assign_copy.py +143 -0
  425. warp/tests/test_vec_constructors.py +325 -0
  426. warp/tests/test_vec_lite.py +80 -0
  427. warp/tests/test_vec_scalar_ops.py +2327 -0
  428. warp/tests/test_verify_fp.py +100 -0
  429. warp/tests/test_version.py +75 -0
  430. warp/tests/tile/__init__.py +0 -0
  431. warp/tests/tile/test_tile.py +1519 -0
  432. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  433. warp/tests/tile/test_tile_cholesky.py +608 -0
  434. warp/tests/tile/test_tile_load.py +724 -0
  435. warp/tests/tile/test_tile_mathdx.py +156 -0
  436. warp/tests/tile/test_tile_matmul.py +179 -0
  437. warp/tests/tile/test_tile_mlp.py +400 -0
  438. warp/tests/tile/test_tile_reduce.py +950 -0
  439. warp/tests/tile/test_tile_shared_memory.py +376 -0
  440. warp/tests/tile/test_tile_sort.py +121 -0
  441. warp/tests/tile/test_tile_view.py +173 -0
  442. warp/tests/unittest_serial.py +47 -0
  443. warp/tests/unittest_suites.py +430 -0
  444. warp/tests/unittest_utils.py +469 -0
  445. warp/tests/walkthrough_debug.py +95 -0
  446. warp/torch.py +24 -0
  447. warp/types.py +51 -0
  448. warp/utils.py +31 -0
  449. warp_lang-1.10.0.dist-info/METADATA +459 -0
  450. warp_lang-1.10.0.dist-info/RECORD +468 -0
  451. warp_lang-1.10.0.dist-info/WHEEL +5 -0
  452. warp_lang-1.10.0.dist-info/licenses/LICENSE.md +176 -0
  453. warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  454. warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  455. warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  456. warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  457. warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  458. warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  459. warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  460. warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  461. warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  462. warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  463. warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  464. warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  465. warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  466. warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  467. warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  468. warp_lang-1.10.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,998 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ from __future__ import annotations
17
+
18
+ import math
19
+ import unittest
20
+ from typing import Any
21
+
22
+ import numpy as np
23
+
24
+ import warp as wp
25
+ from warp.tests.unittest_utils import *
26
+
27
+ # types to test fabric arrays
28
+ _fabric_types = [
29
+ *wp._src.types.scalar_types,
30
+ *[wp._src.types.vector(2, T) for T in wp._src.types.scalar_types],
31
+ *[wp._src.types.vector(3, T) for T in wp._src.types.scalar_types],
32
+ *[wp._src.types.vector(4, T) for T in wp._src.types.scalar_types],
33
+ *[wp._src.types.matrix((2, 2), T) for T in wp._src.types.scalar_types],
34
+ *[wp._src.types.matrix((3, 3), T) for T in wp._src.types.scalar_types],
35
+ *[wp._src.types.matrix((4, 4), T) for T in wp._src.types.scalar_types],
36
+ *[wp._src.types.quaternion(T) for T in wp._src.types.float_types],
37
+ ]
38
+
39
+
40
+ def _warp_type_to_fabric(dtype, is_array=False):
41
+ scalar_map = {
42
+ wp.bool: "b",
43
+ wp.int8: "i1",
44
+ wp.int16: "i2",
45
+ wp.int32: "i4",
46
+ wp.int64: "i8",
47
+ wp.uint8: "u1",
48
+ wp.uint16: "u2",
49
+ wp.uint32: "u4",
50
+ wp.uint64: "u8",
51
+ wp.float16: "f2",
52
+ wp.float32: "f4",
53
+ wp.float64: "f8",
54
+ }
55
+
56
+ if hasattr(dtype, "_wp_scalar_type_"):
57
+ type_str = scalar_map[dtype._wp_scalar_type_]
58
+ if len(dtype._shape_) == 1:
59
+ role = "vector"
60
+ else:
61
+ role = "matrix"
62
+ else:
63
+ type_str = scalar_map[dtype]
64
+ role = ""
65
+
66
+ if is_array:
67
+ array_depth = 1
68
+ else:
69
+ array_depth = 0
70
+
71
+ return (True, type_str, dtype._length_, array_depth, role)
72
+
73
+
74
+ # returns a fabric array interface constructed from a regular array
75
+ def _create_fabric_array_interface(data: wp.array, attrib: str, bucket_sizes: list[int] | None = None, copy=False):
76
+ assert isinstance(data, wp.array)
77
+ assert data.ndim == 1
78
+
79
+ assert isinstance(attrib, str)
80
+
81
+ if copy:
82
+ data = wp.clone(data)
83
+
84
+ if bucket_sizes is not None:
85
+ assert hasattr(bucket_sizes, "__len__")
86
+
87
+ # verify total size
88
+ total_size = 0
89
+ for bucket_size in bucket_sizes:
90
+ total_size += bucket_size
91
+
92
+ if total_size != data.size:
93
+ raise RuntimeError("Bucket sizes don't add up to the size of data array")
94
+
95
+ elif data.size > 0:
96
+ rng = np.random.default_rng(123)
97
+
98
+ # generate random bucket sizes
99
+ bucket_min = 1
100
+ bucket_max = math.ceil(0.5 * data.size)
101
+ total_size = data.size
102
+ size_remaining = total_size
103
+
104
+ bucket_sizes = []
105
+ while size_remaining >= bucket_max:
106
+ bucket_size = rng.integers(bucket_min, high=bucket_max, dtype=int)
107
+ bucket_sizes.append(bucket_size)
108
+ size_remaining -= bucket_size
109
+
110
+ if size_remaining > 0:
111
+ bucket_sizes.append(size_remaining)
112
+
113
+ else:
114
+ # empty data array
115
+ bucket_sizes = []
116
+
117
+ dtype_size = wp._src.types.type_size_in_bytes(data.dtype)
118
+ p = int(data.ptr) if data.ptr else 0
119
+ pointers = []
120
+ counts = []
121
+ for bucket_size in bucket_sizes:
122
+ pointers.append(p)
123
+ counts.append(bucket_size)
124
+ p += bucket_size * dtype_size
125
+
126
+ attrib_info = {}
127
+
128
+ attrib_info["type"] = _warp_type_to_fabric(data.dtype)
129
+ attrib_info["access"] = 2 # ReadWrite
130
+ attrib_info["pointers"] = pointers
131
+ attrib_info["counts"] = counts
132
+
133
+ iface = {}
134
+ iface["version"] = 1
135
+ iface["device"] = str(data.device)
136
+ iface["attribs"] = {attrib: attrib_info}
137
+ iface["_ref"] = data # backref to keep the array alive
138
+
139
+ return iface
140
+
141
+
142
+ # returns a fabric array array interface constructed from a list of regular arrays
143
+ def _create_fabric_array_array_interface(data: list, attrib: str, bucket_sizes: list[int] | None = None):
144
+ # data should be a list of arrays
145
+ assert isinstance(data, list)
146
+
147
+ num_arrays = len(data)
148
+ assert num_arrays > 0
149
+
150
+ device = data[0].device
151
+ dtype = data[0].dtype
152
+
153
+ assert isinstance(attrib, str)
154
+
155
+ if bucket_sizes is not None:
156
+ assert hasattr(bucket_sizes, "__len__")
157
+
158
+ # verify total size
159
+ total_size = 0
160
+ for bucket_size in bucket_sizes:
161
+ total_size += bucket_size
162
+
163
+ if total_size != num_arrays:
164
+ raise RuntimeError("Bucket sizes don't add up to the number of given arrays")
165
+
166
+ else:
167
+ rng = np.random.default_rng(123)
168
+
169
+ # generate random bucket sizes
170
+ bucket_min = 1
171
+ bucket_max = math.ceil(0.5 * num_arrays)
172
+ total_size = num_arrays
173
+ size_remaining = total_size
174
+
175
+ bucket_sizes = []
176
+ while size_remaining >= bucket_max:
177
+ bucket_size = rng.integers(bucket_min, high=bucket_max, dtype=int)
178
+ bucket_sizes.append(bucket_size)
179
+ size_remaining -= bucket_size
180
+
181
+ if size_remaining > 0:
182
+ bucket_sizes.append(size_remaining)
183
+
184
+ # initialize array of pointers to arrays and their lengths
185
+ _array_pointers = []
186
+ _array_lengths = []
187
+ for i in range(num_arrays):
188
+ _array_pointers.append(data[i].ptr)
189
+ _array_lengths.append(data[i].size)
190
+
191
+ array_pointers = wp.array(_array_pointers, dtype=wp.uint64, device=device)
192
+ pointer_size = wp._src.types.type_size_in_bytes(array_pointers.dtype)
193
+
194
+ lengths = wp.array(_array_lengths, dtype=wp.uint64, device=device)
195
+ length_size = wp._src.types.type_size_in_bytes(lengths.dtype)
196
+
197
+ p_pointers = int(array_pointers.ptr)
198
+ p_lengths = int(lengths.ptr)
199
+ pointers = []
200
+ counts = []
201
+ array_lengths = []
202
+ for bucket_size in bucket_sizes:
203
+ pointers.append(p_pointers)
204
+ counts.append(bucket_size)
205
+ array_lengths.append(p_lengths)
206
+ p_pointers += bucket_size * pointer_size
207
+ p_lengths += bucket_size * length_size
208
+
209
+ attrib_info = {}
210
+
211
+ attrib_info["type"] = _warp_type_to_fabric(dtype, is_array=True)
212
+ attrib_info["access"] = 2 # ReadWrite
213
+ attrib_info["pointers"] = pointers
214
+ attrib_info["counts"] = counts
215
+ attrib_info["array_lengths"] = array_lengths
216
+
217
+ iface = {}
218
+ iface["version"] = 1
219
+ iface["device"] = str(device)
220
+ iface["attribs"] = {attrib: attrib_info}
221
+ iface["_ref"] = data # backref to keep the data arrays alive
222
+ iface["_ref_pointers"] = array_pointers # backref to keep the array pointers alive
223
+ iface["_ref_lengths"] = lengths # backref to keep the lengths array alive
224
+
225
+ return iface
226
+
227
+
228
+ @wp.kernel
229
+ def fa_kernel(a: wp.fabricarray(dtype=float), expected: wp.array(dtype=float)):
230
+ i = wp.tid()
231
+
232
+ wp.expect_eq(a[i], expected[i])
233
+
234
+ a[i] = 2.0 * a[i]
235
+
236
+ wp.atomic_add(a, i, 1.0)
237
+
238
+ wp.expect_eq(a[i], 2.0 * expected[i] + 1.0)
239
+
240
+
241
+ @wp.kernel
242
+ def fa_kernel_indexed(a: wp.indexedfabricarray(dtype=float), expected: wp.indexedarray(dtype=float)):
243
+ i = wp.tid()
244
+
245
+ wp.expect_eq(a[i], expected[i])
246
+
247
+ a[i] = 2.0 * a[i]
248
+
249
+ wp.atomic_add(a, i, 1.0)
250
+
251
+ wp.expect_eq(a[i], 2.0 * expected[i] + 1.0)
252
+
253
+
254
+ def test_fabricarray_kernel(test, device):
255
+ data = wp.array(data=np.arange(100, dtype=np.float32), device=device)
256
+ iface = _create_fabric_array_interface(data, "foo", copy=True)
257
+ fa = wp.fabricarray(data=iface, attrib="foo")
258
+
259
+ test.assertEqual(fa.dtype, data.dtype)
260
+ test.assertEqual(fa.ndim, 1)
261
+ test.assertEqual(fa.shape, data.shape)
262
+ test.assertEqual(fa.size, data.size)
263
+
264
+ wp.launch(fa_kernel, dim=fa.size, inputs=[fa, data], device=device)
265
+
266
+ # reset data
267
+ wp.copy(fa, data)
268
+
269
+ # test indexed
270
+ indices = wp.array(data=np.arange(1, data.size, 2, dtype=np.int32), device=device)
271
+ ifa = fa[indices]
272
+ idata = data[indices]
273
+
274
+ test.assertEqual(ifa.dtype, idata.dtype)
275
+ test.assertEqual(ifa.ndim, 1)
276
+ test.assertEqual(ifa.shape, idata.shape)
277
+ test.assertEqual(ifa.size, idata.size)
278
+
279
+ wp.launch(fa_kernel_indexed, dim=ifa.size, inputs=[ifa, idata], device=device)
280
+
281
+ wp.synchronize_device(device)
282
+
283
+
284
+ @wp.kernel
285
+ def fa_generic_dtype_kernel(a: wp.fabricarray(dtype=Any), b: wp.fabricarray(dtype=Any)):
286
+ i = wp.tid()
287
+ b[i] = a[i] + a[i]
288
+
289
+
290
+ @wp.kernel
291
+ def fa_generic_dtype_kernel_indexed(a: wp.indexedfabricarray(dtype=Any), b: wp.indexedfabricarray(dtype=Any)):
292
+ i = wp.tid()
293
+ b[i] = a[i] + a[i]
294
+
295
+
296
+ def test_fabricarray_generic_dtype(test, device):
297
+ for T in _fabric_types:
298
+ if hasattr(T, "_wp_scalar_type_"):
299
+ nptype = wp._src.types.warp_type_to_np_dtype[T._wp_scalar_type_]
300
+ else:
301
+ nptype = wp._src.types.warp_type_to_np_dtype[T]
302
+
303
+ data = wp.array(data=np.arange(10, dtype=nptype), device=device)
304
+ data_iface = _create_fabric_array_interface(data, "foo", copy=True)
305
+ fa = wp.fabricarray(data=data_iface, attrib="foo")
306
+
307
+ result = wp.zeros_like(data)
308
+ result_iface = _create_fabric_array_interface(result, "foo", copy=True)
309
+ fb = wp.fabricarray(data=result_iface, attrib="foo")
310
+
311
+ test.assertEqual(fa.dtype, fb.dtype)
312
+ test.assertEqual(fa.ndim, fb.ndim)
313
+ test.assertEqual(fa.shape, fb.shape)
314
+ test.assertEqual(fa.size, fb.size)
315
+
316
+ wp.launch(fa_generic_dtype_kernel, dim=fa.size, inputs=[fa, fb], device=device)
317
+
318
+ assert_np_equal(fb.numpy(), 2 * fa.numpy())
319
+
320
+ # reset data
321
+ wp.copy(fa, data)
322
+ wp.copy(fb, result)
323
+
324
+ # test indexed
325
+ indices = wp.array(data=np.arange(1, data.size, 2, dtype=np.int32), device=device)
326
+ ifa = fa[indices]
327
+ ifb = fb[indices]
328
+
329
+ test.assertEqual(ifa.dtype, ifb.dtype)
330
+ test.assertEqual(ifa.ndim, ifb.ndim)
331
+ test.assertEqual(ifa.shape, ifb.shape)
332
+ test.assertEqual(ifa.size, ifb.size)
333
+
334
+ wp.launch(fa_generic_dtype_kernel_indexed, dim=ifa.size, inputs=[ifa, ifb], device=device)
335
+
336
+ assert_np_equal(ifb.numpy(), 2 * ifa.numpy())
337
+
338
+
339
+ @wp.kernel
340
+ def fa_generic_array_kernel(a: Any, b: Any):
341
+ i = wp.tid()
342
+ b[i] = a[i] + a[i]
343
+
344
+
345
+ def test_fabricarray_generic_array(test, device):
346
+ for T in _fabric_types:
347
+ if hasattr(T, "_wp_scalar_type_"):
348
+ nptype = wp._src.types.warp_type_to_np_dtype[T._wp_scalar_type_]
349
+ else:
350
+ nptype = wp._src.types.warp_type_to_np_dtype[T]
351
+
352
+ data = wp.array(data=np.arange(100, dtype=nptype), device=device)
353
+ data_iface = _create_fabric_array_interface(data, "foo", copy=True)
354
+ fa = wp.fabricarray(data=data_iface, attrib="foo")
355
+
356
+ result = wp.zeros_like(data)
357
+ result_iface = _create_fabric_array_interface(result, "foo", copy=True)
358
+ fb = wp.fabricarray(data=result_iface, attrib="foo")
359
+
360
+ test.assertEqual(fa.dtype, fb.dtype)
361
+ test.assertEqual(fa.ndim, fb.ndim)
362
+ test.assertEqual(fa.shape, fb.shape)
363
+ test.assertEqual(fa.size, fb.size)
364
+
365
+ wp.launch(fa_generic_array_kernel, dim=fa.size, inputs=[fa, fb], device=device)
366
+
367
+ assert_np_equal(fb.numpy(), 2 * fa.numpy())
368
+
369
+ # reset data
370
+ wp.copy(fa, data)
371
+ wp.copy(fb, result)
372
+
373
+ # test indexed
374
+ indices = wp.array(data=np.arange(1, data.size, 2, dtype=np.int32), device=device)
375
+ ifa = fa[indices]
376
+ ifb = fb[indices]
377
+
378
+ test.assertEqual(ifa.dtype, ifb.dtype)
379
+ test.assertEqual(ifa.ndim, ifb.ndim)
380
+ test.assertEqual(ifa.shape, ifb.shape)
381
+ test.assertEqual(ifa.size, ifb.size)
382
+
383
+ wp.launch(fa_generic_array_kernel, dim=ifa.size, inputs=[ifa, ifb], device=device)
384
+
385
+ assert_np_equal(ifb.numpy(), 2 * ifa.numpy())
386
+
387
+
388
+ def test_fabricarray_empty(test, device):
389
+ # Test whether common operations work with empty (zero-sized) indexed arrays
390
+ # without throwing exceptions.
391
+
392
+ def test_empty_ops(nrows, ncols, wptype, nptype):
393
+ # scalar, vector, or matrix
394
+ if ncols > 0:
395
+ if nrows > 0:
396
+ wptype = wp._src.types.matrix((nrows, ncols), wptype)
397
+ else:
398
+ wptype = wp._src.types.vector(ncols, wptype)
399
+ dtype_shape = wptype._shape_
400
+ else:
401
+ dtype_shape = ()
402
+
403
+ fill_value = wptype(42)
404
+
405
+ # create an empty data array
406
+ data = wp.empty(0, dtype=wptype, device=device)
407
+ iface = _create_fabric_array_interface(data, "foo", copy=True)
408
+ fa = wp.fabricarray(data=iface, attrib="foo")
409
+
410
+ test.assertEqual(fa.size, 0)
411
+ test.assertEqual(fa.shape, (0,))
412
+
413
+ # all of these methods should succeed with zero-sized arrays
414
+ fa.zero_()
415
+ fa.fill_(fill_value)
416
+ fb = fa.contiguous()
417
+
418
+ fb = wp.empty_like(fa)
419
+ fb = wp.zeros_like(fa)
420
+ fb = wp.full_like(fa, fill_value)
421
+ fb = wp.clone(fa)
422
+
423
+ wp.copy(fa, fb)
424
+ fa.assign(fb)
425
+
426
+ na = fa.numpy()
427
+ test.assertEqual(na.size, 0)
428
+ test.assertEqual(na.shape, (0, *dtype_shape))
429
+ test.assertEqual(na.dtype, nptype)
430
+
431
+ test.assertEqual(fa.list(), [])
432
+
433
+ # test indexed
434
+
435
+ # create a zero-sized array of indices
436
+ indices = wp.empty(0, dtype=int, device=device)
437
+
438
+ ifa = fa[indices]
439
+
440
+ test.assertEqual(ifa.size, 0)
441
+ test.assertEqual(ifa.shape, (0,))
442
+
443
+ # all of these methods should succeed with zero-sized arrays
444
+ ifa.zero_()
445
+ ifa.fill_(fill_value)
446
+ ifb = ifa.contiguous()
447
+
448
+ ifb = wp.empty_like(ifa)
449
+ ifb = wp.zeros_like(ifa)
450
+ ifb = wp.full_like(ifa, fill_value)
451
+ ifb = wp.clone(ifa)
452
+
453
+ wp.copy(ifa, ifb)
454
+ ifa.assign(ifb)
455
+
456
+ na = ifa.numpy()
457
+ test.assertEqual(na.size, 0)
458
+ test.assertEqual(na.shape, (0, *dtype_shape))
459
+ test.assertEqual(na.dtype, nptype)
460
+
461
+ test.assertEqual(ifa.list(), [])
462
+
463
+ # test with scalars, vectors, and matrices
464
+ for nptype, wptype in wp._src.types.np_dtype_to_warp_type.items():
465
+ # scalars
466
+ test_empty_ops(0, 0, wptype, nptype)
467
+
468
+ for ncols in [2, 3, 4, 5]:
469
+ # vectors
470
+ test_empty_ops(0, ncols, wptype, nptype)
471
+ # square matrices (the Fabric interface only supports square matrices right now)
472
+ test_empty_ops(ncols, ncols, wptype, nptype)
473
+
474
+
475
+ def test_fabricarray_fill_scalar(test, device):
476
+ for nptype, wptype in wp._src.types.np_dtype_to_warp_type.items():
477
+ # create a data array
478
+ data = wp.zeros(100, dtype=wptype, device=device)
479
+ iface = _create_fabric_array_interface(data, "foo", copy=True)
480
+ fa = wp.fabricarray(data=iface, attrib="foo")
481
+
482
+ assert_np_equal(fa.numpy(), np.zeros(fa.shape, dtype=nptype))
483
+
484
+ # fill with int value
485
+ fill_value = 42
486
+ fa.fill_(fill_value)
487
+ assert_np_equal(fa.numpy(), np.full(fa.shape, fill_value, dtype=nptype))
488
+
489
+ fa.zero_()
490
+ assert_np_equal(fa.numpy(), np.zeros(fa.shape, dtype=nptype))
491
+
492
+ if wptype in wp._src.types.float_types:
493
+ # fill with float value
494
+ fill_value = 13.37
495
+ fa.fill_(fill_value)
496
+ assert_np_equal(fa.numpy(), np.full(fa.shape, fill_value, dtype=nptype))
497
+
498
+ # fill with Warp scalar value
499
+ fill_value = wptype(17)
500
+ fa.fill_(fill_value)
501
+ assert_np_equal(fa.numpy(), np.full(fa.shape, fill_value.value, dtype=nptype))
502
+
503
+ # reset data
504
+ wp.copy(fa, data)
505
+
506
+ # test indexed
507
+ indices1 = wp.array(data=np.arange(1, data.size, 2, dtype=np.int32), device=device)
508
+ ifa = fa[indices1]
509
+
510
+ # ensure that the other indices remain unchanged
511
+ indices2 = wp.array(data=np.arange(0, data.size, 2, dtype=np.int32), device=device)
512
+ ifb = fa[indices2]
513
+
514
+ assert_np_equal(ifa.numpy(), np.zeros(ifa.shape, dtype=nptype))
515
+ assert_np_equal(ifb.numpy(), np.zeros(ifb.shape, dtype=nptype))
516
+
517
+ # fill with int value
518
+ fill_value = 42
519
+ ifa.fill_(fill_value)
520
+ assert_np_equal(ifa.numpy(), np.full(ifa.shape, fill_value, dtype=nptype))
521
+ assert_np_equal(ifb.numpy(), np.zeros(ifb.shape, dtype=nptype))
522
+
523
+ ifa.zero_()
524
+ assert_np_equal(ifa.numpy(), np.zeros(ifa.shape, dtype=nptype))
525
+ assert_np_equal(ifb.numpy(), np.zeros(ifb.shape, dtype=nptype))
526
+
527
+ if wptype in wp._src.types.float_types:
528
+ # fill with float value
529
+ fill_value = 13.37
530
+ ifa.fill_(fill_value)
531
+ assert_np_equal(ifa.numpy(), np.full(ifa.shape, fill_value, dtype=nptype))
532
+ assert_np_equal(ifb.numpy(), np.zeros(ifb.shape, dtype=nptype))
533
+
534
+ # fill with Warp scalar value
535
+ fill_value = wptype(17)
536
+ ifa.fill_(fill_value)
537
+ assert_np_equal(ifa.numpy(), np.full(ifa.shape, fill_value.value, dtype=nptype))
538
+ assert_np_equal(ifb.numpy(), np.zeros(ifb.shape, dtype=nptype))
539
+
540
+
541
+ def test_fabricarray_fill_vector(test, device):
542
+ # test filling a vector array with scalar or vector values (vec_type, list, or numpy array)
543
+
544
+ for nptype, wptype in wp._src.types.np_dtype_to_warp_type.items():
545
+ # vector types
546
+ vector_types = [
547
+ wp._src.types.vector(2, wptype),
548
+ wp._src.types.vector(3, wptype),
549
+ wp._src.types.vector(4, wptype),
550
+ wp._src.types.vector(5, wptype),
551
+ ]
552
+
553
+ for vec_type in vector_types:
554
+ vec_len = vec_type._length_
555
+
556
+ data = wp.zeros(100, dtype=vec_type, device=device)
557
+ iface = _create_fabric_array_interface(data, "foo", copy=True)
558
+ fa = wp.fabricarray(data=iface, attrib="foo")
559
+
560
+ assert_np_equal(fa.numpy(), np.zeros((*fa.shape, vec_len), dtype=nptype))
561
+
562
+ # fill with int scalar
563
+ fill_value = 42
564
+ fa.fill_(fill_value)
565
+ assert_np_equal(fa.numpy(), np.full((*fa.shape, vec_len), fill_value, dtype=nptype))
566
+
567
+ # test zeroing
568
+ fa.zero_()
569
+ assert_np_equal(fa.numpy(), np.zeros((*fa.shape, vec_len), dtype=nptype))
570
+
571
+ # vector values can be passed as a list, numpy array, or Warp vector instance
572
+ fill_list = [17, 42, 99, 101, 127][:vec_len]
573
+ fill_arr = np.array(fill_list, dtype=nptype)
574
+ fill_vec = vec_type(fill_list)
575
+
576
+ expected = np.tile(fill_arr, fa.size).reshape((*fa.shape, vec_len))
577
+
578
+ # fill with list of vector length
579
+ fa.fill_(fill_list)
580
+ assert_np_equal(fa.numpy(), expected)
581
+
582
+ # clear
583
+ fa.zero_()
584
+
585
+ # fill with numpy array of vector length
586
+ fa.fill_(fill_arr)
587
+ assert_np_equal(fa.numpy(), expected)
588
+
589
+ # clear
590
+ fa.zero_()
591
+
592
+ # fill with vec instance
593
+ fa.fill_(fill_vec)
594
+ assert_np_equal(fa.numpy(), expected)
595
+
596
+ if wptype in wp._src.types.float_types:
597
+ # fill with float scalar
598
+ fill_value = 13.37
599
+ fa.fill_(fill_value)
600
+ assert_np_equal(fa.numpy(), np.full((*fa.shape, vec_len), fill_value, dtype=nptype))
601
+
602
+ # fill with float list of vector length
603
+ fill_list = [-2.5, -1.25, 1.25, 2.5, 5.0][:vec_len]
604
+
605
+ fa.fill_(fill_list)
606
+
607
+ expected = np.tile(np.array(fill_list, dtype=nptype), fa.size).reshape((*fa.shape, vec_len))
608
+
609
+ assert_np_equal(fa.numpy(), expected)
610
+
611
+ # reset data
612
+ wp.copy(fa, data)
613
+
614
+ # test indexed
615
+ indices1 = wp.array(data=np.arange(1, data.size, 2, dtype=np.int32), device=device)
616
+ ifa = fa[indices1]
617
+
618
+ # ensure that the other indices remain unchanged
619
+ indices2 = wp.array(data=np.arange(0, data.size, 2, dtype=np.int32), device=device)
620
+ ifb = fa[indices2]
621
+
622
+ assert_np_equal(ifa.numpy(), np.zeros((*ifa.shape, vec_len), dtype=nptype))
623
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, vec_len), dtype=nptype))
624
+
625
+ # fill with int scalar
626
+ fill_value = 42
627
+ ifa.fill_(fill_value)
628
+ assert_np_equal(ifa.numpy(), np.full((*ifa.shape, vec_len), fill_value, dtype=nptype))
629
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, vec_len), dtype=nptype))
630
+
631
+ # test zeroing
632
+ ifa.zero_()
633
+ assert_np_equal(ifa.numpy(), np.zeros((*ifa.shape, vec_len), dtype=nptype))
634
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, vec_len), dtype=nptype))
635
+
636
+ # vector values can be passed as a list, numpy array, or Warp vector instance
637
+ fill_list = [17, 42, 99, 101, 127][:vec_len]
638
+ fill_arr = np.array(fill_list, dtype=nptype)
639
+ fill_vec = vec_type(fill_list)
640
+
641
+ expected = np.tile(fill_arr, ifa.size).reshape((*ifa.shape, vec_len))
642
+
643
+ # fill with list of vector length
644
+ ifa.fill_(fill_list)
645
+ assert_np_equal(ifa.numpy(), expected)
646
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, vec_len), dtype=nptype))
647
+
648
+ # clear
649
+ ifa.zero_()
650
+
651
+ # fill with numpy array of vector length
652
+ ifa.fill_(fill_arr)
653
+ assert_np_equal(ifa.numpy(), expected)
654
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, vec_len), dtype=nptype))
655
+
656
+ # clear
657
+ ifa.zero_()
658
+
659
+ # fill with vec instance
660
+ ifa.fill_(fill_vec)
661
+ assert_np_equal(ifa.numpy(), expected)
662
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, vec_len), dtype=nptype))
663
+
664
+ if wptype in wp._src.types.float_types:
665
+ # fill with float scalar
666
+ fill_value = 13.37
667
+ ifa.fill_(fill_value)
668
+ assert_np_equal(ifa.numpy(), np.full((*ifa.shape, vec_len), fill_value, dtype=nptype))
669
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, vec_len), dtype=nptype))
670
+
671
+ # fill with float list of vector length
672
+ fill_list = [-2.5, -1.25, 1.25, 2.5, 5.0][:vec_len]
673
+
674
+ ifa.fill_(fill_list)
675
+
676
+ expected = np.tile(np.array(fill_list, dtype=nptype), ifa.size).reshape((*ifa.shape, vec_len))
677
+
678
+ assert_np_equal(ifa.numpy(), expected)
679
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, vec_len), dtype=nptype))
680
+
681
+
682
+ def test_fabricarray_fill_matrix(test, device):
683
+ # test filling a matrix array with scalar or matrix values (mat_type, nested list, or 2d numpy array)
684
+
685
+ for nptype, wptype in wp._src.types.np_dtype_to_warp_type.items():
686
+ # matrix types
687
+ matrix_types = [
688
+ # square matrices only
689
+ wp._src.types.matrix((2, 2), wptype),
690
+ wp._src.types.matrix((3, 3), wptype),
691
+ wp._src.types.matrix((4, 4), wptype),
692
+ wp._src.types.matrix((5, 5), wptype),
693
+ ]
694
+
695
+ for mat_type in matrix_types:
696
+ mat_len = mat_type._length_
697
+ mat_shape = mat_type._shape_
698
+
699
+ data = wp.zeros(100, dtype=mat_type, device=device)
700
+ iface = _create_fabric_array_interface(data, "foo", copy=True)
701
+ fa = wp.fabricarray(data=iface, attrib="foo")
702
+
703
+ assert_np_equal(fa.numpy(), np.zeros((*fa.shape, *mat_shape), dtype=nptype))
704
+
705
+ # fill with scalar
706
+ fill_value = 42
707
+ fa.fill_(fill_value)
708
+ assert_np_equal(fa.numpy(), np.full((*fa.shape, *mat_shape), fill_value, dtype=nptype))
709
+
710
+ # test zeroing
711
+ fa.zero_()
712
+ assert_np_equal(fa.numpy(), np.zeros((*fa.shape, *mat_shape), dtype=nptype))
713
+
714
+ # matrix values can be passed as a 1d numpy array, 2d numpy array, flat list, nested list, or Warp matrix instance
715
+ if wptype != wp.bool:
716
+ fill_arr1 = np.arange(mat_len, dtype=nptype)
717
+ else:
718
+ fill_arr1 = np.ones(mat_len, dtype=nptype)
719
+
720
+ fill_arr2 = fill_arr1.reshape(mat_shape)
721
+ fill_list1 = list(fill_arr1)
722
+ fill_list2 = [list(row) for row in fill_arr2]
723
+ fill_mat = mat_type(fill_arr1)
724
+
725
+ expected = np.tile(fill_arr1, fa.size).reshape((*fa.shape, *mat_shape))
726
+
727
+ # fill with 1d numpy array
728
+ fa.fill_(fill_arr1)
729
+ assert_np_equal(fa.numpy(), expected)
730
+
731
+ # clear
732
+ fa.zero_()
733
+
734
+ # fill with 2d numpy array
735
+ fa.fill_(fill_arr2)
736
+ assert_np_equal(fa.numpy(), expected)
737
+
738
+ # clear
739
+ fa.zero_()
740
+
741
+ # fill with flat list
742
+ fa.fill_(fill_list1)
743
+ assert_np_equal(fa.numpy(), expected)
744
+
745
+ # clear
746
+ fa.zero_()
747
+
748
+ # fill with nested list
749
+ fa.fill_(fill_list2)
750
+ assert_np_equal(fa.numpy(), expected)
751
+
752
+ # clear
753
+ fa.zero_()
754
+
755
+ # fill with mat instance
756
+ fa.fill_(fill_mat)
757
+ assert_np_equal(fa.numpy(), expected)
758
+
759
+ # reset data
760
+ wp.copy(fa, data)
761
+
762
+ # test indexed
763
+ indices1 = wp.array(data=np.arange(1, data.size, 2, dtype=np.int32), device=device)
764
+ ifa = fa[indices1]
765
+
766
+ # ensure that the other indices remain unchanged
767
+ indices2 = wp.array(data=np.arange(0, data.size, 2, dtype=np.int32), device=device)
768
+ ifb = fa[indices2]
769
+
770
+ assert_np_equal(ifa.numpy(), np.zeros((*ifa.shape, *mat_shape), dtype=nptype))
771
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, *mat_shape), dtype=nptype))
772
+
773
+ # fill with scalar
774
+ fill_value = 42
775
+ ifa.fill_(fill_value)
776
+ assert_np_equal(ifa.numpy(), np.full((*ifa.shape, *mat_shape), fill_value, dtype=nptype))
777
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, *mat_shape), dtype=nptype))
778
+
779
+ # test zeroing
780
+ ifa.zero_()
781
+ assert_np_equal(ifa.numpy(), np.zeros((*ifa.shape, *mat_shape), dtype=nptype))
782
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, *mat_shape), dtype=nptype))
783
+
784
+ # matrix values can be passed as a 1d numpy array, 2d numpy array, flat list, nested list, or Warp matrix instance
785
+ if wptype != wp.bool:
786
+ fill_arr1 = np.arange(mat_len, dtype=nptype)
787
+ else:
788
+ fill_arr1 = np.ones(mat_len, dtype=nptype)
789
+ fill_arr2 = fill_arr1.reshape(mat_shape)
790
+ fill_list1 = list(fill_arr1)
791
+ fill_list2 = [list(row) for row in fill_arr2]
792
+ fill_mat = mat_type(fill_arr1)
793
+
794
+ expected = np.tile(fill_arr1, ifa.size).reshape((*ifa.shape, *mat_shape))
795
+
796
+ # fill with 1d numpy array
797
+ ifa.fill_(fill_arr1)
798
+ assert_np_equal(ifa.numpy(), expected)
799
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, *mat_shape), dtype=nptype))
800
+
801
+ # clear
802
+ ifa.zero_()
803
+
804
+ # fill with 2d numpy array
805
+ ifa.fill_(fill_arr2)
806
+ assert_np_equal(ifa.numpy(), expected)
807
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, *mat_shape), dtype=nptype))
808
+
809
+ # clear
810
+ ifa.zero_()
811
+
812
+ # fill with flat list
813
+ ifa.fill_(fill_list1)
814
+ assert_np_equal(ifa.numpy(), expected)
815
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, *mat_shape), dtype=nptype))
816
+
817
+ # clear
818
+ ifa.zero_()
819
+
820
+ # fill with nested list
821
+ ifa.fill_(fill_list2)
822
+ assert_np_equal(ifa.numpy(), expected)
823
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, *mat_shape), dtype=nptype))
824
+
825
+ # clear
826
+ ifa.zero_()
827
+
828
+ # fill with mat instance
829
+ ifa.fill_(fill_mat)
830
+ assert_np_equal(ifa.numpy(), expected)
831
+ assert_np_equal(ifb.numpy(), np.zeros((*ifb.shape, *mat_shape), dtype=nptype))
832
+
833
+
834
+ @wp.kernel
835
+ def fa_kernel_indexing_types(
836
+ a: wp.fabricarray(dtype=wp.int32),
837
+ ):
838
+ x = a[wp.uint8(0)]
839
+ y = a[wp.int16(1)]
840
+ z = a[wp.uint32(2)]
841
+ w = a[wp.int64(3)]
842
+
843
+ a[wp.uint8(0)] = 123
844
+ a[wp.int16(1)] = 123
845
+ a[wp.uint32(2)] = 123
846
+ a[wp.int64(3)] = 123
847
+
848
+ wp.atomic_add(a, wp.uint8(0), 123)
849
+ wp.atomic_sub(a, wp.int16(1), 123)
850
+ # wp.atomic_min(a, wp.uint32(2), 123)
851
+ # wp.atomic_max(a, wp.int64(3), 123)
852
+
853
+
854
+ def test_fabricarray_indexing_types(test, device):
855
+ data = wp.zeros(shape=(4,), dtype=wp.int32, device=device)
856
+ iface = _create_fabric_array_interface(data, "foo", copy=True)
857
+ fa = wp.fabricarray(data=iface, attrib="foo")
858
+ wp.launch(
859
+ kernel=fa_kernel_indexing_types,
860
+ dim=1,
861
+ inputs=(fa,),
862
+ device=device,
863
+ )
864
+
865
+
866
+ @wp.kernel
867
+ def fa_generic_sums_kernel(a: wp.fabricarrayarray(dtype=Any), sums: wp.array(dtype=Any)):
868
+ i = wp.tid()
869
+
870
+ # get sub-array using wp::view()
871
+ row = a[i]
872
+
873
+ # get sub-array length
874
+ count = row.shape[0]
875
+
876
+ # compute sub-array sum
877
+ for j in range(count):
878
+ sums[i] = sums[i] + row[j]
879
+
880
+
881
+ @wp.kernel
882
+ def fa_generic_sums_kernel_indexed(a: wp.indexedfabricarrayarray(dtype=Any), sums: wp.array(dtype=Any)):
883
+ i = wp.tid()
884
+
885
+ # get sub-array using wp::view()
886
+ row = a[i]
887
+
888
+ # get sub-array length
889
+ count = row.shape[0]
890
+
891
+ # compute sub-array sum
892
+ for j in range(count):
893
+ sums[i] = sums[i] + row[j]
894
+
895
+
896
+ def test_fabricarrayarray(test, device):
897
+ for T in _fabric_types:
898
+ if hasattr(T, "_wp_scalar_type_"):
899
+ nptype = wp._src.types.warp_type_to_np_dtype[T._wp_scalar_type_]
900
+ else:
901
+ nptype = wp._src.types.warp_type_to_np_dtype[T]
902
+
903
+ n = 100
904
+
905
+ min_length = 1
906
+ max_length = 10
907
+ arrays = []
908
+ expected_sums = []
909
+ expected_sums_indexed = []
910
+
911
+ # generate data arrays
912
+ length = min_length
913
+ for i in range(n):
914
+ if length > max_length:
915
+ length = min_length
916
+
917
+ na = np.arange(1, length + 1, dtype=nptype)
918
+
919
+ arrays.append(wp.array(data=na, device=device))
920
+ expected_sums.append(na.sum())
921
+
922
+ # every second index
923
+ if i % 2 == 0:
924
+ expected_sums_indexed.append(na.sum())
925
+
926
+ length += 1
927
+
928
+ data_iface = _create_fabric_array_array_interface(arrays, "foo")
929
+ fa = wp.fabricarrayarray(data=data_iface, attrib="foo")
930
+
931
+ sums = wp.zeros_like(fa)
932
+
933
+ test.assertEqual(fa.dtype, sums.dtype)
934
+ test.assertEqual(fa.ndim, 2)
935
+ test.assertEqual(sums.ndim, 1)
936
+ test.assertEqual(fa.shape, sums.shape)
937
+ test.assertEqual(fa.size, sums.size)
938
+
939
+ wp.launch(fa_generic_sums_kernel, dim=fa.size, inputs=[fa, sums], device=device)
940
+
941
+ assert_np_equal(sums.numpy(), np.array(expected_sums, dtype=nptype))
942
+
943
+ # test indexed
944
+ indices = wp.array(data=np.arange(0, n, 2, dtype=np.int32), device=device)
945
+ ifa = fa[indices]
946
+
947
+ sums = wp.zeros_like(ifa)
948
+
949
+ test.assertEqual(ifa.dtype, sums.dtype)
950
+ test.assertEqual(ifa.ndim, 2)
951
+ test.assertEqual(sums.ndim, 1)
952
+ test.assertEqual(ifa.shape, sums.shape)
953
+ test.assertEqual(ifa.size, sums.size)
954
+
955
+ wp.launch(fa_generic_sums_kernel_indexed, dim=ifa.size, inputs=[ifa, sums], device=device)
956
+
957
+ assert_np_equal(sums.numpy(), np.array(expected_sums_indexed, dtype=nptype))
958
+
959
+
960
+ # explicit kernel overloads
961
+ for T in _fabric_types:
962
+ wp.overload(fa_generic_dtype_kernel, [wp.fabricarray(dtype=T), wp.fabricarray(dtype=T)])
963
+ wp.overload(fa_generic_dtype_kernel_indexed, [wp.indexedfabricarray(dtype=T), wp.indexedfabricarray(dtype=T)])
964
+
965
+ wp.overload(fa_generic_array_kernel, [wp.fabricarray(dtype=T), wp.fabricarray(dtype=T)])
966
+ wp.overload(fa_generic_array_kernel, [wp.indexedfabricarray(dtype=T), wp.indexedfabricarray(dtype=T)])
967
+
968
+ wp.overload(fa_generic_sums_kernel, [wp.fabricarrayarray(dtype=T), wp.array(dtype=T)])
969
+ wp.overload(fa_generic_sums_kernel_indexed, [wp.indexedfabricarrayarray(dtype=T), wp.array(dtype=T)])
970
+
971
+
972
+ devices = get_test_devices()
973
+
974
+
975
+ class TestFabricArray(unittest.TestCase):
976
+ def test_fabricarray_new_del(self):
977
+ # test the scenario in which a fabricarray is created but not initialized before gc
978
+ instance = wp.fabricarray.__new__(wp.fabricarray)
979
+ instance.__del__()
980
+
981
+
982
+ # fabric arrays
983
+ add_function_test(TestFabricArray, "test_fabricarray_kernel", test_fabricarray_kernel, devices=devices)
984
+ add_function_test(TestFabricArray, "test_fabricarray_empty", test_fabricarray_empty, devices=devices)
985
+ add_function_test(TestFabricArray, "test_fabricarray_generic_dtype", test_fabricarray_generic_dtype, devices=devices)
986
+ add_function_test(TestFabricArray, "test_fabricarray_generic_array", test_fabricarray_generic_array, devices=devices)
987
+ add_function_test(TestFabricArray, "test_fabricarray_fill_scalar", test_fabricarray_fill_scalar, devices=devices)
988
+ add_function_test(TestFabricArray, "test_fabricarray_fill_vector", test_fabricarray_fill_vector, devices=devices)
989
+ add_function_test(TestFabricArray, "test_fabricarray_fill_matrix", test_fabricarray_fill_matrix, devices=devices)
990
+ add_function_test(TestFabricArray, "test_fabricarray_indexing_types", test_fabricarray_indexing_types, devices=devices)
991
+
992
+ # fabric arrays of arrays
993
+ add_function_test(TestFabricArray, "test_fabricarrayarray", test_fabricarrayarray, devices=devices)
994
+
995
+
996
+ if __name__ == "__main__":
997
+ wp.clear_kernel_cache()
998
+ unittest.main(verbosity=2)