-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathtest_lincg.py
47 lines (38 loc) · 1.21 KB
/
test_lincg.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
import numpy
import time
import theano
import theano.tensor as T
from scipy import linalg
floatX = theano.config.floatX
import lincg
rng = numpy.random.RandomState(23091)
nparams = 1000
def init_psd_mat(size):
temp = rng.rand(size, size)
return numpy.dot(temp.T, temp) + numpy.eye(size)*.001
symb = {}
symb['L'] = T.matrix("L")
symb['g'] = T.vector("g")
vals = {}
vals['L'] = init_psd_mat(nparams).astype(floatX)
vals['g'] = rng.rand(nparams).astype(floatX)
## now compute L^-1 g
vals['Linv_g_cho'] = linalg.cho_solve(linalg.cho_factor(vals['L']), vals['g'])
vals['Linv_g_sol'] = linalg.solve(vals['L'], vals['g'])
def test_lincg():
rval = lincg.linear_cg(
lambda x: [T.dot(symb['L'], x)],
[symb['g']],
rtol=1e-20,
damp = 0.,
maxit = 100000,
floatX = floatX,
profile=0)
f = theano.function([symb['L'], symb['g']], rval[0])
t1 = time.time()
Linv_g = f(vals['L'], vals['g'])
print 'test_lincg runtime (s):', time.time() - t1
numpy.testing.assert_almost_equal(Linv_g, vals['Linv_g_sol'], decimal=5)
numpy.testing.assert_almost_equal(Linv_g, vals['Linv_g_cho'], decimal=5)
if __name__=='__main__':
test_lincg()