warp-lang 1.7.0__py3-none-manylinux_2_28_x86_64.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 (429) hide show
  1. warp/__init__.py +139 -0
  2. warp/__init__.pyi +1 -0
  3. warp/autograd.py +1142 -0
  4. warp/bin/warp-clang.so +0 -0
  5. warp/bin/warp.so +0 -0
  6. warp/build.py +557 -0
  7. warp/build_dll.py +405 -0
  8. warp/builtins.py +6855 -0
  9. warp/codegen.py +3969 -0
  10. warp/config.py +158 -0
  11. warp/constants.py +57 -0
  12. warp/context.py +6812 -0
  13. warp/dlpack.py +462 -0
  14. warp/examples/__init__.py +24 -0
  15. warp/examples/assets/bear.usd +0 -0
  16. warp/examples/assets/bunny.usd +0 -0
  17. warp/examples/assets/cartpole.urdf +110 -0
  18. warp/examples/assets/crazyflie.usd +0 -0
  19. warp/examples/assets/cube.usd +0 -0
  20. warp/examples/assets/nonuniform.usd +0 -0
  21. warp/examples/assets/nv_ant.xml +92 -0
  22. warp/examples/assets/nv_humanoid.xml +183 -0
  23. warp/examples/assets/nvidia_logo.png +0 -0
  24. warp/examples/assets/pixel.jpg +0 -0
  25. warp/examples/assets/quadruped.urdf +268 -0
  26. warp/examples/assets/rocks.nvdb +0 -0
  27. warp/examples/assets/rocks.usd +0 -0
  28. warp/examples/assets/sphere.usd +0 -0
  29. warp/examples/assets/square_cloth.usd +0 -0
  30. warp/examples/benchmarks/benchmark_api.py +389 -0
  31. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  32. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  33. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  34. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  35. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  36. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  37. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  38. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  39. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  40. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  41. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  42. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  43. warp/examples/benchmarks/benchmark_launches.py +301 -0
  44. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  45. warp/examples/browse.py +37 -0
  46. warp/examples/core/example_cupy.py +86 -0
  47. warp/examples/core/example_dem.py +241 -0
  48. warp/examples/core/example_fluid.py +299 -0
  49. warp/examples/core/example_graph_capture.py +150 -0
  50. warp/examples/core/example_marching_cubes.py +194 -0
  51. warp/examples/core/example_mesh.py +180 -0
  52. warp/examples/core/example_mesh_intersect.py +211 -0
  53. warp/examples/core/example_nvdb.py +182 -0
  54. warp/examples/core/example_raycast.py +111 -0
  55. warp/examples/core/example_raymarch.py +205 -0
  56. warp/examples/core/example_render_opengl.py +193 -0
  57. warp/examples/core/example_sample_mesh.py +300 -0
  58. warp/examples/core/example_sph.py +411 -0
  59. warp/examples/core/example_torch.py +211 -0
  60. warp/examples/core/example_wave.py +269 -0
  61. warp/examples/fem/example_adaptive_grid.py +286 -0
  62. warp/examples/fem/example_apic_fluid.py +423 -0
  63. warp/examples/fem/example_burgers.py +261 -0
  64. warp/examples/fem/example_convection_diffusion.py +178 -0
  65. warp/examples/fem/example_convection_diffusion_dg.py +204 -0
  66. warp/examples/fem/example_deformed_geometry.py +172 -0
  67. warp/examples/fem/example_diffusion.py +196 -0
  68. warp/examples/fem/example_diffusion_3d.py +225 -0
  69. warp/examples/fem/example_diffusion_mgpu.py +220 -0
  70. warp/examples/fem/example_distortion_energy.py +228 -0
  71. warp/examples/fem/example_magnetostatics.py +240 -0
  72. warp/examples/fem/example_mixed_elasticity.py +291 -0
  73. warp/examples/fem/example_navier_stokes.py +261 -0
  74. warp/examples/fem/example_nonconforming_contact.py +298 -0
  75. warp/examples/fem/example_stokes.py +213 -0
  76. warp/examples/fem/example_stokes_transfer.py +262 -0
  77. warp/examples/fem/example_streamlines.py +352 -0
  78. warp/examples/fem/utils.py +1000 -0
  79. warp/examples/interop/example_jax_callable.py +116 -0
  80. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  81. warp/examples/interop/example_jax_kernel.py +205 -0
  82. warp/examples/optim/example_bounce.py +266 -0
  83. warp/examples/optim/example_cloth_throw.py +228 -0
  84. warp/examples/optim/example_diffray.py +561 -0
  85. warp/examples/optim/example_drone.py +870 -0
  86. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  87. warp/examples/optim/example_inverse_kinematics.py +182 -0
  88. warp/examples/optim/example_inverse_kinematics_torch.py +191 -0
  89. warp/examples/optim/example_softbody_properties.py +400 -0
  90. warp/examples/optim/example_spring_cage.py +245 -0
  91. warp/examples/optim/example_trajectory.py +227 -0
  92. warp/examples/sim/example_cartpole.py +143 -0
  93. warp/examples/sim/example_cloth.py +225 -0
  94. warp/examples/sim/example_cloth_self_contact.py +322 -0
  95. warp/examples/sim/example_granular.py +130 -0
  96. warp/examples/sim/example_granular_collision_sdf.py +202 -0
  97. warp/examples/sim/example_jacobian_ik.py +244 -0
  98. warp/examples/sim/example_particle_chain.py +124 -0
  99. warp/examples/sim/example_quadruped.py +203 -0
  100. warp/examples/sim/example_rigid_chain.py +203 -0
  101. warp/examples/sim/example_rigid_contact.py +195 -0
  102. warp/examples/sim/example_rigid_force.py +133 -0
  103. warp/examples/sim/example_rigid_gyroscopic.py +115 -0
  104. warp/examples/sim/example_rigid_soft_contact.py +140 -0
  105. warp/examples/sim/example_soft_body.py +196 -0
  106. warp/examples/tile/example_tile_cholesky.py +87 -0
  107. warp/examples/tile/example_tile_convolution.py +66 -0
  108. warp/examples/tile/example_tile_fft.py +55 -0
  109. warp/examples/tile/example_tile_filtering.py +113 -0
  110. warp/examples/tile/example_tile_matmul.py +85 -0
  111. warp/examples/tile/example_tile_mlp.py +383 -0
  112. warp/examples/tile/example_tile_nbody.py +199 -0
  113. warp/examples/tile/example_tile_walker.py +327 -0
  114. warp/fabric.py +355 -0
  115. warp/fem/__init__.py +106 -0
  116. warp/fem/adaptivity.py +508 -0
  117. warp/fem/cache.py +572 -0
  118. warp/fem/dirichlet.py +202 -0
  119. warp/fem/domain.py +411 -0
  120. warp/fem/field/__init__.py +125 -0
  121. warp/fem/field/field.py +619 -0
  122. warp/fem/field/nodal_field.py +326 -0
  123. warp/fem/field/restriction.py +37 -0
  124. warp/fem/field/virtual.py +848 -0
  125. warp/fem/geometry/__init__.py +32 -0
  126. warp/fem/geometry/adaptive_nanogrid.py +857 -0
  127. warp/fem/geometry/closest_point.py +84 -0
  128. warp/fem/geometry/deformed_geometry.py +221 -0
  129. warp/fem/geometry/element.py +776 -0
  130. warp/fem/geometry/geometry.py +362 -0
  131. warp/fem/geometry/grid_2d.py +392 -0
  132. warp/fem/geometry/grid_3d.py +452 -0
  133. warp/fem/geometry/hexmesh.py +911 -0
  134. warp/fem/geometry/nanogrid.py +571 -0
  135. warp/fem/geometry/partition.py +389 -0
  136. warp/fem/geometry/quadmesh.py +663 -0
  137. warp/fem/geometry/tetmesh.py +855 -0
  138. warp/fem/geometry/trimesh.py +806 -0
  139. warp/fem/integrate.py +2335 -0
  140. warp/fem/linalg.py +419 -0
  141. warp/fem/operator.py +293 -0
  142. warp/fem/polynomial.py +229 -0
  143. warp/fem/quadrature/__init__.py +17 -0
  144. warp/fem/quadrature/pic_quadrature.py +299 -0
  145. warp/fem/quadrature/quadrature.py +591 -0
  146. warp/fem/space/__init__.py +228 -0
  147. warp/fem/space/basis_function_space.py +468 -0
  148. warp/fem/space/basis_space.py +667 -0
  149. warp/fem/space/dof_mapper.py +251 -0
  150. warp/fem/space/function_space.py +309 -0
  151. warp/fem/space/grid_2d_function_space.py +177 -0
  152. warp/fem/space/grid_3d_function_space.py +227 -0
  153. warp/fem/space/hexmesh_function_space.py +257 -0
  154. warp/fem/space/nanogrid_function_space.py +201 -0
  155. warp/fem/space/partition.py +367 -0
  156. warp/fem/space/quadmesh_function_space.py +223 -0
  157. warp/fem/space/restriction.py +179 -0
  158. warp/fem/space/shape/__init__.py +143 -0
  159. warp/fem/space/shape/cube_shape_function.py +1105 -0
  160. warp/fem/space/shape/shape_function.py +133 -0
  161. warp/fem/space/shape/square_shape_function.py +926 -0
  162. warp/fem/space/shape/tet_shape_function.py +834 -0
  163. warp/fem/space/shape/triangle_shape_function.py +672 -0
  164. warp/fem/space/tetmesh_function_space.py +271 -0
  165. warp/fem/space/topology.py +424 -0
  166. warp/fem/space/trimesh_function_space.py +194 -0
  167. warp/fem/types.py +99 -0
  168. warp/fem/utils.py +420 -0
  169. warp/jax.py +187 -0
  170. warp/jax_experimental/__init__.py +16 -0
  171. warp/jax_experimental/custom_call.py +351 -0
  172. warp/jax_experimental/ffi.py +698 -0
  173. warp/jax_experimental/xla_ffi.py +602 -0
  174. warp/math.py +244 -0
  175. warp/native/array.h +1145 -0
  176. warp/native/builtin.h +1800 -0
  177. warp/native/bvh.cpp +492 -0
  178. warp/native/bvh.cu +791 -0
  179. warp/native/bvh.h +554 -0
  180. warp/native/clang/clang.cpp +536 -0
  181. warp/native/coloring.cpp +613 -0
  182. warp/native/crt.cpp +51 -0
  183. warp/native/crt.h +362 -0
  184. warp/native/cuda_crt.h +1058 -0
  185. warp/native/cuda_util.cpp +646 -0
  186. warp/native/cuda_util.h +307 -0
  187. warp/native/error.cpp +77 -0
  188. warp/native/error.h +36 -0
  189. warp/native/exports.h +1878 -0
  190. warp/native/fabric.h +245 -0
  191. warp/native/hashgrid.cpp +311 -0
  192. warp/native/hashgrid.cu +87 -0
  193. warp/native/hashgrid.h +240 -0
  194. warp/native/initializer_array.h +41 -0
  195. warp/native/intersect.h +1230 -0
  196. warp/native/intersect_adj.h +375 -0
  197. warp/native/intersect_tri.h +339 -0
  198. warp/native/marching.cpp +19 -0
  199. warp/native/marching.cu +514 -0
  200. warp/native/marching.h +19 -0
  201. warp/native/mat.h +2220 -0
  202. warp/native/mathdx.cpp +87 -0
  203. warp/native/matnn.h +343 -0
  204. warp/native/mesh.cpp +266 -0
  205. warp/native/mesh.cu +404 -0
  206. warp/native/mesh.h +1980 -0
  207. warp/native/nanovdb/GridHandle.h +366 -0
  208. warp/native/nanovdb/HostBuffer.h +590 -0
  209. warp/native/nanovdb/NanoVDB.h +6624 -0
  210. warp/native/nanovdb/PNanoVDB.h +3390 -0
  211. warp/native/noise.h +859 -0
  212. warp/native/quat.h +1371 -0
  213. warp/native/rand.h +342 -0
  214. warp/native/range.h +139 -0
  215. warp/native/reduce.cpp +174 -0
  216. warp/native/reduce.cu +364 -0
  217. warp/native/runlength_encode.cpp +79 -0
  218. warp/native/runlength_encode.cu +61 -0
  219. warp/native/scan.cpp +47 -0
  220. warp/native/scan.cu +53 -0
  221. warp/native/scan.h +23 -0
  222. warp/native/solid_angle.h +466 -0
  223. warp/native/sort.cpp +251 -0
  224. warp/native/sort.cu +277 -0
  225. warp/native/sort.h +33 -0
  226. warp/native/sparse.cpp +378 -0
  227. warp/native/sparse.cu +524 -0
  228. warp/native/spatial.h +657 -0
  229. warp/native/svd.h +702 -0
  230. warp/native/temp_buffer.h +46 -0
  231. warp/native/tile.h +2584 -0
  232. warp/native/tile_reduce.h +264 -0
  233. warp/native/vec.h +1426 -0
  234. warp/native/volume.cpp +501 -0
  235. warp/native/volume.cu +67 -0
  236. warp/native/volume.h +969 -0
  237. warp/native/volume_builder.cu +477 -0
  238. warp/native/volume_builder.h +52 -0
  239. warp/native/volume_impl.h +70 -0
  240. warp/native/warp.cpp +1082 -0
  241. warp/native/warp.cu +3636 -0
  242. warp/native/warp.h +381 -0
  243. warp/optim/__init__.py +17 -0
  244. warp/optim/adam.py +163 -0
  245. warp/optim/linear.py +1137 -0
  246. warp/optim/sgd.py +112 -0
  247. warp/paddle.py +407 -0
  248. warp/render/__init__.py +18 -0
  249. warp/render/render_opengl.py +3518 -0
  250. warp/render/render_usd.py +784 -0
  251. warp/render/utils.py +160 -0
  252. warp/sim/__init__.py +65 -0
  253. warp/sim/articulation.py +793 -0
  254. warp/sim/collide.py +2395 -0
  255. warp/sim/graph_coloring.py +300 -0
  256. warp/sim/import_mjcf.py +790 -0
  257. warp/sim/import_snu.py +227 -0
  258. warp/sim/import_urdf.py +579 -0
  259. warp/sim/import_usd.py +894 -0
  260. warp/sim/inertia.py +324 -0
  261. warp/sim/integrator.py +242 -0
  262. warp/sim/integrator_euler.py +1997 -0
  263. warp/sim/integrator_featherstone.py +2101 -0
  264. warp/sim/integrator_vbd.py +2048 -0
  265. warp/sim/integrator_xpbd.py +3292 -0
  266. warp/sim/model.py +4791 -0
  267. warp/sim/particles.py +121 -0
  268. warp/sim/render.py +427 -0
  269. warp/sim/utils.py +428 -0
  270. warp/sparse.py +2057 -0
  271. warp/stubs.py +3333 -0
  272. warp/tape.py +1203 -0
  273. warp/tests/__init__.py +1 -0
  274. warp/tests/__main__.py +4 -0
  275. warp/tests/assets/curlnoise_golden.npy +0 -0
  276. warp/tests/assets/mlp_golden.npy +0 -0
  277. warp/tests/assets/pixel.npy +0 -0
  278. warp/tests/assets/pnoise_golden.npy +0 -0
  279. warp/tests/assets/spiky.usd +0 -0
  280. warp/tests/assets/test_grid.nvdb +0 -0
  281. warp/tests/assets/test_index_grid.nvdb +0 -0
  282. warp/tests/assets/test_int32_grid.nvdb +0 -0
  283. warp/tests/assets/test_vec_grid.nvdb +0 -0
  284. warp/tests/assets/torus.nvdb +0 -0
  285. warp/tests/assets/torus.usda +105 -0
  286. warp/tests/aux_test_class_kernel.py +34 -0
  287. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  288. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  289. warp/tests/aux_test_dependent.py +29 -0
  290. warp/tests/aux_test_grad_customs.py +29 -0
  291. warp/tests/aux_test_instancing_gc.py +26 -0
  292. warp/tests/aux_test_module_unload.py +23 -0
  293. warp/tests/aux_test_name_clash1.py +40 -0
  294. warp/tests/aux_test_name_clash2.py +40 -0
  295. warp/tests/aux_test_reference.py +9 -0
  296. warp/tests/aux_test_reference_reference.py +8 -0
  297. warp/tests/aux_test_square.py +16 -0
  298. warp/tests/aux_test_unresolved_func.py +22 -0
  299. warp/tests/aux_test_unresolved_symbol.py +22 -0
  300. warp/tests/cuda/__init__.py +0 -0
  301. warp/tests/cuda/test_async.py +676 -0
  302. warp/tests/cuda/test_ipc.py +124 -0
  303. warp/tests/cuda/test_mempool.py +233 -0
  304. warp/tests/cuda/test_multigpu.py +169 -0
  305. warp/tests/cuda/test_peer.py +139 -0
  306. warp/tests/cuda/test_pinned.py +84 -0
  307. warp/tests/cuda/test_streams.py +634 -0
  308. warp/tests/geometry/__init__.py +0 -0
  309. warp/tests/geometry/test_bvh.py +200 -0
  310. warp/tests/geometry/test_hash_grid.py +221 -0
  311. warp/tests/geometry/test_marching_cubes.py +74 -0
  312. warp/tests/geometry/test_mesh.py +316 -0
  313. warp/tests/geometry/test_mesh_query_aabb.py +399 -0
  314. warp/tests/geometry/test_mesh_query_point.py +932 -0
  315. warp/tests/geometry/test_mesh_query_ray.py +311 -0
  316. warp/tests/geometry/test_volume.py +1103 -0
  317. warp/tests/geometry/test_volume_write.py +346 -0
  318. warp/tests/interop/__init__.py +0 -0
  319. warp/tests/interop/test_dlpack.py +729 -0
  320. warp/tests/interop/test_jax.py +371 -0
  321. warp/tests/interop/test_paddle.py +800 -0
  322. warp/tests/interop/test_torch.py +1001 -0
  323. warp/tests/run_coverage_serial.py +39 -0
  324. warp/tests/sim/__init__.py +0 -0
  325. warp/tests/sim/disabled_kinematics.py +244 -0
  326. warp/tests/sim/flaky_test_sim_grad.py +290 -0
  327. warp/tests/sim/test_collision.py +604 -0
  328. warp/tests/sim/test_coloring.py +258 -0
  329. warp/tests/sim/test_model.py +224 -0
  330. warp/tests/sim/test_sim_grad_bounce_linear.py +212 -0
  331. warp/tests/sim/test_sim_kinematics.py +98 -0
  332. warp/tests/sim/test_vbd.py +597 -0
  333. warp/tests/test_adam.py +163 -0
  334. warp/tests/test_arithmetic.py +1096 -0
  335. warp/tests/test_array.py +2972 -0
  336. warp/tests/test_array_reduce.py +156 -0
  337. warp/tests/test_assert.py +250 -0
  338. warp/tests/test_atomic.py +153 -0
  339. warp/tests/test_bool.py +220 -0
  340. warp/tests/test_builtins_resolution.py +1298 -0
  341. warp/tests/test_closest_point_edge_edge.py +327 -0
  342. warp/tests/test_codegen.py +810 -0
  343. warp/tests/test_codegen_instancing.py +1495 -0
  344. warp/tests/test_compile_consts.py +215 -0
  345. warp/tests/test_conditional.py +252 -0
  346. warp/tests/test_context.py +42 -0
  347. warp/tests/test_copy.py +238 -0
  348. warp/tests/test_ctypes.py +638 -0
  349. warp/tests/test_dense.py +73 -0
  350. warp/tests/test_devices.py +97 -0
  351. warp/tests/test_examples.py +482 -0
  352. warp/tests/test_fabricarray.py +996 -0
  353. warp/tests/test_fast_math.py +74 -0
  354. warp/tests/test_fem.py +2003 -0
  355. warp/tests/test_fp16.py +136 -0
  356. warp/tests/test_func.py +454 -0
  357. warp/tests/test_future_annotations.py +98 -0
  358. warp/tests/test_generics.py +656 -0
  359. warp/tests/test_grad.py +893 -0
  360. warp/tests/test_grad_customs.py +339 -0
  361. warp/tests/test_grad_debug.py +341 -0
  362. warp/tests/test_implicit_init.py +411 -0
  363. warp/tests/test_import.py +45 -0
  364. warp/tests/test_indexedarray.py +1140 -0
  365. warp/tests/test_intersect.py +73 -0
  366. warp/tests/test_iter.py +76 -0
  367. warp/tests/test_large.py +177 -0
  368. warp/tests/test_launch.py +411 -0
  369. warp/tests/test_lerp.py +151 -0
  370. warp/tests/test_linear_solvers.py +193 -0
  371. warp/tests/test_lvalue.py +427 -0
  372. warp/tests/test_mat.py +2089 -0
  373. warp/tests/test_mat_lite.py +122 -0
  374. warp/tests/test_mat_scalar_ops.py +2913 -0
  375. warp/tests/test_math.py +178 -0
  376. warp/tests/test_mlp.py +282 -0
  377. warp/tests/test_module_hashing.py +258 -0
  378. warp/tests/test_modules_lite.py +44 -0
  379. warp/tests/test_noise.py +252 -0
  380. warp/tests/test_operators.py +299 -0
  381. warp/tests/test_options.py +129 -0
  382. warp/tests/test_overwrite.py +551 -0
  383. warp/tests/test_print.py +339 -0
  384. warp/tests/test_quat.py +2315 -0
  385. warp/tests/test_rand.py +339 -0
  386. warp/tests/test_reload.py +302 -0
  387. warp/tests/test_rounding.py +185 -0
  388. warp/tests/test_runlength_encode.py +196 -0
  389. warp/tests/test_scalar_ops.py +105 -0
  390. warp/tests/test_smoothstep.py +108 -0
  391. warp/tests/test_snippet.py +318 -0
  392. warp/tests/test_sparse.py +582 -0
  393. warp/tests/test_spatial.py +2229 -0
  394. warp/tests/test_special_values.py +361 -0
  395. warp/tests/test_static.py +592 -0
  396. warp/tests/test_struct.py +734 -0
  397. warp/tests/test_tape.py +204 -0
  398. warp/tests/test_transient_module.py +93 -0
  399. warp/tests/test_triangle_closest_point.py +145 -0
  400. warp/tests/test_types.py +562 -0
  401. warp/tests/test_utils.py +588 -0
  402. warp/tests/test_vec.py +1487 -0
  403. warp/tests/test_vec_lite.py +80 -0
  404. warp/tests/test_vec_scalar_ops.py +2327 -0
  405. warp/tests/test_verify_fp.py +100 -0
  406. warp/tests/tile/__init__.py +0 -0
  407. warp/tests/tile/test_tile.py +780 -0
  408. warp/tests/tile/test_tile_load.py +407 -0
  409. warp/tests/tile/test_tile_mathdx.py +208 -0
  410. warp/tests/tile/test_tile_mlp.py +402 -0
  411. warp/tests/tile/test_tile_reduce.py +447 -0
  412. warp/tests/tile/test_tile_shared_memory.py +247 -0
  413. warp/tests/tile/test_tile_view.py +173 -0
  414. warp/tests/unittest_serial.py +47 -0
  415. warp/tests/unittest_suites.py +427 -0
  416. warp/tests/unittest_utils.py +468 -0
  417. warp/tests/walkthrough_debug.py +93 -0
  418. warp/thirdparty/__init__.py +0 -0
  419. warp/thirdparty/appdirs.py +598 -0
  420. warp/thirdparty/dlpack.py +145 -0
  421. warp/thirdparty/unittest_parallel.py +570 -0
  422. warp/torch.py +391 -0
  423. warp/types.py +5230 -0
  424. warp/utils.py +1137 -0
  425. warp_lang-1.7.0.dist-info/METADATA +516 -0
  426. warp_lang-1.7.0.dist-info/RECORD +429 -0
  427. warp_lang-1.7.0.dist-info/WHEEL +5 -0
  428. warp_lang-1.7.0.dist-info/licenses/LICENSE.md +202 -0
  429. warp_lang-1.7.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,734 @@
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
+ from typing import Any
18
+
19
+ import numpy as np
20
+
21
+ import warp as wp
22
+ from warp.fem import Sample as StructFromAnotherModule
23
+ from warp.tests.unittest_utils import *
24
+
25
+
26
+ @wp.struct
27
+ class Model:
28
+ dt: float
29
+ gravity: wp.vec3
30
+ m: wp.array(dtype=float)
31
+
32
+
33
+ @wp.struct
34
+ class State:
35
+ x: wp.array(dtype=wp.vec3)
36
+ v: wp.array(dtype=wp.vec3)
37
+
38
+
39
+ @wp.kernel
40
+ def kernel_step(state_in: State, state_out: State, model: Model):
41
+ i = wp.tid()
42
+
43
+ state_out.v[i] = state_in.v[i] + model.gravity / model.m[i] * model.dt
44
+ state_out.x[i] = state_in.x[i] + state_out.v[i] * model.dt
45
+
46
+
47
+ @wp.kernel
48
+ def kernel_step_with_copy(state_in: State, state_out: State, model: Model):
49
+ i = wp.tid()
50
+
51
+ model_rescaled = Model(1.0, model.gravity / model.m[i] * model.dt, model.m)
52
+
53
+ state_out_copy = State(state_out.x, state_out.v)
54
+ state_out_copy.v[i] = state_in.v[i] + model_rescaled.gravity
55
+ state_out_copy.x[i] = state_in.x[i] + state_out_copy.v[i] * model.dt
56
+
57
+
58
+ def test_step(test, device):
59
+ rng = np.random.default_rng(123)
60
+
61
+ dim = 5
62
+
63
+ dt = 0.01
64
+ gravity = np.array([0, 0, -9.81])
65
+
66
+ m = np.ones(dim)
67
+
68
+ m_model = wp.array(m, dtype=float, device=device)
69
+
70
+ model = Model()
71
+ model.m = m_model
72
+ model.dt = dt
73
+ model.gravity = wp.vec3(0, 0, -9.81)
74
+
75
+ x = rng.normal(size=(dim, 3))
76
+ v = rng.normal(size=(dim, 3))
77
+
78
+ x_expected = x + (v + gravity / m[:, None] * dt) * dt
79
+
80
+ x_in = wp.array(x, dtype=wp.vec3, device=device)
81
+ v_in = wp.array(v, dtype=wp.vec3, device=device)
82
+
83
+ state_in = State()
84
+ state_in.x = x_in
85
+ state_in.v = v_in
86
+
87
+ state_out = State()
88
+ state_out.x = wp.empty_like(x_in)
89
+ state_out.v = wp.empty_like(v_in)
90
+
91
+ for step_kernel in [kernel_step, kernel_step_with_copy]:
92
+ with CheckOutput(test):
93
+ wp.launch(step_kernel, dim=dim, inputs=[state_in, state_out, model], device=device)
94
+
95
+ assert_np_equal(state_out.x.numpy(), x_expected, tol=1e-6)
96
+
97
+
98
+ @wp.kernel
99
+ def kernel_loss(x: wp.array(dtype=wp.vec3), loss: wp.array(dtype=float)):
100
+ i = wp.tid()
101
+ wp.atomic_add(loss, 0, x[i][0] * x[i][0] + x[i][1] * x[i][1] + x[i][2] * x[i][2])
102
+
103
+
104
+ def test_step_grad(test, device):
105
+ rng = np.random.default_rng(123)
106
+
107
+ dim = 5
108
+
109
+ dt = 0.01
110
+ gravity = np.array([0, 0, -9.81])
111
+
112
+ m = rng.random(size=dim) + 0.1
113
+
114
+ m_model = wp.array(m, dtype=float, device=device, requires_grad=True)
115
+
116
+ model = Model()
117
+ model.m = m_model
118
+ model.dt = dt
119
+ model.gravity = wp.vec3(0, 0, -9.81)
120
+
121
+ x = rng.normal(size=(dim, 3))
122
+ v = rng.normal(size=(dim, 3))
123
+
124
+ x_in = wp.array(x, dtype=wp.vec3, device=device, requires_grad=True)
125
+ v_in = wp.array(v, dtype=wp.vec3, device=device, requires_grad=True)
126
+
127
+ state_in = State()
128
+ state_in.x = x_in
129
+ state_in.v = v_in
130
+
131
+ state_out = State()
132
+ state_out.x = wp.empty_like(x_in, requires_grad=True)
133
+ state_out.v = wp.empty_like(v_in, requires_grad=True)
134
+
135
+ loss = wp.empty(1, dtype=float, device=device, requires_grad=True)
136
+
137
+ for step_kernel in [kernel_step, kernel_step_with_copy]:
138
+ tape = wp.Tape()
139
+
140
+ with tape:
141
+ wp.launch(step_kernel, dim=dim, inputs=[state_in, state_out, model], device=device)
142
+ wp.launch(kernel_loss, dim=dim, inputs=[state_out.x, loss], device=device)
143
+
144
+ tape.backward(loss)
145
+
146
+ dl_dx = 2 * state_out.x.numpy()
147
+ dl_dv = dl_dx * dt
148
+
149
+ dv_dm = -gravity * dt / m[:, None] ** 2
150
+ dl_dm = (dl_dv * dv_dm).sum(-1)
151
+
152
+ assert_np_equal(state_out.x.grad.numpy(), dl_dx, tol=1e-6)
153
+ assert_np_equal(state_in.x.grad.numpy(), dl_dx, tol=1e-6)
154
+ assert_np_equal(state_out.v.grad.numpy(), dl_dv, tol=1e-6)
155
+ assert_np_equal(state_in.v.grad.numpy(), dl_dv, tol=1e-6)
156
+ assert_np_equal(model.m.grad.numpy(), dl_dm, tol=1e-6)
157
+
158
+ tape.zero()
159
+
160
+ assert state_out.x.grad.numpy().sum() == 0.0
161
+ assert state_in.x.grad.numpy().sum() == 0.0
162
+ assert state_out.v.grad.numpy().sum() == 0.0
163
+ assert state_in.v.grad.numpy().sum() == 0.0
164
+ assert model.m.grad.numpy().sum() == 0.0
165
+
166
+
167
+ @wp.struct
168
+ class Empty:
169
+ pass
170
+
171
+
172
+ @wp.kernel
173
+ def test_empty(input: Empty):
174
+ tid = wp.tid()
175
+
176
+
177
+ @wp.struct
178
+ class Uninitialized:
179
+ data: wp.array(dtype=int)
180
+
181
+
182
+ @wp.kernel
183
+ def test_uninitialized(input: Uninitialized):
184
+ tid = wp.tid()
185
+
186
+
187
+ @wp.struct
188
+ class Baz:
189
+ data: wp.array(dtype=int)
190
+ z: wp.vec3
191
+
192
+
193
+ @wp.struct
194
+ class Bar:
195
+ baz: Baz
196
+ y: float
197
+
198
+
199
+ @wp.struct
200
+ class Foo:
201
+ bar: Bar
202
+ x: int
203
+
204
+
205
+ @wp.kernel
206
+ def kernel_nested_struct(foo: Foo):
207
+ tid = wp.tid()
208
+ foo.bar.baz.data[tid] = (
209
+ foo.bar.baz.data[tid] + foo.x + int(foo.bar.y * 100.0) + int(wp.length_sq(foo.bar.baz.z)) + tid * 2
210
+ )
211
+
212
+
213
+ def test_nested_struct(test, device):
214
+ dim = 3
215
+
216
+ foo = Foo()
217
+ foo.bar = Bar()
218
+ foo.bar.baz = Baz()
219
+ foo.bar.baz.data = wp.zeros(dim, dtype=int, device=device)
220
+ foo.bar.baz.z = wp.vec3(1, 2, 3)
221
+ foo.bar.y = 1.23
222
+ foo.x = 123
223
+
224
+ wp.launch(kernel_nested_struct, dim=dim, inputs=[foo], device=device)
225
+
226
+ assert_array_equal(
227
+ foo.bar.baz.data,
228
+ wp.array((260, 262, 264), dtype=int, device=device),
229
+ )
230
+
231
+
232
+ def test_struct_attribute_error(test, device):
233
+ @wp.kernel
234
+ def kernel(foo: Foo):
235
+ _ = foo.nonexisting
236
+
237
+ with test.assertRaisesRegex(AttributeError, r"`nonexisting` is not an attribute of 'foo' \([\w.]+\.Foo\)$"):
238
+ wp.launch(
239
+ kernel,
240
+ dim=1,
241
+ inputs=[Foo()],
242
+ device=device,
243
+ )
244
+
245
+
246
+ @wp.kernel
247
+ def test_struct_instantiate(data: wp.array(dtype=int)):
248
+ baz = Baz(data, wp.vec3(0.0, 0.0, 26.0))
249
+ bar = Bar(baz, 25.0)
250
+ foo = Foo(bar, 24)
251
+
252
+ wp.expect_eq(foo.x, 24)
253
+ wp.expect_eq(foo.bar.y, 25.0)
254
+ wp.expect_eq(foo.bar.baz.z[2], 26.0)
255
+ wp.expect_eq(foo.bar.baz.data[0], 1)
256
+
257
+
258
+ @wp.struct
259
+ class MathThings:
260
+ v1: wp.vec3
261
+ v2: wp.vec3
262
+ v3: wp.vec3
263
+ m1: wp.mat22
264
+ m2: wp.mat22
265
+ m3: wp.mat22
266
+ m4: wp.mat22
267
+ m5: wp.mat22
268
+ m6: wp.mat22
269
+
270
+
271
+ @wp.kernel
272
+ def check_math_conversions(s: MathThings):
273
+ wp.expect_eq(s.v1, wp.vec3(1.0, 2.0, 3.0))
274
+ wp.expect_eq(s.v2, wp.vec3(10.0, 20.0, 30.0))
275
+ wp.expect_eq(s.v3, wp.vec3(100.0, 200.0, 300.0))
276
+ wp.expect_eq(s.m1, wp.mat22(1.0, 2.0, 3.0, 4.0))
277
+ wp.expect_eq(s.m2, wp.mat22(10.0, 20.0, 30.0, 40.0))
278
+ wp.expect_eq(s.m3, wp.mat22(100.0, 200.0, 300.0, 400.0))
279
+ wp.expect_eq(s.m4, wp.mat22(1.0, 2.0, 3.0, 4.0))
280
+ wp.expect_eq(s.m5, wp.mat22(10.0, 20.0, 30.0, 40.0))
281
+ wp.expect_eq(s.m6, wp.mat22(100.0, 200.0, 300.0, 400.0))
282
+
283
+
284
+ def test_struct_math_conversions(test, device):
285
+ s = MathThings()
286
+
287
+ # test assigning various containers to vector and matrix attributes
288
+ s.v1 = (1, 2, 3)
289
+ s.v2 = [10, 20, 30]
290
+ s.v3 = np.array([100, 200, 300])
291
+ # 2d containers for matrices
292
+ s.m1 = ((1, 2), (3, 4))
293
+ s.m2 = [[10, 20], [30, 40]]
294
+ s.m3 = np.array([[100, 200], [300, 400]])
295
+ # 1d containers for matrices
296
+ s.m4 = (1, 2, 3, 4)
297
+ s.m5 = [10, 20, 30, 40]
298
+ s.m6 = np.array([100, 200, 300, 400])
299
+
300
+ wp.launch(check_math_conversions, dim=1, inputs=[s], device=device)
301
+
302
+
303
+ @wp.struct
304
+ class TestData:
305
+ value: wp.int32
306
+
307
+
308
+ @wp.func
309
+ def GetTestData(value: wp.int32):
310
+ return TestData(value * 2)
311
+
312
+
313
+ @wp.kernel
314
+ def test_return_struct(data: wp.array(dtype=wp.int32)):
315
+ tid = wp.tid()
316
+ data[tid] = GetTestData(tid).value
317
+
318
+ wp.expect_eq(data[tid], tid * 2)
319
+
320
+
321
+ @wp.struct
322
+ class ReturnStruct:
323
+ a: int
324
+ b: int
325
+
326
+
327
+ @wp.func
328
+ def test_return_func():
329
+ a = ReturnStruct(1, 2)
330
+ return a
331
+
332
+
333
+ @wp.kernel
334
+ def test_return():
335
+ t = test_return_func()
336
+ wp.expect_eq(t.a, 1)
337
+ wp.expect_eq(t.b, 2)
338
+
339
+
340
+ @wp.struct
341
+ class DefaultAttribNested:
342
+ f: float
343
+
344
+
345
+ @wp.struct
346
+ class DefaultAttribStruct:
347
+ i: int
348
+ d: wp.float64
349
+ v: wp.vec3
350
+ m: wp.mat22
351
+ a: wp.array(dtype=wp.int32)
352
+ s: DefaultAttribNested
353
+
354
+
355
+ @wp.func
356
+ def check_default_attributes_func(data: DefaultAttribStruct):
357
+ wp.expect_eq(data.i, wp.int32(0))
358
+ wp.expect_eq(data.d, wp.float64(0))
359
+ wp.expect_eq(data.v, wp.vec3(0.0, 0.0, 0.0))
360
+ wp.expect_eq(data.m, wp.mat22(0.0, 0.0, 0.0, 0.0))
361
+ wp.expect_eq(data.a.shape[0], 0)
362
+ wp.expect_eq(data.s.f, wp.float32(0.0))
363
+
364
+
365
+ @wp.kernel
366
+ def check_default_attributes_kernel(data: DefaultAttribStruct):
367
+ check_default_attributes_func(data)
368
+
369
+
370
+ # check structs default initialized in kernels correctly
371
+ @wp.kernel
372
+ def test_struct_default_attributes_kernel():
373
+ s = DefaultAttribStruct()
374
+
375
+ check_default_attributes_func(s)
376
+
377
+
378
+ @wp.struct
379
+ class MutableStruct:
380
+ param1: int
381
+ param2: float
382
+
383
+
384
+ @wp.kernel
385
+ def test_struct_mutate_attributes_kernel():
386
+ t = MutableStruct()
387
+ t.param1 = 1
388
+ t.param2 = 1.1
389
+
390
+ wp.expect_eq(t.param1, 1)
391
+ wp.expect_eq(t.param2, 1.1)
392
+
393
+
394
+ @wp.struct
395
+ class InnerStruct:
396
+ i: int
397
+
398
+
399
+ @wp.struct
400
+ class ArrayStruct:
401
+ array: wp.array(dtype=InnerStruct)
402
+
403
+
404
+ @wp.kernel
405
+ def struct2_reader(test: ArrayStruct):
406
+ k = wp.tid()
407
+ wp.expect_eq(k + 1, test.array[k].i)
408
+
409
+
410
+ def test_nested_array_struct(test, device):
411
+ var1 = InnerStruct()
412
+ var1.i = 1
413
+
414
+ var2 = InnerStruct()
415
+ var2.i = 2
416
+
417
+ struct = ArrayStruct()
418
+ struct.array = wp.array([var1, var2], dtype=InnerStruct, device=device)
419
+
420
+ wp.launch(struct2_reader, dim=2, inputs=[struct], device=device)
421
+
422
+
423
+ @wp.struct
424
+ class VecStruct:
425
+ value: wp.vec3
426
+
427
+
428
+ @wp.struct
429
+ class Bar2:
430
+ z: wp.array(dtype=float)
431
+
432
+
433
+ @wp.struct
434
+ class Foo2:
435
+ x: wp.array(dtype=float)
436
+ y: Bar2
437
+
438
+
439
+ def test_convert_to_device(test, device):
440
+ foo = Foo2()
441
+ foo.x = wp.array((1.23, 2.34), dtype=float, device=device)
442
+ foo.y = Bar2()
443
+ foo.y.z = wp.array((3.45, 4.56), dtype=float, device=device)
444
+
445
+ if device.is_cpu and wp.is_cuda_available():
446
+ dst_device = "cuda:0"
447
+ elif device.is_cuda and wp.is_cpu_available():
448
+ dst_device = "cpu"
449
+ else:
450
+ return
451
+
452
+ result = foo.to(dst_device)
453
+ assert result.x.device == dst_device
454
+ assert result.y.z.device == dst_device
455
+
456
+
457
+ @wp.struct
458
+ class EmptyNest1:
459
+ a: Empty
460
+ z: int
461
+
462
+
463
+ @wp.struct
464
+ class EmptyNest2:
465
+ a: Empty
466
+ b: Empty
467
+ z: int
468
+
469
+
470
+ @wp.struct
471
+ class EmptyNest3:
472
+ a: Empty
473
+ b: Empty
474
+ c: Empty
475
+ z: int
476
+
477
+
478
+ @wp.struct
479
+ class EmptyNest4:
480
+ a: Empty
481
+ b: Empty
482
+ c: Empty
483
+ d: Empty
484
+ z: int
485
+
486
+
487
+ @wp.struct
488
+ class EmptyNest5:
489
+ a: Empty
490
+ b: Empty
491
+ c: Empty
492
+ d: Empty
493
+ e: Empty
494
+ z: int
495
+
496
+
497
+ @wp.struct
498
+ class EmptyNest6:
499
+ a: Empty
500
+ b: Empty
501
+ c: Empty
502
+ d: Empty
503
+ e: Empty
504
+ f: Empty
505
+ z: int
506
+
507
+
508
+ @wp.struct
509
+ class EmptyNest7:
510
+ a: Empty
511
+ b: Empty
512
+ c: Empty
513
+ d: Empty
514
+ e: Empty
515
+ f: Empty
516
+ g: Empty
517
+ z: int
518
+
519
+
520
+ @wp.struct
521
+ class EmptyNest8:
522
+ a: Empty
523
+ b: Empty
524
+ c: Empty
525
+ d: Empty
526
+ e: Empty
527
+ f: Empty
528
+ g: Empty
529
+ h: Empty
530
+ z: int
531
+
532
+
533
+ @wp.kernel
534
+ def empty_nest_kernel(s: Any):
535
+ wp.expect_eq(s.z, 42)
536
+
537
+
538
+ wp.overload(empty_nest_kernel, [EmptyNest1])
539
+ wp.overload(empty_nest_kernel, [EmptyNest2])
540
+ wp.overload(empty_nest_kernel, [EmptyNest3])
541
+ wp.overload(empty_nest_kernel, [EmptyNest4])
542
+ wp.overload(empty_nest_kernel, [EmptyNest5])
543
+ wp.overload(empty_nest_kernel, [EmptyNest6])
544
+ wp.overload(empty_nest_kernel, [EmptyNest7])
545
+ wp.overload(empty_nest_kernel, [EmptyNest8])
546
+
547
+
548
+ def test_nested_empty_struct(test, device):
549
+ with wp.ScopedDevice(device):
550
+ e1 = EmptyNest1()
551
+ e1.z = 42
552
+ e2 = EmptyNest2()
553
+ e2.z = 42
554
+ e3 = EmptyNest3()
555
+ e3.z = 42
556
+ e4 = EmptyNest4()
557
+ e4.z = 42
558
+ e5 = EmptyNest5()
559
+ e5.z = 42
560
+ e6 = EmptyNest6()
561
+ e6.z = 42
562
+ e7 = EmptyNest7()
563
+ e7.z = 42
564
+ e8 = EmptyNest8()
565
+ e8.z = 42
566
+
567
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e1])
568
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e2])
569
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e3])
570
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e4])
571
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e5])
572
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e6])
573
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e7])
574
+ wp.launch(empty_nest_kernel, dim=1, inputs=[e8])
575
+
576
+ wp.synchronize_device()
577
+
578
+
579
+ @wp.struct
580
+ class DependentModuleImport_A:
581
+ s: StructFromAnotherModule
582
+
583
+
584
+ @wp.struct
585
+ class DependentModuleImport_B:
586
+ s: StructFromAnotherModule
587
+
588
+
589
+ @wp.struct
590
+ class DependentModuleImport_C:
591
+ a: DependentModuleImport_A
592
+ b: DependentModuleImport_B
593
+
594
+
595
+ @wp.kernel
596
+ def test_dependent_module_import(c: DependentModuleImport_C):
597
+ wp.tid() # nop, we're just testing codegen
598
+
599
+
600
+ def test_struct_array_hash(test, device):
601
+ # Ensure that the memory address of the struct does not affect the content hash
602
+
603
+ @wp.struct
604
+ class ContentHashStruct:
605
+ i: int
606
+
607
+ @wp.kernel
608
+ def dummy_kernel(a: wp.array(dtype=ContentHashStruct)):
609
+ i = wp.tid()
610
+
611
+ module_hash_0 = wp.get_module(dummy_kernel.__module__).hash_module()
612
+
613
+ # Redefine ContentHashStruct to have the same members as before but a new memory address
614
+ @wp.struct
615
+ class ContentHashStruct:
616
+ i: int
617
+
618
+ @wp.kernel
619
+ def dummy_kernel(a: wp.array(dtype=ContentHashStruct)):
620
+ i = wp.tid()
621
+
622
+ module_hash_1 = wp.get_module(dummy_kernel.__module__).hash_module()
623
+
624
+ test.assertEqual(
625
+ module_hash_1,
626
+ module_hash_0,
627
+ "Module hash should be unchanged when ContentHashStruct is redefined but unchanged.",
628
+ )
629
+
630
+ # Redefine ContentHashStruct to have different members. This time we should get a new hash.
631
+ @wp.struct
632
+ class ContentHashStruct:
633
+ i: float
634
+
635
+ @wp.kernel
636
+ def dummy_kernel(a: wp.array(dtype=ContentHashStruct)):
637
+ i = wp.tid()
638
+
639
+ module_hash_2 = wp.get_module(dummy_kernel.__module__).hash_module()
640
+
641
+ test.assertNotEqual(
642
+ module_hash_2, module_hash_0, "Module hash should be different when ContentHashStruct redefined and changed."
643
+ )
644
+
645
+
646
+ devices = get_test_devices()
647
+
648
+
649
+ class TestStruct(unittest.TestCase):
650
+ # check structs default initialized in Python correctly
651
+ def test_struct_default_attributes_python(self):
652
+ s = DefaultAttribStruct()
653
+
654
+ wp.launch(check_default_attributes_kernel, dim=1, inputs=[s])
655
+
656
+ def test_nested_vec_assignment(self):
657
+ v = VecStruct()
658
+ v.value[0] = 1.0
659
+ v.value[1] = 2.0
660
+ v.value[2] = 3.0
661
+
662
+ arr = wp.array([v], dtype=VecStruct)
663
+ expected = np.array(([1.0, 2.0, 3.0],))
664
+ assert np.all(arr.numpy().tolist() == expected)
665
+
666
+
667
+ add_function_test(TestStruct, "test_step", test_step, devices=devices)
668
+ add_function_test(TestStruct, "test_step_grad", test_step_grad, devices=devices)
669
+ add_kernel_test(TestStruct, kernel=test_empty, name="test_empty", dim=1, inputs=[Empty()], devices=devices)
670
+ add_kernel_test(
671
+ TestStruct,
672
+ kernel=test_uninitialized,
673
+ name="test_uninitialized",
674
+ dim=1,
675
+ inputs=[Uninitialized()],
676
+ devices=devices,
677
+ )
678
+ add_kernel_test(TestStruct, kernel=test_return, name="test_return", dim=1, inputs=[], devices=devices)
679
+ add_function_test(TestStruct, "test_nested_struct", test_nested_struct, devices=devices)
680
+ add_function_test(TestStruct, "test_nested_array_struct", test_nested_array_struct, devices=devices)
681
+ add_function_test(TestStruct, "test_convert_to_device", test_convert_to_device, devices=devices)
682
+ add_function_test(TestStruct, "test_nested_empty_struct", test_nested_empty_struct, devices=devices)
683
+ add_function_test(TestStruct, "test_struct_math_conversions", test_struct_math_conversions, devices=devices)
684
+ add_kernel_test(
685
+ TestStruct,
686
+ name="test_struct_default_attributes",
687
+ kernel=test_struct_default_attributes_kernel,
688
+ dim=1,
689
+ inputs=[],
690
+ devices=devices,
691
+ )
692
+
693
+ add_kernel_test(
694
+ TestStruct,
695
+ name="test_struct_mutate_attributes",
696
+ kernel=test_struct_mutate_attributes_kernel,
697
+ dim=1,
698
+ inputs=[],
699
+ devices=devices,
700
+ )
701
+
702
+ for device in devices:
703
+ add_kernel_test(
704
+ TestStruct,
705
+ kernel=test_struct_instantiate,
706
+ name="test_struct_instantiate",
707
+ dim=1,
708
+ inputs=[wp.array([1], dtype=int, device=device)],
709
+ devices=[device],
710
+ )
711
+ add_kernel_test(
712
+ TestStruct,
713
+ kernel=test_return_struct,
714
+ name="test_return_struct",
715
+ dim=1,
716
+ inputs=[wp.zeros(10, dtype=int, device=device)],
717
+ devices=[device],
718
+ )
719
+
720
+ add_kernel_test(
721
+ TestStruct,
722
+ kernel=test_dependent_module_import,
723
+ name="test_dependent_module_import",
724
+ dim=1,
725
+ inputs=[DependentModuleImport_C()],
726
+ devices=devices,
727
+ )
728
+
729
+ add_function_test(TestStruct, "test_struct_array_hash", test_struct_array_hash, devices=None)
730
+
731
+
732
+ if __name__ == "__main__":
733
+ wp.clear_kernel_cache()
734
+ unittest.main(verbosity=2)