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
@@ -0,0 +1,98 @@
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
+ import unittest
9
+
10
+ import warp as wp
11
+ from warp.tests.unittest_utils import *
12
+
13
+ wp.init()
14
+
15
+
16
+ def test_devices_get_cuda_device_functions(test, device):
17
+ test.assertTrue(device.is_cuda)
18
+ test.assertTrue(wp.is_device_available(device))
19
+
20
+ device_ordinal = device.ordinal
21
+ current_device = wp.get_cuda_device(device_ordinal)
22
+ test.assertEqual(current_device, device)
23
+ current_device = wp.get_cuda_device() # No-ordinal version
24
+ test.assertTrue(wp.is_device_available(current_device))
25
+
26
+ if device == current_device:
27
+ test.assertEqual(device, "cuda")
28
+ else:
29
+ test.assertNotEqual(device, "cuda")
30
+
31
+ preferred_device = wp.get_preferred_device()
32
+ test.assertTrue(wp.is_device_available(preferred_device))
33
+
34
+
35
+ def test_devices_map_cuda_device(test, device):
36
+ with wp.ScopedDevice(device):
37
+ saved_alias = device.alias
38
+ # Map alias twice to check code path
39
+ wp.map_cuda_device("new_alias")
40
+ wp.map_cuda_device("new_alias")
41
+ wp.context.runtime.rename_device(device, saved_alias)
42
+
43
+
44
+ def test_devices_unmap_imaginary_device(test, device):
45
+ with test.assertRaises(RuntimeError):
46
+ wp.unmap_cuda_device("imaginary_device:0")
47
+
48
+
49
+ def test_devices_verify_cuda_device(test, device):
50
+ verify_cuda_saved = wp.config.verify_cuda
51
+
52
+ wp.config.verify_cuda = True
53
+
54
+ wp.context.runtime.verify_cuda_device(device)
55
+
56
+ wp.config.verify_cuda = verify_cuda_saved
57
+
58
+
59
+ @unittest.skipUnless(wp.is_cuda_available(), "Requires CUDA")
60
+ def test_devices_can_access_self(test, device):
61
+ test.assertTrue(device.can_access(device))
62
+
63
+ for warp_device in wp.get_devices():
64
+ device_str = str(warp_device)
65
+
66
+ if (device.is_cpu and warp_device.is_cuda) or (device.is_cuda and warp_device.is_cpu):
67
+ test.assertFalse(device.can_access(warp_device))
68
+ test.assertNotEqual(device, warp_device)
69
+ test.assertNotEqual(device, device_str)
70
+
71
+
72
+ devices = get_test_devices()
73
+
74
+
75
+ class TestDevices(unittest.TestCase):
76
+ pass
77
+
78
+
79
+ add_function_test(
80
+ TestDevices,
81
+ "test_devices_get_cuda_device_functions",
82
+ test_devices_get_cuda_device_functions,
83
+ devices=get_unique_cuda_test_devices(),
84
+ )
85
+ add_function_test(
86
+ TestDevices, "test_devices_map_cuda_device", test_devices_map_cuda_device, devices=get_unique_cuda_test_devices()
87
+ )
88
+ add_function_test(
89
+ TestDevices, "test_devices_unmap_imaginary_device", test_devices_unmap_imaginary_device, devices=devices
90
+ )
91
+ add_function_test(TestDevices, "test_devices_verify_cuda_device", test_devices_verify_cuda_device, devices=devices)
92
+
93
+ add_function_test(TestDevices, "test_devices_can_access_self", test_devices_can_access_self, devices=devices)
94
+
95
+
96
+ if __name__ == "__main__":
97
+ wp.build.clear_kernel_cache()
98
+ unittest.main(verbosity=2)
warp/tests/test_dlpack.py CHANGED
@@ -5,13 +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
- import numpy as np
9
- import unittest
10
- import os
11
8
  import ctypes
9
+ import os
10
+ import unittest
11
+
12
+ import numpy as np
12
13
 
13
14
  import warp as wp
14
- from warp.tests.test_base import *
15
+ from warp.tests.unittest_utils import *
15
16
 
16
17
  wp.init()
17
18
 
@@ -299,78 +300,77 @@ def test_dlpack_jax_to_warp(test, device):
299
300
  assert_np_equal(a2.numpy(), np.asarray(j))
300
301
 
301
302
 
