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,326 @@
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
17
+
18
+ import warp as wp
19
+ from warp.fem import cache
20
+ from warp.fem.space import CollocatedFunctionSpace, SpacePartition
21
+ from warp.fem.types import NULL_NODE_INDEX, ElementIndex, Sample
22
+
23
+ from .field import DiscreteField
24
+
25
+
26
+ class NodalFieldBase(DiscreteField):
27
+ """Base class for nodal field and nodal field traces. Does not hold values"""
28
+
29
+ def __init__(self, space: CollocatedFunctionSpace, space_partition: SpacePartition):
30
+ super().__init__(space, space_partition)
31
+
32
+ self.EvalArg = self._make_eval_arg()
33
+ self.ElementEvalArg = self._make_element_eval_arg()
34
+ self.eval_degree = DiscreteField._make_eval_degree(self)
35
+
36
+ self._read_node_value = self._make_read_node_value()
37
+
38
+ self.eval_inner = self._make_eval_inner()
39
+ self.eval_outer = self._make_eval_outer()
40
+ self.eval_grad_inner = self._make_eval_grad_inner(world_space=True)
41
+ self.eval_grad_outer = self._make_eval_grad_outer(world_space=True)
42
+ self.eval_reference_grad_inner = self._make_eval_grad_inner(world_space=False)
43
+ self.eval_reference_grad_outer = self._make_eval_grad_outer(world_space=False)
44
+ self.eval_div_inner = self._make_eval_div_inner()
45
+ self.eval_div_outer = self._make_eval_div_outer()
46
+
47
+ self.set_node_value = self._make_set_node_value()
48
+ self.node_partition_index = self._make_node_partition_index()
49
+
50
+ def _make_eval_arg(self):
51
+ @cache.dynamic_struct(suffix=self.name)
52
+ class EvalArg:
53
+ dof_values: wp.array(dtype=self.space.dof_dtype)
54
+ space_arg: self.space.SpaceArg
55
+ topology_arg: self.space.topology.TopologyArg
56
+ partition_arg: self.space_partition.PartitionArg
57
+
58
+ return EvalArg
59
+
60
+ def _make_element_eval_arg(self):
61
+ @cache.dynamic_struct(suffix=self.name)
62
+ class ElementEvalArg:
63
+ elt_arg: self.space.topology.ElementArg
64
+ eval_arg: self.EvalArg
65
+
66
+ return ElementEvalArg
67
+
68
+ def _make_read_node_value(self):
69
+ @cache.dynamic_func(suffix=self.name)
70
+ def read_node_value(args: self.ElementEvalArg, geo_element_index: ElementIndex, node_index_in_elt: int):
71
+ nidx = self.space.topology.element_node_index(
72
+ args.elt_arg, args.eval_arg.topology_arg, geo_element_index, node_index_in_elt
73
+ )
74
+ pidx = self.space_partition.partition_node_index(args.eval_arg.partition_arg, nidx)
75
+ if pidx == NULL_NODE_INDEX:
76
+ return self.space.dof_dtype(0.0)
77
+
78
+ return args.eval_arg.dof_values[pidx]
79
+
80
+ return read_node_value
81
+
82
+ def _make_eval_inner(self):
83
+ @cache.dynamic_func(suffix=self.name)
84
+ def eval_inner(args: self.ElementEvalArg, s: Sample):
85
+ local_value_map = self.space.local_value_map_inner(args.elt_arg, s.element_index, s.element_coords)
86
+ node_count = self.space.topology.element_node_count(
87
+ args.elt_arg, args.eval_arg.topology_arg, s.element_index
88
+ )
89
+ res = self.space.dtype(0.0)
90
+ for k in range(node_count):
91
+ res += self.space.space_value(
92
+ self._read_node_value(args, s.element_index, k),
93
+ self.space.element_inner_weight(
94
+ args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
95
+ ),
96
+ local_value_map,
97
+ )
98
+ return res
99
+
100
+ return eval_inner
101
+
102
+ def _make_eval_grad_inner(self, world_space: bool):
103
+ if not self.space.gradient_valid():
104
+ return None
105
+
106
+ @cache.dynamic_func(suffix=self.name)
107
+ def eval_grad_inner(args: self.ElementEvalArg, s: Sample, grad_transform: Any):
108
+ local_value_map = self.space.local_value_map_inner(args.elt_arg, s.element_index, s.element_coords)
109
+ node_count = self.space.topology.element_node_count(
110
+ args.elt_arg, args.eval_arg.topology_arg, s.element_index
111
+ )
112
+
113
+ res = self.gradient_dtype(0.0)
114
+ for k in range(node_count):
115
+ res += self.space.space_gradient(
116
+ self._read_node_value(args, s.element_index, k),
117
+ self.space.element_inner_weight_gradient(
118
+ args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
119
+ ),
120
+ local_value_map,
121
+ grad_transform,
122
+ )
123
+ return res
124
+
125
+ @cache.dynamic_func(suffix=self.name)
126
+ def eval_grad_inner_ref_space(args: self.ElementEvalArg, s: Sample):
127
+ grad_transform = 1.0
128
+ return eval_grad_inner(args, s, grad_transform)
129
+
130
+ @cache.dynamic_func(suffix=self.name)
131
+ def eval_grad_inner_world_space(args: self.ElementEvalArg, s: Sample):
132
+ grad_transform = self.space.element_inner_reference_gradient_transform(args.elt_arg, s)
133
+ return eval_grad_inner(args, s, grad_transform)
134
+
135
+ return eval_grad_inner_world_space if world_space else eval_grad_inner_ref_space
136
+
137
+ def _make_eval_div_inner(self):
138
+ if not self.divergence_valid():
139
+ return None
140
+
141
+ @cache.dynamic_func(suffix=self.name)
142
+ def eval_div_inner(args: self.ElementEvalArg, s: Sample):
143
+ grad_transform = self.space.element_inner_reference_gradient_transform(args.elt_arg, s)
144
+ local_value_map = self.space.local_value_map_inner(args.elt_arg, s.element_index, s.element_coords)
145
+ node_count = self.space.topology.element_node_count(
146
+ args.elt_arg, args.eval_arg.topology_arg, s.element_index
147
+ )
148
+
149
+ res = self.divergence_dtype(0.0)
150
+ for k in range(node_count):
151
+ res += self.space.space_divergence(
152
+ self._read_node_value(args, s.element_index, k),
153
+ self.space.element_inner_weight_gradient(
154
+ args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
155
+ ),
156
+ local_value_map,
157
+ grad_transform,
158
+ )
159
+ return res
160
+
161
+ return eval_div_inner
162
+
163
+ def _make_eval_outer(self):
164
+ @cache.dynamic_func(suffix=self.name)
165
+ def eval_outer(args: self.ElementEvalArg, s: Sample):
166
+ local_value_map = self.space.local_value_map_outer(args.elt_arg, s.element_index, s.element_coords)
167
+ node_count = self.space.topology.element_node_count(
168
+ args.elt_arg, args.eval_arg.topology_arg, s.element_index
169
+ )
170
+
171
+ res = self.dtype(0.0)
172
+ for k in range(node_count):
173
+ res += self.space.space_value(
174
+ self._read_node_value(args, s.element_index, k),
175
+ self.space.element_outer_weight(
176
+ args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
177
+ ),
178
+ local_value_map,
179
+ )
180
+ return res
181
+
182
+ return eval_outer
183
+
184
+ def _make_eval_grad_outer(self, world_space: bool):
185
+ if not self.space.gradient_valid():
186
+ return None
187
+
188
+ @cache.dynamic_func(suffix=self.name)
189
+ def eval_grad_outer(args: self.ElementEvalArg, s: Sample, grad_transform: Any):
190
+ local_value_map = self.space.local_value_map_outer(args.elt_arg, s.element_index, s.element_coords)
191
+ node_count = self.space.topology.element_node_count(
192
+ args.elt_arg, args.eval_arg.topology_arg, s.element_index
193
+ )
194
+
195
+ res = self.gradient_dtype(0.0)
196
+ for k in range(node_count):
197
+ res += self.space.space_gradient(
198
+ self._read_node_value(args, s.element_index, k),
199
+ self.space.element_outer_weight_gradient(
200
+ args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
201
+ ),
202
+ local_value_map,
203
+ grad_transform,
204
+ )
205
+ return res
206
+
207
+ @cache.dynamic_func(suffix=self.name)
208
+ def eval_grad_outer_ref_space(args: self.ElementEvalArg, s: Sample):
209
+ grad_transform = 1.0
210
+ return eval_grad_outer_ref_space(args, s, grad_transform)
211
+
212
+ @cache.dynamic_func(suffix=self.name)
213
+ def eval_grad_outer_world_space(args: self.ElementEvalArg, s: Sample):
214
+ grad_transform = self.space.element_outer_reference_gradient_transform(args.elt_arg, s)
215
+ return eval_grad_outer_ref_space(args, s, grad_transform)
216
+
217
+ return eval_grad_outer_world_space if world_space else eval_grad_outer_ref_space
218
+
219
+ def _make_eval_div_outer(self):
220
+ if not self.divergence_valid():
221
+ return None
222
+
223
+ @cache.dynamic_func(suffix=self.name)
224
+ def eval_div_outer(args: self.ElementEvalArg, s: Sample):
225
+ grad_transform = self.space.element_outer_reference_gradient_transform(args.elt_arg, s)
226
+ local_value_map = self.space.local_value_map_outer(args.elt_arg, s.element_index, s.element_coords)
227
+ node_count = self.space.topology.element_node_count(
228
+ args.elt_arg, args.eval_arg.topology_arg, s.element_index
229
+ )
230
+
231
+ res = self.divergence_dtype(0.0)
232
+ for k in range(node_count):
233
+ res += self.space.space_divergence(
234
+ self._read_node_value(args, s.element_index, k),
235
+ self.space.element_outer_weight_gradient(
236
+ args.elt_arg, args.eval_arg.space_arg, s.element_index, s.element_coords, k, s.qp_index
237
+ ),
238
+ local_value_map,
239
+ grad_transform,
240
+ )
241
+ return res
242
+
243
+ return eval_div_outer
244
+
245
+ def _make_set_node_value(self):
246
+ @cache.dynamic_func(suffix=self.name)
247
+ def set_node_value(
248
+ elt_arg: self.space.ElementArg,
249
+ eval_arg: self.EvalArg,
250
+ element_index: ElementIndex,
251
+ node_index_in_element: int,
252
+ partition_node_index: int,
253
+ value: self.space.dtype,
254
+ ):
255
+ eval_arg.dof_values[partition_node_index] = self.space.node_dof_value(
256
+ elt_arg, eval_arg.space_arg, element_index, node_index_in_element, value
257
+ )
258
+
259
+ return set_node_value
260
+
261
+ def _make_node_partition_index(self):
262
+ @cache.dynamic_func(suffix=self.name)
263
+ def node_partition_index(args: self.ElementEvalArg, node_index: int):
264
+ return self.space_partition.partition_node_index(args.eval_arg.partition_arg, node_index)
265
+
266
+ return node_partition_index
267
+
268
+
269
+ class NodalField(NodalFieldBase):
270
+ """A field holding values for all degrees of freedom at each node of the underlying function space partition
271
+
272
+ See also: warp.fem.space.CollocatedFunctionSpace.make_field
273
+ """
274
+
275
+ def __init__(self, space: CollocatedFunctionSpace, space_partition: SpacePartition):
276
+ if space.topology != space_partition.space_topology:
277
+ raise ValueError("Incompatible space and space partition topologies")
278
+
279
+ super().__init__(space, space_partition)
280
+
281
+ self._dof_values = wp.zeros(n=self.space_partition.node_count(), dtype=self.dof_dtype)
282
+
283
+ def eval_arg_value(self, device):
284
+ arg = self.EvalArg()
285
+ arg.dof_values = self._dof_values.to(device)
286
+ arg.space_arg = self.space.space_arg_value(device)
287
+ arg.partition_arg = self.space_partition.partition_arg_value(device)
288
+ arg.topology_arg = self.space.topology.topo_arg_value(device)
289
+
290
+ return arg
291
+
292
+ @property
293
+ def dof_values(self) -> wp.array:
294
+ """Returns a warp array containing the values at all degrees of freedom of the underlying space partition"""
295
+ return self._dof_values
296
+
297
+ @dof_values.setter
298
+ def dof_values(self, values):
299
+ """Sets the degrees-of-freedom values
300
+
301
+ Args:
302
+ values: Array that is convertible to a warp array of length ``self.space_partition.node_count()`` and data type ``self.space.dof_dtype``
303
+ """
304
+
305
+ if isinstance(values, wp.array):
306
+ self._dof_values = values
307
+ else:
308
+ self._dof_values = wp.array(values, dtype=self.dof_dtype)
309
+
310
+ class Trace(NodalFieldBase):
311
+ def __init__(self, field):
312
+ self._field = field
313
+ super().__init__(field.space.trace(), field.space_partition)
314
+
315
+ def eval_arg_value(self, device):
316
+ arg = self.EvalArg()
317
+ arg.dof_values = self._field.dof_values.to(device)
318
+ arg.space_arg = self.space.space_arg_value(device)
319
+ arg.partition_arg = self.space_partition.partition_arg_value(device)
320
+ arg.topology_arg = self.space.topology.topo_arg_value(device)
321
+
322
+ return arg
323
+
324
+ def trace(self) -> Trace:
325
+ trace_field = NodalField.Trace(self)
326
+ return trace_field
@@ -0,0 +1,37 @@
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 warp.fem.space import SpaceRestriction
17
+
18
+ from .field import DiscreteField
19
+
20
+
21
+ class FieldRestriction:
22
+ """Restriction of a discrete field to a given GeometryDomain"""
23
+
24
+ def __init__(self, space_restriction: SpaceRestriction, field: DiscreteField):
25
+ if field.space.dimension - 1 == space_restriction.space_topology.dimension:
26
+ field = field.trace()
27
+
28
+ if field.space.dimension != space_restriction.space_topology.dimension:
29
+ raise ValueError("Incompatible space and field dimensions")
30
+
31
+ if field.space.topology != space_restriction.space_topology:
32
+ raise ValueError("Incompatible field and space restriction topologies")
33
+
34
+ self.space_restriction = space_restriction
35
+ self.domain = self.space_restriction.domain
36
+ self.field = field
37
+ self.space = self.field.space