def get_response_content(fs): M, R = get_input_matrices(fs) M_v = mrate.R_to_distn(M) R_v = mrate.R_to_distn(R) t = fs.t mi_mut = ctmcmi.get_mutual_information(M, t) mi_bal = ctmcmi.get_mutual_information(R, t) fi_mut = divtime.get_fisher_information(M, t) fi_bal = divtime.get_fisher_information(R, t) if fs.info_mut: information_sign = np.sign(mi_mut - mi_bal) elif fs.info_fis: information_sign = np.sign(fi_mut - fi_bal) out = StringIO() print >> out, '<html>' print >> out, '<body>' print >> out print >> out, '<pre>' print >> out, 'Explicitly computed answer', print >> out, '(not a heuristic but may be numerically imprecise):' if information_sign == 1: print >> out, '* pure mutation', print >> out, 'is more informative' elif information_sign == -1: print >> out, '* the balance of mutation and selection', print >> out, 'is more informative' else: print >> out, ' the information contents of the two processes', print >> out, 'are numerically indistinguishable' print >> out print >> out if fs.info_mut: print >> out, 'Mutual information properties', print >> out, 'at very small and very large times:' print >> out print >> out, get_mi_asymptotics(M, R) print >> out print >> out print >> out, 'Heuristics without regard to time or to the selected', print >> out, 'information variant (Fisher vs. mutual information):' print >> out print >> out, get_heuristics(M, R) print >> out print >> out print >> out, 'Input summary:' print >> out print >> out, 'mutation rate matrix:' print >> out, M print >> out print >> out, 'mutation process stationary distribution:' print >> out, M_v print >> out print >> out, 'mutation-selection balance rate matrix:' print >> out, R print >> out print >> out, 'mutation-selection balance stationary distribution:' print >> out, R_v print >> out print >> out, 'mutation process expected rate:' print >> out, mrate.Q_to_expected_rate(M) print >> out print >> out, 'mutation-selection balance expected rate:' print >> out, mrate.Q_to_expected_rate(R) print >> out print >> out print >> out, 'The following information calculations', print >> out, 'depend on t = %s:' % t print >> out print >> out, 'log(ratio(E(L))) for pure mutation:' print >> out, ctmcmi.get_ll_ratio_wrong(M, t) print >> out print >> out, 'log(ratio(E(L))) for mut-sel balance:' print >> out, ctmcmi.get_ll_ratio_wrong(R, t) print >> out print >> out, 'mutual information for pure mutation:' print >> out, mi_mut print >> out print >> out, 'mutual information for mut-sel balance:' print >> out, mi_bal print >> out print >> out, 'pinsker lower bound mi for pure mutation:' print >> out, ctmcmi.get_pinsker_lower_bound_mi(M, t) print >> out print >> out, 'pinsker lower bound mi for mut-sel balance:' print >> out, ctmcmi.get_pinsker_lower_bound_mi(R, t) print >> out print >> out, 'row based pinsker lower bound mi for pure mutation:' print >> out, ctmcmi.get_row_based_plb_mi(M, t) print >> out print >> out, 'row based pinsker lower bound mi for mut-sel balance:' print >> out, ctmcmi.get_row_based_plb_mi(R, t) print >> out print >> out, 'row based hellinger lower bound mi for pure mutation:' print >> out, ctmcmi.get_row_based_hellinger_lb_mi(M, t) print >> out print >> out, 'row based hellinger lower bound mi for mut-sel balance:' print >> out, ctmcmi.get_row_based_hellinger_lb_mi(R, t) print >> out print >> out, 'Fisher information for pure mutation:' print >> out, fi_mut print >> out print >> out, 'Fisher information for mut-sel balance:' print >> out, fi_bal print >> out print >> out, '</pre>' # # create the summaries summaries = (RateMatrixSummary(M), RateMatrixSummary(R)) print >> out, get_html_table(summaries) print >> out print >> out, '<html>' print >> out, '<body>' return out.getvalue()
def __call__(self): """ Look for a counterexample. """ n = self.nstates # sample a random rate and time and stationary distribution r = random.expovariate(1) t = random.expovariate(1) v = np.random.exponential(1, n) v /= np.sum(v) # construct the F81 rate matrix R = r * np.outer(np.ones(n), v) R -= np.diag(np.sum(R, axis=1)) # get some information criterion values mi_general = ctmcmi.get_mutual_information(R, t) fi_general = divtime.get_fisher_information(R, t) pollock_general = get_gtr_pollock(R, t) mi_f81 = get_f81_mi(r, v, t) fi_f81 = get_f81_fi(r, v, t) pollock_f81 = get_f81_pollock(r, v, t) if n == 2: fi_f81_2state = get_f81_fi_2state(r, v, t) # check for contradictions try: if not np.allclose(mi_general, mi_f81): raise Contradiction('mutual information') if not np.allclose(fi_general, fi_f81): raise Contradiction('fisher information') if not np.allclose(pollock_general, pollock_f81): raise Contradiction('neg slope identity proportion') if n == 2: if not np.allclose(fi_general, fi_f81_2state): raise Contradiction('fisher information (2-state)') except Contradiction as e: out = StringIO() print >> out, 'found', str(e), 'contradiction' print >> out print >> out, 'GTR mutual information:' print >> out, mi_general print >> out print >> out, 'F81 mutual information:' print >> out, mi_f81 print >> out print >> out, 'GTR Fisher information:' print >> out, fi_general print >> out print >> out, 'F81 Fisher information:' print >> out, fi_f81 print >> out if n == 2: print >> out, 'F81 2-state Fisher information:' print >> out, fi_f81_2state print >> out print >> out, 'GTR neg slope identity proportion:' print >> out, pollock_general print >> out print >> out, 'F81 neg slope identity proportion:' print >> out, pollock_f81 print >> out self.counterexample = out.getvalue() return True return False
def sample_row(): n = 4 # sample the exchangeability S = np.zeros((n, n)) S[1,0] = random.expovariate(1) S[2,0] = random.expovariate(1) S[2,1] = random.expovariate(1) S[3,0] = random.expovariate(1) S[3,1] = random.expovariate(1) S[3,2] = random.expovariate(1) # sample the mutation stationary distribution mdistn = np.array([random.expovariate(1) for i in range(n)]) mdistn /= np.sum(mdistn) # sample the mutation selection balance stationary distribution bdistn = np.array([random.expovariate(1) for i in range(n)]) bdistn /= np.sum(bdistn) # sample the time t = random.expovariate(1) # sample the info type infotype = random.choice(('infotype.mi', 'infotype.fi')) # Compute some intermediate variables # from which the summary statistics and the label are computed. S = S + S.T M = S * mdistn M -= np.diag(np.sum(M, axis=1)) R = mrate.to_gtr_halpern_bruno(M, bdistn) shannon_ent_mut = -sum(p*log(p) for p in mdistn) shannon_ent_bal = -sum(p*log(p) for p in bdistn) logical_ent_mut = 1.0 - sum(p*p for p in mdistn) logical_ent_bal = 1.0 - sum(p*p for p in bdistn) expected_rate_mut = mrate.Q_to_expected_rate(M) expected_rate_bal = mrate.Q_to_expected_rate(R) spectral_rate_mut = 1 / mrate.R_to_relaxation_time(M) spectral_rate_bal = 1 / mrate.R_to_relaxation_time(R) mi_mut = ctmcmi.get_mutual_information(M, t) mi_bal = ctmcmi.get_mutual_information(R, t) fi_mut = divtime.get_fisher_information(M, t) fi_bal = divtime.get_fisher_information(R, t) # compute the summary statistics summary_entries = [ shannon_ent_bal - shannon_ent_mut, logical_ent_bal - logical_ent_mut, log(shannon_ent_bal) - log(shannon_ent_mut), log(logical_ent_bal) - log(logical_ent_mut), expected_rate_bal - expected_rate_mut, spectral_rate_bal - spectral_rate_mut, log(expected_rate_bal) - log(expected_rate_mut), log(spectral_rate_bal) - log(spectral_rate_mut), mi_bal - mi_mut, fi_bal - fi_mut, math.log(mi_bal) - math.log(mi_mut), math.log(fi_bal) - math.log(fi_mut), ] # get the definition entries definition_entries = [ S[1,0], S[2,0], S[2,1], S[3,0], S[3,1], S[3,2], mdistn[0], mdistn[1], mdistn[2], mdistn[3], bdistn[0], bdistn[1], bdistn[2], bdistn[3], infotype, t, ] # define the label if infotype == 'infotype.mi' and mi_mut > mi_bal: label = 'mut.is.better' elif infotype == 'infotype.mi' and mi_mut < mi_bal: label = 'bal.is.better' elif infotype == 'infotype.fi' and fi_mut > fi_bal: label = 'mut.is.better' elif infotype == 'infotype.fi' and fi_mut < fi_bal: label = 'bal.is.better' else: label = 'indistinguishable' # return the row return definition_entries + summary_entries + [label]
def sample_row(): n = 4 # sample the exchangeability S = np.zeros((n, n)) S[1, 0] = random.expovariate(1) S[2, 0] = random.expovariate(1) S[2, 1] = random.expovariate(1) S[3, 0] = random.expovariate(1) S[3, 1] = random.expovariate(1) S[3, 2] = random.expovariate(1) # sample the mutation stationary distribution mdistn = np.array([random.expovariate(1) for i in range(n)]) mdistn /= np.sum(mdistn) # sample the mutation selection balance stationary distribution bdistn = np.array([random.expovariate(1) for i in range(n)]) bdistn /= np.sum(bdistn) # sample the time t = random.expovariate(1) # sample the info type infotype = random.choice(('infotype.mi', 'infotype.fi')) # Compute some intermediate variables # from which the summary statistics and the label are computed. S = S + S.T M = S * mdistn M -= np.diag(np.sum(M, axis=1)) R = mrate.to_gtr_halpern_bruno(M, bdistn) shannon_ent_mut = -sum(p * log(p) for p in mdistn) shannon_ent_bal = -sum(p * log(p) for p in bdistn) logical_ent_mut = 1.0 - sum(p * p for p in mdistn) logical_ent_bal = 1.0 - sum(p * p for p in bdistn) expected_rate_mut = mrate.Q_to_expected_rate(M) expected_rate_bal = mrate.Q_to_expected_rate(R) spectral_rate_mut = 1 / mrate.R_to_relaxation_time(M) spectral_rate_bal = 1 / mrate.R_to_relaxation_time(R) mi_mut = ctmcmi.get_mutual_information(M, t) mi_bal = ctmcmi.get_mutual_information(R, t) fi_mut = divtime.get_fisher_information(M, t) fi_bal = divtime.get_fisher_information(R, t) # compute the summary statistics summary_entries = [ shannon_ent_bal - shannon_ent_mut, logical_ent_bal - logical_ent_mut, log(shannon_ent_bal) - log(shannon_ent_mut), log(logical_ent_bal) - log(logical_ent_mut), expected_rate_bal - expected_rate_mut, spectral_rate_bal - spectral_rate_mut, log(expected_rate_bal) - log(expected_rate_mut), log(spectral_rate_bal) - log(spectral_rate_mut), mi_bal - mi_mut, fi_bal - fi_mut, math.log(mi_bal) - math.log(mi_mut), math.log(fi_bal) - math.log(fi_mut), ] # get the definition entries definition_entries = [ S[1, 0], S[2, 0], S[2, 1], S[3, 0], S[3, 1], S[3, 2], mdistn[0], mdistn[1], mdistn[2], mdistn[3], bdistn[0], bdistn[1], bdistn[2], bdistn[3], infotype, t, ] # define the label if infotype == 'infotype.mi' and mi_mut > mi_bal: label = 'mut.is.better' elif infotype == 'infotype.mi' and mi_mut < mi_bal: label = 'bal.is.better' elif infotype == 'infotype.fi' and fi_mut > fi_bal: label = 'mut.is.better' elif infotype == 'infotype.fi' and fi_mut < fi_bal: label = 'bal.is.better' else: label = 'indistinguishable' # return the row return definition_entries + summary_entries + [label]