def svd(a, full_matrices=False): a = ctf.to_nparray(a) u, s, v = np.linalg.svd(a, full_matrices=full_matrices) u = ctf.from_nparray(u) s = ctf.from_nparray(s) v = ctf.from_nparray(v) return u, s, v
def load_tensor_from_file(filename): try: T = np.load(filename) print('Loaded tensor from file ', filename) except FileNotFoundError: raise FileNotFoundError('No tensor exist on: ', filename) return ctf.from_nparray(T)
def sqrt(a): if hasattr(a, 'shape'): if (prod(a.shape) == 1) or (len(a.shape) == 0): return npsqrt(ctf.to_nparray(a)) else: return ctf.from_nparray(npsqrt(ctf.to_nparray(a))) else: return npsqrt(a)
def test_abs(self): a0 = numpy.arange(2., 5.) a1 = ctf.from_nparray(a0) self.assertTrue(ctf.all(ctf.abs(a1) == ctf.abs(a0))) self.assertTrue(ctf.all(ctf.abs(a1) == numpy.abs(a0))) try: a1 = a1 + 1j self.assertAlmostEqual(ctf.abs(a1).sum(), numpy.abs(a1.to_nparray()).sum(), 14) except AttributeError: pass
def test_abs(self): a0 = numpy.arange(2., 5.) a1 = ctf.from_nparray(a0) self.assertTrue(ctf.all(ctf.abs(a1) == ctf.abs(a0))) self.assertTrue(ctf.all(ctf.abs(a1) == numpy.abs(a0))) try: a1 = a1 + 1j self.assertAlmostEqual(ctf.abs(a1).sum(), numpy.abs(a1.to_nparray()).sum(), 14) except AttributeError: pass
def test_astensor(self): # astensor converts python object to ctf tensor a0 = ctf.astensor((1,2,3)) a0 = ctf.astensor([1,2.,3]) a0 = ctf.astensor([(1,2), (3,4)]) a0 = ctf.astensor(numpy.arange(3)) a0 = ctf.astensor([numpy.array((1,2)), numpy.array((3,4))+1j]) a1 = ctf.astensor(a0) a1[:] = 0 self.assertTrue(ctf.all(a0==0)) self.assertTrue(ctf.all(a1==0)) a0 = numpy.asarray(a1) # self.assertTrue(ctf.asarray(a0).__class__ == ctf.astensor(a0).__class__) a0 = ctf.astensor([1,2.,3], dtype='D') self.assertTrue(a0.dtype == numpy.complex128) with self.assertRaises(TypeError): ctf.astensor([1j,2j], dtype='d') a0 = numpy.arange(4.).reshape(2,2) a1 = ctf.to_nparray(ctf.from_nparray(a0)) self.assertTrue(ctf.all(a0==a1)) try: a1 = ctf.from_nparray(a1).to_nparray() self.assertTrue(ctf.all(a0==a1)) except AttributeError: pass a0 = ctf.from_nparray(numpy.arange(3)) a1 = ctf.from_nparray(a0) a1[:] = 0 self.assertTrue(ctf.all(a0==0)) self.assertTrue(ctf.all(a1==0)) a0 = numpy.arange(6).reshape(2,3) a1 = ctf.array(a0) self.assertTrue(ctf.all(a0==a1)) self.assertTrue(ctf.all(a1==a0)) a1 = ctf.array(a0, copy=False) self.assertTrue(ctf.all(a1==0))
def test_astensor(self): # astensor converts python object to ctf tensor a0 = ctf.astensor((1,2,3)) a0 = ctf.astensor([1,2.,3]) a0 = ctf.astensor([(1,2), (3,4)]) a0 = ctf.astensor(numpy.arange(3)) a0 = ctf.astensor([numpy.array((1,2)), numpy.array((3,4))+1j]) a1 = ctf.astensor(a0) a1[:] = 0 self.assertTrue(ctf.all(a0==0)) self.assertTrue(ctf.all(a1==0)) a0 = numpy.asarray(a1) # self.assertTrue(ctf.asarray(a0).__class__ == ctf.astensor(a0).__class__) a0 = ctf.astensor([1,2.,3], dtype='D') self.assertTrue(a0.dtype == numpy.complex128) with self.assertRaises(TypeError): ctf.astensor([1j,2j], dtype='d') a0 = numpy.arange(4.).reshape(2,2) a1 = ctf.to_nparray(ctf.from_nparray(a0)) self.assertTrue(ctf.all(a0==a1)) try: a1 = ctf.from_nparray(a1).to_nparray() self.assertTrue(ctf.all(a0==a1)) except AttributeError: pass a0 = ctf.from_nparray(numpy.arange(3)) a1 = ctf.from_nparray(a0) a1[:] = 0 self.assertTrue(ctf.all(a0==0)) self.assertTrue(ctf.all(a1==0)) a0 = numpy.arange(6).reshape(2,3) a1 = ctf.array(a0) self.assertTrue(ctf.all(a0==a1)) self.assertTrue(ctf.all(a1==a0)) a1 = ctf.array(a0, copy=False) self.assertTrue(ctf.all(a1==0))
def test_sum_axis(self): a0 = numpy.ones((2, 3, 4)) a1 = ctf.from_nparray(a0) self.assertEqual(a1.sum(axis=0).shape, (3, 4)) self.assertEqual(a1.sum(axis=1).shape, (2, 4)) self.assertEqual(a1.sum(axis=-1).shape, (2, 3)) self.assertEqual(ctf.sum(a1, axis=2).shape, (2, 3)) self.assertEqual(ctf.sum(a1.transpose(2, 1, 0), axis=2).shape, (4, 3)) self.assertEqual(ctf.sum(a1, axis=(1, 2)).shape, (2, )) self.assertEqual(ctf.sum(a1, axis=(0, 2)).shape, (3, )) self.assertEqual(ctf.sum(a1, axis=(2, 0)).shape, (3, )) self.assertEqual(ctf.sum(a1, axis=(0, -1)).shape, (3, )) self.assertEqual(ctf.sum(a1, axis=(-1, -2)).shape, (2, ))
def test_sum_axis(self): a0 = numpy.ones((2,3,4)) a1 = ctf.from_nparray(a0) self.assertEqual(a1.sum(axis=0).shape, (3,4)) self.assertEqual(a1.sum(axis=1).shape, (2,4)) self.assertEqual(a1.sum(axis=-1).shape, (2,3)) self.assertEqual(ctf.sum(a1, axis=2).shape, (2,3)) self.assertEqual(ctf.sum(a1.transpose(2,1,0), axis=2).shape, (4,3)) self.assertEqual(ctf.sum(a1, axis=(1,2)).shape, (2,)) self.assertEqual(ctf.sum(a1, axis=(0,2)).shape, (3,)) self.assertEqual(ctf.sum(a1, axis=(2,0)).shape, (3,)) self.assertEqual(ctf.sum(a1, axis=(0,-1)).shape, (3,)) self.assertEqual(ctf.sum(a1, axis=(-1,-2)).shape, (2,))
def sqrt(a): return ctf.from_nparray(np.sqrt(ctf.to_nparray(a)))
def test_sum(self): a0 = numpy.arange(4.) a1 = ctf.from_nparray(a0) self.assertAlmostEqual(ctf.sum(a1), a1.sum(), 9)
def qr(a): a = ctf.to_nparray(a) q, r = np.linalg.qr(a) q = ctf.from_nparray(q) r = ctf.from_nparray(r) return q, r
def main(): t0 = time.time() ######## Inputs ############################## # SEP Model N = 50 alpha = 0.35 # In at left beta = 2. / 3. # Exit at right s = -1. # Exponential weighting gamma = 0. # Exit at left delta = 0. # In at right p = 1. # Jump right q = 0. # Jump Left # Optimization tol = 1e-5 maxIter = 0 maxBondDim = 10 useCTF = True ############################################## # Create MPS ################################# # PH - Make Isometries, Center Site mpiprint('Generating MPS') M = [] for i in range(int(N / 2)): tmp = np.random.rand(2, min(2**(i),maxBondDim), min(2**(i+1),maxBondDim))\ +0.j M.append(ctf.from_nparray(tmp)) for i in range(int(N / 2))[::-1]: tmp = np.random.rand(2, min(2**(i+1),maxBondDim), min(2**i,maxBondDim))\ +0.j M.append(ctf.from_nparray(tmp)) ############################################## # Create MPO ################################# mpiprint('Generating MPO') # Simple Operators Sp = np.array([[0., 1.], [0., 0.]]) Sm = np.array([[0., 0.], [1., 0.]]) n = np.array([[0., 0.], [0., 1.]]) v = np.array([[1., 0.], [0., 0.]]) I = np.array([[1., 0.], [0., 1.]]) z = np.array([[0., 0.], [0., 0.]]) # List to hold MPOs W = [] # First Site site_0 = ctf.astensor( [[alpha * (np.exp(-s) * Sm - v), np.exp(-s) * Sp, -n, I]]) W.append(site_0) # Central Sites for i in range(N - 2): site_i = ctf.astensor([[I, z, z, z], [Sm, z, z, z], [v, z, z, z], [z, np.exp(-s) * Sp, -n, I]]) W.append(site_i) # Last Site site_N = ctf.astensor([[I], [Sm], [v], [beta * (np.exp(-s) * Sp - n)]]) W.append(site_N) ############################################## # Canonicalize MPS ########################### for i in range(int(N) - 1, 0, -1): M_reshape = ctf.transpose(M[i], axes=[1, 0, 2]) (n1, n2, n3) = M_reshape.shape M_reshape = M_reshape.reshape(n1, n2 * n3) (U, S, V) = ctf.svd(M_reshape) M_reshape = V.reshape(n1, n2, n3) M[i] = ctf.transpose(M_reshape, axes=[1, 0, 2]) M[i - 1] = ctf.einsum('klj,ji,i->kli', M[i - 1], U, S) ############################################## # Canonicalize MPS ########################### def pick_eigs(w, v, nroots, x0): idx = np.argsort(np.real(w)) w = w[idx] v = v[:, idx] return w, v, idx ############################################## # Create Environment ######################### mpiprint('Generating Environment') # Allocate empty environment F = [] tmp = np.array([[[1.]]]) + 0.j F.append(ctf.from_nparray(tmp)) for i in range(int(N / 2)): tmp = np.zeros((min(2**(i + 1), maxBondDim), 4, min(2**(i + 1), maxBondDim))) + 0.j F.append(ctf.from_nparray(tmp)) for i in range(int(N / 2) - 1, 0, -1): tmp = np.zeros( (min(2**(i), maxBondDim), 4, min(2**i, maxBondDim))) + 0.j F.append(ctf.from_nparray(tmp)) tmp = np.array([[[1.]]]) + 0.j F.append(ctf.from_nparray(tmp)) # Calculate initial environment for i in range(int(N) - 1, 0, -1): tmp = ctf.einsum('eaf,cdf->eacd', M[i], F[i + 1]) tmp = ctf.einsum('ydbe,eacd->ybac', W[i], tmp) F[i] = ctf.einsum('bxc,ybac->xya', ctf.conj(M[i]), tmp) ############################################## # Optimization Sweeps ######################## converged = False iterCnt = 0 E_prev = 0 while not converged: # Right Sweep ---------------------------- tr = time.time() mpiprint('Start Right Sweep {}'.format(iterCnt)) for i in range(N - 1): (n1, n2, n3) = M[i].shape # Make Hx Function def Hfun(x): x_reshape = ctf.array(x) x_reshape = ctf.reshape(x_reshape, (n1, n2, n3)) tmp = ctf.einsum('ijk,lmk->ijlm', F[i + 1], x_reshape) tmp = ctf.einsum('njol,ijlm->noim', W[i], tmp) res = ctf.einsum('pnm,noim->opi', F[i], tmp) return -ctf.reshape(res, -1).to_nparray() def precond(dx, e, x0): return dx # Set up initial guess guess = ctf.reshape(M[i], -1).to_nparray() # Run eigenproblem u, v = eig(Hfun, guess, precond, pick=pick_eigs) E = -u v = ctf.array(v) M[i] = ctf.reshape(v, (n1, n2, n3)) # Print Results mpiprint('\tEnergy at site {} = {}'.format(i, E)) # Right Normalize M_reshape = ctf.reshape(M[i], (n1 * n2, n3)) (U, S, V) = ctf.svd(M_reshape) M[i] = ctf.reshape(U, (n1, n2, n3)) M[i + 1] = ctf.einsum('i,ij,kjl->kil', S, V, M[i + 1]) # Update F tmp = ctf.einsum('jlp,ijk->lpik', F[i], ctf.conj(M[i])) tmp = ctf.einsum('lmin,lpik->mpnk', W[i], tmp) F[i + 1] = ctf.einsum('npq,mpnk->kmq', M[i], tmp) mpiprint('Complete Right Sweep {}, {} sec'.format( iterCnt, time.time() - tr)) # Left Sweep ------------------------------ tl = time.time() mpiprint('Start Left Sweep {}'.format(iterCnt)) for i in range(N - 1, 0, -1): (n1, n2, n3) = M[i].shape # Make Hx Function def Hfun(x): x_reshape = ctf.array(x) x_reshape = ctf.reshape(x_reshape, (n1, n2, n3)) tmp = ctf.einsum('ijk,lmk->ijlm', F[i + 1], x_reshape) tmp = ctf.einsum('njol,ijlm->noim', W[i], tmp) res = ctf.einsum('pnm,noim->opi', F[i], tmp) return -ctf.reshape(res, -1).to_nparray() def precond(dx, e, x0): return dx # Set up initial guess guess = ctf.reshape(M[i], -1).to_nparray() # Run eigenproblem u, v = eig(Hfun, guess, precond, pick=pick_eigs) E = -u v = ctf.array(v) M[i] = ctf.reshape(v, (n1, n2, n3)) # Print Results mpiprint('\tEnergy at site {}= {}'.format(i, E)) # Right Normalize M_reshape = ctf.transpose(M[i], (1, 0, 2)) M_reshape = ctf.reshape(M_reshape, (n2, n1 * n3)) (U, S, V) = ctf.svd(M_reshape) M_reshape = ctf.reshape(V, (n2, n1, n3)) M[i] = ctf.transpose(M_reshape, (1, 0, 2)) M[i - 1] = ctf.einsum('klj,ji,i->kli', M[i - 1], U, S) # Update F tmp = ctf.einsum('eaf,cdf->eacd', M[i], F[i + 1]) tmp = ctf.einsum('ydbe,eacd->ybac', W[i], tmp) F[i] = ctf.einsum('bxc,ybac->xya', ctf.conj(M[i]), tmp) mpiprint('Left Sweep {}, {} sec'.format(iterCnt, time.time() - tl)) # Convergence Test ----------------------- if np.abs(E - E_prev) < tol: mpiprint('#' * 75 + '\nConverged at E = {}'.format(E) + '\n' + '#' * 75) converged = True elif iterCnt > maxIter: mpiprint('Convergence not acheived') converged = True else: iterCnt += 1 E_prev = E mpiprint('Total Time = {}'.format(time.time() - t0))
def min(a): return ctf.from_nparray(np.min(ctf.to_nparray(a)))
def append(a, b): return ctf.from_nparray(np.append(ctf.to_nparray(a), ctf.to_nparray(b)))
def inv(a): return ctf.from_nparray(np.linalg.pinv(ctf.to_nparray(a)))
def max(a): return ctf.from_nparray(np.max(ctf.to_nparray(a)))
def array(tens, dtype=None, copy=True, subok=False, ndimin=0): ten = nparray(tens) return ctf.from_nparray(ten)
def expm(a): return ctf.from_nparray(sla.expm(ctf.to_nparray(a)))
def test_sum(self): a0 = numpy.arange(4.) a1 = ctf.from_nparray(a0) self.assertAlmostEqual(ctf.sum(a1), a1.sum(), 9)
def eigh(a): a = ctf.to_nparray(a) u, v = np.linalg.eigh(a) u = ctf.from_nparray(u) v = ctf.from_nparray(v) return u, v
def from_nparray(arr): return ctf.from_nparray(arr)
def fill_diagonal(matrix, value): return ctf.from_nparray(np.fill_diagonal(matrix, value))
tol = 1e-5 maxIter = 10 maxBondDim = 10 useCTF = True ############################################## # Create MPS ################################# # PH - Make Isometries, Center Site print('Generating MPS') M = [] for i in range(int(N / 2)): tmp = np.random.rand(2, min(2**(i),maxBondDim), min(2**(i+1),maxBondDim))\ +0.j M.append(ctf.from_nparray(tmp)) for i in range(int(N / 2))[::-1]: tmp = np.random.rand(2, min(2**(i+1),maxBondDim), min(2**i,maxBondDim))\ +0.j M.append(ctf.from_nparray(tmp)) ############################################## # Create MPO ################################# print('Generating MPO') # Simple Operators Sp = np.array([[0., 1.], [0., 0.]]) Sm = np.array([[0., 0.], [1., 0.]]) n = np.array([[0., 0.], [0., 1.]]) v = np.array([[1., 0.], [0., 0.]])
def log2(a): return ctf.from_nparray(np.log2(ctf.to_nparray(a)))
q = 0. # Jump Left # Optimization tol = 1e-5 maxIter = 10 maxBondDim = 20 ############################################## # Create MPS ################################# # PH - Make Isometries, Center Site print('Generating MPS') M = [] for i in range(int(N/2)): tmp = np.random.rand(2, min(2**(i),maxBondDim), min(2**(i+1),maxBondDim)) M.append(ctf.from_nparray(tmp)) for i in range(int(N/2))[::-1]: tmp = np.random.rand(2, min(2**(i+1),maxBondDim), min(2**i,maxBondDim)) M.append(ctf.from_nparray(tmp)) ############################################## # Create MPO ################################# print('Generating MPO') # Simple Operators Sp = np.array([[0.,1.],[0.,0.]]) Sm = np.array([[0.,0.],[1.,0.]]) n = np.array([[0.,0.],[0.,1.]]) v = np.array([[1.,0.],[0.,0.]]) I = np.array([[1.,0.],[0.,1.]])