warp-lang 0.10.1__py3-none-win_amd64.whl → 0.11.0__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 (300) hide show
  1. warp/__init__.py +10 -4
  2. warp/__init__.pyi +1 -0
  3. warp/bin/warp-clang.dll +0 -0
  4. warp/bin/warp.dll +0 -0
  5. warp/build.py +5 -3
  6. warp/build_dll.py +29 -9
  7. warp/builtins.py +868 -507
  8. warp/codegen.py +1074 -638
  9. warp/config.py +3 -3
  10. warp/constants.py +6 -0
  11. warp/context.py +715 -222
  12. warp/fabric.py +326 -0
  13. warp/fem/__init__.py +27 -0
  14. warp/fem/cache.py +389 -0
  15. warp/fem/dirichlet.py +181 -0
  16. warp/fem/domain.py +263 -0
  17. warp/fem/field/__init__.py +101 -0
  18. warp/fem/field/field.py +149 -0
  19. warp/fem/field/nodal_field.py +299 -0
  20. warp/fem/field/restriction.py +21 -0
  21. warp/fem/field/test.py +181 -0
  22. warp/fem/field/trial.py +183 -0
  23. warp/fem/geometry/__init__.py +19 -0
  24. warp/fem/geometry/closest_point.py +70 -0
  25. warp/fem/geometry/deformed_geometry.py +271 -0
  26. warp/fem/geometry/element.py +744 -0
  27. warp/fem/geometry/geometry.py +186 -0
  28. warp/fem/geometry/grid_2d.py +373 -0
  29. warp/fem/geometry/grid_3d.py +435 -0
  30. warp/fem/geometry/hexmesh.py +953 -0
  31. warp/fem/geometry/partition.py +376 -0
  32. warp/fem/geometry/quadmesh_2d.py +532 -0
  33. warp/fem/geometry/tetmesh.py +840 -0
  34. warp/fem/geometry/trimesh_2d.py +577 -0
  35. warp/fem/integrate.py +1616 -0
  36. warp/fem/operator.py +191 -0
  37. warp/fem/polynomial.py +213 -0
  38. warp/fem/quadrature/__init__.py +2 -0
  39. warp/fem/quadrature/pic_quadrature.py +245 -0
  40. warp/fem/quadrature/quadrature.py +294 -0
  41. warp/fem/space/__init__.py +292 -0
  42. warp/fem/space/basis_space.py +489 -0
  43. warp/fem/space/collocated_function_space.py +105 -0
  44. warp/fem/space/dof_mapper.py +236 -0
  45. warp/fem/space/function_space.py +145 -0
  46. warp/fem/space/grid_2d_function_space.py +267 -0
  47. warp/fem/space/grid_3d_function_space.py +306 -0
  48. warp/fem/space/hexmesh_function_space.py +352 -0
  49. warp/fem/space/partition.py +350 -0
  50. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  51. warp/fem/space/restriction.py +160 -0
  52. warp/fem/space/shape/__init__.py +15 -0
  53. warp/fem/space/shape/cube_shape_function.py +738 -0
  54. warp/fem/space/shape/shape_function.py +103 -0
  55. warp/fem/space/shape/square_shape_function.py +611 -0
  56. warp/fem/space/shape/tet_shape_function.py +567 -0
  57. warp/fem/space/shape/triangle_shape_function.py +429 -0
  58. warp/fem/space/tetmesh_function_space.py +292 -0
  59. warp/fem/space/topology.py +295 -0
  60. warp/fem/space/trimesh_2d_function_space.py +221 -0
  61. warp/fem/types.py +77 -0
  62. warp/fem/utils.py +495 -0
  63. warp/native/array.h +147 -44
  64. warp/native/builtin.h +122 -149
  65. warp/native/bvh.cpp +73 -325
  66. warp/native/bvh.cu +406 -23
  67. warp/native/bvh.h +34 -43
  68. warp/native/clang/clang.cpp +13 -8
  69. warp/native/crt.h +2 -0
  70. warp/native/cuda_crt.h +5 -0
  71. warp/native/cuda_util.cpp +15 -3
  72. warp/native/cuda_util.h +3 -1
  73. warp/native/cutlass/tools/library/scripts/conv2d_operation.py +463 -0
  74. warp/native/cutlass/tools/library/scripts/conv3d_operation.py +321 -0
  75. warp/native/cutlass/tools/library/scripts/gemm_operation.py +988 -0
  76. warp/native/cutlass/tools/library/scripts/generator.py +4625 -0
  77. warp/native/cutlass/tools/library/scripts/library.py +799 -0
  78. warp/native/cutlass/tools/library/scripts/manifest.py +402 -0
  79. warp/native/cutlass/tools/library/scripts/pycutlass/docs/source/conf.py +96 -0
  80. warp/native/cutlass/tools/library/scripts/pycutlass/profile/conv/conv2d_f16_sm80.py +106 -0
  81. warp/native/cutlass/tools/library/scripts/pycutlass/profile/gemm/gemm_f32_sm80.py +91 -0
  82. warp/native/cutlass/tools/library/scripts/pycutlass/setup.py +80 -0
  83. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/__init__.py +48 -0
  84. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/arguments.py +118 -0
  85. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/c_types.py +241 -0
  86. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/compiler.py +432 -0
  87. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/conv2d_operation.py +631 -0
  88. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/epilogue.py +1026 -0
  89. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/frontend.py +104 -0
  90. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/gemm_operation.py +1276 -0
  91. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/library.py +744 -0
  92. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/memory_manager.py +74 -0
  93. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/operation.py +110 -0
  94. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/parser.py +619 -0
  95. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/reduction_operation.py +398 -0
  96. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/tensor_ref.py +70 -0
  97. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/__init__.py +4 -0
  98. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/conv2d_testbed.py +646 -0
  99. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_grouped_testbed.py +235 -0
  100. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_testbed.py +557 -0
  101. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/profiler.py +70 -0
  102. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/type_hint.py +39 -0
  103. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/__init__.py +1 -0
  104. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/device.py +76 -0
  105. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/reference_model.py +255 -0
  106. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/__init__.py +0 -0
  107. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +201 -0
  108. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +177 -0
  109. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +98 -0
  110. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +95 -0
  111. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_few_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +163 -0
  112. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_fixed_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +187 -0
  113. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +309 -0
  114. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +54 -0
  115. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  116. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  117. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_strided_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +253 -0
  118. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +97 -0
  119. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +242 -0
  120. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  121. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  122. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/run_all_tests.py +10 -0
  123. warp/native/cutlass/tools/library/scripts/pycutlass/test/frontend/test_frontend.py +146 -0
  124. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/__init__.py +0 -0
  125. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_bf16_sm80.py +96 -0
  126. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f16_sm80.py +447 -0
  127. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f32_sm80.py +146 -0
  128. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f64_sm80.py +102 -0
  129. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_grouped_sm80.py +203 -0
  130. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_s8_sm80.py +229 -0
  131. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/run_all_tests.py +9 -0
  132. warp/native/cutlass/tools/library/scripts/pycutlass/test/unit/test_sm80.py +453 -0
  133. warp/native/cutlass/tools/library/scripts/rank_2k_operation.py +398 -0
  134. warp/native/cutlass/tools/library/scripts/rank_k_operation.py +387 -0
  135. warp/native/cutlass/tools/library/scripts/rt.py +796 -0
  136. warp/native/cutlass/tools/library/scripts/symm_operation.py +400 -0
  137. warp/native/cutlass/tools/library/scripts/trmm_operation.py +407 -0
  138. warp/native/cutlass_gemm.cu +5 -3
  139. warp/native/exports.h +1240 -952
  140. warp/native/fabric.h +228 -0
  141. warp/native/hashgrid.cpp +4 -4
  142. warp/native/hashgrid.h +22 -2
  143. warp/native/intersect.h +22 -7
  144. warp/native/intersect_adj.h +8 -8
  145. warp/native/intersect_tri.h +1 -1
  146. warp/native/marching.cu +157 -161
  147. warp/native/mat.h +80 -19
  148. warp/native/matnn.h +2 -2
  149. warp/native/mesh.cpp +33 -108
  150. warp/native/mesh.cu +114 -23
  151. warp/native/mesh.h +446 -46
  152. warp/native/noise.h +272 -329
  153. warp/native/quat.h +51 -8
  154. warp/native/rand.h +45 -35
  155. warp/native/range.h +6 -2
  156. warp/native/reduce.cpp +1 -1
  157. warp/native/reduce.cu +10 -12
  158. warp/native/runlength_encode.cu +6 -10
  159. warp/native/scan.cu +8 -11
  160. warp/native/sparse.cpp +4 -4
  161. warp/native/sparse.cu +164 -154
  162. warp/native/spatial.h +2 -2
  163. warp/native/temp_buffer.h +14 -30
  164. warp/native/vec.h +107 -23
  165. warp/native/volume.h +120 -0
  166. warp/native/warp.cpp +560 -30
  167. warp/native/warp.cu +431 -44
  168. warp/native/warp.h +13 -4
  169. warp/optim/__init__.py +1 -0
  170. warp/optim/linear.py +922 -0
  171. warp/optim/sgd.py +92 -0
  172. warp/render/render_opengl.py +335 -119
  173. warp/render/render_usd.py +11 -11
  174. warp/sim/__init__.py +2 -2
  175. warp/sim/articulation.py +385 -185
  176. warp/sim/collide.py +8 -0
  177. warp/sim/import_mjcf.py +297 -106
  178. warp/sim/import_urdf.py +389 -210
  179. warp/sim/import_usd.py +198 -97
  180. warp/sim/inertia.py +17 -18
  181. warp/sim/integrator_euler.py +14 -8
  182. warp/sim/integrator_xpbd.py +158 -16
  183. warp/sim/model.py +795 -291
  184. warp/sim/render.py +3 -3
  185. warp/sim/utils.py +3 -0
  186. warp/sparse.py +640 -150
  187. warp/stubs.py +606 -267
  188. warp/tape.py +61 -10
  189. warp/tests/__main__.py +3 -6
  190. warp/tests/assets/curlnoise_golden.npy +0 -0
  191. warp/tests/assets/pnoise_golden.npy +0 -0
  192. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  193. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  194. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  195. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  196. warp/tests/aux_test_unresolved_func.py +14 -0
  197. warp/tests/aux_test_unresolved_symbol.py +14 -0
  198. warp/tests/disabled_kinematics.py +239 -0
  199. warp/tests/run_coverage_serial.py +31 -0
  200. warp/tests/test_adam.py +103 -106
  201. warp/tests/test_arithmetic.py +128 -74
  202. warp/tests/test_array.py +212 -97
  203. warp/tests/test_array_reduce.py +57 -23
  204. warp/tests/test_atomic.py +64 -28
  205. warp/tests/test_bool.py +99 -0
  206. warp/tests/test_builtins_resolution.py +1292 -0
  207. warp/tests/test_bvh.py +42 -18
  208. warp/tests/test_closest_point_edge_edge.py +54 -57
  209. warp/tests/test_codegen.py +208 -130
  210. warp/tests/test_compile_consts.py +28 -20
  211. warp/tests/test_conditional.py +108 -24
  212. warp/tests/test_copy.py +10 -12
  213. warp/tests/test_ctypes.py +112 -88
  214. warp/tests/test_dense.py +21 -14
  215. warp/tests/test_devices.py +98 -0
  216. warp/tests/test_dlpack.py +75 -75
  217. warp/tests/test_examples.py +277 -0
  218. warp/tests/test_fabricarray.py +955 -0
  219. warp/tests/test_fast_math.py +15 -11
  220. warp/tests/test_fem.py +1271 -0
  221. warp/tests/test_fp16.py +53 -19
  222. warp/tests/test_func.py +187 -86
  223. warp/tests/test_generics.py +194 -49
  224. warp/tests/test_grad.py +178 -109
  225. warp/tests/test_grad_customs.py +176 -0
  226. warp/tests/test_hash_grid.py +52 -37
  227. warp/tests/test_import.py +10 -23
  228. warp/tests/test_indexedarray.py +32 -31
  229. warp/tests/test_intersect.py +18 -9
  230. warp/tests/test_large.py +141 -0
  231. warp/tests/test_launch.py +14 -41
  232. warp/tests/test_lerp.py +64 -65
  233. warp/tests/test_linear_solvers.py +154 -0
  234. warp/tests/test_lvalue.py +493 -0
  235. warp/tests/test_marching_cubes.py +12 -13
  236. warp/tests/test_mat.py +517 -2898
  237. warp/tests/test_mat_lite.py +115 -0
  238. warp/tests/test_mat_scalar_ops.py +2889 -0
  239. warp/tests/test_math.py +103 -9
  240. warp/tests/test_matmul.py +305 -69
  241. warp/tests/test_matmul_lite.py +410 -0
  242. warp/tests/test_mesh.py +71 -14
  243. warp/tests/test_mesh_query_aabb.py +41 -25
  244. warp/tests/test_mesh_query_point.py +140 -22
  245. warp/tests/test_mesh_query_ray.py +39 -22
  246. warp/tests/test_mlp.py +30 -22
  247. warp/tests/test_model.py +92 -89
  248. warp/tests/test_modules_lite.py +39 -0
  249. warp/tests/test_multigpu.py +88 -114
  250. warp/tests/test_noise.py +12 -11
  251. warp/tests/test_operators.py +16 -20
  252. warp/tests/test_options.py +11 -11
  253. warp/tests/test_pinned.py +17 -18
  254. warp/tests/test_print.py +32 -11
  255. warp/tests/test_quat.py +275 -129
  256. warp/tests/test_rand.py +18 -16
  257. warp/tests/test_reload.py +38 -34
  258. warp/tests/test_rounding.py +50 -43
  259. warp/tests/test_runlength_encode.py +168 -20
  260. warp/tests/test_smoothstep.py +9 -11
  261. warp/tests/test_snippet.py +143 -0
  262. warp/tests/test_sparse.py +261 -63
  263. warp/tests/test_spatial.py +276 -243
  264. warp/tests/test_streams.py +110 -85
  265. warp/tests/test_struct.py +268 -63
  266. warp/tests/test_tape.py +39 -21
  267. warp/tests/test_torch.py +118 -89
  268. warp/tests/test_transient_module.py +12 -13
  269. warp/tests/test_types.py +614 -0
  270. warp/tests/test_utils.py +494 -0
  271. warp/tests/test_vec.py +354 -2050
  272. warp/tests/test_vec_lite.py +73 -0
  273. warp/tests/test_vec_scalar_ops.py +2099 -0
  274. warp/tests/test_volume.py +457 -293
  275. warp/tests/test_volume_write.py +124 -134
  276. warp/tests/unittest_serial.py +35 -0
  277. warp/tests/unittest_suites.py +341 -0
  278. warp/tests/unittest_utils.py +568 -0
  279. warp/tests/unused_test_misc.py +71 -0
  280. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  281. warp/thirdparty/appdirs.py +36 -45
  282. warp/thirdparty/unittest_parallel.py +549 -0
  283. warp/torch.py +9 -6
  284. warp/types.py +1089 -366
  285. warp/utils.py +93 -387
  286. warp_lang-0.11.0.dist-info/METADATA +238 -0
  287. warp_lang-0.11.0.dist-info/RECORD +332 -0
  288. {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/WHEEL +1 -1
  289. warp/tests/test_all.py +0 -219
  290. warp/tests/test_array_scan.py +0 -60
  291. warp/tests/test_base.py +0 -208
  292. warp/tests/test_unresolved_func.py +0 -7
  293. warp/tests/test_unresolved_symbol.py +0 -7
  294. warp_lang-0.10.1.dist-info/METADATA +0 -21
  295. warp_lang-0.10.1.dist-info/RECORD +0 -188
  296. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  297. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  298. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  299. {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/LICENSE.md +0 -0
  300. {warp_lang-0.10.1.dist-info → warp_lang-0.11.0.dist-info}/top_level.txt +0 -0
warp/tape.py CHANGED
@@ -5,11 +5,39 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
- import numpy as np
9
8
  import warp as wp
10
9
 
11
10
 
12
11
  class Tape:
12
+ """
13
+ Record kernel launches within a Tape scope to enable automatic differentiation.
14
+ Gradients can be computed after the operations have been recorded on the tape via
15
+ ``tape.backward()``.
16
+
17
+ Example
18
+ -------
19
+
20
+ .. code-block:: python
21
+
22
+ tape = wp.Tape()
23
+
24
+ # forward pass
25
+ with tape:
26
+ wp.launch(kernel=compute1, inputs=[a, b], device="cuda")
27
+ wp.launch(kernel=compute2, inputs=[c, d], device="cuda")
28
+ wp.launch(kernel=loss, inputs=[d, l], device="cuda")
29
+
30
+ # reverse pass
31
+ tape.backward(l)
32
+
33
+ Gradients can be accessed via the ``tape.gradients`` dictionary, e.g.:
34
+
35
+ .. code-block:: python
36
+
37
+ print(tape.gradients[a])
38
+
39
+ """
40
+
13
41
  def __init__(self):
14
42
  self.gradients = {}
15
43
  self.const_gradients = set()
@@ -37,13 +65,24 @@ class Tape:
37
65
  # adj_tensor = tape.gradients[tensor]
38
66
  #
39
67
  def backward(self, loss: wp.array = None, grads: dict = None):
68
+ """
69
+ Evaluate the backward pass of the recorded operations on the tape.
70
+ A single-element array ``loss`` or a dictionary of arrays ``grads``
71
+ can be provided to assign the incoming gradients for the reverse-mode
72
+ automatic differentiation pass.
73
+
74
+ Args:
75
+ loss (wp.array): A single-element array that holds the loss function value whose gradient is to be computed
76
+ grads (dict): A dictionary of arrays that map from Warp arrays to their incoming gradients
77
+
78
+ """
40
79
  # if scalar loss is specified then initialize
41
80
  # a 'seed' array for it, with gradient of one
42
81
  if loss:
43
82
  if loss.size > 1 or wp.types.type_length(loss.dtype) > 1:
44
83
  raise RuntimeError("Can only return gradients for scalar loss functions.")
45
84
 
46
- if loss.requires_grad == False:
85
+ if not loss.requires_grad:
47
86
  raise RuntimeError(
48
87
  "Scalar loss arrays should have requires_grad=True set before calling Tape.backward()"
49
88
  )
@@ -67,9 +106,10 @@ class Tape:
67
106
  else:
68
107
  kernel = launch[0]
69
108
  dim = launch[1]
70
- inputs = launch[2]
71
- outputs = launch[3]
72
- device = launch[4]
109
+ max_blocks = launch[2]
110
+ inputs = launch[3]
111
+ outputs = launch[4]
112
+ device = launch[5]
73
113
 
74
114
  adj_inputs = []
75
115
  adj_outputs = []
@@ -91,16 +131,21 @@ class Tape:
91
131
  adj_outputs=adj_outputs,
92
132
  device=device,
93
133
  adjoint=True,
134
+ max_blocks=max_blocks,
94
135
  )
95
136
 
96
137
  # record a kernel launch on the tape
97
- def record_launch(self, kernel, dim, inputs, outputs, device):
98
- self.launches.append([kernel, dim, inputs, outputs, device])
138
+ def record_launch(self, kernel, dim, max_blocks, inputs, outputs, device):
139
+ self.launches.append([kernel, dim, max_blocks, inputs, outputs, device])
99
140
 
100
- # records a custom function for the backward pass, can be any
101
- # Callable python object. Callee should also pass arrays that
102
- # take part in the function for gradient tracking.
103
141
  def record_func(self, backward, arrays):
142
+ """
143
+ Records a custom function to be executed only in the backward pass.
144
+
145
+ Args:
146
+ backward (Callable): A callable Python object (can be any function) that will be executed in the backward pass.
147
+ arrays (list): A list of arrays that are used by the function for gradient tracking.
148
+ """
104
149
  self.launches.append(backward)
105
150
 
106
151
  for a in arrays:
@@ -145,10 +190,16 @@ class Tape:
145
190
  return None
146
191
 
147
192
  def reset(self):
193
+ """
194
+ Clear all operations recorded on the tape and zero out all gradients.
195
+ """
148
196
  self.launches = []
149
197
  self.zero()
150
198
 
151
199
  def zero(self):
200
+ """
201
+ Zero out all gradients recorded on the tape.
202
+ """
152
203
  for a, g in self.gradients.items():
153
204
  if a not in self.const_gradients:
154
205
  if isinstance(a, wp.codegen.StructInstance):
warp/tests/__main__.py CHANGED
@@ -1,7 +1,4 @@
1
- from .test_all import run
1
+ from warp.thirdparty.unittest_parallel import main
2
2
 
3
- ret = run()
4
-
5
- import sys
6
-
7
- sys.exit(ret)
3
+ if __name__ == "__main__":
4
+ main()
Binary file
Binary file
@@ -1,7 +1,15 @@
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.
7
+
8
+ """Dummy class used in test_reload.py"""
9
+
1
10
  import warp as wp
2
11
 
3
12
 
4
- # dummy class used in test_reload.py
5
13
  class ClassKernelTest:
6
14
  def __init__(self, device):
7
15
  # 3x3 frames in the rest pose:
@@ -0,0 +1,21 @@
1
+ # Copyright (c) 2023 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.
7
+
8
+ """This file defines a kernel that fails on codegen.py"""
9
+
10
+ import warp as wp
11
+
12
+
13
+ @wp.kernel
14
+ def unequal_types_kernel():
15
+ x = wp.int32(10)
16
+ y = 10
17
+ z = True
18
+
19
+ # Throws a TypeError
20
+ if x == y == z:
21
+ pass
@@ -5,10 +5,10 @@
5
5
  # distribution of this software and related documentation without an express
6
6
  # license agreement from NVIDIA CORPORATION is strictly prohibited.
7
7
 
8
- # This file is used to test reloading module references.
8
+ """This file is used to test reloading module references."""
9
9
 
10
10
  import warp as wp
11
- import warp.tests.test_reference as ref
11
+ import warp.tests.aux_test_reference as ref
12
12
 
13
13
  wp.init()
14
14
 
@@ -1,7 +1,7 @@
1
1
  # This file is used to test reloading module references.
2
2
 
3
3
  import warp as wp
4
- import warp.tests.test_reference_reference as refref
4
+ import warp.tests.aux_test_reference_reference as refref
5
5
 
6
6
  wp.init()
7
7
 
@@ -0,0 +1,14 @@
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.
7
+
8
+ import warp as wp
9
+
10
+
11
+ @wp.kernel
12
+ def unresolved_func_kernel():
13
+ # this should trigger an exception due to unresolved function
14
+ x = wp.missing_func(42)
@@ -0,0 +1,14 @@
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.
7
+
8
+ import warp as wp
9
+
10
+
11
+ @wp.kernel
12
+ def unresolved_symbol_kernel():
13
+ # this should trigger an exception due to unresolved symbol
14
+ x = missing_symbol
@@ -0,0 +1,239 @@
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.
7
+
8
+ import math
9
+ import unittest
10
+
11
+ import warp as wp
12
+ import warp.sim
13
+ from warp.tests.unittest_utils import *
14
+
15
+ wp.init()
16
+
17
+
18
+ def build_ant(num_envs):
19
+ builder = wp.sim.ModelBuilder()
20
+ for i in range(num_envs):
21
+ wp.sim.parse_mjcf(
22
+ os.path.join(os.path.dirname(__file__), "../../examples/assets/nv_ant.xml"),
23
+ builder,
24
+ up_axis="y",
25
+ )
26
+
27
+ coord_count = 15
28
+ dof_count = 14
29
+
30
+ coord_start = i * coord_count
31
+ dof_start = i * dof_count
32
+
33
+ # base
34
+ builder.joint_q[coord_start : coord_start + 3] = [i * 2.0, 0.70, 0.0]
35
+ builder.joint_q[coord_start + 3 : coord_start + 7] = wp.quat_from_axis_angle((1.0, 0.0, 0.0), -math.pi * 0.5)
36
+
37
+ # joints
38
+ builder.joint_q[coord_start + 7 : coord_start + coord_count] = [0.0, 1.0, 0.0, -1.0, 0.0, -1.0, 0.0, 1.0]
39
+ builder.joint_qd[dof_start + 6 : dof_start + dof_count] = [1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0]
40
+
41
+ return builder
42
+
43
+
44
+ def build_complex_joint_mechanism(chain_length):
45
+ builder = wp.sim.ModelBuilder()
46
+ com0 = wp.vec3(1.0, 2.0, 3.0)
47
+ com1 = wp.vec3(4.0, 5.0, 6.0)
48
+ com2 = wp.vec3(7.0, 8.0, 9.0)
49
+ ax0 = wp.normalize(wp.vec3(-1.0, 2.0, 3.0))
50
+ ax1 = wp.normalize(wp.vec3(4.0, -1.0, 2.0))
51
+ ax2 = wp.normalize(wp.vec3(-3.0, 4.0, -1.0))
52
+ # declare some transforms with nonzero translation and orientation
53
+ tf0 = wp.transform(wp.vec3(1.0, 2.0, 3.0), wp.quat_from_axis_angle((1.0, 0.0, 0.0), math.pi * 0.25))
54
+ tf1 = wp.transform(wp.vec3(4.0, 5.0, 6.0), wp.quat_from_axis_angle((0.0, 1.0, 0.0), math.pi * 0.5))
55
+ tf2 = wp.transform(wp.vec3(7.0, 8.0, 9.0), wp.quat_from_axis_angle((0.0, 0.0, 1.0), math.pi * 0.75))
56
+
57
+ parent = -1
58
+ for i in range(chain_length):
59
+ b0 = builder.add_body(com=com0)
60
+ builder.add_joint_fixed(parent=parent, child=b0, parent_xform=tf1, child_xform=tf0)
61
+ assert builder.articulation_count == 1
62
+
63
+ b1 = builder.add_body(com=com1)
64
+ builder.add_joint_revolute(parent=b0, child=b1, parent_xform=tf1, child_xform=tf2, axis=ax1)
65
+ builder.joint_q[-1] = 0.3
66
+ builder.joint_qd[-1] = 1.0
67
+
68
+ b2 = builder.add_body(com=com2)
69
+ builder.add_joint_universal(parent=b1, child=b2, parent_xform=tf2, child_xform=tf0, axis_0=ax0, axis_1=ax1)
70
+ builder.joint_q[-2:] = [0.3, 0.5]
71
+ builder.joint_qd[-2:] = [1.0, -1.0]
72
+
73
+ b3 = builder.add_body(com=com0)
74
+ builder.add_joint_ball(parent=b2, child=b3, parent_xform=tf0, child_xform=tf1)
75
+ builder.joint_q[-4:] = list(wp.quat_from_axis_angle(ax0, 0.7))
76
+ builder.joint_qd[-3:] = [1.0, -0.6, 1.5]
77
+
78
+ b4 = builder.add_body(com=com1)
79
+ builder.add_joint_compound(
80
+ parent=b3,
81
+ child=b4,
82
+ parent_xform=tf2,
83
+ child_xform=tf1,
84
+ axis_0=(0, 0, 1),
85
+ axis_1=(1, 0, 0),
86
+ axis_2=(0, 1, 0),
87
+ )
88
+ builder.joint_q[-3:] = [0.3, 0.5, 0.27]
89
+ builder.joint_qd[-3:] = [1.23, -1.0, 0.5]
90
+
91
+ b5 = builder.add_body(com=com2)
92
+ builder.add_joint_prismatic(
93
+ parent=b4,
94
+ child=b5,
95
+ parent_xform=tf2,
96
+ child_xform=tf0,
97
+ axis=ax0,
98
+ )
99
+ builder.joint_q[-1] = 0.92
100
+ builder.joint_qd[-1] = -0.63
101
+
102
+ b6 = builder.add_body(com=com0)
103
+ builder.add_joint_d6(
104
+ parent=b5,
105
+ child=b6,
106
+ parent_xform=tf0,
107
+ child_xform=tf2,
108
+ linear_axes=[ax0, ax1, wp.cross(ax0, ax1)],
109
+ angular_axes=[ax1, ax2, wp.cross(ax1, ax2)],
110
+ )
111
+ builder.joint_q[-6:] = [0.3, 0.5, 0.7, 0.9, 1.1, 1.3]
112
+ builder.joint_qd[-6:] = [1.0, -1.0, 0.5, 0.8, -0.3, 0.1]
113
+
114
+ b7 = builder.add_body(com=com1)
115
+ builder.add_joint_free(
116
+ parent=b6,
117
+ child=b7,
118
+ parent_xform=tf1,
119
+ child_xform=tf2,
120
+ )
121
+ builder.joint_q[-7:] = [0.5, -0.9, 1.4] + list(wp.quat_rpy(0.3, -0.5, 0.7))
122
+ builder.joint_qd[-6:] = [1.0, -1.0, 0.5, 0.8, -0.3, 0.1]
123
+
124
+ b8 = builder.add_body(com=com2)
125
+ builder.add_joint_distance(
126
+ parent=b7,
127
+ child=b8,
128
+ parent_xform=tf1,
129
+ child_xform=tf2,
130
+ )
131
+ builder.joint_q[-7:] = [-0.3, -0.7, 0.2] + list(wp.quat_rpy(0.1, 0.1, 0.4))
132
+ builder.joint_qd[-6:] = [-0.34, 0.5, -0.6, -0.4, 0.2, 0.1]
133
+
134
+ # D6 joint that behaves like a fixed joint
135
+ b9 = builder.add_body(com=com0)
136
+ builder.add_joint_d6(
137
+ parent=b8,
138
+ child=b9,
139
+ parent_xform=tf0,
140
+ child_xform=tf2,
141
+ linear_axes=[],
142
+ angular_axes=[],
143
+ )
144
+
145
+ b10 = builder.add_body(com=com0)
146
+ builder.add_joint_d6(
147
+ parent=b9,
148
+ child=b10,
149
+ parent_xform=tf1,
150
+ child_xform=tf2,
151
+ linear_axes=[ax1],
152
+ angular_axes=[ax2, ax0],
153
+ )
154
+ builder.joint_q[-3:] = [0.3, 0.5, 0.7]
155
+ builder.joint_qd[-3:] = [1.0, -1.0, 0.5]
156
+
157
+ b11 = builder.add_body(com=com1)
158
+ builder.add_joint_d6(
159
+ parent=b10,
160
+ child=b11,
161
+ parent_xform=tf1,
162
+ child_xform=tf2,
163
+ linear_axes=[ax1, ax0, wp.cross(ax1, ax0)],
164
+ angular_axes=[],
165
+ )
166
+ builder.joint_q[-3:] = [0.3, 0.5, 0.7]
167
+ builder.joint_qd[-3:] = [1.0, -1.0, 0.5]
168
+
169
+ b12 = builder.add_body(com=com2)
170
+ builder.add_joint_d6(
171
+ parent=b11,
172
+ child=b12,
173
+ parent_xform=tf1,
174
+ child_xform=tf2,
175
+ linear_axes=[],
176
+ angular_axes=[ax1, ax2, wp.cross(ax1, ax2)],
177
+ )
178
+ builder.joint_q[-3:] = [0.3, 0.5, 0.7]
179
+ builder.joint_qd[-3:] = [1.0, -1.0, 0.5]
180
+
181
+ parent = b12
182
+
183
+ return builder
184
+
185
+
186
+ def check_fk_ik(builder, device):
187
+ model = builder.finalize(device)
188
+ state = model.state()
189
+
190
+ q_fk = model.joint_q.numpy()
191
+ qd_fk = model.joint_qd.numpy()
192
+
193
+ wp.sim.eval_fk(model, model.joint_q, model.joint_qd, None, state)
194
+
195
+ q_ik = wp.zeros_like(model.joint_q)
196
+ qd_ik = wp.zeros_like(model.joint_qd)
197
+
198
+ wp.sim.eval_ik(model, state, q_ik, qd_ik)
199
+
200
+ # adjust numpy print settings
201
+ # np.set_printoptions(precision=4, floatmode="fixed", suppress=True)
202
+ # print("q:")
203
+ # print(np.array(q_fk))
204
+ # print(q_ik.numpy())
205
+
206
+ # print("qd:")
207
+ # print(np.array(qd_fk))
208
+ # print(qd_ik.numpy())
209
+
210
+ assert_np_equal(q_ik.numpy(), q_fk, tol=1e-4)
211
+ assert_np_equal(qd_ik.numpy(), qd_fk, tol=1e-4)
212
+
213
+
214
+ def test_fk_ik_ant(test, device):
215
+ builder = build_ant(3)
216
+ check_fk_ik(builder, device)
217
+
218
+
219
+ def test_fk_ik_complex_joint_mechanism(test, device):
220
+ builder = build_complex_joint_mechanism(2)
221
+ check_fk_ik(builder, device)
222
+
223
+
224
+ devices = get_test_devices()
225
+
226
+
227
+ class TestKinematics(unittest.TestCase):
228
+ pass
229
+
230
+
231
+ add_function_test(TestKinematics, "test_fk_ik_ant", test_fk_ik_ant, devices=devices)
232
+ add_function_test(
233
+ TestKinematics, "test_fk_ik_complex_joint_mechanism", test_fk_ik_complex_joint_mechanism, devices=devices
234
+ )
235
+
236
+
237
+ if __name__ == "__main__":
238
+ wp.build.clear_kernel_cache()
239
+ unittest.main(verbosity=2, failfast=False)
@@ -0,0 +1,31 @@
1
+ # Copyright (c) 2023 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.
7
+
8
+ """Serial code-coverage runner
9
+
10
+ This script is used to generate code-coverage reports by running Warp tests.
11
+ It runs in serial so can take over an hour to finish. To generate a coverage
12
+ report in parallel, use the warp/thirdparty./unittest_parallel.py script
13
+ instead with the --coverage option, e.g. python -m warp.tests --coverage
14
+ """
15
+
16
+ import coverage
17
+
18
+ cover = coverage.Coverage(config_file=True, messages=True)
19
+
20
+ cover.start()
21
+
22
+ with cover.collect():
23
+ import unittest_serial # noqa: E402
24
+
25
+ unittest_serial.run_specified()
26
+
27
+ cover.save()
28
+
29
+ cover.report()
30
+
31
+ cover.html_report(title="Warp Testing Code Coverage Report")