warp-lang 1.9.1__py3-none-win_amd64.whl → 1.10.0rc2__py3-none-win_amd64.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 (346) hide show
  1. warp/__init__.py +301 -287
  2. warp/__init__.pyi +794 -305
  3. warp/_src/__init__.py +14 -0
  4. warp/_src/autograd.py +1075 -0
  5. warp/_src/build.py +618 -0
  6. warp/_src/build_dll.py +640 -0
  7. warp/{builtins.py → _src/builtins.py} +1382 -377
  8. warp/_src/codegen.py +4359 -0
  9. warp/{config.py → _src/config.py} +178 -169
  10. warp/_src/constants.py +57 -0
  11. warp/_src/context.py +8294 -0
  12. warp/_src/dlpack.py +462 -0
  13. warp/_src/fabric.py +355 -0
  14. warp/_src/fem/__init__.py +14 -0
  15. warp/_src/fem/adaptivity.py +508 -0
  16. warp/_src/fem/cache.py +687 -0
  17. warp/_src/fem/dirichlet.py +188 -0
  18. warp/{fem → _src/fem}/domain.py +40 -30
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +701 -0
  21. warp/{fem → _src/fem}/field/nodal_field.py +30 -15
  22. warp/{fem → _src/fem}/field/restriction.py +1 -1
  23. warp/{fem → _src/fem}/field/virtual.py +53 -27
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +77 -163
  26. warp/_src/fem/geometry/closest_point.py +97 -0
  27. warp/{fem → _src/fem}/geometry/deformed_geometry.py +14 -22
  28. warp/{fem → _src/fem}/geometry/element.py +32 -10
  29. warp/{fem → _src/fem}/geometry/geometry.py +48 -20
  30. warp/{fem → _src/fem}/geometry/grid_2d.py +12 -23
  31. warp/{fem → _src/fem}/geometry/grid_3d.py +12 -23
  32. warp/{fem → _src/fem}/geometry/hexmesh.py +40 -63
  33. warp/{fem → _src/fem}/geometry/nanogrid.py +255 -248
  34. warp/{fem → _src/fem}/geometry/partition.py +121 -63
  35. warp/{fem → _src/fem}/geometry/quadmesh.py +26 -45
  36. warp/{fem → _src/fem}/geometry/tetmesh.py +40 -63
  37. warp/{fem → _src/fem}/geometry/trimesh.py +26 -45
  38. warp/{fem → _src/fem}/integrate.py +164 -158
  39. warp/_src/fem/linalg.py +383 -0
  40. warp/_src/fem/operator.py +396 -0
  41. warp/_src/fem/polynomial.py +229 -0
  42. warp/{fem → _src/fem}/quadrature/pic_quadrature.py +15 -20
  43. warp/{fem → _src/fem}/quadrature/quadrature.py +95 -47
  44. warp/_src/fem/space/__init__.py +248 -0
  45. warp/{fem → _src/fem}/space/basis_function_space.py +20 -11
  46. warp/_src/fem/space/basis_space.py +679 -0
  47. warp/{fem → _src/fem}/space/dof_mapper.py +3 -3
  48. warp/{fem → _src/fem}/space/function_space.py +14 -13
  49. warp/{fem → _src/fem}/space/grid_2d_function_space.py +4 -7
  50. warp/{fem → _src/fem}/space/grid_3d_function_space.py +4 -4
  51. warp/{fem → _src/fem}/space/hexmesh_function_space.py +4 -10
  52. warp/{fem → _src/fem}/space/nanogrid_function_space.py +3 -9
  53. warp/{fem → _src/fem}/space/partition.py +117 -60
  54. warp/{fem → _src/fem}/space/quadmesh_function_space.py +4 -10
  55. warp/{fem → _src/fem}/space/restriction.py +66 -33
  56. warp/_src/fem/space/shape/__init__.py +152 -0
  57. warp/{fem → _src/fem}/space/shape/cube_shape_function.py +9 -9
  58. warp/{fem → _src/fem}/space/shape/shape_function.py +8 -9
  59. warp/{fem → _src/fem}/space/shape/square_shape_function.py +6 -6
  60. warp/{fem → _src/fem}/space/shape/tet_shape_function.py +3 -3
  61. warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +3 -3
  62. warp/{fem → _src/fem}/space/tetmesh_function_space.py +3 -9
  63. warp/_src/fem/space/topology.py +459 -0
  64. warp/{fem → _src/fem}/space/trimesh_function_space.py +3 -9
  65. warp/_src/fem/types.py +112 -0
  66. warp/_src/fem/utils.py +486 -0
  67. warp/_src/jax.py +186 -0
  68. warp/_src/jax_experimental/__init__.py +14 -0
  69. warp/_src/jax_experimental/custom_call.py +387 -0
  70. warp/_src/jax_experimental/ffi.py +1284 -0
  71. warp/_src/jax_experimental/xla_ffi.py +656 -0
  72. warp/_src/marching_cubes.py +708 -0
  73. warp/_src/math.py +414 -0
  74. warp/_src/optim/__init__.py +14 -0
  75. warp/_src/optim/adam.py +163 -0
  76. warp/_src/optim/linear.py +1606 -0
  77. warp/_src/optim/sgd.py +112 -0
  78. warp/_src/paddle.py +406 -0
  79. warp/_src/render/__init__.py +14 -0
  80. warp/_src/render/imgui_manager.py +289 -0
  81. warp/_src/render/render_opengl.py +3636 -0
  82. warp/_src/render/render_usd.py +937 -0
  83. warp/_src/render/utils.py +160 -0
  84. warp/_src/sparse.py +2716 -0
  85. warp/_src/tape.py +1206 -0
  86. warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
  87. warp/_src/torch.py +391 -0
  88. warp/_src/types.py +5870 -0
  89. warp/_src/utils.py +1693 -0
  90. warp/autograd.py +12 -1054
  91. warp/bin/warp-clang.dll +0 -0
  92. warp/bin/warp.dll +0 -0
  93. warp/build.py +8 -588
  94. warp/build_dll.py +6 -721
  95. warp/codegen.py +6 -4251
  96. warp/constants.py +6 -39
  97. warp/context.py +12 -8062
  98. warp/dlpack.py +6 -444
  99. warp/examples/distributed/example_jacobi_mpi.py +4 -5
  100. warp/examples/fem/example_adaptive_grid.py +1 -1
  101. warp/examples/fem/example_apic_fluid.py +1 -1
  102. warp/examples/fem/example_burgers.py +8 -8
  103. warp/examples/fem/example_diffusion.py +1 -1
  104. warp/examples/fem/example_distortion_energy.py +1 -1
  105. warp/examples/fem/example_mixed_elasticity.py +2 -2
  106. warp/examples/fem/example_navier_stokes.py +1 -1
  107. warp/examples/fem/example_nonconforming_contact.py +7 -7
  108. warp/examples/fem/example_stokes.py +1 -1
  109. warp/examples/fem/example_stokes_transfer.py +1 -1
  110. warp/examples/fem/utils.py +2 -2
  111. warp/examples/interop/example_jax_callable.py +1 -1
  112. warp/examples/interop/example_jax_ffi_callback.py +1 -1
  113. warp/examples/interop/example_jax_kernel.py +1 -1
  114. warp/examples/tile/example_tile_mcgp.py +191 -0
  115. warp/fabric.py +6 -337
  116. warp/fem/__init__.py +159 -97
  117. warp/fem/adaptivity.py +7 -489
  118. warp/fem/cache.py +9 -648
  119. warp/fem/dirichlet.py +6 -184
  120. warp/fem/field/__init__.py +8 -109
  121. warp/fem/field/field.py +7 -652
  122. warp/fem/geometry/__init__.py +7 -18
  123. warp/fem/geometry/closest_point.py +11 -77
  124. warp/fem/linalg.py +18 -366
  125. warp/fem/operator.py +11 -369
  126. warp/fem/polynomial.py +9 -209
  127. warp/fem/space/__init__.py +5 -211
  128. warp/fem/space/basis_space.py +6 -662
  129. warp/fem/space/shape/__init__.py +41 -118
  130. warp/fem/space/topology.py +6 -437
  131. warp/fem/types.py +6 -81
  132. warp/fem/utils.py +11 -444
  133. warp/jax.py +8 -165
  134. warp/jax_experimental/__init__.py +14 -1
  135. warp/jax_experimental/custom_call.py +8 -365
  136. warp/jax_experimental/ffi.py +17 -873
  137. warp/jax_experimental/xla_ffi.py +5 -605
  138. warp/marching_cubes.py +5 -689
  139. warp/math.py +16 -393
  140. warp/native/array.h +385 -37
  141. warp/native/builtin.h +314 -37
  142. warp/native/bvh.cpp +43 -9
  143. warp/native/bvh.cu +62 -27
  144. warp/native/bvh.h +310 -309
  145. warp/native/clang/clang.cpp +102 -97
  146. warp/native/coloring.cpp +0 -1
  147. warp/native/crt.h +208 -0
  148. warp/native/exports.h +156 -0
  149. warp/native/hashgrid.cu +2 -0
  150. warp/native/intersect.h +24 -1
  151. warp/native/intersect_tri.h +44 -35
  152. warp/native/mat.h +1456 -276
  153. warp/native/mesh.cpp +4 -4
  154. warp/native/mesh.cu +4 -2
  155. warp/native/mesh.h +176 -61
  156. warp/native/quat.h +0 -52
  157. warp/native/scan.cu +2 -0
  158. warp/native/sparse.cu +7 -3
  159. warp/native/spatial.h +12 -0
  160. warp/native/tile.h +681 -89
  161. warp/native/tile_radix_sort.h +1 -1
  162. warp/native/tile_reduce.h +394 -46
  163. warp/native/tile_scan.h +4 -4
  164. warp/native/vec.h +469 -0
  165. warp/native/version.h +23 -0
  166. warp/native/volume.cpp +1 -1
  167. warp/native/volume.cu +1 -0
  168. warp/native/volume.h +1 -1
  169. warp/native/volume_builder.cu +2 -0
  170. warp/native/warp.cpp +57 -29
  171. warp/native/warp.cu +253 -171
  172. warp/native/warp.h +11 -8
  173. warp/optim/__init__.py +6 -3
  174. warp/optim/adam.py +6 -145
  175. warp/optim/linear.py +14 -1585
  176. warp/optim/sgd.py +6 -94
  177. warp/paddle.py +6 -388
  178. warp/render/__init__.py +8 -4
  179. warp/render/imgui_manager.py +7 -267
  180. warp/render/render_opengl.py +6 -3618
  181. warp/render/render_usd.py +6 -919
  182. warp/render/utils.py +6 -142
  183. warp/sparse.py +37 -2563
  184. warp/tape.py +6 -1188
  185. warp/tests/__main__.py +1 -1
  186. warp/tests/cuda/test_async.py +4 -4
  187. warp/tests/cuda/test_conditional_captures.py +1 -1
  188. warp/tests/cuda/test_multigpu.py +1 -1
  189. warp/tests/cuda/test_streams.py +58 -1
  190. warp/tests/geometry/test_bvh.py +157 -22
  191. warp/tests/geometry/test_marching_cubes.py +0 -1
  192. warp/tests/geometry/test_mesh.py +5 -3
  193. warp/tests/geometry/test_mesh_query_aabb.py +5 -12
  194. warp/tests/geometry/test_mesh_query_point.py +5 -2
  195. warp/tests/geometry/test_mesh_query_ray.py +15 -3
  196. warp/tests/geometry/test_volume_write.py +5 -5
  197. warp/tests/interop/test_dlpack.py +14 -14
  198. warp/tests/interop/test_jax.py +772 -49
  199. warp/tests/interop/test_paddle.py +1 -1
  200. warp/tests/test_adam.py +0 -1
  201. warp/tests/test_arithmetic.py +9 -9
  202. warp/tests/test_array.py +527 -100
  203. warp/tests/test_array_reduce.py +3 -3
  204. warp/tests/test_atomic.py +12 -8
  205. warp/tests/test_atomic_bitwise.py +209 -0
  206. warp/tests/test_atomic_cas.py +4 -4
  207. warp/tests/test_bool.py +2 -2
  208. warp/tests/test_builtins_resolution.py +5 -571
  209. warp/tests/test_codegen.py +33 -14
  210. warp/tests/test_conditional.py +1 -1
  211. warp/tests/test_context.py +6 -6
  212. warp/tests/test_copy.py +242 -161
  213. warp/tests/test_ctypes.py +3 -3
  214. warp/tests/test_devices.py +24 -2
  215. warp/tests/test_examples.py +16 -84
  216. warp/tests/test_fabricarray.py +35 -35
  217. warp/tests/test_fast_math.py +0 -2
  218. warp/tests/test_fem.py +56 -10
  219. warp/tests/test_fixedarray.py +3 -3
  220. warp/tests/test_func.py +8 -5
  221. warp/tests/test_generics.py +1 -1
  222. warp/tests/test_indexedarray.py +24 -24
  223. warp/tests/test_intersect.py +39 -9
  224. warp/tests/test_large.py +1 -1
  225. warp/tests/test_lerp.py +3 -1
  226. warp/tests/test_linear_solvers.py +1 -1
  227. warp/tests/test_map.py +35 -4
  228. warp/tests/test_mat.py +52 -62
  229. warp/tests/test_mat_constructors.py +4 -5
  230. warp/tests/test_mat_lite.py +1 -1
  231. warp/tests/test_mat_scalar_ops.py +121 -121
  232. warp/tests/test_math.py +34 -0
  233. warp/tests/test_module_aot.py +4 -4
  234. warp/tests/test_modules_lite.py +28 -2
  235. warp/tests/test_print.py +11 -11
  236. warp/tests/test_quat.py +93 -58
  237. warp/tests/test_runlength_encode.py +1 -1
  238. warp/tests/test_scalar_ops.py +38 -10
  239. warp/tests/test_smoothstep.py +1 -1
  240. warp/tests/test_sparse.py +126 -15
  241. warp/tests/test_spatial.py +105 -87
  242. warp/tests/test_special_values.py +6 -6
  243. warp/tests/test_static.py +7 -7
  244. warp/tests/test_struct.py +13 -2
  245. warp/tests/test_triangle_closest_point.py +48 -1
  246. warp/tests/test_types.py +27 -15
  247. warp/tests/test_utils.py +52 -52
  248. warp/tests/test_vec.py +29 -29
  249. warp/tests/test_vec_constructors.py +5 -5
  250. warp/tests/test_vec_scalar_ops.py +97 -97
  251. warp/tests/test_version.py +75 -0
  252. warp/tests/tile/test_tile.py +178 -0
  253. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  254. warp/tests/tile/test_tile_cholesky.py +7 -4
  255. warp/tests/tile/test_tile_load.py +26 -2
  256. warp/tests/tile/test_tile_mathdx.py +3 -3
  257. warp/tests/tile/test_tile_matmul.py +1 -1
  258. warp/tests/tile/test_tile_mlp.py +2 -4
  259. warp/tests/tile/test_tile_reduce.py +214 -13
  260. warp/tests/unittest_suites.py +6 -14
  261. warp/tests/unittest_utils.py +10 -9
  262. warp/tests/walkthrough_debug.py +3 -1
  263. warp/torch.py +6 -373
  264. warp/types.py +29 -5764
  265. warp/utils.py +10 -1659
  266. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/METADATA +46 -99
  267. warp_lang-1.10.0rc2.dist-info/RECORD +468 -0
  268. warp_lang-1.10.0rc2.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  269. warp_lang-1.10.0rc2.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  270. warp_lang-1.10.0rc2.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  271. warp_lang-1.10.0rc2.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  272. warp_lang-1.10.0rc2.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  273. warp_lang-1.10.0rc2.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  274. warp_lang-1.10.0rc2.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  275. warp_lang-1.10.0rc2.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  276. warp_lang-1.10.0rc2.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  277. warp_lang-1.10.0rc2.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  278. warp_lang-1.10.0rc2.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  279. warp_lang-1.10.0rc2.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  280. warp_lang-1.10.0rc2.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  281. warp_lang-1.10.0rc2.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  282. warp_lang-1.10.0rc2.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  283. warp/examples/assets/cartpole.urdf +0 -110
  284. warp/examples/assets/crazyflie.usd +0 -0
  285. warp/examples/assets/nv_ant.xml +0 -92
  286. warp/examples/assets/nv_humanoid.xml +0 -183
  287. warp/examples/assets/quadruped.urdf +0 -268
  288. warp/examples/optim/example_bounce.py +0 -266
  289. warp/examples/optim/example_cloth_throw.py +0 -228
  290. warp/examples/optim/example_drone.py +0 -870
  291. warp/examples/optim/example_inverse_kinematics.py +0 -182
  292. warp/examples/optim/example_inverse_kinematics_torch.py +0 -191
  293. warp/examples/optim/example_softbody_properties.py +0 -400
  294. warp/examples/optim/example_spring_cage.py +0 -245
  295. warp/examples/optim/example_trajectory.py +0 -227
  296. warp/examples/sim/example_cartpole.py +0 -143
  297. warp/examples/sim/example_cloth.py +0 -225
  298. warp/examples/sim/example_cloth_self_contact.py +0 -316
  299. warp/examples/sim/example_granular.py +0 -130
  300. warp/examples/sim/example_granular_collision_sdf.py +0 -202
  301. warp/examples/sim/example_jacobian_ik.py +0 -244
  302. warp/examples/sim/example_particle_chain.py +0 -124
  303. warp/examples/sim/example_quadruped.py +0 -203
  304. warp/examples/sim/example_rigid_chain.py +0 -203
  305. warp/examples/sim/example_rigid_contact.py +0 -195
  306. warp/examples/sim/example_rigid_force.py +0 -133
  307. warp/examples/sim/example_rigid_gyroscopic.py +0 -115
  308. warp/examples/sim/example_rigid_soft_contact.py +0 -140
  309. warp/examples/sim/example_soft_body.py +0 -196
  310. warp/examples/tile/example_tile_walker.py +0 -327
  311. warp/sim/__init__.py +0 -74
  312. warp/sim/articulation.py +0 -793
  313. warp/sim/collide.py +0 -2570
  314. warp/sim/graph_coloring.py +0 -307
  315. warp/sim/import_mjcf.py +0 -791
  316. warp/sim/import_snu.py +0 -227
  317. warp/sim/import_urdf.py +0 -579
  318. warp/sim/import_usd.py +0 -898
  319. warp/sim/inertia.py +0 -357
  320. warp/sim/integrator.py +0 -245
  321. warp/sim/integrator_euler.py +0 -2000
  322. warp/sim/integrator_featherstone.py +0 -2101
  323. warp/sim/integrator_vbd.py +0 -2487
  324. warp/sim/integrator_xpbd.py +0 -3295
  325. warp/sim/model.py +0 -4821
  326. warp/sim/particles.py +0 -121
  327. warp/sim/render.py +0 -431
  328. warp/sim/utils.py +0 -431
  329. warp/tests/sim/disabled_kinematics.py +0 -244
  330. warp/tests/sim/test_cloth.py +0 -863
  331. warp/tests/sim/test_collision.py +0 -743
  332. warp/tests/sim/test_coloring.py +0 -347
  333. warp/tests/sim/test_inertia.py +0 -161
  334. warp/tests/sim/test_model.py +0 -226
  335. warp/tests/sim/test_sim_grad.py +0 -287
  336. warp/tests/sim/test_sim_grad_bounce_linear.py +0 -212
  337. warp/tests/sim/test_sim_kinematics.py +0 -98
  338. warp/thirdparty/__init__.py +0 -0
  339. warp_lang-1.9.1.dist-info/RECORD +0 -456
  340. /warp/{fem → _src/fem}/quadrature/__init__.py +0 -0
  341. /warp/{tests/sim → _src/thirdparty}/__init__.py +0 -0
  342. /warp/{thirdparty → _src/thirdparty}/appdirs.py +0 -0
  343. /warp/{thirdparty → _src/thirdparty}/dlpack.py +0 -0
  344. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/WHEEL +0 -0
  345. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/licenses/LICENSE.md +0 -0
  346. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/top_level.txt +0 -0
