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,150 @@
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 numpy as np
11
+
12
+ import warp as wp
13
+ from warp.tests.unittest_utils import *
14
+ from warp.utils import array_inner, array_sum
15
+
16
+ wp.init()
17
+
18
+
19
+ def make_test_array_sum(dtype):
20
+ N = 1000
21
+
22
+ def test_array_sum(test, device):
23
+ rng = np.random.default_rng(123)
24
+
25
+ cols = wp.types.type_length(dtype)
26
+
27
+ values_np = rng.random(size=(N, cols))
28
+ values = wp.array(values_np, device=device, dtype=dtype)
29
+
30
+ vsum = array_sum(values)
31
+ ref_vsum = values_np.sum(axis=0)
32
+
33
+ assert_np_equal(vsum / N, ref_vsum / N, 0.0001)
34
+
35
+ return test_array_sum
36
+
37
+
38
+ def make_test_array_sum_axis(dtype):
39
+ I = 5
40
+ J = 10
41
+ K = 2
42
+
43
+ N = I * J * K
44
+
45
+ def test_array_sum(test, device):
46
+ rng = np.random.default_rng(123)
47
+
48
+ values_np = rng.random(size=(I, J, K))
49
+ values = wp.array(values_np, shape=(I, J, K), device=device, dtype=dtype)
50
+
51
+ for axis in range(3):
52
+ vsum = array_sum(values, axis=axis)
53
+ ref_vsum = values_np.sum(axis=axis)
54
+
55
+ assert_np_equal(vsum.numpy() / N, ref_vsum / N, 0.0001)
56
+
57
+ return test_array_sum
58
+
59
+
60
+ def test_array_sum_empty(test, device):
61
+ values = wp.array([], device=device, dtype=wp.vec2)
62
+ assert_np_equal(array_sum(values), np.zeros(2))
63
+
64
+ values = wp.array([], shape=(0, 3), device=device, dtype=float)
65
+ assert_np_equal(array_sum(values, axis=0).numpy(), np.zeros(3))
66
+
67
+
68
+ def make_test_array_inner(dtype):
69
+ N = 1000
70
+
71
+ def test_array_inner(test, device):
72
+ rng = np.random.default_rng(123)
73
+
74
+ cols = wp.types.type_length(dtype)
75
+
76
+ a_np = rng.random(size=(N, cols))
77
+ b_np = rng.random(size=(N, cols))
78
+
79
+ a = wp.array(a_np, device=device, dtype=dtype)
80
+ b = wp.array(b_np, device=device, dtype=dtype)
81
+
82
+ ab = array_inner(a, b)
83
+ ref_ab = np.dot(a_np.flatten(), b_np.flatten())
84
+
85
+ test.assertAlmostEqual(ab / N, ref_ab / N, places=5)
86
+
87
+ return test_array_inner
88
+
89
+
90
+ def make_test_array_inner_axis(dtype):
91
+ I = 5
92
+ J = 10
93
+ K = 2
94
+
95
+ N = I * J * K
96
+
97
+ def test_array_inner(test, device):
98
+ rng = np.random.default_rng(123)
99
+
100
+ a_np = rng.random(size=(I, J, K))
101
+ b_np = rng.random(size=(I, J, K))
102
+
103
+ a = wp.array(a_np, shape=(I, J, K), device=device, dtype=dtype)
104
+ b = wp.array(b_np, shape=(I, J, K), device=device, dtype=dtype)
105
+
106
+ ab = array_inner(a, b, axis=0)
107
+ ref_ab = np.einsum(a_np, [0, 1, 2], b_np, [0, 1, 2], [1, 2])
108
+ assert_np_equal(ab.numpy() / N, ref_ab / N, 0.0001)
109
+
110
+ ab = array_inner(a, b, axis=1)
111
+ ref_ab = np.einsum(a_np, [0, 1, 2], b_np, [0, 1, 2], [0, 2])
112
+ assert_np_equal(ab.numpy() / N, ref_ab / N, 0.0001)
113
+
114
+ ab = array_inner(a, b, axis=2)
115
+ ref_ab = np.einsum(a_np, [0, 1, 2], b_np, [0, 1, 2], [0, 1])
116
+ assert_np_equal(ab.numpy() / N, ref_ab / N, 0.0001)
117
+
118
+ return test_array_inner
119
+
120
+
121
+ def test_array_inner_empty(test, device):
122
+ values = wp.array([], device=device, dtype=wp.vec2)
123
+ test.assertEqual(array_inner(values, values), 0.0)
124
+
125
+ values = wp.array([], shape=(0, 3), device=device, dtype=float)
126
+ assert_np_equal(array_inner(values, values, axis=0).numpy(), np.zeros(3))
127
+
128
+
129
+ devices = get_test_devices()
130
+
131
+
132
+ class TestArrayReduce(unittest.TestCase):
133
+ pass
134
+
135
+
136
+ add_function_test(TestArrayReduce, "test_array_sum_double", make_test_array_sum(wp.float64), devices=devices)
137
+ add_function_test(TestArrayReduce, "test_array_sum_vec3", make_test_array_sum(wp.vec3), devices=devices)
138
+ add_function_test(TestArrayReduce, "test_array_sum_axis_float", make_test_array_sum_axis(wp.float32), devices=devices)
139
+ add_function_test(TestArrayReduce, "test_array_sum_empty", test_array_sum_empty, devices=devices)
140
+ add_function_test(TestArrayReduce, "test_array_inner_double", make_test_array_inner(wp.float64), devices=devices)
141
+ add_function_test(TestArrayReduce, "test_array_inner_vec3", make_test_array_inner(wp.vec3), devices=devices)
142
+ add_function_test(
143
+ TestArrayReduce, "test_array_inner_axis_float", make_test_array_inner_axis(wp.float32), devices=devices
144
+ )
145
+ add_function_test(TestArrayReduce, "test_array_inner_empty", test_array_inner_empty, devices=devices)
146
+
147
+
148
+ if __name__ == "__main__":
149
+ wp.build.clear_kernel_cache()
150
+ unittest.main(verbosity=2)
warp/tests/test_atomic.py CHANGED
@@ -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
 
