warp-lang 1.9.1__py3-none-manylinux_2_34_aarch64.whl → 1.10.0rc2__py3-none-manylinux_2_34_aarch64.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 (346) hide show
  1. warp/__init__.py +301 -287
  2. warp/__init__.pyi +794 -305
  3. warp/_src/__init__.py +14 -0
  4. warp/_src/autograd.py +1075 -0
  5. warp/_src/build.py +618 -0
  6. warp/_src/build_dll.py +640 -0
  7. warp/{builtins.py → _src/builtins.py} +1382 -377
  8. warp/_src/codegen.py +4359 -0
  9. warp/{config.py → _src/config.py} +178 -169
  10. warp/_src/constants.py +57 -0
  11. warp/_src/context.py +8294 -0
  12. warp/_src/dlpack.py +462 -0
  13. warp/_src/fabric.py +355 -0
  14. warp/_src/fem/__init__.py +14 -0
  15. warp/_src/fem/adaptivity.py +508 -0
  16. warp/_src/fem/cache.py +687 -0
  17. warp/_src/fem/dirichlet.py +188 -0
  18. warp/{fem → _src/fem}/domain.py +40 -30
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +701 -0
  21. warp/{fem → _src/fem}/field/nodal_field.py +30 -15
  22. warp/{fem → _src/fem}/field/restriction.py +1 -1
  23. warp/{fem → _src/fem}/field/virtual.py +53 -27
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/{fem → _src/fem}/geometry/adaptive_nanogrid.py +77 -163
  26. warp/_src/fem/geometry/closest_point.py +97 -0
  27. warp/{fem → _src/fem}/geometry/deformed_geometry.py +14 -22
  28. warp/{fem → _src/fem}/geometry/element.py +32 -10
  29. warp/{fem → _src/fem}/geometry/geometry.py +48 -20
  30. warp/{fem → _src/fem}/geometry/grid_2d.py +12 -23
  31. warp/{fem → _src/fem}/geometry/grid_3d.py +12 -23
  32. warp/{fem → _src/fem}/geometry/hexmesh.py +40 -63
  33. warp/{fem → _src/fem}/geometry/nanogrid.py +255 -248
  34. warp/{fem → _src/fem}/geometry/partition.py +121 -63
  35. warp/{fem → _src/fem}/geometry/quadmesh.py +26 -45
  36. warp/{fem → _src/fem}/geometry/tetmesh.py +40 -63
  37. warp/{fem → _src/fem}/geometry/trimesh.py +26 -45
  38. warp/{fem → _src/fem}/integrate.py +164 -158
  39. warp/_src/fem/linalg.py +383 -0
  40. warp/_src/fem/operator.py +396 -0
  41. warp/_src/fem/polynomial.py +229 -0
  42. warp/{fem → _src/fem}/quadrature/pic_quadrature.py +15 -20
  43. warp/{fem → _src/fem}/quadrature/quadrature.py +95 -47
  44. warp/_src/fem/space/__init__.py +248 -0
  45. warp/{fem → _src/fem}/space/basis_function_space.py +20 -11
  46. warp/_src/fem/space/basis_space.py +679 -0
  47. warp/{fem → _src/fem}/space/dof_mapper.py +3 -3
  48. warp/{fem → _src/fem}/space/function_space.py +14 -13
  49. warp/{fem → _src/fem}/space/grid_2d_function_space.py +4 -7
  50. warp/{fem → _src/fem}/space/grid_3d_function_space.py +4 -4
  51. warp/{fem → _src/fem}/space/hexmesh_function_space.py +4 -10
  52. warp/{fem → _src/fem}/space/nanogrid_function_space.py +3 -9
  53. warp/{fem → _src/fem}/space/partition.py +117 -60
  54. warp/{fem → _src/fem}/space/quadmesh_function_space.py +4 -10
  55. warp/{fem → _src/fem}/space/restriction.py +66 -33
  56. warp/_src/fem/space/shape/__init__.py +152 -0
  57. warp/{fem → _src/fem}/space/shape/cube_shape_function.py +9 -9
  58. warp/{fem → _src/fem}/space/shape/shape_function.py +8 -9
  59. warp/{fem → _src/fem}/space/shape/square_shape_function.py +6 -6
  60. warp/{fem → _src/fem}/space/shape/tet_shape_function.py +3 -3
  61. warp/{fem → _src/fem}/space/shape/triangle_shape_function.py +3 -3
  62. warp/{fem → _src/fem}/space/tetmesh_function_space.py +3 -9
  63. warp/_src/fem/space/topology.py +459 -0
  64. warp/{fem → _src/fem}/space/trimesh_function_space.py +3 -9
  65. warp/_src/fem/types.py +112 -0
  66. warp/_src/fem/utils.py +486 -0
  67. warp/_src/jax.py +186 -0
  68. warp/_src/jax_experimental/__init__.py +14 -0
  69. warp/_src/jax_experimental/custom_call.py +387 -0
  70. warp/_src/jax_experimental/ffi.py +1284 -0
  71. warp/_src/jax_experimental/xla_ffi.py +656 -0
  72. warp/_src/marching_cubes.py +708 -0
  73. warp/_src/math.py +414 -0
  74. warp/_src/optim/__init__.py +14 -0
  75. warp/_src/optim/adam.py +163 -0
  76. warp/_src/optim/linear.py +1606 -0
  77. warp/_src/optim/sgd.py +112 -0
  78. warp/_src/paddle.py +406 -0
  79. warp/_src/render/__init__.py +14 -0
  80. warp/_src/render/imgui_manager.py +289 -0
  81. warp/_src/render/render_opengl.py +3636 -0
  82. warp/_src/render/render_usd.py +937 -0
  83. warp/_src/render/utils.py +160 -0
  84. warp/_src/sparse.py +2716 -0
  85. warp/_src/tape.py +1206 -0
  86. warp/{thirdparty → _src/thirdparty}/unittest_parallel.py +9 -2
  87. warp/_src/torch.py +391 -0
  88. warp/_src/types.py +5870 -0
  89. warp/_src/utils.py +1693 -0
  90. warp/autograd.py +12 -1054
  91. warp/bin/warp-clang.so +0 -0
  92. warp/bin/warp.so +0 -0
  93. warp/build.py +8 -588
  94. warp/build_dll.py +6 -721
  95. warp/codegen.py +6 -4251
  96. warp/constants.py +6 -39
  97. warp/context.py +12 -8062
  98. warp/dlpack.py +6 -444
  99. warp/examples/distributed/example_jacobi_mpi.py +4 -5
  100. warp/examples/fem/example_adaptive_grid.py +1 -1
  101. warp/examples/fem/example_apic_fluid.py +1 -1
  102. warp/examples/fem/example_burgers.py +8 -8
  103. warp/examples/fem/example_diffusion.py +1 -1
  104. warp/examples/fem/example_distortion_energy.py +1 -1
  105. warp/examples/fem/example_mixed_elasticity.py +2 -2
  106. warp/examples/fem/example_navier_stokes.py +1 -1
  107. warp/examples/fem/example_nonconforming_contact.py +7 -7
  108. warp/examples/fem/example_stokes.py +1 -1
  109. warp/examples/fem/example_stokes_transfer.py +1 -1
  110. warp/examples/fem/utils.py +2 -2
  111. warp/examples/interop/example_jax_callable.py +1 -1
  112. warp/examples/interop/example_jax_ffi_callback.py +1 -1
  113. warp/examples/interop/example_jax_kernel.py +1 -1
  114. warp/examples/tile/example_tile_mcgp.py +191 -0
  115. warp/fabric.py +6 -337
  116. warp/fem/__init__.py +159 -97
  117. warp/fem/adaptivity.py +7 -489
  118. warp/fem/cache.py +9 -648
  119. warp/fem/dirichlet.py +6 -184
  120. warp/fem/field/__init__.py +8 -109
  121. warp/fem/field/field.py +7 -652
  122. warp/fem/geometry/__init__.py +7 -18
  123. warp/fem/geometry/closest_point.py +11 -77
  124. warp/fem/linalg.py +18 -366
  125. warp/fem/operator.py +11 -369
  126. warp/fem/polynomial.py +9 -209
  127. warp/fem/space/__init__.py +5 -211
  128. warp/fem/space/basis_space.py +6 -662
  129. warp/fem/space/shape/__init__.py +41 -118
  130. warp/fem/space/topology.py +6 -437
  131. warp/fem/types.py +6 -81
  132. warp/fem/utils.py +11 -444
  133. warp/jax.py +8 -165
  134. warp/jax_experimental/__init__.py +14 -1
  135. warp/jax_experimental/custom_call.py +8 -365
  136. warp/jax_experimental/ffi.py +17 -873
  137. warp/jax_experimental/xla_ffi.py +5 -605
  138. warp/marching_cubes.py +5 -689
  139. warp/math.py +16 -393
  140. warp/native/array.h +385 -37
  141. warp/native/builtin.h +314 -37
  142. warp/native/bvh.cpp +43 -9
  143. warp/native/bvh.cu +62 -27
  144. warp/native/bvh.h +310 -309
  145. warp/native/clang/clang.cpp +102 -97
  146. warp/native/coloring.cpp +0 -1
  147. warp/native/crt.h +208 -0
  148. warp/native/exports.h +156 -0
  149. warp/native/hashgrid.cu +2 -0
  150. warp/native/intersect.h +24 -1
  151. warp/native/intersect_tri.h +44 -35
  152. warp/native/mat.h +1456 -276
  153. warp/native/mesh.cpp +4 -4
  154. warp/native/mesh.cu +4 -2
  155. warp/native/mesh.h +176 -61
  156. warp/native/quat.h +0 -52
  157. warp/native/scan.cu +2 -0
  158. warp/native/sparse.cu +7 -3
  159. warp/native/spatial.h +12 -0
  160. warp/native/tile.h +681 -89
  161. warp/native/tile_radix_sort.h +1 -1
  162. warp/native/tile_reduce.h +394 -46
  163. warp/native/tile_scan.h +4 -4
  164. warp/native/vec.h +469 -0
  165. warp/native/version.h +23 -0
  166. warp/native/volume.cpp +1 -1
  167. warp/native/volume.cu +1 -0
  168. warp/native/volume.h +1 -1
  169. warp/native/volume_builder.cu +2 -0
  170. warp/native/warp.cpp +57 -29
  171. warp/native/warp.cu +253 -171
  172. warp/native/warp.h +11 -8
  173. warp/optim/__init__.py +6 -3
  174. warp/optim/adam.py +6 -145
  175. warp/optim/linear.py +14 -1585
  176. warp/optim/sgd.py +6 -94
  177. warp/paddle.py +6 -388
  178. warp/render/__init__.py +8 -4
  179. warp/render/imgui_manager.py +7 -267
  180. warp/render/render_opengl.py +6 -3618
  181. warp/render/render_usd.py +6 -919
  182. warp/render/utils.py +6 -142
  183. warp/sparse.py +37 -2563
  184. warp/tape.py +6 -1188
  185. warp/tests/__main__.py +1 -1
  186. warp/tests/cuda/test_async.py +4 -4
  187. warp/tests/cuda/test_conditional_captures.py +1 -1
  188. warp/tests/cuda/test_multigpu.py +1 -1
  189. warp/tests/cuda/test_streams.py +58 -1
  190. warp/tests/geometry/test_bvh.py +157 -22
  191. warp/tests/geometry/test_marching_cubes.py +0 -1
  192. warp/tests/geometry/test_mesh.py +5 -3
  193. warp/tests/geometry/test_mesh_query_aabb.py +5 -12
  194. warp/tests/geometry/test_mesh_query_point.py +5 -2
  195. warp/tests/geometry/test_mesh_query_ray.py +15 -3
  196. warp/tests/geometry/test_volume_write.py +5 -5
  197. warp/tests/interop/test_dlpack.py +14 -14
  198. warp/tests/interop/test_jax.py +772 -49
  199. warp/tests/interop/test_paddle.py +1 -1
  200. warp/tests/test_adam.py +0 -1
  201. warp/tests/test_arithmetic.py +9 -9
  202. warp/tests/test_array.py +527 -100
  203. warp/tests/test_array_reduce.py +3 -3
  204. warp/tests/test_atomic.py +12 -8
  205. warp/tests/test_atomic_bitwise.py +209 -0
  206. warp/tests/test_atomic_cas.py +4 -4
  207. warp/tests/test_bool.py +2 -2
  208. warp/tests/test_builtins_resolution.py +5 -571
  209. warp/tests/test_codegen.py +33 -14
  210. warp/tests/test_conditional.py +1 -1
  211. warp/tests/test_context.py +6 -6
  212. warp/tests/test_copy.py +242 -161
  213. warp/tests/test_ctypes.py +3 -3
  214. warp/tests/test_devices.py +24 -2
  215. warp/tests/test_examples.py +16 -84
  216. warp/tests/test_fabricarray.py +35 -35
  217. warp/tests/test_fast_math.py +0 -2
  218. warp/tests/test_fem.py +56 -10
  219. warp/tests/test_fixedarray.py +3 -3
  220. warp/tests/test_func.py +8 -5
  221. warp/tests/test_generics.py +1 -1
  222. warp/tests/test_indexedarray.py +24 -24
  223. warp/tests/test_intersect.py +39 -9
  224. warp/tests/test_large.py +1 -1
  225. warp/tests/test_lerp.py +3 -1
  226. warp/tests/test_linear_solvers.py +1 -1
  227. warp/tests/test_map.py +35 -4
  228. warp/tests/test_mat.py +52 -62
  229. warp/tests/test_mat_constructors.py +4 -5
  230. warp/tests/test_mat_lite.py +1 -1
  231. warp/tests/test_mat_scalar_ops.py +121 -121
  232. warp/tests/test_math.py +34 -0
  233. warp/tests/test_module_aot.py +4 -4
  234. warp/tests/test_modules_lite.py +28 -2
  235. warp/tests/test_print.py +11 -11
  236. warp/tests/test_quat.py +93 -58
  237. warp/tests/test_runlength_encode.py +1 -1
  238. warp/tests/test_scalar_ops.py +38 -10
  239. warp/tests/test_smoothstep.py +1 -1
  240. warp/tests/test_sparse.py +126 -15
  241. warp/tests/test_spatial.py +105 -87
  242. warp/tests/test_special_values.py +6 -6
  243. warp/tests/test_static.py +7 -7
  244. warp/tests/test_struct.py +13 -2
  245. warp/tests/test_triangle_closest_point.py +48 -1
  246. warp/tests/test_types.py +27 -15
  247. warp/tests/test_utils.py +52 -52
  248. warp/tests/test_vec.py +29 -29
  249. warp/tests/test_vec_constructors.py +5 -5
  250. warp/tests/test_vec_scalar_ops.py +97 -97
  251. warp/tests/test_version.py +75 -0
  252. warp/tests/tile/test_tile.py +178 -0
  253. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  254. warp/tests/tile/test_tile_cholesky.py +7 -4
  255. warp/tests/tile/test_tile_load.py +26 -2
  256. warp/tests/tile/test_tile_mathdx.py +3 -3
  257. warp/tests/tile/test_tile_matmul.py +1 -1
  258. warp/tests/tile/test_tile_mlp.py +2 -4
  259. warp/tests/tile/test_tile_reduce.py +214 -13
  260. warp/tests/unittest_suites.py +6 -14
  261. warp/tests/unittest_utils.py +10 -9
  262. warp/tests/walkthrough_debug.py +3 -1
  263. warp/torch.py +6 -373
  264. warp/types.py +29 -5764
  265. warp/utils.py +10 -1659
  266. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/METADATA +46 -99
  267. warp_lang-1.10.0rc2.dist-info/RECORD +468 -0
  268. warp_lang-1.10.0rc2.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  269. warp_lang-1.10.0rc2.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  270. warp_lang-1.10.0rc2.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  271. warp_lang-1.10.0rc2.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  272. warp_lang-1.10.0rc2.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  273. warp_lang-1.10.0rc2.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  274. warp_lang-1.10.0rc2.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  275. warp_lang-1.10.0rc2.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  276. warp_lang-1.10.0rc2.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  277. warp_lang-1.10.0rc2.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  278. warp_lang-1.10.0rc2.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  279. warp_lang-1.10.0rc2.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  280. warp_lang-1.10.0rc2.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  281. warp_lang-1.10.0rc2.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  282. warp_lang-1.10.0rc2.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  283. warp/examples/assets/cartpole.urdf +0 -110
  284. warp/examples/assets/crazyflie.usd +0 -0
  285. warp/examples/assets/nv_ant.xml +0 -92
  286. warp/examples/assets/nv_humanoid.xml +0 -183
  287. warp/examples/assets/quadruped.urdf +0 -268
  288. warp/examples/optim/example_bounce.py +0 -266
  289. warp/examples/optim/example_cloth_throw.py +0 -228
  290. warp/examples/optim/example_drone.py +0 -870
  291. warp/examples/optim/example_inverse_kinematics.py +0 -182
  292. warp/examples/optim/example_inverse_kinematics_torch.py +0 -191
  293. warp/examples/optim/example_softbody_properties.py +0 -400
  294. warp/examples/optim/example_spring_cage.py +0 -245
  295. warp/examples/optim/example_trajectory.py +0 -227
  296. warp/examples/sim/example_cartpole.py +0 -143
  297. warp/examples/sim/example_cloth.py +0 -225
  298. warp/examples/sim/example_cloth_self_contact.py +0 -316
  299. warp/examples/sim/example_granular.py +0 -130
  300. warp/examples/sim/example_granular_collision_sdf.py +0 -202
  301. warp/examples/sim/example_jacobian_ik.py +0 -244
  302. warp/examples/sim/example_particle_chain.py +0 -124
  303. warp/examples/sim/example_quadruped.py +0 -203
  304. warp/examples/sim/example_rigid_chain.py +0 -203
  305. warp/examples/sim/example_rigid_contact.py +0 -195
  306. warp/examples/sim/example_rigid_force.py +0 -133
  307. warp/examples/sim/example_rigid_gyroscopic.py +0 -115
  308. warp/examples/sim/example_rigid_soft_contact.py +0 -140
  309. warp/examples/sim/example_soft_body.py +0 -196
  310. warp/examples/tile/example_tile_walker.py +0 -327
  311. warp/sim/__init__.py +0 -74
  312. warp/sim/articulation.py +0 -793
  313. warp/sim/collide.py +0 -2570
  314. warp/sim/graph_coloring.py +0 -307
  315. warp/sim/import_mjcf.py +0 -791
  316. warp/sim/import_snu.py +0 -227
  317. warp/sim/import_urdf.py +0 -579
  318. warp/sim/import_usd.py +0 -898
  319. warp/sim/inertia.py +0 -357
  320. warp/sim/integrator.py +0 -245
  321. warp/sim/integrator_euler.py +0 -2000
  322. warp/sim/integrator_featherstone.py +0 -2101
  323. warp/sim/integrator_vbd.py +0 -2487
  324. warp/sim/integrator_xpbd.py +0 -3295
  325. warp/sim/model.py +0 -4821
  326. warp/sim/particles.py +0 -121
  327. warp/sim/render.py +0 -431
  328. warp/sim/utils.py +0 -431
  329. warp/tests/sim/disabled_kinematics.py +0 -244
  330. warp/tests/sim/test_cloth.py +0 -863
  331. warp/tests/sim/test_collision.py +0 -743
  332. warp/tests/sim/test_coloring.py +0 -347
  333. warp/tests/sim/test_inertia.py +0 -161
  334. warp/tests/sim/test_model.py +0 -226
  335. warp/tests/sim/test_sim_grad.py +0 -287
  336. warp/tests/sim/test_sim_grad_bounce_linear.py +0 -212
  337. warp/tests/sim/test_sim_kinematics.py +0 -98
  338. warp/thirdparty/__init__.py +0 -0
  339. warp_lang-1.9.1.dist-info/RECORD +0 -456
  340. /warp/{fem → _src/fem}/quadrature/__init__.py +0 -0
  341. /warp/{tests/sim → _src/thirdparty}/__init__.py +0 -0
  342. /warp/{thirdparty → _src/thirdparty}/appdirs.py +0 -0
  343. /warp/{thirdparty → _src/thirdparty}/dlpack.py +0 -0
  344. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/WHEEL +0 -0
  345. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/licenses/LICENSE.md +0 -0
  346. {warp_lang-1.9.1.dist-info → warp_lang-1.10.0rc2.dist-info}/top_level.txt +0 -0
