warp-lang 1.7.0__py3-none-manylinux_2_28_x86_64.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 (429) hide show
  1. warp/__init__.py +139 -0
  2. warp/__init__.pyi +1 -0
  3. warp/autograd.py +1142 -0
  4. warp/bin/warp-clang.so +0 -0
  5. warp/bin/warp.so +0 -0
  6. warp/build.py +557 -0
  7. warp/build_dll.py +405 -0
  8. warp/builtins.py +6855 -0
  9. warp/codegen.py +3969 -0
  10. warp/config.py +158 -0
  11. warp/constants.py +57 -0
  12. warp/context.py +6812 -0
  13. warp/dlpack.py +462 -0
  14. warp/examples/__init__.py +24 -0
  15. warp/examples/assets/bear.usd +0 -0
  16. warp/examples/assets/bunny.usd +0 -0
  17. warp/examples/assets/cartpole.urdf +110 -0
  18. warp/examples/assets/crazyflie.usd +0 -0
  19. warp/examples/assets/cube.usd +0 -0
  20. warp/examples/assets/nonuniform.usd +0 -0
  21. warp/examples/assets/nv_ant.xml +92 -0
  22. warp/examples/assets/nv_humanoid.xml +183 -0
  23. warp/examples/assets/nvidia_logo.png +0 -0
  24. warp/examples/assets/pixel.jpg +0 -0
  25. warp/examples/assets/quadruped.urdf +268 -0
  26. warp/examples/assets/rocks.nvdb +0 -0
  27. warp/examples/assets/rocks.usd +0 -0
  28. warp/examples/assets/sphere.usd +0 -0
  29. warp/examples/assets/square_cloth.usd +0 -0
  30. warp/examples/benchmarks/benchmark_api.py +389 -0
  31. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  32. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  33. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  34. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  35. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  36. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  37. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  38. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  39. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  40. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  41. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  42. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  43. warp/examples/benchmarks/benchmark_launches.py +301 -0
  44. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  45. warp/examples/browse.py +37 -0
  46. warp/examples/core/example_cupy.py +86 -0
  47. warp/examples/core/example_dem.py +241 -0
  48. warp/examples/core/example_fluid.py +299 -0
  49. warp/examples/core/example_graph_capture.py +150 -0
  50. warp/examples/core/example_marching_cubes.py +194 -0
  51. warp/examples/core/example_mesh.py +180 -0
  52. warp/examples/core/example_mesh_intersect.py +211 -0
  53. warp/examples/core/example_nvdb.py +182 -0
  54. warp/examples/core/example_raycast.py +111 -0
  55. warp/examples/core/example_raymarch.py +205 -0
  56. warp/examples/core/example_render_opengl.py +193 -0
  57. warp/examples/core/example_sample_mesh.py +300 -0
  58. warp/examples/core/example_sph.py +411 -0
  59. warp/examples/core/example_torch.py +211 -0
  60. warp/examples/core/example_wave.py +269 -0
  61. warp/examples/fem/example_adaptive_grid.py +286 -0
  62. warp/examples/fem/example_apic_fluid.py +423 -0
  63. warp/examples/fem/example_burgers.py +261 -0
  64. warp/examples/fem/example_convection_diffusion.py +178 -0
  65. warp/examples/fem/example_convection_diffusion_dg.py +204 -0
  66. warp/examples/fem/example_deformed_geometry.py +172 -0
  67. warp/examples/fem/example_diffusion.py +196 -0
  68. warp/examples/fem/example_diffusion_3d.py +225 -0
  69. warp/examples/fem/example_diffusion_mgpu.py +220 -0
  70. warp/examples/fem/example_distortion_energy.py +228 -0
  71. warp/examples/fem/example_magnetostatics.py +240 -0
  72. warp/examples/fem/example_mixed_elasticity.py +291 -0
  73. warp/examples/fem/example_navier_stokes.py +261 -0
  74. warp/examples/fem/example_nonconforming_contact.py +298 -0
  75. warp/examples/fem/example_stokes.py +213 -0
  76. warp/examples/fem/example_stokes_transfer.py +262 -0
  77. warp/examples/fem/example_streamlines.py +352 -0
  78. warp/examples/fem/utils.py +1000 -0
  79. warp/examples/interop/example_jax_callable.py +116 -0
  80. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  81. warp/examples/interop/example_jax_kernel.py +205 -0
  82. warp/examples/optim/example_bounce.py +266 -0
  83. warp/examples/optim/example_cloth_throw.py +228 -0
  84. warp/examples/optim/example_diffray.py +561 -0
  85. warp/examples/optim/example_drone.py +870 -0
  86. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  87. warp/examples/optim/example_inverse_kinematics.py +182 -0
  88. warp/examples/optim/example_inverse_kinematics_torch.py +191 -0
  89. warp/examples/optim/example_softbody_properties.py +400 -0
  90. warp/examples/optim/example_spring_cage.py +245 -0
  91. warp/examples/optim/example_trajectory.py +227 -0
  92. warp/examples/sim/example_cartpole.py +143 -0
  93. warp/examples/sim/example_cloth.py +225 -0
  94. warp/examples/sim/example_cloth_self_contact.py +322 -0
  95. warp/examples/sim/example_granular.py +130 -0
  96. warp/examples/sim/example_granular_collision_sdf.py +202 -0
  97. warp/examples/sim/example_jacobian_ik.py +244 -0
  98. warp/examples/sim/example_particle_chain.py +124 -0
  99. warp/examples/sim/example_quadruped.py +203 -0
  100. warp/examples/sim/example_rigid_chain.py +203 -0
  101. warp/examples/sim/example_rigid_contact.py +195 -0
  102. warp/examples/sim/example_rigid_force.py +133 -0
  103. warp/examples/sim/example_rigid_gyroscopic.py +115 -0
  104. warp/examples/sim/example_rigid_soft_contact.py +140 -0
  105. warp/examples/sim/example_soft_body.py +196 -0
  106. warp/examples/tile/example_tile_cholesky.py +87 -0
  107. warp/examples/tile/example_tile_convolution.py +66 -0
  108. warp/examples/tile/example_tile_fft.py +55 -0
  109. warp/examples/tile/example_tile_filtering.py +113 -0
  110. warp/examples/tile/example_tile_matmul.py +85 -0
  111. warp/examples/tile/example_tile_mlp.py +383 -0
  112. warp/examples/tile/example_tile_nbody.py +199 -0
  113. warp/examples/tile/example_tile_walker.py +327 -0
  114. warp/fabric.py +355 -0
  115. warp/fem/__init__.py +106 -0
  116. warp/fem/adaptivity.py +508 -0
  117. warp/fem/cache.py +572 -0
  118. warp/fem/dirichlet.py +202 -0
  119. warp/fem/domain.py +411 -0
  120. warp/fem/field/__init__.py +125 -0
  121. warp/fem/field/field.py +619 -0
  122. warp/fem/field/nodal_field.py +326 -0
  123. warp/fem/field/restriction.py +37 -0
  124. warp/fem/field/virtual.py +848 -0
  125. warp/fem/geometry/__init__.py +32 -0
  126. warp/fem/geometry/adaptive_nanogrid.py +857 -0
  127. warp/fem/geometry/closest_point.py +84 -0
  128. warp/fem/geometry/deformed_geometry.py +221 -0
  129. warp/fem/geometry/element.py +776 -0
  130. warp/fem/geometry/geometry.py +362 -0
  131. warp/fem/geometry/grid_2d.py +392 -0
  132. warp/fem/geometry/grid_3d.py +452 -0
  133. warp/fem/geometry/hexmesh.py +911 -0
  134. warp/fem/geometry/nanogrid.py +571 -0
  135. warp/fem/geometry/partition.py +389 -0
  136. warp/fem/geometry/quadmesh.py +663 -0
  137. warp/fem/geometry/tetmesh.py +855 -0
  138. warp/fem/geometry/trimesh.py +806 -0
  139. warp/fem/integrate.py +2335 -0
  140. warp/fem/linalg.py +419 -0
  141. warp/fem/operator.py +293 -0
  142. warp/fem/polynomial.py +229 -0
  143. warp/fem/quadrature/__init__.py +17 -0
  144. warp/fem/quadrature/pic_quadrature.py +299 -0
  145. warp/fem/quadrature/quadrature.py +591 -0
  146. warp/fem/space/__init__.py +228 -0
  147. warp/fem/space/basis_function_space.py +468 -0
  148. warp/fem/space/basis_space.py +667 -0
  149. warp/fem/space/dof_mapper.py +251 -0
  150. warp/fem/space/function_space.py +309 -0
  151. warp/fem/space/grid_2d_function_space.py +177 -0
  152. warp/fem/space/grid_3d_function_space.py +227 -0
  153. warp/fem/space/hexmesh_function_space.py +257 -0
  154. warp/fem/space/nanogrid_function_space.py +201 -0
  155. warp/fem/space/partition.py +367 -0
  156. warp/fem/space/quadmesh_function_space.py +223 -0
  157. warp/fem/space/restriction.py +179 -0
  158. warp/fem/space/shape/__init__.py +143 -0
  159. warp/fem/space/shape/cube_shape_function.py +1105 -0
  160. warp/fem/space/shape/shape_function.py +133 -0
  161. warp/fem/space/shape/square_shape_function.py +926 -0
  162. warp/fem/space/shape/tet_shape_function.py +834 -0
  163. warp/fem/space/shape/triangle_shape_function.py +672 -0
  164. warp/fem/space/tetmesh_function_space.py +271 -0
  165. warp/fem/space/topology.py +424 -0
  166. warp/fem/space/trimesh_function_space.py +194 -0
  167. warp/fem/types.py +99 -0
  168. warp/fem/utils.py +420 -0
  169. warp/jax.py +187 -0
  170. warp/jax_experimental/__init__.py +16 -0
  171. warp/jax_experimental/custom_call.py +351 -0
  172. warp/jax_experimental/ffi.py +698 -0
  173. warp/jax_experimental/xla_ffi.py +602 -0
  174. warp/math.py +244 -0
  175. warp/native/array.h +1145 -0
  176. warp/native/builtin.h +1800 -0
  177. warp/native/bvh.cpp +492 -0
  178. warp/native/bvh.cu +791 -0
  179. warp/native/bvh.h +554 -0
  180. warp/native/clang/clang.cpp +536 -0
  181. warp/native/coloring.cpp +613 -0
  182. warp/native/crt.cpp +51 -0
  183. warp/native/crt.h +362 -0
  184. warp/native/cuda_crt.h +1058 -0
  185. warp/native/cuda_util.cpp +646 -0
  186. warp/native/cuda_util.h +307 -0
  187. warp/native/error.cpp +77 -0
  188. warp/native/error.h +36 -0
  189. warp/native/exports.h +1878 -0
  190. warp/native/fabric.h +245 -0
  191. warp/native/hashgrid.cpp +311 -0
  192. warp/native/hashgrid.cu +87 -0
  193. warp/native/hashgrid.h +240 -0
  194. warp/native/initializer_array.h +41 -0
  195. warp/native/intersect.h +1230 -0
  196. warp/native/intersect_adj.h +375 -0
  197. warp/native/intersect_tri.h +339 -0
  198. warp/native/marching.cpp +19 -0
  199. warp/native/marching.cu +514 -0
  200. warp/native/marching.h +19 -0
  201. warp/native/mat.h +2220 -0
  202. warp/native/mathdx.cpp +87 -0
  203. warp/native/matnn.h +343 -0
  204. warp/native/mesh.cpp +266 -0
  205. warp/native/mesh.cu +404 -0
  206. warp/native/mesh.h +1980 -0
  207. warp/native/nanovdb/GridHandle.h +366 -0
  208. warp/native/nanovdb/HostBuffer.h +590 -0
  209. warp/native/nanovdb/NanoVDB.h +6624 -0
  210. warp/native/nanovdb/PNanoVDB.h +3390 -0
  211. warp/native/noise.h +859 -0
  212. warp/native/quat.h +1371 -0
  213. warp/native/rand.h +342 -0
  214. warp/native/range.h +139 -0
  215. warp/native/reduce.cpp +174 -0
  216. warp/native/reduce.cu +364 -0
  217. warp/native/runlength_encode.cpp +79 -0
  218. warp/native/runlength_encode.cu +61 -0
  219. warp/native/scan.cpp +47 -0
  220. warp/native/scan.cu +53 -0
  221. warp/native/scan.h +23 -0
  222. warp/native/solid_angle.h +466 -0
  223. warp/native/sort.cpp +251 -0
  224. warp/native/sort.cu +277 -0
  225. warp/native/sort.h +33 -0
  226. warp/native/sparse.cpp +378 -0
  227. warp/native/sparse.cu +524 -0
  228. warp/native/spatial.h +657 -0
  229. warp/native/svd.h +702 -0
  230. warp/native/temp_buffer.h +46 -0
  231. warp/native/tile.h +2584 -0
  232. warp/native/tile_reduce.h +264 -0
  233. warp/native/vec.h +1426 -0
  234. warp/native/volume.cpp +501 -0
  235. warp/native/volume.cu +67 -0
  236. warp/native/volume.h +969 -0
  237. warp/native/volume_builder.cu +477 -0
  238. warp/native/volume_builder.h +52 -0
  239. warp/native/volume_impl.h +70 -0
  240. warp/native/warp.cpp +1082 -0
  241. warp/native/warp.cu +3636 -0
  242. warp/native/warp.h +381 -0
  243. warp/optim/__init__.py +17 -0
  244. warp/optim/adam.py +163 -0
  245. warp/optim/linear.py +1137 -0
  246. warp/optim/sgd.py +112 -0
  247. warp/paddle.py +407 -0
  248. warp/render/__init__.py +18 -0
  249. warp/render/render_opengl.py +3518 -0
  250. warp/render/render_usd.py +784 -0
  251. warp/render/utils.py +160 -0
  252. warp/sim/__init__.py +65 -0
  253. warp/sim/articulation.py +793 -0
  254. warp/sim/collide.py +2395 -0
  255. warp/sim/graph_coloring.py +300 -0
  256. warp/sim/import_mjcf.py +790 -0
  257. warp/sim/import_snu.py +227 -0
  258. warp/sim/import_urdf.py +579 -0
  259. warp/sim/import_usd.py +894 -0
  260. warp/sim/inertia.py +324 -0
  261. warp/sim/integrator.py +242 -0
  262. warp/sim/integrator_euler.py +1997 -0
  263. warp/sim/integrator_featherstone.py +2101 -0
  264. warp/sim/integrator_vbd.py +2048 -0
  265. warp/sim/integrator_xpbd.py +3292 -0
  266. warp/sim/model.py +4791 -0
  267. warp/sim/particles.py +121 -0
  268. warp/sim/render.py +427 -0
  269. warp/sim/utils.py +428 -0
  270. warp/sparse.py +2057 -0
  271. warp/stubs.py +3333 -0
  272. warp/tape.py +1203 -0
  273. warp/tests/__init__.py +1 -0
  274. warp/tests/__main__.py +4 -0
  275. warp/tests/assets/curlnoise_golden.npy +0 -0
  276. warp/tests/assets/mlp_golden.npy +0 -0
  277. warp/tests/assets/pixel.npy +0 -0
  278. warp/tests/assets/pnoise_golden.npy +0 -0
  279. warp/tests/assets/spiky.usd +0 -0
  280. warp/tests/assets/test_grid.nvdb +0 -0
  281. warp/tests/assets/test_index_grid.nvdb +0 -0
  282. warp/tests/assets/test_int32_grid.nvdb +0 -0
  283. warp/tests/assets/test_vec_grid.nvdb +0 -0
  284. warp/tests/assets/torus.nvdb +0 -0
  285. warp/tests/assets/torus.usda +105 -0
  286. warp/tests/aux_test_class_kernel.py +34 -0
  287. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  288. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  289. warp/tests/aux_test_dependent.py +29 -0
  290. warp/tests/aux_test_grad_customs.py +29 -0
  291. warp/tests/aux_test_instancing_gc.py +26 -0
  292. warp/tests/aux_test_module_unload.py +23 -0
  293. warp/tests/aux_test_name_clash1.py +40 -0
  294. warp/tests/aux_test_name_clash2.py +40 -0
  295. warp/tests/aux_test_reference.py +9 -0
  296. warp/tests/aux_test_reference_reference.py +8 -0
  297. warp/tests/aux_test_square.py +16 -0
  298. warp/tests/aux_test_unresolved_func.py +22 -0
  299. warp/tests/aux_test_unresolved_symbol.py +22 -0
  300. warp/tests/cuda/__init__.py +0 -0
  301. warp/tests/cuda/test_async.py +676 -0
  302. warp/tests/cuda/test_ipc.py +124 -0
  303. warp/tests/cuda/test_mempool.py +233 -0
  304. warp/tests/cuda/test_multigpu.py +169 -0
  305. warp/tests/cuda/test_peer.py +139 -0
  306. warp/tests/cuda/test_pinned.py +84 -0
  307. warp/tests/cuda/test_streams.py +634 -0
  308. warp/tests/geometry/__init__.py +0 -0
  309. warp/tests/geometry/test_bvh.py +200 -0
  310. warp/tests/geometry/test_hash_grid.py +221 -0
  311. warp/tests/geometry/test_marching_cubes.py +74 -0
  312. warp/tests/geometry/test_mesh.py +316 -0
  313. warp/tests/geometry/test_mesh_query_aabb.py +399 -0
  314. warp/tests/geometry/test_mesh_query_point.py +932 -0
  315. warp/tests/geometry/test_mesh_query_ray.py +311 -0
  316. warp/tests/geometry/test_volume.py +1103 -0
  317. warp/tests/geometry/test_volume_write.py +346 -0
  318. warp/tests/interop/__init__.py +0 -0
  319. warp/tests/interop/test_dlpack.py +729 -0
  320. warp/tests/interop/test_jax.py +371 -0
  321. warp/tests/interop/test_paddle.py +800 -0
  322. warp/tests/interop/test_torch.py +1001 -0
  323. warp/tests/run_coverage_serial.py +39 -0
  324. warp/tests/sim/__init__.py +0 -0
  325. warp/tests/sim/disabled_kinematics.py +244 -0
  326. warp/tests/sim/flaky_test_sim_grad.py +290 -0
  327. warp/tests/sim/test_collision.py +604 -0
  328. warp/tests/sim/test_coloring.py +258 -0
  329. warp/tests/sim/test_model.py +224 -0
  330. warp/tests/sim/test_sim_grad_bounce_linear.py +212 -0
  331. warp/tests/sim/test_sim_kinematics.py +98 -0
  332. warp/tests/sim/test_vbd.py +597 -0
  333. warp/tests/test_adam.py +163 -0
  334. warp/tests/test_arithmetic.py +1096 -0
  335. warp/tests/test_array.py +2972 -0
  336. warp/tests/test_array_reduce.py +156 -0
  337. warp/tests/test_assert.py +250 -0
  338. warp/tests/test_atomic.py +153 -0
  339. warp/tests/test_bool.py +220 -0
  340. warp/tests/test_builtins_resolution.py +1298 -0
  341. warp/tests/test_closest_point_edge_edge.py +327 -0
  342. warp/tests/test_codegen.py +810 -0
  343. warp/tests/test_codegen_instancing.py +1495 -0
  344. warp/tests/test_compile_consts.py +215 -0
  345. warp/tests/test_conditional.py +252 -0
  346. warp/tests/test_context.py +42 -0
  347. warp/tests/test_copy.py +238 -0
  348. warp/tests/test_ctypes.py +638 -0
  349. warp/tests/test_dense.py +73 -0
  350. warp/tests/test_devices.py +97 -0
  351. warp/tests/test_examples.py +482 -0
  352. warp/tests/test_fabricarray.py +996 -0
  353. warp/tests/test_fast_math.py +74 -0
  354. warp/tests/test_fem.py +2003 -0
  355. warp/tests/test_fp16.py +136 -0
  356. warp/tests/test_func.py +454 -0
  357. warp/tests/test_future_annotations.py +98 -0
  358. warp/tests/test_generics.py +656 -0
  359. warp/tests/test_grad.py +893 -0
  360. warp/tests/test_grad_customs.py +339 -0
  361. warp/tests/test_grad_debug.py +341 -0
  362. warp/tests/test_implicit_init.py +411 -0
  363. warp/tests/test_import.py +45 -0
  364. warp/tests/test_indexedarray.py +1140 -0
  365. warp/tests/test_intersect.py +73 -0
  366. warp/tests/test_iter.py +76 -0
  367. warp/tests/test_large.py +177 -0
  368. warp/tests/test_launch.py +411 -0
  369. warp/tests/test_lerp.py +151 -0
  370. warp/tests/test_linear_solvers.py +193 -0
  371. warp/tests/test_lvalue.py +427 -0
  372. warp/tests/test_mat.py +2089 -0
  373. warp/tests/test_mat_lite.py +122 -0
  374. warp/tests/test_mat_scalar_ops.py +2913 -0
  375. warp/tests/test_math.py +178 -0
  376. warp/tests/test_mlp.py +282 -0
  377. warp/tests/test_module_hashing.py +258 -0
  378. warp/tests/test_modules_lite.py +44 -0
  379. warp/tests/test_noise.py +252 -0
  380. warp/tests/test_operators.py +299 -0
  381. warp/tests/test_options.py +129 -0
  382. warp/tests/test_overwrite.py +551 -0
  383. warp/tests/test_print.py +339 -0
  384. warp/tests/test_quat.py +2315 -0
  385. warp/tests/test_rand.py +339 -0
  386. warp/tests/test_reload.py +302 -0
  387. warp/tests/test_rounding.py +185 -0
  388. warp/tests/test_runlength_encode.py +196 -0
  389. warp/tests/test_scalar_ops.py +105 -0
  390. warp/tests/test_smoothstep.py +108 -0
  391. warp/tests/test_snippet.py +318 -0
  392. warp/tests/test_sparse.py +582 -0
  393. warp/tests/test_spatial.py +2229 -0
  394. warp/tests/test_special_values.py +361 -0
  395. warp/tests/test_static.py +592 -0
  396. warp/tests/test_struct.py +734 -0
  397. warp/tests/test_tape.py +204 -0
  398. warp/tests/test_transient_module.py +93 -0
  399. warp/tests/test_triangle_closest_point.py +145 -0
  400. warp/tests/test_types.py +562 -0
  401. warp/tests/test_utils.py +588 -0
  402. warp/tests/test_vec.py +1487 -0
  403. warp/tests/test_vec_lite.py +80 -0
  404. warp/tests/test_vec_scalar_ops.py +2327 -0
  405. warp/tests/test_verify_fp.py +100 -0
  406. warp/tests/tile/__init__.py +0 -0
  407. warp/tests/tile/test_tile.py +780 -0
  408. warp/tests/tile/test_tile_load.py +407 -0
  409. warp/tests/tile/test_tile_mathdx.py +208 -0
  410. warp/tests/tile/test_tile_mlp.py +402 -0
  411. warp/tests/tile/test_tile_reduce.py +447 -0
  412. warp/tests/tile/test_tile_shared_memory.py +247 -0
  413. warp/tests/tile/test_tile_view.py +173 -0
  414. warp/tests/unittest_serial.py +47 -0
  415. warp/tests/unittest_suites.py +427 -0
  416. warp/tests/unittest_utils.py +468 -0
  417. warp/tests/walkthrough_debug.py +93 -0
  418. warp/thirdparty/__init__.py +0 -0
  419. warp/thirdparty/appdirs.py +598 -0
  420. warp/thirdparty/dlpack.py +145 -0
  421. warp/thirdparty/unittest_parallel.py +570 -0
  422. warp/torch.py +391 -0
  423. warp/types.py +5230 -0
  424. warp/utils.py +1137 -0
  425. warp_lang-1.7.0.dist-info/METADATA +516 -0
  426. warp_lang-1.7.0.dist-info/RECORD +429 -0
  427. warp_lang-1.7.0.dist-info/WHEEL +5 -0
  428. warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
  429. warp_lang-1.7.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,452 @@
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 typing import Any, Optional
17
+
18
+ import warp as wp
19
+ from warp.fem.cache import cached_arg_value
20
+ from warp.fem.types import OUTSIDE, Coords, ElementIndex, Sample, make_free_sample
21
+
22
+ from .element import Cube, Square
23
+ from .geometry import Geometry
24
+
25
+
26
+ @wp.struct
27
+ class Grid3DCellArg:
28
+ res: wp.vec3i
29
+ cell_size: wp.vec3
30
+ origin: wp.vec3
31
+
32
+
33
+ class Grid3D(Geometry):
34
+ """Three-dimensional regular grid geometry"""
35
+
36
+ dimension = 3
37
+
38
+ def __init__(self, res: wp.vec3i, bounds_lo: Optional[wp.vec3] = None, bounds_hi: Optional[wp.vec3] = None):
39
+ """Constructs a dense 3D grid
40
+
41
+ Args:
42
+ res: Resolution of the grid along each dimension
43
+ bounds_lo: Position of the lower bound of the axis-aligned grid
44
+ bounds_hi: Position of the upper bound of the axis-aligned grid
45
+ """
46
+
47
+ if bounds_lo is None:
48
+ bounds_lo = wp.vec3(0.0)
49
+
50
+ if bounds_hi is None:
51
+ bounds_hi = wp.vec3(1.0)
52
+
53
+ self.bounds_lo = bounds_lo
54
+ self.bounds_hi = bounds_hi
55
+
56
+ self._res = res
57
+
58
+ @property
59
+ def extents(self) -> wp.vec3:
60
+ # Avoid using native sub due to higher over of calling builtins from Python
61
+ return wp.vec3(
62
+ self.bounds_hi[0] - self.bounds_lo[0],
63
+ self.bounds_hi[1] - self.bounds_lo[1],
64
+ self.bounds_hi[2] - self.bounds_lo[2],
65
+ )
66
+
67
+ @property
68
+ def cell_size(self) -> wp.vec3:
69
+ ex = self.extents
70
+ return wp.vec3(
71
+ ex[0] / self.res[0],
72
+ ex[1] / self.res[1],
73
+ ex[2] / self.res[2],
74
+ )
75
+
76
+ def cell_count(self):
77
+ return self.res[0] * self.res[1] * self.res[2]
78
+
79
+ def vertex_count(self):
80
+ return (self.res[0] + 1) * (self.res[1] + 1) * (self.res[2] + 1)
81
+
82
+ def side_count(self):
83
+ return (
84
+ (self.res[0] + 1) * (self.res[1]) * (self.res[2])
85
+ + (self.res[0]) * (self.res[1] + 1) * (self.res[2])
86
+ + (self.res[0]) * (self.res[1]) * (self.res[2] + 1)
87
+ )
88
+
89
+ def edge_count(self):
90
+ return (
91
+ (self.res[0] + 1) * (self.res[1] + 1) * (self.res[2])
92
+ + (self.res[0]) * (self.res[1] + 1) * (self.res[2] + 1)
93
+ + (self.res[0] + 1) * (self.res[1]) * (self.res[2] + 1)
94
+ )
95
+
96
+ def boundary_side_count(self):
97
+ return 2 * (self.res[1]) * (self.res[2]) + (self.res[0]) * 2 * (self.res[2]) + (self.res[0]) * (self.res[1]) * 2
98
+
99
+ def reference_cell(self) -> Cube:
100
+ return Cube()
101
+
102
+ def reference_side(self) -> Square:
103
+ return Square()
104
+
105
+ @property
106
+ def res(self):
107
+ return self._res
108
+
109
+ @property
110
+ def origin(self):
111
+ return self.bounds_lo
112
+
113
+ @property
114
+ def strides(self):
115
+ return wp.vec3i(self.res[1] * self.res[2], self.res[2], 1)
116
+
117
+ # Utility device functions
118
+
119
+ CellArg = Grid3DCellArg
120
+ Cell = wp.vec3i
121
+
122
+ @wp.func
123
+ def _to_3d_index(strides: wp.vec2i, index: int):
124
+ x = index // strides[0]
125
+ y = (index - strides[0] * x) // strides[1]
126
+ z = index - strides[0] * x - strides[1] * y
127
+ return wp.vec3i(x, y, z)
128
+
129
+ @wp.func
130
+ def _from_3d_index(strides: wp.vec2i, index: wp.vec3i):
131
+ return strides[0] * index[0] + strides[1] * index[1] + index[2]
132
+
133
+ @wp.func
134
+ def cell_index(res: wp.vec3i, cell: Cell):
135
+ strides = wp.vec2i(res[1] * res[2], res[2])
136
+ return Grid3D._from_3d_index(strides, cell)
137
+
138
+ @wp.func
139
+ def get_cell(res: wp.vec3i, cell_index: ElementIndex):
140
+ strides = wp.vec2i(res[1] * res[2], res[2])
141
+ return Grid3D._to_3d_index(strides, cell_index)
142
+
143
+ @wp.struct
144
+ class Side:
145
+ axis: int # normal
146
+ origin: wp.vec3i # index of vertex at corner (0,0,0)
147
+
148
+ @wp.struct
149
+ class SideArg:
150
+ cell_count: int
151
+ axis_offsets: wp.vec3i
152
+ cell_arg: Grid3DCellArg
153
+
154
+ SideIndexArg = SideArg
155
+
156
+ @wp.func
157
+ def _world_to_local(axis: int, vec: Any):
158
+ return type(vec)(
159
+ vec[axis],
160
+ vec[(axis + 1) % 3],
161
+ vec[(axis + 2) % 3],
162
+ )
163
+
164
+ @wp.func
165
+ def _local_to_world(axis: int, vec: Any):
166
+ return type(vec)(
167
+ vec[(2 * axis) % 3],
168
+ vec[(2 * axis + 1) % 3],
169
+ vec[(2 * axis + 2) % 3],
170
+ )
171
+
172
+ @wp.func
173
+ def _local_to_world_axis(axis: int, loc_index: Any):
174
+ return (axis + loc_index) % 3
175
+
176
+ @wp.func
177
+ def side_index(arg: SideArg, side: Side):
178
+ alt_axis = Grid3D._local_to_world_axis(side.axis, 0)
179
+ if side.origin[0] == arg.cell_arg.res[alt_axis]:
180
+ # Upper-boundary side
181
+ longitude = side.origin[1]
182
+ latitude = side.origin[2]
183
+
184
+ latitude_res = arg.cell_arg.res[Grid3D._local_to_world_axis(side.axis, 2)]
185
+ lat_long = latitude_res * longitude + latitude
186
+
187
+ return 3 * arg.cell_count + arg.axis_offsets[side.axis] + lat_long
188
+
189
+ cell_index = Grid3D.cell_index(arg.cell_arg.res, Grid3D._local_to_world(side.axis, side.origin))
190
+ return side.axis * arg.cell_count + cell_index
191
+
192
+ @wp.func
193
+ def get_side(arg: SideArg, side_index: ElementIndex):
194
+ res = arg.cell_arg.res
195
+
196
+ if side_index < 3 * arg.cell_count:
197
+ axis = side_index // arg.cell_count
198
+ cell_index = side_index - axis * arg.cell_count
199
+ origin_loc = Grid3D._world_to_local(axis, Grid3D.get_cell(res, cell_index))
200
+ return Grid3D.Side(axis, origin_loc)
201
+
202
+ axis_offsets = arg.axis_offsets
203
+ axis_side_index = side_index - 3 * arg.cell_count
204
+ if axis_side_index < axis_offsets[1]:
205
+ axis = 0
206
+ elif axis_side_index < axis_offsets[2]:
207
+ axis = 1
208
+ else:
209
+ axis = 2
210
+
211
+ altitude = res[Grid3D._local_to_world_axis(axis, 0)]
212
+
213
+ lat_long = axis_side_index - axis_offsets[axis]
214
+ latitude_res = res[Grid3D._local_to_world_axis(axis, 2)]
215
+
216
+ longitude = lat_long // latitude_res
217
+ latitude = lat_long - longitude * latitude_res
218
+
219
+ origin_loc = wp.vec3i(altitude, longitude, latitude)
220
+
221
+ return Grid3D.Side(axis, origin_loc)
222
+
223
+ # Geometry device interface
224
+
225
+ @cached_arg_value
226
+ def cell_arg_value(self, device) -> CellArg:
227
+ args = self.CellArg()
228
+ args.res = self.res
229
+ args.origin = self.bounds_lo
230
+ args.cell_size = self.cell_size
231
+ return args
232
+
233
+ @wp.func
234
+ def cell_position(args: CellArg, s: Sample):
235
+ cell = Grid3D.get_cell(args.res, s.element_index)
236
+ return (
237
+ wp.vec3(
238
+ (float(cell[0]) + s.element_coords[0]) * args.cell_size[0],
239
+ (float(cell[1]) + s.element_coords[1]) * args.cell_size[1],
240
+ (float(cell[2]) + s.element_coords[2]) * args.cell_size[2],
241
+ )
242
+ + args.origin
243
+ )
244
+
245
+ @wp.func
246
+ def cell_deformation_gradient(args: CellArg, s: Sample):
247
+ return wp.diag(args.cell_size)
248
+
249
+ @wp.func
250
+ def cell_inverse_deformation_gradient(args: CellArg, s: Sample):
251
+ return wp.diag(wp.cw_div(wp.vec3(1.0), args.cell_size))
252
+
253
+ @wp.func
254
+ def cell_lookup(args: CellArg, pos: wp.vec3):
255
+ loc_pos = wp.cw_div(pos - args.origin, args.cell_size)
256
+ x = wp.clamp(loc_pos[0], 0.0, float(args.res[0]))
257
+ y = wp.clamp(loc_pos[1], 0.0, float(args.res[1]))
258
+ z = wp.clamp(loc_pos[2], 0.0, float(args.res[2]))
259
+
260
+ x_cell = wp.min(wp.floor(x), float(args.res[0]) - 1.0)
261
+ y_cell = wp.min(wp.floor(y), float(args.res[1]) - 1.0)
262
+ z_cell = wp.min(wp.floor(z), float(args.res[2]) - 1.0)
263
+
264
+ coords = Coords(x - x_cell, y - y_cell, z - z_cell)
265
+ cell_index = Grid3D.cell_index(args.res, Grid3D.Cell(int(x_cell), int(y_cell), int(z_cell)))
266
+
267
+ return make_free_sample(cell_index, coords)
268
+
269
+ @wp.func
270
+ def cell_lookup(args: CellArg, pos: wp.vec3, guess: Sample):
271
+ return Grid3D.cell_lookup(args, pos)
272
+
273
+ @wp.func
274
+ def cell_measure(args: CellArg, s: Sample):
275
+ return args.cell_size[0] * args.cell_size[1] * args.cell_size[2]
276
+
277
+ @wp.func
278
+ def cell_normal(args: CellArg, s: Sample):
279
+ return wp.vec3(0.0)
280
+
281
+ @cached_arg_value
282
+ def side_arg_value(self, device) -> SideArg:
283
+ args = self.SideArg()
284
+
285
+ axis_dims = wp.vec3i(
286
+ self.res[1] * self.res[2],
287
+ self.res[2] * self.res[0],
288
+ self.res[0] * self.res[1],
289
+ )
290
+ args.axis_offsets = wp.vec3i(
291
+ 0,
292
+ axis_dims[0],
293
+ axis_dims[0] + axis_dims[1],
294
+ )
295
+ args.cell_count = self.cell_count()
296
+ args.cell_arg = self.cell_arg_value(device)
297
+ return args
298
+
299
+ def side_index_arg_value(self, device) -> SideIndexArg:
300
+ return self.side_arg_value(device)
301
+
302
+ @wp.func
303
+ def boundary_side_index(args: SideArg, boundary_side_index: int):
304
+ """Boundary side to side index"""
305
+
306
+ axis_side_index = boundary_side_index // 2
307
+ border = boundary_side_index - 2 * axis_side_index
308
+
309
+ if axis_side_index < args.axis_offsets[1]:
310
+ axis = 0
311
+ elif axis_side_index < args.axis_offsets[2]:
312
+ axis = 1
313
+ else:
314
+ axis = 2
315
+
316
+ lat_long = axis_side_index - args.axis_offsets[axis]
317
+ latitude_res = args.cell_arg.res[Grid3D._local_to_world_axis(axis, 2)]
318
+
319
+ longitude = lat_long // latitude_res
320
+ latitude = lat_long - longitude * latitude_res
321
+
322
+ altitude = border * args.cell_arg.res[axis]
323
+
324
+ side = Grid3D.Side(axis, wp.vec3i(altitude, longitude, latitude))
325
+ return Grid3D.side_index(args, side)
326
+
327
+ @wp.func
328
+ def side_position(args: SideArg, s: Sample):
329
+ side = Grid3D.get_side(args, s.element_index)
330
+
331
+ coord0 = wp.where(side.origin[0] == 0, 1.0 - s.element_coords[0], s.element_coords[0])
332
+
333
+ local_pos = wp.vec3(
334
+ float(side.origin[0]),
335
+ float(side.origin[1]) + coord0,
336
+ float(side.origin[2]) + s.element_coords[1],
337
+ )
338
+
339
+ pos = args.cell_arg.origin + wp.cw_mul(Grid3D._local_to_world(side.axis, local_pos), args.cell_arg.cell_size)
340
+
341
+ return pos
342
+
343
+ @wp.func
344
+ def side_deformation_gradient(args: SideArg, s: Sample):
345
+ side = Grid3D.get_side(args, s.element_index)
346
+
347
+ sign = wp.where(side.origin[0] == 0, -1.0, 1.0)
348
+
349
+ return wp.matrix_from_cols(
350
+ wp.cw_mul(Grid3D._local_to_world(side.axis, wp.vec3(0.0, sign, 0.0)), args.cell_arg.cell_size),
351
+ wp.cw_mul(Grid3D._local_to_world(side.axis, wp.vec3(0.0, 0.0, 1.0)), args.cell_arg.cell_size),
352
+ )
353
+
354
+ @wp.func
355
+ def side_inner_inverse_deformation_gradient(args: SideArg, s: Sample):
356
+ return Grid3D.cell_inverse_deformation_gradient(args.cell_arg, s)
357
+
358
+ @wp.func
359
+ def side_outer_inverse_deformation_gradient(args: SideArg, s: Sample):
360
+ return Grid3D.cell_inverse_deformation_gradient(args.cell_arg, s)
361
+
362
+ @wp.func
363
+ def side_measure(args: SideArg, s: Sample):
364
+ side = Grid3D.get_side(args, s.element_index)
365
+ long_axis = Grid3D._local_to_world_axis(side.axis, 1)
366
+ lat_axis = Grid3D._local_to_world_axis(side.axis, 2)
367
+ return args.cell_arg.cell_size[long_axis] * args.cell_arg.cell_size[lat_axis]
368
+
369
+ @wp.func
370
+ def side_measure_ratio(args: SideArg, s: Sample):
371
+ side = Grid3D.get_side(args, s.element_index)
372
+ alt_axis = Grid3D._local_to_world_axis(side.axis, 0)
373
+ return 1.0 / args.cell_arg.cell_size[alt_axis]
374
+
375
+ @wp.func
376
+ def side_normal(args: SideArg, s: Sample):
377
+ side = Grid3D.get_side(args, s.element_index)
378
+
379
+ sign = wp.where(side.origin[0] == 0, -1.0, 1.0)
380
+
381
+ local_n = wp.vec3(sign, 0.0, 0.0)
382
+ return Grid3D._local_to_world(side.axis, local_n)
383
+
384
+ @wp.func
385
+ def side_inner_cell_index(arg: SideArg, side_index: ElementIndex):
386
+ side = Grid3D.get_side(arg, side_index)
387
+
388
+ inner_alt = wp.where(side.origin[0] == 0, 0, side.origin[0] - 1)
389
+
390
+ inner_origin = wp.vec3i(inner_alt, side.origin[1], side.origin[2])
391
+
392
+ cell = Grid3D._local_to_world(side.axis, inner_origin)
393
+ return Grid3D.cell_index(arg.cell_arg.res, cell)
394
+
395
+ @wp.func
396
+ def side_outer_cell_index(arg: SideArg, side_index: ElementIndex):
397
+ side = Grid3D.get_side(arg, side_index)
398
+
399
+ alt_axis = Grid3D._local_to_world_axis(side.axis, 0)
400
+
401
+ outer_alt = wp.where(
402
+ side.origin[0] == arg.cell_arg.res[alt_axis], arg.cell_arg.res[alt_axis] - 1, side.origin[0]
403
+ )
404
+
405
+ outer_origin = wp.vec3i(outer_alt, side.origin[1], side.origin[2])
406
+
407
+ cell = Grid3D._local_to_world(side.axis, outer_origin)
408
+ return Grid3D.cell_index(arg.cell_arg.res, cell)
409
+
410
+ @wp.func
411
+ def side_inner_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
412
+ side = Grid3D.get_side(args, side_index)
413
+
414
+ inner_alt = wp.where(side.origin[0] == 0, 0.0, 1.0)
415
+
416
+ side_coord0 = wp.where(side.origin[0] == 0, 1.0 - side_coords[0], side_coords[0])
417
+
418
+ return Grid3D._local_to_world(side.axis, wp.vec3(inner_alt, side_coord0, side_coords[1]))
419
+
420
+ @wp.func
421
+ def side_outer_cell_coords(args: SideArg, side_index: ElementIndex, side_coords: Coords):
422
+ side = Grid3D.get_side(args, side_index)
423
+
424
+ alt_axis = Grid3D._local_to_world_axis(side.axis, 0)
425
+ outer_alt = wp.where(side.origin[0] == args.cell_arg.res[alt_axis], 1.0, 0.0)
426
+
427
+ side_coord0 = wp.where(side.origin[0] == 0, 1.0 - side_coords[0], side_coords[0])
428
+
429
+ return Grid3D._local_to_world(side.axis, wp.vec3(outer_alt, side_coord0, side_coords[1]))
430
+
431
+ @wp.func
432
+ def side_from_cell_coords(
433
+ args: SideArg,
434
+ side_index: ElementIndex,
435
+ element_index: ElementIndex,
436
+ element_coords: Coords,
437
+ ):
438
+ side = Grid3D.get_side(args, side_index)
439
+ cell = Grid3D.get_cell(args.cell_arg.res, element_index)
440
+
441
+ if float(side.origin[0] - cell[side.axis]) == element_coords[side.axis]:
442
+ long_axis = Grid3D._local_to_world_axis(side.axis, 1)
443
+ lat_axis = Grid3D._local_to_world_axis(side.axis, 2)
444
+ long_coord = element_coords[long_axis]
445
+ long_coord = wp.where(side.origin[0] == 0, 1.0 - long_coord, long_coord)
446
+ return Coords(long_coord, element_coords[lat_axis], 0.0)
447
+
448
+ return Coords(OUTSIDE)
449
+
450
+ @wp.func
451
+ def side_to_cell_arg(side_arg: SideArg):
452
+ return side_arg.cell_arg