302
- def register(parent):
303
- class TestDLPack(parent):
304
- pass
305
-
306
- devices = get_test_devices()
307
-
308
- add_function_test(TestDLPack, "test_dlpack_warp_to_warp", test_dlpack_warp_to_warp, devices=devices)
309
- add_function_test(TestDLPack, "test_dlpack_dtypes_and_shapes", test_dlpack_dtypes_and_shapes, devices=devices)
310
-
311
- # torch interop via dlpack
312
- try:
313
- import torch
314
- import torch.utils.dlpack
315
-
316
- # check which Warp devices work with Torch
317
- # CUDA devices may fail if Torch was not compiled with CUDA support
318
- test_devices = get_test_devices()
319
- torch_compatible_devices = []
320
- for d in test_devices:
321
- try:
322
- t = torch.arange(10, device=wp.device_to_torch(d))
323
- t += 1
324
- torch_compatible_devices.append(d)
325
- except Exception as e:
326
- print(f"Skipping Torch DLPack tests on device '{d}' due to exception: {e}")
327
-
328
- if torch_compatible_devices:
329
- add_function_test(
330
- TestDLPack, "test_dlpack_warp_to_torch", test_dlpack_warp_to_torch, devices=torch_compatible_devices
331
- )
332
- add_function_test(
333
- TestDLPack, "test_dlpack_torch_to_warp", test_dlpack_torch_to_warp, devices=torch_compatible_devices
334
- )
335
-
336
- except Exception as e:
337
- print(f"Skipping Torch DLPack tests due to exception: {e}")
338
-
339
- # jax interop via dlpack
340
- try:
341
- # prevent Jax from gobbling up GPU memory
342
- os.environ["XLA_PYTHON_CLIENT_PREALLOCATE"] = "false"
343
-
344
- import jax
345
- import jax.dlpack
346
-
347
- # check which Warp devices work with Jax
348
- # CUDA devices may fail if Jax cannot find a CUDA Toolkit
349
- test_devices = get_test_devices()
350
- jax_compatible_devices = []
351
- for d in test_devices:
352
- try:
353
- with jax.default_device(wp.device_to_jax(d)):
354
- j = jax.numpy.arange(10, dtype=jax.numpy.float32)
355
- j += 1
356
- jax_compatible_devices.append(d)
357
- except Exception as e:
358
- print(f"Skipping Jax DLPack tests on device '{d}' due to exception: {e}")
359
-
360
- if jax_compatible_devices:
361
- add_function_test(
362
- TestDLPack, "test_dlpack_warp_to_jax", test_dlpack_warp_to_jax, devices=jax_compatible_devices
363
- )
364
- add_function_test(
365
- TestDLPack, "test_dlpack_jax_to_warp", test_dlpack_jax_to_warp, devices=jax_compatible_devices
366
- )
367
-
368
- except Exception as e:
369
- print(f"Skipping Jax DLPack tests due to exception: {e}")
370
-
371
- return TestDLPack
303
+ class TestDLPack(unittest.TestCase):
304
+ pass
305
+
306
+
307
+ devices = get_test_devices()
308
+
309
+ add_function_test(TestDLPack, "test_dlpack_warp_to_warp", test_dlpack_warp_to_warp, devices=devices)
310
+ add_function_test(TestDLPack, "test_dlpack_dtypes_and_shapes", test_dlpack_dtypes_and_shapes, devices=devices)
311
+
312
+ # torch interop via dlpack
313
+ try:
314
+ import torch
315
+ import torch.utils.dlpack
316
+
317
+ # check which Warp devices work with Torch
318
+ # CUDA devices may fail if Torch was not compiled with CUDA support
319
+ test_devices = get_test_devices()
320
+ torch_compatible_devices = []
321
+ for d in test_devices:
322
+ try:
323
+ t = torch.arange(10, device=wp.device_to_torch(d))
324
+ t += 1
325
+ torch_compatible_devices.append(d)
326
+ except Exception as e:
327
+ print(f"Skipping Torch DLPack tests on device '{d}' due to exception: {e}")
328
+
329
+ if torch_compatible_devices:
330
+ add_function_test(
331
+ TestDLPack, "test_dlpack_warp_to_torch", test_dlpack_warp_to_torch, devices=torch_compatible_devices
332
+ )
333
+ add_function_test(
334
+ TestDLPack, "test_dlpack_torch_to_warp", test_dlpack_torch_to_warp, devices=torch_compatible_devices
335
+ )
336
+
337
+ except Exception as e:
338
+ print(f"Skipping Torch DLPack tests due to exception: {e}")
339
+
340
+ # jax interop via dlpack
341
+ try:
342
+ # prevent Jax from gobbling up GPU memory
343
+ os.environ["XLA_PYTHON_CLIENT_PREALLOCATE"] = "false"
344
+ os.environ["XLA_PYTHON_CLIENT_ALLOCATOR"] = "platform"
345
+
346
+ import jax
347
+ import jax.dlpack
348
+
349
+ # check which Warp devices work with Jax
350
+ # CUDA devices may fail if Jax cannot find a CUDA Toolkit
351
+ test_devices = get_test_devices()
352
+ jax_compatible_devices = []
353
+ for d in test_devices:
354
+ try:
355
+ with jax.default_device(wp.device_to_jax(d)):
356
+ j = jax.numpy.arange(10, dtype=jax.numpy.float32)
357
+ j += 1
358
+ jax_compatible_devices.append(d)
359
+ except Exception as e:
360
+ print(f"Skipping Jax DLPack tests on device '{d}' due to exception: {e}")
361
+
362
+ if jax_compatible_devices:
363
+ add_function_test(
364
+ TestDLPack, "test_dlpack_warp_to_jax", test_dlpack_warp_to_jax, devices=jax_compatible_devices
365
+ )
366
+ add_function_test(
367
+ TestDLPack, "test_dlpack_jax_to_warp", test_dlpack_jax_to_warp, devices=jax_compatible_devices
368
+ )
369
+
370
+ except Exception as e:
371
+ print(f"Skipping Jax DLPack tests due to exception: {e}")
372
372
 
