warp-lang 1.10.0__py3-none-macosx_11_0_arm64.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 (468) hide show
  1. warp/__init__.py +334 -0
  2. warp/__init__.pyi +5856 -0
  3. warp/_src/__init__.py +14 -0
  4. warp/_src/autograd.py +1077 -0
  5. warp/_src/build.py +620 -0
  6. warp/_src/build_dll.py +642 -0
  7. warp/_src/builtins.py +10555 -0
  8. warp/_src/codegen.py +4361 -0
  9. warp/_src/config.py +178 -0
  10. warp/_src/constants.py +59 -0
  11. warp/_src/context.py +8352 -0
  12. warp/_src/dlpack.py +464 -0
  13. warp/_src/fabric.py +362 -0
  14. warp/_src/fem/__init__.py +14 -0
  15. warp/_src/fem/adaptivity.py +510 -0
  16. warp/_src/fem/cache.py +689 -0
  17. warp/_src/fem/dirichlet.py +190 -0
  18. warp/_src/fem/domain.py +553 -0
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +703 -0
  21. warp/_src/fem/field/nodal_field.py +403 -0
  22. warp/_src/fem/field/restriction.py +39 -0
  23. warp/_src/fem/field/virtual.py +1021 -0
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/_src/fem/geometry/adaptive_nanogrid.py +782 -0
  26. warp/_src/fem/geometry/closest_point.py +99 -0
  27. warp/_src/fem/geometry/deformed_geometry.py +277 -0
  28. warp/_src/fem/geometry/element.py +854 -0
  29. warp/_src/fem/geometry/geometry.py +693 -0
  30. warp/_src/fem/geometry/grid_2d.py +478 -0
  31. warp/_src/fem/geometry/grid_3d.py +539 -0
  32. warp/_src/fem/geometry/hexmesh.py +956 -0
  33. warp/_src/fem/geometry/nanogrid.py +660 -0
  34. warp/_src/fem/geometry/partition.py +483 -0
  35. warp/_src/fem/geometry/quadmesh.py +597 -0
  36. warp/_src/fem/geometry/tetmesh.py +762 -0
  37. warp/_src/fem/geometry/trimesh.py +588 -0
  38. warp/_src/fem/integrate.py +2507 -0
  39. warp/_src/fem/linalg.py +385 -0
  40. warp/_src/fem/operator.py +398 -0
  41. warp/_src/fem/polynomial.py +231 -0
  42. warp/_src/fem/quadrature/__init__.py +17 -0
  43. warp/_src/fem/quadrature/pic_quadrature.py +318 -0
  44. warp/_src/fem/quadrature/quadrature.py +665 -0
  45. warp/_src/fem/space/__init__.py +248 -0
  46. warp/_src/fem/space/basis_function_space.py +499 -0
  47. warp/_src/fem/space/basis_space.py +681 -0
  48. warp/_src/fem/space/dof_mapper.py +253 -0
  49. warp/_src/fem/space/function_space.py +312 -0
  50. warp/_src/fem/space/grid_2d_function_space.py +179 -0
  51. warp/_src/fem/space/grid_3d_function_space.py +229 -0
  52. warp/_src/fem/space/hexmesh_function_space.py +255 -0
  53. warp/_src/fem/space/nanogrid_function_space.py +199 -0
  54. warp/_src/fem/space/partition.py +435 -0
  55. warp/_src/fem/space/quadmesh_function_space.py +222 -0
  56. warp/_src/fem/space/restriction.py +221 -0
  57. warp/_src/fem/space/shape/__init__.py +152 -0
  58. warp/_src/fem/space/shape/cube_shape_function.py +1107 -0
  59. warp/_src/fem/space/shape/shape_function.py +134 -0
  60. warp/_src/fem/space/shape/square_shape_function.py +928 -0
  61. warp/_src/fem/space/shape/tet_shape_function.py +829 -0
  62. warp/_src/fem/space/shape/triangle_shape_function.py +674 -0
  63. warp/_src/fem/space/tetmesh_function_space.py +270 -0
  64. warp/_src/fem/space/topology.py +461 -0
  65. warp/_src/fem/space/trimesh_function_space.py +193 -0
  66. warp/_src/fem/types.py +114 -0
  67. warp/_src/fem/utils.py +488 -0
  68. warp/_src/jax.py +188 -0
  69. warp/_src/jax_experimental/__init__.py +14 -0
  70. warp/_src/jax_experimental/custom_call.py +389 -0
  71. warp/_src/jax_experimental/ffi.py +1286 -0
  72. warp/_src/jax_experimental/xla_ffi.py +658 -0
  73. warp/_src/marching_cubes.py +710 -0
  74. warp/_src/math.py +416 -0
  75. warp/_src/optim/__init__.py +14 -0
  76. warp/_src/optim/adam.py +165 -0
  77. warp/_src/optim/linear.py +1608 -0
  78. warp/_src/optim/sgd.py +114 -0
  79. warp/_src/paddle.py +408 -0
  80. warp/_src/render/__init__.py +14 -0
  81. warp/_src/render/imgui_manager.py +291 -0
  82. warp/_src/render/render_opengl.py +3638 -0
  83. warp/_src/render/render_usd.py +939 -0
  84. warp/_src/render/utils.py +162 -0
  85. warp/_src/sparse.py +2718 -0
  86. warp/_src/tape.py +1208 -0
  87. warp/_src/thirdparty/__init__.py +0 -0
  88. warp/_src/thirdparty/appdirs.py +598 -0
  89. warp/_src/thirdparty/dlpack.py +145 -0
  90. warp/_src/thirdparty/unittest_parallel.py +676 -0
  91. warp/_src/torch.py +393 -0
  92. warp/_src/types.py +5888 -0
  93. warp/_src/utils.py +1695 -0
  94. warp/autograd.py +33 -0
  95. warp/bin/libwarp-clang.dylib +0 -0
  96. warp/bin/libwarp.dylib +0 -0
  97. warp/build.py +29 -0
  98. warp/build_dll.py +24 -0
  99. warp/codegen.py +24 -0
  100. warp/constants.py +24 -0
  101. warp/context.py +33 -0
  102. warp/dlpack.py +24 -0
  103. warp/examples/__init__.py +24 -0
  104. warp/examples/assets/bear.usd +0 -0
  105. warp/examples/assets/bunny.usd +0 -0
  106. warp/examples/assets/cube.usd +0 -0
  107. warp/examples/assets/nonuniform.usd +0 -0
  108. warp/examples/assets/nvidia_logo.png +0 -0
  109. warp/examples/assets/pixel.jpg +0 -0
  110. warp/examples/assets/rocks.nvdb +0 -0
  111. warp/examples/assets/rocks.usd +0 -0
  112. warp/examples/assets/sphere.usd +0 -0
  113. warp/examples/assets/square_cloth.usd +0 -0
  114. warp/examples/benchmarks/benchmark_api.py +389 -0
  115. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  116. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  117. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  118. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  119. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  120. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  121. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  122. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  123. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  124. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  125. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  126. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  127. warp/examples/benchmarks/benchmark_launches.py +301 -0
  128. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  129. warp/examples/benchmarks/benchmark_tile_sort.py +155 -0
  130. warp/examples/browse.py +37 -0
  131. warp/examples/core/example_cupy.py +86 -0
  132. warp/examples/core/example_dem.py +241 -0
  133. warp/examples/core/example_fluid.py +299 -0
  134. warp/examples/core/example_graph_capture.py +150 -0
  135. warp/examples/core/example_marching_cubes.py +195 -0
  136. warp/examples/core/example_mesh.py +180 -0
  137. warp/examples/core/example_mesh_intersect.py +211 -0
  138. warp/examples/core/example_nvdb.py +182 -0
  139. warp/examples/core/example_raycast.py +111 -0
  140. warp/examples/core/example_raymarch.py +205 -0
  141. warp/examples/core/example_render_opengl.py +290 -0
  142. warp/examples/core/example_sample_mesh.py +300 -0
  143. warp/examples/core/example_sph.py +411 -0
  144. warp/examples/core/example_spin_lock.py +93 -0
  145. warp/examples/core/example_torch.py +211 -0
  146. warp/examples/core/example_wave.py +269 -0
  147. warp/examples/core/example_work_queue.py +118 -0
  148. warp/examples/distributed/example_jacobi_mpi.py +506 -0
  149. warp/examples/fem/example_adaptive_grid.py +286 -0
  150. warp/examples/fem/example_apic_fluid.py +469 -0
  151. warp/examples/fem/example_burgers.py +261 -0
  152. warp/examples/fem/example_convection_diffusion.py +181 -0
  153. warp/examples/fem/example_convection_diffusion_dg.py +225 -0
  154. warp/examples/fem/example_darcy_ls_optimization.py +489 -0
  155. warp/examples/fem/example_deformed_geometry.py +172 -0
  156. warp/examples/fem/example_diffusion.py +196 -0
  157. warp/examples/fem/example_diffusion_3d.py +225 -0
  158. warp/examples/fem/example_diffusion_mgpu.py +225 -0
  159. warp/examples/fem/example_distortion_energy.py +228 -0
  160. warp/examples/fem/example_elastic_shape_optimization.py +387 -0
  161. warp/examples/fem/example_magnetostatics.py +242 -0
  162. warp/examples/fem/example_mixed_elasticity.py +293 -0
  163. warp/examples/fem/example_navier_stokes.py +263 -0
  164. warp/examples/fem/example_nonconforming_contact.py +300 -0
  165. warp/examples/fem/example_stokes.py +213 -0
  166. warp/examples/fem/example_stokes_transfer.py +262 -0
  167. warp/examples/fem/example_streamlines.py +357 -0
  168. warp/examples/fem/utils.py +1047 -0
  169. warp/examples/interop/example_jax_callable.py +146 -0
  170. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  171. warp/examples/interop/example_jax_kernel.py +232 -0
  172. warp/examples/optim/example_diffray.py +561 -0
  173. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  174. warp/examples/tile/example_tile_block_cholesky.py +502 -0
  175. warp/examples/tile/example_tile_cholesky.py +88 -0
  176. warp/examples/tile/example_tile_convolution.py +66 -0
  177. warp/examples/tile/example_tile_fft.py +55 -0
  178. warp/examples/tile/example_tile_filtering.py +113 -0
  179. warp/examples/tile/example_tile_matmul.py +85 -0
  180. warp/examples/tile/example_tile_mcgp.py +191 -0
  181. warp/examples/tile/example_tile_mlp.py +385 -0
  182. warp/examples/tile/example_tile_nbody.py +199 -0
  183. warp/fabric.py +24 -0
  184. warp/fem/__init__.py +173 -0
  185. warp/fem/adaptivity.py +26 -0
  186. warp/fem/cache.py +30 -0
  187. warp/fem/dirichlet.py +24 -0
  188. warp/fem/field/__init__.py +24 -0
  189. warp/fem/field/field.py +26 -0
  190. warp/fem/geometry/__init__.py +21 -0
  191. warp/fem/geometry/closest_point.py +31 -0
  192. warp/fem/linalg.py +38 -0
  193. warp/fem/operator.py +32 -0
  194. warp/fem/polynomial.py +29 -0
  195. warp/fem/space/__init__.py +22 -0
  196. warp/fem/space/basis_space.py +24 -0
  197. warp/fem/space/shape/__init__.py +68 -0
  198. warp/fem/space/topology.py +24 -0
  199. warp/fem/types.py +24 -0
  200. warp/fem/utils.py +32 -0
  201. warp/jax.py +29 -0
  202. warp/jax_experimental/__init__.py +29 -0
  203. warp/jax_experimental/custom_call.py +29 -0
  204. warp/jax_experimental/ffi.py +39 -0
  205. warp/jax_experimental/xla_ffi.py +24 -0
  206. warp/marching_cubes.py +24 -0
  207. warp/math.py +37 -0
  208. warp/native/array.h +1687 -0
  209. warp/native/builtin.h +2327 -0
  210. warp/native/bvh.cpp +562 -0
  211. warp/native/bvh.cu +826 -0
  212. warp/native/bvh.h +555 -0
  213. warp/native/clang/clang.cpp +541 -0
  214. warp/native/coloring.cpp +622 -0
  215. warp/native/crt.cpp +51 -0
  216. warp/native/crt.h +568 -0
  217. warp/native/cuda_crt.h +1058 -0
  218. warp/native/cuda_util.cpp +677 -0
  219. warp/native/cuda_util.h +313 -0
  220. warp/native/error.cpp +77 -0
  221. warp/native/error.h +36 -0
  222. warp/native/exports.h +2023 -0
  223. warp/native/fabric.h +246 -0
  224. warp/native/hashgrid.cpp +311 -0
  225. warp/native/hashgrid.cu +89 -0
  226. warp/native/hashgrid.h +240 -0
  227. warp/native/initializer_array.h +41 -0
  228. warp/native/intersect.h +1253 -0
  229. warp/native/intersect_adj.h +375 -0
  230. warp/native/intersect_tri.h +348 -0
  231. warp/native/mat.h +5189 -0
  232. warp/native/mathdx.cpp +93 -0
  233. warp/native/matnn.h +221 -0
  234. warp/native/mesh.cpp +266 -0
  235. warp/native/mesh.cu +406 -0
  236. warp/native/mesh.h +2097 -0
  237. warp/native/nanovdb/GridHandle.h +533 -0
  238. warp/native/nanovdb/HostBuffer.h +591 -0
  239. warp/native/nanovdb/NanoVDB.h +6246 -0
  240. warp/native/nanovdb/NodeManager.h +323 -0
  241. warp/native/nanovdb/PNanoVDB.h +3390 -0
  242. warp/native/noise.h +859 -0
  243. warp/native/quat.h +1664 -0
  244. warp/native/rand.h +342 -0
  245. warp/native/range.h +145 -0
  246. warp/native/reduce.cpp +174 -0
  247. warp/native/reduce.cu +363 -0
  248. warp/native/runlength_encode.cpp +79 -0
  249. warp/native/runlength_encode.cu +61 -0
  250. warp/native/scan.cpp +47 -0
  251. warp/native/scan.cu +55 -0
  252. warp/native/scan.h +23 -0
  253. warp/native/solid_angle.h +466 -0
  254. warp/native/sort.cpp +251 -0
  255. warp/native/sort.cu +286 -0
  256. warp/native/sort.h +35 -0
  257. warp/native/sparse.cpp +241 -0
  258. warp/native/sparse.cu +435 -0
  259. warp/native/spatial.h +1306 -0
  260. warp/native/svd.h +727 -0
  261. warp/native/temp_buffer.h +46 -0
  262. warp/native/tile.h +4124 -0
  263. warp/native/tile_radix_sort.h +1112 -0
  264. warp/native/tile_reduce.h +838 -0
  265. warp/native/tile_scan.h +240 -0
  266. warp/native/tuple.h +189 -0
  267. warp/native/vec.h +2199 -0
  268. warp/native/version.h +23 -0
  269. warp/native/volume.cpp +501 -0
  270. warp/native/volume.cu +68 -0
  271. warp/native/volume.h +970 -0
  272. warp/native/volume_builder.cu +483 -0
  273. warp/native/volume_builder.h +52 -0
  274. warp/native/volume_impl.h +70 -0
  275. warp/native/warp.cpp +1143 -0
  276. warp/native/warp.cu +4604 -0
  277. warp/native/warp.h +358 -0
  278. warp/optim/__init__.py +20 -0
  279. warp/optim/adam.py +24 -0
  280. warp/optim/linear.py +35 -0
  281. warp/optim/sgd.py +24 -0
  282. warp/paddle.py +24 -0
  283. warp/py.typed +0 -0
  284. warp/render/__init__.py +22 -0
  285. warp/render/imgui_manager.py +29 -0
  286. warp/render/render_opengl.py +24 -0
  287. warp/render/render_usd.py +24 -0
  288. warp/render/utils.py +24 -0
  289. warp/sparse.py +51 -0
  290. warp/tape.py +24 -0
  291. warp/tests/__init__.py +1 -0
  292. warp/tests/__main__.py +4 -0
  293. warp/tests/assets/curlnoise_golden.npy +0 -0
  294. warp/tests/assets/mlp_golden.npy +0 -0
  295. warp/tests/assets/pixel.npy +0 -0
  296. warp/tests/assets/pnoise_golden.npy +0 -0
  297. warp/tests/assets/spiky.usd +0 -0
  298. warp/tests/assets/test_grid.nvdb +0 -0
  299. warp/tests/assets/test_index_grid.nvdb +0 -0
  300. warp/tests/assets/test_int32_grid.nvdb +0 -0
  301. warp/tests/assets/test_vec_grid.nvdb +0 -0
  302. warp/tests/assets/torus.nvdb +0 -0
  303. warp/tests/assets/torus.usda +105 -0
  304. warp/tests/aux_test_class_kernel.py +34 -0
  305. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  306. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  307. warp/tests/aux_test_dependent.py +29 -0
  308. warp/tests/aux_test_grad_customs.py +29 -0
  309. warp/tests/aux_test_instancing_gc.py +26 -0
  310. warp/tests/aux_test_module_aot.py +7 -0
  311. warp/tests/aux_test_module_unload.py +23 -0
  312. warp/tests/aux_test_name_clash1.py +40 -0
  313. warp/tests/aux_test_name_clash2.py +40 -0
  314. warp/tests/aux_test_reference.py +9 -0
  315. warp/tests/aux_test_reference_reference.py +8 -0
  316. warp/tests/aux_test_square.py +16 -0
  317. warp/tests/aux_test_unresolved_func.py +22 -0
  318. warp/tests/aux_test_unresolved_symbol.py +22 -0
  319. warp/tests/cuda/__init__.py +0 -0
  320. warp/tests/cuda/test_async.py +676 -0
  321. warp/tests/cuda/test_conditional_captures.py +1147 -0
  322. warp/tests/cuda/test_ipc.py +124 -0
  323. warp/tests/cuda/test_mempool.py +233 -0
  324. warp/tests/cuda/test_multigpu.py +169 -0
  325. warp/tests/cuda/test_peer.py +139 -0
  326. warp/tests/cuda/test_pinned.py +84 -0
  327. warp/tests/cuda/test_streams.py +691 -0
  328. warp/tests/geometry/__init__.py +0 -0
  329. warp/tests/geometry/test_bvh.py +335 -0
  330. warp/tests/geometry/test_hash_grid.py +259 -0
  331. warp/tests/geometry/test_marching_cubes.py +294 -0
  332. warp/tests/geometry/test_mesh.py +318 -0
  333. warp/tests/geometry/test_mesh_query_aabb.py +392 -0
  334. warp/tests/geometry/test_mesh_query_point.py +935 -0
  335. warp/tests/geometry/test_mesh_query_ray.py +323 -0
  336. warp/tests/geometry/test_volume.py +1103 -0
  337. warp/tests/geometry/test_volume_write.py +346 -0
  338. warp/tests/interop/__init__.py +0 -0
  339. warp/tests/interop/test_dlpack.py +730 -0
  340. warp/tests/interop/test_jax.py +1673 -0
  341. warp/tests/interop/test_paddle.py +800 -0
  342. warp/tests/interop/test_torch.py +1001 -0
  343. warp/tests/run_coverage_serial.py +39 -0
  344. warp/tests/test_adam.py +162 -0
  345. warp/tests/test_arithmetic.py +1096 -0
  346. warp/tests/test_array.py +3756 -0
  347. warp/tests/test_array_reduce.py +156 -0
  348. warp/tests/test_assert.py +303 -0
  349. warp/tests/test_atomic.py +336 -0
  350. warp/tests/test_atomic_bitwise.py +209 -0
  351. warp/tests/test_atomic_cas.py +312 -0
  352. warp/tests/test_bool.py +220 -0
  353. warp/tests/test_builtins_resolution.py +732 -0
  354. warp/tests/test_closest_point_edge_edge.py +327 -0
  355. warp/tests/test_codegen.py +974 -0
  356. warp/tests/test_codegen_instancing.py +1495 -0
  357. warp/tests/test_compile_consts.py +215 -0
  358. warp/tests/test_conditional.py +298 -0
  359. warp/tests/test_context.py +35 -0
  360. warp/tests/test_copy.py +319 -0
  361. warp/tests/test_ctypes.py +618 -0
  362. warp/tests/test_dense.py +73 -0
  363. warp/tests/test_devices.py +127 -0
  364. warp/tests/test_enum.py +136 -0
  365. warp/tests/test_examples.py +424 -0
  366. warp/tests/test_fabricarray.py +998 -0
  367. warp/tests/test_fast_math.py +72 -0
  368. warp/tests/test_fem.py +2204 -0
  369. warp/tests/test_fixedarray.py +229 -0
  370. warp/tests/test_fp16.py +136 -0
  371. warp/tests/test_func.py +501 -0
  372. warp/tests/test_future_annotations.py +100 -0
  373. warp/tests/test_generics.py +656 -0
  374. warp/tests/test_grad.py +893 -0
  375. warp/tests/test_grad_customs.py +339 -0
  376. warp/tests/test_grad_debug.py +341 -0
  377. warp/tests/test_implicit_init.py +411 -0
  378. warp/tests/test_import.py +45 -0
  379. warp/tests/test_indexedarray.py +1140 -0
  380. warp/tests/test_intersect.py +103 -0
  381. warp/tests/test_iter.py +76 -0
  382. warp/tests/test_large.py +177 -0
  383. warp/tests/test_launch.py +411 -0
  384. warp/tests/test_lerp.py +151 -0
  385. warp/tests/test_linear_solvers.py +223 -0
  386. warp/tests/test_lvalue.py +427 -0
  387. warp/tests/test_map.py +526 -0
  388. warp/tests/test_mat.py +3515 -0
  389. warp/tests/test_mat_assign_copy.py +178 -0
  390. warp/tests/test_mat_constructors.py +573 -0
  391. warp/tests/test_mat_lite.py +122 -0
  392. warp/tests/test_mat_scalar_ops.py +2913 -0
  393. warp/tests/test_math.py +212 -0
  394. warp/tests/test_module_aot.py +287 -0
  395. warp/tests/test_module_hashing.py +258 -0
  396. warp/tests/test_modules_lite.py +70 -0
  397. warp/tests/test_noise.py +252 -0
  398. warp/tests/test_operators.py +299 -0
  399. warp/tests/test_options.py +129 -0
  400. warp/tests/test_overwrite.py +551 -0
  401. warp/tests/test_print.py +408 -0
  402. warp/tests/test_quat.py +2653 -0
  403. warp/tests/test_quat_assign_copy.py +145 -0
  404. warp/tests/test_rand.py +339 -0
  405. warp/tests/test_reload.py +303 -0
  406. warp/tests/test_rounding.py +157 -0
  407. warp/tests/test_runlength_encode.py +196 -0
  408. warp/tests/test_scalar_ops.py +133 -0
  409. warp/tests/test_smoothstep.py +108 -0
  410. warp/tests/test_snippet.py +318 -0
  411. warp/tests/test_sparse.py +845 -0
  412. warp/tests/test_spatial.py +2859 -0
  413. warp/tests/test_spatial_assign_copy.py +160 -0
  414. warp/tests/test_special_values.py +361 -0
  415. warp/tests/test_static.py +640 -0
  416. warp/tests/test_struct.py +901 -0
  417. warp/tests/test_tape.py +242 -0
  418. warp/tests/test_transient_module.py +93 -0
  419. warp/tests/test_triangle_closest_point.py +192 -0
  420. warp/tests/test_tuple.py +361 -0
  421. warp/tests/test_types.py +615 -0
  422. warp/tests/test_utils.py +594 -0
  423. warp/tests/test_vec.py +1408 -0
  424. warp/tests/test_vec_assign_copy.py +143 -0
  425. warp/tests/test_vec_constructors.py +325 -0
  426. warp/tests/test_vec_lite.py +80 -0
  427. warp/tests/test_vec_scalar_ops.py +2327 -0
  428. warp/tests/test_verify_fp.py +100 -0
  429. warp/tests/test_version.py +75 -0
  430. warp/tests/tile/__init__.py +0 -0
  431. warp/tests/tile/test_tile.py +1519 -0
  432. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  433. warp/tests/tile/test_tile_cholesky.py +608 -0
  434. warp/tests/tile/test_tile_load.py +724 -0
  435. warp/tests/tile/test_tile_mathdx.py +156 -0
  436. warp/tests/tile/test_tile_matmul.py +179 -0
  437. warp/tests/tile/test_tile_mlp.py +400 -0
  438. warp/tests/tile/test_tile_reduce.py +950 -0
  439. warp/tests/tile/test_tile_shared_memory.py +376 -0
  440. warp/tests/tile/test_tile_sort.py +121 -0
  441. warp/tests/tile/test_tile_view.py +173 -0
  442. warp/tests/unittest_serial.py +47 -0
  443. warp/tests/unittest_suites.py +430 -0
  444. warp/tests/unittest_utils.py +469 -0
  445. warp/tests/walkthrough_debug.py +95 -0
  446. warp/torch.py +24 -0
  447. warp/types.py +51 -0
  448. warp/utils.py +31 -0
  449. warp_lang-1.10.0.dist-info/METADATA +459 -0
  450. warp_lang-1.10.0.dist-info/RECORD +468 -0
  451. warp_lang-1.10.0.dist-info/WHEEL +5 -0
  452. warp_lang-1.10.0.dist-info/licenses/LICENSE.md +176 -0
  453. warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  454. warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  455. warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  456. warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  457. warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  458. warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  459. warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  460. warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  461. warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  462. warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  463. warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  464. warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  465. warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  466. warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  467. warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  468. warp_lang-1.10.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,258 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ # TODO: add more tests for kernels and generics
