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
warp/native/spatial.h ADDED
@@ -0,0 +1,657 @@
1
+ /*
2
+ * SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ namespace wp
21
+ {
22
+
23
+ //---------------------------------------------------------------------------------
24
+ // Represents a twist in se(3)
25
+ template <typename Type>
26
+ using spatial_vector_t = vec_t<6,Type>;
27
+
28
+ template<typename Type>
29
+ CUDA_CALLABLE inline Type spatial_dot(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b)
30
+ {
31
+ return dot(a, b);
32
+ }
33
+
34
+ template<typename Type>
35
+ CUDA_CALLABLE inline vec_t<3,Type> &w_vec( spatial_vector_t<Type>& a )
36
+ {
37
+ return *(vec_t<3,Type>*)(&a);
38
+ }
39
+
40
+ template<typename Type>
41
+ CUDA_CALLABLE inline vec_t<3,Type> &v_vec( spatial_vector_t<Type>& a )
42
+ {
43
+ return *(vec_t<3,Type>*)(&a.c[3]);
44
+ }
45
+
46
+ template<typename Type>
47
+ CUDA_CALLABLE inline const vec_t<3,Type> &w_vec( const spatial_vector_t<Type>& a )
48
+ {
49
+ spatial_vector_t<Type> &non_const_vec = *(spatial_vector_t<Type>*)(const_cast<Type*>(&a.c[0]));
50
+ return w_vec(non_const_vec);
51
+ }
52
+
53
+ template<typename Type>
54
+ CUDA_CALLABLE inline const vec_t<3,Type> &v_vec( const spatial_vector_t<Type>& a )
55
+ {
56
+ spatial_vector_t<Type> &non_const_vec = *(spatial_vector_t<Type>*)(const_cast<Type*>(&a.c[0]));
57
+ return v_vec(non_const_vec);
58
+ }
59
+
60
+ template<typename Type>
61
+ CUDA_CALLABLE inline spatial_vector_t<Type> spatial_cross(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b)
62
+ {
63
+ vec_t<3,Type> w = cross(w_vec(a), w_vec(b));
64
+ vec_t<3,Type> v = cross(v_vec(a), w_vec(b)) + cross(w_vec(a), v_vec(b));
65
+
66
+ return spatial_vector_t<Type>({w[0], w[1], w[2], v[0], v[1], v[2]});
67
+ }
68
+
69
+ template<typename Type>
70
+ CUDA_CALLABLE inline spatial_vector_t<Type> spatial_cross_dual(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b)
71
+ {
72
+ vec_t<3,Type> w = cross(w_vec(a), w_vec(b)) + cross(v_vec(a), v_vec(b));
73
+ vec_t<3,Type> v = cross(w_vec(a), v_vec(b));
74
+
75
+ return spatial_vector_t<Type>({w[0], w[1], w[2], v[0], v[1], v[2]});
76
+ }
77
+
78
+ template<typename Type>
79
+ CUDA_CALLABLE inline vec_t<3,Type> spatial_top(const spatial_vector_t<Type>& a)
80
+ {
81
+ return w_vec(a);
82
+ }
83
+
84
+ template<typename Type>
85
+ CUDA_CALLABLE inline vec_t<3,Type> spatial_bottom(const spatial_vector_t<Type>& a)
86
+ {
87
+ return v_vec(a);
88
+ }
89
+
90
+ template<typename Type>
91
+ CUDA_CALLABLE inline void adj_spatial_dot(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b, spatial_vector_t<Type>& adj_a, spatial_vector_t<Type>& adj_b, const Type& adj_ret)
92
+ {
93
+ adj_dot(a, b, adj_a, adj_b, adj_ret);
94
+ }
95
+
96
+ template<typename Type>
97
+ CUDA_CALLABLE inline void adj_spatial_cross(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b, spatial_vector_t<Type>& adj_a, spatial_vector_t<Type>& adj_b, const spatial_vector_t<Type>& adj_ret)
98
+ {
99
+ adj_cross(w_vec(a), w_vec(b), w_vec(adj_a), w_vec(adj_b), w_vec(adj_ret));
100
+
101
+ adj_cross(v_vec(a), w_vec(b), v_vec(adj_a), w_vec(adj_b), v_vec(adj_ret));
102
+ adj_cross(w_vec(a), v_vec(b), w_vec(adj_a), v_vec(adj_b), v_vec(adj_ret));
103
+ }
104
+
105
+ template<typename Type>
106
+ CUDA_CALLABLE inline void adj_spatial_cross_dual(const spatial_vector_t<Type>& a, const spatial_vector_t<Type>& b, spatial_vector_t<Type>& adj_a, spatial_vector_t<Type>& adj_b, const spatial_vector_t<Type>& adj_ret)
107
+ {
108
+ adj_cross(w_vec(a), w_vec(b), w_vec(adj_a), w_vec(adj_b), w_vec(adj_ret));
109
+ adj_cross(v_vec(a), v_vec(b), v_vec(adj_a), v_vec(adj_b), w_vec(adj_ret));
110
+
111
+ adj_cross(w_vec(a), v_vec(b), w_vec(adj_a), v_vec(adj_b), v_vec(adj_ret));
112
+ }
113
+
114
+ template<typename Type>
115
+ CUDA_CALLABLE inline void adj_spatial_top(const spatial_vector_t<Type>& a, spatial_vector_t<Type>& adj_a, const vec_t<3,Type>& adj_ret)
116
+ {
117
+ w_vec(adj_a) += adj_ret;
118
+ }
119
+
120
+ template<typename Type>
121
+ CUDA_CALLABLE inline void adj_spatial_bottom(const spatial_vector_t<Type>& a, spatial_vector_t<Type>& adj_a, const vec_t<3,Type>& adj_ret)
122
+ {
123
+ v_vec(adj_a) += adj_ret;
124
+ }
125
+
126
+
127
+ //---------------------------------------------------------------------------------
128
+ // Represents a rigid body transform<Type>ation
129
+
130
+ template<typename Type>
131
+ struct transform_t
132
+ {
133
+ vec_t<3,Type> p;
134
+ quat_t<Type> q;
135
+
136
+ CUDA_CALLABLE inline transform_t(vec_t<3,Type> p=vec_t<3,Type>(), quat_t<Type> q=quat_t<Type>()) : p(p), q(q) {}
137
+ CUDA_CALLABLE inline transform_t(Type) {} // helps uniform initialization
138
+
139
+ CUDA_CALLABLE inline transform_t(const initializer_array<7, Type> &l)
140
+ {
141
+ p = vec_t<3,Type>(l[0], l[1], l[2]);
142
+ q = quat_t<Type>(l[3], l[4], l[5], l[6]);
143
+ }
144
+
145
+ CUDA_CALLABLE inline Type operator[](int index) const
146
+ {
147
+ assert(index < 7);
148
+
149
+ return p.c[index];
150
+ }
151
+
152
+ CUDA_CALLABLE inline Type& operator[](int index)
153
+ {
154
+ assert(index < 7);
155
+
156
+ return p.c[index];
157
+ }
158
+ };
159
+
160
+ template<typename Type=float32>
161
+ CUDA_CALLABLE inline transform_t<Type> transform_identity()
162
+ {
163
+ return transform_t<Type>(vec_t<3,Type>(), quat_identity<Type>());
164
+ }
165
+
166
+ template<typename Type>
167
+ inline CUDA_CALLABLE bool operator==(const transform_t<Type>& a, const transform_t<Type>& b)
168
+ {
169
+ return a.p == b.p && a.q == b.q;
170
+ }
171
+
172
+
173
+ template<typename Type>
174
+ inline bool CUDA_CALLABLE isfinite(const transform_t<Type>& t)
175
+ {
176
+ return isfinite(t.p) && isfinite(t.q);
177
+ }
178
+
179
+ template<typename Type>
180
+ CUDA_CALLABLE inline vec_t<3,Type> transform_get_translation(const transform_t<Type>& t)
181
+ {
182
+ return t.p;
183
+ }
184
+
185
+ template<typename Type>
186
+ CUDA_CALLABLE inline quat_t<Type> transform_get_rotation(const transform_t<Type>& t)
187
+ {
188
+ return t.q;
189
+ }
190
+
191
+ template<typename Type>
192
+ CUDA_CALLABLE inline transform_t<Type> transform_multiply(const transform_t<Type>& a, const transform_t<Type>& b)
193
+ {
194
+ return { quat_rotate(a.q, b.p) + a.p, mul(a.q, b.q) };
195
+ }
196
+
197
+ template<typename Type>
198
+ CUDA_CALLABLE inline void adj_transform_multiply(const transform_t<Type>& a, const transform_t<Type>& b, transform_t<Type>& adj_a, transform_t<Type>& adj_b, const transform_t<Type>& adj_ret)
199
+ {
200
+ // translational part
201
+ adj_quat_rotate(a.q, b.p, adj_a.q, adj_b.p, adj_ret.p);
202
+ adj_a.p += adj_ret.p;
203
+
204
+ // rotational part
205
+ adj_mul(a.q, b.q, adj_a.q, adj_b.q, adj_ret.q);
206
+ }
207
+
208
+
209
+ template<typename Type>
210
+ CUDA_CALLABLE inline transform_t<Type> transform_inverse(const transform_t<Type>& t)
211
+ {
212
+ quat_t<Type> q_inv = quat_inverse(t.q);
213
+ return transform_t<Type>(-quat_rotate(q_inv, t.p), q_inv);
214
+ }
215
+
216
+
217
+ template<typename Type>
218
+ CUDA_CALLABLE inline vec_t<3,Type> transform_vector(const transform_t<Type>& t, const vec_t<3,Type>& x)
219
+ {
220
+ return quat_rotate(t.q, x);
221
+ }
222
+
223
+ template<typename Type>
224
+ CUDA_CALLABLE inline vec_t<3,Type> transform_point(const transform_t<Type>& t, const vec_t<3,Type>& x)
225
+ {
226
+ return t.p + quat_rotate(t.q, x);
227
+ }
228
+
229
+ // not totally sure why you'd want to do this seeing as adding/subtracting two rotation
230
+ // quats doesn't seem to do anything meaningful
231
+ template<typename Type>
232
+ CUDA_CALLABLE inline transform_t<Type> add(const transform_t<Type>& a, const transform_t<Type>& b)
233
+ {
234
+ return { a.p + b.p, a.q + b.q };
235
+ }
236
+
237
+ template<typename Type>
238
+ CUDA_CALLABLE inline transform_t<Type> sub(const transform_t<Type>& a, const transform_t<Type>& b)
239
+ {
240
+ return { a.p - b.p, a.q - b.q };
241
+ }
242
+
243
+ // also not sure why you'd want to do this seeing as the quat would end up unnormalized
244
+ template<typename Type>
245
+ CUDA_CALLABLE inline transform_t<Type> mul(const transform_t<Type>& a, Type s)
246
+ {
247
+ return { a.p*s, a.q*s };
248
+ }
249
+
250
+ template<typename Type>
251
+ CUDA_CALLABLE inline transform_t<Type> mul(Type s, const transform_t<Type>& a)
252
+ {
253
+ return mul(a, s);
254
+ }
255
+
256
+ template<typename Type>
257
+ CUDA_CALLABLE inline transform_t<Type> mul(const transform_t<Type>& a, const transform_t<Type>& b)
258
+ {
259
+ return transform_multiply(a, b);
260
+ }
261
+
262
+ template<typename Type>
263
+ CUDA_CALLABLE inline transform_t<Type> operator*(const transform_t<Type>& a, Type s)
264
+ {
265
+ return mul(a, s);
266
+ }
267
+
268
+ template<typename Type>
269
+ CUDA_CALLABLE inline transform_t<Type> operator*(Type s, const transform_t<Type>& a)
270
+ {
271
+ return mul(a, s);
272
+ }
273
+
274
+
275
+ template<typename Type>
276
+ inline CUDA_CALLABLE Type tensordot(const transform_t<Type>& a, const transform_t<Type>& b)
277
+ {
278
+ // corresponds to `np.tensordot()` with all axes being contracted
279
+ return tensordot(a.p, b.p) + tensordot(a.q, b.q);
280
+ }
281
+
282
+ template<typename Type>
283
+ inline CUDA_CALLABLE Type extract(const transform_t<Type>& t, int i)
284
+ {
285
+ return t[i];
286
+ }
287
+
288
+ template<typename Type>
289
+ inline void CUDA_CALLABLE adj_extract(const transform_t<Type>& t, int i, transform_t<Type>& adj_t, int& adj_i, Type adj_ret)
290
+ {
291
+ adj_t[i] += adj_ret;
292
+ }
293
+
294
+
295
+ // adjoint methods
296
+ template<typename Type>
297
+ CUDA_CALLABLE inline void adj_add(const transform_t<Type>& a, const transform_t<Type>& b, transform_t<Type>& adj_a, transform_t<Type>& adj_b, const transform_t<Type>& adj_ret)
298
+ {
299
+ adj_add(a.p, b.p, adj_a.p, adj_b.p, adj_ret.p);
300
+ adj_add(a.q, b.q, adj_a.q, adj_b.q, adj_ret.q);
301
+ }
302
+
303
+ template<typename Type>
304
+ CUDA_CALLABLE inline void adj_sub(const transform_t<Type>& a, const transform_t<Type>& b, transform_t<Type>& adj_a, transform_t<Type>& adj_b, const transform_t<Type>& adj_ret)
305
+ {
306
+ adj_sub(a.p, b.p, adj_a.p, adj_b.p, adj_ret.p);
307
+ adj_sub(a.q, b.q, adj_a.q, adj_b.q, adj_ret.q);
308
+ }
309
+
310
+ template<typename Type>
311
+ CUDA_CALLABLE inline void adj_mul(const transform_t<Type>& a, Type s, transform_t<Type>& adj_a, Type& adj_s, const transform_t<Type>& adj_ret)
312
+ {
313
+ adj_mul(a.p, s, adj_a.p, adj_s, adj_ret.p);
314
+ adj_mul(a.q, s, adj_a.q, adj_s, adj_ret.q);
315
+ }
316
+
317
+ template<typename Type>
318
+ CUDA_CALLABLE inline void adj_mul(Type s, const transform_t<Type>& a, Type& adj_s, transform_t<Type>& adj_a, const transform_t<Type>& adj_ret)
319
+ {
320
+ adj_mul(a, s, adj_a, adj_s, adj_ret);
321
+ }
322
+
323
+ template<typename Type>
324
+ CUDA_CALLABLE inline void adj_mul(const transform_t<Type>& a, const transform_t<Type>& b, transform_t<Type>& adj_a, transform_t<Type>& adj_b, const transform_t<Type>& adj_ret)
325
+ {
326
+ adj_transform_multiply(a, b, adj_a, adj_b, adj_ret);
327
+ }
328
+
329
+
330
+ template<typename Type>
331
+ inline CUDA_CALLABLE transform_t<Type> atomic_add(transform_t<Type>* addr, const transform_t<Type>& value)
332
+ {
333
+ vec_t<3,Type> p = atomic_add(&addr->p, value.p);
334
+ quat_t<Type> q = atomic_add(&addr->q, value.q);
335
+
336
+ return transform_t<Type>(p, q);
337
+ }
338
+
339
+ template<typename Type>
340
+ CUDA_CALLABLE inline void adj_transform_t(const vec_t<3,Type>& p, const quat_t<Type>& q, vec_t<3,Type>& adj_p, quat_t<Type>& adj_q, const transform_t<Type>& adj_ret)
341
+ {
342
+ adj_p += adj_ret.p;
343
+ adj_q += adj_ret.q;
344
+ }
345
+
346
+ template<typename Type>
347
+ CUDA_CALLABLE inline void adj_transform_get_translation(const transform_t<Type>& t, transform_t<Type>& adj_t, const vec_t<3,Type>& adj_ret)
348
+ {
349
+ adj_t.p += adj_ret;
350
+ }
351
+
352
+ template<typename Type>
353
+ CUDA_CALLABLE inline void adj_transform_get_rotation(const transform_t<Type>& t, transform_t<Type>& adj_t, const quat_t<Type>& adj_ret)
354
+ {
355
+ adj_t.q += adj_ret;
356
+ }
357
+
358
+ template<typename Type>
359
+ CUDA_CALLABLE inline void adj_transform_inverse(const transform_t<Type>& t, transform_t<Type>& adj_t, const transform_t<Type>& adj_ret)
360
+ {
361
+
362
+ // forward
363
+ quat_t<Type> q_inv = quat_inverse(t.q);
364
+ vec_t<3,Type> p = quat_rotate(q_inv, t.p);
365
+ vec_t<3,Type> np = -p;
366
+ // transform<Type> t = transform<Type>(np, q_inv)
367
+
368
+ // backward
369
+ quat_t<Type> adj_q_inv(0.0f);
370
+ quat_t<Type> adj_q(0.0f);
371
+ vec_t<3,Type> adj_p(0.0f);
372
+ vec_t<3,Type> adj_np(0.0f);
373
+
374
+ adj_transform_t(np, q_inv, adj_np, adj_q_inv, adj_ret);
375
+ adj_p = -adj_np;
376
+ adj_quat_rotate(q_inv, t.p, adj_q_inv, adj_t.p, adj_p);
377
+ adj_quat_inverse(t.q, adj_t.q, adj_q_inv);
378
+
379
+ }
380
+
381
+ template<typename Type>
382
+ CUDA_CALLABLE inline void adj_transform_vector(const transform_t<Type>& t, const vec_t<3,Type>& x, transform_t<Type>& adj_t, vec_t<3,Type>& adj_x, const vec_t<3,Type>& adj_ret)
383
+ {
384
+ adj_quat_rotate(t.q, x, adj_t.q, adj_x, adj_ret);
385
+ }
386
+
387
+ template<typename Type>
388
+ CUDA_CALLABLE inline void adj_transform_point(const transform_t<Type>& t, const vec_t<3,Type>& x, transform_t<Type>& adj_t, vec_t<3,Type>& adj_x, const vec_t<3,Type>& adj_ret)
389
+ {
390
+ adj_quat_rotate(t.q, x, adj_t.q, adj_x, adj_ret);
391
+ adj_t.p += adj_ret;
392
+ }
393
+
394
+
395
+ template<typename Type>
396
+ CUDA_CALLABLE void print(transform_t<Type> t);
397
+
398
+ template<typename Type>
399
+ CUDA_CALLABLE inline transform_t<Type> lerp(const transform_t<Type>& a, const transform_t<Type>& b, Type t)
400
+ {
401
+ return a*(Type(1)-t) + b*t;
402
+ }
403
+
404
+ template<typename Type>
405
+ CUDA_CALLABLE inline void adj_lerp(const transform_t<Type>& a, const transform_t<Type>& b, Type t, transform_t<Type>& adj_a, transform_t<Type>& adj_b, Type& adj_t, const transform_t<Type>& adj_ret)
406
+ {
407
+ adj_a += adj_ret*(Type(1)-t);
408
+ adj_b += adj_ret*t;
409
+ adj_t += tensordot(b, adj_ret) - tensordot(a, adj_ret);
410
+ }
411
+
412
+ template<typename Type>
413
+ CUDA_CALLABLE inline int len(const transform_t<Type>& t)
414
+ {
415
+ return 7;
416
+ }
417
+
418
+ template<typename Type>
419
+ CUDA_CALLABLE inline void adj_len(const transform_t<Type>& t, transform_t<Type>& adj_t, const int& adj_ret)
420
+ {
421
+ }
422
+
423
+ template<typename Type>
424
+ using spatial_matrix_t = mat_t<6,6,Type>;
425
+
426
+ template<typename Type>
427
+ inline CUDA_CALLABLE spatial_matrix_t<Type> spatial_adjoint(const mat_t<3,3,Type>& R, const mat_t<3,3,Type>& S)
428
+ {
429
+ spatial_matrix_t<Type> adT;
430
+
431
+ // T = [Rah, 0]
432
+ // [S R]
433
+
434
+ // diagonal blocks
435
+ for (int i=0; i < 3; ++i)
436
+ {
437
+ for (int j=0; j < 3; ++j)
438
+ {
439
+ adT.data[i][j] = R.data[i][j];
440
+ adT.data[i+3][j+3] = R.data[i][j];
441
+ }
442
+ }
443
+
444
+ // lower off diagonal
445
+ for (int i=0; i < 3; ++i)
446
+ {
447
+ for (int j=0; j < 3; ++j)
448
+ {
449
+ adT.data[i+3][j] = S.data[i][j];
450
+ }
451
+ }
452
+
453
+ return adT;
454
+ }
455
+
456
+ template<typename Type>
457
+ inline CUDA_CALLABLE void adj_spatial_adjoint(const mat_t<3,3,Type>& R, const mat_t<3,3,Type>& S, mat_t<3,3,Type>& adj_R, mat_t<3,3,Type>& adj_S, const spatial_matrix_t<Type>& adj_ret)
458
+ {
459
+ // diagonal blocks
460
+ for (int i=0; i < 3; ++i)
461
+ {
462
+ for (int j=0; j < 3; ++j)
463
+ {
464
+ adj_R.data[i][j] += adj_ret.data[i][j];
465
+ adj_R.data[i][j] += adj_ret.data[i+3][j+3];
466
+ }
467
+ }
468
+
469
+ // lower off diagonal
470
+ for (int i=0; i < 3; ++i)
471
+ {
472
+ for (int j=0; j < 3; ++j)
473
+ {
474
+ adj_S.data[i][j] += adj_ret.data[i+3][j];
475
+ }
476
+ }
477
+ }
478
+
479
+
480
+ CUDA_CALLABLE inline int row_index(int stride, int i, int j)
481
+ {
482
+ return i*stride + j;
483
+ }
484
+
485
+ // builds spatial Jacobian J which is an (joint_count*6)x(dof_count) matrix
486
+ template<typename Type>
487
+ CUDA_CALLABLE inline void spatial_jacobian(
488
+ const spatial_vector_t<Type>* S,
489
+ const int* joint_parents,
490
+ const int* joint_qd_start,
491
+ int joint_start, // offset of the first joint for the articulation
492
+ int joint_count,
493
+ int J_start,
494
+ Type* J)
495
+ {
496
+ const int articulation_dof_start = joint_qd_start[joint_start];
497
+ const int articulation_dof_end = joint_qd_start[joint_start + joint_count];
498
+ const int articulation_dof_count = articulation_dof_end-articulation_dof_start;
499
+
500
+ // shift output pointers
501
+ const int S_start = articulation_dof_start;
502
+
503
+ S += S_start;
504
+ J += J_start;
505
+
506
+ for (int i=0; i < joint_count; ++i)
507
+ {
508
+ const int row_start = i * 6;
509
+
510
+ int j = joint_start + i;
511
+ while (j != -1)
512
+ {
513
+ const int joint_dof_start = joint_qd_start[j];
514
+ const int joint_dof_end = joint_qd_start[j+1];
515
+ const int joint_dof_count = joint_dof_end-joint_dof_start;
516
+
517
+ // fill out each row of the Jacobian walking up the tree
518
+ //for (int col=dof_start; col < dof_end; ++col)
519
+ for (int dof=0; dof < joint_dof_count; ++dof)
520
+ {
521
+ const int col = (joint_dof_start-articulation_dof_start) + dof;
522
+
523
+ J[row_index(articulation_dof_count, row_start+0, col)] = S[col].w[0];
524
+ J[row_index(articulation_dof_count, row_start+1, col)] = S[col].w[1];
525
+ J[row_index(articulation_dof_count, row_start+2, col)] = S[col].w[2];
526
+ J[row_index(articulation_dof_count, row_start+3, col)] = S[col].v[0];
527
+ J[row_index(articulation_dof_count, row_start+4, col)] = S[col].v[1];
528
+ J[row_index(articulation_dof_count, row_start+5, col)] = S[col].v[2];
529
+ }
530
+
531
+ j = joint_parents[j];
532
+ }
533
+ }
534
+ }
535
+
536
+ template<typename Type>
537
+ CUDA_CALLABLE inline void adj_spatial_jacobian(
538
+ const spatial_vector_t<Type>* S,
539
+ const int* joint_parents,
540
+ const int* joint_qd_start,
541
+ const int joint_start,
542
+ const int joint_count,
543
+ const int J_start,
544
+ const Type* J,
545
+ // adjs
546
+ spatial_vector_t<Type>* adj_S,
547
+ int* adj_joint_parents,
548
+ int* adj_joint_qd_start,
549
+ int& adj_joint_start,
550
+ int& adj_joint_count,
551
+ int& adj_J_start,
552
+ const Type* adj_J)
553
+ {
554
+ const int articulation_dof_start = joint_qd_start[joint_start];
555
+ const int articulation_dof_end = joint_qd_start[joint_start + joint_count];
556
+ const int articulation_dof_count = articulation_dof_end-articulation_dof_start;
557
+
558
+ // shift output pointers
559
+ const int S_start = articulation_dof_start;
560
+
561
+ S += S_start;
562
+ J += J_start;
563
+
564
+ adj_S += S_start;
565
+ adj_J += J_start;
566
+
567
+ for (int i=0; i < joint_count; ++i)
568
+ {
569
+ const int row_start = i * 6;
570
+
571
+ int j = joint_start + i;
572
+ while (j != -1)
573
+ {
574
+ const int joint_dof_start = joint_qd_start[j];
575
+ const int joint_dof_end = joint_qd_start[j+1];
576
+ const int joint_dof_count = joint_dof_end-joint_dof_start;
577
+
578
+ // fill out each row of the Jacobian walking up the tree
579
+ //for (int col=dof_start; col < dof_end; ++col)
580
+ for (int dof=0; dof < joint_dof_count; ++dof)
581
+ {
582
+ const int col = (joint_dof_start-articulation_dof_start) + dof;
583
+
584
+ adj_S[col].w[0] += adj_J[row_index(articulation_dof_count, row_start+0, col)];
585
+ adj_S[col].w[1] += adj_J[row_index(articulation_dof_count, row_start+1, col)];
586
+ adj_S[col].w[2] += adj_J[row_index(articulation_dof_count, row_start+2, col)];
587
+ adj_S[col].v[0] += adj_J[row_index(articulation_dof_count, row_start+3, col)];
588
+ adj_S[col].v[1] += adj_J[row_index(articulation_dof_count, row_start+4, col)];
589
+ adj_S[col].v[2] += adj_J[row_index(articulation_dof_count, row_start+5, col)];
590
+ }
591
+
592
+ j = joint_parents[j];
593
+ }
594
+ }
595
+ }
596
+
597
+
598
+ template<typename Type>
599
+ CUDA_CALLABLE inline void spatial_mass(const spatial_matrix_t<Type>* I_s, int joint_start, int joint_count, int M_start, Type* M)
600
+ {
601
+ const int stride = joint_count*6;
602
+
603
+ for (int l=0; l < joint_count; ++l)
604
+ {
605
+ for (int i=0; i < 6; ++i)
606
+ {
607
+ for (int j=0; j < 6; ++j)
608
+ {
609
+ M[M_start + row_index(stride, l*6 + i, l*6 + j)] = I_s[joint_start + l].data[i][j];
610
+ }
611
+ }
612
+ }
613
+ }
614
+
615
+ template<typename Type>
616
+ CUDA_CALLABLE inline void adj_spatial_mass(
617
+ const spatial_matrix_t<Type>* I_s,
618
+ const int joint_start,
619
+ const int joint_count,
620
+ const int M_start,
621
+ const Type* M,
622
+ spatial_matrix_t<Type>* adj_I_s,
623
+ int& adj_joint_start,
624
+ int& adj_joint_count,
625
+ int& adj_M_start,
626
+ const Type* adj_M)
627
+ {
628
+ const int stride = joint_count*6;
629
+
630
+ for (int l=0; l < joint_count; ++l)
631
+ {
632
+ for (int i=0; i < 6; ++i)
633
+ {
634
+ for (int j=0; j < 6; ++j)
635
+ {
636
+ adj_I_s[joint_start + l].data[i][j] += adj_M[M_start + row_index(stride, l*6 + i, l*6 + j)];
637
+ }
638
+ }
639
+ }
640
+ }
641
+
642
+ using transform = transform_t<float>;
643
+ using transformh = transform_t<half>;
644
+ using transformf = transform_t<float>;
645
+ using transformd = transform_t<double>;
646
+
647
+ using spatial_vector = spatial_vector_t<float>;
648
+ using spatial_vectorh = spatial_vector_t<half>;
649
+ using spatial_vectorf = spatial_vector_t<float>;
650
+ using spatial_vectord = spatial_vector_t<double>;
651
+
652
+ using spatial_matrix = spatial_matrix_t<float>;
653
+ using spatial_matrixh = spatial_matrix_t<half>;
654
+ using spatial_matrixf = spatial_matrix_t<float>;
655
+ using spatial_matrixd = spatial_matrix_t<double>;
656
+
657
+ } // namespace wp