warp-lang 0.9.0__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 (315) hide show
  1. warp/__init__.py +15 -7
  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 +22 -443
  6. warp/build_dll.py +384 -0
  7. warp/builtins.py +998 -488
  8. warp/codegen.py +1307 -739
  9. warp/config.py +5 -3
  10. warp/constants.py +6 -0
  11. warp/context.py +1291 -548
  12. warp/dlpack.py +31 -31
  13. warp/fabric.py +326 -0
  14. warp/fem/__init__.py +27 -0
  15. warp/fem/cache.py +389 -0
  16. warp/fem/dirichlet.py +181 -0
  17. warp/fem/domain.py +263 -0
  18. warp/fem/field/__init__.py +101 -0
  19. warp/fem/field/field.py +149 -0
  20. warp/fem/field/nodal_field.py +299 -0
  21. warp/fem/field/restriction.py +21 -0
  22. warp/fem/field/test.py +181 -0
  23. warp/fem/field/trial.py +183 -0
  24. warp/fem/geometry/__init__.py +19 -0
  25. warp/fem/geometry/closest_point.py +70 -0
  26. warp/fem/geometry/deformed_geometry.py +271 -0
  27. warp/fem/geometry/element.py +744 -0
  28. warp/fem/geometry/geometry.py +186 -0
  29. warp/fem/geometry/grid_2d.py +373 -0
  30. warp/fem/geometry/grid_3d.py +435 -0
  31. warp/fem/geometry/hexmesh.py +953 -0
  32. warp/fem/geometry/partition.py +376 -0
  33. warp/fem/geometry/quadmesh_2d.py +532 -0
  34. warp/fem/geometry/tetmesh.py +840 -0
  35. warp/fem/geometry/trimesh_2d.py +577 -0
  36. warp/fem/integrate.py +1616 -0
  37. warp/fem/operator.py +191 -0
  38. warp/fem/polynomial.py +213 -0
  39. warp/fem/quadrature/__init__.py +2 -0
  40. warp/fem/quadrature/pic_quadrature.py +245 -0
  41. warp/fem/quadrature/quadrature.py +294 -0
  42. warp/fem/space/__init__.py +292 -0
  43. warp/fem/space/basis_space.py +489 -0
  44. warp/fem/space/collocated_function_space.py +105 -0
  45. warp/fem/space/dof_mapper.py +236 -0
  46. warp/fem/space/function_space.py +145 -0
  47. warp/fem/space/grid_2d_function_space.py +267 -0
  48. warp/fem/space/grid_3d_function_space.py +306 -0
  49. warp/fem/space/hexmesh_function_space.py +352 -0
  50. warp/fem/space/partition.py +350 -0
  51. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  52. warp/fem/space/restriction.py +160 -0
  53. warp/fem/space/shape/__init__.py +15 -0
  54. warp/fem/space/shape/cube_shape_function.py +738 -0
  55. warp/fem/space/shape/shape_function.py +103 -0
  56. warp/fem/space/shape/square_shape_function.py +611 -0
  57. warp/fem/space/shape/tet_shape_function.py +567 -0
  58. warp/fem/space/shape/triangle_shape_function.py +429 -0
  59. warp/fem/space/tetmesh_function_space.py +292 -0
  60. warp/fem/space/topology.py +295 -0
  61. warp/fem/space/trimesh_2d_function_space.py +221 -0
  62. warp/fem/types.py +77 -0
  63. warp/fem/utils.py +495 -0
  64. warp/native/array.h +164 -55
  65. warp/native/builtin.h +150 -174
  66. warp/native/bvh.cpp +75 -328
  67. warp/native/bvh.cu +406 -23
  68. warp/native/bvh.h +37 -45
  69. warp/native/clang/clang.cpp +136 -24
  70. warp/native/crt.cpp +1 -76
  71. warp/native/crt.h +111 -104
  72. warp/native/cuda_crt.h +1049 -0
  73. warp/native/cuda_util.cpp +15 -3
  74. warp/native/cuda_util.h +3 -1
  75. warp/native/cutlass/tools/library/scripts/conv2d_operation.py +463 -0
  76. warp/native/cutlass/tools/library/scripts/conv3d_operation.py +321 -0
  77. warp/native/cutlass/tools/library/scripts/gemm_operation.py +988 -0
  78. warp/native/cutlass/tools/library/scripts/generator.py +4625 -0
  79. warp/native/cutlass/tools/library/scripts/library.py +799 -0
  80. warp/native/cutlass/tools/library/scripts/manifest.py +402 -0
  81. warp/native/cutlass/tools/library/scripts/pycutlass/docs/source/conf.py +96 -0
  82. warp/native/cutlass/tools/library/scripts/pycutlass/profile/conv/conv2d_f16_sm80.py +106 -0
  83. warp/native/cutlass/tools/library/scripts/pycutlass/profile/gemm/gemm_f32_sm80.py +91 -0
  84. warp/native/cutlass/tools/library/scripts/pycutlass/setup.py +80 -0
  85. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/__init__.py +48 -0
  86. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/arguments.py +118 -0
  87. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/c_types.py +241 -0
  88. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/compiler.py +432 -0
  89. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/conv2d_operation.py +631 -0
  90. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/epilogue.py +1026 -0
  91. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/frontend.py +104 -0
  92. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/gemm_operation.py +1276 -0
  93. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/library.py +744 -0
  94. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/memory_manager.py +74 -0
  95. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/operation.py +110 -0
  96. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/parser.py +619 -0
  97. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/reduction_operation.py +398 -0
  98. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/tensor_ref.py +70 -0
  99. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/__init__.py +4 -0
  100. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/conv2d_testbed.py +646 -0
  101. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_grouped_testbed.py +235 -0
  102. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/gemm_testbed.py +557 -0
  103. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/test/profiler.py +70 -0
  104. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/type_hint.py +39 -0
  105. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/__init__.py +1 -0
  106. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/device.py +76 -0
  107. warp/native/cutlass/tools/library/scripts/pycutlass/src/pycutlass/utils/reference_model.py +255 -0
  108. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/__init__.py +0 -0
  109. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +201 -0
  110. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +177 -0
  111. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +98 -0
  112. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_dgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +95 -0
  113. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_few_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +163 -0
  114. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_fixed_channels_f16nhwc_f16nhwc_f16nhwc_tensor_op_f32_sm80.py +187 -0
  115. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +309 -0
  116. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +54 -0
  117. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  118. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_fprop_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  119. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_strided_dgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +253 -0
  120. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f16nhwc_tensor_op_f16_sm80.py +97 -0
  121. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f16nhwc_f16nhwc_f32nhwc_tensor_op_f32_sm80.py +242 -0
  122. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_f32nhwc_f32nhwc_f32nhwc_simt_f32_sm80.py +96 -0
  123. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/conv2d_wgrad_implicit_gemm_tf32nhwc_tf32nhwc_f32nhwc_tensor_op_f32_sm80.py +107 -0
  124. warp/native/cutlass/tools/library/scripts/pycutlass/test/conv/run_all_tests.py +10 -0
  125. warp/native/cutlass/tools/library/scripts/pycutlass/test/frontend/test_frontend.py +146 -0
  126. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/__init__.py +0 -0
  127. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_bf16_sm80.py +96 -0
  128. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f16_sm80.py +447 -0
  129. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f32_sm80.py +146 -0
  130. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_f64_sm80.py +102 -0
  131. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_grouped_sm80.py +203 -0
  132. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/gemm_s8_sm80.py +229 -0
  133. warp/native/cutlass/tools/library/scripts/pycutlass/test/gemm/run_all_tests.py +9 -0
  134. warp/native/cutlass/tools/library/scripts/pycutlass/test/unit/test_sm80.py +453 -0
  135. warp/native/cutlass/tools/library/scripts/rank_2k_operation.py +398 -0
  136. warp/native/cutlass/tools/library/scripts/rank_k_operation.py +387 -0
  137. warp/native/cutlass/tools/library/scripts/rt.py +796 -0
  138. warp/native/cutlass/tools/library/scripts/symm_operation.py +400 -0
  139. warp/native/cutlass/tools/library/scripts/trmm_operation.py +407 -0
  140. warp/native/cutlass_gemm.cu +5 -3
  141. warp/native/exports.h +1240 -949
  142. warp/native/fabric.h +228 -0
  143. warp/native/hashgrid.cpp +4 -4
  144. warp/native/hashgrid.h +22 -2
  145. warp/native/initializer_array.h +2 -2
  146. warp/native/intersect.h +22 -7
  147. warp/native/intersect_adj.h +8 -8
  148. warp/native/intersect_tri.h +13 -16
  149. warp/native/marching.cu +157 -161
  150. warp/native/mat.h +119 -19
  151. warp/native/matnn.h +2 -2
  152. warp/native/mesh.cpp +108 -83
  153. warp/native/mesh.cu +243 -6
  154. warp/native/mesh.h +1547 -458
  155. warp/native/nanovdb/NanoVDB.h +1 -1
  156. warp/native/noise.h +272 -329
  157. warp/native/quat.h +51 -8
  158. warp/native/rand.h +45 -35
  159. warp/native/range.h +6 -2
  160. warp/native/reduce.cpp +157 -0
  161. warp/native/reduce.cu +348 -0
  162. warp/native/runlength_encode.cpp +62 -0
  163. warp/native/runlength_encode.cu +46 -0
  164. warp/native/scan.cu +11 -13
  165. warp/native/scan.h +1 -0
  166. warp/native/solid_angle.h +442 -0
  167. warp/native/sort.cpp +13 -0
  168. warp/native/sort.cu +9 -1
  169. warp/native/sparse.cpp +338 -0
  170. warp/native/sparse.cu +545 -0
  171. warp/native/spatial.h +2 -2
  172. warp/native/temp_buffer.h +30 -0
  173. warp/native/vec.h +126 -24
  174. warp/native/volume.h +120 -0
  175. warp/native/warp.cpp +658 -53
  176. warp/native/warp.cu +660 -68
  177. warp/native/warp.h +112 -12
  178. warp/optim/__init__.py +1 -0
  179. warp/optim/linear.py +922 -0
  180. warp/optim/sgd.py +92 -0
  181. warp/render/render_opengl.py +392 -152
  182. warp/render/render_usd.py +11 -11
  183. warp/sim/__init__.py +2 -2
  184. warp/sim/articulation.py +385 -185
  185. warp/sim/collide.py +21 -8
  186. warp/sim/import_mjcf.py +297 -106
  187. warp/sim/import_urdf.py +389 -210
  188. warp/sim/import_usd.py +198 -97
  189. warp/sim/inertia.py +17 -18
  190. warp/sim/integrator_euler.py +14 -8
  191. warp/sim/integrator_xpbd.py +161 -19
  192. warp/sim/model.py +795 -291
  193. warp/sim/optimizer.py +2 -6
  194. warp/sim/render.py +65 -3
  195. warp/sim/utils.py +3 -0
  196. warp/sparse.py +1227 -0
  197. warp/stubs.py +665 -223
  198. warp/tape.py +66 -15
  199. warp/tests/__main__.py +3 -6
  200. warp/tests/assets/curlnoise_golden.npy +0 -0
  201. warp/tests/assets/pnoise_golden.npy +0 -0
  202. warp/tests/assets/torus.usda +105 -105
  203. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  204. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  205. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  206. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  207. warp/tests/aux_test_unresolved_func.py +14 -0
  208. warp/tests/aux_test_unresolved_symbol.py +14 -0
  209. warp/tests/disabled_kinematics.py +239 -0
  210. warp/tests/run_coverage_serial.py +31 -0
  211. warp/tests/test_adam.py +103 -106
  212. warp/tests/test_arithmetic.py +128 -74
  213. warp/tests/test_array.py +1497 -211
  214. warp/tests/test_array_reduce.py +150 -0
  215. warp/tests/test_atomic.py +64 -28
  216. warp/tests/test_bool.py +99 -0
  217. warp/tests/test_builtins_resolution.py +1292 -0
  218. warp/tests/test_bvh.py +75 -43
  219. warp/tests/test_closest_point_edge_edge.py +54 -57
  220. warp/tests/test_codegen.py +233 -128
  221. warp/tests/test_compile_consts.py +28 -20
  222. warp/tests/test_conditional.py +108 -24
  223. warp/tests/test_copy.py +10 -12
  224. warp/tests/test_ctypes.py +112 -88
  225. warp/tests/test_dense.py +21 -14
  226. warp/tests/test_devices.py +98 -0
  227. warp/tests/test_dlpack.py +136 -108
  228. warp/tests/test_examples.py +277 -0
  229. warp/tests/test_fabricarray.py +955 -0
  230. warp/tests/test_fast_math.py +15 -11
  231. warp/tests/test_fem.py +1271 -0
  232. warp/tests/test_fp16.py +53 -19
  233. warp/tests/test_func.py +187 -74
  234. warp/tests/test_generics.py +194 -49
  235. warp/tests/test_grad.py +180 -116
  236. warp/tests/test_grad_customs.py +176 -0
  237. warp/tests/test_hash_grid.py +52 -37
  238. warp/tests/test_import.py +10 -23
  239. warp/tests/test_indexedarray.py +577 -24
  240. warp/tests/test_intersect.py +18 -9
  241. warp/tests/test_large.py +141 -0
  242. warp/tests/test_launch.py +251 -15
  243. warp/tests/test_lerp.py +64 -65
  244. warp/tests/test_linear_solvers.py +154 -0
  245. warp/tests/test_lvalue.py +493 -0
  246. warp/tests/test_marching_cubes.py +12 -13
  247. warp/tests/test_mat.py +508 -2778
  248. warp/tests/test_mat_lite.py +115 -0
  249. warp/tests/test_mat_scalar_ops.py +2889 -0
  250. warp/tests/test_math.py +103 -9
  251. warp/tests/test_matmul.py +305 -69
  252. warp/tests/test_matmul_lite.py +410 -0
  253. warp/tests/test_mesh.py +71 -14
  254. warp/tests/test_mesh_query_aabb.py +41 -25
  255. warp/tests/test_mesh_query_point.py +325 -34
  256. warp/tests/test_mesh_query_ray.py +39 -22
  257. warp/tests/test_mlp.py +30 -22
  258. warp/tests/test_model.py +92 -89
  259. warp/tests/test_modules_lite.py +39 -0
  260. warp/tests/test_multigpu.py +88 -114
  261. warp/tests/test_noise.py +12 -11
  262. warp/tests/test_operators.py +16 -20
  263. warp/tests/test_options.py +11 -11
  264. warp/tests/test_pinned.py +17 -18
  265. warp/tests/test_print.py +32 -11
  266. warp/tests/test_quat.py +275 -129
  267. warp/tests/test_rand.py +18 -16
  268. warp/tests/test_reload.py +38 -34
  269. warp/tests/test_rounding.py +50 -43
  270. warp/tests/test_runlength_encode.py +190 -0
  271. warp/tests/test_smoothstep.py +9 -11
  272. warp/tests/test_snippet.py +143 -0
  273. warp/tests/test_sparse.py +460 -0
  274. warp/tests/test_spatial.py +276 -243
  275. warp/tests/test_streams.py +110 -85
  276. warp/tests/test_struct.py +331 -85
  277. warp/tests/test_tape.py +39 -21
  278. warp/tests/test_torch.py +118 -89
  279. warp/tests/test_transient_module.py +12 -13
  280. warp/tests/test_types.py +614 -0
  281. warp/tests/test_utils.py +494 -0
  282. warp/tests/test_vec.py +354 -1987
  283. warp/tests/test_vec_lite.py +73 -0
  284. warp/tests/test_vec_scalar_ops.py +2099 -0
  285. warp/tests/test_volume.py +457 -293
  286. warp/tests/test_volume_write.py +124 -134
  287. warp/tests/unittest_serial.py +35 -0
  288. warp/tests/unittest_suites.py +341 -0
  289. warp/tests/unittest_utils.py +568 -0
  290. warp/tests/unused_test_misc.py +71 -0
  291. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  292. warp/thirdparty/appdirs.py +36 -45
  293. warp/thirdparty/unittest_parallel.py +549 -0
  294. warp/torch.py +72 -30
  295. warp/types.py +1744 -713
  296. warp/utils.py +360 -350
  297. warp_lang-0.11.0.dist-info/LICENSE.md +36 -0
  298. warp_lang-0.11.0.dist-info/METADATA +238 -0
  299. warp_lang-0.11.0.dist-info/RECORD +332 -0
  300. {warp_lang-0.9.0.dist-info → warp_lang-0.11.0.dist-info}/WHEEL +1 -1
  301. warp/bin/warp-clang.exp +0 -0
  302. warp/bin/warp-clang.lib +0 -0
  303. warp/bin/warp.exp +0 -0
  304. warp/bin/warp.lib +0 -0
  305. warp/tests/test_all.py +0 -215
  306. warp/tests/test_array_scan.py +0 -60
  307. warp/tests/test_base.py +0 -208
  308. warp/tests/test_unresolved_func.py +0 -7
  309. warp/tests/test_unresolved_symbol.py +0 -7
  310. warp_lang-0.9.0.dist-info/METADATA +0 -20
  311. warp_lang-0.9.0.dist-info/RECORD +0 -177
  312. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  313. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  314. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  315. {warp_lang-0.9.0.dist-info → warp_lang-0.11.0.dist-info}/top_level.txt +0 -0
