{"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/arxiv-2603-21844","title":"On the Number of Conditional Independence Tests in Constraint-based Causal Discovery","arxiv_id":"2603.21844","date":"2026-03-23","proceeding":null,"authors":["Marc Franquesa Monés","Jiaqi Zhang","Caroline Uhler"],"abstract":"Learning causal relations from observational data is a fundamental problem with wide-ranging applications across many fields. Constraint-based methods infer the underlying causal structure by performing conditional independence tests. However, existing algorithms such as the prominent PC algorithm need to perform a large number of independence tests, which in the worst case is exponential in the maximum degree of the causal graph. Despite extensive research, it remains unclear if there exist algorithms with better complexity without additional assumptions. Here, we establish an algorithm that achieves a better complexity of $p^{\\mathcal{O}(s)}$ tests, where $p$ is the number of nodes in the graph and $s$ denotes the maximum undirected clique size of the underlying essential graph. Complementing this result, we prove that any constraint-based algorithm must perform at least $2^{Ω(s)}$ conditional independence tests, establishing that our proposed algorithm achieves exponent-optimality up to a logarithmic factor in terms of the number of conditional independence tests needed. Finally, we validate our theoretical findings through simulations, on semi-synthetic gene-expression data, and real-world data, demonstrating the efficiency of our algorithm compared to existing methods in terms of number of conditional independence tests needed.","url_abs":"https://arxiv.org/abs/2603.21844","url_pdf":"https://arxiv.org/pdf/2603.21844","source":{"archive":null,"snapshot":"2025-07-28","note":"not in the Papers with Code archive (frozen at the snapshot)","row_kind":"graph","title_abstract_authors_date":"arXiv metadata, CC0 1.0 (https://info.arxiv.org/help/license)"},"code_links":[],"tasks":[],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2603.21844","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2603.21844"}},"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":[{"mentioned_in_github":null,"is_official":null,"provenance":"deterministic:regex_extraction","mentioned_in_paper":null,"url":"https://github.com/uhlerlab/greedy-ancestral-search","reach":null}],"summary":{"ran_fixture":1,"ran_draft_wrong":3,"unverified":1},"by_repo_kind":{"found_in_text":{"samples":5,"ran":4,"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":"4dee5fe87b3a9a88","entry":"_get_orientations","repo":"uhlerlab/greedy-ancestral-search","repo_kind":"found_in_text","path":"greedy_ancestral_search/core.py","file_url":"https://github.com/uhlerlab/greedy-ancestral-search/blob/HEAD/greedy_ancestral_search/core.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"4dee5fe87b3a9a88"}},{"code_sha256_prefix":"60010269ac0f871c","entry":"_orient_extra","repo":"uhlerlab/greedy-ancestral-search","repo_kind":"found_in_text","path":"greedy_ancestral_search/core.py","file_url":"https://github.com/uhlerlab/greedy-ancestral-search/blob/HEAD/greedy_ancestral_search/core.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"60010269ac0f871c"}},{"code_sha256_prefix":"ff39134a59a01e01","entry":"_orientation_by_ci_tests","repo":"uhlerlab/greedy-ancestral-search","repo_kind":"found_in_text","path":"greedy_ancestral_search/core.py","file_url":"https://github.com/uhlerlab/greedy-ancestral-search/blob/HEAD/greedy_ancestral_search/core.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"ff39134a59a01e01"}},{"code_sha256_prefix":"7686b8dd9ed5a4b2","entry":"_orientation_by_ordering","repo":"uhlerlab/greedy-ancestral-search","repo_kind":"found_in_text","path":"greedy_ancestral_search/core.py","file_url":"https://github.com/uhlerlab/greedy-ancestral-search/blob/HEAD/greedy_ancestral_search/core.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"7686b8dd9ed5a4b2"}},{"code_sha256_prefix":"9d8691747b84d359","entry":"greedy_ancestral_search","repo":"uhlerlab/greedy-ancestral-search","repo_kind":"found_in_text","path":"greedy_ancestral_search/core.py","file_url":"https://github.com/uhlerlab/greedy-ancestral-search/blob/HEAD/greedy_ancestral_search/core.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":"9d8691747b84d359"}}]},"arxiv_metadata":{"licence":"arXiv metadata, CC0 1.0 (https://info.arxiv.org/help/license)","fields":["title","abstract","authors","date"],"primary_category":"cs.LG","source":"arxiv_2026.jsonl"},"syntology_extracted_results":null}