warp-lang 1.6.1__py3-none-macosx_10_13_universal2.whl → 1.7.0__py3-none-macosx_10_13_universal2.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 (401) hide show
  1. warp/__init__.py +21 -7
  2. warp/autograd.py +14 -6
  3. warp/bin/libwarp-clang.dylib +0 -0
  4. warp/bin/libwarp.dylib +0 -0
  5. warp/build.py +424 -6
  6. warp/build_dll.py +20 -20
  7. warp/builtins.py +467 -368
  8. warp/codegen.py +193 -125
  9. warp/config.py +56 -12
  10. warp/constants.py +14 -6
  11. warp/context.py +524 -277
  12. warp/dlpack.py +22 -12
  13. warp/examples/__init__.py +14 -6
  14. warp/examples/assets/nonuniform.usd +0 -0
  15. warp/examples/assets/nvidia_logo.png +0 -0
  16. warp/examples/benchmarks/benchmark_api.py +14 -6
  17. warp/examples/benchmarks/benchmark_cloth.py +14 -6
  18. warp/examples/benchmarks/benchmark_cloth_cupy.py +14 -6
  19. warp/examples/benchmarks/benchmark_cloth_jax.py +14 -6
  20. warp/examples/benchmarks/benchmark_cloth_numba.py +15 -0
  21. warp/examples/benchmarks/benchmark_cloth_numpy.py +14 -6
  22. warp/examples/benchmarks/benchmark_cloth_paddle.py +14 -6
  23. warp/examples/benchmarks/benchmark_cloth_pytorch.py +14 -6
  24. warp/examples/benchmarks/benchmark_cloth_taichi.py +14 -6
  25. warp/examples/benchmarks/benchmark_cloth_warp.py +14 -6
  26. warp/examples/benchmarks/benchmark_gemm.py +82 -48
  27. warp/examples/benchmarks/benchmark_interop_paddle.py +14 -6
  28. warp/examples/benchmarks/benchmark_interop_torch.py +14 -6
  29. warp/examples/benchmarks/benchmark_launches.py +14 -6
  30. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  31. warp/examples/browse.py +14 -6
  32. warp/examples/core/example_cupy.py +14 -6
  33. warp/examples/core/example_dem.py +14 -6
  34. warp/examples/core/example_fluid.py +14 -6
  35. warp/examples/core/example_graph_capture.py +14 -6
  36. warp/examples/core/example_marching_cubes.py +14 -6
  37. warp/examples/core/example_mesh.py +14 -6
  38. warp/examples/core/example_mesh_intersect.py +14 -6
  39. warp/examples/core/example_nvdb.py +14 -6
  40. warp/examples/core/example_raycast.py +14 -6
  41. warp/examples/core/example_raymarch.py +14 -6
  42. warp/examples/core/example_render_opengl.py +14 -6
  43. warp/examples/core/example_sample_mesh.py +300 -0
  44. warp/examples/core/example_sph.py +14 -6
  45. warp/examples/core/example_torch.py +14 -6
  46. warp/examples/core/example_wave.py +14 -6
  47. warp/examples/fem/example_adaptive_grid.py +14 -6
  48. warp/examples/fem/example_apic_fluid.py +15 -7
  49. warp/examples/fem/example_burgers.py +16 -8
  50. warp/examples/fem/example_convection_diffusion.py +14 -6
  51. warp/examples/fem/example_convection_diffusion_dg.py +14 -6
  52. warp/examples/fem/example_deformed_geometry.py +15 -7
  53. warp/examples/fem/example_diffusion.py +14 -6
  54. warp/examples/fem/example_diffusion_3d.py +14 -6
  55. warp/examples/fem/example_diffusion_mgpu.py +14 -6
  56. warp/examples/fem/example_distortion_energy.py +15 -7
  57. warp/examples/fem/example_magnetostatics.py +20 -12
  58. warp/examples/fem/example_mixed_elasticity.py +14 -6
  59. warp/examples/fem/example_navier_stokes.py +14 -6
  60. warp/examples/fem/example_nonconforming_contact.py +14 -6
  61. warp/examples/fem/example_stokes.py +14 -6
  62. warp/examples/fem/example_stokes_transfer.py +14 -6
  63. warp/examples/fem/example_streamlines.py +14 -6
  64. warp/examples/fem/utils.py +24 -3
  65. warp/examples/interop/example_jax_callable.py +116 -0
  66. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  67. warp/examples/interop/example_jax_kernel.py +205 -0
  68. warp/examples/optim/example_bounce.py +14 -6
  69. warp/examples/optim/example_cloth_throw.py +14 -6
  70. warp/examples/optim/example_diffray.py +14 -6
  71. warp/examples/optim/example_drone.py +14 -6
  72. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  73. warp/examples/optim/example_inverse_kinematics.py +14 -6
  74. warp/examples/optim/example_inverse_kinematics_torch.py +14 -6
  75. warp/examples/optim/example_softbody_properties.py +14 -6
  76. warp/examples/optim/example_spring_cage.py +14 -6
  77. warp/examples/optim/example_trajectory.py +14 -6
  78. warp/examples/sim/example_cartpole.py +14 -6
  79. warp/examples/sim/example_cloth.py +14 -6
  80. warp/examples/sim/example_cloth_self_contact.py +14 -6
  81. warp/examples/sim/example_granular.py +14 -6
  82. warp/examples/sim/example_granular_collision_sdf.py +14 -6
  83. warp/examples/sim/example_jacobian_ik.py +14 -6
  84. warp/examples/sim/example_particle_chain.py +14 -6
  85. warp/examples/sim/example_quadruped.py +14 -6
  86. warp/examples/sim/example_rigid_chain.py +14 -6
  87. warp/examples/sim/example_rigid_contact.py +14 -6
  88. warp/examples/sim/example_rigid_force.py +14 -6
  89. warp/examples/sim/example_rigid_gyroscopic.py +14 -6
  90. warp/examples/sim/example_rigid_soft_contact.py +14 -6
  91. warp/examples/sim/example_soft_body.py +14 -6
  92. warp/examples/tile/example_tile_cholesky.py +14 -6
  93. warp/examples/tile/example_tile_convolution.py +14 -6
  94. warp/examples/tile/example_tile_fft.py +14 -6
  95. warp/examples/tile/example_tile_filtering.py +14 -6
  96. warp/examples/tile/example_tile_matmul.py +16 -10
  97. warp/examples/tile/example_tile_mlp.py +14 -6
  98. warp/examples/tile/example_tile_nbody.py +14 -6
  99. warp/examples/tile/example_tile_walker.py +14 -6
  100. warp/fabric.py +15 -0
  101. warp/fem/__init__.py +26 -1
  102. warp/fem/adaptivity.py +19 -4
  103. warp/fem/cache.py +15 -0
  104. warp/fem/dirichlet.py +15 -0
  105. warp/fem/domain.py +15 -0
  106. warp/fem/field/__init__.py +15 -0
  107. warp/fem/field/field.py +15 -0
  108. warp/fem/field/nodal_field.py +37 -68
  109. warp/fem/field/restriction.py +15 -0
  110. warp/fem/field/virtual.py +77 -23
  111. warp/fem/geometry/__init__.py +15 -0
  112. warp/fem/geometry/adaptive_nanogrid.py +24 -10
  113. warp/fem/geometry/closest_point.py +16 -1
  114. warp/fem/geometry/deformed_geometry.py +20 -2
  115. warp/fem/geometry/element.py +15 -0
  116. warp/fem/geometry/geometry.py +20 -0
  117. warp/fem/geometry/grid_2d.py +27 -12
  118. warp/fem/geometry/grid_3d.py +27 -15
  119. warp/fem/geometry/hexmesh.py +20 -7
  120. warp/fem/geometry/nanogrid.py +24 -11
  121. warp/fem/geometry/partition.py +15 -0
  122. warp/fem/geometry/quadmesh.py +28 -13
  123. warp/fem/geometry/tetmesh.py +18 -4
  124. warp/fem/geometry/trimesh.py +18 -8
  125. warp/fem/integrate.py +277 -93
  126. warp/fem/linalg.py +20 -5
  127. warp/fem/operator.py +15 -0
  128. warp/fem/polynomial.py +15 -0
  129. warp/fem/quadrature/__init__.py +15 -0
  130. warp/fem/quadrature/pic_quadrature.py +52 -22
  131. warp/fem/quadrature/quadrature.py +209 -25
  132. warp/fem/space/__init__.py +16 -1
  133. warp/fem/space/basis_function_space.py +19 -2
  134. warp/fem/space/basis_space.py +40 -18
  135. warp/fem/space/dof_mapper.py +15 -0
  136. warp/fem/space/function_space.py +15 -0
  137. warp/fem/space/grid_2d_function_space.py +15 -0
  138. warp/fem/space/grid_3d_function_space.py +15 -0
  139. warp/fem/space/hexmesh_function_space.py +17 -2
  140. warp/fem/space/nanogrid_function_space.py +15 -0
  141. warp/fem/space/partition.py +21 -2
  142. warp/fem/space/quadmesh_function_space.py +23 -8
  143. warp/fem/space/restriction.py +15 -0
  144. warp/fem/space/shape/__init__.py +15 -0
  145. warp/fem/space/shape/cube_shape_function.py +38 -23
  146. warp/fem/space/shape/shape_function.py +15 -0
  147. warp/fem/space/shape/square_shape_function.py +27 -12
  148. warp/fem/space/shape/tet_shape_function.py +15 -0
  149. warp/fem/space/shape/triangle_shape_function.py +16 -1
  150. warp/fem/space/tetmesh_function_space.py +18 -3
  151. warp/fem/space/topology.py +15 -0
  152. warp/fem/space/trimesh_function_space.py +17 -2
  153. warp/fem/types.py +15 -0
  154. warp/fem/utils.py +27 -6
  155. warp/jax.py +28 -7
  156. warp/jax_experimental/__init__.py +16 -0
  157. warp/{jax_experimental.py → jax_experimental/custom_call.py} +28 -33
  158. warp/jax_experimental/ffi.py +698 -0
  159. warp/jax_experimental/xla_ffi.py +602 -0
  160. warp/math.py +103 -6
  161. warp/native/array.h +28 -6
  162. warp/native/builtin.h +44 -9
  163. warp/native/bvh.cpp +18 -7
  164. warp/native/bvh.cu +57 -20
  165. warp/native/bvh.h +17 -7
  166. warp/native/clang/clang.cpp +45 -9
  167. warp/native/coloring.cpp +15 -6
  168. warp/native/crt.cpp +15 -6
  169. warp/native/crt.h +15 -6
  170. warp/native/cuda_crt.h +15 -6
  171. warp/native/cuda_util.cpp +29 -6
  172. warp/native/cuda_util.h +17 -6
  173. warp/native/error.cpp +15 -6
  174. warp/native/error.h +15 -6
  175. warp/native/exports.h +85 -63
  176. warp/native/fabric.h +15 -6
  177. warp/native/hashgrid.cpp +15 -6
  178. warp/native/hashgrid.cu +15 -6
  179. warp/native/hashgrid.h +15 -6
  180. warp/native/initializer_array.h +15 -6
  181. warp/native/intersect.h +41 -32
  182. warp/native/intersect_adj.h +48 -39
  183. warp/native/intersect_tri.h +17 -0
  184. warp/native/marching.cpp +16 -0
  185. warp/native/marching.cu +16 -7
  186. warp/native/marching.h +17 -0
  187. warp/native/mat.h +528 -15
  188. warp/native/mathdx.cpp +15 -6
  189. warp/native/matnn.h +15 -6
  190. warp/native/mesh.cpp +15 -6
  191. warp/native/mesh.cu +15 -6
  192. warp/native/mesh.h +25 -16
  193. warp/native/noise.h +15 -6
  194. warp/native/quat.h +114 -17
  195. warp/native/rand.h +21 -6
  196. warp/native/range.h +15 -6
  197. warp/native/reduce.cpp +15 -6
  198. warp/native/reduce.cu +15 -6
  199. warp/native/runlength_encode.cpp +15 -6
  200. warp/native/runlength_encode.cu +15 -6
  201. warp/native/scan.cpp +15 -6
  202. warp/native/scan.cu +15 -6
  203. warp/native/scan.h +15 -6
  204. warp/native/solid_angle.h +17 -0
  205. warp/native/sort.cpp +137 -65
  206. warp/native/sort.cu +167 -21
  207. warp/native/sort.h +23 -7
  208. warp/native/sparse.cpp +58 -28
  209. warp/native/sparse.cu +67 -23
  210. warp/native/spatial.h +15 -6
  211. warp/native/svd.h +131 -6
  212. warp/native/temp_buffer.h +15 -6
  213. warp/native/tile.h +316 -111
  214. warp/native/tile_reduce.h +61 -9
  215. warp/native/vec.h +83 -13
  216. warp/native/volume.cpp +100 -119
  217. warp/native/volume.cu +15 -6
  218. warp/native/volume.h +15 -6
  219. warp/native/volume_builder.cu +40 -16
  220. warp/native/volume_builder.h +21 -6
  221. warp/native/volume_impl.h +15 -6
  222. warp/native/warp.cpp +20 -12
  223. warp/native/warp.cu +114 -16
  224. warp/native/warp.h +34 -16
  225. warp/optim/__init__.py +14 -6
  226. warp/optim/adam.py +14 -6
  227. warp/optim/linear.py +25 -10
  228. warp/optim/sgd.py +14 -6
  229. warp/paddle.py +14 -6
  230. warp/render/__init__.py +14 -6
  231. warp/render/render_opengl.py +14 -6
  232. warp/render/render_usd.py +14 -6
  233. warp/render/utils.py +14 -6
  234. warp/sim/__init__.py +14 -7
  235. warp/sim/articulation.py +18 -10
  236. warp/sim/collide.py +35 -16
  237. warp/sim/graph_coloring.py +14 -6
  238. warp/sim/import_mjcf.py +463 -162
  239. warp/sim/import_snu.py +14 -7
  240. warp/sim/import_urdf.py +46 -18
  241. warp/sim/import_usd.py +14 -7
  242. warp/sim/inertia.py +14 -6
  243. warp/sim/integrator.py +14 -6
  244. warp/sim/integrator_euler.py +19 -11
  245. warp/sim/integrator_featherstone.py +17 -16
  246. warp/sim/integrator_vbd.py +222 -8
  247. warp/sim/integrator_xpbd.py +19 -11
  248. warp/sim/model.py +56 -19
  249. warp/sim/particles.py +14 -6
  250. warp/sim/render.py +14 -6
  251. warp/sim/utils.py +17 -2
  252. warp/sparse.py +657 -555
  253. warp/stubs.py +231 -19
  254. warp/tape.py +14 -6
  255. warp/tests/aux_test_class_kernel.py +14 -6
  256. warp/tests/aux_test_compile_consts_dummy.py +14 -6
  257. warp/tests/aux_test_conditional_unequal_types_kernels.py +14 -6
  258. warp/tests/aux_test_dependent.py +14 -6
  259. warp/tests/aux_test_grad_customs.py +14 -6
  260. warp/tests/aux_test_instancing_gc.py +14 -6
  261. warp/tests/aux_test_module_unload.py +14 -6
  262. warp/tests/aux_test_name_clash1.py +14 -6
  263. warp/tests/aux_test_name_clash2.py +14 -6
  264. warp/tests/aux_test_unresolved_func.py +14 -6
  265. warp/tests/aux_test_unresolved_symbol.py +14 -6
  266. warp/tests/cuda/__init__.py +0 -0
  267. warp/tests/{test_async.py → cuda/test_async.py} +14 -6
  268. warp/tests/{test_ipc.py → cuda/test_ipc.py} +14 -6
  269. warp/tests/{test_mempool.py → cuda/test_mempool.py} +53 -6
  270. warp/tests/{test_multigpu.py → cuda/test_multigpu.py} +14 -6
  271. warp/tests/{test_peer.py → cuda/test_peer.py} +14 -6
  272. warp/tests/{test_pinned.py → cuda/test_pinned.py} +14 -6
  273. warp/tests/{test_streams.py → cuda/test_streams.py} +85 -6
  274. warp/tests/geometry/__init__.py +0 -0
  275. warp/tests/{test_bvh.py → geometry/test_bvh.py} +14 -6
  276. warp/tests/{test_hash_grid.py → geometry/test_hash_grid.py} +14 -6
  277. warp/tests/{test_marching_cubes.py → geometry/test_marching_cubes.py} +14 -6
  278. warp/tests/{test_mesh.py → geometry/test_mesh.py} +14 -6
  279. warp/tests/{test_mesh_query_aabb.py → geometry/test_mesh_query_aabb.py} +14 -6
  280. warp/tests/{test_mesh_query_point.py → geometry/test_mesh_query_point.py} +80 -69
  281. warp/tests/{test_mesh_query_ray.py → geometry/test_mesh_query_ray.py} +15 -7
  282. warp/tests/{test_volume.py → geometry/test_volume.py} +55 -12
  283. warp/tests/{test_volume_write.py → geometry/test_volume_write.py} +14 -6
  284. warp/tests/interop/__init__.py +0 -0
  285. warp/tests/{test_dlpack.py → interop/test_dlpack.py} +42 -11
  286. warp/tests/{test_jax.py → interop/test_jax.py} +14 -6
  287. warp/tests/{test_paddle.py → interop/test_paddle.py} +14 -6
  288. warp/tests/{test_torch.py → interop/test_torch.py} +14 -6
  289. warp/tests/run_coverage_serial.py +14 -6
  290. warp/tests/sim/__init__.py +0 -0
  291. warp/tests/{disabled_kinematics.py → sim/disabled_kinematics.py} +23 -16
  292. warp/tests/{flaky_test_sim_grad.py → sim/flaky_test_sim_grad.py} +14 -6
  293. warp/tests/{test_collision.py → sim/test_collision.py} +16 -8
  294. warp/tests/{test_coloring.py → sim/test_coloring.py} +14 -7
  295. warp/tests/{test_model.py → sim/test_model.py} +55 -7
  296. warp/tests/{test_sim_grad_bounce_linear.py → sim/test_sim_grad_bounce_linear.py} +14 -6
  297. warp/tests/{test_sim_kinematics.py → sim/test_sim_kinematics.py} +16 -7
  298. warp/tests/sim/test_vbd.py +597 -0
  299. warp/tests/test_adam.py +14 -6
  300. warp/tests/test_arithmetic.py +14 -6
  301. warp/tests/test_array.py +14 -6
  302. warp/tests/test_array_reduce.py +14 -6
  303. warp/tests/test_assert.py +14 -6
  304. warp/tests/test_atomic.py +14 -6
  305. warp/tests/test_bool.py +15 -7
  306. warp/tests/test_builtins_resolution.py +14 -6
  307. warp/tests/test_closest_point_edge_edge.py +14 -6
  308. warp/tests/test_codegen.py +14 -6
  309. warp/tests/test_codegen_instancing.py +14 -6
  310. warp/tests/test_compile_consts.py +14 -6
  311. warp/tests/test_conditional.py +14 -6
  312. warp/tests/test_context.py +14 -6
  313. warp/tests/test_copy.py +14 -6
  314. warp/tests/test_ctypes.py +14 -6
  315. warp/tests/test_dense.py +14 -6
  316. warp/tests/test_devices.py +14 -6
  317. warp/tests/test_examples.py +42 -42
  318. warp/tests/test_fabricarray.py +14 -6
  319. warp/tests/test_fast_math.py +14 -6
  320. warp/tests/test_fem.py +37 -10
  321. warp/tests/test_fp16.py +14 -6
  322. warp/tests/test_func.py +14 -6
  323. warp/tests/test_future_annotations.py +14 -6
  324. warp/tests/test_generics.py +14 -6
  325. warp/tests/test_grad.py +14 -6
  326. warp/tests/test_grad_customs.py +14 -6
  327. warp/tests/test_grad_debug.py +14 -6
  328. warp/tests/test_implicit_init.py +14 -6
  329. warp/tests/test_import.py +14 -6
  330. warp/tests/test_indexedarray.py +14 -6
  331. warp/tests/test_intersect.py +14 -6
  332. warp/tests/test_iter.py +14 -6
  333. warp/tests/test_large.py +14 -6
  334. warp/tests/test_launch.py +14 -6
  335. warp/tests/test_lerp.py +14 -6
  336. warp/tests/test_linear_solvers.py +15 -11
  337. warp/tests/test_lvalue.py +14 -6
  338. warp/tests/test_mat.py +247 -85
  339. warp/tests/test_mat_lite.py +14 -6
  340. warp/tests/test_mat_scalar_ops.py +18 -10
  341. warp/tests/test_math.py +14 -6
  342. warp/tests/test_mlp.py +14 -6
  343. warp/tests/test_module_hashing.py +14 -6
  344. warp/tests/test_modules_lite.py +14 -6
  345. warp/tests/test_noise.py +14 -6
  346. warp/tests/test_operators.py +14 -6
  347. warp/tests/test_options.py +14 -6
  348. warp/tests/test_overwrite.py +15 -60
  349. warp/tests/test_print.py +14 -6
  350. warp/tests/test_quat.py +81 -52
  351. warp/tests/test_rand.py +58 -43
  352. warp/tests/test_reload.py +14 -6
  353. warp/tests/test_rounding.py +14 -6
  354. warp/tests/test_runlength_encode.py +14 -6
  355. warp/tests/test_scalar_ops.py +14 -6
  356. warp/tests/test_smoothstep.py +14 -6
  357. warp/tests/test_snippet.py +15 -0
  358. warp/tests/test_sparse.py +61 -12
  359. warp/tests/test_spatial.py +89 -6
  360. warp/tests/test_special_values.py +14 -6
  361. warp/tests/test_static.py +15 -7
  362. warp/tests/test_struct.py +14 -6
  363. warp/tests/test_tape.py +14 -6
  364. warp/tests/test_transient_module.py +14 -6
  365. warp/tests/test_triangle_closest_point.py +14 -6
  366. warp/tests/test_types.py +14 -6
  367. warp/tests/test_utils.py +98 -10
  368. warp/tests/test_vec.py +60 -40
  369. warp/tests/test_vec_lite.py +14 -6
  370. warp/tests/test_vec_scalar_ops.py +14 -6
  371. warp/tests/test_verify_fp.py +14 -6
  372. warp/tests/tile/__init__.py +0 -0
  373. warp/tests/{test_tile.py → tile/test_tile.py} +150 -57
  374. warp/tests/{test_tile_load.py → tile/test_tile_load.py} +15 -7
  375. warp/tests/{test_tile_mathdx.py → tile/test_tile_mathdx.py} +23 -12
  376. warp/tests/{test_tile_mlp.py → tile/test_tile_mlp.py} +39 -20
  377. warp/tests/{test_tile_reduce.py → tile/test_tile_reduce.py} +74 -7
  378. warp/tests/{test_tile_shared_memory.py → tile/test_tile_shared_memory.py} +14 -6
  379. warp/tests/{test_tile_view.py → tile/test_tile_view.py} +15 -7
  380. warp/tests/unittest_serial.py +15 -6
  381. warp/tests/unittest_suites.py +59 -65
  382. warp/tests/unittest_utils.py +16 -7
  383. warp/tests/walkthrough_debug.py +14 -6
  384. warp/thirdparty/unittest_parallel.py +15 -8
  385. warp/torch.py +14 -6
  386. warp/types.py +124 -664
  387. warp/utils.py +151 -78
  388. {warp_lang-1.6.1.dist-info → warp_lang-1.7.0.dist-info}/METADATA +39 -12
  389. warp_lang-1.7.0.dist-info/RECORD +429 -0
  390. {warp_lang-1.6.1.dist-info → warp_lang-1.7.0.dist-info}/WHEEL +1 -1
  391. warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
  392. warp/examples/optim/example_walker.py +0 -309
  393. warp/native/cutlass_gemm.cpp +0 -34
  394. warp/native/cutlass_gemm.cu +0 -373
  395. warp/tests/test_matmul.py +0 -503
  396. warp/tests/test_matmul_lite.py +0 -403
  397. warp/tests/test_vbd.py +0 -378
  398. warp/tests/unused_test_misc.py +0 -69
  399. warp_lang-1.6.1.dist-info/LICENSE.md +0 -126
  400. warp_lang-1.6.1.dist-info/RECORD +0 -419
  401. {warp_lang-1.6.1.dist-info → warp_lang-1.7.0.dist-info}/top_level.txt +0 -0