warp/tests/test_quat.py CHANGED
@@ -18,7 +18,6 @@ import unittest
18
18
  import numpy as np
19
19
 
20
20
  import warp as wp
21
- import warp.sim
22
21
  from warp.tests.unittest_utils import *
23
22
 
24
23
  np_float_types = [np.float32, np.float64, np.float16]
@@ -26,6 +25,43 @@ np_float_types = [np.float32, np.float64, np.float16]
26
25
  kernel_cache = {}
27
26
 
28
27
 
28
+ @wp.func
29
+ def quat_from_euler(e: wp.vec3, i: int, j: int, k: int) -> wp.quat:
30
+ """
31
+ Convert Euler angles to a quaternion.
32
+
33
+ :math:`i, j, k` are the indices in :math:`[0, 1, 2]` of the axes in which the Euler angles are provided
34
+ (:math:`i \\neq j, j \\neq k`), e.g. (0, 1, 2) for Euler sequence XYZ.
35
+
36
+ Args:
37
+ e (vec3): The Euler angles (in radians)
38
+ i (int): The index of the first axis
39
+ j (int): The index of the second axis
40
+ k (int): The index of the third axis
41
+
42
+ Returns:
43
+ quat: The quaternion
44
+ """
45
+ # Half angles
46
+ half_e = e / 2.0
47
+
48
+ # Precompute sines and cosines of half angles
49
+ cr = wp.cos(half_e[i])
50
+ sr = wp.sin(half_e[i])
51
+ cp = wp.cos(half_e[j])
52
+ sp = wp.sin(half_e[j])
53
+ cy = wp.cos(half_e[k])
54
+ sy = wp.sin(half_e[k])
55
+
56
+ # Components of the quaternion based on the rotation sequence
57
+ return wp.quat(
58
+ (cy * sr * cp - sy * cr * sp),
59
+ (cy * cr * sp + sy * sr * cp),
60
+ (sy * cr * cp - cy * sr * sp),
61
+ (cy * cr * cp + sy * sr * sp),
62
+ )
63
+
64
+
29
65
  def getkernel(func, suffix=""):
