def compare_times(max_n_power=8): from scitbx.linalg import lapack_dsyev mt = flex.mersenne_twister(seed=0) show_tab_header = True tfmt = "%5.2f" for n_power in xrange(5,max_n_power+1): n = 2**n_power l = mt.random_double(size=n*(n+1)//2) * 2 - 1 a = l.matrix_packed_l_as_symmetric() aes = a.deep_copy() ala = [a.deep_copy(), a.deep_copy()] wla = [flex.double(n, -1e100), flex.double(n, -1e100)] t0 = time.time() es = eigensystem.real_symmetric(aes) tab = [n, tfmt % (time.time() - t0)] for i,use_fortran in enumerate([False, True]): t0 = time.time() info = lapack_dsyev( jobz="V", uplo="U", a=ala[i], w=wla[i], use_fortran=use_fortran) if (info == 99): tab.append(" --- ") else: assert info == 0 tab.append(tfmt % (time.time() - t0)) assert approx_equal(list(reversed(es.values())), wla[i]) if (show_tab_header): print " time [s] eigenvalues" print " n es fem for min max" show_tab_header = False tab.extend([es.values()[-1], es.values()[0]]) print "%3d %s %s %s [%6.2f %6.2f]" % tuple(tab)
def compare_times(max_n_power=8): from scitbx.linalg import lapack_dsyev mt = flex.mersenne_twister(seed=0) show_tab_header = True tfmt = "%5.2f" for n_power in xrange(5, max_n_power + 1): n = 2**n_power l = mt.random_double(size=n * (n + 1) // 2) * 2 - 1 a = l.matrix_packed_l_as_symmetric() aes = a.deep_copy() ala = [a.deep_copy(), a.deep_copy()] wla = [flex.double(n, -1e100), flex.double(n, -1e100)] t0 = time.time() es = eigensystem.real_symmetric(aes) tab = [n, tfmt % (time.time() - t0)] for i, use_fortran in enumerate([False, True]): t0 = time.time() info = lapack_dsyev(jobz="V", uplo="U", a=ala[i], w=wla[i], use_fortran=use_fortran) if (info == 99): tab.append(" --- ") else: assert info == 0 tab.append(tfmt % (time.time() - t0)) assert approx_equal(list(reversed(es.values())), wla[i]) if (show_tab_header): print " time [s] eigenvalues" print " n es fem for min max" show_tab_header = False tab.extend([es.values()[-1], es.values()[0]]) print "%3d %s %s %s [%6.2f %6.2f]" % tuple(tab)
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])