warp-lang 1.7.0__py3-none-manylinux_2_34_aarch64.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,204 @@
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
+ import unittest
17
+
18
+ import numpy as np
19
+
20
+ import warp as wp
21
+ from warp.tests.unittest_utils import *
22
+
23
+
24
+ @wp.kernel
25
+ def mul_constant(x: wp.array(dtype=float), y: wp.array(dtype=float)):
26
+ tid = wp.tid()
27
+
28
+ y[tid] = x[tid] * 2.0
29
+
30
+
31
+ @wp.struct
32
+ class Multiplicands:
33
+ x: wp.array(dtype=float)
34
+ y: wp.array(dtype=float)
35
+
36
+
37
+ @wp.kernel
38
+ def mul_variable(mutiplicands: Multiplicands, z: wp.array(dtype=float)):
39
+ tid = wp.tid()
40
+
41
+ z[tid] = mutiplicands.x[tid] * mutiplicands.y[tid]
42
+
43
+
44
+ @wp.kernel
45
+ def dot_product(x: wp.array(dtype=float), y: wp.array(dtype=float), z: wp.array(dtype=float)):
46
+ tid = wp.tid()
47
+
48
+ wp.atomic_add(z, 0, x[tid] * y[tid])
49
+
50
+
51
+ def test_tape_mul_constant(test, device):
52
+ dim = 8
53
+ iters = 16
54
+ tape = wp.Tape()
55
+
56
+ # record onto tape
57
+ with tape:
58
+ # input data
59
+ x0 = wp.array(np.zeros(dim), dtype=wp.float32, device=device, requires_grad=True)
60
+ x = x0
61
+
62
+ for _i in range(iters):
63
+ y = wp.empty_like(x, requires_grad=True)
64
+ wp.launch(kernel=mul_constant, dim=dim, inputs=[x], outputs=[y], device=device)
65
+ x = y
66
+
67
+ # loss = wp.sum(x)
68
+ x.grad = wp.array(np.ones(dim), device=device, dtype=wp.float32)
69
+
70
+ # run backward
71
+ tape.backward()
72
+
73
+ # grad = 2.0^iters
74
+ assert_np_equal(tape.gradients[x0].numpy(), np.ones(dim) * (2**iters))
75
+
76
+
77
+ def test_tape_mul_variable(test, device):
78
+ dim = 8
79
+ tape = wp.Tape()
80
+
81
+ # record onto tape
82
+ with tape:
83
+ # input data (Note: We're intentionally testing structs in tapes here)
84
+ multiplicands = Multiplicands()
85
+ multiplicands.x = wp.array(np.ones(dim) * 16.0, dtype=wp.float32, device=device, requires_grad=True)
86
+ multiplicands.y = wp.array(np.ones(dim) * 32.0, dtype=wp.float32, device=device, requires_grad=True)
87
+ z = wp.zeros_like(multiplicands.x)
88
+
89
+ wp.launch(kernel=mul_variable, dim=dim, inputs=[multiplicands], outputs=[z], device=device)
90
+
91
+ # loss = wp.sum(x)
92
+ z.grad = wp.array(np.ones(dim), device=device, dtype=wp.float32)
93
+
94
+ # run backward
95
+ tape.backward()
96
+
97
+ # grad_x=y, grad_y=x
98
+ assert_np_equal(tape.gradients[multiplicands].x.numpy(), multiplicands.y.numpy())
99
+ assert_np_equal(tape.gradients[multiplicands].y.numpy(), multiplicands.x.numpy())
100
+
101
+ # run backward again with different incoming gradient
102
+ # should accumulate the same gradients again onto output
103
+ # so gradients = 2.0*prev
104
+ tape.backward()
105
+
106
+ assert_np_equal(tape.gradients[multiplicands].x.numpy(), multiplicands.y.numpy() * 2.0)
107
+ assert_np_equal(tape.gradients[multiplicands].y.numpy(), multiplicands.x.numpy() * 2.0)
108
+
109
+ # Clear launches and zero out the gradients
110
+ tape.reset()
111
+ assert_np_equal(tape.gradients[multiplicands].x.numpy(), np.zeros_like(tape.gradients[multiplicands].x.numpy()))
112
+ test.assertFalse(tape.launches)
113
+
114
+
115
+ def test_tape_dot_product(test, device):
116
+ dim = 8
117
+ tape = wp.Tape()
118
+
119
+ # record onto tape
120
+ with tape:
121
+ # input data
122
+ x = wp.array(np.ones(dim) * 16.0, dtype=wp.float32, device=device, requires_grad=True)
123
+ y = wp.array(np.ones(dim) * 32.0, dtype=wp.float32, device=device, requires_grad=True)
124
+ z = wp.zeros(n=1, dtype=wp.float32, device=device, requires_grad=True)
125
+
126
+ wp.launch(kernel=dot_product, dim=dim, inputs=[x, y], outputs=[z], device=device)
127
+
128
+ # scalar loss
129
+ tape.backward(loss=z)
130
+
131
+ # grad_x=y, grad_y=x
132
+ assert_np_equal(tape.gradients[x].numpy(), y.numpy())
133
+ assert_np_equal(tape.gradients[y].numpy(), x.numpy())
134
+
135
+
136
+ @wp.kernel
137
+ def assign_chain_kernel(x: wp.array(dtype=float), y: wp.array(dtype=float), z: wp.array(dtype=float)):
138
+ tid = wp.tid()
139
+ y[tid] = x[tid]
140
+ z[tid] = y[tid]
141
+
142
+
143
+ def test_tape_zero_multiple_outputs(test, device):
144
+ x = wp.array(np.arange(3), dtype=float, device=device, requires_grad=True)
145
+ y = wp.zeros_like(x)
146
+ z = wp.zeros_like(x)
147
+
148
+ tape = wp.Tape()
149
+ with tape:
150
+ wp.launch(assign_chain_kernel, dim=3, inputs=[x, y, z], device=device)
151
+
152
+ tape.backward(grads={y: wp.ones_like(x)})
153
+ assert_np_equal(x.grad.numpy(), np.ones(3, dtype=float))
154
+ tape.zero()
155
+
156
+ tape.backward(grads={z: wp.ones_like(x)})
157
+ assert_np_equal(x.grad.numpy(), np.ones(3, dtype=float))
158
+
159
+
160
+ def test_tape_visualize(test, device):
161
+ dim = 8
162
+ tape = wp.Tape()
163
+
164
+ # record onto tape
165
+ with tape:
166
+ # input data
167
+ x = wp.array(np.ones(dim) * 16.0, dtype=wp.float32, device=device, requires_grad=True)
168
+ y = wp.array(np.ones(dim) * 32.0, dtype=wp.float32, device=device, requires_grad=True)
169
+ z = wp.zeros(n=1, dtype=wp.float32, device=device, requires_grad=True)
170
+
171
+ tape.record_scope_begin("my loop")
172
+ for _ in range(16):
173
+ wp.launch(kernel=dot_product, dim=dim, inputs=[x, y], outputs=[z], device=device)
174
+ tape.record_scope_end()
175
+
176
+ # generate GraphViz diagram code
177
+ dot_code = tape.visualize(simplify_graph=True)
178
+
179
+ assert "repeated 16x" in dot_code
180
+ assert "my loop" in dot_code
181
+ assert dot_code.count("dot_product") == 1
182
+
183
+
184
+ devices = get_test_devices()
185
+
186
+
187
+ class TestTape(unittest.TestCase):
188
+ def test_tape_no_nested_tapes(self):
189
+ with self.assertRaises(RuntimeError):
190
+ with wp.Tape():
191
+ with wp.Tape():
192
+ pass
193
+
194
+
195
+ add_function_test(TestTape, "test_tape_mul_constant", test_tape_mul_constant, devices=devices)
196
+ add_function_test(TestTape, "test_tape_mul_variable", test_tape_mul_variable, devices=devices)
197
+ add_function_test(TestTape, "test_tape_dot_product", test_tape_dot_product, devices=devices)
198
+ add_function_test(TestTape, "test_tape_zero_multiple_outputs", test_tape_zero_multiple_outputs, devices=devices)
199
+ add_function_test(TestTape, "test_tape_visualize", test_tape_visualize, devices=devices)
200
+
201
+
202
+ if __name__ == "__main__":
203
+ wp.clear_kernel_cache()
204
+ unittest.main(verbosity=2)
@@ -0,0 +1,93 @@
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
+ import os
17
+ import tempfile
18
+ import unittest
19
+ from importlib import util
20
+
21
+ import warp as wp
22
+ from warp.tests.unittest_utils import *
23
+
24
+ CODE = """# -*- coding: utf-8 -*-
25
+
26
+ import warp as wp
27
+
28
+ @wp.struct
29
+ class Data:
30
+ x: wp.array(dtype=int)
31
+
32
+ @wp.func
33
+ def increment(x: int):
34
+ # This shouldn't be picked up.
35
+ return x + 123
36
+
37
+ @wp.func
38
+ def increment(x: int):
39
+ return x + 1
40
+
41
+ @wp.kernel
42
+ def compute(data: Data):
43
+ data.x[0] = increment(data.x[0])
44
+ """
45
+
46
+
47
+ def load_code_as_module(code, name):
48
+ file, file_path = tempfile.mkstemp(suffix=".py")
49
+
50
+ try:
51
+ with os.fdopen(file, "w") as f:
52
+ f.write(code)
53
+
54
+ spec = util.spec_from_file_location(name, file_path)
55
+ module = util.module_from_spec(spec)
56
+ spec.loader.exec_module(module)
57
+ finally:
58
+ os.remove(file_path)
59
+
60
+ return module
61
+
62
+
63
+ def test_transient_module(test, device):
64
+ module = load_code_as_module(CODE, "")
65
+ # Loading it a second time shouldn't be an issue.
66
+ module = load_code_as_module(CODE, "")
67
+
68
+ assert len(module.compute.module.structs) == 1
69
+ assert len(module.compute.module.functions) == 1
70
+
71
+ data = module.Data()
72
+ data.x = wp.array([123], dtype=int, device=device)
73
+
74
+ wp.set_module_options({"foo": "bar"}, module=module)
75
+ assert wp.get_module_options(module=module).get("foo") == "bar"
76
+ assert module.compute.module.options.get("foo") == "bar"
77
+
78
+ wp.launch(module.compute, dim=1, inputs=[data], device=device)
79
+ assert_np_equal(data.x.numpy(), np.array([124]))
80
+
81
+
82
+ devices = get_test_devices()
83
+
84
+
85
+ class TestTransientModule(unittest.TestCase):
86
+ pass
87
+
88
+
89
+ add_function_test(TestTransientModule, "test_transient_module", test_transient_module, devices=devices)
90
+
91
+ if __name__ == "__main__":
92
+ wp.clear_kernel_cache()
93
+ unittest.main(verbosity=2)
@@ -0,0 +1,145 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2024 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
+ import unittest
17
+
18
+ from warp.sim.collide import triangle_closest_point_barycentric
19
+ from warp.tests.unittest_utils import *
20
+
21
+
22
+ # a-b is the edge where the closest point is located at
23
+ @wp.func
24
+ def check_edge_feasible_region(p: wp.vec3, a: wp.vec3, b: wp.vec3, c: wp.vec3, eps: float):
25
+ ap = p - a
26
+ bp = p - b
27
+ ab = b - a
28
+
29
+ if wp.dot(ap, ab) < -eps:
30
+ return False
31
+
32
+ if wp.dot(bp, ab) > eps:
33
+ return False
34
+
35
+ ab_sqr_norm = wp.dot(ab, ab)
36
+ if ab_sqr_norm < eps:
37
+ return False
38
+
39
+ t = wp.dot(ab, c - a) / ab_sqr_norm
40
+
41
+ perpendicular_foot = a + t * ab
42
+
43
+ if wp.dot(c - perpendicular_foot, p - perpendicular_foot) > eps:
44
+ return False
45
+
46
+ return True
47
+
48
+
49
+ # closest point is a
50
+ @wp.func
51
+ def check_vertex_feasible_region(p: wp.vec3, a: wp.vec3, b: wp.vec3, c: wp.vec3, eps: float):
52
+ ap = p - a
53
+ ba = a - b
54
+ ca = a - c
55
+
56
+ if wp.dot(ap, ba) < -eps:
57
+ return False
58
+
59
+ if wp.dot(p, ca) < -eps:
60
+ return False
61
+
62
+ return True
63
+
64
+
65
+ @wp.kernel
66
+ def test_triangle_closest_point_kernel(tri: wp.array(dtype=wp.vec3), passed: wp.array(dtype=wp.bool)):
67
+ state = wp.uint32(wp.rand_init(wp.int32(123), wp.int32(0)))
68
+ eps = 1e-5
69
+
70
+ a = tri[0]
71
+ b = tri[1]
72
+ c = tri[2]
73
+
74
+ for _i in range(1000):
75
+ l = wp.float32(0.0)
76
+ while l < eps:
77
+ p = wp.vec3(wp.randn(state), wp.randn(state), wp.randn(state))
78
+ l = wp.length(p)
79
+
80
+ # project to a sphere with r=2
81
+ p = 2.0 * p / l
82
+
83
+ bary = triangle_closest_point_barycentric(tri[0], tri[1], tri[2], p)
84
+
85
+ for dim in range(3):
86
+ v1_index = (dim + 1) % 3
87
+ v2_index = (dim + 2) % 3
88
+ v1 = tri[v1_index]
89
+ v2 = tri[v2_index]
90
+ v3 = tri[dim]
91
+
92
+ # on edge
93
+ if bary[dim] == 0.0 and bary[v1_index] != 0.0 and bary[v2_index] != 0.0:
94
+ if not check_edge_feasible_region(p, v1, v2, v3, eps):
95
+ passed[0] = False
96
+ return
97
+
98
+ # p-closest_p must be perpendicular to v1-v2
99
+ closest_p = a * bary[0] + b * bary[1] + c * bary[2]
100
+ e = v1 - v2
101
+ err = wp.dot(e, closest_p - p)
102
+ if wp.abs(err) > eps:
103
+ passed[0] = False
104
+ return
105
+
106
+ if bary[v1_index] == 0.0 and bary[v2_index] == 0.0:
107
+ if not check_vertex_feasible_region(p, v3, v1, v2, eps):
108
+ passed[0] = False
109
+ return
110
+
111
+ if bary[dim] != 0.0 and bary[v1_index] != 0.0 and bary[v2_index] != 0.0:
112
+ closest_p = a * bary[0] + b * bary[1] + c * bary[2]
113
+ e1 = v1 - v2
114
+ e2 = v1 - v3
115
+ if wp.abs(wp.dot(e1, closest_p - p)) > eps or wp.abs(wp.dot(e2, closest_p - p)) > eps:
116
+ passed[0] = False
117
+ return
118
+
119
+
120
+ def test_triangle_closest_point(test, device):
121
+ passed = wp.array([True], dtype=wp.bool, device=device)
122
+
123
+ a = wp.vec3(1.0, 0.0, 0.0)
124
+ b = wp.vec3(0.0, 0.0, 0.0)
125
+ c = wp.vec3(0.0, 1.0, 0.0)
126
+
127
+ tri = wp.array([a, b, c], dtype=wp.vec3, device=device)
128
+ wp.launch(test_triangle_closest_point_kernel, dim=1, inputs=[tri, passed], device=device)
129
+ passed = passed.numpy()
130
+
131
+ test.assertTrue(passed.all())
132
+
133
+
134
+ devices = get_test_devices()
135
+
136
+
137
+ class TestTriangleClosestPoint(unittest.TestCase):
138
+ pass
139
+
140
+
141
+ add_function_test(TestTriangleClosestPoint, "test_triangle_closest_point", test_triangle_closest_point, devices=devices)
142
+
143
+ if __name__ == "__main__":
144
+ wp.clear_kernel_cache()
145
+ unittest.main(verbosity=2)