30
66
  key = func.__name__ + "_" + suffix
31
67
  if key not in kernel_cache:
@@ -56,9 +92,9 @@ def test_constructors(test, device, dtype, register_kernels=False):
56
92
  np.float64: 1.0e-8,
57
93
  }.get(dtype, 0)
58
94
 
59
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
60
- vec3 = wp.types.vector(length=3, dtype=wptype)
61
- quat = wp.types.quaternion(dtype=wptype)
95
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
96
+ vec3 = wp._src.types.vector(length=3, dtype=wptype)
97
+ quat = wp._src.types.quaternion(dtype=wptype)
62
98
 
63
99
  def check_component_constructor(
64
100
  input: wp.array(dtype=wptype),
@@ -130,17 +166,17 @@ def test_constructors(test, device, dtype, register_kernels=False):
130
166
 
131
167
  def test_casting_constructors(test, device, dtype, register_kernels=False):
132
168
  np_type = np.dtype(dtype)
133
- wp_type = wp.types.np_dtype_to_warp_type[np_type]
134
- quat = wp.types.quaternion(dtype=wp_type)
169
+ wp_type = wp._src.types.np_dtype_to_warp_type[np_type]
170
+ quat = wp._src.types.quaternion(dtype=wp_type)
135
171
 
136
172
  np16 = np.dtype(np.float16)
137
- wp16 = wp.types.np_dtype_to_warp_type[np16]
173
+ wp16 = wp._src.types.np_dtype_to_warp_type[np16]
138
174
 
139
175
  np32 = np.dtype(np.float32)
140
- wp32 = wp.types.np_dtype_to_warp_type[np32]
176
+ wp32 = wp._src.types.np_dtype_to_warp_type[np32]
141
177
 
142
178
  np64 = np.dtype(np.float64)
143
- wp64 = wp.types.np_dtype_to_warp_type[np64]
179
+ wp64 = wp._src.types.np_dtype_to_warp_type[np64]
144
180
 
145
181
  def cast_float16(a: wp.array(dtype=wp_type, ndim=2), b: wp.array(dtype=wp16, ndim=2)):
146
182
  tid = wp.tid()
@@ -243,8 +279,8 @@ def test_inverse(test, device, dtype, register_kernels=False):
243
279
  np.float64: 1.0e-8,
244
280
  }.get(dtype, 0)
