void abuswap(double *m, int *nr, int *nc, int *thin, int *direct) { int row[2], col[2], k, ij[4], changed, ev ; double sm[4]; GetRNGstate(); changed = 0; while (changed < *thin) { /* Select a random 2x2 matrix*/ i2rand(row, *nr - 1); i2rand(col, *nc - 1); ij[0] = INDX(row[0], col[0], *nr); ij[1] = INDX(row[1], col[0], *nr); ij[2] = INDX(row[0], col[1], *nr); ij[3] = INDX(row[1], col[1], *nr); for (k = 0; k < 4; k ++) sm[k] = m[ij[k]]; ev = isDiagSimple(sm); /* Swap */ if (ev == 1) { /* fixed column sums */ if (*direct == 0) { m[ij[0]] = sm[1]; m[ij[1]] = sm[0]; m[ij[2]] = sm[3]; m[ij[3]] = sm[2]; } /* fixed row sums */ else { m[ij[0]] = sm[2]; m[ij[1]] = sm[3]; m[ij[2]] = sm[0]; m[ij[3]] = sm[1]; } changed++; } } PutRNGstate(); }
static void abuswap(double *m, int *nr, int *nc, int *thin, int *direct) { int k, ij[4], changed, ev; size_t intcheck; double sm[4]; /* GetRNGstate in calling C code */ /* GetRNGstate(); */ changed = 0; intcheck = 0; while (changed < *thin) { /* Select a random 2x2 matrix*/ get2x2((*nr) * (*nc) - 1, *nr, ij); for (k = 0; k < 4; k++) sm[k] = m[ij[k]]; ev = isDiagSimple(sm); /* Swap */ if (ev == 1) { /* fixed column sums */ if (*direct == 0) { m[ij[0]] = sm[1]; m[ij[1]] = sm[0]; m[ij[2]] = sm[3]; m[ij[3]] = sm[2]; } /* fixed row sums */ else { m[ij[0]] = sm[2]; m[ij[1]] = sm[3]; m[ij[2]] = sm[0]; m[ij[3]] = sm[1]; } changed++; } if (intcheck % 10000 == 9999) R_CheckUserInterrupt(); intcheck++; } /* PutRNGstate(); */ }