Skip to content
Snippets Groups Projects
Commit 4498d654 authored by Florian Angerer's avatar Florian Angerer
Browse files

Using active binding for '.Random.seed'.

parent 19860151
No related branches found
No related tags found
No related merge requests found
......@@ -629,6 +629,7 @@ public class BasePackage extends RBuiltinPackage {
add(Rank.class, RankNodeGen::create);
add(RNGFunctions.RNGkind.class, RNGFunctionsFactory.RNGkindNodeGen::create);
add(RNGFunctions.SetSeed.class, RNGFunctionsFactory.SetSeedNodeGen::create);
add(RNGFunctions.FastRSetSeed.class, RNGFunctionsFactory.FastRSetSeedNodeGen::create);
add(RVersion.class, RVersionNodeGen::create);
add(RawFunctions.CharToRaw.class, RawFunctionsFactory.CharToRawNodeGen::create);
add(RawFunctions.RawToChar.class, RawFunctionsFactory.RawToCharNodeGen::create);
......
......@@ -27,3 +27,5 @@ eval(expression({
}
})
}), asNamespace("base"))
makeActiveBinding(".Random.seed", .fastr.set.seed, .GlobalEnv)
......@@ -33,15 +33,22 @@ import static com.oracle.truffle.r.runtime.RError.Message.UNIMPLEMENTED_TYPE_IN_
import static com.oracle.truffle.r.runtime.RVisibility.OFF;
import static com.oracle.truffle.r.runtime.builtins.RBehavior.MODIFIES_STATE;
import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.r.nodes.builtin.NodeWithArgumentCasts.Casts;
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
import com.oracle.truffle.r.runtime.RError;
import com.oracle.truffle.r.runtime.RError.Message;
import com.oracle.truffle.r.runtime.builtins.RBuiltin;
import com.oracle.truffle.r.runtime.builtins.RBuiltinKind;
import com.oracle.truffle.r.runtime.context.RContext;
import com.oracle.truffle.r.runtime.data.RDataFactory;
import com.oracle.truffle.r.runtime.data.RIntVector;
import com.oracle.truffle.r.runtime.data.RMissing;
import com.oracle.truffle.r.runtime.data.RNull;
import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
import com.oracle.truffle.r.runtime.rng.RRNG;
public class RNGFunctions {
......@@ -97,6 +104,43 @@ public class RNGFunctions {
}
}
@RBuiltin(name = ".fastr.set.seed", visibility = OFF, kind = PRIMITIVE, parameterNames = {"data"}, behavior = MODIFIES_STATE)
public abstract static class FastRSetSeed extends RBuiltinNode.Arg1 {
static {
Casts.noCasts(FastRSetSeed.class);
}
@Specialization
@TruffleBoundary
protected RNull setSeed(int[] data) {
RContext.getInstance().stateRNG.currentSeeds = data;
return RNull.instance;
}
@Specialization
@TruffleBoundary
protected RNull setSeed(RAbstractIntVector data) {
int[] arr = new int[data.getLength()];
for (int i = 0; i < arr.length; i++) {
arr[i] = data.getDataAt(i);
}
RContext.getInstance().stateRNG.currentSeeds = arr;
return RNull.instance;
}
@Specialization
@TruffleBoundary
protected Object getSeed(@SuppressWarnings("unused") RMissing data) {
int[] seeds = RContext.getInstance().stateRNG.currentSeeds;
if (seeds != null) {
return RDataFactory.createIntVector(seeds, RDataFactory.INCOMPLETE_VECTOR);
}
// throw error(RError.Message.UNKNOWN_OBJECT, ".Random.seed");
return RNull.instance;
}
}
private static final class CastsHelper {
public static void kindInteger(Casts casts, String name, Message error, Object... messageArgs) {
casts.arg(name).mapNull(constant(RRNG.NO_KIND_CHANGE)).mustBe(numericValue(), error, messageArgs).asIntegerVector().findFirst();
......
......@@ -17,6 +17,7 @@ import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.r.runtime.RError;
import com.oracle.truffle.r.runtime.RRuntime;
import com.oracle.truffle.r.runtime.RType;
import com.oracle.truffle.r.runtime.context.RContext;
import com.oracle.truffle.r.runtime.data.RDataFactory;
import com.oracle.truffle.r.runtime.data.RIntVector;
......@@ -25,6 +26,7 @@ import com.oracle.truffle.r.runtime.data.RNull;
import com.oracle.truffle.r.runtime.data.RPromise;
import com.oracle.truffle.r.runtime.data.RTypedValue;
import com.oracle.truffle.r.runtime.env.REnvironment;
import com.oracle.truffle.r.runtime.env.frame.ActiveBinding;
import com.oracle.truffle.r.runtime.ffi.BaseRFFI;
import com.oracle.truffle.r.runtime.rng.mm.MarsagliaMulticarry;
import com.oracle.truffle.r.runtime.rng.mt.MersenneTwister;
......@@ -107,6 +109,7 @@ public class RRNG {
private RandomNumberGenerator currentGenerator;
private final RandomNumberGenerator[] allGenerators;
private NormKind currentNormKind;
public int[] currentSeeds;
private ContextStateImpl() {
this.currentNormKind = DEFAULT_NORM_KIND;
......@@ -282,11 +285,7 @@ public class RRNG {
@TruffleBoundary
private static Object getDotRandomSeed() {
Object seed = REnvironment.globalEnv().get(RANDOM_SEED);
if (seed instanceof RPromise) {
seed = RContext.getRRuntimeASTAccess().forcePromise(RANDOM_SEED, seed);
}
return seed;
return RContext.getInstance().stateRNG.currentSeeds;
}
/**
......@@ -327,6 +326,9 @@ public class RRNG {
} else if (seeds instanceof RIntVector) {
RIntVector seedsVec = (RIntVector) seeds;
tmp = seedsVec.getLength() == 0 ? RRuntime.INT_NA : seedsVec.getDataAt(0);
} else if (seeds instanceof int[]) {
int[] seedsArr = (int[]) seeds;
tmp = seedsArr.length == 0 ? RRuntime.INT_NA : seedsArr[0];
} else {
assert seeds != RMissing.instance;
assert seeds instanceof RTypedValue;
......@@ -410,7 +412,8 @@ public class RRNG {
public static void putRNGState() {
int[] seeds = currentGenerator().getSeeds();
seeds[0] = currentKind().ordinal() + 100 * currentNormKind().ordinal();
RIntVector vector = RDataFactory.createIntVector(seeds, RDataFactory.INCOMPLETE_VECTOR);
REnvironment.globalEnv().safePut(RANDOM_SEED, vector.makeSharedPermanent());
RContext.getInstance().stateRNG.currentSeeds = seeds;
// RIntVector vector = RDataFactory.createIntVector(seeds, RDataFactory.INCOMPLETE_VECTOR);
// REnvironment.globalEnv().safePut(RANDOM_SEED, vector.makeSharedPermanent());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment