Skip to content

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:

  1. Find its nearest neighbour within its own modality among the pivot cells.
  2. 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.