Synergistic Disclosure

Rosas, Mediano, Rassouli & Barrett [RMRB20] define \(\alpha\)-synergy as the maximum mutual information \(I(V;Y)\) over channels \(p(V \mid X)\) that are independent of every block in a constraint set \(\alpha\):

\[S_{\alpha}(X \to Y) = \max_{V :\; I(V; X_{\alpha_i})=0\ \forall i} I(V; Y)\]

dit exposes both the scalar functions in this module and the lattice decomposition SynDisc / ModifiedSynDisc (see Partial Information Decomposition).

In [1]: from dit.multivariate import synergistic_disclosure

In [2]: from dit.example_dists import Xor

In [3]: d = Xor()

In [4]: synergistic_disclosure(d, sources=[[0], [1]], target=[2], alpha=[[0], [1]], niter=8)
Out[4]: 1.0

API

synergistic_disclosure(dist, sources, target, alpha, niter=None, bound=None)[source]

Compute S_alpha(X -> Y) for a single constraint set alpha.

This is the maximum I(V; Y) over all alpha-synergistic channels, i.e. channels p_{V|X} satisfying I(V; X_{alpha_i}) = 0 for each subgroup alpha_i in alpha.

Parameters:
  • dist (Distribution) – The joint distribution over sources and target.

  • sources (list of lists) – Each inner list gives the indices of one source variable group.

  • target (list) – The indices of the target variable.

  • alpha (list of lists) – Each inner list gives source-list indices (0-based) specifying which sources form each constraint subgroup.

  • niter (int, None) – Number of basin-hopping restarts.

  • bound (int, None) – Cardinality bound on V.

Returns:

s_alpha – The synergistic disclosure, in bits.

Return type:

float

backbone_disclosure(dist, sources=None, target=None, niter=None, bound=None)[source]

Compute the full backbone decomposition of I(X; Y).

The backbone decomposes I(X;Y) = sum_{m=1}^{n} B^m_partial, where each B^m_partial >= 0 measures the marginal gain from relaxing constraints on groups of m variables to groups of m-1.

Parameters:
  • dist (Distribution) – The joint distribution over sources and target.

  • sources (iter of iters, None) – The source variable groups. If None, all but last are used.

  • target (iter, None) – The target variable. If None, the last variable is used.

  • niter (int, None) – Number of basin-hopping restarts per lattice node.

  • bound (int, None) – Cardinality bound on V.

Returns:

backbone – Keys are integers m=1..n, values are B^m_partial (non-negative backbone atoms).

Return type:

dict

self_synergy(dist, sources=None, alpha=None, niter=None, bound=None)[source]

Compute S_alpha(X -> X), the self-synergy of sources X.

When alpha is None, uses the full individual-source constraints alpha = {{0}, {1}, …, {n-1}}.

Parameters:
  • dist (Distribution) – The joint distribution over sources.

  • sources (list of lists, None) – The source variable groups. If None, each variable is its own group.

  • alpha (list of lists, None) – Constraint subgroups (source-list indices). If None, each individual source is constrained.

  • niter (int, None) – Number of basin-hopping restarts.

  • bound (int, None) – Cardinality bound on V.

Returns:

s_self – The self-synergy, in bits.

Return type:

float

modified_synergistic_disclosure() is the singleton-constraint shortcut used by ModifiedSynDisc.