ADVANCED ESTIMATION · PHD TRACK

Distributed &
Decentralized Fusion

Two trackers, one truth — how to combine estimates across a network without counting the same evidence twice.

Prerequisites: Information Filter + Covariance Intersection. Kalman fluency assumed.
12
Chapters
9
Simulations
IF + CI
Assumed Fluency

Chapter 0: Two Radars, One Aircraft — and a Lie of Confidence

Two radar sites both track the same aircraft. Each hands you a track: a state estimate and a covariance ellipse. Surely fusing them — averaging weighted by confidence — gives you a better track. It gives you a smaller ellipse. It does not necessarily give you a smaller error.

Make it concrete. Radar A reports the aircraft with a 1 km ellipse; radar B reports it with a 1.2 km ellipse. You have done the textbook move a dozen times on this site (combining two measurements, the information filter): convert to information, add, invert. Out comes an ellipse of roughly three-quarters the size — σ ≈ 0.77 km. Tighter than either input. Progress, apparently.

Now ask the fatal question: what did that rule assume? That the two errors are independent. But both trackers were initialized from the same flight-plan prior. Both use the same constant-velocity physics chasing the same actual wind gusts. And if the two sites ever exchanged tracks before, each estimate already contains pieces of the other. Their errors are not independent opinions — they are two retellings of substantially the same story.

Here is the pathology in its purest form: fuse the same two tracks twice. The information doubles again; the ellipse shrinks by another factor of √2. Nothing new was measured. Keep iterating and the claimed variance is halved every round while the true error variance never moves — with the numbers we will derive in Chapter 3, the consistency ratio (NEES) grows like 1.2 × 2k−1 after k mutual exchanges. The filter becomes arbitrarily confident and not one bit more correct.

The crime has a name: double counting of common information — information that both estimates already contain. A shared prior. Shared process noise from chasing the same physical target. A previously exchanged message coming back around like a rumor you started yourself.

This is not a radar curiosity. Multi-robot SLAM merging maps between robots, V2X cars sharing perceived pedestrians, satellite constellations sharing orbit estimates, sensor-network temperature fields — every one of these dies the same death if fusion is naive. Wherever estimates travel over a network, the overlap problem travels with them.

This lesson builds the complete arsenal, one discipline per chapter: (1) bookkeep the overlap exactly — channel filters, exact on tree networks; (2) refuse to claim what you cannot prove — covariance intersection and the geometric mean, consistent anywhere; (3) restructure so the overlap is pre-paid — federated splitting; (4) agree by iteration — consensus. One problem, four answers.

The honest framing: this is a lesson about epistemic hygiene in networks. Every algorithm here is a different answer to one question: "what do we both already know?" A covariance ellipse is a promise about your own error. Fusion that ignores shared information breaks the promise a little more with every exchange.
The Confidence Spiral

The cross is the true aircraft. Warm and teal ellipses are the two radar tracks (95%). Fuse once draws the naive information-sum ellipse (red dashed). Keep exchanging repeats the mutual re-fusion: watch the ellipse shrink by √2 per round around a point that never moves toward the truth, while the NEES readout climbs. The slider controls how correlated the two track errors are drawn on Reset.

Shared-prior weight0.50
Misconception: "Two tracks are two independent opinions, so fusing them must help." Both tracks are built from the same prior, the same physics chasing the same true maneuvers, and possibly each other's past broadcasts. Their errors are correlated — so the independence assumption behind the variance shrink is false, and the fused covariance is a lie.
Check: Two trackers exchange and naively re-fuse their tracks every second with no new measurements. What happens?
PhD lens: an examiner opens here with: "State the exact assumption under which fusion-by-addition is optimal, and give three distinct mechanisms that violate it in a real network." The expected answer: conditional independence of the sources given the state; violated by (1) a shared prior, (2) common process noise from tracking the same physical target, (3) communication loops returning your own information dressed as news.

Chapter 1: Architectures — What Crosses the Wire

Before any algebra, a plumbing question. Your four radar sites must somehow act like one tracker. What travels down the wire — raw detections, finished tracks, or something in between? That one choice determines everything that can go wrong later.

Three architectures cover the field (the full taxonomy lives in fusion architectures; here is the compressed version). Centralized: every sensor streams raw measurements to one filter. Hierarchical (track-level): each site runs its own local filter and sends finished tracks up to a fusion center. Fully decentralized: peers exchange with neighbors; no center exists, and no node even knows the global topology.

Make "what crosses the wire" quantitative. A raw measurement is m numbers per detection. A track report is n + n(n+1)/2 numbers per update — the state vector plus the symmetric covariance. For a 6-state track that is 27 numbers, versus 3 for a position detection. Track fusion is not automatically the low-bandwidth option; what it buys is a lower rate (send at 1 Hz what was sensed at 50 Hz) and local autonomy — each site keeps a usable track even if the network dies.

Centralized is the gold standard for accuracy: one filter, conditionally independent raw measurements, no double counting possible by construction. It loses anyway, for reasons that have nothing to do with estimation theory: a single point of failure, raw-data bandwidth at full sensor rate, one processor sized for the whole problem — and politics. Coalition partners and competing vendors will not stream you raw data.

