def testLTSolve(self): for m, s in self.data: L = ni.lower_tri_sp(m, m, s) b = ni.vect(ni.np.arange(m, dtype=ni.np.float64)) x = cppsparse.dvec(b) L.ltsolve(x) self.verifySolve(L, b, True, x)
def qr_left(A): "Computes a left-looking QR factorization of A with M >= N" import numpy as np from cppsparse import dhouse, dvec m,n = A.shape V = np.zeros((m, n)) B = np.zeros(n); R = np.zeros((m, n)) for i in range(n): x = A[:, i].copy(); for k in range(i): v = V[k::, k] beta = B[k] x[k::] = apply_q(v, beta, x[k::]) xt = dvec(x[i::]) norm, beta = dhouse(xt) V[i::,i] = np.array(xt) B[i] = beta R[:i,i] = x[:i] R[i,i] = norm Q = compute_q(V, B) return Q, R
def qr_left(A): "Computes a left-looking QR factorization of A with M >= N" import numpy as np from cppsparse import dhouse, dvec m, n = A.shape V = np.zeros((m, n)) B = np.zeros(n) R = np.zeros((m, n)) for i in range(n): x = A[:, i].copy() for k in range(i): v = V[k::, k] beta = B[k] x[k::] = apply_q(v, beta, x[k::]) xt = dvec(x[i::]) norm, beta = dhouse(xt) V[i::, i] = np.array(xt) B[i] = beta R[:i, i] = x[:i] R[i, i] = norm Q = compute_q(V, B) return Q, R
def testUTSolve(self): for m, s in self.data: U = ni.upper_tri_sp(m, m, s) b = ni.vect(ni.np.arange(m, dtype=ni.np.float64)) x = cppsparse.dvec(b) U.utsolve(x) self.verifySolve(U, b, True, x)
def householder(x): from cppsparse import dhouse, dvec import numpy xtemp = dvec(x) norm, beta = dhouse(xtemp) v = numpy.array(xtemp) v.shape = len(x), 1 print(v) return numpy.identity(len(x)) - beta * numpy.dot(v, v.transpose())
def householder(x): from cppsparse import dhouse, dvec import numpy xtemp = dvec(x); norm, beta = dhouse(xtemp) v = numpy.array(xtemp) v.shape = len(x),1 print(v) return numpy.identity(len(x)) - beta * numpy.dot(v, v.transpose())
def vect(n): v = None if n.dtype == np.float64: v = c.dvec() for elem in n: v.push_back(float(elem)) elif n.dtype == np.int32 or n.dtype == np.int64: v = c.ivec() for elem in n: v.push_back(int(elem)) else: raise RuntimeError("Array must be float or integer") return v
def vect(n): v = None if n.dtype == np.float64: v = c.dvec(); for elem in n: v.push_back(float(elem)) elif n.dtype == np.int32 or n.dtype == np.int64: v = c.ivec() for elem in n: v.push_back(int(elem)) else: raise RuntimeError("Array must be float or integer") return v
def verifySolve(self, A, b, trans, xAct): m = A.n_rows() res = cppsparse.dvec(m, 0.0); if trans: normA = A.norm(cppsparse.NORM_INF) A.gatxpy(xAct, res) else: normA = A.norm(cppsparse.NORM_ONE) A.gaxpy(xAct, res) normRes = numpy.linalg.norm(ni.nvec(b) - ni.nvec(res), numpy.inf) self.assertTrue(normRes/(numpy.finfo('double').eps * normA * m) < 100, 'Residual norm = %f'%(normRes/(numpy.finfo('double').eps * normA * m)))
def verifySolve(self, A, b, trans, xAct): m = A.n_rows() res = cppsparse.dvec(m, 0.0) if trans: normA = A.norm(cppsparse.NORM_INF) A.gatxpy(xAct, res) else: normA = A.norm(cppsparse.NORM_ONE) A.gaxpy(xAct, res) normRes = numpy.linalg.norm(ni.nvec(b) - ni.nvec(res), numpy.inf) self.assertTrue( normRes / (numpy.finfo('double').eps * normA * m) < 100, 'Residual norm = %f' % (normRes / (numpy.finfo('double').eps * normA * m)))
def qr_right(a): "Computes a right-looking QR factorization of A with M >= N" import numpy as np from cppsparse import dhouse, dvec m, n = a.shape V = np.zeros((m, n)) B = np.zeros(n) R = a.copy() for i in range(n): x = dvec(R[i::, i]) norm, beta = dhouse(x) x = np.array(x) V[i::, i] = x B[i] = beta x.shape = x.size, 1 R[i::, i::] = R[i::, i::] - beta * np.dot(x, np.dot(x.T, R[i::, i::])) return compute_q(V, B), np.triu(R)
def qr_right(a): "Computes a right-looking QR factorization of A with M >= N" import numpy as np from cppsparse import dhouse, dvec m,n = a.shape V = np.zeros((m, n)) B = np.zeros(n); R = a.copy(); for i in range(n): x = dvec(R[i::, i]); norm, beta = dhouse(x) x = np.array(x) V[i::,i] = x B[i] = beta x.shape = x.size,1 R[i::,i::] = R[i::, i::] - beta * np.dot(x, np.dot(x.T, R[i::, i::])) return compute_q(V, B), np.triu(R)
lower_tri = c.dtrp(5, 5) full_sym = c.dtrp(5, 5) upper_tri = c.dtrp(5, 5) for col in range(5): for row in range(col, 5): lower_tri.push_back(row, col, float(row + col * 5.0)) full_sym.push_back(row, col, float(row + col * 5.0)) upper_tri.push_back(col, row, float(row + col * 5.0)) if row != col: full_sym.push_back(col, row, float(row + col * 5.0)) lower_tri = c.dcsc(lower_tri) upper_tri = c.dcsc(upper_tri) full_sym = c.dcsc(full_sym) x = c.dvec(range(5)) y = c.dvec(5) lower_tri.sym_gaxpy(x, y, c.LOWER_TRIANGULAR) print(nvec(y)) y = c.dvec(5) upper_tri.sym_gaxpy(x, y, c.UPPER_TRIANGULAR) print(nvec(y)) y = c.dvec(5) full_sym.gaxpy(x, y) print(nvec(y))
import cppsparse as c x = c.dtrp("data.txt") print(x) row = c.ivec(5) print(row.size()) col = c.ivec(5) nnz = c.dvec(25) for i in range(5): row[i] = i col[i] = i for i in range(25): nnz[i] = i x.push_back(row, col, nnz) print(x)
import cppsparse as c x = c.dtrp("fem.dat") y = c.dcsc(x) y.sum_duplicates() m = y.n_rows() n = y.n_cols() print m, n cs = c.dvec(n, 2.0) rs = c.dvec(m, 3.0) print(y.find()) y.scale(rs, cs) print(y.find())
import cppsparse as c x = c.dtrp("fem.dat") y = c.dcsc(x) y.sum_duplicates() m = y.n_rows() n = y.n_cols() print m, n cs = c.dvec(n, 2.0) rs = c.dvec(m, 3.0) print (y.find()) y.scale(rs, cs) print (y.find())
upper_tri = c.dtrp(5, 5) for col in range(5): for row in range(col, 5): lower_tri.push_back(row, col, float(row + col * 5.0)) full_sym.push_back (row, col, float(row + col * 5.0)) upper_tri.push_back (col, row, float(row + col * 5.0)) if row != col: full_sym.push_back (col, row, float(row + col * 5.0)) lower_tri = c.dcsc(lower_tri) upper_tri = c.dcsc(upper_tri) full_sym = c.dcsc(full_sym) x = c.dvec(range(5)) y = c.dvec(5) lower_tri.sym_gaxpy(x, y, c.LOWER_TRIANGULAR) print(nvec(y)) y = c.dvec(5) upper_tri.sym_gaxpy(x, y, c.UPPER_TRIANGULAR) print(nvec(y)) y = c.dvec(5) full_sym.gaxpy(x, y) print(nvec(y))