def exercise_eigensystem(): s = eigensystem.real_symmetric( m=flex.double(flex.grid(0,0)), relative_epsilon=1e-6, absolute_epsilon=1e-6) s.values().all() == (0,) assert s.vectors().all() == (0,0) u = s.generalized_inverse_as_packed_u() assert u.all() == (0,) m = u.matrix_packed_u_as_symmetric() assert m.all() == (0,0) # for n in xrange(1,10): m = flex.double(flex.grid(n,n)) s = eigensystem.real_symmetric(m) assert approx_equal(tuple(s.values()), [0]*n) v = s.vectors() for i in xrange(n): for j in xrange(n): x = 0 if (i == j): x = 1 assert approx_equal(v[(i,j)], x) v = [] for i in xrange(n): j = (i*13+17) % n v.append(j) m[i*(n+1)] = j s = eigensystem.real_symmetric(m) if (n == 3): ss = eigensystem.real_symmetric((m[0],m[4],m[8],m[1],m[2],m[5])) assert approx_equal(s.values(), ss.values()) assert approx_equal(s.vectors(), ss.vectors()) v.sort() v.reverse() assert approx_equal(s.values(), v) if (n > 1): assert approx_equal(flex.min(s.vectors()), 0) assert approx_equal(flex.max(s.vectors()), 1) assert approx_equal(flex.sum(s.vectors()), n) for t in xrange(10): for i in xrange(n): for j in xrange(i,n): m[i*n+j] = random.random() - 0.5 if (i != j): m[j*n+i] = m[i*n+j] s = eigensystem.real_symmetric(m) if (n == 3): ss = eigensystem.real_symmetric((m[0],m[4],m[8],m[1],m[2],m[5])) assert approx_equal(s.values(), ss.values()) assert approx_equal(s.vectors(), ss.vectors()) v = list(s.values()) v.sort() v.reverse() assert list(s.values()) == v for i in xrange(n): l = s.values()[i] x = s.vectors()[i*n:i*n+n] mx = matrix_mul(m, n, n, x, n, 1) lx = [e*l for e in x] assert approx_equal(mx, lx) # m = (1.4573362052597449, 1.7361052947659894, 2.8065584999742659, -0.5387293498219814, -0.018204949672480729, 0.44956507395617257) n_repetitions = 10000 t0 = time.time() v = time_eigensystem_real_symmetric(m, n_repetitions) assert v == (0,0,0) print "time_eigensystem_real_symmetric: %.3f micro seconds" % ( (time.time() - t0)/n_repetitions*1.e6) from scitbx.linalg import time_lapack_dsyev for use_fortran in [False, True]: if (not use_fortran): if (not scitbx.linalg.fem_is_available()): continue impl_id = "fem" else: if (not scitbx.linalg.for_is_available()): continue impl_id = "for" v = time_lapack_dsyev(m, 2, use_fortran) # to trigger one-time initialization of SAVE variables t0 = time.time() v = time_lapack_dsyev(m, n_repetitions, use_fortran) assert v == (0,0,0) print "time_lapack_dsyev %s: %.3f micro seconds" % ( impl_id, (time.time() - t0)/n_repetitions*1.e6) # s = eigensystem.real_symmetric(m=m) assert s.min_abs_pivot() > 0 assert s.min_abs_pivot() < 1.e-10 assert approx_equal(s.generalized_inverse_as_packed_u(), [ 0.77839538602575065, 0.25063185439711611, -0.03509803174624003, 0.68162798233326816, -0.10755998636596431, 0.37330996497431423]) s = eigensystem.real_symmetric(m=m, absolute_epsilon=10) assert s.min_abs_pivot() == 10 assert approx_equal(s.vectors(), [0, 0, 1, 0, 1, 0, 1, 0, 0]) assert approx_equal(s.values(), [2.8065584999742659, 1.7361052947659894, 1.4573362052597449]) s = eigensystem.real_symmetric(m=m, relative_epsilon=0) assert s.min_abs_pivot() == 0 assert approx_equal(s.values(), [3,2,1])
def exercise_eigensystem(): s = eigensystem.real_symmetric(m=flex.double(flex.grid(0, 0)), relative_epsilon=1e-6, absolute_epsilon=1e-6) s.values().all() == (0, ) assert s.vectors().all() == (0, 0) u = s.generalized_inverse_as_packed_u() assert u.all() == (0, ) m = u.matrix_packed_u_as_symmetric() assert m.all() == (0, 0) # for n in xrange(1, 10): m = flex.double(flex.grid(n, n)) s = eigensystem.real_symmetric(m) assert approx_equal(tuple(s.values()), [0] * n) v = s.vectors() for i in xrange(n): for j in xrange(n): x = 0 if (i == j): x = 1 assert approx_equal(v[(i, j)], x) v = [] for i in xrange(n): j = (i * 13 + 17) % n v.append(j) m[i * (n + 1)] = j s = eigensystem.real_symmetric(m) if (n == 3): ss = eigensystem.real_symmetric( (m[0], m[4], m[8], m[1], m[2], m[5])) assert approx_equal(s.values(), ss.values()) assert approx_equal(s.vectors(), ss.vectors()) v.sort() v.reverse() assert approx_equal(s.values(), v) if (n > 1): assert approx_equal(flex.min(s.vectors()), 0) assert approx_equal(flex.max(s.vectors()), 1) assert approx_equal(flex.sum(s.vectors()), n) for t in xrange(10): for i in xrange(n): for j in xrange(i, n): m[i * n + j] = random.random() - 0.5 if (i != j): m[j * n + i] = m[i * n + j] s = eigensystem.real_symmetric(m) if (n == 3): ss = eigensystem.real_symmetric( (m[0], m[4], m[8], m[1], m[2], m[5])) assert approx_equal(s.values(), ss.values()) assert approx_equal(s.vectors(), ss.vectors()) v = list(s.values()) v.sort() v.reverse() assert list(s.values()) == v for i in xrange(n): l = s.values()[i] x = s.vectors()[i * n:i * n + n] mx = matrix_mul(m, n, n, x, n, 1) lx = [e * l for e in x] assert approx_equal(mx, lx) # m = (1.4573362052597449, 1.7361052947659894, 2.8065584999742659, -0.5387293498219814, -0.018204949672480729, 0.44956507395617257) n_repetitions = 10000 t0 = time.time() v = time_eigensystem_real_symmetric(m, n_repetitions) assert v == (0, 0, 0) print "time_eigensystem_real_symmetric: %.3f micro seconds" % ( (time.time() - t0) / n_repetitions * 1.e6) from scitbx.linalg import time_lapack_dsyev for use_fortran in [False, True]: if (not use_fortran): if (not scitbx.linalg.fem_is_available()): continue impl_id = "fem" else: if (not scitbx.linalg.for_is_available()): continue impl_id = "for" v = time_lapack_dsyev(m, 2, use_fortran) # to trigger one-time initialization of SAVE variables t0 = time.time() v = time_lapack_dsyev(m, n_repetitions, use_fortran) assert v == (0, 0, 0) print "time_lapack_dsyev %s: %.3f micro seconds" % ( impl_id, (time.time() - t0) / n_repetitions * 1.e6) # s = eigensystem.real_symmetric(m=m) assert s.min_abs_pivot() > 0 assert s.min_abs_pivot() < 1.e-10 assert approx_equal(s.generalized_inverse_as_packed_u(), [ 0.77839538602575065, 0.25063185439711611, -0.03509803174624003, 0.68162798233326816, -0.10755998636596431, 0.37330996497431423 ]) s = eigensystem.real_symmetric(m=m, absolute_epsilon=10) assert s.min_abs_pivot() == 10 assert approx_equal(s.vectors(), [0, 0, 1, 0, 1, 0, 1, 0, 0]) assert approx_equal( s.values(), [2.8065584999742659, 1.7361052947659894, 1.4573362052597449]) s = eigensystem.real_symmetric(m=m, relative_epsilon=0) assert s.min_abs_pivot() == 0 assert approx_equal(s.values(), [3, 2, 1])
def exercise(use_fortran): from scitbx.linalg import lapack_dsyev from scitbx.array_family import flex from scitbx.math.tests.tst_math import matrix_mul from libtbx.test_utils import approx_equal import random random.seed(0) # for diag in [0, 1]: for n in range(1, 11): for uplo in ["U", "L"]: a = flex.double(flex.grid(n, n), 0) for i in range(n): a[(i, i)] = diag w = flex.double(n, -1e100) a_inp = a.deep_copy() info = lapack_dsyev(jobz="V", uplo=uplo, a=a, w=w, use_fortran=use_fortran) if (info == 99): if (not use_fortran): print("Skipping tests: lapack_dsyev not available.") return assert info == 0 assert approx_equal(w, [diag] * n) if (diag != 0): assert approx_equal(a, a_inp) # for i_trial in range(10): for n in range(1, 11): for uplo in ["U", "L"]: a = flex.double(flex.grid(n, n)) for i in range(n): for j in range(i, n): a[i * n + j] = random.random() - 0.5 if (i != j): a[j * n + i] = a[i * n + j] w = flex.double(n, -1e100) a_inp = a.deep_copy() info = lapack_dsyev(jobz="V", uplo=uplo, a=a, w=w, use_fortran=use_fortran) assert info == 0 for i in range(1, n): assert w[i - 1] <= w[i] for i in range(n): l = w[i] x = a[i * n:i * n + n] ax = matrix_mul(a_inp, n, n, x, n, 1) lx = [e * l for e in x] assert approx_equal(ax, lx) # a = flex.double([0.47, 0.10, -0.21, 0.10, 0.01, -0.03, -0.21, -0.03, 0.35]) a.reshape(flex.grid(3, 3)) w = flex.double(3, -1e100) info = lapack_dsyev(jobz="V", uplo=uplo, a=a, w=w, use_fortran=use_fortran) assert info == 0 assert approx_equal(w, [-0.0114574, 0.1978572, 0.6436002]) assert approx_equal(a, [ -0.2236115, 0.9734398, -0.0491212, -0.5621211, -0.1699700, -0.8094010, -0.7962523, -0.1533793, 0.5851983 ])
def exercise(use_fortran): from scitbx.linalg import lapack_dsyev from scitbx.array_family import flex from scitbx.math.tests.tst_math import matrix_mul from libtbx.test_utils import approx_equal import random random.seed(0) # for diag in [0, 1]: for n in xrange(1, 11): for uplo in ["U", "L"]: a = flex.double(flex.grid(n,n), 0) for i in xrange(n): a[(i,i)] = diag w = flex.double(n, -1e100) a_inp = a.deep_copy() info = lapack_dsyev( jobz="V", uplo=uplo, a=a, w=w, use_fortran=use_fortran) if (info == 99): if (not use_fortran): print "Skipping tests: lapack_dsyev not available." return assert info == 0 assert approx_equal(w, [diag]*n) if (diag != 0): assert approx_equal(a, a_inp) # for i_trial in xrange(10): for n in xrange(1, 11): for uplo in ["U", "L"]: a = flex.double(flex.grid(n,n)) for i in xrange(n): for j in xrange(i,n): a[i*n+j] = random.random() - 0.5 if (i != j): a[j*n+i] = a[i*n+j] w = flex.double(n, -1e100) a_inp = a.deep_copy() info = lapack_dsyev( jobz="V", uplo=uplo, a=a, w=w, use_fortran=use_fortran) assert info == 0 for i in xrange(1,n): assert w[i-1] <= w[i] for i in xrange(n): l = w[i] x = a[i*n:i*n+n] ax = matrix_mul(a_inp, n, n, x, n, 1) lx = [e*l for e in x] assert approx_equal(ax, lx) # a = flex.double([ 0.47, 0.10, -0.21, 0.10, 0.01, -0.03, -0.21, -0.03, 0.35]) a.reshape(flex.grid(3,3)) w = flex.double(3, -1e100) info = lapack_dsyev(jobz="V", uplo=uplo, a=a, w=w, use_fortran=use_fortran) assert info == 0 assert approx_equal(w, [-0.0114574, 0.1978572, 0.6436002]) assert approx_equal(a, [ -0.2236115, 0.9734398, -0.0491212, -0.5621211, -0.1699700, -0.8094010, -0.7962523, -0.1533793, 0.5851983])