warp/utils.py CHANGED
@@ -1,9 +1,19 @@
1
- # Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
2
- # NVIDIA CORPORATION and its licensors retain all intellectual property
3
- # and proprietary rights in and to this software, related documentation
4
- # and any modifications thereto. Any use, reproduction, disclosure or
5
- # distribution of this software and related documentation without an express
6
- # license agreement from NVIDIA CORPORATION is strictly prohibited.
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
+ from __future__ import annotations
7
17
 
8
18
  import cProfile
9
19
  import ctypes
@@ -11,7 +21,7 @@ import os
11
21
  import sys
12
22
  import time
13
23
  import warnings
14
- from typing import Any, Optional
24
+ from typing import Any, Callable, Dict, List, Optional, Union
15
25
 
16
26
  import numpy as np
17
27
 
@@ -133,6 +143,8 @@ def radix_sort_pairs(keys, values, count: int):
133
143
  runtime.core.radix_sort_pairs_int_host(keys.ptr, values.ptr, count)
134
144
  elif keys.dtype == wp.float32 and values.dtype == wp.int32:
135
145
  runtime.core.radix_sort_pairs_float_host(keys.ptr, values.ptr, count)
146
+ elif keys.dtype == wp.int64 and values.dtype == wp.int32:
147
+ runtime.core.radix_sort_pairs_int64_host(keys.ptr, values.ptr, count)
136
148
  else:
137
149
  raise RuntimeError("Unsupported data type")
138
150
  elif keys.device.is_cuda:
@@ -140,6 +152,90 @@ def radix_sort_pairs(keys, values, count: int):
140
152
  runtime.core.radix_sort_pairs_int_device(keys.ptr, values.ptr, count)
141
153
  elif keys.dtype == wp.float32 and values.dtype == wp.int32:
142
154
  runtime.core.radix_sort_pairs_float_device(keys.ptr, values.ptr, count)
155
+ elif keys.dtype == wp.int64 and values.dtype == wp.int32:
156
+ runtime.core.radix_sort_pairs_int64_device(keys.ptr, values.ptr, count)
157
+ else:
158
+ raise RuntimeError("Unsupported data type")
159
+
160
+
161
+ def segmented_sort_pairs(
162
+ keys,
163
+ values,
164
+ count: int,
165
+ segment_start_indices: wp.array(dtype=wp.int32),
166
+ segment_end_indices: wp.array(dtype=wp.int32) = None,
167
+ ):
168
+ """Sort key-value pairs within segments.
169
+
170
+ This function performs a segmented sort of key-value pairs, where the sorting is done independently within each segment.
171
+ The segments are defined by their start and optionally end indices.
172
+
173
+ Args:
174
+ keys: Array of keys to sort. Must be of type int32 or float32.
175
+ values: Array of values to sort along with keys. Must be of type int32.
176
+ count: Number of elements to sort.
177
+ segment_start_indices: Array containing start index of each segment. Must be of type int32.
178
+ If segment_end_indices is None, this array must have length at least num_segments + 1,
179
+ and segment_end_indices will be inferred as segment_start_indices[1:].
180
+ If segment_end_indices is provided, this array must have length at least num_segments.
181
+ segment_end_indices: Optional array containing end index of each segment. Must be of type int32 if provided.
182
+ If None, segment_end_indices will be inferred from segment_start_indices[1:].
183
+ If provided, must have length at least num_segments.
184
+
185
+ Raises:
186
+ RuntimeError: If array storage devices don't match, if storage size is insufficient,
187
+ if segment_start_indices is not of type int32, or if data types are unsupported.
188
+ """
189
+ if keys.device != values.device:
190
+ raise RuntimeError("Array storage devices do not match")
191
+
192
+ if count == 0:
193
+ return
194
+
195
+ if keys.size < 2 * count or values.size < 2 * count:
196
+ raise RuntimeError("Array storage must be large enough to contain 2*count elements")
197
+
198
+ from warp.context import runtime
199
+
200
+ if segment_start_indices.dtype != wp.int32:
201
+ raise RuntimeError("segment_start_indices array must be of type int32")
202
+
203
+ # Handle case where segment_end_indices is not provided
204
+ if segment_end_indices is None:
205
+ num_segments = max(0, segment_start_indices.size - 1)
206
+
207
+ segment_end_indices = segment_start_indices[1:]
208
+ segment_end_indices_ptr = segment_end_indices.ptr
209
+ segment_start_indices_ptr = segment_start_indices.ptr
210
+ else:
211
+ if segment_end_indices.dtype != wp.int32:
212
+ raise RuntimeError("segment_end_indices array must be of type int32")
213
+
214
+ num_segments = segment_start_indices.size
215
+
216
+ segment_end_indices_ptr = segment_end_indices.ptr
217
+ segment_start_indices_ptr = segment_start_indices.ptr
218
+
219
+ if keys.device.is_cpu:
220
+ if keys.dtype == wp.int32 and values.dtype == wp.int32:
221
+ runtime.core.segmented_sort_pairs_int_host(
222
+ keys.ptr, values.ptr, count, segment_start_indices_ptr, segment_end_indices_ptr, num_segments
223
+ )
224
+ elif keys.dtype == wp.float32 and values.dtype == wp.int32:
225
+ runtime.core.segmented_sort_pairs_float_host(
226
+ keys.ptr, values.ptr, count, segment_start_indices_ptr, segment_end_indices_ptr, num_segments
227
+ )
228
+ else:
229
+ raise RuntimeError("Unsupported data type")
230
+ elif keys.device.is_cuda:
231
+ if keys.dtype == wp.int32 and values.dtype == wp.int32:
232
+ runtime.core.segmented_sort_pairs_int_device(
233
+ keys.ptr, values.ptr, count, segment_start_indices_ptr, segment_end_indices_ptr, num_segments
234
+ )
235
+ elif keys.dtype == wp.float32 and values.dtype == wp.int32:
236
+ runtime.core.segmented_sort_pairs_float_device(
237
+ keys.ptr, values.ptr, count, segment_start_indices_ptr, segment_end_indices_ptr, num_segments
238
+ )
143
239
  else:
144
240
  raise RuntimeError("Unsupported data type")
145
241
 
@@ -665,37 +761,38 @@ class ScopedTimer:
665
761
 
666
762
  def __init__(
667
763
  self,
668
- name,
669
- active=True,
670
- print=True,
671
- detailed=False,
672
- dict=None,
673
- use_nvtx=False,
674
- color="rapids",
675
- synchronize=False,
676
- cuda_filter=0,
677
- report_func=None,
678
- skip_tape=False,
764
+ name: str,
765
+ active: bool = True,
766
+ print: bool = True,
767
+ detailed: bool = False,
768
+ dict: Optional[Dict[str, List[float]]] = None,
769
+ use_nvtx: bool = False,
770
+ color: Union[int, str] = "rapids",
771
+ synchronize: bool = False,
772
+ cuda_filter: int = 0,
773
+ report_func: Optional[Callable[[List[TimingResult], str], None]] = None,
774
+ skip_tape: bool = False,
679
775
  ):
680
776
  """Context manager object for a timer
681
777
 
682
778
  Parameters:
683
- name (str): Name of timer
684
- active (bool): Enables this timer
685
- print (bool): At context manager exit, print elapsed time to sys.stdout
686
- detailed (bool): Collects additional profiling data using cProfile and calls ``print_stats()`` at context exit
687
- dict (dict): A dictionary of lists to which the elapsed time will be appended using ``name`` as a key
688
- use_nvtx (bool): If true, timing functionality is replaced by an NVTX range
689
- color (int or str): ARGB value (e.g. 0x00FFFF) or color name (e.g. 'cyan') associated with the NVTX range
690
- synchronize (bool): Synchronize the CPU thread with any outstanding CUDA work to return accurate GPU timings
691
- cuda_filter (int): Filter flags for CUDA activity timing, e.g. ``warp.TIMING_KERNEL`` or ``warp.TIMING_ALL``
692
- report_func (Callable): A callback function to print the activity report (``wp.timing_print()`` is used by default)
693
- skip_tape (bool): If true, the timer will not be recorded in the tape
779
+ name: Name of timer
780
+ active: Enables this timer
781
+ print: At context manager exit, print elapsed time to ``sys.stdout``
782
+ detailed: Collects additional profiling data using cProfile and calls ``print_stats()`` at context exit
783
+ dict: A dictionary of lists to which the elapsed time will be appended using ``name`` as a key
784
+ use_nvtx: If true, timing functionality is replaced by an NVTX range
785
+ color: ARGB value (e.g. 0x00FFFF) or color name (e.g. 'cyan') associated with the NVTX range
786
+ synchronize: Synchronize the CPU thread with any outstanding CUDA work to return accurate GPU timings
787
+ cuda_filter: Filter flags for CUDA activity timing, e.g. ``warp.TIMING_KERNEL`` or ``warp.TIMING_ALL``
788
+ report_func: A callback function to print the activity report.
789
+ If ``None``, :func:`wp.timing_print() <timing_print>` will be used.
790
+ skip_tape: If true, the timer will not be recorded in the tape
694
791
 
695
792
  Attributes:
696
793
  extra_msg (str): Can be set to a string that will be added to the printout at context exit.
697
794
  elapsed (float): The duration of the ``with`` block used with this object
698
- timing_results (list[TimingResult]): The list of activity timing results, if collection was requested using ``cuda_filter``
795
+ timing_results (List[TimingResult]): The list of activity timing results, if collection was requested using ``cuda_filter``
699
796
  """
