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
@@ -0,0 +1,154 @@
1
+ import unittest
2
+
3
+ import numpy as np
4
+ import warp as wp
5
+ import unittest
6
+
7
+ from warp.optim.linear import preconditioner, cg, bicgstab, gmres
8
+ from warp.tests.unittest_utils import *
9
+
10
+
11
+ wp.init()
12
+
13
+
14
+ def _check_linear_solve(test, A, b, func, *args, **kwargs):
15
+ # test from zero
16
+ x = wp.zeros_like(b)
17
+ with wp.ScopedDevice(A.device):
18
+ niter, err, atol = func(A, b, x, *args, use_cuda_graph=True, **kwargs)
19
+
20
+ test.assertLessEqual(err, atol)
21
+
22
+ # test with warm start
23
+ with wp.ScopedDevice(A.device):
24
+ niter_warm, err, atol = func(A, b, x, *args, use_cuda_graph=False, **kwargs)
25
+
26
+ test.assertLessEqual(err, atol)
27
+ test.assertLess(niter_warm, niter)
28
+
29
+ # In CG and BiCGSTAB residual norm is evaluating from running residual
30
+ # rather then being computed from scratch as Ax - b
31
+ # This can lead to accumulated inaccuracies over iterations, esp in float32
32
+ residual = A.numpy() @ x.numpy() - b.numpy()
33
+ err_np = np.linalg.norm(residual)
34
+ if A.dtype == wp.float64:
35
+ test.assertLessEqual(err_np, 2.0 * atol)
36
+ else:
37
+ test.assertLessEqual(err_np, 32.0 * atol)
38
+
39
+
40
+ def _least_square_system(rng, n: int):
41
+ C = rng.uniform(low=-100, high=100, size=(n, n))
42
+ f = rng.uniform(low=-100, high=100, size=(n,))
43
+
44
+ A = C @ C.T
45
+ b = C @ f
46
+
47
+ return A, b
48
+
49
+
50
+ def _make_spd_system(n: int, seed: int, dtype, device):
51
+ rng = np.random.default_rng(seed)
52
+
53
+ A, b = _least_square_system(rng, n)
54
+
55
+ return wp.array(A, dtype=dtype, device=device), wp.array(b, dtype=dtype, device=device)
56
+
57
+
58
+ def _make_nonsymmetric_system(n: int, seed: int, dtype, device, spd=False):
59
+ rng = np.random.default_rng(seed)
60
+ s = rng.uniform(low=0.1, high=10, size=(n,))
61
+
62
+ A, b = _least_square_system(rng, n)
63
+ A = A @ np.diag(s)
64
+
65
+ return wp.array(A, dtype=dtype, device=device), wp.array(b, dtype=dtype, device=device)
66
+
67
+
68
+ def _make_indefinite_system(n: int, seed: int, dtype, device, spd=False):
69
+ rng = np.random.default_rng(seed)
70
+ s = rng.uniform(low=0.1, high=10, size=(n,))
71
+
72
+ A, b = _least_square_system(rng, n)
73
+ A = A @ np.diag(s)
74
+
75
+ return wp.array(A, dtype=dtype, device=device), wp.array(b, dtype=dtype, device=device)
76
+
77
+
78
+ def test_cg(test, device):
79
+ A, b = _make_spd_system(n=64, seed=123, device=device, dtype=wp.float64)
80
+ M = preconditioner(A, "diag")
81
+
82
+ _check_linear_solve(test, A, b, cg, maxiter=1000)
83
+ _check_linear_solve(test, A, b, cg, M=M, maxiter=1000)
84
+
85
+ A, b = _make_spd_system(n=16, seed=321, device=device, dtype=wp.float32)
86
+ M = preconditioner(A, "diag")
87
+
88
+ _check_linear_solve(test, A, b, cg, maxiter=1000)
89
+ _check_linear_solve(test, A, b, cg, M=M, maxiter=1000)
90
+
91
+
92
+ def test_bicgstab(test, device):
93
+ A, b = _make_nonsymmetric_system(n=64, seed=123, device=device, dtype=wp.float64)
94
+ M = preconditioner(A, "diag")
95
+
96
+ _check_linear_solve(test, A, b, bicgstab, maxiter=1000)
97
+ _check_linear_solve(test, A, b, bicgstab, M=M, maxiter=1000)
98
+ _check_linear_solve(test, A, b, bicgstab, M=M, maxiter=1000, is_left_preconditioner=True)
99
+
100
+ A, b = _make_nonsymmetric_system(n=16, seed=321, device=device, dtype=wp.float32)
101
+ M = preconditioner(A, "diag")
102
+
103
+ _check_linear_solve(test, A, b, bicgstab, maxiter=1000)
104
+ _check_linear_solve(test, A, b, bicgstab, M=M, maxiter=1000)
105
+ _check_linear_solve(test, A, b, bicgstab, M=M, maxiter=1000, is_left_preconditioner=True)
106
+
107
+ A, b = _make_indefinite_system(n=64, seed=121, device=device, dtype=wp.float64)
108
+ M = preconditioner(A, "diag")
109
+
110
+ _check_linear_solve(test, A, b, bicgstab, maxiter=1000)
111
+ _check_linear_solve(test, A, b, bicgstab, M=M, maxiter=1000)
112
+ _check_linear_solve(test, A, b, bicgstab, M=M, maxiter=1000, is_left_preconditioner=True)
113
+
114
+
115
+ def test_gmres(test, device):
116
+ A, b = _make_nonsymmetric_system(n=64, seed=456, device=device, dtype=wp.float64)
117
+ M = preconditioner(A, "diag")
118
+
119
+ _check_linear_solve(test, A, b, gmres, maxiter=1000, tol=1.0e-3)
120
+ _check_linear_solve(test, A, b, gmres, M=M, maxiter=1000, tol=1.0e-5)
121
+ _check_linear_solve(test, A, b, gmres, M=M, maxiter=1000, tol=1.0e-5, is_left_preconditioner=True)
122
+
123
+ A, b = _make_nonsymmetric_system(n=64, seed=654, device=device, dtype=wp.float64)
124
+ M = preconditioner(A, "diag")
125
+
126
+ _check_linear_solve(test, A, b, gmres, maxiter=1000, tol=1.0e-3)
127
+ _check_linear_solve(test, A, b, gmres, M=M, maxiter=1000, tol=1.0e-5)
128
+ _check_linear_solve(test, A, b, gmres, M=M, maxiter=1000, tol=1.0e-5, is_left_preconditioner=True)
129
+
130
+
131
+ class TestLinearSolvers(unittest.TestCase):
132
+ pass
133
+
134
+
135
+ devices = get_test_devices()
136
+
137
+ from warp.context import runtime
138
+
139
+ if not runtime.core.is_cutlass_enabled():
140
+ devices = [d for d in devices if not d.is_cuda]
141
+ print("Skipping CUDA linear solver tests because CUTLASS is not supported in this build")
142
+
143
+ if runtime.core.is_debug_enabled():
144
+ # cutlass-based matmul is *very* slow in debug mode -- skip
145
+ devices = [d for d in devices if not d.is_cuda]
146
+ print("Skipping CUDA linear solver tests in debug mode")
147
+
148
+ add_function_test(TestLinearSolvers, "test_cg", test_cg, devices=devices)
149
+ add_function_test(TestLinearSolvers, "test_bicgstab", test_bicgstab, devices=devices)
150
+ add_function_test(TestLinearSolvers, "test_gmres", test_gmres, devices=devices)
151
+
152
+ if __name__ == "__main__":
153
+ wp.build.clear_kernel_cache()
154
+ unittest.main(verbosity=2)
@@ -0,0 +1,493 @@
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
+ @wp.kernel
17
+ def rmw_array_kernel(foos: wp.array(dtype=wp.uint32)):
18
+ i = wp.tid()
19
+
20
+ foos[i] += wp.uint32(1)
21
+
22
+
23
+ def test_rmw_array(test, device):
24
+ arr = wp.zeros((10,), dtype=wp.uint32, device=device)
25
+
26
+ wp.launch(
27
+ kernel=rmw_array_kernel,
28
+ dim=(10,),
29
+ inputs=[arr],
30
+ device=device,
31
+ )
32
+ wp.synchronize()
33
+
34
+ for f in arr.list():
35
+ if f != 1:
36
+ raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
37
+
38
+
39
+ @wp.struct
40
+ class RmwFoo:
41
+ field: wp.uint32
42
+
43
+
44
+ @wp.kernel
45
+ def rmw_array_struct_kernel(foos: wp.array(dtype=RmwFoo)):
46
+ i = wp.tid()
47
+ foos[i].field += wp.uint32(1)
48
+
49
+
50
+ def test_rmw_array_struct(test, device):
51
+ foos = wp.zeros((10,), dtype=RmwFoo, device=device)
52
+
53
+ wp.launch(
54
+ kernel=rmw_array_struct_kernel,
55
+ dim=(10,),
56
+ inputs=[foos],
57
+ device=device,
58
+ )
59
+ wp.synchronize()
60
+
61
+ expected = RmwFoo()
62
+ expected.field = 1
63
+ for f in foos.list():
64
+ if f.field != expected.field:
65
+ raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
66
+
67
+
68
+ @wp.func
69
+ def lookup(foos: wp.array(dtype=wp.uint32), index: int):
70
+ return foos[index]
71
+
72
+
73
+ @wp.kernel
74
+ def lookup_kernel(foos: wp.array(dtype=wp.uint32)):
75
+ i = wp.tid()
76
+
77
+ x = lookup(foos, i)
78
+ foos[i] = x + wp.uint32(1)
79
+
80
+
81
+ def test_lookup(test, device):
82
+ arr = wp.zeros((10,), dtype=wp.uint32, device=device)
83
+
84
+ wp.launch(
85
+ kernel=lookup_kernel,
86
+ dim=(10,),
87
+ inputs=[arr],
88
+ device=device,
89
+ )
90
+ wp.synchronize()
91
+
92
+ for f in arr.list():
93
+ if f != 1:
94
+ raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
95
+
96
+
97
+ @wp.func
98
+ def lookup3(foos: wp.array(dtype=wp.float32), index: int):
99
+ return foos[index]
100
+
101
+
102
+ @wp.kernel
103
+ def grad_kernel(foos: wp.array(dtype=wp.float32), bars: wp.array(dtype=wp.float32)):
104
+ i = wp.tid()
105
+
106
+ x = lookup3(foos, i)
107
+ bars[i] = x * wp.float32(i) + 1.0
108
+
109
+
110
+ def test_grad(test, device):
111
+ num = 10
112
+ data = np.linspace(20, 20 + num, num, endpoint=False, dtype=np.float32)
113
+ input = wp.array(data, device=device, requires_grad=True)
114
+ output = wp.zeros(num, dtype=wp.float32, device=device)
115
+
116
+ ones = wp.array(np.ones(len(output)), dtype=wp.float32, device=device)
117
+
118
+ tape = wp.Tape()
119
+ with tape:
120
+ wp.launch(
121
+ kernel=grad_kernel,
122
+ dim=(num,),
123
+ inputs=[input],
124
+ outputs=[output],
125
+ device=device,
126
+ )
127
+
128
+ tape.backward(grads={output: ones})
129
+
130
+ wp.synchronize()
131
+
132
+ # test forward results
133
+ for i, f in enumerate(output.list()):
134
+ expected = data[i] * i + 1
135
+ if f != expected:
136
+ raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
137
+
138
+ # test backward results
139
+ for i, f in enumerate(tape.gradients[input].list()):
140
+ expected = i
141
+ if f != expected:
142
+ raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
143
+
144
+
145
+ @wp.func
146
+ def lookup2(foos: wp.array(dtype=wp.uint32), index: int):
147
+ if index % 2 == 0:
148
+ x = foos[index]
149
+ x = wp.uint32(0)
150
+ return x
151
+ else:
152
+ return foos[index]
153
+
154
+
155
+ @wp.kernel
156
+ def lookup2_kernel(foos: wp.array(dtype=wp.uint32)):
157
+ i = wp.tid()
158
+
159
+ x = lookup2(foos, i)
160
+ foos[i] = x + wp.uint32(1)
161
+
162
+
163
+ def test_lookup2(test, device):
164
+ arr = wp.zeros((10,), dtype=wp.uint32, device=device)
165
+
166
+ wp.launch(
167
+ kernel=lookup2_kernel,
168
+ dim=(10,),
169
+ inputs=[arr],
170
+ device=device,
171
+ )
172
+ wp.synchronize()
173
+
174
+ for f in arr.list():
175
+ if f != 1:
176
+ raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
177
+
178
+
179
+ @wp.kernel
180
+ def unary_kernel(foos: wp.array(dtype=wp.uint32)):
181
+ i = wp.tid()
182
+
183
+ foos[i] = wp.uint32(-1)
184
+ x = -foos[i]
185
+ foos[i] = x
186
+
187
+
188
+ def test_unary(test, device):
189
+ arr = wp.zeros((10,), dtype=wp.uint32, device=device)
190
+
191
+ wp.launch(
192
+ kernel=unary_kernel,
193
+ dim=(10,),
194
+ inputs=[arr],
195
+ device=device,
196
+ )
197
+ wp.synchronize()
198
+
199
+ for f in arr.list():
200
+ if f != 1:
201
+ raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
202
+
203
+
204
+ @wp.kernel
205
+ def rvalue_kernel(foos: wp.array(dtype=wp.uint32)):
206
+ i = wp.tid()
207
+
208
+ if foos[i] < wp.uint32(1):
209
+ foos[i] = wp.uint32(1)
210
+
211
+
212
+ def test_rvalue(test, device):
213
+ arr = wp.zeros((10,), dtype=wp.uint32, device=device)
214
+
215
+ wp.launch(
216
+ kernel=rvalue_kernel,
217
+ dim=(10,),
218
+ inputs=[arr],
219
+ device=device,
220
+ )
221
+ wp.synchronize()
222
+
223
+ for f in arr.list():
224
+ if f != 1:
225
+ raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
226
+
227
+
228
+ # Tests, among other things, that assigning a reference to a new variable does
229
+ # not create a reference
230
+ @wp.kernel
231
+ def intermediate_kernel(foos: wp.array(dtype=wp.uint32)):
232
+ i = wp.tid()
233
+
234
+ x = foos[i]
235
+ x = x + wp.uint32(1)
236
+ foos[i] = x
237
+
238
+
239
+ def test_intermediate(test, device):
240
+ arr = wp.zeros((10,), dtype=wp.uint32, device=device)
241
+
242
+ wp.launch(
243
+ kernel=intermediate_kernel,
244
+ dim=(10,),
245
+ inputs=[arr],
246
+ device=device,
247
+ )
248
+ wp.synchronize()
249
+
250
+ for f in arr.list():
251
+ if f != 1:
252
+ raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
253
+
254
+
255
+ @wp.kernel
256
+ def array_kernel(foos: wp.array(dtype=wp.uint32)):
257
+ i = wp.tid()
258
+ foos[i] = wp.uint32(1)
259
+
260
+
261
+ def test_array_assign(test, device):
262
+ arr = wp.zeros((10,), dtype=wp.uint32, device=device)
263
+
264
+ wp.launch(
265
+ kernel=array_kernel,
266
+ dim=(10,),
267
+ inputs=[arr],
268
+ device=device,
269
+ )
270
+ wp.synchronize()
271
+
272
+ for f in arr.list():
273
+ if f != 1:
274
+ raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
275
+
276
+
277
+ @wp.func
278
+ def increment(arg: wp.uint32):
279
+ return arg + wp.uint32(1)
280
+
281
+
282
+ @wp.kernel
283
+ def array_call_kernel(foos: wp.array(dtype=wp.uint32)):
284
+ i = wp.tid()
285
+ foos[i] = increment(foos[i])
286
+
287
+
288
+ def test_array_call_assign(test, device):
289
+ arr = wp.zeros((10,), dtype=wp.uint32, device=device)
290
+
291
+ wp.launch(
292
+ kernel=array_kernel,
293
+ dim=(10,),
294
+ inputs=[arr],
295
+ device=device,
296
+ )
297
+ wp.synchronize()
298
+
299
+ for f in arr.list():
300
+ if f != 1:
301
+ raise AssertionError(f"Unexpected result, got: {f} expected: {1}")
302
+
303
+
304
+ @wp.struct
305
+ class Foo:
306
+ field: wp.uint32
307
+
308
+
309
+ @wp.kernel
310
+ def array_struct_kernel(foos: wp.array(dtype=Foo)):
311
+ i = wp.tid()
312
+ foos[i].field = wp.uint32(1)
313
+
314
+
315
+ def test_array_struct_assign(test, device):
316
+ foos = wp.zeros((10,), dtype=Foo, device=device)
317
+
318
+ wp.launch(
319
+ kernel=array_struct_kernel,
320
+ dim=(10,),
321
+ inputs=[foos],
322
+ device=device,
323
+ )
324
+ wp.synchronize()
325
+
326
+ expected = Foo()
327
+ expected.field = 1
328
+ for f in foos.list():
329
+ if f.field != expected.field:
330
+ raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
331
+
332
+
333
+ @wp.struct
334
+ class Bar:
335
+ field: wp.uint32
336
+
337
+
338
+ @wp.struct
339
+ class Baz:
340
+ bar: Bar
341
+
342
+
343
+ @wp.kernel
344
+ def array_struct_struct_kernel(foos: wp.array(dtype=Baz)):
345
+ i = wp.tid()
346
+ foos[i].bar.field = wp.uint32(1)
347
+
348
+
349
+ def test_array_struct_struct_assign(test, device):
350
+ foos = wp.zeros((10,), dtype=Baz, device=device)
351
+
352
+ wp.launch(
353
+ kernel=array_struct_struct_kernel,
354
+ dim=(10,),
355
+ inputs=[foos],
356
+ device=device,
357
+ )
358
+ wp.synchronize()
359
+
360
+ expected = Baz()
361
+ expected.bar.field = 1
362
+ for f in foos.list():
363
+ if f.bar.field != expected.bar.field:
364
+ raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
365
+
366
+
367
+ @wp.struct
368
+ class S:
369
+ a: wp.uint32
370
+ b: wp.float32
371
+
372
+
373
+ @wp.struct
374
+ class F:
375
+ x: wp.float32
376
+ s: S
377
+ y: wp.int32
378
+
379
+
380
+ @wp.kernel
381
+ def complex_kernel(foos: wp.array(dtype=F)):
382
+ i = wp.tid()
383
+ foos[i].x += wp.float32(1.0)
384
+ foos[i].y = wp.int32(2)
385
+ foos[i].s.b += wp.float32(3.0)
386
+ foos[i].s.a = wp.uint32(foos[i].y)
387
+
388
+
389
+ def test_complex(test, device):
390
+ foos = wp.zeros((10,), dtype=F, device=device)
391
+
392
+ wp.launch(
393
+ kernel=complex_kernel,
394
+ dim=(10,),
395
+ inputs=[foos],
396
+ device=device,
397
+ )
398
+ wp.synchronize()
399
+
400
+ expected = F()
401
+ expected.x = 1.0
402
+ expected.y = 2
403
+ expected.s.b = 3.0
404
+ expected.s.a = expected.y
405
+ for f in foos.list():
406
+ if f.x != expected.x or f.y != expected.y or f.s.a != expected.s.a or f.s.b != expected.s.b:
407
+ raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
408
+
409
+
410
+ @wp.struct
411
+ class Svec:
412
+ a: wp.uint32
413
+ b: wp.vec2f
414
+
415
+
416
+ @wp.struct
417
+ class Fvec:
418
+ x: wp.vec2f
419
+ s: Svec
420
+ y: wp.int32
421
+
422
+
423
+ @wp.kernel
424
+ def swizzle_kernel(foos: wp.array(dtype=Fvec)):
425
+ i = wp.tid()
426
+
427
+ foos[i].x += wp.vec2f(1.0, 2.0)
428
+ foos[i].y = wp.int32(3)
429
+ foos[i].s.b = wp.vec2f(4.0, 5.0)
430
+ foos[i].s.b.y = wp.float32(6.0)
431
+ foos[i].s.b.x = foos[i].x.y
432
+ foos[i].s.a = wp.uint32(foos[i].y)
433
+
434
+
435
+ def test_swizzle(test, device):
436
+ foos = wp.zeros((10,), dtype=Fvec, device=device)
437
+
438
+ wp.launch(
439
+ kernel=swizzle_kernel,
440
+ dim=(10,),
441
+ inputs=[foos],
442
+ device=device,
443
+ )
444
+ wp.synchronize()
445
+
446
+ expected = Fvec()
447
+ expected.x = wp.vec2f(1.0, 2.0)
448
+ expected.y = 3
449
+ expected.s.b = wp.vec2f(4.0, 5.0)
450
+ expected.s.b.y = 6.0
451
+ expected.s.b.x = expected.x.y
452
+ expected.s.a = expected.y
453
+ for f in foos.list():
454
+ if f.x != expected.x or f.y != expected.y or f.s.a != expected.s.a or f.s.b != expected.s.b:
455
+ raise AssertionError(f"Unexpected result, got: {f} expected: {expected}")
456
+
457
+
458
+ devices = get_test_devices()
459
+
460
+
461
+ class TestLValue(unittest.TestCase):
462
+ def test_swizzle_error_invalid_attribute(self):
463
+ v = wp.vec3(1, 2, 3)
464
+ with self.assertRaisesRegex(
465
+ AttributeError,
466
+ r"'vec3f' object has no attribute 'foo'$",
467
+ ):
468
+ v.foo
469
+
470
+ try:
471
+ v.bar = 123
472
+ except AttributeError:
473
+ self.fail()
474
+
475
+
476
+ add_function_test(TestLValue, "test_rmw_array", test_rmw_array, devices=devices)
477
+ add_function_test(TestLValue, "test_rmw_array_struct", test_rmw_array_struct, devices=devices)
478
+ add_function_test(TestLValue, "test_lookup", test_lookup, devices=devices)
479
+ add_function_test(TestLValue, "test_lookup2", test_lookup2, devices=devices)
480
+ add_function_test(TestLValue, "test_grad", test_grad, devices=devices)
481
+ add_function_test(TestLValue, "test_unary", test_unary, devices=devices)
482
+ add_function_test(TestLValue, "test_rvalue", test_rvalue, devices=devices)
483
+ add_function_test(TestLValue, "test_intermediate", test_intermediate, devices=devices)
484
+ add_function_test(TestLValue, "test_array_assign", test_array_assign, devices=devices)
485
+ add_function_test(TestLValue, "test_array_struct_assign", test_array_struct_assign, devices=devices)
486
+ add_function_test(TestLValue, "test_array_struct_struct_assign", test_array_struct_struct_assign, devices=devices)
487
+ add_function_test(TestLValue, "test_complex", test_complex, devices=devices)
488
+ add_function_test(TestLValue, "test_swizzle", test_swizzle, devices=devices)
489
+
490
+
491
+ if __name__ == "__main__":
492
+ wp.build.clear_kernel_cache()
493
+ unittest.main(verbosity=2)
@@ -5,14 +5,12 @@
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
-
15
- import unittest
13
+ from warp.tests.unittest_utils import *
16
14
 
17
15
  wp.init()
18
16
 
@@ -39,7 +37,7 @@ def test_marching_cubes(test, device):
39
37
 
40
38
  radius = dim / 4.0
41
39
 
42
- wp.launch(make_field, dim=field.shape, inputs=[field, wp.vec3(dim / 2, dim / 2, dim / 2), radius], device="cuda")
40
+ wp.launch(make_field, dim=field.shape, inputs=[field, wp.vec3(dim / 2, dim / 2, dim / 2), radius], device=device)
43
41
 
44
42
  iso.surface(field=field, threshold=0.0)
45
43
 
@@ -49,18 +47,19 @@ def test_marching_cubes(test, device):
49
47
 
50
48
  test.assertTrue(np.max(error) < 1.0)
51
49
 
50
+ iso.resize(nx=dim * 2, ny=dim * 2, nz=dim * 2, max_verts=max_verts, max_tris=max_tris)
51
+
52
+
53
+ devices = get_unique_cuda_test_devices()
52
54
 
53
- def register(parent):
54
- devices = ["cuda"]
55
55
 
56
- class TestMarchingCubes(parent):
57
- pass
56
+ class TestMarchingCubes(unittest.TestCase):
57
+ pass
58
58
 
59
- add_function_test(TestMarchingCubes, "test_marching_cubes", test_marching_cubes, devices=devices)
60
59
 
61
- return TestMarchingCubes
60
+ add_function_test(TestMarchingCubes, "test_marching_cubes", test_marching_cubes, devices=devices)
62
61
 
63
62
 
64
63
  if __name__ == "__main__":
65
- c = register(unittest.TestCase)
64
+ wp.build.clear_kernel_cache()
66
65
  unittest.main(verbosity=2)