@Category(Slow.class)
@Test
public void calculatesGradientCorrectlyWithAdditionMultiplicationSubtractionDivision() {
GaussianVertex A = new GaussianVertex(2.0, 3.0);
GaussianVertex B = new GaussianVertex(3.0, 3.0);
A.setAndCascade(Nd4jDoubleTensor.scalar(2.2));
B.setAndCascade(Nd4jDoubleTensor.scalar(3.2));
DoubleVertex C = A.plus(B);
DoubleVertex D = A.multiply(B);
DoubleVertex E = C.minus(D);
DoubleVertex F = C.divideBy(D);
GaussianVertex eObservation = new GaussianVertex(E, 5.0);
eObservation.observe(Nd4jDoubleTensor.scalar(1.2));
GaussianVertex fObservation = new GaussianVertex(F, C);
fObservation.observe(Nd4jDoubleTensor.scalar(1.0));
KeanuProbabilisticModelWithGradient model = new KeanuProbabilisticModelWithGradient(A.getConnectedGraph());
FitnessFunctionWithGradient fitness = new FitnessFunctionWithGradient(model, false);
assert2DGradientEqualsApproxGradient(
new double[]{5, 5},
new double[]{0.1, 0.1},
0.2,
fitness
);
}