-
Notifications
You must be signed in to change notification settings - Fork 1
/
20120117a.py
165 lines (157 loc) · 6.2 KB
/
20120117a.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
"""
Show mutual information decay for a reversible continuous time Markov process.
When a reversible finite-state continuous-time
Markov process is at equilibrium,
two observations separated by time t
will be non-independent
in a way that can be quantified by their mutual information.
This mutual information is also mathematically equivalent
to the expected log-likelihood ratio
of T=t vs. T=infinity given that the true time is T=t.
In this script we empirically investigate the asymptotic
properties of the decay of the mutual information.
The hypothesis is that the decay is
bounded above and below by an exponentially decreasing function
whose decay rate depends only on the smallest magnitude nonzero
eigenvalue of the rate matrix that defines the Markov process.
"""
from StringIO import StringIO
import math
import numpy as np
import scipy
from scipy import linalg
import Form
import FormOut
from MatrixUtil import ndot
import mrate
import divtime
import ctmcmi
def get_form():
"""
@return: the body of a form
"""
# define the form objects
form_objects = [
Form.Integer('nstates', 'number of states', 4, low=2, high=9),
Form.Float('divtime', 'arbitrary large-ish divergence time',
'3', low_exclusive=0)]
#Form.Float('delta', 'vanishing time delta',
#'0.0001', high_exclusive=0.25)]
return form_objects
def get_form_out():
return FormOut.Report()
def get_response_content(fs):
out = StringIO()
np.set_printoptions(linewidth=200)
# get the user defined variables
n = fs.nstates
t = fs.divtime
#h = fs.delta
# sample a random rate matrix
v = divtime.sample_distribution(n)
S = divtime.sample_symmetric_rate_matrix(n)
R = mrate.to_gtr_halpern_bruno(S, v)
# get some properties of the rate matrix
distn = mrate.R_to_distn(R)
spectrum = np.linalg.eigvalsh(mrate.symmetrized(R))
#spectrum, U = np.linalg.eigh(mrate.symmetrized(R))
#spectrum = np.linalg.eigvals(R)
# report some information about the mutual information curve
mi = ctmcmi.get_mutual_information(R, t)
mi_diff = ctmcmi.get_mutual_information_diff(R, t)
mi_diff_b = ctmcmi.get_mutual_information_diff_b(R, t)
mi_diff_c = ctmcmi.get_mutual_information_diff_c(R, t)
print >> out, 'arbitrary large-ish divergence time:'
print >> out, t
print >> out
print >> out, 'randomly sampled reversible rate matrix:'
print >> out, R
print >> out
print >> out, 'stationary distribution:'
print >> out, distn
print >> out
print >> out, 'spectrum of the rate matrix:'
print >> out, spectrum
print >> out
print >> out, 'mutual information at t = %f:' % t
print >> out, mi
print >> out
print >> out, 'mutual information at t = %f (ver. 2):' % t
print >> out, ctmcmi.get_mutual_information_b(R, t)
print >> out
print >> out, 'large t approximation of MI at t = %f:' % t
print >> out, ctmcmi.get_mutual_information_approx(R, t)
print >> out
print >> out, 'large t approximation of MI at t = %f (ver. 2):' % t
print >> out, ctmcmi.get_mutual_information_approx_b(R, t)
print >> out
print >> out, 'large t approximation of MI at t = %f (ver. 3):' % t
print >> out, ctmcmi.cute_MI_alternate(R, t)
print >> out
print >> out, 'large t approximation of MI at t = %f (ver. 4):' % t
print >> out, ctmcmi.get_mutual_information_approx_c(R, t)
print >> out
print >> out, 'small t approximation of MI at t = %f:' % t
print >> out, ctmcmi.get_mutual_information_small_approx(R, t)
print >> out
print >> out, 'small t approximation of MI at t = %f (ver. 2):' % t
print >> out, ctmcmi.get_mutual_information_small_approx_b(R, t)
print >> out
print >> out, 'small t approximation of MI at t = %f (ver. 3):' % t
print >> out, ctmcmi.get_mutual_information_small_approx_c(R, t)
print >> out
print >> out, 'small t approximation of MI at t = %f (ver. 4):' % t
print >> out, ctmcmi.get_mutual_information_small_approx_d(R, t)
print >> out
print >> out, 'mutual information diff at t = %f:' % t
print >> out, mi_diff
print >> out
print >> out, 'mutual information diff at t = %f (ver. 2):' % t
print >> out, mi_diff_b
print >> out
print >> out, 'mutual information diff at t = %f (ver. 3):' % t
print >> out, mi_diff_c
print >> out
print >> out, 'large t approximation of MI diff at t = %f:' % t
print >> out, ctmcmi.get_mutual_information_diff_approx(R, t)
print >> out
print >> out, 'large t approximation of MI diff at t = %f: (ver. 2)' % t
print >> out, ctmcmi.get_mutual_information_diff_approx_b(R, t)
print >> out
print >> out, 'large t approximation of MI diff at t = %f: (ver. 4)' % t
print >> out, ctmcmi.get_mutual_information_diff_approx_c(R, t)
print >> out
print >> out, 'log of mutual information at t = %f:' % t
print >> out, math.log(mi)
print >> out
#print >> out, 'estimated derivative',
#print >> out, 'of log of mutual information at t = %f:' % t
#print >> out, (math.log(mi_c) - math.log(mi_a)) / (2*h)
#print >> out
print >> out, 'estimated derivative of log of MI',
print >> out, 'at t = %f:' % t
print >> out, mi_diff / mi
print >> out
print >> out, 'large t approximation of derivative of log of MI',
print >> out, 'at t = %f:' % t
print >> out, ctmcmi.get_mutual_information_diff_approx(R,
t) / ctmcmi.get_mutual_information_approx(R, t)
print >> out
print >> out, 'large t approximation of derivative of log of MI',
print >> out, 'at t = %f (ver. 2):' % t
print >> out, ctmcmi.get_mutual_information_diff_approx_b(R,
t) / ctmcmi.get_mutual_information_approx_b(R, t)
print >> out
print >> out, 'twice the relevant eigenvalue:'
print >> out, 2 * spectrum[-2]
print >> out
print >> out
#print >> out, 'estimated derivative',
#print >> out, 'of mutual information at t = %f:' % t
#print >> out, (mi_c - mi_a) / (2*h)
#print >> out
#print >> out, '(estimated derivative of mutual information) /',
#print >> out, '(mutual information) at t = %f:' % t
#print >> out, (mi_c - mi_a) / (2*h*mi_b)
#print >> out
return out.getvalue()