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,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)