700
797
  self.name = name
701
798
  self.active = active and self.enabled
@@ -791,7 +888,7 @@ class ScopedTimer:
791
888
 
792
889
  # Allow temporarily enabling/disabling mempool allocators
793
890
  class ScopedMempool:
794
- def __init__(self, device, enable: bool):
891
+ def __init__(self, device: Devicelike, enable: bool):
795
892
  self.device = wp.get_device(device)
796
893
  self.enable = enable
797
894
 
@@ -805,7 +902,7 @@ class ScopedMempool:
805
902
 
806
903
  # Allow temporarily enabling/disabling mempool access
807
904
  class ScopedMempoolAccess:
808
- def __init__(self, target_device, peer_device, enable: bool):
905
+ def __init__(self, target_device: Devicelike, peer_device: Devicelike, enable: bool):
809
906
  self.target_device = target_device
810
907
  self.peer_device = peer_device
811
908
  self.enable = enable
@@ -820,7 +917,7 @@ class ScopedMempoolAccess:
820
917
 
821
918
  # Allow temporarily enabling/disabling peer access
822
919
  class ScopedPeerAccess:
823
- def __init__(self, target_device, peer_device, enable: bool):
920
+ def __init__(self, target_device: Devicelike, peer_device: Devicelike, enable: bool):
824
921
  self.target_device = target_device
825
922
  self.peer_device = peer_device
826
923
  self.enable = enable
@@ -834,7 +931,7 @@ class ScopedPeerAccess:
834
931
 
835
932
 
836
933
  class ScopedCapture:
837
- def __init__(self, device=None, stream=None, force_module_load=None, external=False):
934
+ def __init__(self, device: Devicelike = None, stream=None, force_module_load=None, external=False):
838
935
  self.device = device
839
936
  self.stream = stream
840
937
  self.force_module_load = force_module_load
@@ -860,27 +957,6 @@ class ScopedCapture:
860
957
  self.active = False
861
958
 
862
959
 
863
- # helper kernels for adj_matmul
864
- @wp.kernel
865
- def add_kernel_2d(x: wp.array2d(dtype=Any), acc: wp.array2d(dtype=Any), beta: Any):
866
- i, j = wp.tid()
867
-
868
- x[i, j] = x[i, j] + beta * acc[i, j]
869
-
870
-
871
- @wp.kernel
872
- def add_kernel_3d(x: wp.array3d(dtype=Any), acc: wp.array3d(dtype=Any), beta: Any):
873
- i, j, k = wp.tid()
874
-
875
- x[i, j, k] = x[i, j, k] + beta * acc[i, j, k]
876
-
877
-
878
- # explicit instantiations of generic kernels for adj_matmul
879
- for T in [wp.float16, wp.float32, wp.float64]:
880
- wp.overload(add_kernel_2d, [wp.array2d(dtype=T), wp.array2d(dtype=T), T])
881
- wp.overload(add_kernel_3d, [wp.array3d(dtype=T), wp.array3d(dtype=T), T])
882
-
883
-
884
960
  def check_p2p():