warp/optim/sgd.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,100 +13,12 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- from typing import Any
16
+ # TODO: Remove after cleaning up the public API.
17
17
 
18
- import warp as wp
18
+ from warp._src.optim import sgd as _sgd
19
19
 
20
20
 
21
- @wp.kernel
22
- def sgd_step_kernel(
23
- g: wp.array(dtype=Any),
24
- b: wp.array(dtype=Any),
25
- lr: float,
26
- weight_decay: float,
27
- momentum: float,
28
- damping: float,
29
- nesterov: int,
30
- t: int,
31
- params: wp.array(dtype=Any),
32
- ):
33
- i = wp.tid()
34
- gt = g[i]
35
- if weight_decay != 0.0:
36
- gt += weight_decay * params[i]
37
- if momentum != 0.0:
38
- bt = b[i]
39
- if t > 0:
40
- bt = momentum * bt + (1.0 - damping) * gt
41
- else:
42
- bt = gt
43
- if nesterov == 1:
44
- gt += momentum * bt
45
- else:
46
- gt = bt
47
- b[i] = bt
48
- params[i] = params[i] - lr * gt
21
+ def __getattr__(name):
22
+ from warp._src.utils import get_deprecated_api
49
23
 
50
-
51
- class SGD:
52
- """An implementation of the Stochastic Gradient Descent Optimizer
53
- It is designed to mimic Pytorch's version.
54
- https://pytorch.org/docs/stable/generated/torch.optim.SGD.html
55
- """
56
-
57
- def __init__(self, params=None, lr=0.001, momentum=0.0, dampening=0.0, weight_decay=0.0, nesterov=False):
58
- self.b = [] # momentum buffer
59
- self.set_params(params)
60
- self.lr = lr
61
- self.momentum = momentum
62
- self.dampening = dampening
63
- self.weight_decay = weight_decay
64
- self.nesterov = nesterov
65
- self.t = 0
66
-
67
- def set_params(self, params):
68
- self.params = params
69
- if params is not None and isinstance(params, list) and len(params) > 0:
70
- if len(self.b) != len(params):
71
- self.b = [None] * len(params)
72
- for i in range(len(params)):
73
- param = params[i]
74
- if self.b[i] is None or self.b[i].shape != param.shape or self.b[i].dtype != param.dtype:
75
- self.b[i] = wp.zeros_like(param)
76
- # Overload the kernel for each parameter so we can precompile the SGD kernel
77
- if param is not None:
78
- wp.overload(sgd_step_kernel, {"g": param, "b": param, "params": param})
79
-
80
- def reset_internal_state(self):
81
- for b_i in self.b:
82
- b_i.zero_()
83
- self.t = 0
84
-
85
- def step(self, grad):
86
- assert self.params is not None
87
- for i in range(len(self.params)):
88
- SGD.step_detail(
89
- grad[i],
90
- self.b[i],
91
- self.lr,
92
- self.momentum,
93
- self.dampening,
94
- self.weight_decay,
95
- self.nesterov,
96
- self.t,
97
- self.params[i],
98
- )
99
- self.t = self.t + 1
100
-
101
- @staticmethod
102
- def step_detail(g, b, lr, momentum, dampening, weight_decay, nesterov, t, params):
103
- assert params.dtype == g.dtype
104
- assert params.dtype == b.dtype
105
- assert params.shape == g.shape
106
- kernel_inputs = [g, b, lr, momentum, dampening, weight_decay, int(nesterov), t, params]
107
- wp.launch(
108
- kernel=sgd_step_kernel,
109
- dim=len(params),
110
- inputs=kernel_inputs,
111
- device=params.device,
112
- )
24
+ return get_deprecated_api(_sgd, "wp.optim", name)
warp/paddle.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,394 +13,12 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- from __future__ import annotations
16
+ # TODO: Remove after cleaning up the public API.
17
17
 
