Tension Common Information
The Gács-Körner Common Information is brittle: it is determined entirely by the connected components of the support graph, so an arbitrarily small perturbation of the distribution can send it to zero. The tension common information [MR26a] is a continuous relaxation of it, built from the entanglement.
Entanglement
The entanglement of a pair measures how far its mutual information is from being extractable:
This is the quantity on the right-hand side of the Makarychev-Makarychev-Romashchenko-Vereshchagin class of non-Shannon inequalities [MMRV02], and was studied by Zhang [Zha03] (writing it \(W(X, Y)\)) in connection with the approximate representability of mutual information. The name is due to [MR26a]; it is unrelated to quantum entanglement.
The three summands are exactly the coordinates of the region of tension, so the entanglement is the least coordinate-sum over that region — a single weighted-rate query on the The Gray-Wyner Network.
For \(n\) sources the tension coordinates are \(\I{X_{-i} : W \mid X_i}\) and \(\T{X_{0:n} \mid W}\), giving
which reduces to the pairwise definition at \(n = 2\).
The entanglement vanishes exactly when the mutual information is Gács-Körner extractable, and attains \(\min\{\H{X \mid Y}, \H{Y \mid X}, \I{X : Y}\}\) when the pair is maximally non-extractable.
The tension common information
Because the entanglement is a deficiency, subtracting it from the total correlation gives a quantity that runs the same way as a common information:
Using the Gács-Körner meet as the probe makes every source tension vanish and leaves a residual of \(\T{X_{0:n}} - (n-1)\K{X_{0:n}}\), which sandwiches it:
Continuity
The distinguishing behaviour is what happens under perturbation. Consider a distribution whose support has two components, so that \(\K{X : Y} > 0\), and then add a single low-probability outcome bridging them:
In [1]: from dit.multivariate import gk_common_information as K, tension_common_information as Theta
In [2]: blocks = dit.Distribution(['00', '01', '10', '11', '22'], [0.2]*5)
In [3]: bridged = dit.Distribution(['00', '01', '10', '11', '22', '02'], [0.2, 0.2, 0.2, 0.2, 0.19, 0.01])
In [4]: K(blocks), K(bridged)
Out[4]: (0.7219280948873623, 0.0)
In [5]: Theta(blocks), Theta(bridged)
The Gács-Körner common information collapses to zero; the tension common information does not.
Fano plane
A pair uniform on the point-line incidences of the Fano plane is maximally non-extractable: its entanglement equals its mutual information, so its tension common information is zero.
In [6]: from dit.multivariate import entanglement, total_correlation
In [7]: lines = ['012', '034', '056', '136', '145', '235', '246']
In [8]: fano = dit.Distribution([p + str(i) for i, l in enumerate(lines) for p in l], [1/21]*21)
In [9]: total_correlation(fano), entanglement(fano)
This is certified spectrally: the Fano incidence graph is an expander, and spectral_entanglement_bound() reports its nominal bound. See The Gray-Wyner Network for the caveats around that bound.
API
- entanglement(dist, rvs=None, crvs=None, niter=None, maxiter=1000, bound=None)[source]
Compute the entanglement.
The entanglement is the least total tension attainable by any probe
W,\[E(X_{0:n}) = \inf_W \Big\{ T[X_{0:n}|W] + \sum_i I[X_{-i}{:}W|X_i] \Big\},\]which for a pair is
inf_W I[X:Y|W] + I[X:W|Y] + I[W:Y|X][MMRV02, MR26a, Zha03].- Parameters:
dist (Distribution) – The distribution for which the entanglement is computed.
rvs (list of lists, None) – The source groups. If None, each variable of dist is its own source.
crvs (list, None) – A single list of indexes specifying variables to condition on. If None, none are conditioned on.
niter (int, None) – Number of basin hops to perform during the optimization.
maxiter (int) – The number of iterations of the optimization subroutine to perform.
bound (int, None) – Bound the size of the probe variable.
- Returns:
E – The entanglement.
- Return type:
Examples
A pair whose mutual information is fully extractable has zero entanglement:
>>> from dit import Distribution >>> from dit.multivariate import entanglement >>> giant_bit = Distribution(['00', '11'], [1/2, 1/2]) >>> float(entanglement(giant_bit)) 0.0
- tension_common_information(dist, rvs=None, crvs=None, niter=None, maxiter=1000, bound=None)[source]
Compute the tension common information.
This is the portion of the total correlation that is not obstructed by tension,
\[\Theta(X_{0:n}) = T[X_{0:n}] - E(X_{0:n}),\]a continuous relaxation of the Gacs-Korner common information obeying
(n - 1) K <= Theta <= T[MR26a].- Parameters:
dist (Distribution) – The distribution for which the tension common information is computed.
rvs (list of lists, None) – The source groups. If None, each variable of dist is its own source.
crvs (list, None) – A single list of indexes specifying variables to condition on. If None, none are conditioned on.
niter (int, None) – Number of basin hops to perform during the optimization.
maxiter (int) – The number of iterations of the optimization subroutine to perform.
bound (int, None) – Bound the size of the probe variable.
- Returns:
Theta – The tension common information.
- Return type:
Examples
Unlike the Gacs-Korner common information, this does not collapse when the block structure of the support is perturbed:
>>> from dit import Distribution >>> from dit.multivariate import gk_common_information, tension_common_information >>> blocks = Distribution(['00', '01', '10', '11', '22'], [0.2] * 5) >>> float(gk_common_information(blocks)) 0.7219280948873623