885
961
  """Check if the machine is configured properly for peer-to-peer transfers.
886
962
 
@@ -919,31 +995,28 @@ class timing_result_t(ctypes.Structure):
919
995
 
920
996
 
921
997
  class TimingResult:
922
- """Timing result for a single activity.
998
+ """Timing result for a single activity."""
923
999
 
924
- Parameters:
925
- raw_result (warp.utils.timing_result_t): The result structure obtained from C++ (internal use only)
1000
+ def __init__(self, device, name, filter, elapsed):
1001
+ self.device: warp.context.Device = device
1002
+ """The device where the activity was recorded."""
926
1003
 
927
- Attributes:
928
- device (warp.Device): The device where the activity was recorded.
929
- name (str): The activity name.
930
- filter (int): The type of activity (e.g., ``warp.TIMING_KERNEL``).
931
- elapsed (float): The elapsed time in milliseconds.
932
- """
1004
+ self.name: str = name
1005
+ """The activity name."""
933
1006
 
934
- def __init__(self, device, name, filter, elapsed):
935
- self.device = device
936
- self.name = name
937
- self.filter = filter
938
- self.elapsed = elapsed
1007
+ self.filter: int = filter
1008
+ """The type of activity (e.g., ``warp.TIMING_KERNEL``)."""
1009
+
1010
+ self.elapsed: float = elapsed
1011
+ """The elapsed time in milliseconds."""
939
1012
 
940
1013
 
941
- def timing_begin(cuda_filter=TIMING_ALL, synchronize=True):
1014
+ def timing_begin(cuda_filter: int = TIMING_ALL, synchronize: bool = True) -> None:
942
1015
  """Begin detailed activity timing.
943
1016
 
944
1017
  Parameters:
945
- cuda_filter (int): Filter flags for CUDA activity timing, e.g. ``warp.TIMING_KERNEL`` or ``warp.TIMING_ALL``
946
- synchronize (bool): Whether to synchronize all CUDA devices before timing starts
1018
+ cuda_filter: Filter flags for CUDA activity timing, e.g. ``warp.TIMING_KERNEL`` or ``warp.TIMING_ALL``
1019
+ synchronize: Whether to synchronize all CUDA devices before timing starts
947
1020
  """
948
1021
 
949
1022
  if synchronize:
@@ -952,14 +1025,14 @@ def timing_begin(cuda_filter=TIMING_ALL, synchronize=True):
952
1025
  warp.context.runtime.core.cuda_timing_begin(cuda_filter)
953
1026
 
954
1027
 
955
- def timing_end(synchronize=True):
1028
+ def timing_end(synchronize: bool = True) -> List[TimingResult]:
956
1029
  """End detailed activity timing.
957
1030
 
958
1031
  Parameters:
959
- synchronize (bool): Whether to synchronize all CUDA devices before timing ends
1032
+ synchronize: Whether to synchronize all CUDA devices before timing ends
960
1033
 
961
1034
  Returns:
962
- list[TimingResult]: A list of ``TimingResult`` objects for all recorded activities.
1035
+ A list of :class:`TimingResult` objects for all recorded activities.
963
1036
  """
964
1037
 
965
1038
  if synchronize:
@@ -998,12 +1071,12 @@ def timing_end(synchronize=True):
998
1071
  return results
999
1072
 
1000
1073
 
1001
- def timing_print(results, indent=""):
1074
+ def timing_print(results: List[TimingResult], indent: str = "") -> None:
1002
1075
  """Print timing results.
1003
1076
 
1004
1077
  Parameters:
1005
- results (list[TimingResult]): List of ``TimingResult`` objects.
1006
- indent (str): Optional indentation for the output.
1078
+ results: List of :class:`TimingResult` objects to print.
1079
+ indent: Optional indentation to prepend to all output lines.
1007
1080
  """
1008
1081
 
1009
1082
  if not results:
@@ -1,9 +1,9 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: warp-lang
3
- Version: 1.6.1
3
+ Version: 1.7.0
4
4
  Summary: A Python framework for high-performance simulation and graphics programming
5
- Author-email: NVIDIA Corporation <mmacklin@nvidia.com>
6
- License: NVIDIA Software License
5
+ Author-email: NVIDIA Corporation <warp-python@nvidia.com>
6
+ License: Apache-2.0
7
7
  Project-URL: GitHub, https://github.com/NVIDIA/warp
8
8
  Project-URL: Documentation, https://nvidia.github.io/warp
9
9
  Project-URL: Changelog, https://github.com/NVIDIA/warp/blob/main/CHANGELOG.md
@@ -12,8 +12,9 @@ Classifier: Programming Language :: Python :: 3.9
12
12
  Classifier: Programming Language :: Python :: 3.10
13
13
  Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
15
16
  Classifier: Programming Language :: Python :: 3 :: Only
16
- Classifier: License :: Other/Proprietary License
17
+ Classifier: License :: OSI Approved :: Apache Software License
17
18
  Classifier: Operating System :: OS Independent
18
19
  Requires-Python: >=3.8
19
20
  Description-Content-Type: text/markdown
@@ -23,15 +24,18 @@ Provides-Extra: dev
23
24
  Requires-Dist: pre-commit; extra == "dev"
24
25
  Requires-Dist: ruff; extra == "dev"
25
26
  Requires-Dist: nvtx; extra == "dev"
26
- Requires-Dist: nvidia-sphinx-theme; extra == "dev"
27
+ Requires-Dist: nvidia-sphinx-theme; python_version >= "3.9" and extra == "dev"
27
28
  Requires-Dist: sphinx-copybutton; extra == "dev"
28
29
  Requires-Dist: coverage[toml]; extra == "dev"
29
30
  Provides-Extra: extras
30
31
  Requires-Dist: usd-core; extra == "extras"
31
32
  Requires-Dist: matplotlib; extra == "extras"
33
+ Requires-Dist: pillow; extra == "extras"
32
34
  Requires-Dist: pyglet; extra == "extras"
35
+ Dynamic: license-file
33
36
 
34
37
  [![PyPI version](https://badge.fury.io/py/warp-lang.svg)](https://badge.fury.io/py/warp-lang)
38
+ [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
35
39
  ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/NVIDIA/warp?link=https%3A%2F%2Fgithub.com%2FNVIDIA%2Fwarp%2Fcommits%2Fmain)
36
40
  [![Downloads](https://static.pepy.tech/badge/warp-lang/month)](https://pepy.tech/project/warp-lang)
37
41
  [![codecov](https://codecov.io/github/NVIDIA/warp/graph/badge.svg?token=7O1KSM79FG)](https://codecov.io/github/NVIDIA/warp)
@@ -78,9 +82,9 @@ the `pip install` command, e.g.
78
82
 
79
83
  | Platform | Install Command |
80
84
  | --------------- | ----------------------------------------------------------------------------------------------------------------------------- |
81
- | Linux aarch64 | `pip install https://github.com/NVIDIA/warp/releases/download/v1.6.1/warp_lang-1.6.1+cu11-py3-none-manylinux2014_aarch64.whl` |
82
- | Linux x86-64 | `pip install https://github.com/NVIDIA/warp/releases/download/v1.6.1/warp_lang-1.6.1+cu11-py3-none-manylinux2014_x86_64.whl` |
83
- | Windows x86-64 | `pip install https://github.com/NVIDIA/warp/releases/download/v1.6.1/warp_lang-1.6.1+cu11-py3-none-win_amd64.whl` |
85
+ | Linux aarch64 | `pip install https://github.com/NVIDIA/warp/releases/download/v1.7.0/warp_lang-1.7.0+cu11-py3-none-manylinux2014_aarch64.whl` |
86
+ | Linux x86-64 | `pip install https://github.com/NVIDIA/warp/releases/download/v1.7.0/warp_lang-1.7.0+cu11-py3-none-manylinux2014_x86_64.whl` |
87
+ | Windows x86-64 | `pip install https://github.com/NVIDIA/warp/releases/download/v1.7.0/warp_lang-1.7.0+cu11-py3-none-win_amd64.whl` |
84
88
 
85
89
  The `--force-reinstall` option may need to be used to overwrite a previous installation.
86
90
 
@@ -96,6 +100,15 @@ pip install -U --pre warp-lang --extra-index-url=https://pypi.nvidia.com/
96
100
 
97
101
  Note that the nightly builds are built with the CUDA 12 runtime and are not published for macOS.
98
102
 
103
+ If you plan to install nightly builds regularly, you can simplify future installations by adding NVIDIA's package
104
+ repository as an extra index via the `PIP_EXTRA_INDEX_URL` environment variable. For example:
105
+
106
+ ```text
107
+ export PIP_EXTRA_INDEX_URL="https://pypi.nvidia.com"
108
+ ```
109
+
110
+ This ensures the index is automatically used for `pip` commands, avoiding the need to specify it explicitly.
111
+
99
112
  ### CUDA Requirements
100
113
 
101
114
  * Warp packages built with CUDA Toolkit 11.x require NVIDIA driver 470 or newer.
@@ -247,16 +260,16 @@ python -m warp.tests
247
260
  <td align="center">raymarch</td>
248
261
  </tr>
249
262
  <tr>
263
+ <td><a href="https://github.com/NVIDIA/warp/tree/main/warp/examples/core/example_sample_mesh.py"><img src="https://media.githubusercontent.com/media/NVIDIA/warp/refs/heads/main/docs/img/examples/core_sample_mesh.png"></a></td>
250
264
  <td><a href="https://github.com/NVIDIA/warp/tree/main/warp/examples/core/example_sph.py"><img src="https://media.githubusercontent.com/media/NVIDIA/warp/refs/heads/main/docs/img/examples/core_sph.png"></a></td>
251
265
  <td><a href="https://github.com/NVIDIA/warp/tree/main/warp/examples/core/example_torch.py"><img src="https://media.githubusercontent.com/media/NVIDIA/warp/refs/heads/main/docs/img/examples/core_torch.png"></a></td>
252
266
  <td><a href="https://github.com/NVIDIA/warp/tree/main/warp/examples/core/example_wave.py"><img src="https://media.githubusercontent.com/media/NVIDIA/warp/refs/heads/main/docs/img/examples/core_wave.png"></a></td>
253
- <td></td>
254
267
  </tr>
255
268
  <tr>
269
+ <td align="center">sample mesh</td>
256
270
  <td align="center">sph</td>
257
271
  <td align="center">torch</td>
258
272
  <td align="center">wave</td>
259
- <td align="center"></td>
260
273
  </tr>
261
274
  </tbody>
262
275
  </table>
@@ -320,6 +333,18 @@ python -m warp.tests
320
333
  <td align="center">trajectory</td>
321
334
  <td align="center">soft body properties</td>
322
335
  </tr>
336
+ <tr>
337
+ <td><a href="https://github.com/NVIDIA/warp/tree/main/warp/examples/optim/example_fluid_checkpoint.py"><img src="https://media.githubusercontent.com/media/NVIDIA/warp/refs/heads/main/docs/img/examples/optim_fluid_checkpoint.png"></a></td>
338
+ <td></td>
339
+ <td></td>
340
+ <td></td>
341
+ </tr>
342
+ <tr>
343
+ <td align="center">fluid checkpoint</td>
344
+ <td align="center"></td>
345
+ <td align="center"></td>
346
+ <td align="center"></td>
347
+ </tr>
323
348
  </tbody>
324
349
  </table>
325
350
 
@@ -449,6 +474,8 @@ Problems, questions, and feature requests can be opened on [GitHub Issues](https
449
474
 
450
475
  The Warp team also monitors the **#warp** forum on the public [Omniverse Discord](https://discord.com/invite/nvidiaomniverse) server, come chat with us!
451
476
 
477
+ For inquiries not suited for GitHub Issues or Discord, please email warp-python@nvidia.com.
478
+
452
479
  ## Versioning
453
480
 
454
481
  Versions take the format X.Y.Z, similar to [Python itself](https://devguide.python.org/developer-workflow/development-cycle/#devcycle):
@@ -464,7 +491,7 @@ Note that prior to 0.11.0, this schema was not strictly adhered to.
464
491
 
465
492
  ## License
466
493
 
467
- Warp is provided under the NVIDIA Software License, please see [LICENSE.md](./LICENSE.md) for full license text.
494
+ Warp is provided under the Apache License, Version 2.0. Please see [LICENSE.md](./LICENSE.md) for full license text.
468
495
 
469
496
  ## Contributing
470
497