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,570 @@
1
+ # Licensed under the MIT License
2
+ # https://github.com/craigahobbs/unittest-parallel/blob/main/LICENSE
3
+
4
+ # SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
5
+ # SPDX-License-Identifier: Apache-2.0
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ """
20
+ unittest-parallel command-line script main module
21
+ """
22
+
23
+ import argparse
24
+ import concurrent.futures # NVIDIA Modification
25
+ import multiprocessing
26
+ import os
27
+ import sys
28
+ import tempfile
29
+ import time
30
+ import unittest
31
+ from contextlib import contextmanager
32
+ from io import StringIO
33
+
34
+ import warp.tests.unittest_suites # NVIDIA Modification
35
+ from warp.tests.unittest_utils import ( # NVIDIA modification
36
+ ParallelJunitTestResult,
37
+ write_junit_results,
38
+ )
39
+
40
+ try:
41
+ import coverage
42
+
43
+ COVERAGE_AVAILABLE = True # NVIDIA Modification
44
+ except ImportError:
45
+ COVERAGE_AVAILABLE = False # NVIDIA Modification
46
+
47
+
48
+ # The following variables are NVIDIA Modifications
49
+ START_DIRECTORY = os.path.dirname(__file__) # The directory to start test discovery
50
+
51
+
52
+ def main(argv=None):
53
+ """
54
+ unittest-parallel command-line script main entry point
55
+ """
56
+
57
+ # Command line arguments
58
+ parser = argparse.ArgumentParser(
59
+ prog="unittest-parallel",
60
+ # NVIDIA Modifications follow:
61
+ formatter_class=argparse.RawTextHelpFormatter,
62
+ epilog="""Example usage:
63
+ python -m warp.tests -s autodetect -p 'test_a*.py'
64
+ python -m warp.tests -s kit
65
+ python -m warp.tests -k 'mgpu' -k 'cuda'
66
+ """,
67
+ )
68
+ # parser.add_argument("-v", "--verbose", action="store_const", const=2, default=1, help="Verbose output")
69
+ parser.add_argument("-q", "--quiet", dest="verbose", action="store_const", const=0, default=2, help="Quiet output")
70
+ parser.add_argument("-f", "--failfast", action="store_true", default=False, help="Stop on first fail or error")
71
+ parser.add_argument(
72
+ "-b", "--buffer", action="store_true", default=False, help="Buffer stdout and stderr during tests"
73
+ )
74
+ parser.add_argument(
75
+ "-k",
76
+ dest="testNamePatterns",
77
+ action="append",
78
+ type=_convert_select_pattern,
79
+ help="Only run tests which match the given substring",
80
+ )
81
+ parser.add_argument(
82
+ "-p",
83
+ "--pattern",
84
+ metavar="PATTERN",
85
+ default="test*.py",
86
+ help="'autodetect' suite only: Pattern to match tests ('test*.py' default)", # NVIDIA Modification
87
+ )
88
+ parser.add_argument(
89
+ "-t",
90
+ "--top-level-directory",
91
+ metavar="TOP",
92
+ help="Top level directory of project (defaults to start directory)",
93
+ )
94
+ parser.add_argument(
95
+ "--junit-report-xml", metavar="FILE", help="Generate JUnit report format XML file"
96
+ ) # NVIDIA Modification
97
+ parser.add_argument(
98
+ "-s",
99
+ "--suite",
100
+ type=str,
101
+ default="default",
102
+ choices=["autodetect", "default", "kit"],
103
+ help="Name of the test suite to run (default is 'default').",
104
+ ) # NVIDIA Modification
105
+ group_parallel = parser.add_argument_group("parallelization options")
106
+ group_parallel.add_argument(
107
+ "-j",
108
+ "--jobs",
109
+ metavar="COUNT",
110
+ type=int,
111
+ default=0,
112
+ help="The number of test processes (default is 0, all cores)",
113
+ )
114
+ group_parallel.add_argument(
115
+ "-m",
116
+ "--maxjobs",
117
+ metavar="MAXCOUNT",
118
+ type=int,
119
+ default=8,
120
+ help="The maximum number of test processes (default is 8)",
121
+ ) # NVIDIA Modification
122
+ group_parallel.add_argument(
123
+ "--level",
124
+ choices=["module", "class", "test"],
125
+ default="class",
126
+ help="Set the test parallelism level (default is 'class')",
127
+ )
128
+ group_parallel.add_argument(
129
+ "--disable-process-pooling",
130
+ action="store_true",
131
+ default=False,
132
+ help="Do not reuse processes used to run test suites",
133
+ )
134
+ group_parallel.add_argument(
135
+ "--disable-concurrent-futures",
136
+ action="store_true",
137
+ default=False,
138
+ help="Use multiprocessing instead of concurrent.futures.",
139
+ ) # NVIDIA Modification
140
+ group_parallel.add_argument(
141
+ "--serial-fallback",
142
+ action="store_true",
143
+ default=False,
144
+ help="Run in a single-process (no spawning) mode without multiprocessing or concurrent.futures.",
145
+ ) # NVIDIA Modification
146
+ group_coverage = parser.add_argument_group("coverage options")
147
+ group_coverage.add_argument("--coverage", action="store_true", help="Run tests with coverage")
148
+ group_coverage.add_argument("--coverage-branch", action="store_true", help="Run tests with branch coverage")
149
+ group_coverage.add_argument(
150
+ "--coverage-html",
151
+ metavar="DIR",
152
+ help="Generate coverage HTML report",
153
+ default=os.path.join(START_DIRECTORY, "..", "..", "htmlcov"),
154
+ )
155
+ group_coverage.add_argument("--coverage-xml", metavar="FILE", help="Generate coverage XML report")
156
+ group_coverage.add_argument(
157
+ "--coverage-fail-under", metavar="MIN", type=float, help="Fail if coverage percentage under min"
158
+ )
159
+ group_warp = parser.add_argument_group("NVIDIA Warp options") # NVIDIA Modification
160
+ group_warp.add_argument(
161
+ "--no-shared-cache", action="store_true", help="Use a separate kernel cache per test process."
162
+ )
163
+ args = parser.parse_args(args=argv)
164
+
165
+ if args.coverage_branch:
166
+ args.coverage = args.coverage_branch
167
+
168
+ if args.coverage and not COVERAGE_AVAILABLE:
169
+ parser.exit(
170
+ status=2, message="--coverage was used, but coverage was not found. Is it installed?\n"
171
+ ) # NVIDIA Modification
172
+
173
+ process_count = max(0, args.jobs)
174
+ if process_count == 0:
175
+ process_count = multiprocessing.cpu_count()
176
+ process_count = min(process_count, args.maxjobs) # NVIDIA Modification
177
+
178
+ import warp as wp # NVIDIA Modification
179
+
180
+ # Clear the Warp cache (NVIDIA Modification)
181
+ wp.clear_lto_cache()
182
+ wp.clear_kernel_cache()
183
+ print("Cleared Warp kernel cache")
184
+
185
+ # Create the temporary directory (for coverage files)
186
+ with tempfile.TemporaryDirectory() as temp_dir:
187
+ # Discover tests
188
+ with _coverage(args, temp_dir):
189
+ test_loader = unittest.TestLoader()
190
+ if args.testNamePatterns:
191
+ test_loader.testNamePatterns = args.testNamePatterns
192
+
193
+ auto_discover_suite = warp.tests.unittest_suites.auto_discover_suite(
194
+ test_loader, args.pattern
195
+ ) # NVIDIA Modification
196
+
197
+ # NVIDIA Modification
198
+ if args.suite != "autodetect":
199
+ # Print notices for test classes missing from the suite when compared to auto-discovered tests
200
+ discover_suite = warp.tests.unittest_suites.compare_unittest_suites(
201
+ test_loader, args.suite, auto_discover_suite
202
+ )
203
+ else:
204
+ discover_suite = auto_discover_suite
205
+
206
+ # Get the parallelizable test suites
207
+ if args.level == "test":
208
+ test_suites = list(_iter_test_cases(discover_suite))
209
+ elif args.level == "class":
210
+ test_suites = list(_iter_class_suites(discover_suite))
211
+ else: # args.level == 'module'
212
+ test_suites = list(_iter_module_suites(discover_suite))
213
+
214
+ # Don't use more processes than test suites
215
+ process_count = max(1, min(len(test_suites), process_count))
216
+
217
+ if not args.serial_fallback:
218
+ # Report test suites and processes
219
+ print(
220
+ f"Running {len(test_suites)} test suites ({discover_suite.countTestCases()} total tests) across {process_count} processes",
221
+ file=sys.stderr,
222
+ )
223
+ if args.verbose > 1:
224
+ print(file=sys.stderr)
225
+
226
+ # Create the shared index object used in Warp caches (NVIDIA Modification)
227
+ manager = multiprocessing.Manager()
228
+ shared_index = manager.Value("i", -1)
229
+
230
+ # Run the tests in parallel
231
+ start_time = time.perf_counter()
232
+
233
+ if args.disable_concurrent_futures:
234
+ multiprocessing_context = multiprocessing.get_context(method="spawn")
235
+ maxtasksperchild = 1 if args.disable_process_pooling else None
236
+ with multiprocessing_context.Pool(
237
+ process_count,
238
+ maxtasksperchild=maxtasksperchild,
239
+ initializer=initialize_test_process,
240
+ initargs=(manager.Lock(), shared_index, args, temp_dir),
241
+ ) as pool:
242
+ test_manager = ParallelTestManager(manager, args, temp_dir)
243
+ results = pool.map(test_manager.run_tests, test_suites)
244
+ else:
245
+ # NVIDIA Modification added concurrent.futures
246
+ with concurrent.futures.ProcessPoolExecutor(
247
+ max_workers=process_count,
248
+ mp_context=multiprocessing.get_context(method="spawn"),
249
+ initializer=initialize_test_process,
250
+ initargs=(manager.Lock(), shared_index, args, temp_dir),
251
+ ) as executor:
252
+ test_manager = ParallelTestManager(manager, args, temp_dir)
253
+ results = list(executor.map(test_manager.run_tests, test_suites, timeout=2400))
254
+ else:
255
+ # This entire path is an NVIDIA Modification
256
+
257
+ # Report test suites and processes
258
+ print(f"Running {discover_suite.countTestCases()} total tests (serial fallback)", file=sys.stderr)
259
+ if args.verbose > 1:
260
+ print(file=sys.stderr)
261
+
262
+ # Run the tests in serial
263
+ start_time = time.perf_counter()
264
+
265
+ with multiprocessing.Manager() as manager:
266
+ test_manager = ParallelTestManager(manager, args, temp_dir)
267
+ results = [test_manager.run_tests(discover_suite)]
268
+
269
+ stop_time = time.perf_counter()
270
+ test_duration = stop_time - start_time
271
+
272
+ # Aggregate parallel test run results
273
+ tests_run = 0
274
+ errors = []
275
+ failures = []
276
+ skipped = 0
277
+ expected_failures = 0
278
+ unexpected_successes = 0
279
+ test_records = [] # NVIDIA Modification
280
+ for result in results:
281
+ tests_run += result[0]
282
+ errors.extend(result[1])
283
+ failures.extend(result[2])
284
+ skipped += result[3]
285
+ expected_failures += result[4]
286
+ unexpected_successes += result[5]
287
+ test_records += result[6] # NVIDIA Modification
288
+ is_success = not (errors or failures or unexpected_successes)
289
+
290
+ # Compute test info
291
+ infos = []
292
+ if failures:
293
+ infos.append(f"failures={len(failures)}")
294
+ if errors:
295
+ infos.append(f"errors={len(errors)}")
296
+ if skipped:
297
+ infos.append(f"skipped={skipped}")
298
+ if expected_failures:
299
+ infos.append(f"expected failures={expected_failures}")
300
+ if unexpected_successes:
301
+ infos.append(f"unexpected successes={unexpected_successes}")
302
+
303
+ # Report test errors
304
+ if errors or failures:
305
+ print(file=sys.stderr)
306
+ for error in errors:
307
+ print(error, file=sys.stderr)
308
+ for failure in failures:
309
+ print(failure, file=sys.stderr)
310
+ elif args.verbose > 0:
311
+ print(file=sys.stderr)
312
+
313
+ # Test report
314
+ print(unittest.TextTestResult.separator2, file=sys.stderr)
315
+ print(f"Ran {tests_run} {'tests' if tests_run > 1 else 'test'} in {test_duration:.3f}s", file=sys.stderr)
316
+ print(file=sys.stderr)
317
+ print(f"{'OK' if is_success else 'FAILED'}{' (' + ', '.join(infos) + ')' if infos else ''}", file=sys.stderr)
318
+
319
+ if test_records and args.junit_report_xml:
320
+ # NVIDIA modification to report results in Junit XML format
321
+ write_junit_results(
322
+ args.junit_report_xml,
323
+ test_records,
324
+ tests_run,
325
+ len(failures) + unexpected_successes,
326
+ len(errors),
327
+ skipped,
328
+ test_duration,
329
+ )
330
+
331
+ # Return an error status on failure
332
+ if not is_success:
333
+ parser.exit(status=len(errors) + len(failures) + unexpected_successes)
334
+
335
+ # Coverage?
336
+ if args.coverage:
337
+ # Combine the coverage files
338
+ cov_options = {}
339
+ cov_options["config_file"] = True # Grab configuration from pyproject.toml (must install coverage[toml])
340
+ cov = coverage.Coverage(**cov_options)
341
+ cov.combine(data_paths=[os.path.join(temp_dir, x) for x in os.listdir(temp_dir)])
342
+
343
+ # Coverage report
344
+ print(file=sys.stderr)
345
+ percent_covered = cov.report(ignore_errors=True, file=sys.stderr)
346
+ print(f"Total coverage is {percent_covered:.2f}%", file=sys.stderr)
347
+
348
+ # HTML coverage report
349
+ if args.coverage_html:
350
+ cov.html_report(directory=args.coverage_html, ignore_errors=True)
351
+
352
+ # XML coverage report
353
+ if args.coverage_xml:
354
+ cov.xml_report(outfile=args.coverage_xml, ignore_errors=True)
355
+
356
+ # Fail under
357
+ if args.coverage_fail_under and percent_covered < args.coverage_fail_under:
358
+ parser.exit(status=2)
359
+
360
+
361
+ def _convert_select_pattern(pattern):
362
+ if "*" not in pattern:
363
+ return f"*{pattern}*"
364
+ return pattern
365
+
366
+
367
+ @contextmanager
368
+ def _coverage(args, temp_dir):
369
+ # Running tests with coverage?
370
+ if args.coverage:
371
+ # Generate a random coverage data file name - file is deleted along with containing directory
372
+ with tempfile.NamedTemporaryFile(dir=temp_dir, delete=False) as coverage_file:
373
+ pass
374
+
375
+ # Create the coverage object
376
+ cov_options = {
377
+ "branch": args.coverage_branch,
378
+ "data_file": coverage_file.name,
379
+ # NVIDIA Modification removed unneeded options
380
+ }
381
+ cov_options["config_file"] = True # Grab configuration from pyproject.toml (must install coverage[toml])
382
+ cov = coverage.Coverage(**cov_options)
383
+ try:
384
+ # Start measuring code coverage
385
+ cov.start()
386
+
387
+ # Yield for unit test running
388
+ yield cov
389
+ finally:
390
+ # Stop measuring code coverage
391
+ cov.stop()
392
+
393
+ # Save the collected coverage data to the data file
394
+ cov.save()
395
+ else:
396
+ # Not running tests with coverage - yield for unit test running
397
+ yield None
398
+
399
+
400
+ # Iterate module-level test suites - all top-level test suites returned from TestLoader.discover
401
+ def _iter_module_suites(test_suite):
402
+ for module_suite in test_suite:
403
+ if module_suite.countTestCases():
404
+ yield module_suite
405
+
406
+
407
+ # Iterate class-level test suites - test suites that contains test cases
408
+ def _iter_class_suites(test_suite):
409
+ has_cases = any(isinstance(suite, unittest.TestCase) for suite in test_suite)
410
+ if has_cases:
411
+ yield test_suite
412
+ else:
413
+ for suite in test_suite:
414
+ yield from _iter_class_suites(suite)
415
+
416
+
417
+ # Iterate test cases (methods)
418
+ def _iter_test_cases(test_suite):
419
+ if isinstance(test_suite, unittest.TestCase):
420
+ yield test_suite
421
+ else:
422
+ for suite in test_suite:
423
+ yield from _iter_test_cases(suite)
424
+
425
+
426
+ class ParallelTestManager:
427
+ def __init__(self, manager, args, temp_dir):
428
+ self.args = args
429
+ self.temp_dir = temp_dir
430
+ self.failfast = manager.Event()
431
+
432
+ def run_tests(self, test_suite):
433
+ # Fail fast?
434
+ if self.failfast.is_set():
435
+ return [0, [], [], 0, 0, 0, []] # NVIDIA Modification
436
+
437
+ # NVIDIA Modification for GitLab
438
+ import warp.tests.unittest_utils
439
+
440
+ warp.tests.unittest_utils.coverage_enabled = self.args.coverage
441
+ warp.tests.unittest_utils.coverage_temp_dir = self.temp_dir
442
+ warp.tests.unittest_utils.coverage_branch = self.args.coverage_branch
443
+
444
+ if self.args.junit_report_xml:
445
+ resultclass = ParallelJunitTestResult
446
+ else:
447
+ resultclass = ParallelTextTestResult
448
+
449
+ # Run unit tests
450
+ with _coverage(self.args, self.temp_dir):
451
+ runner = unittest.TextTestRunner(
452
+ stream=StringIO(),
453
+ resultclass=resultclass, # NVIDIA Modification
454
+ verbosity=self.args.verbose,
455
+ failfast=self.args.failfast,
456
+ buffer=self.args.buffer,
457
+ )
458
+ result = runner.run(test_suite)
459
+
460
+ # Set failfast, if necessary
461
+ if result.shouldStop:
462
+ self.failfast.set()
463
+
464
+ # Return (test_count, errors, failures, skipped_count, expected_failure_count, unexpected_success_count)
465
+ return (
466
+ result.testsRun,
467
+ [self._format_error(result, error) for error in result.errors],
468
+ [self._format_error(result, failure) for failure in result.failures],
469
+ len(result.skipped),
470
+ len(result.expectedFailures),
471
+ len(result.unexpectedSuccesses),
472
+ result.test_record, # NVIDIA modification
473
+ )
474
+
475
+ @staticmethod
476
+ def _format_error(result, error):
477
+ return "\n".join(
478
+ [
479
+ unittest.TextTestResult.separator1,
480
+ result.getDescription(error[0]),
481
+ unittest.TextTestResult.separator2,
482
+ error[1],
483
+ ]
484
+ )
485
+
486
+
487
+ class ParallelTextTestResult(unittest.TextTestResult):
488
+ def __init__(self, stream, descriptions, verbosity):
489
+ stream = type(stream)(sys.stderr)
490
+ super().__init__(stream, descriptions, verbosity)
491
+ self.test_record = [] # NVIDIA modification
492
+
493
+ def startTest(self, test):
494
+ if self.showAll:
495
+ self.stream.writeln(f"{self.getDescription(test)} ...")
496
+ self.stream.flush()
497
+ super(unittest.TextTestResult, self).startTest(test)
498
+
499
+ def _add_helper(self, test, dots_message, show_all_message):
500
+ if self.showAll:
501
+ self.stream.writeln(f"{self.getDescription(test)} ... {show_all_message}")
502
+ elif self.dots:
503
+ self.stream.write(dots_message)
504
+ self.stream.flush()
505
+
506
+ def addSuccess(self, test):
507
+ super(unittest.TextTestResult, self).addSuccess(test)
508
+ self._add_helper(test, ".", "ok")
509
+
510
+ def addError(self, test, err):
511
+ super(unittest.TextTestResult, self).addError(test, err)
512
+ self._add_helper(test, "E", "ERROR")
513
+
514
+ def addFailure(self, test, err):
515
+ super(unittest.TextTestResult, self).addFailure(test, err)
516
+ self._add_helper(test, "F", "FAIL")
517
+
518
+ def addSkip(self, test, reason):
519
+ super(unittest.TextTestResult, self).addSkip(test, reason)
520
+ self._add_helper(test, "s", f"skipped {reason!r}")
521
+
522
+ def addExpectedFailure(self, test, err):
523
+ super(unittest.TextTestResult, self).addExpectedFailure(test, err)
524
+ self._add_helper(test, "x", "expected failure")
525
+
526
+ def addUnexpectedSuccess(self, test):
527
+ super(unittest.TextTestResult, self).addUnexpectedSuccess(test)
528
+ self._add_helper(test, "u", "unexpected success")
529
+
530
+ def printErrors(self):
531
+ pass
532
+
533
+
534
+ def initialize_test_process(lock, shared_index, args, temp_dir):
535
+ """Necessary operations to be executed at the start of every test process.
536
+
537
+ Currently this function can be used to set a separate Warp cache. (NVIDIA modification)
538
+ If the environment variable `WARP_CACHE_ROOT` is detected, the cache will be placed in the provided path.
539
+
540
+ It also ensures that Warp is initialized prior to running any tests.
541
+ """
542
+
543
+ with lock:
544
+ shared_index.value += 1
545
+ worker_index = shared_index.value
546
+
547
+ with _coverage(args, temp_dir):
548
+ import warp as wp
549
+
550
+ if args.no_shared_cache:
551
+ from warp.thirdparty import appdirs
552
+
553
+ if "WARP_CACHE_ROOT" in os.environ:
554
+ cache_root_dir = os.path.join(os.getenv("WARP_CACHE_ROOT"), f"{wp.config.version}-{worker_index:03d}")
555
+ else:
556
+ cache_root_dir = appdirs.user_cache_dir(
557
+ appname="warp", appauthor="NVIDIA", version=f"{wp.config.version}-{worker_index:03d}"
558
+ )
559
+
560
+ wp.config.kernel_cache_dir = cache_root_dir
561
+
562
+ wp.clear_lto_cache()
563
+ wp.clear_kernel_cache()
564
+ elif "WARP_CACHE_ROOT" in os.environ:
565
+ # Using a shared cache for all test processes
566
+ wp.config.kernel_cache_dir = os.path.join(os.getenv("WARP_CACHE_ROOT"), wp.config.version)
567
+
568
+
569
+ if __name__ == "__main__": # pragma: no cover
570
+ main()