@Override public DoubleTensor sample(long[] shape, KeanuRandom random) { final DoubleTensor gammaSample = random.nextGamma(shape, beta.reciprocal(), alpha); return gammaSample.reciprocal(); }
@Override public DoubleTensor sample(long[] shape, KeanuRandom random) { return random.nextGamma(shape, DoubleTensor.TWO_SCALAR, k.toDouble().div(2)); }
@Test public void canSampleGammaScalar() { assertEquals(0, random.nextGamma(new long[0], DoubleTensor.scalar(2), DoubleTensor.scalar(2)).getRank()); assertEquals(1, random.nextGamma(new long[]{1}, DoubleTensor.scalar(2), DoubleTensor.scalar(2)).getRank()); assertEquals(2, random.nextGamma(new long[]{1, 1}, DoubleTensor.scalar(2), DoubleTensor.scalar(2)).getRank()); assertEquals(2, random.nextGamma(new long[]{2, 3}, DoubleTensor.scalar(2), DoubleTensor.scalar(2)).getRank()); }
@Override public DoubleTensor sample(long[] shape, KeanuRandom random) { Preconditions.checkArgument(alpha.greaterThan(0.).allTrue() && beta.greaterThan(0.).allTrue(), "alpha and beta must be positive. alpha: " + alpha + " beta: " + beta); final DoubleTensor y1 = random.nextGamma(shape, DoubleTensor.ONE_SCALAR, alpha); final DoubleTensor y2 = random.nextGamma(shape, DoubleTensor.ONE_SCALAR, beta); final DoubleTensor range = xMax.minus(xMin); final DoubleTensor y1PlusY2 = y1.plus(y2); final DoubleTensor lessThan = xMax.minus(y2.div(y1PlusY2).timesInPlace(range)); final DoubleTensor greaterThan = xMin.plus(y1.div(y1PlusY2).timesInPlace(range)); final DoubleTensor lessMask = alpha.getLessThanMask(beta); final DoubleTensor greaterMask = alpha.getGreaterThanOrEqualToMask(beta); return lessMask.timesInPlace(lessThan).plusInPlace(greaterMask.timesInPlace(greaterThan)); }