@@ -34,8 +32,7 @@ def make_atomic_test(type):
34
32
  # register a custom kernel (no decorator) function
35
33
  # this lets us register the same function definition
36
34
  # against multiple symbols, with different arg types
37
- module = wp.get_module(test_atomic_kernel.__module__)
38
- kernel = wp.Kernel(func=test_atomic_kernel, key=f"test_atomic_{type.__name__}_kernel", module=module)
35
+ kernel = wp.Kernel(func=test_atomic_kernel, key=f"test_atomic_{type.__name__}_kernel")
39
36
 
40
37
  def test_atomic(test, device):
41
38
  n = 1024
@@ -54,20 +51,60 @@ def make_atomic_test(type):
54
51
  base = rng.random(size=(1, *type._shape_), dtype=float)
55
52
  val = rng.random(size=(n, *type._shape_), dtype=float)
56
53
 
57
- add_array = wp.array(base, dtype=type, device=device)
58
- min_array = wp.array(base, dtype=type, device=device)
59
- max_array = wp.array(base, dtype=type, device=device)
54
+ add_array = wp.array(base, dtype=type, device=device, requires_grad=True)
55
+ min_array = wp.array(base, dtype=type, device=device, requires_grad=True)
56
+ max_array = wp.array(base, dtype=type, device=device, requires_grad=True)
57
+ add_array.zero_()
58
+ min_array.fill_(10000)
59
+ max_array.fill_(-10000)
60
60
 
61
- val_array = wp.array(val, dtype=type, device=device)
61
+ val_array = wp.array(val, dtype=type, device=device, requires_grad=True)
62
62
 
63
- wp.launch(kernel, n, inputs=[add_array, min_array, max_array, val_array], device=device)
64
-
65
- val = np.append(val, [base[0]], axis=0)
63
+ tape = wp.Tape()
64
+ with tape:
65
+ wp.launch(kernel, n, inputs=[add_array, min_array, max_array, val_array], device=device)
66
66
 
67
67
  assert_np_equal(add_array.numpy(), np.sum(val, axis=0), tol=1.0e-2)
68
68
  assert_np_equal(min_array.numpy(), np.min(val, axis=0), tol=1.0e-2)
69
69
  assert_np_equal(max_array.numpy(), np.max(val, axis=0), tol=1.0e-2)
70
70
 
71
+ if type != wp.int32:
72
+ add_array.grad.fill_(1)
73
+ tape.backward()
74
+ assert_np_equal(val_array.grad.numpy(), np.ones_like(val))
75
+ tape.zero()
76
+
77
+ min_array.grad.fill_(1)
78
+ tape.backward()
79
+ min_grad_array = np.zeros_like(val)
80
+ argmin = val.argmin(axis=0)
81
+ if val.ndim == 1:
82
+ min_grad_array[argmin] = 1
83
+ elif val.ndim == 2:
84
+ for i in range(val.shape[1]):
85
+ min_grad_array[argmin[i], i] = 1
86
+ elif val.ndim == 3:
87
+ for i in range(val.shape[1]):
88
+ for j in range(val.shape[2]):
89
+ min_grad_array[argmin[i, j], i, j] = 1
90
+ assert_np_equal(val_array.grad.numpy(), min_grad_array)
91
+ tape.zero()
92
+
93
+ max_array.grad.fill_(1)
94
+ tape.backward()
95
+ max_grad_array = np.zeros_like(val)
96
+ argmax = val.argmax(axis=0)
97
+ if val.ndim == 1:
98
+ max_grad_array[argmax] = 1
99
+ elif val.ndim == 2:
100
+ for i in range(val.shape[1]):
101
+ max_grad_array[argmax[i], i] = 1
102
+ elif val.ndim == 3:
103
+ for i in range(val.shape[1]):
104
+ for j in range(val.shape[2]):
105
+ max_grad_array[argmax[i, j], i, j] = 1
106
+ assert_np_equal(val_array.grad.numpy(), max_grad_array)
107
+
71
108
  return test_atomic
72
109
 
73
110
 
@@ -82,24 +119,23 @@ test_atomic_mat33 = make_atomic_test(wp.mat33)
82
119
  test_atomic_mat44 = make_atomic_test(wp.mat44)
83
120
 
84
121
 
85
- def register(parent):
86
- devices = get_test_devices()
122
+ devices = get_test_devices()
123
+
87
124
 
88
- class TestAtomic(parent):
89
- pass
125
+ class TestAtomic(unittest.TestCase):
126
+ pass
90
127
 
91
- add_function_test(TestAtomic, "test_atomic_int", test_atomic_int, devices=devices)
92
- add_function_test(TestAtomic, "test_atomic_float", test_atomic_float, devices=devices)
93
- add_function_test(TestAtomic, "test_atomic_vec2", test_atomic_vec2, devices=devices)
94
- add_function_test(TestAtomic, "test_atomic_vec3", test_atomic_vec3, devices=devices)
95
- add_function_test(TestAtomic, "test_atomic_vec4", test_atomic_vec4, devices=devices)
96
- add_function_test(TestAtomic, "test_atomic_mat22", test_atomic_mat22, devices=devices)
97
- add_function_test(TestAtomic, "test_atomic_mat33", test_atomic_mat33, devices=devices)
98
- add_function_test(TestAtomic, "test_atomic_mat44", test_atomic_mat44, devices=devices)
99
128
 