245
281
 
246
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
247
- quat = wp.types.quaternion(dtype=wptype)
282
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
283
+ quat = wp._src.types.quaternion(dtype=wptype)
248
284
 
249
285
  output_select_kernel = get_select_kernel(wptype)
250
286
 
@@ -299,8 +335,8 @@ def test_dotproduct(test, device, dtype, register_kernels=False):
299
335
  np.float64: 1.0e-8,
300
336
  }.get(dtype, 0)
301
337
 
302
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
303
- quat = wp.types.quaternion(dtype=wptype)
338
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
339
+ quat = wp._src.types.quaternion(dtype=wptype)
304
340
 
305
341
  def check_quat_dot(
306
342
  s: wp.array(dtype=quat),
@@ -351,8 +387,8 @@ def test_length(test, device, dtype, register_kernels=False):
351
387
  np.float64: 1.0e-7,
352
388
  }.get(dtype, 0)
353
389
 
354
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
355
- quat = wp.types.quaternion(dtype=wptype)
390
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
391
+ quat = wp._src.types.quaternion(dtype=wptype)
356
392
 
357
393
  def check_quat_length(
358
394
  q: wp.array(dtype=quat),
@@ -408,8 +444,8 @@ def test_normalize(test, device, dtype, register_kernels=False):
408
444
  np.float64: 1.0e-8,
409
445
  }.get(dtype, 0)