@@ -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")
warp/tests/test_adam.py CHANGED
@@ -5,16 +5,14 @@
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
- # include parent path
8
+ import unittest
9
+
9
10
  import numpy as np
10
- import math
11
11
 
12
12
  import warp as wp
13
- from warp.tests.test_base import *
14
- import unittest
15
-
16
13
  import warp.optim
17
14
  import warp.sim
15
+ from warp.tests.unittest_utils import *
18
16
 
19
17
  wp.init()
20
18
 
@@ -28,32 +26,32 @@ def objective(params: wp.array(dtype=float), score: wp.array(dtype=float)):
28
26
 
29
27
  # This test inspired by https://machinelearningmastery.com/adam-optimization-from-scratch/
30
28
  def test_adam_solve_float(test, device):
31
- wp.set_device(device)
32
- params_start = np.array([0.1, 0.2], dtype=float)
33
- score = wp.zeros(1, dtype=float, requires_grad=True)
34
- params = wp.array(params_start, dtype=float, requires_grad=True)
35
- tape = wp.Tape()
36
- opt = warp.optim.Adam([params], lr=0.02, betas=(0.8, 0.999))
37
-
38
- def gradient_func():
39
- tape.reset()
40
- score.zero_()
41
- with tape:
42
- wp.launch(kernel=objective, dim=len(params), inputs=[params, score])
43
- tape.backward(score)
44
- return [tape.gradients[params]]
45
-
46
- niters = 100
47
-
48
- opt.reset_internal_state()
49
- for _ in range(niters):
50
- opt.step(gradient_func())
51
-
52
- result = params.numpy()
53
- # optimum is at the origin, so the result should be close to it in all N dimensions.
54
- tol = 1e-5
55
- for r in result:
56
- test.assertLessEqual(r, tol)
29
+ with wp.ScopedDevice(device):
30
+ params_start = np.array([0.1, 0.2], dtype=float)
31
+ score = wp.zeros(1, dtype=float, requires_grad=True)
32
+ params = wp.array(params_start, dtype=float, requires_grad=True)
33
+ tape = wp.Tape()
34
+ opt = warp.optim.Adam([params], lr=0.02, betas=(0.8, 0.999))
35
+
36
+ def gradient_func():
37
+ tape.reset()
38
+ score.zero_()
39
+ with tape:
40
+ wp.launch(kernel=objective, dim=len(params), inputs=[params, score])
41
+ tape.backward(score)
42
+ return [tape.gradients[params]]
43
+
44
+ niters = 100
45
+
46
+ opt.reset_internal_state()
47
+ for _ in range(niters):
48
+ opt.step(gradient_func())
49
+
50
+ result = params.numpy()
51
+ # optimum is at the origin, so the result should be close to it in all N dimensions.
52
+ tol = 1e-5
53
+ for r in result:
54
+ test.assertLessEqual(r, tol)
57
55
 
