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,478 @@
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.cache import cached_arg_value, dynamic_func
21
+ from warp._src.fem.types import NULL_ELEMENT_INDEX, OUTSIDE, Coords, ElementIndex, Sample, make_free_sample
22
+
23
+ from .closest_point import project_on_box_at_origin
24
+ from .element import Element
25
+ from .geometry import Geometry
26
+
27
+ _wp_module_name_ = "warp.fem.geometry.grid_2d"
28
+
29
+
30
+ @wp.struct
31
+ class Grid2DCellArg:
32
+ res: wp.vec2i
33
+ cell_size: wp.vec2
34
+ origin: wp.vec2
35
+
36
+
37
+ class Grid2D(Geometry):
38
+ """Two-dimensional regular grid geometry"""
39
+
40
+ dimension = 2
41
+
42
+ ALT_AXIS = 0
43
+ LONG_AXIS = 1
44
+
45
+ def __init__(self, res: wp.vec2i, bounds_lo: Optional[wp.vec2] = None, bounds_hi: Optional[wp.vec2] = None):
46
+ """Constructs a dense 2D grid
47
+
48
+ Args:
49
+ res: Resolution of the grid along each dimension
50
+ bounds_lo: Position of the lower bound of the axis-aligned grid
51
+ bounds_hi: Position of the upper bound of the axis-aligned grid
52
+ """
53
+
54
+ if bounds_lo is None:
55
+ bounds_lo = wp.vec2(0.0)
56
+
57
+ if bounds_hi is None:
58
+ bounds_hi = wp.vec2(1.0)
59
+
60
+ self.bounds_lo = bounds_lo
61
+ self.bounds_hi = bounds_hi
62
+
63
+ self._res = res
64
+
65
+ @cached_property
66
+ def extents(self) -> wp.vec3:
67
+ # Avoid using native sub due to higher over of calling builtins from Python
68
+ return wp.vec2(
69
+ self.bounds_hi[0] - self.bounds_lo[0],
70
+ self.bounds_hi[1] - self.bounds_lo[1],
71
+ )
72
+
73
+ @cached_property
74
+ def cell_size(self) -> wp.vec2:
75
+ ex = self.extents
76
+ return wp.vec2(
77
+ ex[0] / self.res[0],
78
+ ex[1] / self.res[1],
79
+ )
80
+
81
+ def cell_count(self):
82
+ return self.res[0] * self.res[1]
83
+
84
+ def vertex_count(self):
85
+ return (self.res[0] + 1) * (self.res[1] + 1)
86
+
87
+ def side_count(self):
88
+ return 2 * self.cell_count() + self.res[0] + self.res[1]
89
+
90
+ def boundary_side_count(self):
91
+ return 2 * (self.res[0] + self.res[1])
92
+
93
+ def reference_cell(self) -> Element:
94
+ return Element.SQUARE
95
+
96
+ def reference_side(self) -> Element:
97
+ return Element.LINE_SEGMENT
98
+
99
+ @property
100
+ def res(self):
101
+ return self._res
102
+
103
+ @property
104
+ def origin(self):
105
+ return self.bounds_lo
106
+
107
+ @cached_property
108
+ def strides(self):
109
+ return wp.vec2i(self.res[1], 1)
110
+
111
+ # Utility device functions
112
+ CellArg = Grid2DCellArg
113
+ Cell = wp.vec2i
114
+
115
+ @wp.func
116
+ def _to_2d_index(x_stride: int, index: int):
117
+ x = index // x_stride
118
+ y = index - x_stride * x
119
+ return wp.vec2i(x, y)
120
+
121
+ @wp.func
122
+ def _from_2d_index(x_stride: int, index: wp.vec2i):
123
+ return x_stride * index[0] + index[1]
124
+
125
+ @wp.func
126
+ def cell_index(res: wp.vec2i, cell: Cell):
127
+ return Grid2D._from_2d_index(res[1], cell)
128
+
129
+ @wp.func
130
+ def get_cell(res: wp.vec2i, cell_index: ElementIndex):
131
+ return Grid2D._to_2d_index(res[1], cell_index)
132
+
133
+ @wp.struct
134
+ class Side:
135
+ axis: int # normal; 0: horizontal, 1: vertical
136
+ origin: wp.vec2i # index of vertex at corner (0,0)
137
+
138
+ @wp.struct
139
+ class SideArg:
140
+ cell_count: int
141
+ axis_offsets: wp.vec2i
142
+ cell_arg: Grid2DCellArg
143
+
144
+ SideIndexArg = SideArg
145
+
146
+ @wp.func
147
+ def orient(axis: int, vec: Any):
148
+ return wp.where(axis == 0, vec, type(vec)(vec[1], vec[0]))
149
+
150
+ @wp.func
151
+ def orient(axis: int, coord: int):
152
+ return wp.where(axis == 0, coord, 1 - coord)
153
+
154
+ @wp.func
155
+ def is_flipped(side: Side):
156
+ # Flip such that the boundary is CCW
157
+ return (side.axis == 0) == (side.origin[Grid2D.ALT_AXIS] == 0)
158
+
159
+ @wp.func
160
+ def side_index(arg: SideArg, side: Side):
161
+ alt_axis = Grid2D.orient(side.axis, 0)
162
+ if side.origin[0] == arg.cell_arg.res[alt_axis]:
163
+ # Upper-boundary side
164
+ longitude = side.origin[1]
165
+ return 2 * arg.cell_count + arg.axis_offsets[side.axis] + longitude
166
+
167
+ cell_index = Grid2D.cell_index(arg.cell_arg.res, Grid2D.orient(side.axis, side.origin))
168
+ return side.axis * arg.cell_count + cell_index
169
+
170
+ @wp.func
171
+ def get_side(arg: SideArg, side_index: ElementIndex):
172
+ if side_index < 2 * arg.cell_count:
173
+ axis = side_index // arg.cell_count
174
+ cell_index = side_index - axis * arg.cell_count
175
+ origin = Grid2D.orient(axis, Grid2D.get_cell(arg.cell_arg.res, cell_index))
176
+ return Grid2D.Side(axis, origin)
177
+
178
+ axis_side_index = side_index - 2 * arg.cell_count
179
+ axis = wp.where(axis_side_index < arg.axis_offsets[1], 0, 1)
180
+
181
+ altitude = arg.cell_arg.res[Grid2D.orient(axis, 0)]
182
+ longitude = axis_side_index - arg.axis_offsets[axis]
183
+
184
+ origin_loc = wp.vec2i(altitude, longitude)
185
+ return Grid2D.Side(axis, origin_loc)
186
+
187
+ # Geometry device interface
188
+
189
+ def fill_cell_arg(self, args: CellArg, device):
190
+ args.res = self.res
191
+ args.cell_size = self.cell_size
192
+ args.origin = self.bounds_lo
193
+
194
+ @wp.func
195
+ def cell_position(args: CellArg, s: Sample):
196
+ cell = Grid2D.get_cell(args.res, s.element_index)
197
+ return (
198
+ wp.vec2(
199
+ (float(cell[0]) + s.element_coords[0]) * args.cell_size[0],
200
+ (float(cell[1]) + s.element_coords[1]) * args.cell_size[1],
201
+ )
202
+ + args.origin
203
+ )
204
+
205
+ @wp.func
206
+ def cell_deformation_gradient(args: CellArg, s: Sample):
207
+ return wp.diag(args.cell_size)
208
+
209
+ @wp.func
210
+ def cell_inverse_deformation_gradient(args: CellArg, s: Sample):
211
+ return wp.diag(wp.cw_div(wp.vec2(1.0), args.cell_size))
212
+
213
+ @wp.func
214
+ def cell_coordinates(args: Grid2DCellArg, cell_index: int, pos: wp.vec2):
215
+ uvw = wp.cw_div(pos - args.origin, args.cell_size)
216
+ ij = Grid2D.get_cell(args.res, cell_index)
217
+ return Coords(uvw[0] - float(ij[0]), uvw[1] - float(ij[1]), 0.0)
218
+
219
+ @wp.func
220
+ def cell_closest_point(args: Grid2DCellArg, cell_index: int, pos: wp.vec2):
221
+ ij_world = wp.cw_mul(wp.vec2(Grid2D.get_cell(args.res, cell_index)), args.cell_size) + args.origin
222
+ dist_sq, coords = project_on_box_at_origin(pos - ij_world, args.cell_size)
223
+ return coords, dist_sq
224
+
225
+ def supports_cell_lookup(self, device):
226
+ return True
227
+
228
+ def make_filtered_cell_lookup(self, filter_func: wp.Function = None):
229
+ suffix = f"{self.name}{filter_func.key if filter_func is not None else ''}"
230
+
231
+ @dynamic_func(suffix=suffix)
232
+ def cell_lookup(args: self.CellArg, pos: wp.vec2, max_dist: float, filter_data: Any, filter_target: Any):
233
+ cell_size = args.cell_size
234
+ res = args.res
235
+
236
+ # Start at closest point on grid
237
+ loc_pos = wp.cw_div(pos - args.origin, cell_size)
238
+ x = wp.clamp(loc_pos[0], 0.0, float(res[0]))
239
+ y = wp.clamp(loc_pos[1], 0.0, float(res[1]))
240
+
241
+ x_cell = wp.min(wp.floor(x), float(res[0] - 1))
242
+ y_cell = wp.min(wp.floor(y), float(res[1] - 1))
243
+
244
+ coords = Coords(x - x_cell, y - y_cell, 0.0)
245
+ cell_index = Grid2D.cell_index(res, Grid2D.Cell(int(x_cell), int(y_cell)))
246
+
247
+ if wp.static(filter_func is None):
248
+ return make_free_sample(cell_index, coords)
249
+ else:
250
+ if filter_func(filter_data, cell_index) == filter_target:
251
+ return make_free_sample(cell_index, coords)
252
+
253
+ offset = float(0.5)
254
+ min_cell_size = wp.min(cell_size)
255
+ max_offset = wp.ceil(max_dist / min_cell_size)
256
+
257
+ scales = wp.cw_div(wp.vec2(min_cell_size), cell_size)
258
+
259
+ closest_cell = NULL_ELEMENT_INDEX
260
+ closest_coords = Coords()
261
+
262
+ # Iterate over increasingly larger neighborhoods
263
+ while closest_cell == NULL_ELEMENT_INDEX:
264
+ i_min = wp.max(0, int(wp.floor(x - offset * scales[0])))
265
+ i_max = wp.min(res[0], int(wp.floor(x + offset * scales[0])) + 1)
266
+ j_min = wp.max(0, int(wp.floor(y - offset * scales[1])))
267
+ j_max = wp.min(res[1], int(wp.floor(y + offset * scales[1])) + 1)
268
+
269
+ closest_dist = min_cell_size * min_cell_size * float(offset * offset)
270
+
271
+ for i in range(i_min, i_max):
272
+ for j in range(j_min, j_max):
273
+ ij = Grid2D.Cell(i, j)
274
+ cell_index = Grid2D.cell_index(res, ij)
275
+ if filter_func(filter_data, cell_index) == filter_target:
276
+ rel_pos = wp.cw_mul(loc_pos - wp.vec2(ij), cell_size)
277
+ dist, coords = project_on_box_at_origin(rel_pos, cell_size)
278
+
279
+ if dist <= closest_dist:
280
+ closest_dist = dist
281
+ closest_coords = coords
282
+ closest_cell = cell_index
283
+
284
+ if offset >= max_offset:
285
+ break
286
+ offset = wp.min(3.0 * offset, max_offset)
287
+
288
+ return make_free_sample(closest_cell, closest_coords)
289
+
290
+ return cell_lookup
291
+
292
+ @wp.func
293
+ def cell_measure(args: CellArg, s: Sample):
294
+ return args.cell_size[0] * args.cell_size[1]
295
+
296
+ @wp.func
297
+ def cell_normal(args: CellArg, s: Sample):
298
+ return wp.vec2(0.0)
299
+
300
+ @cached_arg_value
301
+ def side_arg_value(self, device) -> SideArg:
302
+ args = self.SideArg()
303
+ args.axis_offsets = wp.vec2i(
304
+ 0,
305
+ self.res[1],
306
+ )
307
+ args.cell_count = self.cell_count()
308
+ args.cell_arg = self.cell_arg_value(device)
309
+ return args
310
+
311
+ def side_index_arg_value(self, device) -> SideIndexArg:
312
+ return self.side_arg_value(device)
313
+
314
+ @wp.func
315
+ def boundary_side_index(args: SideArg, boundary_side_index: int):
316
+ """Boundary side to side index"""
317
+
318
+ axis_side_index = boundary_side_index // 2
319
+ border = boundary_side_index - 2 * axis_side_index
320
+
321
+ if axis_side_index < args.axis_offsets[1]:
322
+ axis = 0
323
+ else:
324
+ axis = 1
325
+
326
+ longitude = axis_side_index - args.axis_offsets[axis]
327
+ altitude = border * args.cell_arg.res[axis]
328
+
329
+ side = Grid2D.Side(axis, wp.vec2i(altitude, longitude))
330
+ return Grid2D.side_index(args, side)
331
+
332
+ @wp.func
333
+ def side_position(args: SideArg, s: Sample):
334
+ side = Grid2D.get_side(args, s.element_index)
335
+
336
+ flip = Grid2D.is_flipped(side)
337
+ coord = wp.where(flip, 1.0 - s.element_coords[0], s.element_coords[0])
338
+
339
+ local_pos = wp.vec2(side.origin) + wp.vec2(0.0, coord)
340
+ pos = args.cell_arg.origin + wp.cw_mul(Grid2D.orient(side.axis, local_pos), args.cell_arg.cell_size)
341
+
342
+ return pos
343
+
344
+ @wp.func
345
+ def side_deformation_gradient(args: SideArg, s: Sample):
346
+ side = Grid2D.get_side(args, s.element_index)
347
+
348
+ flip = Grid2D.is_flipped(side)
349
+ sign = wp.where(flip, -1.0, 1.0)
350
+
351
+ return wp.cw_mul(Grid2D.orient(side.axis, wp.vec2(0.0, sign)), args.cell_arg.cell_size)
352
+
353
+ @wp.func
354
+ def side_inner_inverse_deformation_gradient(args: SideArg, s: Sample):
355
+ return Grid2D.cell_inverse_deformation_gradient(args.cell_arg, s)
356
+
357
+ @wp.func
358
+ def side_outer_inverse_deformation_gradient(args: SideArg, s: Sample):
359
+ return Grid2D.cell_inverse_deformation_gradient(args.cell_arg, s)
360
+
361
+ @wp.func
362
+ def side_measure(args: SideArg, s: Sample):
363
+ side = Grid2D.get_side(args, s.element_index)
364
+ long_axis = Grid2D.orient(side.axis, Grid2D.LONG_AXIS)
365
+ return args.cell_arg.cell_size[long_axis]
366
+
367
+ @wp.func
368
+ def side_measure_ratio(args: SideArg, s: Sample):
369
+ side = Grid2D.get_side(args, s.element_index)
370
+ alt_axis = Grid2D.orient(side.axis, Grid2D.ALT_AXIS)
371
+ return 1.0 / args.cell_arg.cell_size[alt_axis]
372
+
373
+ @wp.func
374
+ def side_normal(args: SideArg, s: Sample):
375
+ side = Grid2D.get_side(args, s.element_index)
376
+
377
+ # intentionally not using is_flipped to account for normql sign switch with orient(axis=1)
378
+ flip = side.origin[Grid2D.ALT_AXIS] == 0
379
+ sign = wp.where(flip, -1.0, 1.0)
380
+
381
+ local_n = wp.vec2(sign, 0.0)
382
+ return Grid2D.orient(side.axis, local_n)
383
+
384
+ @wp.func
385
+ def side_inner_cell_index(arg: SideArg, side_index: ElementIndex):
386
+ side = Grid2D.get_side(arg, side_index)
387
+
388
+ inner_alt = wp.where(side.origin[Grid2D.ALT_AXIS] == 0, 0, side.origin[Grid2D.ALT_AXIS] - 1)
389
+
390
+ inner_origin = wp.vec2i(inner_alt, side.origin[1])
391
+
392
+ cell = Grid2D.orient(side.axis, inner_origin)
393
+ return Grid2D.cell_index(arg.cell_arg.res, cell)
394
+
395
+ @wp.func
396
+ def side_outer_cell_index(arg: SideArg, side_index: ElementIndex):
397
+ side = Grid2D.get_side(arg, side_index)
398
+
399
+ alt_axis = Grid2D.orient(side.axis, 0)
400
+ outer_alt = wp.where(
401
+ side.origin[Grid2D.ALT_AXIS] == arg.cell_arg.res[alt_axis], arg.cell_arg.res[alt_axis] - 1, side.origin[0]
402
+ )
403
+
404
+ outer_origin = wp.vec2i(outer_alt, side.origin[Grid2D.LONG_AXIS])
405
+
406
+ cell = Grid2D.orient(side.axis, outer_origin)
407
+ return Grid2D.cell_index(arg.cell_arg.res, cell)
408
+
409
+ @wp.func
410
+ def side_inner_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
411
+ side = Grid2D.get_side(args, side_index)
412
+
413
+ inner_alt = wp.where(side.origin[Grid2D.ALT_AXIS] == 0, 0.0, 1.0)
414
+
415
+ flip = Grid2D.is_flipped(side)
416
+ side_coord = wp.where(flip, 1.0 - side_coords[0], side_coords[0])
417
+
418
+ coords = Grid2D.orient(side.axis, wp.vec2(inner_alt, side_coord))
419
+ return Coords(coords[0], coords[1], 0.0)
420
+
421
+ @wp.func
422
+ def side_outer_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
423
+ side = Grid2D.get_side(args, side_index)
424
+
425
+ alt_axis = Grid2D.orient(side.axis, Grid2D.ALT_AXIS)
426
+ outer_alt = wp.where(side.origin[Grid2D.ALT_AXIS] == args.cell_arg.res[alt_axis], 1.0, 0.0)
427
+
428
+ flip = Grid2D.is_flipped(side)
429
+ side_coord = wp.where(flip, 1.0 - side_coords[0], side_coords[0])
430
+
431
+ coords = Grid2D.orient(side.axis, wp.vec2(outer_alt, side_coord))
432
+ return Coords(coords[0], coords[1], 0.0)
433
+
434
+ @wp.func
435
+ def side_from_cell_coords(
436
+ args: SideArg,
437
+ side_index: ElementIndex,
438
+ element_index: ElementIndex,
439
+ element_coords: Coords,
440
+ ):
441
+ side = Grid2D.get_side(args, side_index)
442
+ cell = Grid2D.get_cell(args.cell_arg.res, element_index)
443
+
444
+ if float(side.origin[Grid2D.ALT_AXIS] - cell[side.axis]) == element_coords[side.axis]:
445
+ long_axis = Grid2D.orient(side.axis, Grid2D.LONG_AXIS)
446
+ axis_coord = element_coords[long_axis]
447
+ flip = Grid2D.is_flipped(side)
448
+ side_coord = wp.where(flip, 1.0 - axis_coord, axis_coord)
449
+ return Coords(side_coord, 0.0, 0.0)
450
+
451
+ return Coords(OUTSIDE)
452
+
453
+ @wp.func
454
+ def side_to_cell_arg(side_arg: SideArg):
455
+ return side_arg.cell_arg
456
+
457
+ @wp.func
458
+ def side_coordinates(args: SideArg, side_index: int, pos: wp.vec2):
459
+ cell_arg = args.cell_arg
460
+ side = Grid2D.get_side(args, side_index)
461
+ long_axis = Grid2D.orient(side.axis, Grid2D.LONG_AXIS)
462
+ flip = Grid2D.is_flipped(side)
463
+
464
+ long_loc = (pos[long_axis] - cell_arg.origin[long_axis]) / cell_arg.cell_size[long_axis] - float(side.origin[1])
465
+ coord = wp.where(flip, 1.0 - long_loc, long_loc)
466
+
467
+ return Coords(coord, 0.0, 0.0)
468
+
469
+ @wp.func
470
+ def side_closest_point(args: SideArg, side_index: int, pos: wp.vec2):
471
+ coord = Grid2D.side_coordinates(args, side_index, pos)
472
+
473
+ cell_arg = args.cell_arg
474
+ side = Grid2D.get_side(args, side_index)
475
+ long_axis = Grid2D.orient(side.axis, Grid2D.LONG_AXIS)
476
+ proj_coord = wp.clamp(coord, 0.0, 1.0)
477
+ dist = (coord - proj_coord) * cell_arg.cell_size[long_axis]
478
+ return Coords(proj_coord, 0.0, 0.0), dist * dist