410
446
 
411
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
412
- quat = wp.types.quaternion(dtype=wptype)
447
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
448
+ quat = wp._src.types.quaternion(dtype=wptype)
413
449
 
414
450
  def check_normalize(
415
451
  q: wp.array(dtype=quat),
@@ -509,8 +545,8 @@ def test_addition(test, device, dtype, register_kernels=False):
509
545
  np.float64: 1.0e-8,
510
546
  }.get(dtype, 0)
511
547
 
512
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
513
- quat = wp.types.quaternion(dtype=wptype)
548
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
549
+ quat = wp._src.types.quaternion(dtype=wptype)
514
550
 
515
551
  def check_quat_add(
516
552
  q: wp.array(dtype=quat),
@@ -581,8 +617,8 @@ def test_subtraction(test, device, dtype, register_kernels=False):
581
617
  np.float64: 1.0e-8,
582
618
  }.get(dtype, 0)
583
619
 
584
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
585
- quat = wp.types.quaternion(dtype=wptype)
620
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
621
+ quat = wp._src.types.quaternion(dtype=wptype)
586
622
 
587
623
  def check_quat_sub(
588
624
  q: wp.array(dtype=quat),
@@ -654,8 +690,8 @@ def test_scalar_multiplication(test, device, dtype, register_kernels=False):
654
690
  np.float64: 1.0e-8,
655
691
  }.get(dtype, 0)