17
+
18
+ import os
19
+ import tempfile
20
+ import unittest
21
+ from importlib import util
22
+
23
+ import warp as wp
24
+ from warp.tests.unittest_utils import *
25
+
26
+ FUNC_OVERLOAD_1 = """# -*- coding: utf-8 -*-
27
+ import warp as wp
28
+
29
+ @wp.func
30
+ def fn():
31
+ wp.print(17)
32
+
33
+ @wp.func
34
+ def fn(value: int):
35
+ wp.print(value)
36
+
37
+ @wp.kernel
38
+ def k():
39
+ print(fn())
40
+ print(fn(99))
41
+ """
42
+
43
+ # should be same hash as FUNC_OVERLOAD_1
44
+ FUNC_OVERLOAD_2 = """# -*- coding: utf-8 -*-
45
+ import warp as wp
46
+
47
+ @wp.func
48
+ def fn():
49
+ wp.print(17)
50
+
51
+ @wp.func
52
+ def fn(value: int):
53
+ wp.print(value)
54
+
55
+ @wp.kernel
56
+ def k():
57
+ print(fn())
58
+ print(fn(99))
59
+ """
60
+
61
+ # should be different hash than FUNC_OVERLOAD_1 (first overload is different)
62
+ FUNC_OVERLOAD_3 = """# -*- coding: utf-8 -*-
63
+ import warp as wp
64
+
65
+ @wp.func
66
+ def fn():
67
+ wp.print(42)
68
+
69
+ @wp.func
70
+ def fn(value: int):
71
+ wp.print(value)
72
+
73
+ @wp.kernel
74
+ def k():
75
+ print(fn())
76
+ print(fn(99))
77
+ """
78
+
79
+ # should be different hash than FUNC_OVERLOAD_1 (second overload is different)
80
+ FUNC_OVERLOAD_4 = """# -*- coding: utf-8 -*-
81
+ import warp as wp
82
+
83
+ @wp.func
84
+ def fn():
85
+ wp.print(17)
86
+
87
+ @wp.func
88
+ def fn(value: int):
89
+ wp.print(value + 1)
90
+
91
+ @wp.kernel
92
+ def k():
93
+ print(fn())
94
+ print(fn(99))
95
+ """
96
+
97
+ FUNC_GENERIC_1 = """# -*- coding: utf-8 -*-
98
+ import warp as wp
99
+
100
+ from typing import Any
101
+
102
+ @wp.func
103
+ def generic_fn(x: Any):
104
+ return x * x
105
+
106
+ @wp.func
107
+ def generic_fn(x: Any, y: Any):
108
+ return x * y
109
+
110
+ @wp.kernel
111
+ def k():
112
+ print(generic_fn(17))
113
+ print(generic_fn(17, 42))
114
+ """
115
+
116
+ # should be same hash as FUNC_GENERIC_1
117
+ FUNC_GENERIC_2 = """# -*- coding: utf-8 -*-
118
+ import warp as wp
119
+
120
+ from typing import Any
121
+
122
+ @wp.func
123
+ def generic_fn(x: Any):
124
+ return x * x
125
+
126
+ @wp.func
127
+ def generic_fn(x: Any, y: Any):
128
+ return x * y
129
+
130
+ @wp.kernel
131
+ def k():
132
+ print(generic_fn(17))
133
+ print(generic_fn(17, 42))
134
+ """
135
+
136
+ # should be different hash than FUNC_GENERIC_1 (first overload is different)
137
+ FUNC_GENERIC_3 = """# -*- coding: utf-8 -*-
138
+ import warp as wp
139
+
140
+ from typing import Any
141
+
142
+ @wp.func
143
+ def generic_fn(x: Any):
144
+ return x + x
145
+
146
+ @wp.func
147
+ def generic_fn(x: Any, y: Any):
148
+ return x * y
149
+
150
+ @wp.kernel
151
+ def k():
152
+ print(generic_fn(17))
153
+ print(generic_fn(17, 42))
154
+ """
155
+
156
+ # should be different hash than FUNC_GENERIC_1 (second overload is different)
157
+ FUNC_GENERIC_4 = """# -*- coding: utf-8 -*-
158
+ import warp as wp
159
+
160
+ from typing import Any
161
+
162
+ @wp.func
163
+ def generic_fn(x: Any):
164
+ return x * x
165
+
166
+ @wp.func
167
+ def generic_fn(x: Any, y: Any):
168
+ return x + y
169
+
170
+ @wp.kernel
171
+ def k():
172
+ print(generic_fn(17))
173
+ print(generic_fn(17, 42))
174
+ """
175
+
176
+
177
+ def load_code_as_module(code, name):
178
+ file, file_path = tempfile.mkstemp(suffix=".py")
179
+
180
+ try:
181
+ with os.fdopen(file, "w") as f:
182
+ f.write(code)
183
+
184
+ spec = util.spec_from_file_location(name, file_path)
185
+ module = util.module_from_spec(spec)
186
+ spec.loader.exec_module(module)
187
+ finally:
188
+ os.remove(file_path)
189
+
190
+ return wp.get_module(module.__name__)
191
+
192
+
193
+ def test_function_overload_hashing(test, device):
194
+ m1 = load_code_as_module(FUNC_OVERLOAD_1, "func_overload_1")
195
+ m2 = load_code_as_module(FUNC_OVERLOAD_2, "func_overload_2")
196
+ m3 = load_code_as_module(FUNC_OVERLOAD_3, "func_overload_3")
197
+ m4 = load_code_as_module(FUNC_OVERLOAD_4, "func_overload_4")
198
+
199
+ hash1 = m1.hash_module()
200
+ hash2 = m2.hash_module()
201
+ hash3 = m3.hash_module()
202
+ hash4 = m4.hash_module()
203
+
204
+ test.assertEqual(hash2, hash1)
205
+ test.assertNotEqual(hash3, hash1)
206
+ test.assertNotEqual(hash4, hash1)
207
+
208
+
209
+ def test_function_generic_overload_hashing(test, device):
210
+ m1 = load_code_as_module(FUNC_GENERIC_1, "func_generic_1")
211
+ m2 = load_code_as_module(FUNC_GENERIC_2, "func_generic_2")
212
+ m3 = load_code_as_module(FUNC_GENERIC_3, "func_generic_3")
213
+ m4 = load_code_as_module(FUNC_GENERIC_4, "func_generic_4")
214
+
215
+ hash1 = m1.hash_module()
216
+ hash2 = m2.hash_module()
217
+ hash3 = m3.hash_module()
218
+ hash4 = m4.hash_module()
219
+
220
+ test.assertEqual(hash2, hash1)
221
+ test.assertNotEqual(hash3, hash1)
222
+ test.assertNotEqual(hash4, hash1)
223
+
224
+
225
+ SIMPLE_MODULE = """# -*- coding: utf-8 -*-
226
+ import warp as wp
227
+
228
+ @wp.kernel
229
+ def k():
230
+ pass
231
+ """
232
+
233
+
234
+ def test_module_load(test, device):
235
+ """Ensure that loading a module does not change its hash"""
236
+ m = load_code_as_module(SIMPLE_MODULE, "simple_module")
237
+
238
+ hash1 = m.hash_module()
239
+ m.load(device)
240
+ hash2 = m.hash_module()
241
+
242
+ test.assertEqual(hash1, hash2)
243
+
244
+
245
+ class TestModuleHashing(unittest.TestCase):
246
+ pass
247
+
248
+
249
+ devices = get_test_devices()
250
+
251
+ add_function_test(TestModuleHashing, "test_function_overload_hashing", test_function_overload_hashing)
252
+ add_function_test(TestModuleHashing, "test_function_generic_overload_hashing", test_function_generic_overload_hashing)
253
+ add_function_test(TestModuleHashing, "test_module_load", test_module_load, devices=devices)
254
+
255
+
256
+ if __name__ == "__main__":
257
+ wp.clear_kernel_cache()
258
+ unittest.main(verbosity=2)
@@ -0,0 +1,70 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import unittest
17
+
18
+ import warp as wp
19
+ import warp.utils
20
+ from warp.tests.unittest_utils import *
21
+
22
+ devices = get_test_devices()
23
+
24
+
25
+ # This kernel is needed to ensure this test module is registered as a Warp module.
26
+ # wp.load_module() requires the module to contain at least one Warp kernel, function, or struct.
27
+ @wp.kernel
28
+ def print_values():
29
+ i = wp.tid()
30
+ wp.print(i)
31
+
32
+
33
+ class TestModuleLite(unittest.TestCase):
34
+ def test_module_lite_load(self):
35
+ # Load current module
36
+ wp.load_module()
37
+
38
+ # Load named module
39
+ wp.load_module(warp.utils)
40
+
41
+ # Load named module (string)
42
+ wp.load_module("warp.utils", recursive=True)
43
+
44
+ def test_module_lite_options(self):
45
+ wp.set_module_options({"max_unroll": 8})
46
+ module_options = wp.get_module_options()
47
+ self.assertIsInstance(module_options, dict)
48
+ self.assertEqual(module_options["max_unroll"], 8)
49
+
50
+ def test_module_lite_load_nonexistent(self):
51
+ # Test that loading a non-existent module raises RuntimeError
52
+ with self.assertRaises(RuntimeError) as context:
53
+ wp.load_module("nonexistent_module_that_does_not_exist")
54
+
55
+ self.assertIn("does not contain any Warp kernels, functions, or structs", str(context.exception))
56
+ self.assertIn("nonexistent_module_that_does_not_exist", str(context.exception))
57
+
58
+ def test_module_lite_load_no_warp_content(self):
59
+ # Test that loading a module without Warp content raises RuntimeError
60
+ # Use a standard library module that definitely has no Warp kernels
61
+ with self.assertRaises(RuntimeError) as context:
62
+ wp.load_module(unittest)
63
+
64
+ self.assertIn("does not contain any Warp kernels, functions, or structs", str(context.exception))
65
+ self.assertIn("unittest", str(context.exception))
66
+
67
+
68
+ if __name__ == "__main__":
69
+ wp.clear_kernel_cache()
70
+ unittest.main(verbosity=2)
@@ -0,0 +1,252 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import unittest
17
+
18
+ import numpy as np
19
+
20
+ import warp as wp
21
+ from warp.tests.unittest_utils import *
22
+
23
+
24
+ @wp.kernel
25
+ def pnoise(
26
+ kernel_seed: int, W: int, px: int, py: int, noise_values: wp.array(dtype=float), pixel_values: wp.array(dtype=float)
27
+ ):
28
+ tid = wp.tid()
29
+
30
+ state = wp.rand_init(kernel_seed)
31
+
32
+ x = (float(tid % W) + 0.5) * 0.2
33
+ y = (float(tid / W) + 0.5) * 0.2
34
+ p = wp.vec2(x, y)
35
+
36
+ n = wp.pnoise(state, p, px, py)
37
+ noise_values[tid] = n
38
+
39
+ g = ((n + 1.0) / 2.0) * 255.0
40
+ pixel_values[tid] = g
41
+
42
+
43
+ @wp.kernel
44
+ def curlnoise(kernel_seed: int, W: int, noise_coords: wp.array(dtype=wp.vec2), noise_vectors: wp.array(dtype=wp.vec2)):
45
+ tid = wp.tid()
46
+
47
+ state = wp.rand_init(kernel_seed)
48
+
49
+ x = (float(tid % W) + 0.5) * 0.2
50
+ y = (float(tid / W) + 0.5) * 0.2
51
+
52
+ p = wp.vec2(x, y)
53
+ v = wp.curlnoise(state, p)
54
+
55
+ noise_coords[tid] = p
56
+ noise_vectors[tid] = v
57
+
58
+
59
+ def test_pnoise(test, device):
60
+ # image dim
61
+ W = 256
62
+ H = 256
63
+ N = W * H
64
+ seed = 42
65
+
66
+ # periodic perlin noise test
67
+ px = 16
68
+ py = 16
69
+
70
+ noise_values = wp.zeros(N, dtype=float, device=device)
71
+ pixel_values = wp.zeros(N, dtype=float, device=device)
72
+
73
+ wp.launch(kernel=pnoise, dim=N, inputs=[seed, W, px, py, noise_values, pixel_values], outputs=[], device=device)
74
+
75
+ # Perlin theoretical range is [-0.5*sqrt(n), 0.5*sqrt(n)] for n dimensions
76
+ n = noise_values.numpy()
77
+ # max = np.max(n)
78
+ # min = np.min(n)
79
+
80
+ img = pixel_values.numpy()
81
+ img = np.reshape(img, (W, H))
82
+
83
+ ### Figure viewing ###
84
+ # img = img.astype(np.uint8)
85
+ # imgplot = plt.imshow(img, 'gray')
86
+ # plt.savefig("pnoise_test.png")
87
+
88
+ ### Generating pnoise_test_result_true.npy ###
89
+ # np.save(os.path.join(os.path.dirname(__file__), "assets/pnoise_golden.npy"), img)
90
+
91
+ ### Golden image comparison ###
92
+ img_true = np.load(os.path.join(os.path.dirname(__file__), "assets/pnoise_golden.npy"))
93
+ test.assertTrue(img.shape == img_true.shape)
94
+ err = np.max(np.abs(img - img_true))
95
+ tolerance = 1.5e-3
96
+ test.assertTrue(err < tolerance, f"err is {err} which is >= {tolerance}")
97
+
98
+
99
+ def test_curlnoise(test, device):
100
+ # image dim
101
+ W = 128
102
+ H = 128
103
+ N = W * H
104
+ seed = 42
105
+
106
+ # curl noise test
107
+ quiver_coords_host = wp.zeros(N, dtype=wp.vec2, device="cpu")
108
+ quiver_coords = wp.zeros(N, dtype=wp.vec2, device=device)
109
+
110
+ quiver_arrows_host = wp.zeros(N, dtype=wp.vec2, device="cpu")
111
+ quiver_arrows = wp.zeros(N, dtype=wp.vec2, device=device)
112
+
113
+ wp.launch(kernel=curlnoise, dim=N, inputs=[seed, W, quiver_coords, quiver_arrows], outputs=[], device=device)
114
+
115
+ wp.copy(quiver_coords_host, quiver_coords)
116
+ wp.copy(quiver_arrows_host, quiver_arrows)
117
+
118
+ wp.synchronize()
119
+
120
+ xy_coords = quiver_coords_host.numpy()
121
+ uv_coords = quiver_arrows_host.numpy()
122
+
123
+ # normalize
124
+ norms = uv_coords[:, 0] * uv_coords[:, 0] + uv_coords[:, 1] * uv_coords[:, 1]
125
+ uv_coords = uv_coords / np.sqrt(np.max(norms))
126
+
127
+ X = xy_coords[:, 0]
128
+ Y = xy_coords[:, 1]
129
+ U = uv_coords[:, 0]
130
+ V = uv_coords[:, 1]
131
+
132
+ ### Figure viewing ###
133
+ # fig, ax = plt.subplots(figsize=(25,25))
134
+ # ax.quiver(X, Y, U, V)
135
+ # ax.axis([0.0, 25.0, 0.0, 25.0])
136
+ # ax.set_aspect('equal')
137
+ # plt.savefig("curlnoise_test.png")
138
+
139
+ ### Generating curlnoise_test_result_true.npy ###
140
+ result = np.stack((xy_coords, uv_coords))
141
+ # np.save(os.path.join(os.path.dirname(__file__), "assets/curlnoise_golden.npy"), result)
142
+
143
+ ### Golden image comparison ###
144
+ result_true = np.load(os.path.join(os.path.dirname(__file__), "assets/curlnoise_golden.npy"))
145
+ test.assertTrue(result.shape, result_true.shape)
146
+ err = np.max(np.abs(result - result_true))
147
+ test.assertTrue(err < 1e-04)
148
+
149
+
150
+ @wp.kernel
151
+ def noise_loss_kernel(
152
+ kernel_seed: int,
153
+ query_positions: wp.array(dtype=wp.vec2),
154
+ noise_values: wp.array(dtype=float),
155
+ noise_loss: wp.array(dtype=float),
156
+ ):
157
+ tid = wp.tid()
158
+ state = wp.rand_init(kernel_seed)
159
+
160
+ p = query_positions[tid]
161
+
162
+ n = wp.noise(state, p)
163
+ noise_values[tid] = n
164
+
165
+ wp.atomic_add(noise_loss, 0, n)
166
+
167
+
168
+ @wp.kernel
169
+ def noise_cd(kernel_seed: int, query_positions: wp.array(dtype=wp.vec2), gradients: wp.array(dtype=wp.vec2)):
170
+ tid = wp.tid()
171
+ state = wp.rand_init(kernel_seed)
172
+ p = query_positions[tid]
173
+
174
+ eps = 1.0e-3
175
+
176
+ pl = wp.vec2(p[0] - eps, p[1])
177
+ pr = wp.vec2(p[0] + eps, p[1])
178
+ pd = wp.vec2(p[0], p[1] - eps)
179
+ pu = wp.vec2(p[0], p[1] + eps)
180
+
181
+ nl = wp.noise(state, pl)
182
+ nr = wp.noise(state, pr)
183
+ nd = wp.noise(state, pd)
184
+ nu = wp.noise(state, pu)
185
+
186
+ gx = (nr - nl) / (2.0 * eps)
187
+ gy = (nu - nd) / (2.0 * eps)
188
+
189
+ gradients[tid] = wp.vec2(gx, gy)
190
+
191
+
192
+ def test_adj_noise(test, device):
193
+ # grid dim
194
+ N = 9
195
+ seed = 42
196
+
197
+ tape = wp.Tape()
198
+
199
+ positions = np.array(
200
+ [
201
+ [-0.1, -0.1],
202
+ [0.0, -0.1],
203
+ [0.1, -0.1],
204
+ [-0.1, 0.0],
205
+ [0.0, 0.0],
206
+ [0.1, 0.0],
207
+ [-0.1, 0.1],
208
+ [0.0, 0.1],
209
+ [0.1, 0.1],
210
+ ]
211
+ )
212
+
213
+ with tape:
214
+ query_positions = wp.array(positions, dtype=wp.vec2, device=device, requires_grad=True)
215
+ noise_values = wp.zeros(N, dtype=float, device=device)
216
+ noise_loss = wp.zeros(n=1, dtype=float, device=device, requires_grad=True)
217
+
218
+ wp.launch(
219
+ kernel=noise_loss_kernel, dim=N, inputs=[seed, query_positions, noise_values, noise_loss], device=device
220
+ )
221
+
222
+ # analytic
223
+ tape.backward(loss=noise_loss)
224
+ analytic = tape.gradients[query_positions].numpy().reshape((3, 3, 2))
225
+
226
+ # central difference
227
+ gradients = wp.zeros(N, dtype=wp.vec2, device=device)
228
+ wp.launch(kernel=noise_cd, dim=N, inputs=[seed, query_positions, gradients], device=device)
229
+
230
+ gradients_host = gradients.numpy().reshape((3, 3, 2))
231
+ diff = analytic - gradients_host
232
+ result = np.sum(diff * diff, axis=2)
233
+
234
+ err = np.where(result > 1.0e-3, result, 0).sum()
235
+ test.assertTrue(err < 1.0e-8)
236
+
237
+
238
+ devices = get_test_devices()
239
+
240
+
241
+ class TestNoise(unittest.TestCase):
242
+ pass
243
+
244
+
245
+ add_function_test(TestNoise, "test_pnoise", test_pnoise, devices=devices)
246
+ add_function_test(TestNoise, "test_curlnoise", test_curlnoise, devices=devices)
247
+ add_function_test(TestNoise, "test_adj_noise", test_adj_noise, devices=devices)
248
+
249
+
250
+ if __name__ == "__main__":
251
+ wp.clear_kernel_cache()
252
+ unittest.main(verbosity=2)