58
56
 
59
57
  @wp.kernel
@@ -65,32 +63,32 @@ def objective_vec3(params: wp.array(dtype=wp.vec3), score: wp.array(dtype=float)
65
63
 
66
64
  # This test inspired by https://machinelearningmastery.com/adam-optimization-from-scratch/
67
65
  def test_adam_solve_vec3(test, device):
68
- wp.set_device(device)
69
- params_start = np.array([[0.1, 0.2, -0.1]], dtype=float)
70
- score = wp.zeros(1, dtype=float, requires_grad=True)
71
- params = wp.array(params_start, dtype=wp.vec3, requires_grad=True)
72
- tape = wp.Tape()
73
- opt = warp.optim.Adam([params], lr=0.02, betas=(0.8, 0.999))
74
-
75
- def gradient_func():
76
- tape.reset()
77
- score.zero_()
78
- with tape:
79
- wp.launch(kernel=objective_vec3, dim=len(params), inputs=[params, score])
80
- tape.backward(score)
81
- return [tape.gradients[params]]
82
-
83
- niters = 100
84
- opt.reset_internal_state()
85
- for _ in range(niters):
86
- opt.step(gradient_func())
87
-
88
- result = params.numpy()
89
- tol = 1e-5
90
- # optimum is at the origin, so the result should be close to it in all N dimensions.
91
- for r in result:
92
- for v in r:
93
- test.assertLessEqual(v, tol)
66
+ with wp.ScopedDevice(device):
67
+ params_start = np.array([[0.1, 0.2, -0.1]], dtype=float)
68
+ score = wp.zeros(1, dtype=float, requires_grad=True)
69
+ params = wp.array(params_start, dtype=wp.vec3, requires_grad=True)
70
+ tape = wp.Tape()
71
+ opt = warp.optim.Adam([params], lr=0.02, betas=(0.8, 0.999))
72
+
73
+ def gradient_func():
74
+ tape.reset()
75
+ score.zero_()
76
+ with tape:
77
+ wp.launch(kernel=objective_vec3, dim=len(params), inputs=[params, score])
78
+ tape.backward(score)
79
+ return [tape.gradients[params]]
80
+
81
+ niters = 100
82
+ opt.reset_internal_state()
83
+ for _ in range(niters):
84
+ opt.step(gradient_func())
85
+
86
+ result = params.numpy()
87
+ tol = 1e-5
88
+ # optimum is at the origin, so the result should be close to it in all N dimensions.
89
+ for r in result:
90
+ for v in r:
91
+ test.assertLessEqual(v, tol)
94
92
 
95
93
 
96
94
  @wp.kernel
@@ -105,56 +103,55 @@ def objective_two_inputs_vec3(
105
103
 
106
104
  # This test inspired by https://machinelearningmastery.com/adam-optimization-from-scratch/
107
105
  def test_adam_solve_two_inputs(test, device):
108
- wp.set_device(device)
109
- params_start1 = np.array([[0.1, 0.2, -0.1]], dtype=float)
110
- params_start2 = np.array([[0.2, 0.1, 0.1]], dtype=float)
111
- score = wp.zeros(1, dtype=float, requires_grad=True)
112
- params1 = wp.array(params_start1, dtype=wp.vec3, requires_grad=True)
113
- params2 = wp.array(params_start2, dtype=wp.vec3, requires_grad=True)
114
- tape = wp.Tape()
115
- opt = warp.optim.Adam([params1, params2], lr=0.02, betas=(0.8, 0.999))
116
-
117
- def gradient_func():
118
- tape.reset()
119
- score.zero_()
120
- with tape:
121
- wp.launch(kernel=objective_two_inputs_vec3, dim=len(params1), inputs=[params1, params2, score])
122
- tape.backward(score)
123
- return [tape.gradients[params1], tape.gradients[params2]]
124
-
125
- niters = 100
126
- opt.reset_internal_state()
127
- for _ in range(niters):
128
- opt.step(gradient_func())
129
-
130
- result = params1.numpy()
131
- tol = 1e-5
132
- # optimum is at the origin, so the result should be close to it in all N dimensions.
133
- for r in result:
134
- for v in r:
135
- test.assertLessEqual(v, tol)
136
-
137
- result = params2.numpy()
138
- tol = 1e-5
139
- # optimum is at the origin, so the result should be close to it in all N dimensions.
140
- for r in result:
141
- for v in r:
142
- test.assertLessEqual(v, tol)
143
-
144
-
145
- def register(parent):
146
- devices = get_test_devices()
147
-
148
- class TestArray(parent):
149
- pass
150
-
151
- add_function_test(TestArray, "test_adam_solve_float", test_adam_solve_float, devices=devices)
152
- add_function_test(TestArray, "test_adam_solve_vec3", test_adam_solve_vec3, devices=devices)
153
- add_function_test(TestArray, "test_adam_solve_two_inputs", test_adam_solve_two_inputs, devices=devices)
154
-
155
- return TestArray
106
+ with wp.ScopedDevice(device):
107
+ params_start1 = np.array([[0.1, 0.2, -0.1]], dtype=float)
108
+ params_start2 = np.array([[0.2, 0.1, 0.1]], dtype=float)
109
+ score = wp.zeros(1, dtype=float, requires_grad=True)
110
+ params1 = wp.array(params_start1, dtype=wp.vec3, requires_grad=True)
111
+ params2 = wp.array(params_start2, dtype=wp.vec3, requires_grad=True)
112
+ tape = wp.Tape()
113
+ opt = warp.optim.Adam([params1, params2], lr=0.02, betas=(0.8, 0.999))
114
+
115
+ def gradient_func():
116
+ tape.reset()
117
+ score.zero_()
118
+ with tape:
119
+ wp.launch(kernel=objective_two_inputs_vec3, dim=len(params1), inputs=[params1, params2, score])
120
+ tape.backward(score)
121
+ return [tape.gradients[params1], tape.gradients[params2]]
122
+
123
+ niters = 100
124
+ opt.reset_internal_state()
125
+ for _ in range(niters):
126
+ opt.step(gradient_func())
127
+
128
+ result = params1.numpy()
129
+ tol = 1e-5
130
+ # optimum is at the origin, so the result should be close to it in all N dimensions.
131
+ for r in result:
132
+ for v in r:
133
+ test.assertLessEqual(v, tol)
134
+
135
+ result = params2.numpy()
136
+ tol = 1e-5
137
+ # optimum is at the origin, so the result should be close to it in all N dimensions.
138
+ for r in result:
139
+ for v in r:
140
+ test.assertLessEqual(v, tol)
141
+
142
+
143
+ devices = get_test_devices()
144
+
145
+
146
+ class TestAdam(unittest.TestCase):
147
+ pass
148
+
149
+
150
+ add_function_test(TestAdam, "test_adam_solve_float", test_adam_solve_float, devices=devices)
151
+ add_function_test(TestAdam, "test_adam_solve_vec3", test_adam_solve_vec3, devices=devices)
152
+ add_function_test(TestAdam, "test_adam_solve_two_inputs", test_adam_solve_two_inputs, devices=devices)
156
153
 
157
154
 
158
155
  if __name__ == "__main__":
159
- c = register(unittest.TestCase)
156
+ wp.build.clear_kernel_cache()
160
157
  unittest.main(verbosity=2)