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,561 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2022 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
+ #############################################################################
17
+ # Example Differentiable Ray Caster
18
+ #
19
+ # Shows how to use the built-in wp.Mesh data structure and wp.mesh_query_ray()
20
+ # function to implement a basic differentiable ray caster
21
+ #
22
+ ##############################################################################
23
+
24
+ import math
25
+ import os
26
+
27
+ import numpy as np
28
+ from pxr import Usd, UsdGeom
29
+
30
+ import warp as wp
31
+ import warp.examples
32
+ from warp.optim import SGD
33
+
34
+
35
+ class RenderMode:
36
+ """Rendering modes
37
+ grayscale: Lambertian shading from multiple directional lights
38
+ texture: 2D texture map
39
+ normal_map: mesh normal computed from interpolated vertex normals
40
+ """
41
+
42
+ grayscale = 0
43
+ texture = 1
44
+ normal_map = 2
45
+
46
+
47
+ @wp.struct
48
+ class RenderMesh:
49
+ """Mesh to be ray casted.
50
+ Assumes a triangle mesh as input.
51
+ Per-vertex normals are computed with compute_vertex_normals()
52
+ """
53
+
54
+ id: wp.uint64
55
+ vertices: wp.array(dtype=wp.vec3)
56
+ indices: wp.array(dtype=int)
57
+ tex_coords: wp.array(dtype=wp.vec2)
58
+ tex_indices: wp.array(dtype=int)
59
+ vertex_normals: wp.array(dtype=wp.vec3)
60
+ pos: wp.array(dtype=wp.vec3)
61
+ rot: wp.array(dtype=wp.quat)
62
+
63
+
64
+ @wp.struct
65
+ class Camera:
66
+ """Basic camera for ray casting"""
67
+
68
+ horizontal: float
69
+ vertical: float
70
+ aspect: float
71
+ e: float
72
+ tan: float
73
+ pos: wp.vec3
74
+ rot: wp.quat
75
+
76
+
77
+ @wp.struct
78
+ class DirectionalLights:
79
+ """Stores arrays of directional light directions and intensities."""
80
+
81
+ dirs: wp.array(dtype=wp.vec3)
82
+ intensities: wp.array(dtype=float)
83
+ num_lights: int
84
+
85
+
86
+ @wp.kernel
87
+ def vertex_normal_sum_kernel(
88
+ verts: wp.array(dtype=wp.vec3), indices: wp.array(dtype=int), normal_sums: wp.array(dtype=wp.vec3)
89
+ ):
90
+ tid = wp.tid()
91
+
92
+ i = indices[tid * 3]
93
+ j = indices[tid * 3 + 1]
94
+ k = indices[tid * 3 + 2]
95
+
96
+ a = verts[i]
97
+ b = verts[j]
98
+ c = verts[k]
99
+
100
+ ab = b - a
101
+ ac = c - a
102
+
103
+ area_normal = wp.cross(ab, ac)
104
+ wp.atomic_add(normal_sums, i, area_normal)
105
+ wp.atomic_add(normal_sums, j, area_normal)
106
+ wp.atomic_add(normal_sums, k, area_normal)
107
+
108
+
109
+ @wp.kernel
110
+ def normalize_kernel(
111
+ normal_sums: wp.array(dtype=wp.vec3),
112
+ vertex_normals: wp.array(dtype=wp.vec3),
113
+ ):
114
+ tid = wp.tid()
115
+ vertex_normals[tid] = wp.normalize(normal_sums[tid])
116
+
117
+
118
+ @wp.func
119
+ def texture_interpolation(tex_interp: wp.vec2, texture: wp.array2d(dtype=wp.vec3)):
120
+ tex_width = texture.shape[1]
121
+ tex_height = texture.shape[0]
122
+ tex = wp.vec2(tex_interp[0] * float(tex_width - 1), (1.0 - tex_interp[1]) * float(tex_height - 1))
123
+
124
+ x0 = int(tex[0])
125
+ x1 = x0 + 1
126
+ alpha_x = tex[0] - float(x0)
127
+ y0 = int(tex[1])
128
+ y1 = y0 + 1
129
+ alpha_y = tex[1] - float(y0)
130
+ c00 = texture[y0, x0]
131
+ c10 = texture[y0, x1]
132
+ c01 = texture[y1, x0]
133
+ c11 = texture[y1, x1]
134
+ lower = (1.0 - alpha_x) * c00 + alpha_x * c10
135
+ upper = (1.0 - alpha_x) * c01 + alpha_x * c11
136
+ color = (1.0 - alpha_y) * lower + alpha_y * upper
137
+
138
+ return color
139
+
140
+
141
+ @wp.kernel
142
+ def draw_kernel(
143
+ mesh: RenderMesh,
144
+ camera: Camera,
145
+ texture: wp.array2d(dtype=wp.vec3),
146
+ rays_width: int,
147
+ rays_height: int,
148
+ rays: wp.array(dtype=wp.vec3),
149
+ lights: DirectionalLights,
150
+ mode: int,
151
+ ):
152
+ tid = wp.tid()
153
+
154
+ x = tid % rays_width
155
+ y = rays_height - tid // rays_width
156
+
157
+ sx = 2.0 * float(x) / float(rays_width) - 1.0
158
+ sy = 2.0 * float(y) / float(rays_height) - 1.0
159
+
160
+ # compute view ray in world space
161
+ ro_world = camera.pos
162
+ rd_world = wp.normalize(wp.quat_rotate(camera.rot, wp.vec3(sx * camera.tan * camera.aspect, sy * camera.tan, -1.0)))
163
+
164
+ # compute view ray in mesh space
165
+ inv = wp.transform_inverse(wp.transform(mesh.pos[0], mesh.rot[0]))
166
+ ro = wp.transform_point(inv, ro_world)
167
+ rd = wp.transform_vector(inv, rd_world)
168
+
169
+ color = wp.vec3(0.0, 0.0, 0.0)
170
+
171
+ query = wp.mesh_query_ray(mesh.id, ro, rd, 1.0e6)
172
+ if query.result:
173
+ i = mesh.indices[query.face * 3]
174
+ j = mesh.indices[query.face * 3 + 1]
175
+ k = mesh.indices[query.face * 3 + 2]
176
+
177
+ a_n = mesh.vertex_normals[i]
178
+ b_n = mesh.vertex_normals[j]
179
+ c_n = mesh.vertex_normals[k]
180
+
181
+ # vertex normal interpolation
182
+ normal = query.u * a_n + query.v * b_n + (1.0 - query.u - query.v) * c_n
183
+
184
+ if mode == 0 or mode == 1:
185
+ if mode == 0: # grayscale
186
+ color = wp.vec3(1.0)
187
+
188
+ elif mode == 1: # texture interpolation
189
+ tex_a = mesh.tex_coords[mesh.tex_indices[query.face * 3]]
190
+ tex_b = mesh.tex_coords[mesh.tex_indices[query.face * 3 + 1]]
191
+ tex_c = mesh.tex_coords[mesh.tex_indices[query.face * 3 + 2]]
192
+
193
+ tex = query.u * tex_a + query.v * tex_b + (1.0 - query.u - query.v) * tex_c
194
+
195
+ color = texture_interpolation(tex, texture)
196
+
197
+ # lambertian directional lighting
198
+ lambert = float(0.0)
199
+ for i in range(lights.num_lights):
200
+ dir = wp.transform_vector(inv, lights.dirs[i])
201
+ val = lights.intensities[i] * wp.dot(normal, dir)
202
+ if val < 0.0:
203
+ val = 0.0
204
+ lambert = lambert + val
205
+
206
+ color = lambert * color
207
+
208
+ elif mode == 2: # normal map
209
+ color = normal * 0.5 + wp.vec3(0.5, 0.5, 0.5)
210
+
211
+ if color[0] > 1.0:
212
+ color = wp.vec3(1.0, color[1], color[2])
213
+ if color[1] > 1.0:
214
+ color = wp.vec3(color[0], 1.0, color[2])
215
+ if color[2] > 1.0:
216
+ color = wp.vec3(color[0], color[1], 1.0)
217
+
218
+ rays[tid] = color
219
+
220
+
221
+ @wp.kernel
222
+ def downsample_kernel(
223
+ rays: wp.array(dtype=wp.vec3), pixels: wp.array(dtype=wp.vec3), rays_width: int, num_samples: int
224
+ ):
225
+ tid = wp.tid()
226
+
227
+ pixels_width = rays_width / num_samples
228
+ px = tid % pixels_width
229
+ py = tid // pixels_width
230
+ start_idx = py * num_samples * rays_width + px * num_samples
231
+
232
+ color = wp.vec3(0.0, 0.0, 0.0)
233
+
234
+ for i in range(0, num_samples):
235
+ for j in range(0, num_samples):
236
+ ray = rays[start_idx + i * rays_width + j]
237
+ color = wp.vec3(color[0] + ray[0], color[1] + ray[1], color[2] + ray[2])
238
+
239
+ num_samples_sq = float(num_samples * num_samples)
240
+ color = wp.vec3(color[0] / num_samples_sq, color[1] / num_samples_sq, color[2] / num_samples_sq)
241
+ pixels[tid] = color
242
+
243
+
244
+ @wp.kernel
245
+ def loss_kernel(pixels: wp.array(dtype=wp.vec3), target_pixels: wp.array(dtype=wp.vec3), loss: wp.array(dtype=float)):
246
+ tid = wp.tid()
247
+
248
+ pixel = pixels[tid]
249
+ target_pixel = target_pixels[tid]
250
+
251
+ diff = target_pixel - pixel
252
+
253
+ # pseudo Huber loss
254
+ delta = 1.0
255
+ x = delta * delta * (wp.sqrt(1.0 + (diff[0] / delta) * (diff[0] / delta)) - 1.0)
256
+ y = delta * delta * (wp.sqrt(1.0 + (diff[1] / delta) * (diff[1] / delta)) - 1.0)
257
+ z = delta * delta * (wp.sqrt(1.0 + (diff[2] / delta) * (diff[2] / delta)) - 1.0)
258
+ sum = x + y + z
259
+
260
+ wp.atomic_add(loss, 0, sum)
261
+
262
+
263
+ @wp.kernel
264
+ def normalize(x: wp.array(dtype=wp.quat)):
265
+ tid = wp.tid()
266
+
267
+ x[tid] = wp.normalize(x[tid])
268
+
269
+
270
+ class Example:
271
+ """
272
+ Non-differentiable variables:
273
+ camera.horizontal: camera horizontal aperture size
274
+ camera.vertical: camera vertical aperture size
275
+ camera.aspect: camera aspect ratio
276
+ camera.e: focal length
277
+ camera.pos: camera displacement
278
+ camera.rot: camera rotation (quaternion)
279
+ pix_width: final image width in pixels
280
+ pix_height: final image height in pixels
281
+ num_samples: anti-aliasing. calculated as pow(2, num_samples)
282
+ directional_lights: characterized by intensity (scalar) and direction (vec3)
283
+ render_mesh.indices: mesh vertex indices
284
+ render_mesh.tex_indices: texture indices
285
+
286
+ Differentiable variables:
287
+ render_mesh.pos: parent transform displacement
288
+ render_mesh.quat: parent transform rotation (quaternion)
289
+ render_mesh.vertices: mesh vertex positions
290
+ render_mesh.vertex_normals: mesh vertex normals
291
+ render_mesh.tex_coords: 2D texture coordinates
292
+ """
293
+
294
+ def __init__(self, height=1024, train_iters=150, rot_array=None):
295
+ cam_pos = wp.vec3(0.0, 0.75, 7.0)
296
+ cam_rot = wp.quat(0.0, 0.0, 0.0, 1.0)
297
+ horizontal_aperture = 36.0
298
+ vertical_aperture = 20.25
299
+ aspect = horizontal_aperture / vertical_aperture
300
+ focal_length = 50.0
301
+ self.height = height
302
+ self.width = int(aspect * self.height)
303
+ self.num_pixels = self.width * self.height
304
+
305
+ if rot_array is None:
306
+ rot_array = [0.0, 0.0, 0.0, 1.0]
307
+
308
+ asset_stage = Usd.Stage.Open(os.path.join(warp.examples.get_asset_directory(), "bunny.usd"))
309
+ mesh_geom = UsdGeom.Mesh(asset_stage.GetPrimAtPath("/root/bunny"))
310
+
311
+ points = np.array(mesh_geom.GetPointsAttr().Get())
312
+ indices = np.array(mesh_geom.GetFaceVertexIndicesAttr().Get())
313
+ num_points = points.shape[0]
314
+ num_faces = int(indices.shape[0] / 3)
315
+
316
+ # manufacture texture coordinates + indices for this asset
317
+ distance = np.linalg.norm(points, axis=1)
318
+ radius = np.max(distance)
319
+ distance = distance / radius
320
+ tex_coords = np.stack((distance, distance), axis=1)
321
+ tex_indices = indices
322
+
323
+ # manufacture texture for this asset
324
+ x = np.arange(256.0)
325
+ xx, yy = np.meshgrid(x, x)
326
+ zz = np.zeros_like(xx)
327
+ texture_host = np.stack((xx, yy, zz), axis=2) / 255.0
328
+
329
+ # set anti-aliasing
330
+ self.num_samples = 1
331
+
332
+ # set render mode
333
+ self.render_mode = RenderMode.texture
334
+
335
+ # set training iterations
336
+ self.train_rate = 5.00e-8
337
+ self.momentum = 0.5
338
+ self.dampening = 0.1
339
+ self.weight_decay = 0.0
340
+ self.train_iters = train_iters
341
+ self.period = 10 # Training iterations between render() calls
342
+ self.iter = 0
343
+
344
+ # storage for training animation
345
+ self.images = np.zeros((self.height, self.width, 3, max(int(self.train_iters / self.period), 1)))
346
+ self.image_counter = 0
347
+
348
+ # construct RenderMesh
349
+ self.render_mesh = RenderMesh()
350
+ self.mesh = wp.Mesh(
351
+ points=wp.array(points, dtype=wp.vec3, requires_grad=True),
352
+ indices=wp.array(indices, dtype=int),
353
+ )
354
+ self.render_mesh.id = self.mesh.id
355
+ self.render_mesh.vertices = self.mesh.points
356
+ self.render_mesh.indices = self.mesh.indices
357
+ self.render_mesh.tex_coords = wp.array(tex_coords, dtype=wp.vec2, requires_grad=True)
358
+ self.render_mesh.tex_indices = wp.array(tex_indices, dtype=int)
359
+ self.normal_sums = wp.zeros(num_points, dtype=wp.vec3, requires_grad=True)
360
+ self.render_mesh.vertex_normals = wp.zeros(num_points, dtype=wp.vec3, requires_grad=True)
361
+ self.render_mesh.pos = wp.zeros(1, dtype=wp.vec3, requires_grad=True)
362
+ self.render_mesh.rot = wp.array(np.array(rot_array), dtype=wp.quat, requires_grad=True)
363
+
364
+ # compute vertex normals
365
+ wp.launch(
366
+ kernel=vertex_normal_sum_kernel,
367
+ dim=num_faces,
368
+ inputs=[self.render_mesh.vertices, self.render_mesh.indices, self.normal_sums],
369
+ )
370
+ wp.launch(
371
+ kernel=normalize_kernel,
372
+ dim=num_points,
373
+ inputs=[self.normal_sums, self.render_mesh.vertex_normals],
374
+ )
375
+
376
+ # construct camera
377
+ self.camera = Camera()
378
+ self.camera.horizontal = horizontal_aperture
379
+ self.camera.vertical = vertical_aperture
380
+ self.camera.aspect = aspect
381
+ self.camera.e = focal_length
382
+ self.camera.tan = vertical_aperture / (2.0 * focal_length)
383
+ self.camera.pos = cam_pos
384
+ self.camera.rot = cam_rot
385
+
386
+ # construct texture
387
+ self.texture = wp.array2d(texture_host, dtype=wp.vec3, requires_grad=True)
388
+
389
+ # construct lights
390
+ self.lights = DirectionalLights()
391
+ self.lights.dirs = wp.array(np.array([[1.0, 0.0, 0.0], [0.0, 0.0, 1.0]]), dtype=wp.vec3, requires_grad=True)
392
+ self.lights.intensities = wp.array(np.array([2.0, 0.2]), dtype=float, requires_grad=True)
393
+ self.lights.num_lights = 2
394
+
395
+ # construct rays
396
+ self.rays_width = self.width * pow(2, self.num_samples)
397
+ self.rays_height = self.height * pow(2, self.num_samples)
398
+ self.num_rays = self.rays_width * self.rays_height
399
+ self.rays = wp.zeros(self.num_rays, dtype=wp.vec3, requires_grad=True)
400
+
401
+ # construct pixels
402
+ self.pixels = wp.zeros(self.num_pixels, dtype=wp.vec3, requires_grad=True)
403
+ self.target_pixels = wp.zeros(self.num_pixels, dtype=wp.vec3)
404
+
405
+ # loss array
406
+ self.loss = wp.zeros(1, dtype=float, requires_grad=True)
407
+
408
+ # capture graph
409
+ self.use_cuda_graph = wp.get_device().is_cuda
410
+ if self.use_cuda_graph:
411
+ with wp.ScopedCapture() as capture:
412
+ self.tape = wp.Tape()
413
+ with self.tape:
414
+ self.forward()
415
+ self.tape.backward(self.loss)
416
+ self.graph = capture.graph
417
+
418
+ self.optimizer = SGD(
419
+ [self.render_mesh.rot],
420
+ self.train_rate,
421
+ momentum=self.momentum,
422
+ dampening=self.dampening,
423
+ weight_decay=self.weight_decay,
424
+ )
425
+
426
+ def ray_cast(self):
427
+ # raycast
428
+ wp.launch(
429
+ kernel=draw_kernel,
430
+ dim=self.num_rays,
431
+ inputs=[
432
+ self.render_mesh,
433
+ self.camera,
434
+ self.texture,
435
+ self.rays_width,
436
+ self.rays_height,
437
+ self.rays,
438
+ self.lights,
439
+ self.render_mode,
440
+ ],
441
+ )
442
+
443
+ # downsample
444
+ wp.launch(
445
+ kernel=downsample_kernel,
446
+ dim=self.num_pixels,
447
+ inputs=[self.rays, self.pixels, self.rays_width, pow(2, self.num_samples)],
448
+ )
449
+
450
+ def forward(self):
451
+ self.ray_cast()
452
+
453
+ # compute pixel loss
454
+ wp.launch(loss_kernel, dim=self.num_pixels, inputs=[self.pixels, self.target_pixels, self.loss])
455
+
456
+ def step(self):
457
+ with wp.ScopedTimer("step"):
458
+ if self.use_cuda_graph:
459
+ wp.capture_launch(self.graph)
460
+ else:
461
+ self.tape = wp.Tape()
462
+ with self.tape:
463
+ self.forward()
464
+ self.tape.backward(self.loss)
465
+
466
+ rot_grad = self.tape.gradients[self.render_mesh.rot]
467
+ self.optimizer.step([rot_grad])
468
+ wp.launch(normalize, dim=1, inputs=[self.render_mesh.rot])
469
+
470
+ if self.iter % self.period == 0:
471
+ print(f"Iter: {self.iter} Loss: {self.loss}")
472
+
473
+ self.tape.zero()
474
+ self.loss.zero_()
475
+
476
+ self.iter = self.iter + 1
477
+
478
+ def render(self):
479
+ with wp.ScopedTimer("render"):
480
+ self.images[:, :, :, self.image_counter] = self.get_image()
481
+ self.image_counter += 1
482
+
483
+ def get_image(self):
484
+ return self.pixels.numpy().reshape((self.height, self.width, 3))
485
+
486
+ def get_animation(self):
487
+ fig, ax = plt.subplots()
488
+ plt.axis("off")
489
+ plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
490
+ plt.margins(0, 0)
491
+
492
+ frames = []
493
+ for i in range(self.images.shape[3]):
494
+ frame = ax.imshow(self.images[:, :, :, i], animated=True)
495
+ frames.append([frame])
496
+
497
+ ani = animation.ArtistAnimation(fig, frames, interval=50, blit=True, repeat_delay=1000)
498
+ return ani
499
+
500
+
501
+ if __name__ == "__main__":
502
+ import argparse
503
+
504
+ parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
505
+ parser.add_argument("--device", type=str, default=None, help="Override the default Warp device.")
506
+ parser.add_argument("--train_iters", type=int, default=150, help="Total number of training iterations.")
507
+ parser.add_argument("--height", type=int, default=1024, help="Height of rendered image in pixels.")
508
+ parser.add_argument(
509
+ "--headless",
510
+ action="store_true",
511
+ help="Run in headless mode, suppressing the opening of any graphical windows.",
512
+ )
513
+
514
+ args = parser.parse_known_args()[0]
515
+
516
+ with wp.ScopedDevice(args.device):
517
+ reference_example = Example(height=args.height)
518
+
519
+ # render target rotation
520
+ reference_example.ray_cast()
521
+
522
+ # offset mesh rotation
523
+ example = Example(
524
+ train_iters=args.train_iters,
525
+ height=args.height,
526
+ rot_array=[
527
+ 0.0,
528
+ (math.sqrt(3) - 1) / (2.0 * math.sqrt(2.0)),
529
+ 0.0,
530
+ (math.sqrt(3) + 1) / (2.0 * math.sqrt(2.0)),
531
+ ],
532
+ )
533
+
534
+ wp.copy(example.target_pixels, reference_example.pixels)
535
+
536
+ # recover target rotation
537
+ for i in range(example.train_iters):
538
+ example.step()
539
+
540
+ if i % example.period == 0:
541
+ example.render()
542
+
543
+ if not args.headless:
544
+ import matplotlib.animation as animation
545
+ import matplotlib.image as img
546
+ import matplotlib.pyplot as plt
547
+
548
+ target_image = reference_example.get_image()
549
+ target_image_filename = "example_diffray_target_image.png"
550
+ img.imsave(target_image_filename, target_image)
551
+ print(f"Saved the target image at `{target_image_filename}`")
552
+
553
+ final_image = example.get_image()
554
+ final_image_filename = "example_diffray_final_image.png"
555
+ img.imsave(final_image_filename, final_image)
556
+ print(f"Saved the final image at `{final_image_filename}`")
557
+
558
+ anim = example.get_animation()
559
+ anim_filename = "example_diffray_animation.gif"
560
+ anim.save(anim_filename, dpi=300, writer=animation.PillowWriter(fps=5))
561
+ print(f"Saved the animation at `{anim_filename}`")