| Line 4... |
Line 4... |
| 4 |
{
|
4 |
{
|
| 5 |
int p, j, nz = 0, anz, *Cp, *Ci, *Bp, m, n, bnz, *w, values ;
|
5 |
int p, j, nz = 0, anz, *Cp, *Ci, *Bp, m, n, bnz, *w, values ;
|
| 6 |
double *x, *Bx, *Cx ;
|
6 |
double *x, *Bx, *Cx ;
|
| 7 |
cs *C ;
|
7 |
cs *C ;
|
| 8 |
if (!CS_CSC (A) || !CS_CSC (B)) return (NULL) ; /* check inputs */
|
8 |
if (!CS_CSC (A) || !CS_CSC (B)) return (NULL) ; /* check inputs */
|
| - |
|
9 |
if (A->m != B->m || A->n != B->n) return (NULL) ;
|
| 9 |
m = A->m ; anz = A->p [A->n] ;
|
10 |
m = A->m ; anz = A->p [A->n] ;
|
| 10 |
n = B->n ; Bp = B->p ; Bx = B->x ; bnz = Bp [n] ;
|
11 |
n = B->n ; Bp = B->p ; Bx = B->x ; bnz = Bp [n] ;
|
| 11 |
w = cs_calloc (m, sizeof (int)) ; /* get workspace */
|
12 |
w = cs_calloc (m, sizeof (int)) ; /* get workspace */
|
| 12 |
values = (A->x != NULL) && (Bx != NULL) ;
|
13 |
values = (A->x != NULL) && (Bx != NULL) ;
|
| 13 |
x = values ? cs_malloc (m, sizeof (double)) : NULL ; /* get workspace */
|
14 |
x = values ? cs_malloc (m, sizeof (double)) : NULL ; /* get workspace */
|
| Line 914... |
Line 915... |
| 914 |
x [Vi [p]] -= Vx [p] * tau ;
|
915 |
x [Vi [p]] -= Vx [p] * tau ;
|
| 915 |
}
|
916 |
}
|
| 916 |
return (1) ;
|
917 |
return (1) ;
|
| 917 |
}
|
918 |
}
|
| 918 |
/* create a Householder reflection [v,beta,s]=house(x), overwrite x with v,
|
919 |
/* create a Householder reflection [v,beta,s]=house(x), overwrite x with v,
|
| 919 |
* where (I-beta*v*v')*x = s*x. See Algo 5.1.1, Golub & Van Loan, 3rd ed. */
|
920 |
* where (I-beta*v*v')*x = s*e1. See Algo 5.1.1, Golub & Van Loan, 3rd ed. */
|
| 920 |
double cs_house (double *x, double *beta, int n)
|
921 |
double cs_house (double *x, double *beta, int n)
|
| 921 |
{
|
922 |
{
|
| 922 |
double s, sigma = 0 ;
|
923 |
double s, sigma = 0 ;
|
| 923 |
int i ;
|
924 |
int i ;
|
| 924 |
if (!x || !beta) return (-1) ; /* check inputs */
|
925 |
if (!x || !beta) return (-1) ; /* check inputs */
|
| Line 1254... |
Line 1255... |
| 1254 |
{
|
1255 |
{
|
| 1255 |
int p, j, nz = 0, anz, *Cp, *Ci, *Bp, m, n, bnz, *w, values, *Bi ;
|
1256 |
int p, j, nz = 0, anz, *Cp, *Ci, *Bp, m, n, bnz, *w, values, *Bi ;
|
| 1256 |
double *x, *Bx, *Cx ;
|
1257 |
double *x, *Bx, *Cx ;
|
| 1257 |
cs *C ;
|
1258 |
cs *C ;
|
| 1258 |
if (!CS_CSC (A) || !CS_CSC (B)) return (NULL) ; /* check inputs */
|
1259 |
if (!CS_CSC (A) || !CS_CSC (B)) return (NULL) ; /* check inputs */
|
| - |
|
1260 |
if (A->n != B->m) return (NULL) ;
|
| 1259 |
m = A->m ; anz = A->p [A->n] ;
|
1261 |
m = A->m ; anz = A->p [A->n] ;
|
| 1260 |
n = B->n ; Bp = B->p ; Bi = B->i ; Bx = B->x ; bnz = Bp [n] ;
|
1262 |
n = B->n ; Bp = B->p ; Bi = B->i ; Bx = B->x ; bnz = Bp [n] ;
|
| 1261 |
w = cs_calloc (m, sizeof (int)) ; /* get workspace */
|
1263 |
w = cs_calloc (m, sizeof (int)) ; /* get workspace */
|
| 1262 |
values = (A->x != NULL) && (Bx != NULL) ;
|
1264 |
values = (A->x != NULL) && (Bx != NULL) ;
|
| 1263 |
x = values ? cs_malloc (m, sizeof (double)) : NULL ; /* get workspace */
|
1265 |
x = values ? cs_malloc (m, sizeof (double)) : NULL ; /* get workspace */
|
| Line 1397... |
Line 1399... |
| 1397 |
return (1) ;
|
1399 |
return (1) ;
|
| 1398 |
}
|
1400 |
}
|
| 1399 |
/* sparse QR factorization [V,beta,pinv,R] = qr (A) */
|
1401 |
/* sparse QR factorization [V,beta,pinv,R] = qr (A) */
|
| 1400 |
csn *cs_qr (const cs *A, const css *S)
|
1402 |
csn *cs_qr (const cs *A, const css *S)
|
| 1401 |
{
|
1403 |
{
|
| 1402 |
double *Rx, *Vx, *Ax, *Beta, *x ;
|
1404 |
double *Rx, *Vx, *Ax, *x, *Beta ;
|
| 1403 |
int i, k, p, m, n, vnz, p1, top, m2, len, col, rnz, *s, *leftmost, *Ap, *Ai,
|
1405 |
int i, k, p, m, n, vnz, p1, top, m2, len, col, rnz, *s, *leftmost, *Ap, *Ai,
|
| 1404 |
*parent, *Rp, *Ri, *Vp, *Vi, *w, *pinv, *q ;
|
1406 |
*parent, *Rp, *Ri, *Vp, *Vi, *w, *pinv, *q ;
|
| 1405 |
cs *R, *V ;
|
1407 |
cs *R, *V ;
|
| 1406 |
csn *N ;
|
1408 |
csn *N ;
|
| 1407 |
if (!CS_CSC (A) || !S) return (NULL) ;
|
1409 |
if (!CS_CSC (A) || !S) return (NULL) ;
|
| Line 1845... |
Line 1847... |
| 1845 |
return (cs_done (C, w, NULL, 1)) ; /* success; free w and return C */
|
1847 |
return (cs_done (C, w, NULL, 1)) ; /* success; free w and return C */
|
| 1846 |
}
|
1848 |
}
|
| 1847 |
/* sparse Cholesky update/downdate, L*L' + sigma*w*w' (sigma = +1 or -1) */
|
1849 |
/* sparse Cholesky update/downdate, L*L' + sigma*w*w' (sigma = +1 or -1) */
|
| 1848 |
int cs_updown (cs *L, int sigma, const cs *C, const int *parent)
|
1850 |
int cs_updown (cs *L, int sigma, const cs *C, const int *parent)
|
| 1849 |
{
|
1851 |
{
|
| 1850 |
int p, f, j, *Lp, *Li, *Cp, *Ci ;
|
1852 |
int n, p, f, j, *Lp, *Li, *Cp, *Ci ;
|
| 1851 |
double *Lx, *Cx, alpha, beta = 1, delta, gamma, w1, w2, *w, n, beta2 = 1 ;
|
1853 |
double *Lx, *Cx, alpha, beta = 1, delta, gamma, w1, w2, *w, beta2 = 1 ;
|
| 1852 |
if (!CS_CSC (L) || !CS_CSC (C) || !parent) return (0) ; /* check inputs */
|
1854 |
if (!CS_CSC (L) || !CS_CSC (C) || !parent) return (0) ; /* check inputs */
|
| 1853 |
Lp = L->p ; Li = L->i ; Lx = L->x ; n = L->n ;
|
1855 |
Lp = L->p ; Li = L->i ; Lx = L->x ; n = L->n ;
|
| 1854 |
Cp = C->p ; Ci = C->i ; Cx = C->x ;
|
1856 |
Cp = C->p ; Ci = C->i ; Cx = C->x ;
|
| 1855 |
if ((p = Cp [0]) >= Cp [1]) return (1) ; /* return if C empty */
|
1857 |
if ((p = Cp [0]) >= Cp [1]) return (1) ; /* return if C empty */
|
| 1856 |
w = cs_malloc (n, sizeof (double)) ; /* get workspace */
|
1858 |
w = cs_malloc (n, sizeof (double)) ; /* get workspace */
|