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,156 @@
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
+ import unittest
17
+
18
+ import numpy as np
19
+
20
+ import warp as wp
21
+ from warp.tests.unittest_utils import *
22
+ from warp.utils import array_inner, array_sum
23
+
24
+
25
+ def make_test_array_sum(dtype):
26
+ N = 1000
27
+
28
+ def test_array_sum(test, device):
29
+ rng = np.random.default_rng(123)
30
+
31
+ cols = wp.types.type_length(dtype)
32
+
33
+ values_np = rng.random(size=(N, cols))
34
+ values = wp.array(values_np, device=device, dtype=dtype)
35
+
36
+ vsum = array_sum(values)
37
+ ref_vsum = values_np.sum(axis=0)
38
+
39
+ assert_np_equal(vsum / N, ref_vsum / N, 0.0001)
40
+
41
+ return test_array_sum
42
+
43
+
44
+ def make_test_array_sum_axis(dtype):
45
+ I = 5
46
+ J = 10
47
+ K = 2
48
+
49
+ N = I * J * K
50
+
51
+ def test_array_sum(test, device):
52
+ rng = np.random.default_rng(123)
53
+
54
+ values_np = rng.random(size=(I, J, K))
55
+ values = wp.array(values_np, shape=(I, J, K), device=device, dtype=dtype)
56
+
57
+ for axis in range(3):
58
+ vsum = array_sum(values, axis=axis)
59
+ ref_vsum = values_np.sum(axis=axis)
60
+
61
+ assert_np_equal(vsum.numpy() / N, ref_vsum / N, 0.0001)
62
+
63
+ return test_array_sum
64
+
65
+
66
+ def test_array_sum_empty(test, device):
67
+ values = wp.array([], device=device, dtype=wp.vec2)
68
+ assert_np_equal(array_sum(values), np.zeros(2))
69
+
70
+ values = wp.array([], shape=(0, 3), device=device, dtype=float)
71
+ assert_np_equal(array_sum(values, axis=0).numpy(), np.zeros((1, 3)))
72
+
73
+
74
+ def make_test_array_inner(dtype):
75
+ N = 1000
76
+
77
+ def test_array_inner(test, device):
78
+ rng = np.random.default_rng(123)
79
+
80
+ cols = wp.types.type_length(dtype)
81
+
82
+ a_np = rng.random(size=(N, cols))
83
+ b_np = rng.random(size=(N, cols))
84
+
85
+ a = wp.array(a_np, device=device, dtype=dtype)
86
+ b = wp.array(b_np, device=device, dtype=dtype)
87
+
88
+ ab = array_inner(a, b)
89
+ ref_ab = np.dot(a_np.flatten(), b_np.flatten())
90
+
91
+ test.assertAlmostEqual(ab / N, ref_ab / N, places=5)
92
+
93
+ return test_array_inner
94
+
95
+
96
+ def make_test_array_inner_axis(dtype):
97
+ I = 5
98
+ J = 10
99
+ K = 2
100
+
101
+ N = I * J * K
102
+
103
+ def test_array_inner(test, device):
104
+ rng = np.random.default_rng(123)
105
+
106
+ a_np = rng.random(size=(I, J, K))
107
+ b_np = rng.random(size=(I, J, K))
108
+
109
+ a = wp.array(a_np, shape=(I, J, K), device=device, dtype=dtype)
110
+ b = wp.array(b_np, shape=(I, J, K), device=device, dtype=dtype)
111
+
112
+ ab = array_inner(a, b, axis=0)
113
+ ref_ab = np.einsum(a_np, [0, 1, 2], b_np, [0, 1, 2], [1, 2])
114
+ assert_np_equal(ab.numpy() / N, ref_ab / N, 0.0001)
115
+
116
+ ab = array_inner(a, b, axis=1)
117
+ ref_ab = np.einsum(a_np, [0, 1, 2], b_np, [0, 1, 2], [0, 2])
118
+ assert_np_equal(ab.numpy() / N, ref_ab / N, 0.0001)
119
+
120
+ ab = array_inner(a, b, axis=2)
121
+ ref_ab = np.einsum(a_np, [0, 1, 2], b_np, [0, 1, 2], [0, 1])
122
+ assert_np_equal(ab.numpy() / N, ref_ab / N, 0.0001)
123
+
124
+ return test_array_inner
125
+
126
+
127
+ def test_array_inner_empty(test, device):
128
+ values = wp.array([], device=device, dtype=wp.vec2)
129
+ test.assertEqual(array_inner(values, values), 0.0)
130
+
131
+ values = wp.array([], shape=(0, 3), device=device, dtype=float)
132
+ assert_np_equal(array_inner(values, values, axis=0).numpy(), np.zeros((1, 3)))
133
+
134
+
135
+ devices = get_test_devices()
136
+
137
+
138
+ class TestArrayReduce(unittest.TestCase):
139
+ pass
140
+
141
+
142
+ add_function_test(TestArrayReduce, "test_array_sum_double", make_test_array_sum(wp.float64), devices=devices)
143
+ add_function_test(TestArrayReduce, "test_array_sum_vec3", make_test_array_sum(wp.vec3), devices=devices)
144
+ add_function_test(TestArrayReduce, "test_array_sum_axis_float", make_test_array_sum_axis(wp.float32), devices=devices)
145
+ add_function_test(TestArrayReduce, "test_array_sum_empty", test_array_sum_empty, devices=devices)
146
+ add_function_test(TestArrayReduce, "test_array_inner_double", make_test_array_inner(wp.float64), devices=devices)
147
+ add_function_test(TestArrayReduce, "test_array_inner_vec3", make_test_array_inner(wp.vec3), devices=devices)
148
+ add_function_test(
149
+ TestArrayReduce, "test_array_inner_axis_float", make_test_array_inner_axis(wp.float32), devices=devices
150
+ )
151
+ add_function_test(TestArrayReduce, "test_array_inner_empty", test_array_inner_empty, devices=devices)
152
+
153
+
154
+ if __name__ == "__main__":
155
+ wp.clear_kernel_cache()
156
+ unittest.main(verbosity=2)
@@ -0,0 +1,250 @@
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
+ import warp as wp
19
+ from warp.tests.unittest_utils import *
20
+
21
+
22
+ @wp.kernel
23
+ def expect_ones(a: wp.array(dtype=int)):
24
+ i = wp.tid()
25
+
26
+ assert a[i] == 1
27
+
28
+
29
+ @wp.kernel
30
+ def expect_ones_with_msg(a: wp.array(dtype=int)):
31
+ i = wp.tid()
32
+
33
+ assert a[i] == 1, "Array element must be 1"
34
+
35
+
36
+ @wp.kernel
37
+ def expect_ones_compound(a: wp.array(dtype=int)):
38
+ i = wp.tid()
39
+
40
+ assert a[i] > 0 and a[i] < 2
41
+
42
+
43
+ @wp.func
44
+ def expect_ones_function(value: int):
45
+ assert value == 1, "Array element must be 1"
46
+
47
+
48
+ @wp.kernel
49
+ def expect_ones_call_function(a: wp.array(dtype=int)):
50
+ i = wp.tid()
51
+ expect_ones_function(a[i])
52
+
53
+
54
+ class TestAssertRelease(unittest.TestCase):
55
+ """Assert test cases that are to be run with Warp in release mode."""
56
+
57
+ @classmethod
58
+ def setUpClass(cls):
59
+ cls._saved_mode = wp.get_module_options()["mode"]
60
+ cls._saved_cache_kernels = wp.config.cache_kernels
61
+
62
+ wp.config.mode = "release"
63
+ wp.config.cache_kernels = False
64
+
65
+ @classmethod
66
+ def tearDownClass(cls):
67
+ wp.set_module_options({"mode": cls._saved_mode})
68
+ wp.config.cache_kernels = cls._saved_cache_kernels
69
+
70
+ def test_basic_assert_false_condition(self):
71
+ with wp.ScopedDevice("cpu"):
72
+ wp.load_module(device=wp.get_device())
73
+
74
+ input_array = wp.zeros(1, dtype=int)
75
+
76
+ capture = StdErrCapture()
77
+ capture.begin()
78
+
79
+ wp.launch(expect_ones, input_array.shape, inputs=[input_array])
80
+
81
+ output = capture.end()
82
+
83
+ self.assertEqual(output, "", f"Kernel should not print anything to stderr, got {output}")
84
+
85
+ def test_basic_assert_with_msg(self):
86
+ with wp.ScopedDevice("cpu"):
87
+ wp.load_module(device=wp.get_device())
88
+
89
+ input_array = wp.zeros(1, dtype=int)
90
+
91
+ capture = StdErrCapture()
92
+ capture.begin()
93
+
94
+ wp.launch(expect_ones_with_msg, input_array.shape, inputs=[input_array])
95
+
96
+ output = capture.end()
97
+
98
+ self.assertEqual(output, "", f"Kernel should not print anything to stderr, got {output}")
99
+
100
+ def test_compound_assert_false_condition(self):
101
+ with wp.ScopedDevice("cpu"):
102
+ wp.load_module(device=wp.get_device())
103
+
104
+ input_array = wp.full(1, value=3, dtype=int)
105
+
106
+ capture = StdErrCapture()
107
+ capture.begin()
108
+
109
+ wp.launch(expect_ones_compound, input_array.shape, inputs=[input_array])
110
+
111
+ output = capture.end()
112
+
113
+ self.assertEqual(output, "", f"Kernel should not print anything to stderr, got {output}")
114
+
115
+ def test_basic_assert_false_condition_function(self):
116
+ with wp.ScopedDevice("cpu"):
117
+ wp.load_module(device=wp.get_device())
118
+
119
+ input_array = wp.full(1, value=3, dtype=int)
120
+
121
+ capture = StdErrCapture()
122
+ capture.begin()
123
+
124
+ wp.launch(expect_ones_call_function, input_array.shape, inputs=[input_array])
125
+
126
+ output = capture.end()
127
+
128
+ self.assertEqual(output, "", f"Kernel should not print anything to stderr, got {output}")
129
+
130
+
131
+ # NOTE: Failed assertions on CUDA devices leaves the CUDA context in an unrecoverable state,
132
+ # so we currently do not test them.
133
+ class TestAssertDebug(unittest.TestCase):
134
+ """Assert test cases that are to be run with Warp in debug mode."""
135
+
136
+ @classmethod
137
+ def setUpClass(cls):
138
+ cls._saved_mode = wp.get_module_options()["mode"]
139
+ cls._saved_cache_kernels = wp.config.cache_kernels
140
+
141
+ wp.set_module_options({"mode": "debug"})
142
+ wp.config.cache_kernels = False
143
+
144
+ @classmethod
145
+ def tearDownClass(cls):
146
+ wp.set_module_options({"mode": cls._saved_mode})
147
+ wp.config.cache_kernels = cls._saved_cache_kernels
148
+
149
+ def test_basic_assert_false_condition(self):
150
+ with wp.ScopedDevice("cpu"):
151
+ wp.load_module(device=wp.get_device())
152
+
153
+ input_array = wp.zeros(1, dtype=int)
154
+
155
+ capture = StdErrCapture()
156
+ capture.begin()
157
+
158
+ wp.launch(expect_ones, input_array.shape, inputs=[input_array])
159
+
160
+ output = capture.end()
161
+
162
+ # Older Windows C runtimes have a bug where stdout sometimes does not get properly flushed.
163
+ if output != "" or sys.platform != "win32":
164
+ self.assertRegex(output, r"Assertion failed: .*assert a\[i\] == 1")
165
+
166
+ def test_basic_assert_true_condition(self):
167
+ with wp.ScopedDevice("cpu"):
168
+ wp.load_module(device=wp.get_device())
169
+
170
+ input_array = wp.ones(1, dtype=int)
171
+
172
+ capture = StdErrCapture()
173
+ capture.begin()
174
+
175
+ wp.launch(expect_ones, input_array.shape, inputs=[input_array])
176
+
177
+ output = capture.end()
178
+
179
+ self.assertEqual(output, "", f"Kernel should not print anything to stderr, got {output}")
180
+
181
+ def test_basic_assert_with_msg(self):
182
+ with wp.ScopedDevice("cpu"):
183
+ wp.load_module(device=wp.get_device())
184
+
185
+ input_array = wp.zeros(1, dtype=int)
186
+
187
+ capture = StdErrCapture()
188
+ capture.begin()
189
+
190
+ wp.launch(expect_ones_with_msg, input_array.shape, inputs=[input_array])
191
+
192
+ output = capture.end()
193
+
194
+ # Older Windows C runtimes have a bug where stdout sometimes does not get properly flushed.
195
+ if output != "" or sys.platform != "win32":
196
+ self.assertRegex(output, r"Assertion failed: .*assert a\[i\] == 1.*Array element must be 1")
197
+
198
+ def test_compound_assert_true_condition(self):
199
+ with wp.ScopedDevice("cpu"):
200
+ wp.load_module(device=wp.get_device())
201
+
202
+ input_array = wp.ones(1, dtype=int)
203
+
204
+ capture = StdErrCapture()
205
+ capture.begin()
206
+
207
+ wp.launch(expect_ones_compound, input_array.shape, inputs=[input_array])
208
+
209
+ output = capture.end()
210
+
211
+ self.assertEqual(output, "", f"Kernel should not print anything to stderr, got {output}")
212
+
213
+ def test_compound_assert_false_condition(self):
214
+ with wp.ScopedDevice("cpu"):
215
+ wp.load_module(device=wp.get_device())
216
+
217
+ input_array = wp.full(1, value=3, dtype=int)
218
+
219
+ capture = StdErrCapture()
220
+ capture.begin()
221
+
222
+ wp.launch(expect_ones_compound, input_array.shape, inputs=[input_array])
223
+
224
+ output = capture.end()
225
+
226
+ # Older Windows C runtimes have a bug where stdout sometimes does not get properly flushed.
227
+ if output != "" or sys.platform != "win32":
228
+ self.assertRegex(output, r"Assertion failed: .*assert a\[i\] > 0 and a\[i\] < 2")
229
+
230
+ def test_basic_assert_false_condition_function(self):
231
+ with wp.ScopedDevice("cpu"):
232
+ wp.load_module(device=wp.get_device())
233
+
234
+ input_array = wp.full(1, value=3, dtype=int)
235
+
236
+ capture = StdErrCapture()
237
+ capture.begin()
238
+
239
+ wp.launch(expect_ones_call_function, input_array.shape, inputs=[input_array])
240
+
241
+ output = capture.end()
242
+
243
+ # Older Windows C runtimes have a bug where stdout sometimes does not get properly flushed.
244
+ if output != "" or sys.platform != "win32":
245
+ self.assertRegex(output, r"Assertion failed: .*assert value == 1.*Array element must be 1")
246
+
247
+
248
+ if __name__ == "__main__":
249
+ wp.clear_kernel_cache()
250
+ unittest.main(verbosity=2)
@@ -0,0 +1,153 @@
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
+ # construct kernel + test function for atomic ops on each vec/matrix type
25
+ def make_atomic_test(type):
26
+ def test_atomic_kernel(
27
+ out_add: wp.array(dtype=type),
28
+ out_min: wp.array(dtype=type),
29
+ out_max: wp.array(dtype=type),
30
+ val: wp.array(dtype=type),
31
+ ):
32
+ tid = wp.tid()
33
+
34
+ wp.atomic_add(out_add, 0, val[tid])
35
+ wp.atomic_min(out_min, 0, val[tid])
36
+ wp.atomic_max(out_max, 0, val[tid])
37
+
38
+ # register a custom kernel (no decorator) function
39
+ # this lets us register the same function definition
40
+ # against multiple symbols, with different arg types
41
+ kernel = wp.Kernel(func=test_atomic_kernel, key=f"test_atomic_{type.__name__}_kernel")
42
+
43
+ def test_atomic(test, device):
44
+ n = 1024
45
+
46
+ rng = np.random.default_rng(42)
47
+
48
+ if type == wp.int32:
49
+ base = (rng.random(size=1, dtype=np.float32) * 100.0).astype(np.int32)
50
+ val = (rng.random(size=n, dtype=np.float32) * 100.0).astype(np.int32)
51
+
52
+ elif type == wp.float32:
53
+ base = rng.random(size=1, dtype=np.float32)
54
+ val = rng.random(size=n, dtype=np.float32)
55
+
56
+ elif type == wp.float64:
57
+ base = rng.random(size=1, dtype=np.float64)
58
+ val = rng.random(size=n, dtype=np.float64)
59
+
60
+ else:
61
+ base = rng.random(size=(1, *type._shape_), dtype=float)
62
+ val = rng.random(size=(n, *type._shape_), dtype=float)
63
+
64
+ add_array = wp.array(base, dtype=type, device=device, requires_grad=True)
65
+ min_array = wp.array(base, dtype=type, device=device, requires_grad=True)
66
+ max_array = wp.array(base, dtype=type, device=device, requires_grad=True)
67
+ add_array.zero_()
68
+ min_array.fill_(10000)
69
+ max_array.fill_(-10000)
70
+
71
+ val_array = wp.array(val, dtype=type, device=device, requires_grad=True)
72
+
73
+ tape = wp.Tape()
74
+ with tape:
75
+ wp.launch(kernel, n, inputs=[add_array, min_array, max_array, val_array], device=device)
76
+
77
+ assert_np_equal(add_array.numpy(), np.sum(val, axis=0), tol=1.0e-2)
78
+ assert_np_equal(min_array.numpy(), np.min(val, axis=0), tol=1.0e-2)
79
+ assert_np_equal(max_array.numpy(), np.max(val, axis=0), tol=1.0e-2)
80
+
81
+ if type != wp.int32:
82
+ add_array.grad.fill_(1)
83
+ tape.backward()
84
+ assert_np_equal(val_array.grad.numpy(), np.ones_like(val))
85
+ tape.zero()
86
+
87
+ min_array.grad.fill_(1)
88
+ tape.backward()
89
+ min_grad_array = np.zeros_like(val)
90
+ argmin = val.argmin(axis=0)
91
+ if val.ndim == 1:
92
+ min_grad_array[argmin] = 1
93
+ elif val.ndim == 2:
94
+ for i in range(val.shape[1]):
95
+ min_grad_array[argmin[i], i] = 1
96
+ elif val.ndim == 3:
97
+ for i in range(val.shape[1]):
98
+ for j in range(val.shape[2]):
99
+ min_grad_array[argmin[i, j], i, j] = 1
100
+ assert_np_equal(val_array.grad.numpy(), min_grad_array)
101
+ tape.zero()
102
+
103
+ max_array.grad.fill_(1)
104
+ tape.backward()
105
+ max_grad_array = np.zeros_like(val)
106
+ argmax = val.argmax(axis=0)
107
+ if val.ndim == 1:
108
+ max_grad_array[argmax] = 1
109
+ elif val.ndim == 2:
110
+ for i in range(val.shape[1]):
111
+ max_grad_array[argmax[i], i] = 1
112
+ elif val.ndim == 3:
113
+ for i in range(val.shape[1]):
114
+ for j in range(val.shape[2]):
115
+ max_grad_array[argmax[i, j], i, j] = 1
116
+ assert_np_equal(val_array.grad.numpy(), max_grad_array)
117
+
118
+ return test_atomic
119
+
120
+
121
+ # generate test functions for atomic types
122
+ test_atomic_int = make_atomic_test(wp.int32)
123
+ test_atomic_float = make_atomic_test(wp.float32)
124
+ test_atomic_double = make_atomic_test(wp.float64)
125
+ test_atomic_vec2 = make_atomic_test(wp.vec2)
126
+ test_atomic_vec3 = make_atomic_test(wp.vec3)
127
+ test_atomic_vec4 = make_atomic_test(wp.vec4)
128
+ test_atomic_mat22 = make_atomic_test(wp.mat22)
129
+ test_atomic_mat33 = make_atomic_test(wp.mat33)
130
+ test_atomic_mat44 = make_atomic_test(wp.mat44)
131
+
132
+
133
+ devices = get_test_devices()
134
+
135
+
136
+ class TestAtomic(unittest.TestCase):
137
+ pass
138
+
139
+
140
+ add_function_test(TestAtomic, "test_atomic_int", test_atomic_int, devices=devices)
141
+ add_function_test(TestAtomic, "test_atomic_float", test_atomic_float, devices=devices)
142
+ add_function_test(TestAtomic, "test_atomic_double", test_atomic_double, devices=devices)
143
+ add_function_test(TestAtomic, "test_atomic_vec2", test_atomic_vec2, devices=devices)
144
+ add_function_test(TestAtomic, "test_atomic_vec3", test_atomic_vec3, devices=devices)
145
+ add_function_test(TestAtomic, "test_atomic_vec4", test_atomic_vec4, devices=devices)
146
+ add_function_test(TestAtomic, "test_atomic_mat22", test_atomic_mat22, devices=devices)
147
+ add_function_test(TestAtomic, "test_atomic_mat33", test_atomic_mat33, devices=devices)
148
+ add_function_test(TestAtomic, "test_atomic_mat44", test_atomic_mat44, devices=devices)
149
+
150
+
151
+ if __name__ == "__main__":
152
+ wp.clear_kernel_cache()
153
+ unittest.main(verbosity=2)