{"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/causaldynamics-a-large-scale-benchmark-for","title":"CausalDynamics: A large-scale benchmark for structural discovery of dynamical causal models","arxiv_id":"2505.16620","date":"2025-05-22","proceeding":null,"authors":["Benjamin Herdeanu","Juan Nathaniel","Carla Roesch","Jatan Buch","Gregor Ramien","Johannes Haux","Pierre Gentine"],"abstract":"Causal discovery for dynamical systems poses a major challenge in fields where active interventions are infeasible. Most methods used to investigate these systems and their associated benchmarks are tailored to deterministic, low-dimensional and weakly nonlinear time-series data. To address these limitations, we present CausalDynamics, a large-scale benchmark and extensible data generation framework to advance the structural discovery of dynamical causal models. Our benchmark consists of true causal graphs derived from thousands of coupled ordinary and stochastic differential equations as well as two idealized climate models. We perform a comprehensive evaluation of state-of-the-art causal discovery algorithms for graph reconstruction on systems with noisy, confounded, and lagged dynamics. CausalDynamics consists of a plug-and-play, build-your-own coupling workflow that enables the construction of a hierarchy of physical systems. We anticipate that our framework will facilitate the development of robust causal discovery algorithms that are broadly applicable across domains while addressing their unique challenges. We provide a user-friendly implementation and documentation on https://kausable.github.io/CausalDynamics.","url_abs":"https://arxiv.org/abs/2505.16620v1","url_pdf":"https://arxiv.org/pdf/2505.16620v1.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":"causaldynamics-a-large-scale-benchmark-for","repo_url":"https://github.com/kausable/causaldynamics","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":0,"framework":"jax","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":"causal-discovery","task_name":"Causal Discovery"},{"task_slug":"graph-reconstruction","task_name":"Graph Reconstruction"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2505.16620","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2505.16620"}},"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":"deterministic:regex_extraction","url":"https://github.com/kausable/CausalDynamics","reach":{"status":"ok","spdx":"MIT"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/kausable/causaldynamics","reach":{"status":"ok","spdx":"MIT"}}],"summary":{"ran_honours":1,"ran_fixture":1,"unverified":16},"by_repo_kind":{"official":{"samples":18,"ran":2,"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":0,"samples":[{"code_sha256_prefix":"5c86959f0283a76a","entry":"generate_indices","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/baselines/cuts.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/baselines/cuts.py","link_basis":"harvester_set","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"5c86959f0283a76a"}},{"code_sha256_prefix":"923cb04dc471f021","entry":"prepross_data","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/baselines/cuts.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/baselines/cuts.py","link_basis":"harvester_set","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"923cb04dc471f021"}},{"code_sha256_prefix":"2f4eb9c6b555deaa","entry":"allocate_elements_based_on_ratios","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/utils.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/utils.py","link_basis":"harvester_set","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":"2f4eb9c6b555deaa"}},{"code_sha256_prefix":"b9a951d367c8d9ff","entry":"auto_window","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/baselines/ccm.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/baselines/ccm.py","link_basis":"harvester_set","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":"b9a951d367c8d9ff"}},{"code_sha256_prefix":"2258cab64f4fe6dd","entry":"autocorr_func_1d","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/baselines/ccm.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/baselines/ccm.py","link_basis":"harvester_set","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":"2258cab64f4fe6dd"}},{"code_sha256_prefix":"ead1e793d8f65940","entry":"calculate_magnitudes","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/mlp.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/mlp.py","link_basis":"harvester_set","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":"ead1e793d8f65940"}},{"code_sha256_prefix":"88ca1ae98eead617","entry":"check_confounders","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/utils.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/utils.py","link_basis":"harvester_set","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":"88ca1ae98eead617"}},{"code_sha256_prefix":"665650f6dc5d52b7","entry":"create_scm_graph","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/scm.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/scm.py","link_basis":"harvester_set","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":"665650f6dc5d52b7"}},{"code_sha256_prefix":"0f245c032bfe50da","entry":"format_vector_values","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/plot.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/plot.py","link_basis":"harvester_set","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":"0f245c032bfe50da"}},{"code_sha256_prefix":"6e3d415f253c4112","entry":"get_root_nodes_mask","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/scm.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/scm.py","link_basis":"harvester_set","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":"6e3d415f253c4112"}},{"code_sha256_prefix":"6d7b4720abae6d94","entry":"gumbel_softmax","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/baselines/cuts.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/baselines/cuts.py","link_basis":"harvester_set","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":"6d7b4720abae6d94"}},{"code_sha256_prefix":"810f75d172bcd4ad","entry":"initialize_biases","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/initialization.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/initialization.py","link_basis":"harvester_set","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":"810f75d172bcd4ad"}},{"code_sha256_prefix":"a87ef11e3dd91c9f","entry":"next_pow_two","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/baselines/ccm.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/baselines/ccm.py","link_basis":"harvester_set","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":"a87ef11e3dd91c9f"}},{"code_sha256_prefix":"36afd41b1830ebb0","entry":"process_confounders","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/utils.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/utils.py","link_basis":"harvester_set","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":"36afd41b1830ebb0"}},{"code_sha256_prefix":"5cfe2ebe0302af52","entry":"propagate_mlp_at_node","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/mlp.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/mlp.py","link_basis":"harvester_set","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":"5cfe2ebe0302af52"}},{"code_sha256_prefix":"fd3dc305d21c388c","entry":"sample_scale_free_DAG","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/scm.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/scm.py","link_basis":"harvester_set","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":"fd3dc305d21c388c"}},{"code_sha256_prefix":"fe027f1e8d858d64","entry":"score","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/score.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/score.py","link_basis":"harvester_set","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":"fe027f1e8d858d64"}},{"code_sha256_prefix":"5a77ea68b688effd","entry":"solve_single_system","repo":"kausable/CausalDynamics","repo_kind":"official","path":"src/causaldynamics/systems.py","file_url":"https://github.com/kausable/CausalDynamics/blob/HEAD/src/causaldynamics/systems.py","link_basis":"harvester_set","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":"5a77ea68b688effd"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}