warp-lang 1.10.0__py3-none-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of warp-lang might be problematic. Click here for more details.

Files changed (468) hide show
  1. warp/__init__.py +334 -0
  2. warp/__init__.pyi +5856 -0
  3. warp/_src/__init__.py +14 -0
  4. warp/_src/autograd.py +1077 -0
  5. warp/_src/build.py +620 -0
  6. warp/_src/build_dll.py +642 -0
  7. warp/_src/builtins.py +10555 -0
  8. warp/_src/codegen.py +4361 -0
  9. warp/_src/config.py +178 -0
  10. warp/_src/constants.py +59 -0
  11. warp/_src/context.py +8352 -0
  12. warp/_src/dlpack.py +464 -0
  13. warp/_src/fabric.py +362 -0
  14. warp/_src/fem/__init__.py +14 -0
  15. warp/_src/fem/adaptivity.py +510 -0
  16. warp/_src/fem/cache.py +689 -0
  17. warp/_src/fem/dirichlet.py +190 -0
  18. warp/_src/fem/domain.py +553 -0
  19. warp/_src/fem/field/__init__.py +131 -0
  20. warp/_src/fem/field/field.py +703 -0
  21. warp/_src/fem/field/nodal_field.py +403 -0
  22. warp/_src/fem/field/restriction.py +39 -0
  23. warp/_src/fem/field/virtual.py +1021 -0
  24. warp/_src/fem/geometry/__init__.py +32 -0
  25. warp/_src/fem/geometry/adaptive_nanogrid.py +782 -0
  26. warp/_src/fem/geometry/closest_point.py +99 -0
  27. warp/_src/fem/geometry/deformed_geometry.py +277 -0
  28. warp/_src/fem/geometry/element.py +854 -0
  29. warp/_src/fem/geometry/geometry.py +693 -0
  30. warp/_src/fem/geometry/grid_2d.py +478 -0
  31. warp/_src/fem/geometry/grid_3d.py +539 -0
  32. warp/_src/fem/geometry/hexmesh.py +956 -0
  33. warp/_src/fem/geometry/nanogrid.py +660 -0
  34. warp/_src/fem/geometry/partition.py +483 -0
  35. warp/_src/fem/geometry/quadmesh.py +597 -0
  36. warp/_src/fem/geometry/tetmesh.py +762 -0
  37. warp/_src/fem/geometry/trimesh.py +588 -0
  38. warp/_src/fem/integrate.py +2507 -0
  39. warp/_src/fem/linalg.py +385 -0
  40. warp/_src/fem/operator.py +398 -0
  41. warp/_src/fem/polynomial.py +231 -0
  42. warp/_src/fem/quadrature/__init__.py +17 -0
  43. warp/_src/fem/quadrature/pic_quadrature.py +318 -0
  44. warp/_src/fem/quadrature/quadrature.py +665 -0
  45. warp/_src/fem/space/__init__.py +248 -0
  46. warp/_src/fem/space/basis_function_space.py +499 -0
  47. warp/_src/fem/space/basis_space.py +681 -0
  48. warp/_src/fem/space/dof_mapper.py +253 -0
  49. warp/_src/fem/space/function_space.py +312 -0
  50. warp/_src/fem/space/grid_2d_function_space.py +179 -0
  51. warp/_src/fem/space/grid_3d_function_space.py +229 -0
  52. warp/_src/fem/space/hexmesh_function_space.py +255 -0
  53. warp/_src/fem/space/nanogrid_function_space.py +199 -0
  54. warp/_src/fem/space/partition.py +435 -0
  55. warp/_src/fem/space/quadmesh_function_space.py +222 -0
  56. warp/_src/fem/space/restriction.py +221 -0
  57. warp/_src/fem/space/shape/__init__.py +152 -0
  58. warp/_src/fem/space/shape/cube_shape_function.py +1107 -0
  59. warp/_src/fem/space/shape/shape_function.py +134 -0
  60. warp/_src/fem/space/shape/square_shape_function.py +928 -0
  61. warp/_src/fem/space/shape/tet_shape_function.py +829 -0
  62. warp/_src/fem/space/shape/triangle_shape_function.py +674 -0
  63. warp/_src/fem/space/tetmesh_function_space.py +270 -0
  64. warp/_src/fem/space/topology.py +461 -0
  65. warp/_src/fem/space/trimesh_function_space.py +193 -0
  66. warp/_src/fem/types.py +114 -0
  67. warp/_src/fem/utils.py +488 -0
  68. warp/_src/jax.py +188 -0
  69. warp/_src/jax_experimental/__init__.py +14 -0
  70. warp/_src/jax_experimental/custom_call.py +389 -0
  71. warp/_src/jax_experimental/ffi.py +1286 -0
  72. warp/_src/jax_experimental/xla_ffi.py +658 -0
  73. warp/_src/marching_cubes.py +710 -0
  74. warp/_src/math.py +416 -0
  75. warp/_src/optim/__init__.py +14 -0
  76. warp/_src/optim/adam.py +165 -0
  77. warp/_src/optim/linear.py +1608 -0
  78. warp/_src/optim/sgd.py +114 -0
  79. warp/_src/paddle.py +408 -0
  80. warp/_src/render/__init__.py +14 -0
  81. warp/_src/render/imgui_manager.py +291 -0
  82. warp/_src/render/render_opengl.py +3638 -0
  83. warp/_src/render/render_usd.py +939 -0
  84. warp/_src/render/utils.py +162 -0
  85. warp/_src/sparse.py +2718 -0
  86. warp/_src/tape.py +1208 -0
  87. warp/_src/thirdparty/__init__.py +0 -0
  88. warp/_src/thirdparty/appdirs.py +598 -0
  89. warp/_src/thirdparty/dlpack.py +145 -0
  90. warp/_src/thirdparty/unittest_parallel.py +676 -0
  91. warp/_src/torch.py +393 -0
  92. warp/_src/types.py +5888 -0
  93. warp/_src/utils.py +1695 -0
  94. warp/autograd.py +33 -0
  95. warp/bin/libwarp-clang.dylib +0 -0
  96. warp/bin/libwarp.dylib +0 -0
  97. warp/build.py +29 -0
  98. warp/build_dll.py +24 -0
  99. warp/codegen.py +24 -0
  100. warp/constants.py +24 -0
  101. warp/context.py +33 -0
  102. warp/dlpack.py +24 -0
  103. warp/examples/__init__.py +24 -0
  104. warp/examples/assets/bear.usd +0 -0
  105. warp/examples/assets/bunny.usd +0 -0
  106. warp/examples/assets/cube.usd +0 -0
  107. warp/examples/assets/nonuniform.usd +0 -0
  108. warp/examples/assets/nvidia_logo.png +0 -0
  109. warp/examples/assets/pixel.jpg +0 -0
  110. warp/examples/assets/rocks.nvdb +0 -0
  111. warp/examples/assets/rocks.usd +0 -0
  112. warp/examples/assets/sphere.usd +0 -0
  113. warp/examples/assets/square_cloth.usd +0 -0
  114. warp/examples/benchmarks/benchmark_api.py +389 -0
  115. warp/examples/benchmarks/benchmark_cloth.py +296 -0
  116. warp/examples/benchmarks/benchmark_cloth_cupy.py +96 -0
  117. warp/examples/benchmarks/benchmark_cloth_jax.py +105 -0
  118. warp/examples/benchmarks/benchmark_cloth_numba.py +161 -0
  119. warp/examples/benchmarks/benchmark_cloth_numpy.py +85 -0
  120. warp/examples/benchmarks/benchmark_cloth_paddle.py +94 -0
  121. warp/examples/benchmarks/benchmark_cloth_pytorch.py +94 -0
  122. warp/examples/benchmarks/benchmark_cloth_taichi.py +120 -0
  123. warp/examples/benchmarks/benchmark_cloth_warp.py +153 -0
  124. warp/examples/benchmarks/benchmark_gemm.py +164 -0
  125. warp/examples/benchmarks/benchmark_interop_paddle.py +166 -0
  126. warp/examples/benchmarks/benchmark_interop_torch.py +166 -0
  127. warp/examples/benchmarks/benchmark_launches.py +301 -0
  128. warp/examples/benchmarks/benchmark_tile_load_store.py +103 -0
  129. warp/examples/benchmarks/benchmark_tile_sort.py +155 -0
  130. warp/examples/browse.py +37 -0
  131. warp/examples/core/example_cupy.py +86 -0
  132. warp/examples/core/example_dem.py +241 -0
  133. warp/examples/core/example_fluid.py +299 -0
  134. warp/examples/core/example_graph_capture.py +150 -0
  135. warp/examples/core/example_marching_cubes.py +195 -0
  136. warp/examples/core/example_mesh.py +180 -0
  137. warp/examples/core/example_mesh_intersect.py +211 -0
  138. warp/examples/core/example_nvdb.py +182 -0
  139. warp/examples/core/example_raycast.py +111 -0
  140. warp/examples/core/example_raymarch.py +205 -0
  141. warp/examples/core/example_render_opengl.py +290 -0
  142. warp/examples/core/example_sample_mesh.py +300 -0
  143. warp/examples/core/example_sph.py +411 -0
  144. warp/examples/core/example_spin_lock.py +93 -0
  145. warp/examples/core/example_torch.py +211 -0
  146. warp/examples/core/example_wave.py +269 -0
  147. warp/examples/core/example_work_queue.py +118 -0
  148. warp/examples/distributed/example_jacobi_mpi.py +506 -0
  149. warp/examples/fem/example_adaptive_grid.py +286 -0
  150. warp/examples/fem/example_apic_fluid.py +469 -0
  151. warp/examples/fem/example_burgers.py +261 -0
  152. warp/examples/fem/example_convection_diffusion.py +181 -0
  153. warp/examples/fem/example_convection_diffusion_dg.py +225 -0
  154. warp/examples/fem/example_darcy_ls_optimization.py +489 -0
  155. warp/examples/fem/example_deformed_geometry.py +172 -0
  156. warp/examples/fem/example_diffusion.py +196 -0
  157. warp/examples/fem/example_diffusion_3d.py +225 -0
  158. warp/examples/fem/example_diffusion_mgpu.py +225 -0
  159. warp/examples/fem/example_distortion_energy.py +228 -0
  160. warp/examples/fem/example_elastic_shape_optimization.py +387 -0
  161. warp/examples/fem/example_magnetostatics.py +242 -0
  162. warp/examples/fem/example_mixed_elasticity.py +293 -0
  163. warp/examples/fem/example_navier_stokes.py +263 -0
  164. warp/examples/fem/example_nonconforming_contact.py +300 -0
  165. warp/examples/fem/example_stokes.py +213 -0
  166. warp/examples/fem/example_stokes_transfer.py +262 -0
  167. warp/examples/fem/example_streamlines.py +357 -0
  168. warp/examples/fem/utils.py +1047 -0
  169. warp/examples/interop/example_jax_callable.py +146 -0
  170. warp/examples/interop/example_jax_ffi_callback.py +132 -0
  171. warp/examples/interop/example_jax_kernel.py +232 -0
  172. warp/examples/optim/example_diffray.py +561 -0
  173. warp/examples/optim/example_fluid_checkpoint.py +497 -0
  174. warp/examples/tile/example_tile_block_cholesky.py +502 -0
  175. warp/examples/tile/example_tile_cholesky.py +88 -0
  176. warp/examples/tile/example_tile_convolution.py +66 -0
  177. warp/examples/tile/example_tile_fft.py +55 -0
  178. warp/examples/tile/example_tile_filtering.py +113 -0
  179. warp/examples/tile/example_tile_matmul.py +85 -0
  180. warp/examples/tile/example_tile_mcgp.py +191 -0
  181. warp/examples/tile/example_tile_mlp.py +385 -0
  182. warp/examples/tile/example_tile_nbody.py +199 -0
  183. warp/fabric.py +24 -0
  184. warp/fem/__init__.py +173 -0
  185. warp/fem/adaptivity.py +26 -0
  186. warp/fem/cache.py +30 -0
  187. warp/fem/dirichlet.py +24 -0
  188. warp/fem/field/__init__.py +24 -0
  189. warp/fem/field/field.py +26 -0
  190. warp/fem/geometry/__init__.py +21 -0
  191. warp/fem/geometry/closest_point.py +31 -0
  192. warp/fem/linalg.py +38 -0
  193. warp/fem/operator.py +32 -0
  194. warp/fem/polynomial.py +29 -0
  195. warp/fem/space/__init__.py +22 -0
  196. warp/fem/space/basis_space.py +24 -0
  197. warp/fem/space/shape/__init__.py +68 -0
  198. warp/fem/space/topology.py +24 -0
  199. warp/fem/types.py +24 -0
  200. warp/fem/utils.py +32 -0
  201. warp/jax.py +29 -0
  202. warp/jax_experimental/__init__.py +29 -0
  203. warp/jax_experimental/custom_call.py +29 -0
  204. warp/jax_experimental/ffi.py +39 -0
  205. warp/jax_experimental/xla_ffi.py +24 -0
  206. warp/marching_cubes.py +24 -0
  207. warp/math.py +37 -0
  208. warp/native/array.h +1687 -0
  209. warp/native/builtin.h +2327 -0
  210. warp/native/bvh.cpp +562 -0
  211. warp/native/bvh.cu +826 -0
  212. warp/native/bvh.h +555 -0
  213. warp/native/clang/clang.cpp +541 -0
  214. warp/native/coloring.cpp +622 -0
  215. warp/native/crt.cpp +51 -0
  216. warp/native/crt.h +568 -0
  217. warp/native/cuda_crt.h +1058 -0
  218. warp/native/cuda_util.cpp +677 -0
  219. warp/native/cuda_util.h +313 -0
  220. warp/native/error.cpp +77 -0
  221. warp/native/error.h +36 -0
  222. warp/native/exports.h +2023 -0
  223. warp/native/fabric.h +246 -0
  224. warp/native/hashgrid.cpp +311 -0
  225. warp/native/hashgrid.cu +89 -0
  226. warp/native/hashgrid.h +240 -0
  227. warp/native/initializer_array.h +41 -0
  228. warp/native/intersect.h +1253 -0
  229. warp/native/intersect_adj.h +375 -0
  230. warp/native/intersect_tri.h +348 -0
  231. warp/native/mat.h +5189 -0
  232. warp/native/mathdx.cpp +93 -0
  233. warp/native/matnn.h +221 -0
  234. warp/native/mesh.cpp +266 -0
  235. warp/native/mesh.cu +406 -0
  236. warp/native/mesh.h +2097 -0
  237. warp/native/nanovdb/GridHandle.h +533 -0
  238. warp/native/nanovdb/HostBuffer.h +591 -0
  239. warp/native/nanovdb/NanoVDB.h +6246 -0
  240. warp/native/nanovdb/NodeManager.h +323 -0
  241. warp/native/nanovdb/PNanoVDB.h +3390 -0
  242. warp/native/noise.h +859 -0
  243. warp/native/quat.h +1664 -0
  244. warp/native/rand.h +342 -0
  245. warp/native/range.h +145 -0
  246. warp/native/reduce.cpp +174 -0
  247. warp/native/reduce.cu +363 -0
  248. warp/native/runlength_encode.cpp +79 -0
  249. warp/native/runlength_encode.cu +61 -0
  250. warp/native/scan.cpp +47 -0
  251. warp/native/scan.cu +55 -0
  252. warp/native/scan.h +23 -0
  253. warp/native/solid_angle.h +466 -0
  254. warp/native/sort.cpp +251 -0
  255. warp/native/sort.cu +286 -0
  256. warp/native/sort.h +35 -0
  257. warp/native/sparse.cpp +241 -0
  258. warp/native/sparse.cu +435 -0
  259. warp/native/spatial.h +1306 -0
  260. warp/native/svd.h +727 -0
  261. warp/native/temp_buffer.h +46 -0
  262. warp/native/tile.h +4124 -0
  263. warp/native/tile_radix_sort.h +1112 -0
  264. warp/native/tile_reduce.h +838 -0
  265. warp/native/tile_scan.h +240 -0
  266. warp/native/tuple.h +189 -0
  267. warp/native/vec.h +2199 -0
  268. warp/native/version.h +23 -0
  269. warp/native/volume.cpp +501 -0
  270. warp/native/volume.cu +68 -0
  271. warp/native/volume.h +970 -0
  272. warp/native/volume_builder.cu +483 -0
  273. warp/native/volume_builder.h +52 -0
  274. warp/native/volume_impl.h +70 -0
  275. warp/native/warp.cpp +1143 -0
  276. warp/native/warp.cu +4604 -0
  277. warp/native/warp.h +358 -0
  278. warp/optim/__init__.py +20 -0
  279. warp/optim/adam.py +24 -0
  280. warp/optim/linear.py +35 -0
  281. warp/optim/sgd.py +24 -0
  282. warp/paddle.py +24 -0
  283. warp/py.typed +0 -0
  284. warp/render/__init__.py +22 -0
  285. warp/render/imgui_manager.py +29 -0
  286. warp/render/render_opengl.py +24 -0
  287. warp/render/render_usd.py +24 -0
  288. warp/render/utils.py +24 -0
  289. warp/sparse.py +51 -0
  290. warp/tape.py +24 -0
  291. warp/tests/__init__.py +1 -0
  292. warp/tests/__main__.py +4 -0
  293. warp/tests/assets/curlnoise_golden.npy +0 -0
  294. warp/tests/assets/mlp_golden.npy +0 -0
  295. warp/tests/assets/pixel.npy +0 -0
  296. warp/tests/assets/pnoise_golden.npy +0 -0
  297. warp/tests/assets/spiky.usd +0 -0
  298. warp/tests/assets/test_grid.nvdb +0 -0
  299. warp/tests/assets/test_index_grid.nvdb +0 -0
  300. warp/tests/assets/test_int32_grid.nvdb +0 -0
  301. warp/tests/assets/test_vec_grid.nvdb +0 -0
  302. warp/tests/assets/torus.nvdb +0 -0
  303. warp/tests/assets/torus.usda +105 -0
  304. warp/tests/aux_test_class_kernel.py +34 -0
  305. warp/tests/aux_test_compile_consts_dummy.py +18 -0
  306. warp/tests/aux_test_conditional_unequal_types_kernels.py +29 -0
  307. warp/tests/aux_test_dependent.py +29 -0
  308. warp/tests/aux_test_grad_customs.py +29 -0
  309. warp/tests/aux_test_instancing_gc.py +26 -0
  310. warp/tests/aux_test_module_aot.py +7 -0
  311. warp/tests/aux_test_module_unload.py +23 -0
  312. warp/tests/aux_test_name_clash1.py +40 -0
  313. warp/tests/aux_test_name_clash2.py +40 -0
  314. warp/tests/aux_test_reference.py +9 -0
  315. warp/tests/aux_test_reference_reference.py +8 -0
  316. warp/tests/aux_test_square.py +16 -0
  317. warp/tests/aux_test_unresolved_func.py +22 -0
  318. warp/tests/aux_test_unresolved_symbol.py +22 -0
  319. warp/tests/cuda/__init__.py +0 -0
  320. warp/tests/cuda/test_async.py +676 -0
  321. warp/tests/cuda/test_conditional_captures.py +1147 -0
  322. warp/tests/cuda/test_ipc.py +124 -0
  323. warp/tests/cuda/test_mempool.py +233 -0
  324. warp/tests/cuda/test_multigpu.py +169 -0
  325. warp/tests/cuda/test_peer.py +139 -0
  326. warp/tests/cuda/test_pinned.py +84 -0
  327. warp/tests/cuda/test_streams.py +691 -0
  328. warp/tests/geometry/__init__.py +0 -0
  329. warp/tests/geometry/test_bvh.py +335 -0
  330. warp/tests/geometry/test_hash_grid.py +259 -0
  331. warp/tests/geometry/test_marching_cubes.py +294 -0
  332. warp/tests/geometry/test_mesh.py +318 -0
  333. warp/tests/geometry/test_mesh_query_aabb.py +392 -0
  334. warp/tests/geometry/test_mesh_query_point.py +935 -0
  335. warp/tests/geometry/test_mesh_query_ray.py +323 -0
  336. warp/tests/geometry/test_volume.py +1103 -0
  337. warp/tests/geometry/test_volume_write.py +346 -0
  338. warp/tests/interop/__init__.py +0 -0
  339. warp/tests/interop/test_dlpack.py +730 -0
  340. warp/tests/interop/test_jax.py +1673 -0
  341. warp/tests/interop/test_paddle.py +800 -0
  342. warp/tests/interop/test_torch.py +1001 -0
  343. warp/tests/run_coverage_serial.py +39 -0
  344. warp/tests/test_adam.py +162 -0
  345. warp/tests/test_arithmetic.py +1096 -0
  346. warp/tests/test_array.py +3756 -0
  347. warp/tests/test_array_reduce.py +156 -0
  348. warp/tests/test_assert.py +303 -0
  349. warp/tests/test_atomic.py +336 -0
  350. warp/tests/test_atomic_bitwise.py +209 -0
  351. warp/tests/test_atomic_cas.py +312 -0
  352. warp/tests/test_bool.py +220 -0
  353. warp/tests/test_builtins_resolution.py +732 -0
  354. warp/tests/test_closest_point_edge_edge.py +327 -0
  355. warp/tests/test_codegen.py +974 -0
  356. warp/tests/test_codegen_instancing.py +1495 -0
  357. warp/tests/test_compile_consts.py +215 -0
  358. warp/tests/test_conditional.py +298 -0
  359. warp/tests/test_context.py +35 -0
  360. warp/tests/test_copy.py +319 -0
  361. warp/tests/test_ctypes.py +618 -0
  362. warp/tests/test_dense.py +73 -0
  363. warp/tests/test_devices.py +127 -0
  364. warp/tests/test_enum.py +136 -0
  365. warp/tests/test_examples.py +424 -0
  366. warp/tests/test_fabricarray.py +998 -0
  367. warp/tests/test_fast_math.py +72 -0
  368. warp/tests/test_fem.py +2204 -0
  369. warp/tests/test_fixedarray.py +229 -0
  370. warp/tests/test_fp16.py +136 -0
  371. warp/tests/test_func.py +501 -0
  372. warp/tests/test_future_annotations.py +100 -0
  373. warp/tests/test_generics.py +656 -0
  374. warp/tests/test_grad.py +893 -0
  375. warp/tests/test_grad_customs.py +339 -0
  376. warp/tests/test_grad_debug.py +341 -0
  377. warp/tests/test_implicit_init.py +411 -0
  378. warp/tests/test_import.py +45 -0
  379. warp/tests/test_indexedarray.py +1140 -0
  380. warp/tests/test_intersect.py +103 -0
  381. warp/tests/test_iter.py +76 -0
  382. warp/tests/test_large.py +177 -0
  383. warp/tests/test_launch.py +411 -0
  384. warp/tests/test_lerp.py +151 -0
  385. warp/tests/test_linear_solvers.py +223 -0
  386. warp/tests/test_lvalue.py +427 -0
  387. warp/tests/test_map.py +526 -0
  388. warp/tests/test_mat.py +3515 -0
  389. warp/tests/test_mat_assign_copy.py +178 -0
  390. warp/tests/test_mat_constructors.py +573 -0
  391. warp/tests/test_mat_lite.py +122 -0
  392. warp/tests/test_mat_scalar_ops.py +2913 -0
  393. warp/tests/test_math.py +212 -0
  394. warp/tests/test_module_aot.py +287 -0
  395. warp/tests/test_module_hashing.py +258 -0
  396. warp/tests/test_modules_lite.py +70 -0
  397. warp/tests/test_noise.py +252 -0
  398. warp/tests/test_operators.py +299 -0
  399. warp/tests/test_options.py +129 -0
  400. warp/tests/test_overwrite.py +551 -0
  401. warp/tests/test_print.py +408 -0
  402. warp/tests/test_quat.py +2653 -0
  403. warp/tests/test_quat_assign_copy.py +145 -0
  404. warp/tests/test_rand.py +339 -0
  405. warp/tests/test_reload.py +303 -0
  406. warp/tests/test_rounding.py +157 -0
  407. warp/tests/test_runlength_encode.py +196 -0
  408. warp/tests/test_scalar_ops.py +133 -0
  409. warp/tests/test_smoothstep.py +108 -0
  410. warp/tests/test_snippet.py +318 -0
  411. warp/tests/test_sparse.py +845 -0
  412. warp/tests/test_spatial.py +2859 -0
  413. warp/tests/test_spatial_assign_copy.py +160 -0
  414. warp/tests/test_special_values.py +361 -0
  415. warp/tests/test_static.py +640 -0
  416. warp/tests/test_struct.py +901 -0
  417. warp/tests/test_tape.py +242 -0
  418. warp/tests/test_transient_module.py +93 -0
  419. warp/tests/test_triangle_closest_point.py +192 -0
  420. warp/tests/test_tuple.py +361 -0
  421. warp/tests/test_types.py +615 -0
  422. warp/tests/test_utils.py +594 -0
  423. warp/tests/test_vec.py +1408 -0
  424. warp/tests/test_vec_assign_copy.py +143 -0
  425. warp/tests/test_vec_constructors.py +325 -0
  426. warp/tests/test_vec_lite.py +80 -0
  427. warp/tests/test_vec_scalar_ops.py +2327 -0
  428. warp/tests/test_verify_fp.py +100 -0
  429. warp/tests/test_version.py +75 -0
  430. warp/tests/tile/__init__.py +0 -0
  431. warp/tests/tile/test_tile.py +1519 -0
  432. warp/tests/tile/test_tile_atomic_bitwise.py +403 -0
  433. warp/tests/tile/test_tile_cholesky.py +608 -0
  434. warp/tests/tile/test_tile_load.py +724 -0
  435. warp/tests/tile/test_tile_mathdx.py +156 -0
  436. warp/tests/tile/test_tile_matmul.py +179 -0
  437. warp/tests/tile/test_tile_mlp.py +400 -0
  438. warp/tests/tile/test_tile_reduce.py +950 -0
  439. warp/tests/tile/test_tile_shared_memory.py +376 -0
  440. warp/tests/tile/test_tile_sort.py +121 -0
  441. warp/tests/tile/test_tile_view.py +173 -0
  442. warp/tests/unittest_serial.py +47 -0
  443. warp/tests/unittest_suites.py +430 -0
  444. warp/tests/unittest_utils.py +469 -0
  445. warp/tests/walkthrough_debug.py +95 -0
  446. warp/torch.py +24 -0
  447. warp/types.py +51 -0
  448. warp/utils.py +31 -0
  449. warp_lang-1.10.0.dist-info/METADATA +459 -0
  450. warp_lang-1.10.0.dist-info/RECORD +468 -0
  451. warp_lang-1.10.0.dist-info/WHEEL +5 -0
  452. warp_lang-1.10.0.dist-info/licenses/LICENSE.md +176 -0
  453. warp_lang-1.10.0.dist-info/licenses/licenses/Gaia-LICENSE.txt +6 -0
  454. warp_lang-1.10.0.dist-info/licenses/licenses/appdirs-LICENSE.txt +22 -0
  455. warp_lang-1.10.0.dist-info/licenses/licenses/asset_pixel_jpg-LICENSE.txt +3 -0
  456. warp_lang-1.10.0.dist-info/licenses/licenses/cuda-LICENSE.txt +1582 -0
  457. warp_lang-1.10.0.dist-info/licenses/licenses/dlpack-LICENSE.txt +201 -0
  458. warp_lang-1.10.0.dist-info/licenses/licenses/fp16-LICENSE.txt +28 -0
  459. warp_lang-1.10.0.dist-info/licenses/licenses/libmathdx-LICENSE.txt +220 -0
  460. warp_lang-1.10.0.dist-info/licenses/licenses/llvm-LICENSE.txt +279 -0
  461. warp_lang-1.10.0.dist-info/licenses/licenses/moller-LICENSE.txt +16 -0
  462. warp_lang-1.10.0.dist-info/licenses/licenses/nanovdb-LICENSE.txt +2 -0
  463. warp_lang-1.10.0.dist-info/licenses/licenses/nvrtc-LICENSE.txt +1592 -0
  464. warp_lang-1.10.0.dist-info/licenses/licenses/svd-LICENSE.txt +23 -0
  465. warp_lang-1.10.0.dist-info/licenses/licenses/unittest_parallel-LICENSE.txt +21 -0
  466. warp_lang-1.10.0.dist-info/licenses/licenses/usd-LICENSE.txt +213 -0
  467. warp_lang-1.10.0.dist-info/licenses/licenses/windingnumber-LICENSE.txt +21 -0
  468. warp_lang-1.10.0.dist-info/top_level.txt +1 -0
