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,483 @@
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 functools import cached_property
17
+ from typing import Any, Optional
18
+
19
+ import warp as wp
20
+ from warp._src.fem import cache
21
+ from warp._src.fem.types import NULL_ELEMENT_INDEX, ElementIndex
22
+ from warp._src.fem.utils import masked_indices
23
+
24
+ from .geometry import Geometry
25
+
26
+ _wp_module_name_ = "warp.fem.geometry.partition"
27
+
28
+ wp.set_module_options({"enable_backward": False})
29
+
30
+
31
+ class GeometryPartition:
32
+ """Base class for geometry partitions, i.e. subset of cells and sides"""
33
+
34
+ class CellArg:
35
+ pass
36
+
37
+ class SideArg:
38
+ pass
39
+
40
+ def __init__(self, geometry: Geometry):
41
+ self.geometry = geometry
42
+
43
+ def cell_count(self) -> int:
44
+ """Number of cells that are 'owned' by this partition"""
45
+ raise NotImplementedError()
46
+
47
+ def side_count(self) -> int:
48
+ """Number of sides that are 'owned' by this partition"""
49
+ raise NotImplementedError()
50
+
51
+ def boundary_side_count(self) -> int:
52
+ """Number of geo-boundary sides that are 'owned' by this partition"""
53
+ raise NotImplementedError()
54
+
55
+ def frontier_side_count(self) -> int:
56
+ """Number of sides with neighbors owned by this and another partition"""
57
+ raise NotImplementedError()
58
+
59
+ @property
60
+ def name(self) -> str:
61
+ return f"{self.geometry.name}_{self.__class__.__name__}"
62
+
63
+ def __str__(self) -> str:
64
+ return self.name
65
+
66
+ @cache.cached_arg_value
67
+ def cell_arg_value(self, device):
68
+ args = self.CellArg()
69
+ self.fill_cell_arg(args, device)
70
+ return args
71
+
72
+ def fill_cell_arg(self, args: CellArg, device):
73
+ if self.cell_arg_value is __class__.cell_arg_value:
74
+ raise NotImplementedError()
75
+ args.assign(self.cell_arg_value(device))
76
+
77
+ @cache.cached_arg_value
78
+ def side_arg_value(self, device):
79
+ args = self.SideArg()
80
+ self.fill_side_arg(args, device)
81
+ return args
82
+
83
+ def fill_side_arg(self, args: SideArg, device):
84
+ if self.side_arg_value is __class__.side_arg_value:
85
+ raise NotImplementedError()
86
+ args.assign(self.side_arg_value(device))
87
+
88
+ @staticmethod
89
+ def cell_index(args: CellArg, partition_cell_index: int):
90
+ """Index in the geometry of a partition cell"""
91
+ raise NotImplementedError()
92
+
93
+ @staticmethod
94
+ def partition_cell_index(args: CellArg, cell_index: int):
95
+ """Index of a geometry cell in the partition (or ``NULL_ELEMENT_INDEX``)"""
96
+ raise NotImplementedError()
97
+
98
+ @staticmethod
99
+ def side_index(args: SideArg, partition_side_index: int):
100
+ """Partition side to side index"""
101
+ raise NotImplementedError()
102
+
103
+ @staticmethod
104
+ def boundary_side_index(args: SideArg, boundary_side_index: int):
105
+ """Boundary side to side index"""
106
+ raise NotImplementedError()
107
+
108
+ @staticmethod
109
+ def frontier_side_index(args: SideArg, frontier_side_index: int):
110
+ """Frontier side to side index"""
111
+ raise NotImplementedError()
112
+
113
+
114
+ class WholeGeometryPartition(GeometryPartition):
115
+ """Trivial (NOP) partition"""
116
+
117
+ def __init__(
118
+ self,
119
+ geometry: Geometry,
120
+ ):
121
+ super().__init__(geometry)
122
+
123
+ self.SideArg = geometry.SideIndexArg
124
+ self.side_arg_value = geometry.side_index_arg_value
125
+ self.fill_side_arg = geometry.fill_side_index_arg
126
+
127
+ self.cell_index = WholeGeometryPartition._identity_element_index
128
+ self.partition_cell_index = WholeGeometryPartition._identity_element_index
129
+
130
+ self.side_index = WholeGeometryPartition._identity_element_index
131
+ self.boundary_side_index = geometry.boundary_side_index
132
+ self.frontier_side_index = WholeGeometryPartition._identity_element_index
133
+
134
+ def __eq__(self, other: GeometryPartition) -> bool:
135
+ # Ensures that two whole partition instances of the same geometry are considered equal
136
+ return isinstance(other, WholeGeometryPartition) and self.geometry == other.geometry
137
+
138
+ def cell_count(self) -> int:
139
+ return self.geometry.cell_count()
140
+
141
+ def side_count(self) -> int:
142
+ return self.geometry.side_count()
143
+
144
+ def boundary_side_count(self) -> int:
145
+ return self.geometry.boundary_side_count()
146
+
147
+ def frontier_side_count(self) -> int:
148
+ return 0
149
+
150
+ @wp.struct
151
+ class CellArg:
152
+ pass
153
+
154
+ def fill_cell_arg(self, args: CellArg, device):
155
+ pass
156
+
157
+ @wp.func
158
+ def _identity_element_index(args: Any, idx: ElementIndex):
159
+ return idx
160
+
161
+ @property
162
+ def name(self) -> str:
163
+ return self.geometry.name
164
+
165
+ @wp.func
166
+ def side_to_cell_arg(side_arg: Any):
167
+ return WholeGeometryPartition.CellArg()
168
+
169
+
170
+ class CellBasedGeometryPartition(GeometryPartition):
171
+ """Geometry partition based on a subset of cells. Interior, boundary and frontier sides are automatically categorized."""
172
+
173
+ def __init__(
174
+ self,
175
+ geometry: Geometry,
176
+ device=None,
177
+ ):
178
+ super().__init__(geometry)
179
+
180
+ self._partition_side_indices: wp.array = None
181
+ self._boundary_side_indices: wp.array = None
182
+ self._frontier_side_indices: wp.array = None
183
+
184
+ @cached_property
185
+ def SideArg(self):
186
+ return self._make_side_arg()
187
+
188
+ def _make_side_arg(self):
189
+ @cache.dynamic_struct(suffix=self.name)
190
+ class SideArg:
191
+ cell_arg: self.CellArg
192
+ partition_side_indices: wp.array(dtype=int)
193
+ boundary_side_indices: wp.array(dtype=int)
194
+ frontier_side_indices: wp.array(dtype=int)
195
+
196
+ return SideArg
197
+
198
+ def side_count(self) -> int:
199
+ return self._partition_side_indices.shape[0]
200
+
201
+ def boundary_side_count(self) -> int:
202
+ return self._boundary_side_indices.shape[0]
203
+
204
+ def frontier_side_count(self) -> int:
205
+ return self._frontier_side_indices.shape[0]
206
+
207
+ def fill_side_arg(self, args: SideArg, device):
208
+ self.fill_cell_arg(args.cell_arg, device)
209
+ args.partition_side_indices = self._partition_side_indices.to(device)
210
+ args.boundary_side_indices = self._boundary_side_indices.to(device)
211
+ args.frontier_side_indices = self._frontier_side_indices.to(device)
212
+
213
+ @wp.func
214
+ def side_index(args: Any, partition_side_index: int):
215
+ """partition side to side index"""
216
+ return args.partition_side_indices[partition_side_index]
217
+
218
+ @wp.func
219
+ def boundary_side_index(args: Any, boundary_side_index: int):
220
+ """Boundary side to side index"""
221
+ return args.boundary_side_indices[boundary_side_index]
222
+
223
+ @wp.func
224
+ def frontier_side_index(args: Any, frontier_side_index: int):
225
+ """Frontier side to side index"""
226
+ return args.frontier_side_indices[frontier_side_index]
227
+
228
+ def compute_side_indices_from_cells(
229
+ self,
230
+ cell_arg_value: Any,
231
+ cell_inclusion_test_func: wp.Function,
232
+ device,
233
+ max_side_count: int = -1,
234
+ temporary_store: cache.TemporaryStore = None,
235
+ ):
236
+ self.side_arg_value.invalidate(self)
237
+
238
+ if max_side_count == 0:
239
+ self._partition_side_indices = cache.borrow_temporary(temporary_store, dtype=int, shape=(0,), device=device)
240
+ self._boundary_side_indices = self._partition_side_indices
241
+ self._frontier_side_indices = self._partition_side_indices
242
+ return
243
+
244
+ cell_arg_type = next(iter(cell_inclusion_test_func.input_types.values()))
245
+
246
+ @cache.dynamic_kernel(suffix=f"{self.geometry.name}_{cell_inclusion_test_func.key}")
247
+ def count_sides(
248
+ geo_arg: self.geometry.SideArg,
249
+ cell_arg_value: cell_arg_type,
250
+ partition_side_mask: wp.array(dtype=int),
251
+ boundary_side_mask: wp.array(dtype=int),
252
+ frontier_side_mask: wp.array(dtype=int),
253
+ ):
254
+ side_index = wp.tid()
255
+ inner_cell_index = self.geometry.side_inner_cell_index(geo_arg, side_index)
256
+ outer_cell_index = self.geometry.side_outer_cell_index(geo_arg, side_index)
257
+
258
+ inner_in = cell_inclusion_test_func(cell_arg_value, inner_cell_index)
259
+ outer_in = cell_inclusion_test_func(cell_arg_value, outer_cell_index)
260
+
261
+ if inner_in:
262
+ # Inner neighbor in partition; count as partition side
263
+ partition_side_mask[side_index] = 1
264
+
265
+ # Inner and outer element as the same -- this is a boundary side
266
+ if inner_cell_index == outer_cell_index:
267
+ boundary_side_mask[side_index] = 1
268
+
269
+ if inner_in != outer_in:
270
+ # Exactly one neighbor in partition; count as frontier side
271
+ frontier_side_mask[side_index] = 1
272
+
273
+ partition_side_mask = cache.borrow_temporary(
274
+ temporary_store,
275
+ shape=(self.geometry.side_count(),),
276
+ dtype=int,
277
+ device=device,
278
+ )
279
+ boundary_side_mask = cache.borrow_temporary(
280
+ temporary_store,
281
+ shape=(self.geometry.side_count(),),
282
+ dtype=int,
283
+ device=device,
284
+ )
285
+ frontier_side_mask = cache.borrow_temporary(
286
+ temporary_store,
287
+ shape=(self.geometry.side_count(),),
288
+ dtype=int,
289
+ device=device,
290
+ )
291
+
292
+ partition_side_mask.zero_()
293
+ boundary_side_mask.zero_()
294
+ frontier_side_mask.zero_()
295
+
296
+ wp.launch(
297
+ dim=partition_side_mask.shape[0],
298
+ kernel=count_sides,
299
+ inputs=[
300
+ self.geometry.side_arg_value(device),
301
+ cell_arg_value,
302
+ partition_side_mask,
303
+ boundary_side_mask,
304
+ frontier_side_mask,
305
+ ],
306
+ device=device,
307
+ )
308
+
309
+ # Convert counts to indices
310
+ self._partition_side_indices, _ = masked_indices(
311
+ partition_side_mask,
312
+ max_index_count=max_side_count,
313
+ local_to_global=self._partition_side_indices,
314
+ temporary_store=temporary_store,
315
+ )
316
+ self._boundary_side_indices, _ = masked_indices(
317
+ boundary_side_mask,
318
+ max_index_count=max_side_count,
319
+ local_to_global=self._boundary_side_indices,
320
+ temporary_store=temporary_store,
321
+ )
322
+ self._frontier_side_indices, _ = masked_indices(
323
+ frontier_side_mask,
324
+ max_index_count=max_side_count,
325
+ local_to_global=self._frontier_side_indices,
326
+ temporary_store=temporary_store,
327
+ )
328
+
329
+ partition_side_mask.release()
330
+ boundary_side_mask.release()
331
+ frontier_side_mask.release()
332
+
333
+ @wp.func
334
+ def side_to_cell_arg(side_arg: Any):
335
+ return side_arg.cell_arg
336
+
337
+
338
+ class LinearGeometryPartition(CellBasedGeometryPartition):
339
+ def __init__(
340
+ self,
341
+ geometry: Geometry,
342
+ partition_rank: int,
343
+ partition_count: int,
344
+ device=None,
345
+ temporary_store: cache.TemporaryStore = None,
346
+ ):
347
+ """Creates a geometry partition by uniformly partionning cell indices
348
+
349
+ Args:
350
+ geometry: the geometry to partition
351
+ partition_rank: the index of the partition being created
352
+ partition_count: the number of partitions that will be created over the geometry
353
+ device: Warp device on which to perform and store computations
354
+ """
355
+ super().__init__(geometry)
356
+
357
+ total_cell_count = geometry.cell_count()
358
+
359
+ cells_per_partition = (total_cell_count + partition_count - 1) // partition_count
360
+ self.cell_begin = cells_per_partition * partition_rank
361
+ self.cell_end = min(self.cell_begin + cells_per_partition, total_cell_count)
362
+
363
+ super().compute_side_indices_from_cells(
364
+ self.cell_arg_value(device),
365
+ LinearGeometryPartition._cell_inclusion_test,
366
+ device,
367
+ temporary_store=temporary_store,
368
+ )
369
+
370
+ def cell_count(self) -> int:
371
+ return self.cell_end - self.cell_begin
372
+
373
+ @wp.struct
374
+ class CellArg:
375
+ cell_begin: int
376
+ cell_end: int
377
+
378
+ def fill_cell_arg(self, args: CellArg, device):
379
+ args.cell_begin = self.cell_begin
380
+ args.cell_end = self.cell_end
381
+
382
+ @wp.func
383
+ def cell_index(args: CellArg, partition_cell_index: int):
384
+ """Partition cell to cell index"""
385
+ return args.cell_begin + partition_cell_index
386
+
387
+ @wp.func
388
+ def partition_cell_index(args: CellArg, cell_index: int):
389
+ """Partition cell to cell index"""
390
+ return wp.where(
391
+ cell_index >= args.cell_begin and cell_index < args.cell_end,
392
+ cell_index - args.cell_begin,
393
+ NULL_ELEMENT_INDEX,
394
+ )
395
+
396
+ @wp.func
397
+ def _cell_inclusion_test(arg: CellArg, cell_index: int):
398
+ return cell_index >= arg.cell_begin and cell_index < arg.cell_end
399
+
400
+
401
+ class ExplicitGeometryPartition(CellBasedGeometryPartition):
402
+ def __init__(
403
+ self,
404
+ geometry: Geometry,
405
+ cell_mask: "wp.array(dtype=int)",
406
+ max_cell_count: int = -1,
407
+ max_side_count: int = -1,
408
+ temporary_store: Optional[cache.TemporaryStore] = None,
409
+ ):
410
+ """Creates a geometry partition from an active cell mask
411
+
412
+ Args:
413
+ geometry: the geometry to partition
414
+ cell_mask: warp array of length ``geometry.cell_count()`` indicating which cells are selected. Array values must be either ``1`` (selected) or ``0`` (not selected).
415
+ max_cell_count: if positive, will be used to limit the number of cells to avoid device/host synchronization
416
+ max_side_count: if positive, will be used to limit the number of sides to avoid device/host synchronization
417
+ """
418
+
419
+ super().__init__(geometry)
420
+
421
+ self._cells: wp.array = None
422
+ self._partition_cells: wp.array = None
423
+
424
+ self._max_cell_count = max_cell_count
425
+ self._max_side_count = max_side_count
426
+
427
+ self.rebuild(cell_mask, temporary_store)
428
+
429
+ def rebuild(
430
+ self,
431
+ cell_mask: "wp.array(dtype=int)",
432
+ temporary_store: Optional[cache.TemporaryStore] = None,
433
+ ):
434
+ """
435
+ Rebuilds the geometry partition from a new active cell mask
436
+
437
+ Args:
438
+ geometry: the geometry to partition
439
+ cell_mask: warp array of length ``geometry.cell_count()`` indicating which cells are selected. Array values must be either ``1`` (selected) or ``0`` (not selected).
440
+ max_cell_count: if positive, will be used to limit the number of cells to avoid device/host synchronization
441
+ max_side_count: if positive, will be used to limit the number of sides to avoid device/host synchronization
442
+ """
443
+ self.cell_arg_value.invalidate(self)
444
+
445
+ self._cells, self._partition_cells = masked_indices(
446
+ cell_mask,
447
+ local_to_global=self._cells,
448
+ global_to_local=self._partition_cells,
449
+ max_index_count=self._max_cell_count,
450
+ temporary_store=temporary_store,
451
+ )
452
+
453
+ super().compute_side_indices_from_cells(
454
+ self.cell_arg_value(cell_mask.device),
455
+ ExplicitGeometryPartition._cell_inclusion_test,
456
+ max_side_count=self._max_side_count,
457
+ device=cell_mask.device,
458
+ temporary_store=temporary_store,
459
+ )
460
+
461
+ def cell_count(self) -> int:
462
+ return self._cells.shape[0]
463
+
464
+ @wp.struct
465
+ class CellArg:
466
+ cell_index: wp.array(dtype=int)
467
+ partition_cell_index: wp.array(dtype=int)
468
+
469
+ def fill_cell_arg(self, args: CellArg, device):
470
+ args.cell_index = self._cells.to(device)
471
+ args.partition_cell_index = self._partition_cells.to(device)
472
+
473
+ @wp.func
474
+ def cell_index(args: CellArg, partition_cell_index: int):
475
+ return args.cell_index[partition_cell_index]
476
+
477
+ @wp.func
478
+ def partition_cell_index(args: CellArg, cell_index: int):
479
+ return args.partition_cell_index[cell_index]
480
+
481
+ @wp.func
482
+ def _cell_inclusion_test(arg: CellArg, cell_index: int):
483
+ return arg.partition_cell_index[cell_index] != NULL_ELEMENT_INDEX