656
692
 
657
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
658
- quat = wp.types.quaternion(dtype=wptype)
693
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
694
+ quat = wp._src.types.quaternion(dtype=wptype)
659
695
 
660
696
  def check_quat_scalar_mul(
661
697
  s: wp.array(dtype=wptype),
@@ -752,8 +788,8 @@ def test_scalar_division(test, device, dtype, register_kernels=False):
752
788
  np.float64: 1.0e-8,
753
789
  }.get(dtype, 0)
754
790
 
755
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
756
- quat = wp.types.quaternion(dtype=wptype)
791
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
792
+ quat = wp._src.types.quaternion(dtype=wptype)
757
793
 
758
794
  def check_quat_scalar_div(
759
795
  s: wp.array(dtype=wptype),
@@ -825,8 +861,8 @@ def test_quat_multiplication(test, device, dtype, register_kernels=False):
825
861
  np.float64: 1.0e-8,
826
862
  }.get(dtype, 0)
827
863
 
828
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
829
- quat = wp.types.quaternion(dtype=wptype)
864
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
865
+ quat = wp._src.types.quaternion(dtype=wptype)
830
866
 
831
867
  def check_quat_mul(
832
868
  s: wp.array(dtype=quat),
@@ -929,8 +965,8 @@ def test_indexing(test, device, dtype, register_kernels=False):
929
965
  np.float64: 1.0e-8,
930
966
  }.get(dtype, 0)
931
967
 
932
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
933
- quat = wp.types.quaternion(dtype=wptype)
968
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
969
+ quat = wp._src.types.quaternion(dtype=wptype)
934
970
 
935
971
  def check_quat_indexing(
936
972
  q: wp.array(dtype=quat),
@@ -996,8 +1032,8 @@ def test_quat_lerp(test, device, dtype, register_kernels=False):
996
1032
  np.float64: 1.0e-8,
997
1033
  }.get(dtype, 0)
998
1034
 
999
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
1000
- quat = wp.types.quaternion(dtype=wptype)
1035
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
1036
+ quat = wp._src.types.quaternion(dtype=wptype)
1001
1037
 
1002
1038
  def check_quat_lerp(
1003
1039
  s: wp.array(dtype=quat),
@@ -1077,9 +1113,9 @@ def test_quat_rotate(test, device, dtype, register_kernels=False):
1077
1113
  np.float64: 1.0e-8,
1078
1114
  }.get(dtype, 0)
1079
1115
 
1080
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
1081
- quat = wp.types.quaternion(dtype=wptype)
1082
- vec3 = wp.types.vector(length=3, dtype=wptype)
1116
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
1117
+ quat = wp._src.types.quaternion(dtype=wptype)
1118
+ vec3 = wp._src.types.vector(length=3, dtype=wptype)
1083
1119
 
1084
1120
  def check_quat_rotate(
1085
1121
  q: wp.array(dtype=quat),
@@ -1203,9 +1239,9 @@ def test_quat_to_matrix(test, device, dtype, register_kernels=False):
1203
1239
  np.float64: 1.0e-8,
1204
1240
  }.get(dtype, 0)
1205
1241
 
1206
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
1207
- quat = wp.types.quaternion(dtype=wptype)
1208
- vec3 = wp.types.vector(length=3, dtype=wptype)
1242
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
1243
+ quat = wp._src.types.quaternion(dtype=wptype)
1244
+ vec3 = wp._src.types.vector(length=3, dtype=wptype)
1209
1245
 