100
- return TestAtomic
129
+ add_function_test(TestAtomic, "test_atomic_int", test_atomic_int, devices=devices)
130
+ add_function_test(TestAtomic, "test_atomic_float", test_atomic_float, devices=devices)
131
+ add_function_test(TestAtomic, "test_atomic_vec2", test_atomic_vec2, devices=devices)
132
+ add_function_test(TestAtomic, "test_atomic_vec3", test_atomic_vec3, devices=devices)
133
+ add_function_test(TestAtomic, "test_atomic_vec4", test_atomic_vec4, devices=devices)
134
+ add_function_test(TestAtomic, "test_atomic_mat22", test_atomic_mat22, devices=devices)
135
+ add_function_test(TestAtomic, "test_atomic_mat33", test_atomic_mat33, devices=devices)
136
+ add_function_test(TestAtomic, "test_atomic_mat44", test_atomic_mat44, devices=devices)
101
137
 
102
138
 
103
139
  if __name__ == "__main__":
104
- c = register(unittest.TestCase)
140
+ wp.build.clear_kernel_cache()
105
141
  unittest.main(verbosity=2)
@@ -0,0 +1,99 @@
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 numpy as np
11
+
12
+ import warp as wp
13
+ from warp.tests.unittest_utils import *
14
+
15
+ wp.init()
16
+
17
+ TRUE_CONSTANT = wp.constant(True)
18
+
19
+
20
+ @wp.func
21
+ def identity_function(input_bool: wp.bool, plain_bool: bool):
22
+ return input_bool and plain_bool
23
+
24
+
25
+ @wp.kernel
26
+ def identity_test(data: wp.array(dtype=wp.bool)):
27
+ i = wp.tid()
28
+
29
+ data[i] = data[i] and True
30
+ data[i] = data[i] and wp.bool(True)
31
+ data[i] = data[i] and not False
32
+ data[i] = data[i] and not wp.bool(False)
33
+ data[i] = identity_function(data[i], True)
34
+
35
+ if data[i]:
36
+ data[i] = True
37
+ else:
38
+ data[i] = False
39
+
40
+ if not data[i]:
41
+ data[i] = False
42
+ else:
43
+ data[i] = True
44
+
45
+ if data[i] and True:
46
+ data[i] = True
47
+ else:
48
+ data[i] = False
49
+
50
+ if data[i] or False:
51
+ data[i] = True
52
+ else:
53
+ data[i] = False
54
+
55
+
56
+ def test_bool_identity_ops(test, device):
57
+ rng = np.random.default_rng(123)
58
+
59
+ dim_x = 10
60
+
61
+ rand_np = rng.random(dim_x) > 0.5
62
+
63
+ data_array = wp.array(data=rand_np, device=device)
64
+
65
+ test.assertEqual(data_array.dtype, wp.bool)
66
+
67
+ wp.launch(identity_test, dim=data_array.shape, inputs=[data_array], device=device)
68
+
69
+ assert_np_equal(data_array.numpy(), rand_np)
70
+
71
+
72
+ @wp.kernel
73
+ def check_compile_constant(result: wp.array(dtype=wp.bool)):
74
+ if TRUE_CONSTANT:
75
+ result[0] = TRUE_CONSTANT
76
+ else:
77
+ result[0] = False
78
+
79
+
80
+ def test_bool_constant(test, device):
81
+ compile_constant_value = wp.zeros(1, dtype=wp.bool, device=device)
82
+ wp.launch(check_compile_constant, 1, inputs=[compile_constant_value], device=device)
83
+ test.assertTrue(compile_constant_value.numpy()[0])
84
+
85
+
86
+ devices = get_test_devices()
87
+
88
+
89
+ class TestBool(unittest.TestCase):
90
+ pass
91
+
92
+
93
+ add_function_test(TestBool, "test_bool_identity_ops", test_bool_identity_ops, devices=devices)
94
+ add_function_test(TestBool, "test_bool_constant", test_bool_constant, devices=devices)
95
+
96
+
97
+ if __name__ == "__main__":
98
+ wp.build.clear_kernel_cache()
99
+ unittest.main(verbosity=2)