SEXP r_set_stream_seed(SEXP sexp_seed, SEXP sexp_streamCg,SEXP sexp_streamBg, SEXP sexp_streamIg, SEXP sexp_streamAnti,SEXP sexp_streamIncPrec, SEXP sexp_streamName) { SEXP sexp_stream; RngStream stream; unsigned long seed[6]; int i; const char *name; size_t len; stream = (RngStream) malloc (sizeof (struct RngStream_InfoState)); if (stream == NULL) { error("r_set_stream_seed: No more memory\n\n"); } for (i=0; i<6; i++) { stream->Cg[i] = REAL(sexp_streamCg)[i]; stream->Bg[i] = REAL(sexp_streamBg)[i]; stream->Ig[i] = REAL(sexp_streamIg)[i]; } stream->Anti = INTEGER(sexp_streamAnti)[0]; stream->IncPrec = INTEGER(sexp_streamIncPrec)[0]; name = CHAR(STRING_ELT(sexp_streamName,0)); len = strlen(name); stream->name = malloc(len+1); if (stream->name == NULL) { free(stream); error("r_set_stream_seed: No more memory\n\n"); } strncpy(stream->name, name, len+1); for (i = 0; i < 6; ++i) { seed[i]= (unsigned long) REAL (sexp_seed)[i]; } RngStream_SetSeed(stream, (unsigned long *) seed); PROTECT(sexp_stream = allocVector(REALSXP, 20)); for (i = 0; i < 6; ++i) { REAL(sexp_stream)[i] = (double) stream->Cg[i]; REAL(sexp_stream)[i+6] = (double) stream->Bg[i]; REAL(sexp_stream)[i+12] = (double) stream->Ig[i]; } REAL(sexp_stream)[18] = (int) stream->Anti; REAL(sexp_stream)[19] = (int) stream->IncPrec; UNPROTECT(1); free(stream); return sexp_stream; }
JNIEXPORT jboolean JNICALL Java_org_simgrid_msg_RngStream_setSeed(JNIEnv *env, jobject jrngstream, jintArray jseed) { jint buffer[6]; env->GetIntArrayRegion(jseed, 0, 6, buffer); RngStream rngstream = jrngstream_to_native(env, jrngstream); if (!rngstream) return JNI_FALSE; int result = RngStream_SetSeed(rngstream, (unsigned long*)buffer); return result == -1 ? JNI_FALSE : JNI_TRUE; }
// seed MUST be an array of at least 6 numbers, or you will get a segfault ! VALUE rng_set_seed(VALUE self, VALUE seed) { unsigned long seed_arr[6]; int i; for(i=0 ; i<6 ; i++) { seed_arr[i] = NUM2ULONG(rb_ary_entry(seed, i)); } VALUE stream_ptr = rb_iv_get(self, "@stream_prt"); RngStream stream; Data_Get_Struct(stream_ptr, RngStream, stream); int error = RngStream_SetSeed(stream, seed_arr); if(error) { rb_raise(rb_eArgError, "Invalid seed"); } RngStream_ResetStartStream(stream); return self; }
JNIEXPORT jboolean JNICALL Java_org_simgrid_msg_RngStream_setSeed(JNIEnv *env, jobject jrngstream, jintArray jseed) { jint buffer[6]; env->GetIntArrayRegion(jseed, 0, 6, buffer); RngStream rngstream = jrngstream_to_native(env, jrngstream); if (!rngstream) return JNI_FALSE; // The C API expects unsigned long which are wider than int on LP64. // We need to convert: unsigned long seed[6]; for (int i = 0; i != 6; ++i) seed[i] = buffer[i]; int result = RngStream_SetSeed(rngstream, seed); return result == -1 ? JNI_FALSE : JNI_TRUE; }
void set_seed(int seed1, int seed2=0) { unsigned long seeds[6] = { seed1, seed2, seed1, seed2, seed1, seed2 }; RngStream_SetSeed(_stream, seeds); }