SCM

SCM Repository

[matrix] Diff of /pkg/Matrix/src/Csparse.c
ViewVC logotype

Diff of /pkg/Matrix/src/Csparse.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2673, Fri May 20 16:19:18 2011 UTC revision 2731, Mon Oct 17 18:07:09 2011 UTC
# Line 1  Line 1 
1                          /* Sparse matrices in compressed column-oriented form */                          /* Sparse matrices in compressed column-oriented form */
2    
3  #include "Csparse.h"  #include "Csparse.h"
4  #include "Tsparse.h"  #include "Tsparse.h"
5  #include "chm_common.h"  #include "chm_common.h"
# Line 600  Line 601 
601      if (csize >= 0 && !isInteger(j))      if (csize >= 0 && !isInteger(j))
602          error(_("Index j must be NULL or integer"));          error(_("Index j must be NULL or integer"));
603    
604      if (chx->stype) /* symmetricMatrix */      if (!chx->stype) {/* non-symmetric Matrix */
         /* for now, cholmod_submatrix() only accepts "generalMatrix" */  
         chx = cholmod_copy(chx, /* stype: */ 0, chx->xtype, &c);  
   
605      return chm_sparse_to_SEXP(cholmod_submatrix(chx,      return chm_sparse_to_SEXP(cholmod_submatrix(chx,
606                                  (rsize < 0) ? NULL : INTEGER(i), rsize,                                  (rsize < 0) ? NULL : INTEGER(i), rsize,
607                                  (csize < 0) ? NULL : INTEGER(j), csize,                                  (csize < 0) ? NULL : INTEGER(j), csize,
# Line 611  Line 609 
609                                1, 0, Rkind, "",                                1, 0, Rkind, "",
610                                /* FIXME: drops dimnames */ R_NilValue);                                /* FIXME: drops dimnames */ R_NilValue);
611  }  }
612                                    /* for now, cholmod_submatrix() only accepts "generalMatrix" */
613        CHM_SP tmp = cholmod_copy(chx, /* stype: */ 0, chx->xtype, &c);
614        CHM_SP ans = cholmod_submatrix(tmp,
615                                       (rsize < 0) ? NULL : INTEGER(i), rsize,
616                                       (csize < 0) ? NULL : INTEGER(j), csize,
617                                       TRUE, TRUE, &c);
618        cholmod_free_sparse(&tmp, &c);
619        return chm_sparse_to_SEXP(ans, 1, 0, Rkind, "", R_NilValue);
620    }
621    
622  /**  #define _d_Csp_
623   * Subassignment:  x[i,j]  <- value  #include "t_Csparse_subassign.c"
  *  
  * @param x  
  * @param i_ integer row    index 0-origin vector (as returned from R .ind.prep2())  
  * @param j_ integer column index 0-origin vector  
  * @param value currently must be a dsparseVector {which is recycled if needed}  
  *  
  * @return a Csparse matrix like x, but with the values replaced  
  */  
 SEXP Csparse_subassign(SEXP x, SEXP i_, SEXP j_, SEXP value)  
 {  
     static const char  
         *valid_cM [] = {"dgCMatrix",// the only one, for "the moment", more later  
                         ""},  
         *valid_spv[] = {"dsparseVector",  
                         ""};  
   
     int ctype = Matrix_check_class_etc(x, valid_cM);  
     if (ctype < 0)  
         error(_("invalid class of 'x' in Csparse_subassign()"));  
     // value: assume a  "dsparseVector" for now -- slots: (i, length, x)  
     ctype = Matrix_check_class_etc(value, valid_spv);  
     if (ctype < 0)  
         error(_("invalid class of 'value' in Csparse_subassign()"));  
   
     SEXP ans,  
         pslot = GET_SLOT(x, Matrix_pSym),  
         islot = GET_SLOT(x, Matrix_iSym),  
         i_cp = PROTECT((TYPEOF(i_) == INTSXP) ?  
                        duplicate(i_) : coerceVector(i_, INTSXP)),  
         j_cp = PROTECT((TYPEOF(j_) == INTSXP) ?  
                        duplicate(j_) : coerceVector(j_, INTSXP)),  
         // for d.CMatrix and l.CMatrix  but not n.CMatrix:  
         xslot = GET_SLOT(x, Matrix_xSym);  
   
     int *dims = INTEGER(GET_SLOT(x, Matrix_DimSym)),  
         nrow = dims[0],  
         ncol = dims[1],  
         *xp = INTEGER(pslot),  
         *xi = INTEGER(islot),  
         *ii = INTEGER(i_cp), len_i = LENGTH(i_cp),  
         *jj = INTEGER(j_cp), len_j = LENGTH(j_cp),  
         i, j, k;  
     int    *val_i = INTEGER(GET_SLOT(value, Matrix_iSym));  
     // for dsparseVector only:  
     double *val_x =   REAL (GET_SLOT(value, Matrix_xSym));  
     int len_val = asInteger(GET_SLOT(value, Matrix_lengthSym));  
     int p_last = xp[0];  
   
     // for d.CMatrix only:  
     double *xx = REAL(xslot);  
     double ind; // the index that goes all the way from 1:(len_i * len_j)  
   
     PROTECT(ans = duplicate(x));  
     for(j = 0; j < ncol; j++) {  
 // FIXME  
 // ....  
 // ....  
 // ....  
 // ....  
   
624    
625    #define _l_Csp_
626    #include "t_Csparse_subassign.c"
627    
628    #define _i_Csp_
629    #include "t_Csparse_subassign.c"
630    
631    #define _n_Csp_
632    #include "t_Csparse_subassign.c"
633    
634    #define _z_Csp_
635    #include "t_Csparse_subassign.c"
636    
637    
 // ....  
 // ....  
 // ....  
 // ....  
 // ....  
     }  
     UNPROTECT(3);  
     return ans;  
 }  
638    
639  SEXP Csparse_MatrixMarket(SEXP x, SEXP fname)  SEXP Csparse_MatrixMarket(SEXP x, SEXP fname)
640  {  {

Legend:
Removed from v.2673  
changed lines
  Added in v.2731

root@r-forge.r-project.org
ViewVC Help
Powered by ViewVC 1.0.0  
Thanks to:
Vienna University of Economics and Business Powered By FusionForge