1210
1246
  def check_quat_to_matrix(
1211
1247
  q: wp.array(dtype=quat),
@@ -1321,9 +1357,9 @@ def test_slerp_grad(test, device, dtype, register_kernels=False):
1321
1357
  rng = np.random.default_rng(123)
1322
1358
  seed = 42
1323
1359
 
1324
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
1325
- vec3 = wp.types.vector(3, wptype)
1326
- quat = wp.types.quaternion(wptype)
1360
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
1361
+ vec3 = wp._src.types.vector(3, wptype)
1362
+ quat = wp._src.types.quaternion(wptype)
1327
1363
 
1328
1364
  def slerp_kernel(
1329
1365
  q0: wp.array(dtype=quat),
@@ -1480,14 +1516,13 @@ def test_slerp_grad(test, device, dtype, register_kernels=False):
1480
1516
 
1481
1517
 
1482
1518
  def test_quat_to_axis_angle_grad(test, device, dtype, register_kernels=False):
1483
- rng = np.random.default_rng(123)
1484
1519
  seed = 42
1485
1520
  num_rand = 50
1486
1521
 
1487
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
1488
- vec3 = wp.types.vector(3, wptype)
1489
- vec4 = wp.types.vector(4, wptype)
1490
- quat = wp.types.quaternion(wptype)
1522
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
1523
+ vec3 = wp._src.types.vector(3, wptype)
1524
+ vec4 = wp._src.types.vector(4, wptype)
1525
+ quat = wp._src.types.quaternion(wptype)
1491
1526
 
1492
1527
  def quat_to_axis_angle_kernel(quats: wp.array(dtype=quat), loss: wp.array(dtype=wptype), coord_idx: int):
1493
1528
  tid = wp.tid()
@@ -1616,10 +1651,10 @@ def test_quat_rpy_grad(test, device, dtype, register_kernels=False):
1616
1651
  rng = np.random.default_rng(123)
1617
1652
  N = 3
1618
1653
 
1619
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
1654
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
1620
1655
 
1621
- vec3 = wp.types.vector(3, wptype)
1622
- quat = wp.types.quaternion(wptype)
1656
+ vec3 = wp._src.types.vector(3, wptype)
1657
+ quat = wp._src.types.quaternion(wptype)
1623
1658
 
1624
1659
  def rpy_to_quat_kernel(rpy_arr: wp.array(dtype=vec3), loss: wp.array(dtype=wptype), coord_idx: int):
1625
1660
  tid = wp.tid()
@@ -1708,10 +1743,10 @@ def test_quat_rpy_grad(test, device, dtype, register_kernels=False):
1708
1743
 
1709
1744
 
1710
1745
  def test_quat_from_matrix(test, device, dtype, register_kernels=False):
1711
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
1712
- mat33 = wp.types.matrix((3, 3), wptype)
1713
- mat44 = wp.types.matrix((4, 4), wptype)
1714
- quat = wp.types.quaternion(wptype)
1746
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
1747
+ mat33 = wp._src.types.matrix((3, 3), wptype)
1748
+ mat44 = wp._src.types.matrix((4, 4), wptype)
1749
+ quat = wp._src.types.quaternion(wptype)
1715
1750
 
1716
1751
  def quat_from_matrix(m: wp.array2d(dtype=wptype), loss: wp.array(dtype=wptype), idx: int):
1717
1752
  tid = wp.tid()
@@ -1867,7 +1902,7 @@ def test_quat_from_matrix(test, device, dtype, register_kernels=False):
1867
1902
 
1868
1903
 
1869
1904
  def test_quat_identity(test, device, dtype, register_kernels=False):
1870
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
1905
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
1871
1906
 
1872
1907
  def quat_identity_test(output: wp.array(dtype=wptype)):
1873
1908
  q = wp.quat_identity(dtype=wptype)
@@ -1909,7 +1944,7 @@ def test_quat_euler_conversion(test, device, dtype, register_kernels=False):
1909
1944
 
1910
1945
  rpy_arr = rng.uniform(low=-np.pi, high=np.pi, size=(N, 3))
1911
1946
 
1912
- quats_from_euler = [list(wp.sim.quat_from_euler(wp.vec3(*rpy), 0, 1, 2)) for rpy in rpy_arr]
1947
+ quats_from_euler = [list(quat_from_euler(wp.vec3(*rpy), 0, 1, 2)) for rpy in rpy_arr]
1913
1948
  quats_from_rpy = [list(wp.quat_rpy(rpy[0], rpy[1], rpy[2])) for rpy in rpy_arr]
1914
1949
 
1915
1950
  assert_np_equal(np.array(quats_from_euler), np.array(quats_from_rpy), tol=1e-4)
@@ -1917,7 +1952,7 @@ def test_quat_euler_conversion(test, device, dtype, register_kernels=False):
1917
1952
 
1918
1953
  def test_anon_type_instance(test, device, dtype, register_kernels=False):
1919
1954
  rng = np.random.default_rng(123)
1920
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
1955
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
1921
1956
 
1922
1957
  def quat_create_test(input: wp.array(dtype=wptype), output: wp.array(dtype=wptype)):
1923
1958
  # component constructor:
@@ -1990,16 +2025,16 @@ def test_constructor_default():
1990
2025
 
1991
2026
 
1992
2027
  def test_py_arithmetic_ops(test, device, dtype):
1993
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
2028
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
1994
2029
 
1995
2030
  def make_quat(*args):
1996
- if wptype in wp.types.int_types:
2031
+ if wptype in wp._src.types.int_types:
1997
2032
  # Cast to the correct integer type to simulate wrapping.
1998
2033
  return tuple(wptype._type_(x).value for x in args)
1999
2034
 
2000
2035
  return args
2001
2036
 
2002
- quat_cls = wp.types.quaternion(wptype)
2037
+ quat_cls = wp._src.types.quaternion(wptype)
2003
2038
 
2004
2039
  v = quat_cls(1, -2, 3, -4)
2005
2040
  test.assertSequenceEqual(+v, make_quat(1, -2, 3, -4))
@@ -19,8 +19,8 @@ from functools import partial
19
19
  import numpy as np
20
20
 
21
21
  import warp as wp
22
+ from warp._src.utils import runlength_encode
22
23
  from warp.tests.unittest_utils import *
23
- from warp.utils import runlength_encode
24
24
 
25
25
 
26
26
  def test_runlength_encode_int(test, device, n):
@@ -44,10 +44,10 @@ np_scalar_types = np_int_types + np_float_types
44
44
 
45
45
 
46
46
  def test_py_arithmetic_ops(test, device, dtype):
47
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
47
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
48
48
 
49
49
  def make_scalar(value):
50
- if wptype in wp.types.int_types:
50
+ if wptype in wp._src.types.int_types:
51
51
  # Cast to the correct integer type to simulate wrapping.
52
52
  return wptype._type_(value).value
53
53
 
@@ -69,14 +69,7 @@ def test_py_arithmetic_ops(test, device, dtype):
69
69
 
70
70
 
71
71
  def test_py_math_ops(test, device, dtype):
72
- wptype = wp.types.np_dtype_to_warp_type[np.dtype(dtype)]
73
-
74
- def make_scalar(value):
75
- if wptype in wp.types.int_types:
76
- # Cast to the correct integer type to simulate wrapping.
77
- return wptype._type_(value).value
78
-
79
- return value
72
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
80
73
 
81
74
  a = wptype(1)
82
75
  test.assertAlmostEqual(wp.abs(a), 1)
@@ -86,6 +79,38 @@ def test_py_math_ops(test, device, dtype):
86
79
  test.assertAlmostEqual(wp.radians(a), 0.01745329251994329577, places=5)
87
80
 
88
81
 
82
+ def test_py_array_ops(test, device, dtype):
83
+ wptype = wp._src.types.np_dtype_to_warp_type[np.dtype(dtype)]
84
+
85
+ tol = {
86
+ np.float16: 5.0e-3,
87
+ np.float32: 1.0e-6,
88
+ np.float64: 1.0e-8,
89
+ }.get(dtype, 0)
90
+
91
+ def make_array(*args):
92
+ if wptype in wp._src.types.int_types:
93
+ # Cast to the correct integer type to simulate wrapping.
94
+ return np.array(tuple(wptype._type_(x).value for x in args), dtype=dtype)
95
+
96
+ return np.array(args, dtype=dtype)
97
+
98
+ arr = wp.array((1, 2, 3), dtype=wptype)
99
+ s = wptype(5)
100
+ assert_np_equal((arr + s).numpy(), make_array(6, 7, 8), tol=tol)
101
+ assert_np_equal((s + arr).numpy(), make_array(6, 7, 8), tol=tol)
102
+ assert_np_equal((arr - s).numpy(), make_array(-4, -3, -2), tol=tol)
103
+ assert_np_equal((s - arr).numpy(), make_array(4, 3, 2), tol=tol)
104
+ assert_np_equal((arr * s).numpy(), make_array(5, 10, 15), tol=tol)
105
+ assert_np_equal((s * arr).numpy(), make_array(5, 10, 15), tol=tol)
106
+ assert_np_equal((arr % s).numpy(), make_array(1, 2, 3), tol=tol)
107
+ assert_np_equal((s % arr).numpy(), make_array(0, 1, 2), tol=tol)
108
+
109
+ if dtype in np_float_types:
110
+ assert_np_equal((arr / s).numpy(), make_array(0.2, 0.4, 0.6), tol=tol)
111
+ assert_np_equal((s / arr).numpy(), make_array(5.0, 2.5, 1.666666667), tol=tol)
112
+
113
+
89
114
  devices = get_test_devices()
90
115
 
91
116
 
@@ -98,6 +123,9 @@ for dtype in np_scalar_types:
98
123
  TestScalarOps, f"test_py_arithmetic_ops_{dtype.__name__}", test_py_arithmetic_ops, devices=None, dtype=dtype
99
124
  )
100
125
  add_function_test(TestScalarOps, f"test_py_math_ops_{dtype.__name__}", test_py_math_ops, devices=None, dtype=dtype)
126
+ add_function_test(
127
+ TestScalarOps, f"test_py_array_ops_{dtype.__name__}", test_py_array_ops, devices=None, dtype=dtype
128
+ )
101
129
 
102
130
 
103
131
  if __name__ == "__main__":
@@ -78,7 +78,7 @@ def test_smoothstep(test, device):
78
78
  a = wp.array([test_data.a], dtype=data_type, device=device, requires_grad=True)
79
79
  b = wp.array([test_data.b], dtype=data_type, device=device, requires_grad=True)
80
80
  t = wp.array([test_data.t], dtype=float, device=device, requires_grad=True)
81
- out = wp.array([0] * wp.types.type_size(data_type), dtype=data_type, device=device, requires_grad=True)
81
+ out = wp.array([0] * wp._src.types.type_size(data_type), dtype=data_type, device=device, requires_grad=True)
82
82
 
83
83
  with wp.Tape() as tape:
84
84
  wp.launch(kernel, dim=1, inputs=[a, b, t, out], device=device)