@Override public IntegerTensor calculate() { return getParent().getValue(); }
@Override public DoubleTensor sampleWithShape(long[] shape, KeanuRandom random) { return StudentT.withParameters(v.getValue()).sample(shape, random); } }
@Override public double logProb(IntegerTensor kTensor) { return Binomial.withParameters(p.getValue(), n.getValue()).logProb(kTensor).sum(); }
private KeanuSavedBayesNet.StoredValue getValue(IntegerVertex vertex) { KeanuSavedBayesNet.IntegerTensor savedValue = getTensor(vertex.getValue()); KeanuSavedBayesNet.VertexValue value = KeanuSavedBayesNet.VertexValue.newBuilder() .setIntVal(savedValue) .build(); return getStoredValue(vertex, value); }
@Test public void canCastToIntegerVertex() { DoubleVertex v1 = new ConstantDoubleVertex(3.6); IntegerVertex intV1 = v1.toInteger(); assertEquals(3, intV1.getValue().scalar().longValue()); } }
@Test public void correctBranchTaken() { BooleanVertex predicate = new BernoulliVertex(0.5); IntegerVertex ifIsTrue = If.isTrue(predicate) .then(1) .orElse(0); predicate.setAndCascade(true); assertEquals(1, ifIsTrue.getValue().scalar().intValue()); predicate.setAndCascade(false); assertEquals(0, ifIsTrue.getValue().scalar().intValue()); }
@Test public void canFindMinAndMax() { IntegerVertex A = ConstantVertex.of(1, 2, 3, 4); IntegerVertex B = ConstantVertex.of(2, 4, 1, 5); IntegerVertex min = IntegerVertex.min(A, B); IntegerVertex max = IntegerVertex.max(A, B); assertArrayEquals(new int[]{1, 2, 1, 4}, min.getValue().asFlatIntegerArray()); assertArrayEquals(new int[]{2, 4, 3, 5}, max.getValue().asFlatIntegerArray()); }
@Test public void doesSubtract() { IntegerVertex result = v1.minus(v2); result.eval(); Integer expected = 1; assertEquals(result.getValue().scalar(), expected); }
@Test public void canSetAndCascadeAsScalarOnNonScalarVertex() { IntegerVertex binomialVertex = new BinomialVertex(new long[]{2, 1}, 0.5, 20); binomialVertex.setAndCascade(2); assertArrayEquals(new int[]{2}, binomialVertex.getValue().asFlatIntegerArray()); }
@Test public void doesMultiply() { IntegerVertex result = v1.multiply(v2); result.eval(); Integer expected = 6; assertEquals(result.getValue().scalar(), expected); }
@Test public void doesAdd() { IntegerVertex result = v1.plus(v2); result.eval(); Integer expected = 5; assertEquals(result.getValue().scalar(), expected); }
@Test public void canObserveArrayOfValues() { IntegerVertex binomialVertex = new BinomialVertex(0.5, 20); int[] observation = new int[]{1, 2, 3}; binomialVertex.observe(observation); assertArrayEquals(observation, binomialVertex.getValue().asFlatIntegerArray()); }
@Test public void canPluckValue() { IntegerVertex binomialVertex = new BinomialVertex(0.5, 20); int[] values = new int[]{1, 2, 3}; binomialVertex.setValue(values); assertEquals(1, (long) binomialVertex.take(0).getValue().scalar()); }
@Test public void doesLambda() { Function<IntegerTensor, IntegerTensor> op = val -> val.plus(5); IntegerVertex result = v1.lambda(op); result.eval(); Integer expected = 8; assertEquals(result.getValue().scalar(), expected); }
@Test public void canRunAModelInAModelWithDifferentOutputTypes() { weatherModel.setInputToModel(inputToModel); Map<VertexLabel, Vertex<? extends Tensor>> inputs = ImmutableMap.of(new VertexLabel("Temperature"), inputToModel); ModelVertex model = new LambdaModelVertex(inputs, weatherModel::modelExecution, weatherModel::updateValuesMultipleTypes); IntegerVertex suggestedFactorSuncream = model.getIntegerModelOutputVertex(new VertexLabel("suggestedFactorSuncream")); BooleanVertex isSunny = model.getBooleanModelOutputVertex(new VertexLabel("isSunny")); double inputValue = 20.0; inputToModel.setAndCascade(inputValue); Assert.assertEquals(suggestedFactorSuncream.getValue().scalar(), new Integer(2)); Assert.assertEquals(isSunny.getValue().scalar(), false); }
@Test public void canRunAModelInAModelWithDifferentOutputTypes() { weatherModel.setInputToModel(inputToModel); Map<VertexLabel, Vertex<? extends Tensor>> inputs = ImmutableMap.of(new VertexLabel("Temperature"), inputToModel); ModelVertex model = LambdaModelVertex.createFromProcess(inputs, COMMAND, weatherModel::updateValuesMultipleTypes); IntegerVertex suggestedFactorSuncream = model.getIntegerModelOutputVertex(new VertexLabel("suggestedFactorSuncream")); BooleanVertex isSunny = model.getBooleanModelOutputVertex(new VertexLabel("isSunny")); double inputValue = 20.0; inputToModel.setAndCascade(inputValue); Assert.assertEquals(suggestedFactorSuncream.getValue().scalar(), new Integer(2)); Assert.assertEquals(isSunny.getValue().scalar(), false); }
@Test public void logProbGraphMatchesKnownLogDensityOfScalar() { IntegerVertex k = ConstantVertex.of(1); ChiSquaredVertex vertex = new ChiSquaredVertex(k); LogProbGraph logProbGraph = vertex.logProbGraph(); LogProbGraphValueFeeder.feedValue(logProbGraph, k, k.getValue()); LogProbGraphValueFeeder.feedValue(logProbGraph, vertex, DoubleTensor.scalar(0.5)); ChiSquaredDistribution chiSquaredDistribution = new ChiSquaredDistribution(1); double expectedLogDensity = chiSquaredDistribution.logDensity(0.5); LogProbGraphContract.matchesKnownLogDensity(logProbGraph, expectedLogDensity); }
@Test public void logProbGraphMatchesKnownLogDensityOfVector() { IntegerVertex v = ConstantVertex.of(1, 1); StudentTVertex studentT = new StudentTVertex(v); LogProbGraph logProbGraph = studentT.logProbGraph(); LogProbGraphValueFeeder.feedValue(logProbGraph, v, v.getValue()); LogProbGraphValueFeeder.feedValue(logProbGraph, studentT, DoubleTensor.create(-4.5, 4.5)); TDistribution distribution = new TDistribution(1); double expectedDensity = distribution.logDensity(-4.5) + distribution.logDensity(4.5); LogProbGraphContract.matchesKnownLogDensity(logProbGraph, expectedDensity); }
@Test public void logProbGraphMatchesKnownLogDensityOfVector() { IntegerVertex k = ConstantVertex.of(1, 1); ChiSquaredVertex vertex = new ChiSquaredVertex(k); LogProbGraph logProbGraph = vertex.logProbGraph(); LogProbGraphValueFeeder.feedValue(logProbGraph, k, k.getValue()); LogProbGraphValueFeeder.feedValue(logProbGraph, vertex, DoubleTensor.create(0.25, 0.75)); ChiSquaredDistribution chiSquaredDistribution = new ChiSquaredDistribution(1); double expectedLogDensity = chiSquaredDistribution.logDensity(0.25) + chiSquaredDistribution.logDensity(0.75); LogProbGraphContract.matchesKnownLogDensity(logProbGraph, expectedLogDensity); }