def branch_2_mn(small): m = [] n = [] while (len(n) == 0 or len(m) == 0): r1 = random.random() r2 = random.random() r3 = random.random() if (r1 >= r2 and r2 >= r3 and r3 > 0.0): r = random.random() if (r > 0.5): m = [r1, r2, r3, 0, 0, 0] else: m = [r1, r1, r1, 0, 0, 0] assert adptbx.is_positive_definite(m, small) if (r1 >= r2 and r2 >= r3 and r3 > 0.0): r = random.random() if (r > 0.5): n = [r1, r3, r2, 0, 0, 0] else: n = [r1, r1, r1, 0, 0, 0] assert adptbx.is_positive_definite(n, small) r = random.random() if (r > 0.5): m = adptbx.random_rotate_ellipsoid(u_cart=m) n = adptbx.random_rotate_ellipsoid(u_cart=n) return m, n
def branch_3_mn(): m = None n = None small = 1.e-15 for i in range(10000): m2 = [] n2 = [] for i in range(4): r1 = random.random() r2 = random.random() r3 = random.random() if (r3 > 0.1): r1 = r2 m2.append(r1) n2.append(r2) p1 = 0.5 * (m2[0] + m2[3] + math.sqrt(4 * m2[1] * m2[2] + (m2[0] - m2[3])**2)) p2 = 0.5 * (m2[0] + m2[3] - math.sqrt(4 * m2[1] * m2[2] + (m2[0] - m2[3])**2)) q1 = 0.5 * (n2[0] + m2[3] + math.sqrt(4 * n2[1] * n2[2] + (n2[0] - n2[3])**2)) q2 = 0.5 * (n2[0] + m2[3] - math.sqrt(4 * n2[1] * n2[2] + (n2[0] - n2[3])**2)) if (min(p1, p2) > 0.0 and min(q1, q2) > 0.0): r = random.random() if (r > 0.5): r1 = r3 r2 = r2 m = [m2[0], m2[3], r1, m2[1], 0, 0] n = [n2[0], n2[3], r2, n2[1], 0, 0] if ([ adptbx.is_positive_definite(m), adptbx.is_positive_definite(n) ].count(True) == 2): esm = adptbx.eigensystem(m) esn = adptbx.eigensystem(n) vn = esn.values() vm = esm.values() mmin = flex.min(flex.double(vm)) nmin = flex.min(flex.double(vn)) if (abs(abs(mmin) - abs(nmin)) < small and mmin > 0. and nmin > 0.): for i, v in enumerate(vn): if (abs(abs(nmin) - v) < small): break for j, v in enumerate(vm): if (abs(abs(mmin) - v) < small): break vecn = flex.double(esn.vectors(i)) vecm = flex.double(esm.vectors(j)) if (flex.mean(vecm - vecn) < small): break else: m = None n = None assert [m, n] != [None, None] assert [adptbx.is_positive_definite(m), adptbx.is_positive_definite(n)].count(True) == 2 r = random.random() if (r > 0.5): m = adptbx.random_rotate_ellipsoid(u_cart=m) n = adptbx.random_rotate_ellipsoid(u_cart=n) return m, n
def branch_2_mn(small): m=[] n=[] while (len(n)==0 or len(m)==0): r1 = random.random() r2 = random.random() r3 = random.random() if(r1 >= r2 and r2 >= r3 and r3> 0.0): r = random.random() if(r > 0.5): m = [r1,r2,r3,0,0,0] else: m = [r1,r1,r1,0,0,0] assert adptbx.is_positive_definite(m,small) if(r1 >= r2 and r2 >= r3 and r3 > 0.0): r = random.random() if(r > 0.5): n = [r1,r3,r2,0,0,0] else: n = [r1,r1,r1,0,0,0] assert adptbx.is_positive_definite(n,small) r = random.random() if(r > 0.5): m = adptbx.random_rotate_ellipsoid(u_cart = m) n = adptbx.random_rotate_ellipsoid(u_cart = n) return m,n
def branch_3_mn(): m = None n = None small = 1.e-15 for i in xrange(10000): m2=[] n2=[] for i in xrange(4): r1 = random.random() r2 = random.random() r3 = random.random() if(r3 > 0.1): r1 = r2 m2.append(r1) n2.append(r2) p1 = 0.5 * (m2[0]+m2[3] + math.sqrt(4*m2[1]*m2[2]+(m2[0]-m2[3])**2)) p2 = 0.5 * (m2[0]+m2[3] - math.sqrt(4*m2[1]*m2[2]+(m2[0]-m2[3])**2)) q1 = 0.5 * (n2[0]+m2[3] + math.sqrt(4*n2[1]*n2[2]+(n2[0]-n2[3])**2)) q2 = 0.5 * (n2[0]+m2[3] - math.sqrt(4*n2[1]*n2[2]+(n2[0]-n2[3])**2)) if(min(p1,p2) > 0.0 and min(q1,q2) > 0.0): r = random.random() if(r > 0.5): r1 = r3 r2 = r2 m = [m2[0],m2[3],r1,m2[1],0,0] n = [n2[0],n2[3],r2,n2[1],0,0] if([adptbx.is_positive_definite(m), adptbx.is_positive_definite(n)].count(True)==2): esm = adptbx.eigensystem(m) esn = adptbx.eigensystem(n) vn = esn.values() vm = esm.values() mmin = flex.min(flex.double(vm)) nmin = flex.min(flex.double(vn)) if(abs(abs(mmin) - abs(nmin)) < small and mmin> 0. and nmin> 0.): for i, v in enumerate(vn): if(abs(abs(nmin) - v) < small): break for j, v in enumerate(vm): if(abs(abs(mmin) - v) < small): break vecn = flex.double(esn.vectors(i)) vecm = flex.double(esm.vectors(j)) if(flex.mean(vecm-vecn) < small): break else: m = None n = None assert [m,n] != [None,None] assert [adptbx.is_positive_definite(m), adptbx.is_positive_definite(n)].count(True)==2 r = random.random() if(r > 0.5): m = adptbx.random_rotate_ellipsoid(u_cart = m) n = adptbx.random_rotate_ellipsoid(u_cart = n) return m,n
def exercise_eigen_core(diag): u = adptbx.random_rotate_ellipsoid(diag + [0., 0., 0.]) ev = list(adptbx.eigenvalues(u)) diag.sort() ev.sort() for i in xrange(3): check_eigenvalue(u, ev[i]) for i in xrange(3): assert abs(diag[i] - ev[i]) < 1.e-4 if (adptbx.is_positive_definite(ev)): es = adptbx.eigensystem(u) ev = list(es.values()) ev.sort() for i in xrange(3): check_eigenvalue(u, ev[i]) for i in xrange(3): assert abs(diag[i] - ev[i]) < 1.e-4 evec = [] for i in xrange(3): check_eigenvector(u, es.values()[i], es.vectors(i)) evec.extend(es.vectors(i)) return # XXX following tests disabled for the moment # sometimes fail if eigenvalues are very similar but not identical sqrt_eval = matrix.diag(flex.sqrt(flex.double(es.values()))) evec = matrix.sqr(evec).transpose() sqrt_u = evec * sqrt_eval * evec.transpose() u_full = matrix.sym(sym_mat3=u).elems assert approx_equal(u_full, (sqrt_u.transpose() * sqrt_u).elems, eps=1.e-3) assert approx_equal(u_full, (sqrt_u * sqrt_u.transpose()).elems, eps=1.e-3) assert approx_equal(u_full, (sqrt_u * sqrt_u).elems, eps=1.e-3) sqrt_u_plus_shifts = matrix.sym(sym_mat3=[ x + 10 * (random.random() - .5) for x in sqrt_u.as_sym_mat3() ]) sts = (sqrt_u_plus_shifts.transpose() * sqrt_u_plus_shifts).as_sym_mat3() ev = adptbx.eigenvalues(sts) assert min(ev) >= 0 sts = (sqrt_u_plus_shifts * sqrt_u_plus_shifts.transpose()).as_sym_mat3() ev = adptbx.eigenvalues(sts) assert min(ev) >= 0 sts = (sqrt_u_plus_shifts * sqrt_u_plus_shifts).as_sym_mat3() ev = adptbx.eigenvalues(sts) assert min(ev) >= 0
def exercise_eigen_core(diag): u = adptbx.random_rotate_ellipsoid(diag + [0.0, 0.0, 0.0]) ev = list(adptbx.eigenvalues(u)) diag.sort() ev.sort() for i in xrange(3): check_eigenvalue(u, ev[i]) for i in xrange(3): assert abs(diag[i] - ev[i]) < 1.0e-4 if adptbx.is_positive_definite(ev): es = adptbx.eigensystem(u) ev = list(es.values()) ev.sort() for i in xrange(3): check_eigenvalue(u, ev[i]) for i in xrange(3): assert abs(diag[i] - ev[i]) < 1.0e-4 evec = [] for i in xrange(3): check_eigenvector(u, es.values()[i], es.vectors(i)) evec.extend(es.vectors(i)) return # XXX following tests disabled for the moment # sometimes fail if eigenvalues are very similar but not identical sqrt_eval = matrix.diag(flex.sqrt(flex.double(es.values()))) evec = matrix.sqr(evec).transpose() sqrt_u = evec * sqrt_eval * evec.transpose() u_full = matrix.sym(sym_mat3=u).elems assert approx_equal(u_full, (sqrt_u.transpose() * sqrt_u).elems, eps=1.0e-3) assert approx_equal(u_full, (sqrt_u * sqrt_u.transpose()).elems, eps=1.0e-3) assert approx_equal(u_full, (sqrt_u * sqrt_u).elems, eps=1.0e-3) sqrt_u_plus_shifts = matrix.sym(sym_mat3=[x + 10 * (random.random() - 0.5) for x in sqrt_u.as_sym_mat3()]) sts = (sqrt_u_plus_shifts.transpose() * sqrt_u_plus_shifts).as_sym_mat3() ev = adptbx.eigenvalues(sts) assert min(ev) >= 0 sts = (sqrt_u_plus_shifts * sqrt_u_plus_shifts.transpose()).as_sym_mat3() ev = adptbx.eigenvalues(sts) assert min(ev) >= 0 sts = (sqrt_u_plus_shifts * sqrt_u_plus_shifts).as_sym_mat3() ev = adptbx.eigenvalues(sts) assert min(ev) >= 0