7 |
/* NB: we do *NOT* check a potential 'x' slot here, at all */ |
/* NB: we do *NOT* check a potential 'x' slot here, at all */ |
8 |
SEXP pslot = GET_SLOT(x, Matrix_pSym), |
SEXP pslot = GET_SLOT(x, Matrix_pSym), |
9 |
islot = GET_SLOT(x, Matrix_iSym); |
islot = GET_SLOT(x, Matrix_iSym); |
10 |
int j, k, ncol, nrow, sorted, |
int j, k, sorted, |
11 |
*dims = INTEGER(GET_SLOT(x, Matrix_DimSym)), |
*dims = INTEGER(GET_SLOT(x, Matrix_DimSym)), |
12 |
|
nrow = dims[0], |
13 |
|
ncol = dims[1], |
14 |
*xp = INTEGER(pslot), |
*xp = INTEGER(pslot), |
15 |
*xi = INTEGER(islot); |
*xi = INTEGER(islot); |
16 |
|
|
|
nrow = dims[0]; |
|
|
ncol = dims[1]; |
|
17 |
if (length(pslot) != dims[1] + 1) |
if (length(pslot) != dims[1] + 1) |
18 |
return mkString(_("slot p must have length = ncol(.) + 1")); |
return mkString(_("slot p must have length = ncol(.) + 1")); |
19 |
if (xp[0] != 0) |
if (xp[0] != 0) |
46 |
cholmod_dense *chxd = cholmod_sparse_to_dense(chxs, &c); |
cholmod_dense *chxd = cholmod_sparse_to_dense(chxs, &c); |
47 |
|
|
48 |
Free(chxs); |
Free(chxs); |
49 |
return chm_dense_to_SEXP(chxd, 1, Real_kind(x)); |
return chm_dense_to_SEXP(chxd, 1, Real_kind(x), |
50 |
|
GET_SLOT(x, Matrix_DimNamesSym)); |
51 |
} |
} |
52 |
|
|
53 |
SEXP Csparse_to_nz_pattern(SEXP x, SEXP tri) |
SEXP Csparse_to_nz_pattern(SEXP x, SEXP tri) |
144 |
|
|
145 |
SEXP Csparse_Csparse_prod(SEXP a, SEXP b) |
SEXP Csparse_Csparse_prod(SEXP a, SEXP b) |
146 |
{ |
{ |
147 |
cholmod_sparse *cha = as_cholmod_sparse(a), |
cholmod_sparse |
148 |
|
*cha = as_cholmod_sparse(a), |
149 |
*chb = as_cholmod_sparse(b); |
*chb = as_cholmod_sparse(b); |
150 |
cholmod_sparse *chc = cholmod_ssmult(cha, chb, 0, cha->xtype, 1, &c); |
cholmod_sparse *chc = cholmod_ssmult(cha, chb, 0, cha->xtype, 1, &c); |
151 |
SEXP dn = allocVector(VECSXP, 2); |
SEXP dn = allocVector(VECSXP, 2); |
158 |
return chm_sparse_to_SEXP(chc, 1, 0, 0, "", dn); |
return chm_sparse_to_SEXP(chc, 1, 0, 0, "", dn); |
159 |
} |
} |
160 |
|
|
161 |
SEXP Csparse_Csparse_crossprod(SEXP a, SEXP b) |
SEXP Csparse_Csparse_crossprod(SEXP a, SEXP b, SEXP trans) |
162 |
{ |
{ |
163 |
cholmod_sparse *cha = as_cholmod_sparse(a), |
int tr = asLogical(trans); |
164 |
|
cholmod_sparse |
165 |
|
*cha = as_cholmod_sparse(a), |
166 |
*chb = as_cholmod_sparse(b); |
*chb = as_cholmod_sparse(b); |
167 |
cholmod_sparse *chta = cholmod_transpose(cha, 1, &c); |
cholmod_sparse *chTr, *chc; |
|
cholmod_sparse *chc = cholmod_ssmult(chta, chb, 0, cha->xtype, 1, &c); |
|
168 |
SEXP dn = allocVector(VECSXP, 2); |
SEXP dn = allocVector(VECSXP, 2); |
169 |
|
|
170 |
Free(cha); Free(chb); cholmod_free_sparse(&chta, &c); |
/* cholmod_sparse *chTr = cholmod_transpose(cha, 1, &c); */ |
171 |
|
/* cholmod_sparse *chc = cholmod_ssmult(chTr, chb, 0, cha->xtype, 1, &c); */ |
172 |
|
|
173 |
|
if (tr) |
174 |
|
chTr = cholmod_transpose(chb, chb->xtype, &c); |
175 |
|
else |
176 |
|
chTr = cholmod_transpose(cha, cha->xtype, &c); |
177 |
|
chc = cholmod_ssmult((tr) ? cha : chTr, (tr) ? chTr : chb, |
178 |
|
0, cha->xtype, 1, &c); |
179 |
|
|
180 |
|
Free(cha); Free(chb); cholmod_free_sparse(&chTr, &c); |
181 |
|
|
182 |
SET_VECTOR_ELT(dn, 0, /* establish dimnames */ |
SET_VECTOR_ELT(dn, 0, /* establish dimnames */ |
183 |
duplicate(VECTOR_ELT(GET_SLOT(a, Matrix_DimNamesSym), 1))); |
duplicate(VECTOR_ELT(GET_SLOT(a, Matrix_DimNamesSym), (tr) ? 0 : 1))); |
184 |
SET_VECTOR_ELT(dn, 1, |
SET_VECTOR_ELT(dn, 1, |
185 |
duplicate(VECTOR_ELT(GET_SLOT(b, Matrix_DimNamesSym), 1))); |
duplicate(VECTOR_ELT(GET_SLOT(b, Matrix_DimNamesSym), (tr) ? 0 : 1))); |
186 |
return chm_sparse_to_SEXP(chc, 1, 0, 0, "", dn); |
return chm_sparse_to_SEXP(chc, 1, 0, 0, "", dn); |
187 |
} |
} |
188 |
|
|
189 |
SEXP Csparse_dense_prod(SEXP a, SEXP b) |
SEXP Csparse_dense_prod(SEXP a, SEXP b) |
190 |
{ |
{ |
191 |
cholmod_sparse *cha = as_cholmod_sparse(a); |
cholmod_sparse *cha = as_cholmod_sparse(a); |
192 |
cholmod_dense *chb = as_cholmod_dense(PROTECT(mMatrix_as_dgeMatrix(b))); |
SEXP b_M = PROTECT(mMatrix_as_dgeMatrix(b)); |
193 |
|
cholmod_dense *chb = as_cholmod_dense(b_M); |
194 |
cholmod_dense *chc = |
cholmod_dense *chc = |
195 |
cholmod_allocate_dense(cha->nrow, chb->ncol, cha->nrow, chb->xtype, &c); |
cholmod_allocate_dense(cha->nrow, chb->ncol, cha->nrow, chb->xtype, &c); |
196 |
|
SEXP dn = allocVector(VECSXP, 2); |
197 |
double alpha[] = {1,0}, beta[] = {0,0}; |
double alpha[] = {1,0}, beta[] = {0,0}; |
198 |
|
|
199 |
cholmod_sdmult(cha, 0, alpha, beta, chb, chc, &c); |
cholmod_sdmult(cha, 0, alpha, beta, chb, chc, &c); |
200 |
Free(cha); Free(chb); |
Free(cha); Free(chb); |
201 |
UNPROTECT(1); |
UNPROTECT(1); |
202 |
return chm_dense_to_SEXP(chc, 1, 0); |
SET_VECTOR_ELT(dn, 0, /* establish dimnames */ |
203 |
|
duplicate(VECTOR_ELT(GET_SLOT(a, Matrix_DimNamesSym), 0))); |
204 |
|
SET_VECTOR_ELT(dn, 1, |
205 |
|
duplicate(VECTOR_ELT(GET_SLOT(b_M, Matrix_DimNamesSym), 1))); |
206 |
|
return chm_dense_to_SEXP(chc, 1, 0, dn); |
207 |
} |
} |
208 |
|
|
209 |
SEXP Csparse_dense_crossprod(SEXP a, SEXP b) |
SEXP Csparse_dense_crossprod(SEXP a, SEXP b) |
210 |
{ |
{ |
211 |
cholmod_sparse *cha = as_cholmod_sparse(a); |
cholmod_sparse *cha = as_cholmod_sparse(a); |
212 |
cholmod_dense *chb = as_cholmod_dense(PROTECT(mMatrix_as_dgeMatrix(b))); |
SEXP b_M = PROTECT(mMatrix_as_dgeMatrix(b)); |
213 |
|
cholmod_dense *chb = as_cholmod_dense(b_M); |
214 |
cholmod_dense *chc = |
cholmod_dense *chc = |
215 |
cholmod_allocate_dense(cha->ncol, chb->ncol, cha->ncol, chb->xtype, &c); |
cholmod_allocate_dense(cha->ncol, chb->ncol, cha->ncol, chb->xtype, &c); |
216 |
|
SEXP dn = allocVector(VECSXP, 2); |
217 |
double alpha[] = {1,0}, beta[] = {0,0}; |
double alpha[] = {1,0}, beta[] = {0,0}; |
218 |
|
|
219 |
cholmod_sdmult(cha, 1, alpha, beta, chb, chc, &c); |
cholmod_sdmult(cha, 1, alpha, beta, chb, chc, &c); |
220 |
Free(cha); Free(chb); |
Free(cha); Free(chb); |
221 |
UNPROTECT(1); |
UNPROTECT(1); |
222 |
return chm_dense_to_SEXP(chc, 1, 0); |
SET_VECTOR_ELT(dn, 0, /* establish dimnames */ |
223 |
|
duplicate(VECTOR_ELT(GET_SLOT(a, Matrix_DimNamesSym), 1))); |
224 |
|
SET_VECTOR_ELT(dn, 1, |
225 |
|
duplicate(VECTOR_ELT(GET_SLOT(b_M, Matrix_DimNamesSym), 1))); |
226 |
|
return chm_dense_to_SEXP(chc, 1, 0, dn); |
227 |
} |
} |
228 |
|
|
229 |
|
/* Computes x'x or x x' -- see Csparse_Csparse_crossprod above for x'y and x y' */ |
230 |
SEXP Csparse_crossprod(SEXP x, SEXP trans, SEXP triplet) |
SEXP Csparse_crossprod(SEXP x, SEXP trans, SEXP triplet) |
231 |
{ |
{ |
232 |
int trip = asLogical(triplet), |
int trip = asLogical(triplet), |
255 |
/* create dimnames */ |
/* create dimnames */ |
256 |
SET_VECTOR_ELT(dn, 0, |
SET_VECTOR_ELT(dn, 0, |
257 |
duplicate(VECTOR_ELT(GET_SLOT(x, Matrix_DimNamesSym), |
duplicate(VECTOR_ELT(GET_SLOT(x, Matrix_DimNamesSym), |
258 |
(tr) ? 1 : 0))); |
(tr) ? 0 : 1))); |
259 |
SET_VECTOR_ELT(dn, 1, duplicate(VECTOR_ELT(dn, 0))); |
SET_VECTOR_ELT(dn, 1, duplicate(VECTOR_ELT(dn, 0))); |
260 |
UNPROTECT(1); |
UNPROTECT(1); |
261 |
return chm_sparse_to_SEXP(chcp, 1, 0, 0, "", dn); |
return chm_sparse_to_SEXP(chcp, 1, 0, 0, "", dn); |