Source code for dit.multivariate.tse_complexity

"""
The TSE Complexity.
"""
from __future__ import division

from itertools import combinations

from ..shannon import conditional_entropy as H
from ..helpers import normalize_rvs
from ..math.misc import combinations as nCk
from ..utils import unitful

__all__ = [
'tse_complexity',
]

[docs]@unitful def tse_complexity(dist, rvs=None, crvs=None, rv_mode=None): """ Calculates the TSE complexity. Parameters ---------- dist : Distribution The distribution from which the TSE complexity is calculated. rvs : list, None The indexes of the random variable used to calculate the TSE complexity between. If None, then the TSE complexity is calculated over all random variables. crvs : list, None The indexes of the random variables to condition on. If None, then no variables are condition on. rv_mode : str, None Specifies how to interpret rvs and crvs. Valid options are: {'indices', 'names'}. If equal to 'indices', then the elements of crvs and rvs are interpreted as random variable indices. If equal to 'names', the the elements are interpreted as random variable names. If None, then the value of dist._rv_mode is consulted, which defaults to 'indices'. Returns ------- TSE : float The TSE complexity. Raises ------ ditException Raised if dist is not a joint distribution or if rvs or crvs contain non-existant random variables. """ rvs, crvs, rv_mode = normalize_rvs(dist, rvs, crvs, rv_mode) joint = H(dist, set().union(*rvs), crvs, rv_mode=rv_mode) N = len(rvs) def sub_entropies(k): """ Compute the average entropy of all subsets of rvs of size k. """ sub_rvs = (set().union(*rv) for rv in combinations(rvs, k)) subH = sum(H(dist, rv, crvs, rv_mode=rv_mode) for rv in sub_rvs) subH /= nCk(N, k) return subH TSE = sum(sub_entropies(k) - k/N * joint for k in range(1, N)) return TSE