373
373
 
374
374
  if __name__ == "__main__":
375
- c = register(unittest.TestCase)
375
+ wp.build.clear_kernel_cache()
376
376
  unittest.main(verbosity=2)
@@ -0,0 +1,277 @@
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
+ import importlib
9
+ import os
10
+ import unittest
11
+
12
+ import warp as wp
13
+ from warp.tests.unittest_utils import (
14
+ USD_AVAILABLE,
15
+ get_test_devices,
16
+ get_unique_cuda_test_devices,
17
+ sanitize_identifier,
18
+ )
19
+
20
+ wp.init()
21
+
22
+
23
+ # registers an example to run as a TestCase
24
+ def add_example_test(cls, name, devices=None, options={}):
25
+ def run(test, device):
26
+ # The copy() is needed because pop() is used to avoid passing extra args to Example()
27
+ # Can remove once all examples accept **kwargs and we no longer need to pop()
28
+ test_options = options.copy()
29
+
30
+ try:
31
+ module = importlib.import_module(f"examples.{name}")
32
+
33
+ torch_cuda_required = test_options.setdefault("torch_cuda_required", False)
34
+ test_options.pop("torch_cuda_required", None)
35
+ if torch_cuda_required and wp.get_device(device).is_cuda:
36
+ # Ensure torch has CUDA support
37
+ import torch
38
+
39
+ if not torch.cuda.is_available():
40
+ test.skipTest("Torch not compiled with CUDA support")
41
+
42
+ except Exception as e:
43
+ test.skipTest(f"{e}")
44
+
45
+ # create default USD stage output path which many examples expect
46
+ test_options.setdefault(
47
+ "stage",
48
+ os.path.join(os.path.dirname(__file__), f"outputs/{name}_{sanitize_identifier(device)}.usd")
49
+ if USD_AVAILABLE
50
+ else None,
51
+ )
52
+
53
+ if test_options["stage"]:
54
+ try:
55
+ os.remove(test_options["stage"])
56
+ except OSError:
57
+ pass
58
+
59
+ num_frames = test_options.get("num_frames", 10)
60
+ test_options.pop("num_frames", None)
61
+
62
+ # Don't want to force load all modules by default for serial test runner
63
+ wp.config.graph_capture_module_load_default = False
64
+
65
+ try:
66
+ enable_backward = test_options.get("enable_backward", True)
67
+ wp.set_module_options({"enable_backward": enable_backward}, module)
68
+ test_options.pop("enable_backward", None)
69
+
70
+ with wp.ScopedDevice(device):
71
+ wp.load_module(module, device=wp.get_device())
72
+ extra_load_modules = test_options.get("load_modules", [])
73
+ for module_name in extra_load_modules:
74
+ wp.load_module(module_name, device=wp.get_device())
75
+ test_options.pop("load_modules", None)
76
+
77
+ e = module.Example(**test_options)
78
+
79
+ # disable scoped timer to avoid log spam from time steps
80
+ wp.ScopedTimer.enabled = False
81
+
82
+ for _ in range(num_frames):
83
+ e.update()
84
+ e.render()
85
+ except Exception as e:
86
+ test.fail(f"{e}")
87
+ finally:
88
+ wp.ScopedTimer.enabled = True
89
+ wp.config.graph_capture_module_load_default = True
90
+
91
+ from warp.tests.unittest_utils import add_function_test
92
+
93
+ add_function_test(cls, f"test_{name}", run, devices=devices, check_output=False)
94
+
95
+
96
+ # TODO: Make the example classes use the passed in device
97
+ cuda_test_devices = get_unique_cuda_test_devices()
98
+ test_devices = get_test_devices()
99
+
100
+ # NOTE: To give the parallel test runner more opportunities to parallelize test cases,
101
+ # we break up the tests into multiple TestCase classes that should be non-conflicting
102
+ # w.r.t. kernel compilation
103
+
104
+
105
+ class TestExamples(unittest.TestCase):
106
+ pass
107
+
108
+
109
+ # Exclude unless we can run headless somehow
110
+ # add_example_test(TestExamples, name="example_render_opengl", options={})
111
+
112
+ add_example_test(TestExamples, name="example_dem", devices=cuda_test_devices)
113
+ add_example_test(TestExamples, name="example_diffray", devices=cuda_test_devices)
114
+ add_example_test(TestExamples, name="example_fluid", devices=cuda_test_devices)
115
+ add_example_test(TestExamples, name="example_jacobian_ik", devices=cuda_test_devices)
116
+ add_example_test(TestExamples, name="example_marching_cubes", devices=cuda_test_devices)
117
+ add_example_test(TestExamples, name="example_mesh", devices=cuda_test_devices)
118
+ add_example_test(TestExamples, name="example_mesh_intersect", devices=cuda_test_devices, options={"num_frames": 1})
119
+ add_example_test(TestExamples, name="example_nvdb", devices=cuda_test_devices)
120
+ add_example_test(TestExamples, name="example_raycast", devices=cuda_test_devices)
121
+ add_example_test(TestExamples, name="example_raymarch", devices=cuda_test_devices)
122
+ add_example_test(TestExamples, name="example_sph", devices=cuda_test_devices)
123
+ add_example_test(TestExamples, name="example_wave", devices=cuda_test_devices, options={"resx": 256, "resy": 256})
124
+
125
+
126
+ class TestSimExamples(unittest.TestCase):
127
+ pass
128
+
129
+
130
+ add_example_test(
131
+ TestSimExamples,
132
+ name="example_sim_cartpole",
133
+ devices=cuda_test_devices,
134
+ options={"load_modules": ["warp.sim.collide", "warp.sim.integrator_euler", "warp.sim.articulation"]},
135
+ )
136
+ add_example_test(
137
+ TestSimExamples,
138
+ name="example_sim_cloth",
139
+ devices=cuda_test_devices,
140
+ options={"load_modules": ["warp.sim.collide", "warp.sim.integrator_euler", "warp.sim.particles"]},
141
+ )
142
+ add_example_test(TestSimExamples, name="example_sim_fk_grad", devices=cuda_test_devices)
143
+ add_example_test(
144
+ TestSimExamples, name="example_sim_fk_grad_torch", devices=cuda_test_devices, options={"torch_cuda_required": True}
145
+ )
146
+ add_example_test(
147
+ TestSimExamples,
148
+ name="example_sim_grad_bounce",
149
+ devices=cuda_test_devices,
150
+ options={"load_modules": ["warp.sim.integrator_euler", "warp.sim.particles"]},
151
+ )
152
+ add_example_test(
153
+ TestSimExamples,
154
+ name="example_sim_grad_cloth",
155
+ devices=cuda_test_devices,
156
+ options={"load_modules": ["warp.sim.integrator_euler", "warp.sim.particles"]},
157
+ )
158
+ add_example_test(TestSimExamples, name="example_sim_granular", devices=cuda_test_devices)
159
+ add_example_test(TestSimExamples, name="example_sim_granular_collision_sdf", devices=cuda_test_devices)
160
+ add_example_test(TestSimExamples, name="example_sim_neo_hookean", devices=cuda_test_devices)
161
+ add_example_test(TestSimExamples, name="example_sim_particle_chain", devices=cuda_test_devices)
162
+ add_example_test(
163
+ TestSimExamples,
164
+ name="example_sim_quadruped",
165
+ devices=cuda_test_devices,
166
+ options={"load_modules": ["warp.sim.integrator_xpbd", "warp.sim.integrator_euler"]},
167
+ )
168
+ add_example_test(
169
+ TestSimExamples,
170
+ name="example_sim_rigid_chain",
171
+ devices=cuda_test_devices,
172
+ options={"load_modules": ["warp.sim.integrator_xpbd", "warp.sim.integrator_euler"]},
173
+ )
174
+ add_example_test(
175
+ TestSimExamples,
176
+ name="example_sim_rigid_contact",
177
+ devices=cuda_test_devices,
178
+ options={"load_modules": ["warp.sim.integrator_euler"]},
179
+ )
180
+ add_example_test(TestSimExamples, name="example_sim_rigid_fem", devices=cuda_test_devices)
181
+ add_example_test(TestSimExamples, name="example_sim_rigid_force", devices=cuda_test_devices)
182
+ add_example_test(TestSimExamples, name="example_sim_rigid_gyroscopic", devices=cuda_test_devices)
183
+ add_example_test(TestSimExamples, name="example_sim_rigid_kinematics", devices=cuda_test_devices)
184
+ add_example_test(TestSimExamples, name="example_sim_trajopt", devices=cuda_test_devices)
185
+
186
+
187
+ class TestFemExamples(unittest.TestCase):
188
+ pass
189
+
190
+
191
+ add_example_test(
192
+ TestFemExamples,
193
+ name="fem.example_diffusion_mgpu",
194
+ devices=cuda_test_devices,
195
+ options={"quiet": True, "num_frames": 1, "enable_backward": False},
196
+ )
197
+
198
+ # The following examples do not need CUDA
199
+ add_example_test(
200
+ TestFemExamples,
201
+ name="fem.example_apic_fluid",
202
+ devices=test_devices,
203
+ options={"quiet": True, "res": [16, 16, 16], "enable_backward": False},
204
+ )
205
+ add_example_test(
206
+ TestFemExamples,
207
+ name="fem.example_diffusion",
208
+ devices=test_devices,
209
+ options={"quiet": True, "resolution": 10, "mesh": "tri", "num_frames": 1, "enable_backward": False},
210
+ )
211
+ add_example_test(
212
+ TestFemExamples,
213
+ name="fem.example_diffusion_3d",
214
+ devices=test_devices,
215
+ options={"quiet": True, "resolution": 10, "num_frames": 1, "enable_backward": False},
216
+ )
217
+ add_example_test(
218
+ TestFemExamples,
219
+ name="fem.example_deformed_geometry",
220
+ devices=test_devices,
221
+ options={"quiet": True, "resolution": 10, "num_frames": 1, "mesh": "tri", "enable_backward": False},
222
+ )
223
+ add_example_test(
224
+ TestFemExamples,
225
+ name="fem.example_convection_diffusion",
226
+ devices=test_devices,
227
+ options={"quiet": True, "resolution": 20, "enable_backward": False},
228
+ )
229
+ add_example_test(
230
+ TestExamples,
231
+ name="fem.example_convection_diffusion_dg0",
232
+ devices=test_devices,
233
+ options={"quiet": True, "resolution": 20, "num_frames": 25, "mesh": "quad", "enable_backward": False},
234
+ )
235
+ add_example_test(
236
+ TestExamples,
237
+ name="fem.example_convection_diffusion_dg",
238
+ devices=test_devices,
239
+ options={"quiet": True, "resolution": 20, "num_frames": 25, "mesh": "tri", "enable_backward": False},
240
+ )
241
+ add_example_test(
242
+ TestFemExamples,
243
+ name="fem.example_mixed_elasticity",
244
+ devices=test_devices,
245
+ options={"quiet": True, "nonconforming_stresses": True, "mesh": "quad", "num_frames": 1, "enable_backward": False},
246
+ )
247
+ add_example_test(
248
+ TestFemExamples,
249
+ name="fem.example_stokes_transfer",
250
+ devices=test_devices,
251
+ options={"quiet": True, "num_frames": 1, "enable_backward": False},
252
+ )
253
+ add_example_test(
254
+ TestExamples,
255
+ name="fem.example_stokes",
256
+ devices=test_devices,
257
+ options={
258
+ "quiet": True,
259
+ "num_frames": 1,
260
+ "resolution": 10,
261
+ "nonconforming_pressures": True,
262
+ "enable_backward": False,
263
+ },
264
+ )
265
+ add_example_test(
266
+ TestExamples,
267
+ name="fem.example_navier_stokes",
268
+ devices=test_devices,
269
+ options={"quiet": True, "num_frames": 100, "resolution": 10, "tri_mesh": True, "enable_backward": False},
270
+ )
271
+
272
+
273
+ if __name__ == "__main__":
274
+ # force rebuild of all kernels
275
+ wp.build.clear_kernel_cache()
276
+
277
+ unittest.main(verbosity=2, failfast=True)