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
warp/native/mathdx.cpp ADDED
@@ -0,0 +1,93 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: Copyright (c) 2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "builtin.h"
19
+
20
+ // stubs for platforms where there is no CUDA
21
+ #if !WP_ENABLE_CUDA || !WP_ENABLE_MATHDX
22
+
23
+ extern "C"
24
+ {
25
+
26
+ WP_API
27
+ bool wp_cuda_compile_fft(
28
+ const char* ltoir_output_path,
29
+ const char* symbol_name,
30
+ int num_include_dirs,
31
+ const char** include_dirs,
32
+ const char* mathdx_include_dir,
33
+ int arch,
34
+ int size,
35
+ int elements_per_thread,
36
+ int direction,
37
+ int precision,
38
+ int* shared_memory_size)
39
+ {
40
+ printf("CUDA is disabled and/or Warp was not compiled with MathDx support.\n");
41
+ return false;
42
+ }
43
+
44
+ WP_API bool wp_cuda_compile_dot(
45
+ const char* ltoir_output_path,
46
+ const char* symbol_name,
47
+ int num_include_dirs,
48
+ const char** include_dirs,
49
+ const char* mathdx_include_dir,
50
+ int arch,
51
+ int M,
52
+ int N,
53
+ int K,
54
+ int precision_A,
55
+ int precision_B,
56
+ int precision_C,
57
+ int type,
58
+ int arrangement_A,
59
+ int arrangement_B,
60
+ int arrangement_C,
61
+ int num_threads)
62
+ {
63
+ printf("CUDA is disabled and/or Warp was not compiled with MathDx support.\n");
64
+ return false;
65
+ }
66
+
67
+ WP_API bool wp_cuda_compile_solver(
68
+ const char* fatbin_output_path,
69
+ const char* ltoir_output_path,
70
+ const char* symbol_name,
71
+ int num_include_dirs,
72
+ const char** include_dirs,
73
+ const char* mathdx_include_dir,
74
+ int arch,
75
+ int M,
76
+ int N,
77
+ int NRHS,
78
+ int function,
79
+ int side,
80
+ int diag,
81
+ int precision,
82
+ int arrangement_A,
83
+ int arrangement_B,
84
+ int fill_mode,
85
+ int num_threads)
86
+ {
87
+ printf("CUDA is disabled and/or Warp was not compiled with MathDx support.\n");
88
+ return false;
89
+ }
90
+
91
+ } // extern "C"
92
+
93
+ #endif // !WP_ENABLE_CUDA || !WP_ENABLE_MATHDX
warp/native/matnn.h ADDED
@@ -0,0 +1,221 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ namespace wp
21
+ {
22
+
23
+
24
+ CUDA_CALLABLE inline int dense_index(int stride, int i, int j)
25
+ {
26
+ return i*stride + j;
27
+ }
28
+
29
+ template <bool transpose>
30
+ CUDA_CALLABLE inline int dense_index(int rows, int cols, int i, int j)
31
+ {
32
+ if (transpose)
33
+ return j*rows + i;
34
+ else
35
+ return i*cols + j;
36
+ }
37
+
38
+
39
+
40
+ template <bool t1, bool t2, bool add>
41
+ CUDA_CALLABLE inline void dense_gemm_impl(int m, int n, int p, const float* __restrict__ A, const float* __restrict__ B, float* __restrict__ C)
42
+ {
43
+ for (int i=0; i < m; i++)
44
+ {
45
+ for (int j=0; j < n; ++j)
46
+ {
47
+ float sum = 0.0f;
48
+
49
+ for (int k=0; k < p; ++k)
50
+ {
51
+ sum += A[dense_index<t1>(m, p, i, k)]*B[dense_index<t2>(p, n, k, j)];
52
+ }
53
+
54
+ if (add)
55
+ C[i*n + j] += sum;
56
+ else
57
+ C[i*n + j] = sum;
58
+ }
59
+ }
60
+ }
61
+
62
+
63
+ template <bool add=false>
64
+ CUDA_CALLABLE inline void dense_gemm(int m, int n, int p, int t1, int t2, const array_t<float>& A, const array_t<float>& B, array_t<float>& C)
65
+ {
66
+ if (t1 == 0 && t2 == 0)
67
+ dense_gemm_impl<false, false, add>(m, n, p, A.data, B.data, C.data);
68
+ else if (t1 == 1 && t2 == 0)
69
+ dense_gemm_impl<true, false, add>(m, n, p, A.data, B.data, C.data);
70
+ else if (t1 == 0 && t2 == 1)
71
+ dense_gemm_impl<false, true, add>(m, n, p, A.data, B.data, C.data);
72
+ else if (t1 == 1 && t2 == 1)
73
+ dense_gemm_impl<true, true, add>(m, n, p, A.data, B.data, C.data);
74
+ }
75
+
76
+
77
+
78
+
79
+ void CUDA_CALLABLE inline dense_chol(int n, const array_t<float>& A, float regularization, array_t<float>& L)
80
+ {
81
+ for (int j=0; j < n; ++j)
82
+ {
83
+ float s = A.data[dense_index(n, j, j)] + regularization;
84
+
85
+ for (int k=0; k < j; ++k)
86
+ {
87
+ float r = L.data[dense_index(n, j, k)];
88
+ s -= r*r;
89
+ }
90
+
91
+ s = sqrt(s);
92
+ const float invS = 1.0f/s;
93
+
94
+ L.data[dense_index(n, j, j)] = s;
95
+
96
+ for (int i=j+1; i < n; ++i)
97
+ {
98
+ s = A.data[dense_index(n, i, j)];
99
+
100
+ for (int k=0; k < j; ++k)
101
+ {
102
+ s -= L.data[dense_index(n, i, k)]*L.data[dense_index(n, j, k)];
103
+ }
104
+
105
+ L.data[dense_index(n, i, j)] = s*invS;
106
+ }
107
+ }
108
+ }
109
+
110
+
111
+
112
+
113
+ // Solves (L*L^T)x = b given the Cholesky factor L
114
+ CUDA_CALLABLE inline void dense_subs(int n, const array_t<float>& L, const array_t<float>& b, array_t<float>& x)
115
+ {
116
+ // forward substitution
117
+ for (int i=0; i < n; ++i)
118
+ {
119
+ float s = b.data[i];
120
+
121
+ for (int j=0; j < i; ++j)
122
+ {
123
+ s -= L.data[dense_index(n, i, j)]*x.data[j];
124
+ }
125
+
126
+ x.data[i] = s/L.data[dense_index(n, i, i)];
127
+ }
128
+
129
+ // backward substitution
130
+ for (int i=n-1; i >= 0; --i)
131
+ {
132
+ float s = x.data[i];
133
+
134
+ for (int j=i+1; j < n; ++j)
135
+ {
136
+ s -= L.data[dense_index(n, j, i)]*x.data[j];
137
+ }
138
+
139
+ x.data[i] = s/L.data[dense_index(n, i, i)];
140
+ }
141
+ }
142
+
143
+ CUDA_CALLABLE inline void dense_solve(int n, const array_t<float>& A, const array_t<float>& L, const array_t<float>& b, array_t<float>& x)
144
+ {
145
+ dense_subs(n, L, b, x);
146
+ }
147
+
148
+
149
+ // CUDA_CALLABLE inline void print_matrix(const char* name, int m, int n, const float* data)
150
+ // {
151
+ // printf("%s = [", name);
152
+
153
+ // for (int i=0; i < m; ++i)
154
+ // {
155
+ // for (int j=0; j < n; ++j)
156
+ // {
157
+ // printf("%f ", data[dense_index(n, i, j)]);
158
+ // }
159
+
160
+ // printf(";\n");
161
+ // }
162
+
163
+ // printf("]\n");
164
+ // }
165
+
166
+ // adjoint methods
167
+ CUDA_CALLABLE inline void adj_dense_gemm(
168
+ int m, int n, int p, int t1, int t2, const array_t<float>& A, const array_t<float>& B, array_t<float>& C,
169
+ int adj_m, int adj_n, int adj_p, int adj_t1, int adj_t2, array_t<float>& adj_A, array_t<float>& adj_B, const array_t<float>& adj_C)
170
+ {
171
+
172
+ // print_matrix("A", m, p, A);
173
+ // print_matrix("B", p, n, B);
174
+ // printf("t1: %d t2: %d\n", t1, t2);
175
+
176
+ if (t1)
177
+ {
178
+ dense_gemm<true>(p, m, n, 0, 1, B, adj_C, adj_A);
179
+ dense_gemm<true>(p, n, m, int(!t1), 0, A, adj_C, adj_B);
180
+ }
181
+ else
182
+ {
183
+ dense_gemm<true>(m, p, n, 0, int(!t2), adj_C, B, adj_A);
184
+ dense_gemm<true>(p, n, m, int(!t1), 0, A, adj_C, adj_B);
185
+ }
186
+ }
187
+
188
+
189
+ CUDA_CALLABLE inline void adj_dense_chol(
190
+ int n, const array_t<float>& A, float regularization, array_t<float>& L,
191
+ int adj_n, const array_t<float>& adj_A, float adj_regularization, array_t<float>& adj_L)
192
+ {
193
+ // nop, use dense_solve to differentiate through (A^-1)b = x
194
+ }
195
+
196
+ CUDA_CALLABLE inline void adj_dense_subs(
197
+ int n, const array_t<float>& L, const array_t<float>& b, array_t<float>& x,
198
+ int adj_n, const array_t<float>& adj_L, const array_t<float>& adj_b, array_t<float>& adj_x)
199
+ {
200
+ // nop, use dense_solve to differentiate through (A^-1)b = x
201
+ }
202
+
203
+
204
+ CUDA_CALLABLE inline void adj_dense_solve(int n,
205
+ const array_t<float>& A, const array_t<float>& L, const array_t<float>& b, const array_t<float>& x,
206
+ int adj_n, array_t<float>& adj_A, array_t<float>& adj_L, array_t<float>& adj_b, const array_t<float>& adj_x)
207
+ {
208
+ // see https://people.maths.ox.ac.uk/gilesm/files/NA-08-01.pwp, section 2.3.1
209
+ dense_subs(n, L, adj_x, adj_b);
210
+
211
+ // A* = -adj_b*x^T
212
+ for (int i=0; i < n; ++i)
213
+ {
214
+ for (int j=0; j < n; ++j)
215
+ {
216
+ adj_A.data[dense_index(n, i, j)] += -adj_b.data[i]*x.data[j];
217
+ }
218
+ }
219
+ }
220
+
221
+ } // namespace wp
warp/native/mesh.cpp ADDED
@@ -0,0 +1,266 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "mesh.h"
19
+ #include "bvh.h"
20
+ #include "warp.h"
21
+ #include "cuda_util.h"
22
+
23
+ using namespace wp;
24
+
25
+ #include <map>
26
+
27
+ namespace
28
+ {
29
+ // host-side copy of mesh descriptors, maps GPU mesh address (id) to a CPU desc
30
+ std::map<uint64_t, Mesh> g_mesh_descriptors;
31
+
32
+ } // anonymous namespace
33
+
34
+
35
+ namespace wp
36
+ {
37
+
38
+ bool mesh_get_descriptor(uint64_t id, Mesh& mesh)
39
+ {
40
+ const auto& iter = g_mesh_descriptors.find(id);
41
+ if (iter == g_mesh_descriptors.end())
42
+ return false;
43
+ else
44
+ mesh = iter->second;
45
+ return true;
46
+ }
47
+
48
+ bool mesh_set_descriptor(uint64_t id, const Mesh& mesh)
49
+ {
50
+ const auto& iter = g_mesh_descriptors.find(id);
51
+ if (iter == g_mesh_descriptors.end())
52
+ return false;
53
+ else
54
+ iter->second = mesh;
55
+ return true;
56
+ }
57
+
58
+ void mesh_add_descriptor(uint64_t id, const Mesh& mesh)
59
+ {
60
+ g_mesh_descriptors[id] = mesh;
61
+ }
62
+
63
+ void mesh_rem_descriptor(uint64_t id)
64
+ {
65
+ g_mesh_descriptors.erase(id);
66
+
67
+ }
68
+
69
+ } // namespace wp
70
+
71
+ void bvh_refit_with_solid_angle_recursive_host(BVH& bvh, int index, Mesh& mesh)
72
+ {
73
+ BVHPackedNodeHalf& lower = bvh.node_lowers[index];
74
+ BVHPackedNodeHalf& upper = bvh.node_uppers[index];
75
+
76
+ if (lower.b)
77
+ {
78
+ // Leaf, compute properties
79
+ const int start = lower.i;
80
+ const int end = upper.i;
81
+ // loops through primitives in the leaf
82
+ for (int primitive_counter = start; primitive_counter < end; primitive_counter++)
83
+ {
84
+ int primitive_index = mesh.bvh.primitive_indices[primitive_counter];
85
+ if (primitive_counter == start)
86
+ {
87
+ precompute_triangle_solid_angle_props(mesh.points[mesh.indices[primitive_index * 3 + 0]], mesh.points[mesh.indices[primitive_index * 3 + 1]],
88
+ mesh.points[mesh.indices[primitive_index * 3 + 2]], mesh.solid_angle_props[index]);
89
+ }
90
+ else
91
+ {
92
+ SolidAngleProps triangle_solid_angle_props;
93
+ precompute_triangle_solid_angle_props(mesh.points[mesh.indices[primitive_index * 3 + 0]], mesh.points[mesh.indices[primitive_index * 3 + 1]],
94
+ mesh.points[mesh.indices[primitive_index * 3 + 2]], triangle_solid_angle_props);
95
+ mesh.solid_angle_props[index] = combine_precomputed_solid_angle_props(&mesh.solid_angle_props[index], &triangle_solid_angle_props);
96
+ }
97
+ }
98
+
99
+ reinterpret_cast<vec3&>(lower) = mesh.solid_angle_props[index].box.lower;
100
+ reinterpret_cast<vec3&>(upper) = mesh.solid_angle_props[index].box.upper;
101
+ }
102
+ else
103
+ {
104
+ int left_index = lower.i;
105
+ int right_index = upper.i;
106
+
107
+ bvh_refit_with_solid_angle_recursive_host(bvh, left_index, mesh);
108
+ bvh_refit_with_solid_angle_recursive_host(bvh, right_index, mesh);
109
+
110
+ // combine
111
+ SolidAngleProps* left_child_data = &mesh.solid_angle_props[left_index];
112
+ SolidAngleProps* right_child_data = (left_index != right_index) ? &mesh.solid_angle_props[right_index] : NULL;
113
+
114
+ combine_precomputed_solid_angle_props(mesh.solid_angle_props[index], left_child_data, right_child_data);
115
+
116
+ // compute union of children
117
+ const vec3& left_lower = reinterpret_cast<const vec3&>(bvh.node_lowers[left_index]);
118
+ const vec3& left_upper = reinterpret_cast<const vec3&>(bvh.node_uppers[left_index]);
119
+
120
+ const vec3& right_lower = reinterpret_cast<const vec3&>(bvh.node_lowers[right_index]);
121
+ const vec3& right_upper = reinterpret_cast<const vec3&>(bvh.node_uppers[right_index]);
122
+
123
+ // union of child bounds
124
+ vec3 new_lower = min(left_lower, right_lower);
125
+ vec3 new_upper = max(left_upper, right_upper);
126
+
127
+ // write new BVH nodes
128
+ reinterpret_cast<vec3&>(lower) = new_lower;
129
+ reinterpret_cast<vec3&>(upper) = new_upper;
130
+ }
131
+ }
132
+
133
+ void bvh_refit_with_solid_angle_host(BVH& bvh, Mesh& mesh)
134
+ {
135
+ bvh_refit_with_solid_angle_recursive_host(bvh, 0, mesh);
136
+ }
137
+
138
+ uint64_t wp_mesh_create_host(array_t<wp::vec3> points, array_t<wp::vec3> velocities, array_t<int> indices, int num_points, int num_tris, int support_winding_number, int constructor_type, int bvh_leaf_size)
139
+ {
140
+ Mesh* m = new Mesh(points, velocities, indices, num_points, num_tris);
141
+
142
+ m->lowers = new vec3[num_tris];
143
+ m->uppers = new vec3[num_tris];
144
+
145
+ float sum = 0.0;
146
+ for (int i=0; i < num_tris; ++i)
147
+ {
148
+ wp::vec3& p0 = points[indices[i*3+0]];
149
+ wp::vec3& p1 = points[indices[i*3+1]];
150
+ wp::vec3& p2 = points[indices[i*3+2]];
151
+
152
+ // compute triangle bounds
153
+ bounds3 b;
154
+ b.add_point(p0);
155
+ b.add_point(p1);
156
+ b.add_point(p2);
157
+
158
+ m->lowers[i] = b.lower;
159
+ m->uppers[i] = b.upper;
160
+
161
+ // compute edge lengths
162
+ sum += length(p0-p1) + length(p0-p2) + length(p2-p1);
163
+ }
164
+ m->average_edge_length = sum / (num_tris*3);
165
+
166
+ wp::bvh_create_host(m->lowers, m->uppers, num_tris, constructor_type, m->bvh, bvh_leaf_size);
167
+
168
+ if (support_winding_number)
169
+ {
170
+ // Let's first compute the sold
171
+ int num_bvh_nodes = 2*num_tris-1;
172
+ m->solid_angle_props = new SolidAngleProps[num_bvh_nodes];
173
+ bvh_refit_with_solid_angle_host(m->bvh, *m);
174
+ }
175
+
176
+ return (uint64_t)m;
177
+ }
178
+
179
+
180
+ void wp_mesh_destroy_host(uint64_t id)
181
+ {
182
+ Mesh* m = (Mesh*)(id);
183
+
184
+ delete[] m->lowers;
185
+ delete[] m->uppers;
186
+
187
+ if (m->solid_angle_props) {
188
+ delete [] m->solid_angle_props;
189
+ }
190
+ wp::bvh_destroy_host(m->bvh);
191
+
192
+ delete m;
193
+ }
194
+
195
+ void wp_mesh_refit_host(uint64_t id)
196
+ {
197
+ Mesh* m = (Mesh*)(id);
198
+
199
+ float sum = 0.0;
200
+ for (int i=0; i < m->num_tris; ++i)
201
+ {
202
+ wp::vec3 p0 = m->points.data[m->indices.data[i*3+0]];
203
+ wp::vec3 p1 = m->points.data[m->indices.data[i*3+1]];
204
+ wp::vec3 p2 = m->points.data[m->indices.data[i*3+2]];
205
+
206
+ // compute triangle bounds
207
+ bounds3 b;
208
+ b.add_point(p0);
209
+ b.add_point(p1);
210
+ b.add_point(p2);
211
+
212
+ m->lowers[i] = b.lower;
213
+ m->uppers[i] = b.upper;
214
+
215
+ sum += length(p0-p1) + length(p0-p2) + length(p2-p1);
216
+ }
217
+ m->average_edge_length = sum / (m->num_tris*3);
218
+
219
+ if (m->solid_angle_props)
220
+ {
221
+ // If solid angle were used, use refit solid angle
222
+ bvh_refit_with_solid_angle_host(m->bvh, *m);
223
+ }
224
+ else
225
+ {
226
+ wp::bvh_refit_host(m->bvh);
227
+ }
228
+ }
229
+
230
+ void wp_mesh_set_points_host(uint64_t id, wp::array_t<wp::vec3> points)
231
+ {
232
+ Mesh* m = (Mesh*)(id);
233
+ if (points.ndim != 1 || points.shape[0] != m->points.shape[0])
234
+ {
235
+ fprintf(stderr, "The new points input for wp_mesh_set_points_host does not match the shape of the original points!\n");
236
+ return;
237
+ }
238
+
239
+ m->points = points;
240
+
241
+ wp_mesh_refit_host(id);
242
+ }
243
+
244
+ void wp_mesh_set_velocities_host(uint64_t id, wp::array_t<wp::vec3> velocities)
245
+ {
246
+ Mesh* m = (Mesh*)(id);
247
+ if (velocities.ndim != 1 || velocities.shape[0] != m->velocities.shape[0])
248
+ {
249
+ fprintf(stderr, "The new velocities input for wp_mesh_set_velocities_host does not match the shape of the original velocities!\n");
250
+ return;
251
+ }
252
+ m->velocities = velocities;
253
+ }
254
+
255
+ // stubs for non-CUDA platforms
256
+ #if !WP_ENABLE_CUDA
257
+
258
+
259
+ WP_API uint64_t wp_mesh_create_device(void* context, wp::array_t<wp::vec3> points, wp::array_t<wp::vec3> velocities, wp::array_t<int> tris, int num_points, int num_tris, int support_winding_number, int constructor_type, int bvh_leaf_size) { return 0; }
260
+ WP_API void wp_mesh_destroy_device(uint64_t id) {}
261
+ WP_API void wp_mesh_refit_device(uint64_t id) {}
262
+ WP_API void wp_mesh_set_points_device(uint64_t id, wp::array_t<wp::vec3> points) {};
263
+ WP_API void wp_mesh_set_velocities_device(uint64_t id, wp::array_t<wp::vec3> points) {};
264
+
265
+
266
+ #endif // !WP_ENABLE_CUDA