129 *valid_spv[] = { sparseVECTOR,
138 int ctype_x = R_check_class_etc(x, valid_cM),
139 ctype_v = R_check_class_etc(value, valid_spv);
141 Rf_error(
_(
"invalid class of 'x' in Csparse_subassign()"));
143 Rf_error(
_(
"invalid class of 'value' in Csparse_subassign()"));
144 Rboolean value_is_nsp = ctype_v == 1;
146 if(!value_is_nsp) value_is_nsp = (ctype_v == 0);
152 i_cp = PROTECT(Rf_coerceVector(i_, INTSXP)),
153 j_cp = PROTECT(Rf_coerceVector(j_, INTSXP));
156 int *dims = INTEGER(dimslot),
158 *i = INTEGER(i_cp), len_i = LENGTH(i_cp),
159 *j = INTEGER(j_cp), len_j = LENGTH(j_cp),
161 nnz_x = LENGTH(islot);
164#define MATRIX_SUBASSIGN_VERBOSE
166#ifdef MATRIX_SUBASSIGN_VERBOSE
167 Rboolean verbose = i[0] < 0;
170 REprintf(
"Csparse_subassign() x[i,j] <- val; x is \"%s\"; value \"%s\" is_nsp=%d\n",
171 valid_cM[ctype_x], valid_spv[ctype_v], (
int)value_is_nsp);
175 SEXP val_i_slot, val_x_slot;
177 double *val_i = REAL(val_i_slot);
179 Type_x *val_x = NULL;
186 Rf_warning(
_(
"x[] <- val: val is coerced to logical for \"%s\" x"),
191 Rf_error(
_(
"x[] <- val: val should be integer or logical, is coerced to integer, for \"%s\" x"),
198 Rf_error(
_(
"programming error in Csparse_subassign() should never happen"));
202 val_x = STYP_x(val_x_slot);
213 ans = PROTECT(
newObject(valid_cM[ctype_x]));
220 int *rp = INTEGER(r_pslot),
221 *ri = R_Calloc(nnz_x,
int);
222 Memcpy(ri, INTEGER(islot), nnz_x);
223 Type_x_0_init(z_ans);
224 Type_x_1_init(one_ans);
226 Type_x *rx = R_Calloc(nnz_x, Type_x);
236 for(jj = 0, ii_val=0; jj < len_j; jj++) {
239 R_CheckUserInterrupt();
240 for(
int ii = 0; ii < len_i; ii++, ii_val++) {
241 int i__ = i[ii], p1, p2;
242 if(nnz_val && ii_val >= len_val) {
253 Rboolean have_entry = FALSE;
257 p1 = rp[j__], p2 = rp[j__ + 1];
261 if(j_val < nnz_val) {
263 if(ii_v1 < val_i[j_val]) {
265 }
else if(ii_v1 == val_i[j_val]) {
266 v = (value_is_nsp) ? one_ans : val_x[j_val];
269 REprintf(
"programming thinko in Csparse_subassign(*, i=%d,j=%d): ii_v=%lld, v@i[j_val=%d]=%g\n",
270 i__,j__, (
long long)ii_v1, j_val, val_i[j_val]);
276 for(ind = p1; ind < p2; ind++) {
284#ifdef MATRIX_SUBASSIGN_VERBOSE
286 REprintf(
"have entry x[%d, %d] = %g\n", i__, j__,
295#ifdef MATRIX_SUBASSIGN_VERBOSE
297 REprintf(
"@i > i__ = %d --> ind-- = %d\n", i__, ind);
308 if(M_ij.r != v.r || M_ij.i != v.i) {
313#ifdef MATRIX_SUBASSIGN_VERBOSE
315 REprintf(
"setting x[%d, %d] <- %g", i__,j__,
334#ifdef MATRIX_SUBASSIGN_VERBOSE
336 REprintf(
" rm ind=%d\n", ind);
340 for(k=ind; k < nnz; k++) {
346 for(k=j__ + 1; k <= ncol; k++) {
354#ifdef MATRIX_SUBASSIGN_VERBOSE
356 REprintf(
" repl. ind=%d\n", ind);
366#ifdef MATRIX_SUBASSIGN_VERBOSE
367 if(verbose) REprintf(
" R_Realloc()ing: nnz_x=%d", nnz_x);
371 nnz_x += (1 + nnz_val / 4);
372#ifdef MATRIX_SUBASSIGN_VERBOSE
373 if(verbose) REprintf(
"(nnz_v=%d) --> %d ", nnz_val, nnz_x);
376 ri = R_Realloc(ri, (
size_t) nnz_x,
int);
378 rx = R_Realloc(rx, (
size_t) nnz_x, Type_x);
384#ifdef MATRIX_SUBASSIGN_VERBOSE
386 REprintf(
" INSERT p12=(%d,%d) -> ind=%d -> i1 = %d\n",
391 for(
int l = nnz-1; l >= i1; l--) {
403 for(k=j__ + 1; k <= ncol; k++)
407#ifdef MATRIX_SUBASSIGN_VERBOSE
408 else if(verbose) REprintf(
"M_ij == v = %g\n",
423 PROTECT(islot = Rf_allocVector(INTSXP, nnz));
424 Memcpy(INTEGER(islot), ri, nnz);
428 PROTECT(islot = Rf_allocVector(SXP_x, nnz));
429 Memcpy(STYP_x(islot), rx, nnz);