18
- import ctypes
19
- from typing import TYPE_CHECKING
18
+ from warp._src import paddle as _paddle
20
19
 
21
- import numpy
22
20
 
23
- import warp
24
- import warp.context
21
+ def __getattr__(name):
22
+ from warp._src.utils import get_deprecated_api
25
23
 
26
- if TYPE_CHECKING:
27
- import paddle
28
- from paddle.base.libpaddle import CPUPlace, CUDAPinnedPlace, CUDAPlace, Place
29
-
30
-
31
- # return the warp device corresponding to a paddle device
32
- def device_from_paddle(paddle_device: Place | CPUPlace | CUDAPinnedPlace | CUDAPlace | str) -> warp.context.Device:
33
- """Return the Warp device corresponding to a Paddle device.
34
-
35
- Args:
36
- paddle_device (`Place`, `CPUPlace`, `CUDAPinnedPlace`, `CUDAPlace`, or `str`): Paddle device identifier
37
-
38
- Raises:
39
- RuntimeError: Paddle device does not have a corresponding Warp device
40
- """
41
- if type(paddle_device) is str:
42
- if paddle_device.startswith("gpu:"):
43
- paddle_device = paddle_device.replace("gpu:", "cuda:")
44
- warp_device = warp.context.runtime.device_map.get(paddle_device)
45
- if warp_device is not None:
46
- return warp_device
47
- elif paddle_device == "gpu":
48
- return warp.context.runtime.get_current_cuda_device()
49
- else:
50
- raise RuntimeError(f"Unsupported Paddle device {paddle_device}")
51
- else:
52
- try:
53
- from paddle.base.libpaddle import CPUPlace, CUDAPinnedPlace, CUDAPlace, Place
54
-
55
- if isinstance(paddle_device, Place):
56
- if paddle_device.is_gpu_place():
57
- return warp.context.runtime.cuda_devices[paddle_device.gpu_device_id()]
58
- elif paddle_device.is_cpu_place():
59
- return warp.context.runtime.cpu_device
60
- else:
61
- raise RuntimeError(f"Unsupported Paddle device type {paddle_device}")
62
- elif isinstance(paddle_device, (CPUPlace, CUDAPinnedPlace)):
63
- return warp.context.runtime.cpu_device
64
- elif isinstance(paddle_device, CUDAPlace):
65
- return warp.context.runtime.cuda_devices[paddle_device.get_device_id()]
66
- else:
67
- raise RuntimeError(f"Unsupported Paddle device type {paddle_device}")
68
- except ModuleNotFoundError as e:
69
- raise ModuleNotFoundError("Please install paddlepaddle first.") from e
70
- except Exception as e:
71
- if not isinstance(paddle_device, (Place, CPUPlace, CUDAPinnedPlace, CUDAPlace)):
72
- raise TypeError(
73
- "device_from_paddle() received an invalid argument - "
74
- f"got {paddle_device}({type(paddle_device)}), but expected one of:\n"
75
- "* paddle.base.libpaddle.Place\n"
76
- "* paddle.CPUPlace\n"
77
- "* paddle.CUDAPinnedPlace\n"
78
- "* paddle.CUDAPlace or 'gpu' or 'gpu:x'(x means device id)"
79
- ) from e
80
- raise
81
-
82
-
83
- def device_to_paddle(warp_device: warp.context.Devicelike) -> str:
84
- """Return the Paddle device string corresponding to a Warp device.
85
-
86
- Args:
87
- warp_device: An identifier that can be resolved to a :class:`warp.context.Device`.
88
-
89
- Raises:
90
- RuntimeError: The Warp device is not compatible with PyPaddle.
91
- """
92
- device = warp.get_device(warp_device)
93
- if device.is_cpu or device.is_primary:
94
- return str(device).replace("cuda", "gpu")
95
- elif device.is_cuda and device.is_uva:
96
- # it's not a primary context, but paddle can access the data ptr directly thanks to UVA
97
- return f"gpu:{device.ordinal}"
98
- raise RuntimeError(f"Warp device {device} is not compatible with paddle")
99
-
100
-
101
- def dtype_to_paddle(warp_dtype):
102
- """Return the Paddle dtype corresponding to a Warp dtype.
103
-
104
- Args:
105
- warp_dtype: A Warp data type that has a corresponding ``paddle.dtype``.
106
- ``warp.uint16``, ``warp.uint32``, and ``warp.uint64`` are mapped
107
- to the signed integer ``paddle.dtype`` of the same width.
108
- Raises:
109
- TypeError: Unable to find a corresponding PyPaddle data type.
110
- """
111
- # initialize lookup table on first call to defer paddle import
112
- if dtype_to_paddle.type_map is None:
113
- import paddle
114
-
115
- dtype_to_paddle.type_map = {
116
- warp.float16: paddle.float16,
117
- warp.float32: paddle.float32,
118
- warp.float64: paddle.float64,
119
- warp.int8: paddle.int8,
120
- warp.int16: paddle.int16,
121
- warp.int32: paddle.int32,
122
- warp.int64: paddle.int64,
123
- warp.uint8: paddle.uint8,
124
- warp.bool: paddle.bool,
125
- # paddle doesn't support unsigned ints bigger than 8 bits
126
- warp.uint16: paddle.int16,
127
- warp.uint32: paddle.int32,
128
- warp.uint64: paddle.int64,
129
- }
130
-
131
- paddle_dtype = dtype_to_paddle.type_map.get(warp_dtype)
132
- if paddle_dtype is not None:
133
- return paddle_dtype
134
- else:
135
- raise TypeError(f"Cannot convert {warp_dtype} to a Paddle type")
136
-
137
-
138
- def dtype_from_paddle(paddle_dtype):
139
- """Return the Warp dtype corresponding to a Paddle dtype.
140
-
141
- Args:
142
- paddle_dtype: A ``paddle.dtype`` that has a corresponding Warp data type.
143
- Currently ``paddle.bfloat16``, ``paddle.complex64``, and
144
- ``paddle.complex128`` are not supported.
145
-
146
- Raises:
147
- TypeError: Unable to find a corresponding Warp data type.
148
- """
149
- # initialize lookup table on first call to defer paddle import
150
- if dtype_from_paddle.type_map is None:
151
- import paddle
152
-
153
- dtype_from_paddle.type_map = {
154
- paddle.float16: warp.float16,
155
- paddle.float32: warp.float32,
156
- paddle.float64: warp.float64,
157
- paddle.int8: warp.int8,
158
- paddle.int16: warp.int16,
159
- paddle.int32: warp.int32,
160
- paddle.int64: warp.int64,
161
- paddle.uint8: warp.uint8,
162
- paddle.bool: warp.bool,
163
- # currently unsupported by Warp
164
- # paddle.bfloat16:
165
- # paddle.complex64:
166
- # paddle.complex128:
167
- }
168
-
169
- warp_dtype = dtype_from_paddle.type_map.get(paddle_dtype)
170
-
171
- if warp_dtype is not None:
172
- return warp_dtype
173
- else:
174
- raise TypeError(f"Cannot convert {paddle_dtype} to a Warp type")
175
-
176
-
177
- def dtype_is_compatible(paddle_dtype: paddle.dtype, warp_dtype) -> bool:
178
- """Evaluates whether the given paddle dtype is compatible with the given Warp dtype."""
179
- # initialize lookup table on first call to defer paddle import
180
- if dtype_is_compatible.compatible_sets is None:
181
- import paddle
182
-
183
- dtype_is_compatible.compatible_sets = {
184
- paddle.float64: {warp.float64},
185
- paddle.float32: {warp.float32},
186
- paddle.float16: {warp.float16},
187
- # allow aliasing integer tensors as signed or unsigned integer arrays
188
- paddle.int64: {warp.int64, warp.uint64},
189
- paddle.int32: {warp.int32, warp.uint32},
190
- paddle.int16: {warp.int16, warp.uint16},
191
- paddle.int8: {warp.int8, warp.uint8},
192
- paddle.uint8: {warp.uint8, warp.int8},
193
- paddle.bool: {warp.bool, warp.uint8, warp.int8},
194
- # currently unsupported by Warp
195
- # paddle.bfloat16:
196
- # paddle.complex64:
197
- # paddle.complex128:
198
- }
199
-
200
- compatible_set = dtype_is_compatible.compatible_sets.get(paddle_dtype)
201
-
202
- if compatible_set is not None:
203
- if warp_dtype in compatible_set:
204
- return True
205
- # check if it's a vector or matrix type
206
- if hasattr(warp_dtype, "_wp_scalar_type_"):
207
- return warp_dtype._wp_scalar_type_ in compatible_set
208
-
209
- return False
210
-
211
-
212
- # lookup tables initialized when needed
213
- dtype_from_paddle.type_map = None
214
- dtype_to_paddle.type_map = None
215
- dtype_is_compatible.compatible_sets = None
216
-
217
-
218
- # wrap a paddle tensor to a wp array, data is not copied
219
- def from_paddle(
220
- t: paddle.Tensor,
221
- dtype: paddle.dtype | None = None,
222
- requires_grad: bool | None = None,
223
- grad: paddle.Tensor | None = None,
224
- return_ctype: bool = False,
225
- ) -> warp.array:
226
- """Convert a Paddle tensor to a Warp array without copying the data.
227
-
228
- Args:
229
- t (paddle.Tensor): The paddle tensor to wrap.
230
- dtype (warp.dtype, optional): The target data type of the resulting Warp array. Defaults to the tensor value type mapped to a Warp array value type.
231
- requires_grad (bool, optional): Whether the resulting array should wrap the tensor's gradient, if it exists (the grad tensor will be allocated otherwise). Defaults to the tensor's `requires_grad` value.
232
- grad (paddle.Tensor, optional): The grad attached to given tensor. Defaults to None.
233
- return_ctype (bool, optional): Whether to return a low-level array descriptor instead of a ``wp.array`` object (faster). The descriptor can be passed to Warp kernels.
234
-
235
- Returns:
236
- warp.array: The wrapped array or array descriptor.
237
- """
238
- if dtype is None:
239
- dtype = dtype_from_paddle(t.dtype)
240
- elif not dtype_is_compatible(t.dtype, dtype):
241
- raise RuntimeError(f"Cannot convert Paddle type {t.dtype} to Warp type {dtype}")
242
-
243
- # get size of underlying data type to compute strides
244
- ctype_size = ctypes.sizeof(dtype._type_)
245
-
246
- shape = tuple(t.shape)
247
- strides = tuple(s * ctype_size for s in t.strides)
248
-
249
- # if target is a vector or matrix type
250
- # then check if trailing dimensions match
251
- # the target type and update the shape
252
- if hasattr(dtype, "_shape_"):
253
- dtype_shape = dtype._shape_
254
- dtype_dims = len(dtype._shape_)
255
- # ensure inner shape matches
256
- if dtype_dims > len(shape) or dtype_shape != shape[-dtype_dims:]:
257
- raise RuntimeError(
258
- f"Could not convert Paddle tensor with shape {shape} to Warp array with dtype={dtype}, ensure that source inner shape is {dtype_shape}"
259
- )
260
- # ensure inner strides are contiguous
261
- if strides[-1] != ctype_size or (dtype_dims > 1 and strides[-2] != ctype_size * dtype_shape[-1]):
262
- raise RuntimeError(
263
- f"Could not convert Paddle tensor with shape {shape} to Warp array with dtype={dtype}, because the source inner strides are not contiguous"
264
- )
265
- # trim shape and strides
266
- shape = tuple(shape[:-dtype_dims]) or (1,)
267
- strides = tuple(strides[:-dtype_dims]) or (ctype_size,)
268
-
269
- # gradient
270
- # - if return_ctype is False, we set `grad` to a wp.array or None
271
- # - if return_ctype is True, we set `grad_ptr` and set `grad` as the owner (wp.array or paddle.Tensor)
272
- requires_grad = (not t.stop_gradient) if requires_grad is None else requires_grad
273
- grad_ptr = 0
274
- if grad is not None:
275
- if isinstance(grad, warp.array):
276
- if return_ctype:
277
- if grad.strides != strides:
278
- raise RuntimeError(
279
- f"Gradient strides must match array strides, expected {strides} but got {grad.strides}"
280
- )
281
- grad_ptr = grad.ptr
282
- else:
283
- # assume grad is a paddle.Tensor
284
- if return_ctype:
285
- if t.strides != grad.strides:
286
- raise RuntimeError(
287
- f"Gradient strides must match array strides, expected {t.strides} but got {grad.strides}"
288
- )
289
- grad_ptr = grad.data_ptr()
290
- else:
291
- grad = from_paddle(grad, dtype=dtype, requires_grad=False)
292
- elif requires_grad:
293
- # wrap the tensor gradient, allocate if necessary
294
- if t.grad is not None:
295
- if return_ctype:
296
- grad = t.grad
297
- if t.strides != grad.strides:
298
- raise RuntimeError(
299
- f"Gradient strides must match array strides, expected {t.strides} but got {grad.strides}"
300
- )
301
- grad_ptr = grad.data_ptr()
302
- else:
303
- grad = from_paddle(t.grad, dtype=dtype, requires_grad=False)
304
- else:
305
- # allocate a zero-filled gradient if it doesn't exist
306
- # Note: we use Warp to allocate the shared gradient with compatible strides
307
- grad = warp.zeros(dtype=dtype, shape=shape, strides=strides, device=device_from_paddle(t.place))
308
- # use .grad_ for zero-copy
309
- t.grad_ = to_paddle(grad, requires_grad=False)
310
- grad_ptr = grad.ptr
311
-
312
- if return_ctype:
313
- ptr = t.data_ptr()
314
-
315
- # create array descriptor
316
- array_ctype = warp.types.array_t(ptr, grad_ptr, len(shape), shape, strides)
317
-
318
- # keep data and gradient alive
319
- array_ctype._ref = t
320
- array_ctype._gradref = grad
321
-
322
- return array_ctype
323
-
324
- else:
325
- a = warp.array(
326
- ptr=t.data_ptr(),
327
- dtype=dtype,
328
- shape=shape,
329
- strides=strides,
330
- device=device_from_paddle(t.place),
331
- copy=False,
332
- grad=grad,
333
- requires_grad=requires_grad,
334
- )
335
-
336
- # save a reference to the source tensor, otherwise it may get deallocated
337
- a._tensor = t
338
-
339
- return a
340
-
341
-
342
- def to_paddle(a: warp.array, requires_grad: bool | None = None) -> paddle.Tensor:
343
- """Convert a Warp array to a Paddle tensor without copying the data.
344
-
345
- Args:
346
- a (warp.array): The Warp array to convert.
347
- requires_grad (bool, optional): Whether the resulting tensor should convert the array's gradient, if it exists, to a grad tensor. Defaults to the array's `requires_grad` value.
348
-
349
- Returns:
350
- paddle.Tensor: The converted tensor.
351
- """
352
- import paddle
353
- import paddle.utils.dlpack
354
-
355
- if requires_grad is None:
356
- requires_grad = a.requires_grad
357
-
358
- # Paddle does not support structured arrays
359
- if isinstance(a.dtype, warp.codegen.Struct):
360
- raise RuntimeError("Cannot convert structured Warp arrays to Paddle.")
361
-
362
- if a.device.is_cpu:
363
- # Paddle has an issue wrapping CPU objects
364
- # that support the __array_interface__ protocol
365
- # in this case we need to workaround by going
366
- # to an ndarray first, see https://pearu.github.io/array_interface_pypaddle.html
367
- t = paddle.to_tensor(numpy.asarray(a), place="cpu")
368
- t.stop_gradient = not requires_grad
369
- if requires_grad and a.requires_grad:
370
- # use .grad_ for zero-copy
371
- t.grad_ = paddle.to_tensor(numpy.asarray(a.grad), place="cpu")
372
- return t
373
-
374
- elif a.device.is_cuda:
375
- # Paddle does support the __cuda_array_interface__
376
- # correctly, but we must be sure to maintain a reference
377
- # to the owning object to prevent memory allocs going out of scope
378
- t = paddle.utils.dlpack.from_dlpack(warp.to_dlpack(a)).to(device=device_to_paddle(a.device))
379
- t.stop_gradient = not requires_grad
380
- if requires_grad and a.requires_grad:
381
- # use .grad_ for zero-copy
382
- t.grad_ = paddle.utils.dlpack.from_dlpack(warp.to_dlpack(a.grad)).to(device=device_to_paddle(a.device))
383
- return t
384
-
385
- else:
386
- raise RuntimeError("Unsupported device")
387
-
388
-
389
- def stream_from_paddle(stream_or_device=None):
390
- """Convert from a Paddle CUDA stream to a Warp CUDA stream."""
391
- import paddle
392
-
393
- if isinstance(stream_or_device, paddle.device.Stream):
394
- stream = stream_or_device
395
- else:
396
- # assume arg is a paddle device
397
- stream = paddle.device.current_stream(stream_or_device)
398
-
399
- device = device_from_paddle(stream.device)
400
-
401
- warp_stream = warp.Stream(device, cuda_stream=stream.stream_base.cuda_stream)
402
-
403
- # save a reference to the source stream, otherwise it may be destroyed
404
- warp_stream._paddle_stream = stream
405
-
406
- return warp_stream
24
+ return get_deprecated_api(_paddle, "wp", name)
warp/render/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,6 +13,10 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- from .render_opengl import OpenGLRenderer
17
- from .render_usd import UsdRenderer
18
- from .utils import bourke_color_map
16
+ # isort: skip_file
17
+
18
+ from warp._src.render.render_opengl import OpenGLRenderer as OpenGLRenderer
19
+
20
+ from warp._src.render.render_usd import UsdRenderer as UsdRenderer
21
+
22
+ from warp._src.render.utils import bourke_color_map as bourke_color_map