Hierarchical fusion commits the first correlation sin: the center receives tracks whose errors are correlated through common process noise (Chapter 6 derives exactly how much), and if the center feeds fused tracks back down to the sites, it manufactures loops (Chapter 3's nightmare).

Decentralized is the PhD-hard case and this lesson's home. Every node is a peer running its own filter and exchanging with neighbors. Survivability is the prize: kill any node and the network degrades gracefully. The price: common information is now everywhere, and nobody has the global view needed to subtract it exactly.

Here is the lesson mapped onto this taxonomy. The information filter (Chapter 2) makes decentralized exchange algebraically clean. Channel filters (Chapter 4) make it exact on trees. CI and the geometric mean (Chapter 5) make it safe on any graph. Federated filtering (Chapter 7) is hierarchical fusion done with exact bookkeeping. Consensus (Chapter 8) is decentralized agreement by iteration.

What Crosses the Wire

Switch between the three architectures and watch what flows: small dots are raw measurements (m = 2 numbers, at sensor rate), fat rectangles are track reports (n + n(n+1)/2 = 14 numbers for n = 4, at 1 Hz), diamonds are information deltas between peers. The corner readout totals the link load. Then kill a node and see which architecture survives.

Sensor rate (Hz)20
Misconception: "Decentralized fusion is chosen to save bandwidth." A full track report (27 numbers for a 6-state track) can cost more per message than a raw detection (3 numbers). Decentralization is chosen for survivability, autonomy, and data-sharing constraints — and its real price is the common-information problem, not lost accuracy per se.
Check: In hierarchical (track-level) fusion, what does each local site send to the fusion center?
PhD lens: examiners ask for numbers: "A 6-state track at 1 Hz versus 3-number detections at 50 Hz — compute both link loads, then tell me which architecture you would certify for a fault-tolerant system and why." They want the n + n(n+1)/2 formula produced on the spot (27 vs 150 numbers/s here) and the survivability-versus-optimality tradeoff argued, not recited.

Chapter 2: The Information Form — Fusion Is Addition

You met the information filter in the information filter lesson. Here is the sixty-second recap of the only fact this lesson needs: when evidence is genuinely independent, beliefs add.

The dual coordinates in three sentences. The information matrix Y = P−1 measures sharpness rather than spread. The information vector y = P−1x̂ is the estimate expressed in those coordinates. Same Gaussian, inverse bookkeeping — the derivation, and the price the predict step pays in this form, both live in sf-09.

Now the load-bearing wall of this entire lesson — the addition theorem. If the joint likelihood factorizes, p(zA, zB | x) = p(zA | x) p(zB | x), then the posterior information is a plain sum:

Y = Y0 + HATRA−1HA + HBTRB−1HB      y = y0 + HATRA−1zA + HBTRB−1zB

Each source contributes an information increment (ik, Ik) = (HkTRk−1zk, HkTRk−1Hk), and fusion is a sum — order-free, associative, perfect for a network. Feel how mechanical this is with three sensors:

Worked Numbers — Three Sensors, One Scalar

Three independent sensors measure the same scalar x, no prior. Sensor variances R = (4, 2, 4); readings z = (10.4, 9.9, 10.1). Fuse them in information form.

1
Convert each sensor to information: 1/R gives 0.25, 0.5, 0.25. The middle sensor is twice as sharp, so it carries twice the weight.
2
Add the informations: Y = 0.25 + 0.5 + 0.25 = 1.0. The fused variance is 1/Y = 1.0 — compare the best single sensor at variance 2.0: fusion doubled the sharpness.
3
Add the information votes: y = 10.4/4 + 9.9/2 + 10.1/4 = 2.6 + 4.95 + 2.525 = 10.075.
4
Recover the estimate: x̂ = y/Y = 10.075/1.0 = 10.075 — an information-weighted average sitting closest to the sharpest sensor's reading.
Verified: the informations 0.25 + 0.5 + 0.25 sum to Y = 1.0, so the fused variance is 1.0 — twice as sharp as the best single sensor (variance 2.0) — and y = 10.075 gives the fused mean 10.075.

Now flip the theorem around, because this pivot is the whole lesson. Addition is exact only under conditional independence given the state. The "given x" matters: two sensors are conditionally independent when, once you know the true state, their errors share nothing. Two tracks never satisfy this — they share priors and process noise, so even perfect knowledge of x leaves their errors entangled.

Everything from Chapter 3 onward is about what to do when the addition theorem's hypothesis fails. Channel filters restore the hypothesis by subtracting the overlap. CI abandons addition for a convex combination. Federated filtering splits the shared terms up front so that addition becomes legal again.

A note that pays off in Chapter 8: the increments (Ik, ik) are cheap, local, and additive by construction. They are exactly the quantities consensus filters will average across the network.
Misconception: "The information filter is a different estimator that happens to suit networks." It is the identical Kalman posterior in inverse coordinates — the same numbers with different bookkeeping. And its famous fusion-is-addition property is not a property of the coordinates but of conditional independence, which two exchanged tracks never satisfy.
Check: The "fusion is addition" rule Y = Y0 + Σ HkTRk−1Hk is exact precisely when…
PhD lens: the examiner probes the hypothesis, not the formula: "Write the exact factorization that justifies additive fusion, then construct a minimal counterexample where it fails." The clean counterexample is two nodes sharing a prior — which is exactly the next chapter, so a strong student can segue straight into the over-count identity Ynaive = Ycentral + Ycommon.

Chapter 3: The Common-Information Problem — Double Counting & Rumor Propagation

Here is the smallest crime scene in distributed estimation: two nodes, one shared prior, one measurement each. Add their posteriors and you have committed the canonical sin. Let us catch it in four lines of algebra.

The setup, with full numbers. Shared prior N(0, 4). Node A measures zA = 1.2; node B measures zB = 0.8; both with measurement variance R = 1. Each runs a perfectly legal Bayes update — nobody has made an error yet. Node A ends up holding N(0.96, 0.8); node B holds N(0.64, 0.8).

Now commit the crime: fuse by addition. Y = 1.25 + 1.25 = 2.5 and y = 1.2 + 0.8 = 2.0, so the naive fused belief is N(0.8, 0.4). Compare the truth: the centralized filter sees the prior once plus both measurements, Y = 0.25 + 1 + 1 = 2.25, giving N(0.8889, 0.4444). The naive answer is sharper and biased toward the prior mean — because the prior voted twice.

Extract the identity and frame it, because it is the entire field's problem statement in one line:

Ynaive = YA + YB = (Y0 + IA) + (Y0 + IB) = Ycentralized + Y0

The excess is exactly the common information — here, the shared prior's Y0 = 0.25. Every algorithm in this lesson is an accounting strategy for that excess term.

The damage is not just bookkeeping — it is a measurable estimator property. The naive fused mean (zA + zB)/2.5 has an actual error variance of 0.48 (worked below), while claiming 0.4. Its expected NEES is 1.2 instead of 1: measurably, testably overconfident, detectable with the machinery from debugging consistency.

Now let the crime compound. In a cyclic network, node A's measurement travels A→B→C→A. When it returns home wearing C's posterior, node A cannot recognize its own information inside it — and adds it again. Each lap around the loop re-counts the same evidence. This is rumor propagation: confidence spirals upward while no new physics happens.

Understand why this is hard, not merely careless. In a decentralized network with latency, dropouts, and no global registry, no node knows what any other node already knows. Common information is not a bug you patch; it is a quantity you must either track exactly (Chapter 4), bound conservatively (Chapter 5), pre-allocate (Chapter 7), or dilute by averaging (Chapter 8).

The failure cascade, for realism: the overconfident covariance shrinks the association gates (data association), the filter starts rejecting the true measurements as outliers, and the track diverges while reporting its best-ever confidence. This is the same silent-killer signature that sf-21 teaches you to detect with NEES.
Rumor Propagation on a Ring

Node A makes ONE measurement (the glowing packet, worth Y = 1 unit of information). Step hops it around the cycle inside each posterior; every receiving node re-adds it. The bars show each node's claimed information against the dashed line at the TRUE total in the whole network. Break the loop and the packet propagates once to everyone — then the bars freeze at the honest level.

Nodes in ring3
Worked Numbers — The Canonical Double Count

Shared prior N(0, 4). Node A measures zA = 1.2, node B measures zB = 0.8, both with measurement variance R = 1. Compare naive information addition of the two posteriors against the centralized answer, then compute what the naive fuser's REAL error variance is.

1
Node A's posterior in information form: YA = 1/4 + 1/1 = 1.25, yA = 0/4 + 1.2/1 = 1.2, so mean 1.2/1.25 = 0.96, variance 1/1.25 = 0.8.
2
Node B identically: YB = 1.25, yB = 0.8, so mean 0.64, variance 0.8.
3
Naive fusion adds both: Y = 2.5, y = 2.0 — mean 0.8, claimed variance 0.4.
4
Centralized truth counts the prior once: Y = 0.25 + 1 + 1 = 2.25, y = 0 + 1.2 + 0.8 = 2.0 — mean 0.888889, variance 0.444444. The over-count is exactly Y0 = 0.25: Ynaive = Ycentral + Ycommon.
5
Actual error of the naive mean (zA + zB)/2.5: substitute zi = x + vi to get error (−0.5x + vA + vB)/2.5, with variance (0.25 × 4 + 2)/6.25 = 3/6.25 = 0.48.
6
So the naive fuser claims 0.4 but delivers 0.48: expected NEES = 0.48/0.4 = 1.2 — a 20% consistency violation from ONE shared prior, before any loops.
Verified (Monte Carlo confirms ~0.48): node posteriors are N(0.96, 0.8) and N(0.64, 0.8). Naive addition claims N(0.8, 0.4); the centralized answer is N(0.888889, 0.444444); the over-count Ynaive − Ycentral = 0.25 is exactly the shared prior's information. The naive estimator's actual error variance is 0.48, so its expected NEES is 1.2 instead of 1.
Misconception: "Double counting is a small bias that washes out over time." It compounds: in a loop every recirculation re-adds the same evidence, claimed information grows without bound, the shrinking gates then reject true measurements, and the filter diverges while reporting maximal confidence.
Check: Two nodes with a shared prior each do a correct local Bayes update, then fuse by adding informations. The result is exactly:
PhD lens: the examiner wants the over-count made formal: "Define common information for two Gaussian posteriors and prove Ynaive = Ycentral + Ycommon for the shared-prior case. Then explain why NEES, not RMSE, is the right instrument to detect it." Strong answers connect the identity to its detector: overconfidence shows up as NEES > dof long before errors visibly grow.

Chapter 4: Channel Filters — Exact Decentralized Fusion on Trees

If the crime is counting shared evidence twice, the honest fix is an accountant: on every communication link, keep a running ledger of everything the two endpoints both know — and subtract it at fusion time.

Start from the identity we just proved: Ynaive = Ycentral + Ycommon. So compute the fusion as

Yfused = YA + YB − Ycommon      yfused = yA + yB − ycommon

The channel filter (the heart of Grime & Durrant-Whyte's decentralized data fusion architecture) is a small filter living on the link itself, whose entire job is to maintain (Ycommon, ycommon).

What does the ledger hold, and how does it evolve? After an exchange, both endpoints hold the same fused posterior — so that is now their common information, and the channel stores it. Between exchanges, both nodes predict with the same F and Q, so the channel applies the same predict to its stored ledger. New local measurements are the only thing the ledger does not contain — exactly the increments that deserve to be added.

One round on a two-node link, mechanically: (1) both nodes and the channel run the identical information-form predict; (2) each node adds its own local measurement increment; (3) they exchange posteriors; (4) each computes YA + YB − Ych; (5) both nodes — and the ledger — now hold the fused result. The exactness proof is one line:

YA + YB − Ych = (Ypred + IA) + (Ypred + IB) − Ypred = Ypred + IA + IB

— which is precisely the centralized update. Not approximately: bit for bit.

Scale from a link to a network. On a tree (no cycles), each node runs one channel filter per neighbor, and information percolates hop by hop with every overlap correctly subtracted. The decentralized network is exactly equivalent to the centralized filter, with delay equal to the graph diameter. The structural reason is the same one that makes message passing exact on trees: each link separates the tree into two halves, so pairwise ledgers capture ALL shared information.

Now break it honestly, because quals will. Loops. With a cycle A–B–C–A, information from A reaches C by two paths. The A–C channel ledger only knows what crossed the A–C link; the copy that arrived via B looks brand new. Pairwise bookkeeping cannot represent multi-hop overlap — double counting returns, slower than naive fusion but just as inexorable.

And the operational fragilities: links must be reliable (a dropped message desynchronizes the ledger), communication should be full-rate or carefully burst-reconciled, and dynamic topologies — nodes joining, links re-routing around failures, the exact survivability we wanted! — silently create temporary cycles. Practical systems either enforce a spanning tree by protocol or give up exactness for CI (next chapter).

The design tradeoff, stated plainly: channel filters buy EXACTNESS at the price of topological discipline. When you can guarantee a tree, take the free lunch. When you cannot, you need an algorithm whose correctness does not depend on knowing what others know.
The Ledger at Work — Chain A—B—C

Three nodes track a slowly drifting scalar; a ledger box sits on each edge showing its stored information. Step round: predict, local measurements, then ledger-subtracting exchanges — the readout shows the live arithmetic YA + YB − Ych. The bars compare node A's information with a centralized ghost fed all measurements: exactly equal, step after step. Then add the loop edge and watch the equality break.

Meas. noise R1.00
Worked Numbers — The Ledger Repairs the Sum

Same scenario as Chapter 3: shared prior N(0, 4), zA = 1.2 and zB = 0.8 with R = 1. Now fuse with a channel filter whose ledger holds the common information — the shared prior.

1
Before any exchange, what do A and B both know? Only the prior: the channel ledger is Ych = 1/4 = 0.25, ych = 0.
2
Locals are as before: YA = 1.25, yA = 1.2 and YB = 1.25, yB = 0.8.
3
Channel-filter fusion subtracts the ledger: Y = 1.25 + 1.25 − 0.25 = 2.25 and y = 1.2 + 0.8 − 0 = 2.0.
4
Recover the estimate: mean 2.0/2.25 = 0.888889, variance 1/2.25 = 0.444444 — compare the centralized answer from Chapter 3: identical to machine precision.
5
After the exchange, both nodes AND the ledger hold N(0.888889, 0.444444); the next round's subtraction will be correct again. The over-count is not reduced — it is eliminated.
Verified: subtracting the ledger (the shared prior, information 0.25) repairs the sum: Y = 1.25 + 1.25 − 0.25 = 2.25 with y = 2.0, giving mean 0.888889 and variance 0.444444 — the centralized answer exactly (exact match: True).

From Scratch: a Two-Node Channel Filter, Verified Against Centralized

The exactness theorem as executable code — a dynamic 1D constant-velocity target, two sensors, full-rate comms on one link. The ledger predicts alongside the nodes, the fusion subtracts it, and the assert at the bottom demands bit-for-bit equality with the centralized information filter, every step, for 25 steps.

python — channel filter == centralized, on a tree
import numpy as np

# 1D constant-velocity target, two sensors, full-rate comms on one link.
dt = 1.0
F = np.array([[1, dt], [0, 1]])
Q = 0.05 * np.array([[dt**3/3, dt**2/2], [dt**2/2, dt]])
H = np.array([[1.0, 0.0]])
R_A, R_B = np.array([[1.0]]), np.array([[2.25]])

def to_info(x, P):
    Y = np.linalg.inv(P)
    return Y, Y @ x

def from_info(Y, y):
    P = np.linalg.inv(Y)
    return P @ y, P

def predict_info(Y, y):
    x, P = from_info(Y, y)                 # info-form predict = round-trip
    return to_info(F @ x, F @ P @ F.T + Q)

rng = np.random.default_rng(7)
x_true = np.array([0.0, 1.0])
x0, P0 = np.array([0.0, 0.8]), np.diag([4.0, 1.0])

Yc, yc = to_info(x0, P0)      # centralized reference
YA, yA = to_info(x0, P0)      # node A
YB, yB = to_info(x0, P0)      # node B
Ych, ych = to_info(x0, P0)    # channel ledger: what A and B both know

for k in range(25):
    x_true = F @ x_true + rng.multivariate_normal(np.zeros(2), Q)
    zA = H @ x_true + rng.normal(0, np.sqrt(R_A[0, 0]), 1)
    zB = H @ x_true + rng.normal(0, np.sqrt(R_B[0, 0]), 1)
    iA, IA = H.T @ np.linalg.inv(R_A) @ zA, H.T @ np.linalg.inv(R_A) @ H
    iB, IB = H.T @ np.linalg.inv(R_B) @ zB, H.T @ np.linalg.inv(R_B) @ H

    Yc, yc = predict_info(Yc, yc); Yc, yc = Yc + IA + IB, yc + iA + iB
    YA, yA = predict_info(YA, yA); YA, yA = YA + IA, yA + iA
    YB, yB = predict_info(YB, yB); YB, yB = YB + IB, yB + iB
    Ych, ych = predict_info(Ych, ych)      # the ledger predicts too!

    Yf, yf = YA + YB - Ych, yA + yB - ych  # fuse, minus common info
    YA, yA = Yf.copy(), yf.copy()          # both nodes adopt the fusion
    YB, yB = Yf.copy(), yf.copy()
    Ych, ych = Yf.copy(), yf.copy()        # ...which is now the shared info

xf, Pf = from_info(Yf, yf)
xc, Pc = from_info(Yc, yc)
print('decentralized:', np.round(xf, 6), ' P[0,0] =', round(Pf[0, 0], 8))
print('centralized:  ', np.round(xc, 6), ' P[0,0] =', round(Pc[0, 0], 8))
assert np.allclose(xf, xc) and np.allclose(Pf, Pc)
print('channel filter == centralized on a tree: PASS')
Misconception: "Channel filters solve double counting in general." They are exact ONLY on trees with reliable, synchronized links. A cycle creates multi-hop common information that no single edge's pairwise ledger can represent — and even one dropped message desynchronizes the ledger and reintroduces over-counting.
Check: What exactly does a channel filter store?
PhD lens: a classic quals task: "Prove that channel-filter fusion on a two-node link reproduces the centralized filter for all time, then explain the structural reason the proof fails on a cycle." The expected structure: induction on rounds using YA + YB − Ych = Ypred + IA + IB, then the observation that on a tree each edge is a graph separator — the property cycles destroy — connecting to exactness of message passing on trees.

Chapter 5: When You Cannot Track the Overlap — CI and the Geometric Mean

Channel filters demand that you know what the other node knows. On a real network — loops, dropouts, nodes joining mid-mission — you cannot. Covariance intersection is the algebra of fusing under confessed ignorance.

The recap in two sentences (the derivation and ω-optimization theory live in covariance intersection). Instead of ADDING informations, take a convex combination: Y = ωYA + (1 − ω)YB and y = ωyA + (1 − ω)yB, with ω chosen to minimize the trace or determinant of the fused covariance. The result is consistent — claimed covariance never smaller than the truth — for ANY unknown cross-correlation.

The density-level view generalizes it, and this is the PhD framing. CI is the Gaussian case of the geometric mean density — also called generalized CI (GCI), Chernoff fusion, or the log-linear pool:

pfused(x) ∝ pA(x)ω · pB(x)1−ω   ⇔   log pfused = ω log pA + (1−ω) log pB + const

It averages log-beliefs instead of multiplying beliefs. And that one design choice carries a one-line immunity proof — the intellectual heart of this chapter. Suppose both densities contain a common factor (the rumor): pA = pc qA and pB = pc qB. Then

pAω pB1−ω = pcω+(1−ω) · qAω qB1−ω = pc1 · (independent parts, weighted)

The exponents on the common factor SUM TO ONE. Shared information enters exactly once, for every ω. Double counting is structurally impossible — with no knowledge of what the shared factor even is.

Contrast with multiplication to sharpen it: naive Bayes fusion multiplies densities, so the common factor appears as pc² — that IS double counting, seen at the density level. The geometric mean is exactly the multiplication rule with the redundancy divided back out when you cannot measure it.

Now pay the bill honestly. If the two estimates actually WERE independent, GCI still only counts their independent parts with weights ω and 1−ω — it under-uses genuinely new evidence. On the Chapter 3 numbers (worked below): GCI at ω = 0.5 reports variance 0.8 where the exact answer is 0.4444 — consistent (the actual error variance 0.48 sits safely below 0.8) but nearly twice as pessimistic as necessary. Conservatism is the price of correlation-agnosticism.

Position the three regimes as an engineering dial: know the overlap exactly → subtract it (channel filter, exact). Know the cross-covariance → account for it (Bar-Shalom–Campo, next chapter). Know nothing → geometric mean (consistent, conservative). Real systems mix them: channel filters inside a well-managed subtree, CI at the boundary where subtrees meet.

The ecosystem in one beat: fast closed-form ω approximations for embedded targets, split CI when part of the correlation IS known (both owned by sf-11), and GCI over non-Gaussian densities — including fusing multi-target PHD intensities (multi-target tracking with RFS) — since the geometric-mean argument never used Gaussianity.
CI vs Naive vs Every Possible Truth

Warm and teal are estimates A and B. Red dashed is naive addition — always the smallest ellipse. Purple is the CI/GCI ellipse at your ω. The thin gray family shows the EXACT fused ellipse for each possible cross-correlation ρ — the truths you cannot rule out. The visual theorem: the CI ellipse bounds every gray candidate; the naive ellipse fails most of them. The inset plots det(Pfused) versus ω with the minimizer ω* marked.

ω (weight on A)0.50
Worked Numbers — The Price and the Promise

Same two node posteriors as Chapter 3 — N(0.96, 0.8) and N(0.64, 0.8), built from a shared prior N(0, 4) and measurements zA = 1.2, zB = 0.8 with R = 1. Fuse with the geometric mean at ω = 0.5 and audit consistency.

1
Convex information combination: Y = 0.5 × 1.25 + 0.5 × 1.25 = 1.25 and y = 0.5 × 1.2 + 0.5 × 0.8 = 1.0.
2
Recover: mean = 1.0/1.25 = 0.8, claimed variance = 1/1.25 = 0.8.
3
Audit the claim: the fused mean (zA + zB)/2.5 is the same linear estimator as the naive fuser's, whose actual error variance Chapter 3 derived as 0.48.
4
Consistency check: GCI claims 0.8 ≥ actual 0.48 — an honest, conservative report. The naive claim 0.4 ≥ 0.48 is FALSE — inconsistent.
5
Compare to exact: the channel filter achieved 0.444444. GCI pays roughly 1.8× pessimism (0.8 vs 0.4444) for never needing to know the overlap. Same estimate, three different promises — only the naive promise is broken.
Verified: with ω = 0.5 the geometric mean reports mean 0.8 with claimed variance 0.8. The estimator's actual error variance is 0.48, so GCI's claim is consistent (True) while the naive claim of 0.4 is not (False); the exact channel-filter variance 0.444444 shows GCI's ~1.8× pessimism is the price of not knowing the overlap.

Production Framing: a CI Track Fuser as a Tracking Stack Ships It

This is the shape of CI in a real system — the same structure as Stone Soup's covariance-intersection fuser or a MATLAB trackFuser with a CI-style algorithm: ω chosen per fusion call by bounded scalar minimization, correlation-agnostic, safe to call on any pair of incoming tracks.

python — production CI/GCI fuser
import numpy as np
from scipy.optimize import minimize_scalar

def ci_fuse(xa, Pa, xb, Pb, cost='det'):
    """Covariance-intersection fusion of two track estimates with
    UNKNOWN cross-covariance. Consistent for any correlation.
    cost: 'det' (information volume) or 'trace' (total variance)."""
    Ya, Yb = np.linalg.inv(Pa), np.linalg.inv(Pb)
    if cost == 'det':
        f = lambda w: np.linalg.det(np.linalg.inv(w*Ya + (1-w)*Yb))
    else:
        f = lambda w: np.trace(np.linalg.inv(w*Ya + (1-w)*Yb))
    w = minimize_scalar(f, bounds=(1e-6, 1-1e-6), method='bounded').x
    Y = w*Ya + (1-w)*Yb                    # convex info combination
    P = np.linalg.inv(Y)
    x = P @ (w*(Ya @ xa) + (1-w)*(Yb @ xb))
    return x, P, w

# Two tracks of the same target from different sites; nobody knows P_AB.
xa, Pa = np.array([10.6, 0.4]), np.array([[1.0, 0.2], [0.2, 0.5]])
xb, Pb = np.array([9.8, 0.7]),  np.array([[1.5, -0.1], [-0.1, 0.3]])

x, P, w = ci_fuse(xa, Pa, xb, Pb)
print('omega* =', round(w, 4))
print('fused x =', np.round(x, 4))
print('fused P =')
print(np.round(P, 4))
# Production notes: cache omega* as the warm start for the next frame;
# fall back to fixed omega = 0.5 on embedded targets (fast CI); and use
# exact channel-filter fusion instead wherever the link topology is a
# guaranteed tree -- CI is the boundary rule, not the everywhere rule.
Misconception: "CI throws away information, so it must have worse errors." At symmetric ω its MEAN here is identical to the naive fuser's — what changes is the PROMISE. CI refuses to claim sharpness it cannot prove under unknown correlation. The pessimism lives in the reported covariance, not necessarily in the estimate itself.
Check: Why can the ω-weighted geometric mean pAωpB1−ω never double count shared information?
PhD lens: examiners push past the Gaussian formula: "Why is the log-linear pool the natural correlation-agnostic fusion rule? Prove the common-factor immunity and then tell me what you lose when the inputs are actually independent." The strong answer gives the pc1 argument, quantifies the conservatism on a worked case (0.8 vs 0.4444 here), and knows that ω selection criteria (min-det vs min-trace) live in sf-11.

Chapter 6: Track-to-Track Fusion — the Bar-Shalom–Campo Formula

Two independent radars, independent noise, independently initialized filters — surely THESE two tracks are uncorrelated? No. The target itself correlates them: both filters are chasing the same random maneuvers.

Expose the mechanism precisely. Each filter's posterior error obeys ei(k|k) = (I − KiHi)(F ei(k−1|k−1) − wk) − Kivi. There is one true target, hence one process-noise sequence wk — and the SAME wk appears in both errors. The gust that pushed the aircraft surprised both filters identically. The independent measurement noises vA, vB contribute nothing to the cross terms, but Q injects fresh correlation every single step.

The recursion that quantifies it:

PAB(k|k) = (I − KAHA)(F PAB(k−1|k−1) FT + Q)(I − KBHB)T

Even from PAB(0) = 0, the +Q term pumps the cross-covariance up to a steady state. In typical track-fusion regimes the steady-state correlation coefficient sits around 0.2–0.6 — never negligible.

Now pose the fusion problem as pure estimation: given unbiased xA, xB with covariances PA, PB and KNOWN cross-covariance PAB, find the minimum-variance linear combination. Derive it in the scalar case. Minimize Var(w xA + (1−w) xB) = w²PA + (1−w)²PB + 2w(1−w)PAB; set the derivative to zero:

w* = (PB − PAB) / (PA + PB − 2PAB)

In fusion form, this is the Bar-Shalom–Campo result:

xF = xA + (PA − PAB)(PA + PB − PAB − PBA)−1(xB − xA)
PF = PA − (PA − PAB)(PA + PB − PAB − PBA)−1(PA − PBA)

Sanity-check the limits, because that is how you know you own a formula. PAB = 0 recovers standard independent fusion. PAB → PA means B is statistically A plus extra noise — and indeed the weight on B goes to zero: B adds nothing.

Be honest about the catch that motivates the previous chapter: the PAB recursion requires knowing BOTH filters' gains and models at every step. A fusion center rarely has that with vendor black-box trackers; a peer-to-peer network never does. That is exactly the information CI declines to require. BC when you can, CI when you cannot.

Closing the loop to association: before you can fuse two tracks you must decide they ARE the same target. Track-to-track association uses this same cross-covariance inside its chi-square gate — the bookkeeping built here is reused by the association test. Depth in data association.
Correlation Makes the Naive Promise False

Track A (warm) and track B (teal), 1-σ ellipses. Drag ρ: the teal BC fused ellipse grows honestly with correlation, while the red dashed naive ellipse is frozen — naive ignores ρ. The dot cloud is 300 actual fused-error samples drawn with the TRUE correlation and combined with the NAIVE weights: watch it spill outside the red promise as ρ rises. Corner readout: claimed vs actual variance and the overconfidence factor.

Correlation ρ0.33
Worked Numbers — BC vs Naive Under ρ = 0.3266

Two unbiased track estimates of a scalar state: xA = 10.6 with PA = 1.0, and xB = 9.8 with PB = 1.5, with known cross-covariance PAB = 0.4 (correlation ρ = 0.3266). Fuse with Bar-Shalom–Campo and compare against naive independent fusion.

1
Common denominator: PA + PB − 2PAB = 1.0 + 1.5 − 0.8 = 1.7.
2
BC mean: xF = xA + (PA − PAB)/1.7 × (xB − xA) = 10.6 + (0.6/1.7)(−0.8) = 10.6 − 0.2824 = 10.3176.
3
BC covariance: PF = PA − (PA − PAB)²/1.7 = 1.0 − 0.36/1.7 = 0.7882.
4
Equivalent weights: wA = (PB − PAB)/1.7 = 1.1/1.7 = 0.6471, wB = 0.6/1.7 = 0.3529 (sum to 1); direct check wA²PA + wB²PB + 2wAwBPAB = 0.7882 — the claim equals the delivery.
5
Naive fusion ignores PAB: information weights give mean 10.28 and CLAIMED variance 0.6.
6
But the naive weights (0.6, 0.4) under the TRUE correlation deliver actual error variance 0.36 × 1.0 + 0.16 × 1.5 + 2 × 0.24 × 0.4 = 0.792 — overconfident by a factor 1.32, and even its raw error (0.792) is worse than BC's 0.7882: the optimal weights under correlation are NOT the information weights.
Verified: with PAB = 0.4 (ρ = 0.3266), BC fuses to mean 10.3176 with honest variance 0.7882 via weights (0.6471, 0.3529). Naive fusion reports mean 10.28 with claimed variance 0.6, but its actual error variance under the true correlation is 0.792 — a 1.32× overconfidence — and BC's actual variance 0.7882 also beats the naive fuser's 0.792.
Misconception: "Independent sensor noises make the two TRACKS independent." Track errors correlate through the shared process noise and any shared prior — the recursion PAB = (I−KAHA)(F PAB FT + Q)(I−KBHB)T injects fresh correlation via Q every step, even from PAB(0) = 0, because both filters are surprised by the same real maneuvers.
Check: Where does the cross-covariance between two tracks of the same target come from, even with independent sensors?
PhD lens: two standard probes. (1) "Derive the optimal weight for combining two correlated unbiased estimates and check the limit PAB → PA" — expecting w* = (PB − PAB)/(PA + PB − 2PAB) and the insight that B's weight vanishes when B is just A plus extra noise. (2) "What information does BC require that CI does not, and who in a real system possesses it?" — expecting the PAB recursion's dependence on both gains, and the vendor-black-box reality.

Chapter 7: The Federated Kalman Filter — Splitting the Prior

Channel filters subtract the overlap after the fact. The federated filter is sneakier: ration the shared information out BEFORE anyone filters, so that when you add the locals back together, the overlap sums to exactly one copy.

The architecture: a master filter and N local filters. The classic host is integrated navigation — one local filter per sensor suite (GPS/INS, baro/INS, star tracker; see INS/GNSS coupling). Each local runs a full Kalman filter; the master periodically fuses them by simple information addition. The design question: how can plain addition possibly be legal, given Chapter 3?

The trick is information-sharing factors. Give local i only a fraction βi of the common information, with Σβi = 1. Concretely: local prior covariance Pi(0) = P(0)/βi (inflated — less information), and local process noise Qi = Q/βi (also inflated). Each local is made deliberately underconfident about exactly the parts everyone shares.

The bookkeeping identity for the static case is one line. Local posterior information: Yi = βiY0 + Ii. Sum over i:

Σi Yi = (Σi βi)Y0 + Σi Ii = Y0 + Σi Ii = Ycentralized

The common part was pre-paid in shares; the unique measurement parts add freely. The worked example below runs the Chapter 3 scenario with β = 1/2 each: local priors inflate to variance 8, and plain addition lands on 0.444444 — the centralized answer, no ledger needed.

Extend honestly to dynamics: process noise is ALSO common information — Chapter 6's lesson, the same wk drives every local's target model — hence Qi = Q/βi. Here the story loses exactness. Inflating Q bounds rather than reproduces the true cross-correlations, so dynamic federated fusion is CONSERVATIVE (provably an upper bound on the centralized covariance) rather than exact — the standard result, proved by a CI-style bounding argument.

The operating modes are a real design menu. Fusion-reset (FR): after each fusion the master resets every local to the β-split fused estimate. Best accuracy — but a master fault now poisons everyone; fault tolerance is lost. No-reset (NR): locals never hear back. A GPS spoof corrupts only the GPS local, and the master can exclude it after detection. This fault isolation is WHY aerospace navigation adopted federated filters. Beta choice: βi = 1/N is standard; performance-weighted betas favor better sensors.

Position in the arsenal: federated = hierarchical architecture + exact static bookkeeping + conservative dynamic bookkeeping, purchasable only when a master exists and the local set is fixed and known. It is the disciplined middle ground between channel filters (exact, fragile topology) and CI (assumption-free, most conservative).
Beta-Splitting, Live

A master above two locals. Drag βA: one local's prior ellipse inflates, the other's deflates (Pi = P0i) — but the master's summed information bar sits EXACTLY flush against the dashed centralized line for every β. Then spoof sensor B: in NR mode, Exclude B recovers a clean estimate; in FR mode the resets have already pushed the poison into A.

βA share0.50
Worked Numbers — Plain Addition Made Legal

Chapter-3 scenario again: prior N(0, 4), measurements zA = 1.2 and zB = 0.8 with R = 1. Federated with equal shares βA = βB = 1/2: each local receives the prior DEFLATED by its share, then the master fuses by plain addition.

1
Share the prior: each local's prior information is β × Y0 = 0.5 × 0.25 = 0.125, i.e. local prior variance 1/0.125 = 8.0 — deliberately underconfident.
2
Local posteriors: Yi = 0.125 + 1 = 1.125, so each local's posterior variance is 1/1.125 = 0.888889; information votes yA = 1.2, yB = 0.8.
3
Master fuses by PLAIN addition, no subtraction: Y = 1.125 + 1.125 = 2.25, y = 1.2 + 0.8 = 2.0.
4
Result: mean 2.0/2.25 = 0.888889, variance 1/2.25 = 0.444444 — the centralized answer exactly, because the prior's information entered as 0.125 + 0.125 = 0.25: once.
5
Contrast with Chapter 3: same measurements, same addition operation — but there the prior entered as 0.25 + 0.25 = 0.5 (twice). The β-split converts an illegal add into a legal one by pre-paying the common information in shares.
Verified: with β = 1/2, each local's prior deflates to variance 8.0 (information share 0.125); each local posterior has variance 0.888889, and PLAIN information addition of the two locals gives mean 0.888889 with variance 0.444444 — exactly the centralized answer (True), no channel ledger required.
Misconception: "Beta-splitting is a heuristic downweighting, like inflating R." For the static/common information it is EXACT bookkeeping — the shares are constructed so (Σβi)Y0 = Y0 reassembles precisely once. The conservatism of federated filtering enters only through the dynamic case, where Q/βi inflation upper-bounds (rather than reproduces) the cross-correlations that shared process noise creates.
Check: Why must the information-sharing factors satisfy Σβi = 1?
PhD lens: examiners probe the exact/conservative boundary: "Prove static exactness of beta-splitting in one line, then explain precisely where exactness is lost for a dynamic system and what property the Q/βi inflation buys instead." They also love the modes: "Your federated INS must survive a GPS spoof — FR or NR mode, and what did that choice cost you?" (NR; it cost fused accuracy between exclusions.)

Chapter 8: Consensus Filtering — Agreement Without a Center

No center, no tree, no ledger — just neighbors whispering averages to neighbors. Remarkably, that is enough: repeated local averaging computes a global sum that no single node could see.

The structural problem first. The centralized information update needs the SUM over all nodes of the increments (Ik, ik) = (HTR−1H, HTR−1z) — a global quantity. In a peer-to-peer network with unknown global topology, nobody can compute a global sum directly. But there is a distributed primitive that gets arbitrarily close: average consensus.

Define it precisely. Each node holds a value ui. Repeatedly, every node replaces its value with a weighted average of itself and its neighbors: u ← Wu. If W is doubly stochastic (every row AND every column sums to 1), the total sum is invariant at every step; if the graph is connected, all values converge to the common average (1/N)Σui. Metropolis weights — Wij = 1/(1 + max(di, dj)) on edges, remainder on the diagonal — achieve double stochasticity using only LOCAL degree information. No node needs the global picture even to build W.

Quantify the speed, because quals will ask. Stack the iteration as u(k) = Wku(0); the disagreement decays as λ2k, where λ2 is the second-largest eigenvalue modulus (SLEM) of W. For the 4-node chain below, SLEM = 0.8047 — about 53 iterations for 10−5 accuracy. Better-connected graphs have smaller SLEM (a larger spectral gap) and converge faster. Topology IS convergence rate.

Worked Numbers — Diffusion Down a 4-Node Chain

Four nodes in a chain 1–2–3–4 with Metropolis weights. Node 1 holds value 4 (its local information contribution); the others hold 0. The network average is 1. Iterate u ← Wu and audit conservation, convergence, and rate.

1
Build W from local degrees (1, 2, 2, 1): edge weights 1/(1+max(di,dj)) = 1/3 on all three edges; diagonals absorb the remainder: W11 = W44 = 2/3, W22 = W33 = 1/3. Every row AND column sums to 1 — doubly stochastic from purely local information.
2
Iterate once: node 1 keeps 2/3 × 4 = 2.6667, node 2 receives 1/3 × 4 = 1.3333, nodes 3 and 4 still 0: u(1) = [2.6667, 1.3333, 0, 0]. Sum: 4.0 — conserved.
3
Iterate again: u(2) = [2.2222, 1.3333, 0.4444, 0]. The value diffuses down the chain one hop per step; the sum is still 4.0.
4
By k = 10: u(10) = [1.1945, 1.0805, 0.9194, 0.8056] — everyone within 20% of the average 1.0.
5
Rate: the eigenvalue moduli of W are (1, 0.8047, 0.3333, 0.1381), so the error contracts by the SLEM 0.8047 per step — about 53 iterations to reach 10−5. The consensus filter would now use N × (consensus value) = 4 × 1 = 4 to recover the network's total information.
Verified: Metropolis weights on the chain are doubly stochastic (all row and column sums 1), so the sum stays 4.0 while the values pass through [2.6667, 1.3333, 0, 0] at k=1, [2.2222, 1.3333, 0.4444, 0] at k=2, and [1.1945, 1.0805, 0.9194, 0.8056] at k=10 — converging to the average 1.0 geometrically at the SLEM rate 0.8047, needing about 53 iterations for 10−5 accuracy.

Now assemble the consensus information filter: between measurements, nodes run L consensus iterations on their local increments; each node then updates its posterior with N times the consensus average — because the update needs the sum, not the mean. Two honest catches. You must know N (or estimate it). And with finite L the partially-mixed sum is not the true sum: under-mixed nodes over-weight their own information, and consistency quietly leaks away as L shrinks.

The consistent repair — the modern default — is to run consensus ON THE POSTERIORS with CI-style convex weights (consensus-on-information; Battistelli & Chisci's hybrid CM-CI). Because every consensus step is then a convex information combination, Chapter 5's immunity applies at every iteration: the result is provably consistent for ANY number of iterations L, trading optimality (approached as L grows) for a guarantee that holds even at L = 1.

Consensus in the arsenal: it is the only member that needs neither topology discipline (channel filters), a master (federated), nor pairwise correlation knowledge (BC). It pays instead with iteration count per timestep, and with conservatism when made robust. This is the workhorse of large sensor networks — and of the distributed multi-target fusers that GCI-fuse PHD intensities (multi-target RFS).
Average Consensus — the Conservation Law at Work

One hot node holds 4; the rest hold 0. Each Step applies the Metropolis averaging u ← Wu: colors bleed toward uniform, the strip chart funnels every node into the dashed average, and the log inset shows the error falling on a straight line whose slope is log(SLEM). The running sum stays pinned. Add edges (topology button) and watch the SLEM drop — connectivity literally buys convergence speed.

Nodes6
Misconception: "Network-wide agreement needs a leader, a spanning tree, or global knowledge." Doubly stochastic LOCAL averaging on any connected graph suffices — the price is not structure but ITERATIONS (set by the spectral gap). The subtle failure mode is stopping early: with finite L the sum is only partially mixed, under-mixed nodes over-count themselves, and naive ×N scaling turns incomplete mixing into overconfidence.
Check: The consensus information filter multiplies the converged consensus value by N. Why?
PhD lens: expect a spectral question and a consistency question. "Relate consensus convergence rate to the graph — which eigenvalue, and what does adding an edge do?" (The SLEM of W; more connectivity widens the spectral gap.) Then: "Your radio budget allows L = 2 iterations per measurement — is the naive consensus filter consistent? What variant is, and what does it cost?" (No — under-mixing over-counts self-information; consensus-on-posteriors with CI weights is consistent for any L, at the price of conservatism.)

Chapter 9: Showcase — the Four-Node Fusion Network

Everything this lesson claimed, running live: four radar nodes, one aircraft, three topologies, three fusion algorithms — and a NEES strip chart that acts as a lie detector.

The arena: four sensor nodes near the corners of a 2D region, one target flying a constant-velocity path with gentle random accelerations. Each node runs a local 4-state information filter on its own noisy position measurements. The noise is anisotropic and oriented toward the node — each local ellipse is elongated differently, so fusion has real geometric value, not just averaging.

Two control axes, and you should predict before you run — this lesson's own method. Topology (chain / tree / loop) determines whether pairwise ledgers can capture all common information. Algorithm (naive add / channel filter / CI) determines what bookkeeping is even attempted. Fill the 3×3 exactness–consistency matrix in your head first; then let the NEES trace grade you.

Experiment 1 — naive on the chain. Even with no cycle, repeated exchanges re-add overlapping posteriors: watch node A's ellipse shrink below the dashed centralized ghost while the NEES trace climbs out of the chi-square band within seconds. Naive is not "fine on simple topologies" — it is wrong everywhere there is repeated exchange.

Experiment 2 — channel filter on chain and tree. The fused ellipse locks onto the centralized ghost, and NEES rides inside the band at its expected value. Then flip to the loop: the same algorithm, same code, begins over-counting via the second path — NEES departs the band slowly but monotonically. The failure is structural, not a bug.

Experiment 3 — CI everywhere. On every topology the CI ellipse is visibly larger than the ghost (the conservatism tax made visible), but the NEES trace stays at or below the band's center: honest on the chain, honest on the loop, honest with dropouts. Then run the killer comparison: enable link dropouts and watch the channel filter's ledger desynchronize even on the tree, while CI does not care.

Reading the instrument: the strip chart is sf-21's NEES test deployed as a network stethoscope. The single most transferable habit from this lesson: ALWAYS plot network NEES against the chi-square band, because overconfidence is invisible in the track picture until long after it is fatal in the statistics.
The Four-Node Fusion Network

Node A's fused 95% ellipse (algorithm color) vs the dashed centralized ghost. Right (or below on phones): node A's position NEES on a log scale with the 95% chi-square band [0.05, 7.38] shaded; the last runs persist as faded traces for comparison. Corner readouts: trailing mean NEES, claimed σ vs actual RMSE, messages per fusion round.

Comm rate (fuse every k steps)2
Process noise q0.030
Misconception: "If NEES looks healthy at one node, the network is healthy." Inconsistency can localize — on the loop, nodes far from the freshest measurement inflate first, and dropout-desynchronized ledgers poison one branch of a tree while the other stays clean. Audit the WORST node's NEES, not a convenient one.
Check: In the loop topology, the channel filter over-counts even though every edge ledger is working perfectly. Why?
PhD lens: this is the oral exam's systems question in simulator form: "Given topology X, comm pattern Y, and algorithm Z, predict the NEES trajectory and justify it before you run." A strong student fills the 3×3 matrix from first principles — exact / consistent / divergent — and identifies the two hidden axes the sliders expose: communication rate (more exchange = faster naive divergence, NOT more accuracy) and link reliability (exactness is fragile; consistency is robust).

Chapter 10: Quals Arsenal

You have the machinery. Now sit the exam: eight questions of the kind that open a distributed-estimation quals, each expecting derivation, limits, and judgment — not recitation. Attempt each on paper (or the Teach whiteboard) BEFORE expanding the worked answer. The answers are graded sketches: full credit requires the algebra plus the sanity checks at the limits.

The questions group into four themes: bookkeeping identities (Q1, Q8), correlation mechanics (Q2, Q3), consistency theory (Q4, Q6), and systems judgment (Q5, Q7). If one theme feels soft, its chapter number is in the answer.

Q1. Two nodes are initialized from the same prior N(x0, P0), each incorporates one independent measurement, then they fuse by adding informations. Show algebraically that this over-counts, identify the excess exactly, and give two fixes with their preconditions.
Worked answer

Local posteriors: YA = Y0 + IA, YB = Y0 + IB where Ii = HiTRi−1Hi. Naive sum: YA + YB = 2Y0 + IA + IB = (Y0 + IA + IB) + Y0 = Ycentral + Y0. The excess is exactly Y0 — the common information (here, the shared prior). Numerically (Chapter 3): 1.25 + 1.25 = 2.5 versus centralized 2.25; claimed variance 0.4 versus honest 0.4444, actual error variance 0.48, expected NEES 1.2.

Fix 1: subtract the overlap — channel filter, Y = YA + YB − Ycommon; exact, but requires knowing the overlap, i.e. tree topology with reliable full-rate links. Fix 2: convex combination — CI/GCI, Y = ωYA + (1−ω)YB; consistent for ANY unknown overlap on any topology, at the price of conservatism (claims 0.8 at ω = 1/2 where exact is 0.4444).

Q2. Derive the Bar-Shalom–Campo fused estimate for two correlated unbiased scalar estimates and verify both limiting cases PAB = 0 and PAB = PA.
Worked answer

Seek xF = wxA + (1−w)xB, unbiased for any w. Var = w²PA + (1−w)²PB + 2w(1−w)PAB. Setting d/dw = 0: 2wPA − 2(1−w)PB + 2(1−2w)PAB = 0, giving w* = (PB − PAB)/(PA + PB − 2PAB). Substituting yields PF = PA − (PA − PAB)²/(PA + PB − 2PAB) = (PAPB − PAB²)/(PA + PB − 2PAB).

Limit PAB = 0: PF = PAPB/(PA + PB) — harmonic combination, the standard independent fusion. Limit PAB = PA (with PA ≤ PB): w* = (PB − PA)/(PB − PA) = 1, so xF = xA and PF = PA — correct, because B is then statistically A plus extra noise and contributes nothing new. Worked numbers (Chapter 6): PA = 1, PB = 1.5, PAB = 0.4 gives w* = 0.6471, PF = 0.7882; the naive information weights deliver actual variance 0.792 while claiming 0.6.

Q3. Two trackers use independent sensors and independent priors. Prove their track errors are still correlated: derive the cross-covariance recursion and identify the term that injects correlation.
Worked answer

Write each filter's posterior error as ei(k|k) = (I − KiHi)ei(k|k−1) − Kivi(k) with ei(k|k−1) = F ei(k−1|k−1) − w(k): there is ONE target, hence ONE process-noise realization w(k) in both errors. Then PAB(k|k) = E[eAeBT] = (I − KAHA)(F PAB(k−1|k−1) FT + Q)(I − KBHB)T.

The measurement noises are independent, so no KARKBT term appears — but Q appears in the cross term because the same w(k) surprised both filters. Even from PAB(0) = 0, the +Q pump drives PAB to a nonzero steady state; classic track-fusion analyses put the steady-state correlation around 0.2–0.6, which Chapter 6's numbers show is enough for a 1.32× overconfidence if ignored. Corollary: "independent sensors" never implies "independent tracks."

Q4. State generalized covariance intersection at the density level and prove its immunity to double counting. What do you pay when the inputs were actually independent?
Worked answer

GCI/Chernoff fusion: pF ∝ pAwpB1−w, w ∈ [0,1] — the w-weighted geometric mean (log-linear pool). Immunity: suppose both inputs share a common factor, pA = pcqA, pB = pcqB. Then pAwpB1−w = pcw+(1−w)qAwqB1−w = pc1 × (weighted independent parts): the shared factor enters with exponent exactly 1 for EVERY w — double counting is structurally impossible, with no knowledge of what pc is. For Gaussians this reduces to CI: Y = wYA + (1−w)YB, y = wyA + (1−w)yB.

The bill: if the inputs were independent, exact fusion would use exponent 1 on each unique factor, but GCI uses w and 1−w — it under-exploits genuinely new evidence. Chapter 5's numbers: claimed 0.8 at w = 1/2 versus exact 0.4444, with actual error 0.48 — consistent but ~1.8× pessimistic. w is chosen by minimizing det or trace of the fused covariance (theory in sf-11).

Q5. Prove the static exactness of the federated Kalman filter's beta-splitting, and explain precisely where and why exactness is lost for dynamic systems.
Worked answer

Static case: master assigns local i the deflated prior information βiY0 with Σβi = 1 (i.e. Pi(0) = P0i). Local posteriors: Yi = βiY0 + Ii. Master fuses by plain addition: ΣYi = (Σβi)Y0 + ΣIi = Y0 + ΣIi = Ycentralized — exact, one line. Numbers (Chapter 7): β = 1/2 each turns prior variance 4 into local priors of variance 8; locals post at 0.8889 each; the sum lands at 0.4444, matching centralized to machine precision.

Dynamic case: process noise is also common information — the same w(k) drives every local's model — so Carlson inflates Qi = Q/βi. But inflation only UPPER-BOUNDS the effect of the cross-correlations that shared Q creates between locals; the fusion is then conservative (guaranteed not overconfident) rather than exact. Modes: fusion-reset (FR) resets locals to β-split fused estimates — better accuracy, but a master fault propagates to all locals; no-reset (NR) keeps locals independent — degraded accuracy, but a spoofed sensor corrupts only its own local and can be excluded, which is why fault-tolerant navigation uses NR.

Q6. In a consensus information filter, what exactly do nodes iterate on, why is the result scaled by N, and is the filter consistent if you can only afford L = 2 iterations per measurement? Name a variant that is.
Worked answer

Nodes run average consensus u ← Wu on their local information increments (Ii, ii) = (HiTRi−1Hi, HiTRi−1zi), with W doubly stochastic (e.g. Metropolis weights, buildable from local degrees). Double stochasticity conserves the sum; connectivity drives all values to the average (1/N)Σ. Since the centralized update needs the SUM, each node scales its converged value by N — which requires knowing N. Convergence is geometric at the SLEM: Chapter 8's chain has SLEM 0.8047, needing ~53 iterations for 10−5.

At L = 2 the sum is only partially mixed: nodes far from information sources hold too little, nodes near their own contributions effectively over-weight themselves, and the ×N scaling converts under-mixing into overconfidence — the filter is NOT consistent. The consistent repair is consensus on POSTERIORS with CI/convex weights (consensus-on-information, Battistelli–Chisci hybrid CM-CI): every iteration is then a convex information combination, Chapter 5's immunity applies at each step, and consistency holds for ANY L — with optimality approached as L grows.

Q7. A 4-node network has a cycle and 20% link dropouts. Rank naive addition, channel filters, and GCI for this deployment, justifying each with the exactness/consistency/cost triangle.
Worked answer

Naive addition: requires conditional independence of everything fused — violated by the cycle (rumors) and even by repeated exchange on a line; NEES diverges; disqualified regardless of cost. Channel filters: exact ONLY on trees with reliable synchronized links; the cycle makes multi-hop common information invisible to per-edge ledgers, and dropouts desynchronize even a tree's ledgers — both preconditions fail, so exactness is unobtainable; a spanning-tree overlay could restore it at the cost of discarding the chord's links and adding protocol machinery. GCI: consistent under arbitrary unknown correlation, any topology, indifferent to dropouts (a missed message just means less tightening this round); cost is conservatism plus a small ω optimization per fusion.

Deployment answer: GCI (or CI on the Gaussian parts) as the default, with channel filters only inside sub-networks whose tree topology is protocol-guaranteed, and periodic centralized audits (or NEES monitoring per sf-21) to measure the conservatism actually being paid.

Q8. Show in closed form that naive mutual re-fusion of the same two estimates k times drives claimed variance to zero while the actual error is unchanged — and give the NEES growth law.
Worked answer

After the first naive fusion both nodes hold (Y1, y1) with Y1 = YA + YB. Each subsequent mutual exchange adds the partner's identical information: Y(k) = 2Y(k−1), so Y(k) = 2k−1Y1 and claimed variance P(k) = P1/2k−1 → 0. The mean never moves after round one: y doubles in lockstep with Y, so y/Y is constant — no new measurement entered, so the actual error variance stays fixed at its round-one value.

NEES(k) = e²/P(k) = 2k−1 × NEES(1): it DOUBLES every round. With Chapter 3's numbers NEES(1) = 1.2, so ten exchanges reach NEES around 614 — a filter reporting near-certainty with unchanged error. This is the Chapter 0 sim in algebra, and the cleanest oral-exam demonstration that fusion frequency is not accuracy.

Debate Prompts — Oral-Exam Finishers

No single right answer here — but there are defensible and indefensible positions. Argue with the exactness/consistency/cost triangle, not with vibes.

Debate 1. Defend or refute: "CI is an excuse for sloppy engineering — a properly instrumented system KNOWS its cross-covariances (the Bar-Shalom recursion is right there), so conservative fusion is paying a permanent accuracy tax to avoid doing bookkeeping."
Debate 2. Defend or refute: "With modern datalink bandwidth, ship every raw measurement to one centralized filter; decentralized fusion is a relic of 1990s radio budgets and its whole literature is now of historical interest only."
Debate 3. Your tech lead proposes replacing channel filters with "just inflate R by 2× on anything received over the network." Defend or refute this as a consistency strategy, quantifying what it gets right and where it fails (hint: does a fixed inflation bound an UNBOUNDED over-count?).
Misconception: "Quals reward reciting the PhD's worth of formulas — BC, CI, federated, consensus." Examiners probe whether you can DIAGNOSE which correlation mechanism is active in a described system (shared prior? shared process noise? loops? partial mixing?) and select the cheapest fix that is still consistent, deriving only what the diagnosis requires.
Check: A described system has: guaranteed spanning-tree comms, reliable links, full-rate exchange, and known models at every node. The cheapest CONSISTENT fusion that is also optimal is:
PhD lens: the arsenal IS the lens: every question here is transcribed from the standard oral-exam repertoire — Bar-Shalom's track-fusion results, Grime & Durrant-Whyte's DDF, Julier & Uhlmann's CI, Carlson's federation, Olfati-Saber and Battistelli–Chisci consensus — with the grading emphasis on limits, failure modes, and selection judgment.

Chapter 11: Connections — One Question, Four Disciplines

Strip away the algebra and this was a lesson about one question asked four ways. Common information is the conserved quantity of distributed estimation. Channel filters TRACK it. CI/GCI BOUNDS it. Federated filtering PRE-ALLOCATES it. Consensus DILUTES it into an average. Every future paper you meet in this field is a refinement of one of these four verbs.

MethodExact?Consistent?Topology needsMust knowComm costCanonical habitat
Naive additionNever (repeated exchange)NoNothing (and it shows)1 track/exchangeBug reports
Channel filterYes, on treesOnly on trees, reliable linksSpanning tree, full-ratePer-link shared history1 track + ledger upkeepDecentralized robotics, DDF
Bar-Shalom–CampoBest linear given PABYes, if PAB knownPairwiseCross-covariance (both gains)1 track + PAB upkeepTrack-fusion centers
CI / GCINo (conservative)Yes, any correlationAny graphNothing1 track + ω searchLoopy / ad-hoc networks
Federated (β-split)Static yes; dynamic conservativeYesMaster + fixed localsN and shares up frontLocals→master at fusion rateIntegrated navigation
Consensus + CINo (→ optimal as L→∞)Yes, any LAny connected graphNeighbors' degrees (and N if scaling)L iterations/timestepLarge sensor networks

Map the methods to the systems that ship them. Federated filters live in integrated aerospace navigation (INS/GNSS coupling). Track-to-track fusion with BC and CI runs in air-surveillance networks and automotive perception (multimodal driving fusion). GCI over PHD intensities powers distributed multi-target tracking (multi-target RFS). Consensus information filters are the workhorse of large-scale sensor networks. And the channel-filter DDF lineage lives on in decentralized robotics and multi-robot SLAM map merging.

What this lesson deliberately did NOT cover, with pointers. The information-filter algebra itself: sf-09. The CI derivation, ω-optimization theory, and split/inverse CI: sf-11. The architecture taxonomy and JDL levels: sf-02. Track-to-track ASSOCIATION — deciding two tracks are the same object before fusing them: sf-12. The NEES/NIS testing machinery used throughout as our lie detector: sf-21. The single-node predict–update core every network node runs: the Kalman filter. Out-of-sequence and delayed-measurement handling is its own literature — know that it exists.

The research frontier, honestly: learned communication policies for when-to-transmit, distributed fusion under adversarial nodes (Byzantine resilience), event-triggered consensus, and correlation-aware learned fusers. All of it is still argued in the vocabulary this lesson built — common information, consistency, conservatism.

Misconception: "Distributed fusion is a niche defense/aerospace topic." Every multi-robot SLAM merge, V2X shared-perception stack, satellite constellation, and IoT sensor field re-derives exactly these tradeoffs. "Common information" and "conservative fusion" are the transferable vocabulary — and papers that ignore them ship the Chapter 0 bug at industrial scale.
Check: The single diagnostic question that unifies every method in this lesson is:
PhD lens: closing viva question: "Rank the methods of this lesson by what they must KNOW versus what they can GUARANTEE, and name one deployed system for each." The examiner is checking that the taxonomy is load-bearing — that you select algorithms from preconditions and guarantees, not from familiarity.
"An estimate is a claim about your own ignorance; a network is honest only if every node can account for the provenance of its confidence."
— the moral of this lesson

You now know the four disciplines of fusing without double counting. Ask "what do we both already know?" of every network you build.