Final Matching & Propagation¶
The last stage: filter to high-confidence pivots, fit the final embedding on them, then extend coverage to every remaining cell.
Two confidence gates¶
Fed-MaxFuse applies two independent filters, and conflating them is a common mistake:
| Gate | Symbol | Config key | Controls |
|---|---|---|---|
| Pivot filter | \(\alpha\) | filtering.pivot_wt |
What the model learns from |
| Propagation filter | \(\beta\) | filtering.propagation_wt |
What you report |
\(\alpha\) discards the weakest fraction of the refined matching, leaving \(\Pi^{\text{pivot}}\), the high-confidence subset on which the final CCA embedding weights are fitted. \(\beta\) is applied later, to the propagated matching, and determines final coverage.
Filtering is local, and both nodes agree
Because the Split-Π convention shares match weights across nodes, each node can apply \(\alpha\) independently and arrive at the same subset, so no extra communication round is needed.
Propagation¶
After filtering, most cells are not pivots. In the Tonsils configuration only 8,885 of 12,977 RNA cells and 16,190 of 178,919 CODEX cells survive as pivots. The rest need partners.
For each unmatched cell:
- Find its nearest neighbour within its own modality among the pivot cells.
- Inherit that pivot's cross-modal partner.
This runs locally on each node: it is a same-modality nearest-neighbour search, so it needs no data from the other side. Both directions are performed, so cells unmatched in either modality gain a partner.
Metric choice matters here
The nearest-neighbour metric used for propagation is a real algorithmic choice, not a detail.
The reference implementation's default changed between the published manuscript
(correlation) and the released package (euclidean), without a version change. When
comparing Fed-MaxFuse against a centralized baseline, record which metric that baseline
used; otherwise it is an uncontrolled difference in the comparison. See
Comparison with Centralized MaxFuse.
Server-side reconciliation¶
Propagation is local, but its joining is not. Each node produces its own propagated index list, and the server must reconcile them:
NODE i: Π^prop_{i−1} ← Propagate(Π^pivot_(i−1,2), X_iᵐ'ᵉ)
Send(Π^prop_{i−1}, to='SERVER', action='PROP_MATCHING')
SERVER: Π^prop ← JoinAndAlign(Π^prop₀, Π^prop₁)
Send back to both nodes
NODE i: X̃_i′ ← FuzzySmoothing(X_iᵐ(Π^prop_{i−1})′, G_Xi, w)
Send(X̃_i′, to='SERVER', action='FINAL_MATCHING')
SERVER: ServerMatching(...) # ensures uniqueness
Π* ← RemoveRedundantConnections(...) # drop duplicate lower-weight links
Π^final ← FilterOutBadMatches(Π*, β)
Send(Π^final_(i−1,2), to='i')
NODE i: X_{i,e} ← GetEmbeddingsCCA(X_i, X_iᵐ'ᵉ) # local, full data
The final embedding computation is local: each node already holds the CCA weights fitted on the filtered pivots, so it projects its own full dataset through them without further communication.
Choosing α and β¶
There is no formula. The values used in the thesis, and the pattern behind them:
| Setting | Antibodies (stronger linkage) | Tonsils (weaker linkage) |
|---|---|---|
\(\alpha\) (pivot_wt) |
0.3 | 0.5 |
\(\beta\) (propagation_wt) |
0.0 | 0.3 |
Weaker linkage ⇒ filter harder. With only 32 usable shared features the initial matching is noisier, so a larger fraction should be discarded before fitting the embedding.
The cost is coverage. On Tonsils, \(\beta = 0.3\) leaves 125,243 of 178,919 matched pairs. That is the trade: a smaller, cleaner matching versus a larger, noisier one.
Sanity check your α
After filtering, inspect how many cells survive as pivots. If \(\alpha\) starves the final CCA
of training pairs, embedding quality degrades even though each surviving pair is individually
better. Use cli analysis matching --summary to inspect the result.
Outputs¶
Each run produces six artifacts, written incrementally so a crashed job still leaves usable results:
| File | Contents |
|---|---|
meta_embedding.npy |
Joint embedding, meta modality |
non_meta_embedding.npy |
Joint embedding, non-meta modality |
matching.csv |
Final matching: indices + scores |
supervised_evaluation_metrics.json |
Accuracy, F1s, FOSCTTM, FOSKNN |
unsupervised_evaluation_metrics.json |
MRRE, Steadiness, Cohesiveness, Stress |
local_evaluation_metrics.json |
Pointwise metrics for CheckViz / Reliability Map |
See Evaluation Framework.