{"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-2608-15645","title":"Generalised Transportability via Causal Abstractions","arxiv_id":"2608.15645","date":"2026-08-16","proceeding":null,"authors":["Yorgos Felekis","Paris Giampouras","Fabio Massimo Zennaro","Theodoros Damoulas"],"abstract":"Transporting a causal conclusion from a source study population to a target one is a fundamental problem in causal inference. The theory of transportability provides a criterion for when this is possible: given experimental data from the source and observational data from the target, it determines whether a target query is identifiable and does so completely; i.e. if the query can be transported, the criterion finds the exact formula. However, it works one query at a time and returns an expression rather than the value itself. It is also silent in two practically important regimes: when the query is not transportable and when no target data exist at all. To tackle both, we take a model-level perspective grounded in Causal Abstraction theory. Source and target share variables, graph, and interventions, differing only at a known set of mechanisms, which makes transportability a special case of same-level abstraction. Thus, instead of asking whether one query transports, we ask whether a single map aligns the source and target across their interventional behaviour. We characterise when such a map exists in both the Markovian and semi-Markovian settings; when it does, every target query transports at once. Our main contribution lies in the approximate case. When no exact map exists, the best approximate one still yields certified query intervals, recasting abstraction error as a quantitative notion of approximate transportability. We formulate model-level transport as distributionally robust optimisation over mechanism and environment perturbations of the unseen target and derive certificates for both challenging regimes: bounds for non-transportable queries, and guarantees under target-agnostic settings. We evaluate our framework on synthetic Markovian and semi-Markovian benchmarks and a real ecological dataset, and we show that the certified intervals bracket the true interventional query.","url_abs":"https://arxiv.org/abs/2608.15645","url_pdf":"https://arxiv.org/pdf/2608.15645","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":null,"mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2608.15645"}},"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/yfelekis/traca","reach":null}],"summary":{"ran":8,"ran_fixture":7,"ran_honours":9,"ran_violates":2,"ran_draft_wrong":4,"unverified":3},"by_repo_kind":{"found_in_text":{"samples":33,"ran":30,"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":33,"samples":[{"code_sha256_prefix":"088a509fd985e03d","entry":"ColumnBudget","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"088a509fd985e03d"}},{"code_sha256_prefix":"5ddaa6fa041a0a88","entry":"ConstructiveClass","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"5ddaa6fa041a0a88"}},{"code_sha256_prefix":"7a473e4a4e07be9f","entry":"EntrywiseBox","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"7a473e4a4e07be9f"}},{"code_sha256_prefix":"2562efe9857057f1","entry":"FrobeniusBall","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"2562efe9857057f1"}},{"code_sha256_prefix":"7d14c9ea4a2c889b","entry":"GelbrichBall","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"7d14c9ea4a2c889b"}},{"code_sha256_prefix":"5f84cd342e9e9b9e","entry":"OptResult","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"5f84cd342e9e9b9e"}},{"code_sha256_prefix":"b7c99b6d3e5d42d8","entry":"OptimConfig","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"b7c99b6d3e5d42d8"}},{"code_sha256_prefix":"2375ef36cd24f5fc","entry":"RowBudget","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"2375ef36cd24f5fc"}},{"code_sha256_prefix":"d4ad9b6ab8563ee9","entry":"_apply_shift_mask","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"invariant","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"d4ad9b6ab8563ee9"}},{"code_sha256_prefix":"1eb725ff497be42c","entry":"_build_propagators","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"1eb725ff497be42c"}},{"code_sha256_prefix":"cb1ac0a98ddc0c39","entry":"_check_converged","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"well_formed","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"cb1ac0a98ddc0c39"}},{"code_sha256_prefix":"8a00d1cc5d175f87","entry":"_cov_prox_update","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"8a00d1cc5d175f87"}},{"code_sha256_prefix":"fbfd00c48f76250c","entry":"_enumerate_box_corners","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"fbfd00c48f76250c"}},{"code_sha256_prefix":"6fd8e5f7d346464a","entry":"_interventional_exo_target","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"6fd8e5f7d346464a"}},{"code_sha256_prefix":"a5f1af5983651f07","entry":"_pi_inv","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"deterministic","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"a5f1af5983651f07"}},{"code_sha256_prefix":"4582fb9ec4182319","entry":"_pushed_cov","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_violates","verification_level":1,"contract_check":"VIOLATES","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"4582fb9ec4182319"}},{"code_sha256_prefix":"aae728fc0c0203d4","entry":"_pushed_mean","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_violates","verification_level":1,"contract_check":"VIOLATES","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"aae728fc0c0203d4"}},{"code_sha256_prefix":"51e37fd5886114c8","entry":"_resolve_pairs","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.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":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"51e37fd5886114c8"}},{"code_sha256_prefix":"418840e7e34590ab","entry":"_target_gaussian","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"deterministic","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"418840e7e34590ab"}},{"code_sha256_prefix":"fb13a1e0d05ce94d","entry":"_to_observed","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"deterministic","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"fb13a1e0d05ce94d"}},{"code_sha256_prefix":"b27bc6f6d8aa4d24","entry":"as_rng","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"b27bc6f6d8aa4d24"}},{"code_sha256_prefix":"ab8d1f32123c6aad","entry":"bundle_exo_means","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"ab8d1f32123c6aad"}},{"code_sha256_prefix":"c5cb793dc33fe3f2","entry":"bures_sqrt","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"c5cb793dc33fe3f2"}},{"code_sha256_prefix":"610e8e4c9ad8f608","entry":"gating_matrix","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"MISDECLARED","metamorphic_tier":"well_formed","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"610e8e4c9ad8f608"}},{"code_sha256_prefix":"e068402c89ad410c","entry":"gelbrich_distance","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"MISDECLARED","metamorphic_tier":"invariant","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"e068402c89ad410c"}},{"code_sha256_prefix":"2feb62b1bfcd90f6","entry":"interventional_exo_mean","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"invariant","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"2feb62b1bfcd90f6"}},{"code_sha256_prefix":"8f9ba7b31c2d4ce8","entry":"numerical_gradient","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"invariant","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"8f9ba7b31c2d4ce8"}},{"code_sha256_prefix":"c9af62f8a8268663","entry":"perturbed_propagator","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"invariant","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"c9af62f8a8268663"}},{"code_sha256_prefix":"97ba326835df44c4","entry":"project_l1","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"97ba326835df44c4"}},{"code_sha256_prefix":"0c2f3bd2b5f846ac","entry":"resolve_districts","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"0c2f3bd2b5f846ac"}},{"code_sha256_prefix":"4c1c08254ede7a25","entry":"GaussianLoss","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"4c1c08254ede7a25"}},{"code_sha256_prefix":"86eb9fae9e007486","entry":"_restrict_loss_gaussian","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"86eb9fae9e007486"}},{"code_sha256_prefix":"42a7b6d212f1f70e","entry":"fit_gaussian","repo":"yfelekis/traca","repo_kind":"found_in_text","path":"traca/optim.py","file_url":"https://github.com/yfelekis/traca/blob/HEAD/traca/optim.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"42a7b6d212f1f70e"}}]},"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}