{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/differentiable-and-accelerated-spherical","title":"Differentiable and accelerated spherical harmonic and Wigner transforms","arxiv_id":"2311.14670","date":"2023-11-24","proceeding":null,"authors":["Matthew A. Price","Jason D. McEwen"],"abstract":"Many areas of science and engineering encounter data defined on spherical manifolds. Modelling and analysis of spherical data often necessitates spherical harmonic transforms, at high degrees, and increasingly requires efficient computation of gradients for machine learning or other differentiable programming tasks. We develop novel algorithmic structures for accelerated and differentiable computation of generalised Fourier transforms on the sphere $\\mathbb{S}^2$ and rotation group $\\text{SO}(3)$, i.e. spherical harmonic and Wigner transforms, respectively. We present a recursive algorithm for the calculation of Wigner $d$-functions that is both stable to high harmonic degrees and extremely parallelisable. By tightly coupling this with separable spherical transforms, we obtain algorithms that exhibit an extremely parallelisable structure that is well-suited for the high throughput computing of modern hardware accelerators (e.g. GPUs). We also develop a hybrid automatic and manual differentiation approach so that gradients can be computed efficiently. Our algorithms are implemented within the JAX differentiable programming framework in the S2FFT software code. Numerous samplings of the sphere are supported, including equiangular and HEALPix sampling. Computational errors are at the order of machine precision for spherical samplings that admit a sampling theorem. When benchmarked against alternative C codes we observe up to a 400-fold acceleration. Furthermore, when distributing over multiple GPUs we achieve very close to optimal linear scaling with increasing number of GPUs due to the highly parallelised and balanced nature of our algorithms. Provided access to sufficiently many GPUs our transforms thus exhibit an unprecedented effective linear time complexity.","url_abs":"https://arxiv.org/abs/2311.14670v3","url_pdf":"https://arxiv.org/pdf/2311.14670v3.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"differentiable-and-accelerated-spherical","repo_url":"https://github.com/astro-informatics/s2fft","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"jax","reach":{"status":"ok","spdx":"MIT"}},{"paper_slug":"differentiable-and-accelerated-spherical","repo_url":"https://github.com/astro-informatics/s2scat","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"jax","reach":null}],"tasks":[],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2311.14670","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2311.14670"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/astro-informatics/s2fft","reach":{"status":"ok","spdx":"MIT"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/astro-informatics/s2scat","reach":null}],"summary":{"ran_fixture":1,"ran":9,"unverified":3},"by_repo_kind":{"official":{"samples":12,"ran":9,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":1,"samples":[{"code_sha256_prefix":"2201fad4e6787496","entry":"C01_C11_to_isotropic","repo":null,"repo_kind":null,"path":null,"file_url":null,"link_basis":"identical_code_first_harvested_elsewhere","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"deterministic","behaviour_fingerprint":true,"licence":null,"inline_ok":false,"mcp_get_code":{"code_sha256":"2201fad4e6787496"}},{"code_sha256_prefix":"a4e804d1d407a86e","entry":"compute_full","repo":"astro-informatics/s2fft","repo_kind":"official","path":"s2fft/recursions/risbo.py","file_url":"https://github.com/astro-informatics/s2fft/blob/HEAD/s2fft/recursions/risbo.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"a4e804d1d407a86e"}},{"code_sha256_prefix":"552a27b0485e72c0","entry":"compute_full","repo":"astro-informatics/s2fft","repo_kind":"official","path":"s2fft/recursions/risbo_jax.py","file_url":"https://github.com/astro-informatics/s2fft/blob/HEAD/s2fft/recursions/risbo_jax.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"552a27b0485e72c0"}},{"code_sha256_prefix":"2447906fec80c98c","entry":"compute_full_vectorised","repo":"astro-informatics/s2fft","repo_kind":"official","path":"s2fft/recursions/risbo.py","file_url":"https://github.com/astro-informatics/s2fft/blob/HEAD/s2fft/recursions/risbo.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"2447906fec80c98c"}},{"code_sha256_prefix":"026fdb890667ab0e","entry":"compute_quarter_slice","repo":"astro-informatics/s2fft","repo_kind":"official","path":"s2fft/recursions/turok.py","file_url":"https://github.com/astro-informatics/s2fft/blob/HEAD/s2fft/recursions/turok.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"026fdb890667ab0e"}},{"code_sha256_prefix":"346716e3f7703576","entry":"compute_slice","repo":"astro-informatics/s2fft","repo_kind":"official","path":"s2fft/recursions/turok.py","file_url":"https://github.com/astro-informatics/s2fft/blob/HEAD/s2fft/recursions/turok.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"346716e3f7703576"}},{"code_sha256_prefix":"94b976a8c3413231","entry":"init","repo":"astro-informatics/s2fft","repo_kind":"official","path":"s2fft/recursions/trapani.py","file_url":"https://github.com/astro-informatics/s2fft/blob/HEAD/s2fft/recursions/trapani.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"94b976a8c3413231"}},{"code_sha256_prefix":"673585ba8e588087","entry":"init_jax","repo":"astro-informatics/s2fft","repo_kind":"official","path":"s2fft/recursions/trapani.py","file_url":"https://github.com/astro-informatics/s2fft/blob/HEAD/s2fft/recursions/trapani.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"673585ba8e588087"}},{"code_sha256_prefix":"3f7d7b4c5efdc5fd","entry":"init_nonjax","repo":"astro-informatics/s2fft","repo_kind":"official","path":"s2fft/recursions/trapani.py","file_url":"https://github.com/astro-informatics/s2fft/blob/HEAD/s2fft/recursions/trapani.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"3f7d7b4c5efdc5fd"}},{"code_sha256_prefix":"ecb6493183644480","entry":"wigner_subset_to_s2","repo":"astro-informatics/s2fft","repo_kind":"official","path":"s2fft/precompute_transforms/custom_ops.py","file_url":"https://github.com/astro-informatics/s2fft/blob/HEAD/s2fft/precompute_transforms/custom_ops.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"ecb6493183644480"}},{"code_sha256_prefix":"1ba1cd2ff98f34dc","entry":"compute_full","repo":"astro-informatics/s2fft","repo_kind":"official","path":"s2fft/recursions/turok.py","file_url":"https://github.com/astro-informatics/s2fft/blob/HEAD/s2fft/recursions/turok.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"1ba1cd2ff98f34dc"}},{"code_sha256_prefix":"15e9838df19f7d05","entry":"so3_to_wigner_subset","repo":"astro-informatics/s2fft","repo_kind":"official","path":"s2fft/precompute_transforms/custom_ops.py","file_url":"https://github.com/astro-informatics/s2fft/blob/HEAD/s2fft/precompute_transforms/custom_ops.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"15e9838df19f7d05"}},{"code_sha256_prefix":"9a351188dfafb704","entry":"wigner_subset_to_s2_jax","repo":"astro-informatics/s2fft","repo_kind":"official","path":"s2fft/precompute_transforms/custom_ops.py","file_url":"https://github.com/astro-informatics/s2fft/blob/HEAD/s2fft/precompute_transforms/custom_ops.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"9a351188dfafb704"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}