warp/native/svd.h ADDED
@@ -0,0 +1,727 @@
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
+ // The MIT License (MIT)
19
+
20
+ // Copyright (c) 2014 Eric V. Jang
21
+
22
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
23
+ // of this software and associated documentation files (the "Software"), to deal
24
+ // in the Software without restriction, including without limitation the rights
25
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
26
+ // copies of the Software, and to permit persons to whom the Software is
27
+ // furnished to do so, subject to the following conditions:
28
+
29
+ // The above copyright notice and this permission notice shall be included in all
30
+ // copies or substantial portions of the Software.
31
+
32
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
33
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
34
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
35
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
36
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
37
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
38
+ // SOFTWARE.
39
+
40
+ // Source: https://github.com/ericjang/svd3/blob/master/svd3_cuda/svd3_cuda.h
41
+
42
+
43
+ #pragma once
44
+
45
+ #include "builtin.h"
46
+
47
+ namespace wp
48
+ {
49
+
50
+
51
+ template<typename Type>
52
+ struct _svd_config {
53
+ static constexpr float SVD_EPSILON = 1.e-6f;
54
+ static constexpr float QR_GIVENS_EPSILON = 1.e-6f;
55
+ static constexpr int JACOBI_ITERATIONS = 4;
56
+ };
57
+
58
+ template<>
59
+ struct _svd_config<double> {
60
+ static constexpr double SVD_EPSILON = 1.e-12;
61
+ static constexpr double QR_GIVENS_EPSILON = 1.e-12;
62
+ static constexpr int JACOBI_ITERATIONS = 8;
63
+ };
64
+
65
+ template <typename Type> inline CUDA_CALLABLE Type recipSqrt(Type x)
66
+ {
67
+ #if defined(__CUDA_ARCH__)
68
+ return ::rsqrt(x);
69
+ #else
70
+ return Type(1) / sqrt(x);
71
+ #endif
72
+ }
73
+
74
+ template <> inline CUDA_CALLABLE wp::half recipSqrt(wp::half x) { return wp::half(1) / sqrt(x); }
75
+
76
+ template<typename Type>
77
+ inline CUDA_CALLABLE
78
+ void condSwap(bool c, Type &X, Type &Y)
79
+ {
80
+ // used in step 2
81
+ Type Z = X;
82
+ X = c ? Y : X;
83
+ Y = c ? Z : Y;
84
+ }
85
+
86
+ template<typename Type>
87
+ inline CUDA_CALLABLE
88
+ void condNegSwap(bool c, Type &X, Type &Y)
89
+ {
90
+ // used in step 2 and 3
91
+ Type Z = -X;
92
+ X = c ? Y : X;
93
+ Y = c ? Z : Y;
94
+ }
95
+
96
+ // matrix multiplication M = A * B
97
+ template<typename Type>
98
+ inline CUDA_CALLABLE
99
+ void multAB(Type a11, Type a12, Type a13,
100
+ Type a21, Type a22, Type a23,
101
+ Type a31, Type a32, Type a33,
102
+ //
103
+ Type b11, Type b12, Type b13,
104
+ Type b21, Type b22, Type b23,
105
+ Type b31, Type b32, Type b33,
106
+ //
107
+ Type &m11, Type &m12, Type &m13,
108
+ Type &m21, Type &m22, Type &m23,
109
+ Type &m31, Type &m32, Type &m33)
110
+ {
111
+
112
+ m11=a11*b11 + a12*b21 + a13*b31; m12=a11*b12 + a12*b22 + a13*b32; m13=a11*b13 + a12*b23 + a13*b33;
113
+ m21=a21*b11 + a22*b21 + a23*b31; m22=a21*b12 + a22*b22 + a23*b32; m23=a21*b13 + a22*b23 + a23*b33;
114
+ m31=a31*b11 + a32*b21 + a33*b31; m32=a31*b12 + a32*b22 + a33*b32; m33=a31*b13 + a32*b23 + a33*b33;
115
+ }
116
+
117
+ // matrix multiplication M = Transpose[A] * B
118
+ template<typename Type>
119
+ inline CUDA_CALLABLE
120
+ void multAtB(Type a11, Type a12, Type a13,
121
+ Type a21, Type a22, Type a23,
122
+ Type a31, Type a32, Type a33,
123
+ //
124
+ Type b11, Type b12, Type b13,
125
+ Type b21, Type b22, Type b23,
126
+ Type b31, Type b32, Type b33,
127
+ //
128
+ Type &m11, Type &m12, Type &m13,
129
+ Type &m21, Type &m22, Type &m23,
130
+ Type &m31, Type &m32, Type &m33)
131
+ {
132
+ m11=a11*b11 + a21*b21 + a31*b31; m12=a11*b12 + a21*b22 + a31*b32; m13=a11*b13 + a21*b23 + a31*b33;
133
+ m21=a12*b11 + a22*b21 + a32*b31; m22=a12*b12 + a22*b22 + a32*b32; m23=a12*b13 + a22*b23 + a32*b33;
134
+ m31=a13*b11 + a23*b21 + a33*b31; m32=a13*b12 + a23*b22 + a33*b32; m33=a13*b13 + a23*b23 + a33*b33;
135
+ }
136
+
137
+ template<typename Type>
138
+ inline CUDA_CALLABLE
139
+ void quatToMat3(const Type * qV,
140
+ Type &m11, Type &m12, Type &m13,
141
+ Type &m21, Type &m22, Type &m23,
142
+ Type &m31, Type &m32, Type &m33
143
+ )
144
+ {
145
+ Type w = qV[3];
146
+ Type x = qV[0];
147
+ Type y = qV[1];
148
+ Type z = qV[2];
149
+
150
+ Type qxx = x*x;
151
+ Type qyy = y*y;
152
+ Type qzz = z*z;
153
+ Type qxz = x*z;
154
+ Type qxy = x*y;
155
+ Type qyz = y*z;
156
+ Type qwx = w*x;
157
+ Type qwy = w*y;
158
+ Type qwz = w*z;
159
+
160
+ m11=Type(1) - Type(2)*(qyy + qzz); m12=Type(2)*(qxy - qwz); m13=Type(2)*(qxz + qwy);
161
+ m21=Type(2)*(qxy + qwz); m22=Type(1) - Type(2)*(qxx + qzz); m23=Type(2)*(qyz - qwx);
162
+ m31=Type(2)*(qxz - qwy); m32=Type(2)*(qyz + qwx); m33=Type(1) - Type(2)*(qxx + qyy);
163
+ }
164
+
165
+ template<typename Type>
166
+ inline CUDA_CALLABLE
167
+ void approximateGivensQuaternion(Type a11, Type a12, Type a22, Type &ch, Type &sh)
168
+ {
169
+ /*
170
+ * Given givens angle computed by approximateGivensAngles,
171
+ * compute the corresponding rotation quaternion.
172
+ */
173
+ constexpr double _gamma = 5.82842712474619; // FOUR_GAMMA_SQUARED = sqrt(8)+3;
174
+ constexpr double _cstar = 0.9238795325112867; // cos(pi/8)
175
+ constexpr double _sstar = 0.3826834323650898; // sin(p/8)
176
+
177
+ ch = Type(2)*(a11-a22);
178
+ sh = a12;
179
+ bool b = Type(_gamma)*sh*sh < ch*ch;
180
+ Type w = recipSqrt(ch*ch+sh*sh);
181
+ ch=b?w*ch:Type(_cstar);
182
+ sh=b?w*sh:Type(_sstar);
183
+ }
184
+
185
+ template<typename Type>
186
+ inline CUDA_CALLABLE
187
+ void jacobiConjugation( const int x, const int y, const int z,
188
+ Type &s11,
189
+ Type &s21, Type &s22,
190
+ Type &s31, Type &s32, Type &s33,
191
+ Type * qV)
192
+ {
193
+ Type ch,sh;
194
+ approximateGivensQuaternion(s11,s21,s22,ch,sh);
195
+
196
+ Type scale = ch*ch+sh*sh;
197
+ Type a = (ch*ch-sh*sh)/scale;
198
+ Type b = (Type(2)*sh*ch)/scale;
199
+
200
+ // make temp copy of S
201
+ Type _s11 = s11;
202
+ Type _s21 = s21; Type _s22 = s22;
203
+ Type _s31 = s31; Type _s32 = s32; Type _s33 = s33;
204
+
205
+ // perform conjugation S = Q'*S*Q
206
+ // Q already implicitly solved from a, b
207
+ s11 =a*(a*_s11 + b*_s21) + b*(a*_s21 + b*_s22);
208
+ s21 =a*(-b*_s11 + a*_s21) + b*(-b*_s21 + a*_s22); s22=-b*(-b*_s11 + a*_s21) + a*(-b*_s21 + a*_s22);
209
+ s31 =a*_s31 + b*_s32; s32=-b*_s31 + a*_s32; s33=_s33;
210
+
211
+ // update cumulative rotation qV
212
+ Type tmp[3];
213
+ tmp[0]=qV[0]*sh;
214
+ tmp[1]=qV[1]*sh;
215
+ tmp[2]=qV[2]*sh;
216
+ sh *= qV[3];
217
+
218
+ qV[0] *= ch;
219
+ qV[1] *= ch;
220
+ qV[2] *= ch;
221
+ qV[3] *= ch;
222
+
223
+ // (x,y,z) corresponds to ((0,1,2),(1,2,0),(2,0,1))
224
+ // for (p,q) = ((0,1),(1,2),(0,2))
225
+ qV[z] += sh;
226
+ qV[3] -= tmp[z]; // w
227
+ qV[x] += tmp[y];
228
+ qV[y] -= tmp[x];
229
+
230
+ // re-arrange matrix for next iteration
231
+ _s11 = s22;
232
+ _s21 = s32; _s22 = s33;
233
+ _s31 = s21; _s32 = s31; _s33 = s11;
234
+ s11 = _s11;
235
+ s21 = _s21; s22 = _s22;
236
+ s31 = _s31; s32 = _s32; s33 = _s33;
237
+
238
+ }
239
+
240
+ template<typename Type>
241
+ inline CUDA_CALLABLE
242
+ Type dist2(Type x, Type y, Type z)
243
+ {
244
+ return x*x+y*y+z*z;
245
+ }
246
+
247
+ // finds transformation that diagonalizes a symmetric matrix
248
+ template<typename Type>
249
+ inline CUDA_CALLABLE
250
+ void jacobiEigenanlysis( // symmetric matrix
251
+ Type &s11,
252
+ Type &s21, Type &s22,
253
+ Type &s31, Type &s32, Type &s33,
254
+ // quaternion representation of V
255
+ Type * qV)
256
+ {
257
+ qV[3]=1; qV[0]=0;qV[1]=0;qV[2]=0; // follow same indexing convention as GLM
258
+ constexpr int ITERS = _svd_config<Type>::JACOBI_ITERATIONS;
259
+ for (int i=0;i<ITERS;i++)
260
+ {
261
+ // we wish to eliminate the maximum off-diagonal element
262
+ // on every iteration, but cycling over all 3 possible rotations
263
+ // in fixed order (p,q) = (1,2) , (2,3), (1,3) still retains
264
+ // asymptotic convergence
265
+ jacobiConjugation(0,1,2,s11,s21,s22,s31,s32,s33,qV); // p,q = 0,1
266
+ jacobiConjugation(1,2,0,s11,s21,s22,s31,s32,s33,qV); // p,q = 1,2
267
+ jacobiConjugation(2,0,1,s11,s21,s22,s31,s32,s33,qV); // p,q = 0,2
268
+ }
269
+ }
270
+
271
+ template<typename Type>
272
+ inline CUDA_CALLABLE
273
+ void sortSingularValues(// matrix that we want to decompose
274
+ Type &b11, Type &b12, Type &b13,
275
+ Type &b21, Type &b22, Type &b23,
276
+ Type &b31, Type &b32, Type &b33,
277
+ // sort V simultaneously
278
+ Type &v11, Type &v12, Type &v13,
279
+ Type &v21, Type &v22, Type &v23,
280
+ Type &v31, Type &v32, Type &v33)
281
+ {
282
+ Type rho1 = dist2(b11,b21,b31);
283
+ Type rho2 = dist2(b12,b22,b32);
284
+ Type rho3 = dist2(b13,b23,b33);
285
+ bool c;
286
+ c = rho1 < rho2;
287
+ condNegSwap(c,b11,b12); condNegSwap(c,v11,v12);
288
+ condNegSwap(c,b21,b22); condNegSwap(c,v21,v22);
289
+ condNegSwap(c,b31,b32); condNegSwap(c,v31,v32);
290
+ condSwap(c,rho1,rho2);
291
+ c = rho1 < rho3;
292
+ condNegSwap(c,b11,b13); condNegSwap(c,v11,v13);
293
+ condNegSwap(c,b21,b23); condNegSwap(c,v21,v23);
294
+ condNegSwap(c,b31,b33); condNegSwap(c,v31,v33);
295
+ condSwap(c,rho1,rho3);
296
+ c = rho2 < rho3;
297
+ condNegSwap(c,b12,b13); condNegSwap(c,v12,v13);
298
+ condNegSwap(c,b22,b23); condNegSwap(c,v22,v23);
299
+ condNegSwap(c,b32,b33); condNegSwap(c,v32,v33);
300
+ }
301
+
302
+ template<typename Type>
303
+ inline CUDA_CALLABLE
304
+ void QRGivensQuaternion(Type a1, Type a2, Type &ch, Type &sh)
305
+ {
306
+ // a1 = pivot point on diagonal
307
+ // a2 = lower triangular entry we want to annihilate
308
+ const Type epsilon = _svd_config<Type>::QR_GIVENS_EPSILON;
309
+ Type rho = sqrt(a1*a1 + a2*a2);
310
+
311
+ sh = rho > epsilon ? a2 : Type(0);
312
+ ch = abs(a1) + max(rho,epsilon);
313
+ bool b = a1 < Type(0);
314
+ condSwap(b,sh,ch);
315
+ Type w = recipSqrt(ch*ch+sh*sh);
316
+ ch *= w;
317
+ sh *= w;
318
+ }
319
+
320
+ template<typename Type>
321
+ inline CUDA_CALLABLE
322
+ void QRDecomposition(// matrix that we want to decompose
323
+ Type b11, Type b12, Type b13,
324
+ Type b21, Type b22, Type b23,
325
+ Type b31, Type b32, Type b33,
326
+ // output Q
327
+ Type &q11, Type &q12, Type &q13,
328
+ Type &q21, Type &q22, Type &q23,
329
+ Type &q31, Type &q32, Type &q33,
330
+ // output R
331
+ Type &r11, Type &r12, Type &r13,
332
+ Type &r21, Type &r22, Type &r23,
333
+ Type &r31, Type &r32, Type &r33)
334
+ {
335
+ Type ch1,sh1,ch2,sh2,ch3,sh3;
336
+ Type a,b;
337
+
338
+ // first givens rotation (ch,0,0,sh)
339
+ QRGivensQuaternion(b11,b21,ch1,sh1);
340
+ a=Type(1)-Type(2)*sh1*sh1;
341
+ b=Type(2)*ch1*sh1;
342
+ // apply B = Q' * B
343
+ r11=a*b11+b*b21; r12=a*b12+b*b22; r13=a*b13+b*b23;
344
+ r21=-b*b11+a*b21; r22=-b*b12+a*b22; r23=-b*b13+a*b23;
345
+ r31=b31; r32=b32; r33=b33;
346
+
347
+ // second givens rotation (ch,0,-sh,0)
348
+ QRGivensQuaternion(r11,r31,ch2,sh2);
349
+ a=Type(1)-Type(2)*sh2*sh2;
350
+ b=Type(2)*ch2*sh2;
351
+ // apply B = Q' * B;
352
+ b11=a*r11+b*r31; b12=a*r12+b*r32; b13=a*r13+b*r33;
353
+ b21=r21; b22=r22; b23=r23;
354
+ b31=-b*r11+a*r31; b32=-b*r12+a*r32; b33=-b*r13+a*r33;
355
+
356
+ // third givens rotation (ch,sh,0,0)
357
+ QRGivensQuaternion(b22,b32,ch3,sh3);
358
+ a=Type(1)-Type(2)*sh3*sh3;
359
+ b=Type(2)*ch3*sh3;
360
+ // R is now set to desired value
361
+ r11=b11; r12=b12; r13=b13;
362
+ r21=a*b21+b*b31; r22=a*b22+b*b32; r23=a*b23+b*b33;
363
+ r31=-b*b21+a*b31; r32=-b*b22+a*b32; r33=-b*b23+a*b33;
364
+
365
+ // construct the cumulative rotation Q=Q1 * Q2 * Q3
366
+ // the number of floating point operations for three quaternion multiplications
367
+ // is more or less comparable to the explicit form of the joined matrix.
368
+ // certainly more memory-efficient!
369
+ Type sh12=sh1*sh1;
370
+ Type sh22=sh2*sh2;
371
+ Type sh32=sh3*sh3;
372
+
373
+ q11=(Type(-1)+Type(2)*sh12)*(Type(-1)+Type(2)*sh22);
374
+ q12=Type(4)*ch2*ch3*(Type(-1)+Type(2)*sh12)*sh2*sh3+Type(2)*ch1*sh1*(Type(-1)+Type(2)*sh32);
375
+ q13=Type(4)*ch1*ch3*sh1*sh3-Type(2)*ch2*(Type(-1)+Type(2)*sh12)*sh2*(Type(-1)+Type(2)*sh32);
376
+
377
+ q21=Type(2)*ch1*sh1*(Type(1)-Type(2)*sh22);
378
+ q22=Type(-8)*ch1*ch2*ch3*sh1*sh2*sh3+(Type(-1)+Type(2)*sh12)*(Type(-1)+Type(2)*sh32);
379
+ q23=Type(-2)*ch3*sh3+Type(4)*sh1*(ch3*sh1*sh3+ch1*ch2*sh2*(Type(-1)+Type(2)*sh32));
380
+
381
+ q31=Type(2)*ch2*sh2;
382
+ q32=Type(2)*ch3*(Type(1)-Type(2)*sh22)*sh3;
383
+ q33=(Type(-1)+Type(2)*sh22)*(Type(-1)+Type(2)*sh32);
384
+ }
385
+
386
+ template<typename Type>
387
+ inline CUDA_CALLABLE
388
+ void _svd(// input A
389
+ Type a11, Type a12, Type a13,
390
+ Type a21, Type a22, Type a23,
391
+ Type a31, Type a32, Type a33,
392
+ // output U
393
+ Type &u11, Type &u12, Type &u13,
394
+ Type &u21, Type &u22, Type &u23,
395
+ Type &u31, Type &u32, Type &u33,
396
+ // output S
397
+ Type &s11, Type &s12, Type &s13,
398
+ Type &s21, Type &s22, Type &s23,
399
+ Type &s31, Type &s32, Type &s33,
400
+ // output V
401
+ Type &v11, Type &v12, Type &v13,
402
+ Type &v21, Type &v22, Type &v23,
403
+ Type &v31, Type &v32, Type &v33)
404
+ {
405
+ // normal equations matrix
406
+ Type ATA11, ATA12, ATA13;
407
+ Type ATA21, ATA22, ATA23;
408
+ Type ATA31, ATA32, ATA33;
409
+
410
+ multAtB(a11,a12,a13,a21,a22,a23,a31,a32,a33,
411
+ a11,a12,a13,a21,a22,a23,a31,a32,a33,
412
+ ATA11,ATA12,ATA13,ATA21,ATA22,ATA23,ATA31,ATA32,ATA33);
413
+
414
+ // symmetric eigenalysis
415
+ Type qV[4];
416
+ jacobiEigenanlysis( ATA11,ATA21,ATA22, ATA31,ATA32,ATA33,qV);
417
+ quatToMat3(qV,v11,v12,v13,v21,v22,v23,v31,v32,v33);
418
+
419
+ Type b11, b12, b13;
420
+ Type b21, b22, b23;
421
+ Type b31, b32, b33;
422
+ multAB(a11,a12,a13,a21,a22,a23,a31,a32,a33,
423
+ v11,v12,v13,v21,v22,v23,v31,v32,v33,
424
+ b11, b12, b13, b21, b22, b23, b31, b32, b33);
425
+
426
+ // sort singular values and find V
427
+ sortSingularValues(b11, b12, b13, b21, b22, b23, b31, b32, b33,
428
+ v11,v12,v13,v21,v22,v23,v31,v32,v33);
429
+
430
+ // QR decomposition
431
+ QRDecomposition(b11, b12, b13, b21, b22, b23, b31, b32, b33,
432
+ u11, u12, u13, u21, u22, u23, u31, u32, u33,
433
+ s11, s12, s13, s21, s22, s23, s31, s32, s33
434
+ );
435
+ }
436
+
437
+ template <typename Type>
438
+ inline CUDA_CALLABLE void _svd_2( // input A
439
+ Type a11, Type a12, Type a21, Type a22,
440
+ // output U
441
+ Type& u11, Type& u12, Type& u21, Type& u22,
442
+ // output S
443
+ Type& s1, Type& s2,
444
+ // output V
445
+ Type& v11, Type& v12, Type& v21, Type& v22)
446
+ {
447
+ // Step 1: Compute ATA
448
+ Type ATA11 = a11 * a11 + a21 * a21;
449
+ Type ATA12 = a11 * a12 + a21 * a22;
450
+ Type ATA22 = a12 * a12 + a22 * a22;
451
+
452
+ // Step 2: Eigenanalysis
453
+ Type trace = ATA11 + ATA22;
454
+ Type diff = ATA11 - ATA22;
455
+ Type discriminant = diff * diff + Type(4) * ATA12 * ATA12;
456
+
457
+ // Step 3: Singular values
458
+ if (discriminant == Type(0))
459
+ {
460
+ // Duplicate eigenvalue, A ~ s Id
461
+ s1 = s2 = sqrt(Type(0.5) * trace);
462
+ u11 = v11 = Type(1);
463
+ u12 = v12 = Type(0);
464
+ u21 = v21 = Type(0);
465
+ u22 = v22 = Type(1);
466
+ return;
467
+ }
468
+
469
+ // General case
470
+ Type sqrt_term = sqrt(discriminant);
471
+ Type lambda1 = (trace + sqrt_term) * Type(0.5);
472
+ Type lambda2 = (trace - sqrt_term) * Type(0.5);
473
+ Type inv_sigma1 = recipSqrt(lambda1);
474
+ Type sigma1 = Type(1) / inv_sigma1;
475
+ Type sigma2 = sqrt(lambda2);
476
+
477
+ // Step 4: Eigenvectors (find V)
478
+ Type v1y = diff - sqrt_term + Type(2) * ATA12, v1x = diff + sqrt_term - Type(2) * ATA12;
479
+ Type len1_sq = v1x * v1x + v1y * v1y;
480
+ if (len1_sq == Type(0)) {
481
+ v11 = Type(0.707106781186547524401); // M_SQRT1_2
482
+ v21 = v11;
483
+ } else {
484
+ Type inv_len1 = recipSqrt(len1_sq);
485
+ v11 = v1x * inv_len1;
486
+ v21 = v1y * inv_len1;
487
+ }
488
+ v12 = -v21;
489
+ v22 = v11;
490
+
491
+ // Step 5: Compute U
492
+ u11 = (a11 * v11 + a12 * v21) * inv_sigma1;
493
+ u21 = (a21 * v11 + a22 * v21) * inv_sigma1;
494
+ // sigma2 may be zero, but we can complete U orthogonally up to determinant's sign
495
+ Type det_sign = wp::sign(a11 * a22 - a12 * a21);
496
+ u12 = -u21 * det_sign;
497
+ u22 = u11 * det_sign;
498
+
499
+ // Step 6: Set S
500
+ s1 = sigma1;
501
+ s2 = sigma2;
502
+ }
503
+
504
+ template<typename Type>
505
+ inline CUDA_CALLABLE void svd3(const mat_t<3,3,Type>& A, mat_t<3,3,Type>& U, vec_t<3,Type>& sigma, mat_t<3,3,Type>& V) {
506
+ Type s12, s13, s21, s23, s31, s32;
507
+ _svd(A.data[0][0], A.data[0][1], A.data[0][2],
508
+ A.data[1][0], A.data[1][1], A.data[1][2],
509
+ A.data[2][0], A.data[2][1], A.data[2][2],
510
+
511
+ U.data[0][0], U.data[0][1], U.data[0][2],
512
+ U.data[1][0], U.data[1][1], U.data[1][2],
513
+ U.data[2][0], U.data[2][1], U.data[2][2],
514
+
515
+ sigma[0], s12, s13,
516
+ s21, sigma[1], s23,
517
+ s31, s32, sigma[2],
518
+
519
+ V.data[0][0], V.data[0][1], V.data[0][2],
520
+ V.data[1][0], V.data[1][1], V.data[1][2],
521
+ V.data[2][0], V.data[2][1], V.data[2][2]);
522
+ }
523
+
524
+ template<typename Type>
525
+ inline CUDA_CALLABLE void adj_svd3(const mat_t<3,3,Type>& A,
526
+ const mat_t<3,3,Type>& U,
527
+ const vec_t<3,Type>& sigma,
528
+ const mat_t<3,3,Type>& V,
529
+ mat_t<3,3,Type>& adj_A,
530
+ const mat_t<3,3,Type>& adj_U,
531
+ const vec_t<3,Type>& adj_sigma,
532
+ const mat_t<3,3,Type>& adj_V) {
533
+ const Type epsilon = _svd_config<Type>::SVD_EPSILON;
534
+
535
+ Type sx2 = sigma[0] * sigma[0];
536
+ Type sy2 = sigma[1] * sigma[1];
537
+ Type sz2 = sigma[2] * sigma[2];
538
+
539
+ Type F01 = Type(1) / min(sy2 - sx2, Type(-epsilon));
540
+ Type F02 = Type(1) / min(sz2 - sx2, Type(-epsilon));
541
+ Type F12 = Type(1) / min(sz2 - sy2, Type(-epsilon));
542
+
543
+ mat_t<3,3,Type> F = mat_t<3,3,Type>(0, F01, F02,
544
+ -F01, 0, F12,
545
+ -F02, -F12, 0);
546
+
547
+ mat_t<3,3,Type> adj_sigma_mat = mat_t<3,3,Type>(adj_sigma[0], 0, 0,
548
+ 0, adj_sigma[1], 0,
549
+ 0, 0, adj_sigma[2]);
550
+ mat_t<3,3,Type> s_mat = mat_t<3,3,Type>(sigma[0], 0, 0,
551
+ 0, sigma[1], 0,
552
+ 0, 0, sigma[2]);
553
+
554
+ // https://github.com/pytorch/pytorch/blob/d7ddae8e4fe66fa1330317673438d1eb5aa99ca4/torch/csrc/autograd/FunctionsManual.cpp
555
+ mat_t<3,3,Type> UT = transpose(U);
556
+ mat_t<3,3,Type> VT = transpose(V);
557
+
558
+ mat_t<3,3,Type> sigma_term = mul(U, mul(adj_sigma_mat, VT));
559
+
560
+ mat_t<3,3,Type> skew_u = cw_mul(F, mul(UT, adj_U) - mul(transpose(adj_U), U));
561
+ mat_t<3,3,Type> block_u = mul(skew_u, s_mat);
562
+ mat_t<3,3,Type> u_term = mul(mul(U, block_u), VT);
563
+
564
+ mat_t<3,3,Type> skew_v = cw_mul(F, mul(VT, adj_V) - mul(transpose(adj_V), V));
565
+ mat_t<3,3,Type> block_v = mul(skew_v, VT);
566
+ mat_t<3,3,Type> v_term = mul(U, mul(s_mat, block_v));
567
+
568
+ adj_A = adj_A + (u_term + v_term + sigma_term);
569
+ }
570
+
571
+ template<typename Type>
572
+ inline CUDA_CALLABLE void svd2(const mat_t<2,2,Type>& A, mat_t<2,2,Type>& U, vec_t<2,Type>& sigma, mat_t<2,2,Type>& V) {
573
+ _svd_2(A.data[0][0], A.data[0][1],
574
+ A.data[1][0], A.data[1][1],
575
+
576
+ U.data[0][0], U.data[0][1],
577
+ U.data[1][0], U.data[1][1],
578
+
579
+ sigma[0],
580
+ sigma[1],
581
+
582
+ V.data[0][0], V.data[0][1],
583
+ V.data[1][0], V.data[1][1]);
584
+ }
585
+
586
+ template<typename Type>
587
+ inline CUDA_CALLABLE void adj_svd2(const mat_t<2,2,Type>& A,
588
+ const mat_t<2,2,Type>& U,
589
+ const vec_t<2,Type>& sigma,
590
+ const mat_t<2,2,Type>& V,
591
+ mat_t<2,2,Type>& adj_A,
592
+ const mat_t<2,2,Type>& adj_U,
593
+ const vec_t<2,Type>& adj_sigma,
594
+ const mat_t<2,2,Type>& adj_V) {
595
+ const Type epsilon = _svd_config<Type>::SVD_EPSILON;
596
+
597
+ Type s1_squared = sigma[0] * sigma[0];
598
+ Type s2_squared = sigma[1] * sigma[1];
599
+
600
+ // Compute inverse of (s1^2 - s2^2) if possible, use small epsilon to prevent division by zero
601
+ Type F01 = Type(1) / min(s2_squared - s1_squared, Type(-epsilon));
602
+
603
+ // Construct the matrix F for the adjoint
604
+ mat_t<2,2,Type> F = mat_t<2,2,Type>(0.0, F01,
605
+ -F01, 0.0);
606
+
607
+ // Create a matrix to handle the adjoint of the singular values (diagonal matrix)
608
+ mat_t<2,2,Type> adj_sigma_mat = mat_t<2,2,Type>(adj_sigma[0], 0.0,
609
+ 0.0, adj_sigma[1]);
610
+
611
+ // Matrix for handling singular values (diagonal matrix with sigma values)
612
+ mat_t<2,2,Type> s_mat = mat_t<2,2,Type>(sigma[0], 0.0,
613
+ 0.0, sigma[1]);
614
+
615
+ // Compute the transpose of U and V
616
+ mat_t<2,2,Type> UT = transpose(U);
617
+ mat_t<2,2,Type> VT = transpose(V);
618
+
619
+ // Compute the term for sigma (diagonal matrix of adjoint singular values)
620
+ mat_t<2,2,Type> sigma_term = mul(U, mul(adj_sigma_mat, VT));
621
+
622
+ // Compute the adjoint contributions for U (left singular vectors)
623
+ mat_t<2,2,Type> skew_u = cw_mul(F, mul(UT, adj_U) - mul(transpose(adj_U), U));
624
+ mat_t<2,2,Type> block_u = mul(skew_u, s_mat);
625
+ mat_t<2,2,Type> u_term = mul(mul(U, block_u), VT);
626
+
627
+ // Compute the adjoint contributions for V (right singular vectors)
628
+ mat_t<2,2,Type> skew_v = cw_mul(F, mul(VT, adj_V) - mul(transpose(adj_V), V));
629
+ mat_t<2,2,Type> block_v = mul(skew_v, VT);
630
+ mat_t<2,2,Type> v_term = mul(U, mul(s_mat, block_v));
631
+
632
+ // Combine the terms to compute the adjoint of A
633
+ adj_A = adj_A + (u_term + v_term + sigma_term);
634
+ }
635
+
636
+
637
+ template<typename Type>
638
+ inline CUDA_CALLABLE void qr3(const mat_t<3,3,Type>& A, mat_t<3,3,Type>& Q, mat_t<3,3,Type>& R) {
639
+ QRDecomposition(A.data[0][0], A.data[0][1], A.data[0][2],
640
+ A.data[1][0], A.data[1][1], A.data[1][2],
641
+ A.data[2][0], A.data[2][1], A.data[2][2],
642
+
643
+ Q.data[0][0], Q.data[0][1], Q.data[0][2],
644
+ Q.data[1][0], Q.data[1][1], Q.data[1][2],
645
+ Q.data[2][0], Q.data[2][1], Q.data[2][2],
646
+
647
+ R.data[0][0], R.data[0][1], R.data[0][2],
648
+ R.data[1][0], R.data[1][1], R.data[1][2],
649
+ R.data[2][0], R.data[2][1], R.data[2][2]);
650
+ }
651
+
652
+
653
+ template<typename Type>
654
+ inline CUDA_CALLABLE void adj_qr3(const mat_t<3,3,Type>& A,
655
+ const mat_t<3,3,Type>& Q,
656
+ const mat_t<3,3,Type>& R,
657
+ mat_t<3,3,Type>& adj_A,
658
+ const mat_t<3,3,Type>& adj_Q,
659
+ const mat_t<3,3,Type>& adj_R) {
660
+ // Eq 3 of https://arxiv.org/pdf/2009.10071.pdf
661
+ mat_t<3,3,Type> M = mul(R,transpose(adj_R)) - mul(transpose(adj_Q), Q);
662
+ mat_t<3,3,Type> copyltuM = mat_t<3,3,Type>(M.data[0][0], M.data[1][0], M.data[2][0],
663
+ M.data[1][0], M.data[1][1], M.data[2][1],
664
+ M.data[2][0], M.data[2][1], M.data[2][2]);
665
+ adj_A = adj_A + mul(adj_Q + mul(Q,copyltuM), inverse(transpose(R)));
666
+ }
667
+
668
+
669
+ template<typename Type>
670
+ inline CUDA_CALLABLE void eig3(const mat_t<3,3,Type>& A, mat_t<3,3,Type>& Q, vec_t<3,Type>& d) {
671
+ Type qV[4];
672
+ Type s11 = A.data[0][0];
673
+ Type s21 = A.data[1][0];
674
+ Type s22 = A.data[1][1];
675
+ Type s31 = A.data[2][0];
676
+ Type s32 = A.data[2][1];
677
+ Type s33 = A.data[2][2];
678
+
679
+ jacobiEigenanlysis(s11, s21, s22, s31, s32, s33, qV);
680
+ quatToMat3(qV, Q.data[0][0], Q.data[0][1], Q.data[0][2], Q.data[1][0], Q.data[1][1], Q.data[1][2], Q.data[2][0], Q.data[2][1], Q.data[2][2]);
681
+ mat_t<3,3,Type> t;
682
+ multAtB(Q.data[0][0], Q.data[0][1], Q.data[0][2], Q.data[1][0], Q.data[1][1], Q.data[1][2], Q.data[2][0], Q.data[2][1], Q.data[2][2],
683
+ A.data[0][0], A.data[0][1], A.data[0][2], A.data[1][0], A.data[1][1], A.data[1][2], A.data[2][0], A.data[2][1], A.data[2][2],
684
+ t.data[0][0], t.data[0][1], t.data[0][2], t.data[1][0], t.data[1][1], t.data[1][2], t.data[2][0], t.data[2][1], t.data[2][2]);
685
+
686
+ mat_t<3,3,Type> u;
687
+ multAB(t.data[0][0], t.data[0][1], t.data[0][2], t.data[1][0], t.data[1][1], t.data[1][2], t.data[2][0], t.data[2][1], t.data[2][2],
688
+ Q.data[0][0], Q.data[0][1], Q.data[0][2], Q.data[1][0], Q.data[1][1], Q.data[1][2], Q.data[2][0], Q.data[2][1], Q.data[2][2],
689
+ u.data[0][0], u.data[0][1], u.data[0][2], u.data[1][0], u.data[1][1], u.data[1][2], u.data[2][0], u.data[2][1], u.data[2][2]
690
+ );
691
+ d = vec_t<3,Type>(u.data[0][0], u.data[1][1], u.data[2][2]);
692
+ }
693
+
694
+ template<typename Type>
695
+ inline CUDA_CALLABLE void adj_eig3(const mat_t<3,3,Type>& A, const mat_t<3,3,Type>& Q, const vec_t<3,Type>& d,
696
+ mat_t<3,3,Type>& adj_A, const mat_t<3,3,Type>& adj_Q, const vec_t<3,Type>& adj_d) {
697
+ // Page 10 of https://people.maths.ox.ac.uk/gilesm/files/NA-08-01.pdf
698
+ mat_t<3,3,Type> D = mat_t<3,3,Type>(d[0], 0, 0,
699
+ 0, d[1], 0,
700
+ 0, 0, d[2]);
701
+ mat_t<3,3,Type> D_bar = mat_t<3,3,Type>(adj_d[0], 0, 0,
702
+ 0, adj_d[1], 0,
703
+ 0, 0, adj_d[2]);
704
+
705
+ Type dyx = d[1] - d[0];
706
+ Type dzx = d[2] - d[0];
707
+ Type dzy = d[2] - d[1];
708
+
709
+ if ((dyx < Type(0)) && (dyx > Type(-1e-6))) dyx = -1e-6;
710
+ if ((dyx > Type(0)) && (dyx < Type(1e-6))) dyx = 1e-6;
711
+
712
+ if ((dzx < Type(0)) && (dzx > Type(-1e-6))) dzx = -1e-6;
713
+ if ((dzx > Type(0)) && (dzx < Type(1e-6))) dzx = 1e-6;
714
+
715
+ if ((dzy < Type(0)) && (dzy > Type(-1e-6))) dzy = -1e-6;
716
+ if ((dzy > Type(0)) && (dzy < Type(1e-6))) dzy = 1e-6;
717
+
718
+ Type F01 = Type(1) / dyx;
719
+ Type F02 = Type(1) / dzx;
720
+ Type F12 = Type(1) / dzy;
721
+ mat_t<3,3,Type> F = mat_t<3,3,Type>(0, F01, F02,
722
+ -F01, 0, F12,
723
+ -F02, -F12, 0);
724
+ mat_t<3,3,Type> QT = transpose(Q);
725
+ adj_A = adj_A + mul(Q, mul(D_bar + cw_mul(F, mul(QT, adj_Q)), QT));
726
+ }
727
+ }