use of com.amazon.randomcutforest.tree.INodeView in project random-cut-forest-by-aws by aws.
the class SimpleInterpolationVisitorTest method testAccept.
@Test
public void testAccept() {
float[] pointToScore = { 0.0f, 0.0f };
int sampleSize = 50;
SimpleInterpolationVisitor visitor = new SimpleInterpolationVisitor(pointToScore, sampleSize, 1, false);
INodeView leafNode = mock(NodeView.class);
float[] point = new float[] { 1.0f, -2.0f };
when(leafNode.getLeafPoint()).thenReturn(point);
when(leafNode.getBoundingBox()).thenReturn(new BoundingBox(point, point));
int leafMass = 3;
when(leafNode.getMass()).thenReturn(leafMass);
int depth = 4;
visitor.acceptLeaf(leafNode, depth);
InterpolationMeasure result = visitor.getResult();
double expectedSumOfNewRange = 1.0 + 2.0;
double[] expectedDifferenceInRangeVector = { 0.0, 1.0, 2.0, 0.0 };
double[] expectedProbVector = Arrays.stream(expectedDifferenceInRangeVector).map(x -> x / expectedSumOfNewRange).toArray();
double[] expectedNumPts = Arrays.stream(expectedProbVector).toArray();
double[] expectedDistances = new double[2 * pointToScore.length];
for (int i = 0; i < 2 * pointToScore.length; i++) {
expectedDistances[i] = expectedProbVector[i] * expectedDifferenceInRangeVector[i];
}
for (int i = 0; i < 2 * pointToScore.length; i++) {
expectedNumPts[i] = expectedNumPts[i] * 4;
}
for (int i = 0; i < pointToScore.length; i++) {
assertEquals(expectedProbVector[2 * i], result.probMass.high[i]);
assertEquals(expectedProbVector[2 * i + 1], result.probMass.low[i]);
assertEquals(expectedNumPts[2 * i], result.measure.high[i]);
assertEquals(expectedNumPts[2 * i + 1], result.measure.low[i]);
assertEquals(expectedDistances[2 * i], result.distances.high[i]);
assertEquals(expectedDistances[2 * i + 1], result.distances.low[i]);
}
// parent does not contain pointToScore
depth--;
INodeView sibling = mock(NodeView.class);
int siblingMass = 2;
when(sibling.getMass()).thenReturn(siblingMass);
INodeView parent = mock(NodeView.class);
int parentMass = leafMass + siblingMass;
when(parent.getMass()).thenReturn(parentMass);
when(parent.getBoundingBox()).thenReturn(new BoundingBox(point, new float[] { 2.0f, -0.5f }));
visitor.accept(parent, depth);
result = visitor.getResult();
double expectedSumOfNewRange2 = 2.0 + 2.0;
double expectedProbOfCut2 = (1.0 + 0.5) / expectedSumOfNewRange2;
double[] expectedDifferenceInRangeVector2 = { 0.0, 1.0, 0.5, 0.0 };
double[] expectedDirectionalDistanceVector2 = { 0.0, 2.0, 2.0, 0.0 };
for (int i = 0; i < 2 * pointToScore.length; i++) {
double prob = expectedDifferenceInRangeVector2[i] / expectedSumOfNewRange2;
expectedProbVector[i] = prob + (1 - expectedProbOfCut2) * expectedProbVector[i];
expectedNumPts[i] = prob * (1 + parent.getMass()) + (1 - expectedProbOfCut2) * expectedNumPts[i];
expectedDistances[i] = prob * expectedDirectionalDistanceVector2[i] + (1 - expectedProbOfCut2) * expectedDistances[i];
}
for (int i = 0; i < pointToScore.length; i++) {
assertEquals(expectedProbVector[2 * i], result.probMass.high[i]);
assertEquals(expectedProbVector[2 * i + 1], result.probMass.low[i]);
assertEquals(expectedNumPts[2 * i], result.measure.high[i]);
assertEquals(expectedNumPts[2 * i + 1], result.measure.low[i]);
assertEquals(expectedDistances[2 * i], result.distances.high[i]);
assertEquals(expectedDistances[2 * i + 1], result.distances.low[i]);
}
// grandparent contains pointToScore
assertFalse(visitor.pointInsideBox);
depth--;
}
use of com.amazon.randomcutforest.tree.INodeView in project random-cut-forest-by-aws by aws.
the class AnomalyAttributionVisitorTest method testAccept.
@Test
public void testAccept() {
float[] pointToScore = { 0.0f, 0.0f };
int treeMass = 50;
AnomalyAttributionVisitor visitor = new AnomalyAttributionVisitor(pointToScore, treeMass, 0);
INodeView leafNode = mock(NodeView.class);
float[] point = new float[] { 1.0f, -2.0f };
when(leafNode.getLeafPoint()).thenReturn(point);
when(leafNode.getBoundingBox()).thenReturn(new BoundingBox(point, point));
int leafMass = 3;
when(leafNode.getMass()).thenReturn(leafMass);
int depth = 4;
visitor.acceptLeaf(leafNode, depth);
DiVector result = visitor.getResult();
double expectedScoreSum = defaultScoreUnseenFunction(depth, leafNode.getMass());
double sumOfNewRange = 1.0 + 2.0;
double[] expectedUnnormalizedLow = new double[] { expectedScoreSum * 1.0 / sumOfNewRange, 0.0 };
double[] expectedUnnormalizedHigh = new double[] { 0.0, expectedScoreSum * 2.0 / sumOfNewRange };
for (int i = 0; i < pointToScore.length; i++) {
assertEquals(defaultScalarNormalizerFunction(expectedUnnormalizedLow[i], treeMass), result.low[i], EPSILON);
assertEquals(defaultScalarNormalizerFunction(expectedUnnormalizedHigh[i], treeMass), result.high[i], EPSILON);
}
// parent does not contain pointToScore
depth--;
INodeView sibling = mock(NodeView.class);
int siblingMass = 2;
when(sibling.getMass()).thenReturn(siblingMass);
INodeView parent = mock(NodeView.class);
int parentMass = leafMass + siblingMass;
when(parent.getMass()).thenReturn(parentMass);
BoundingBox boundingBox = new BoundingBox(point, new float[] { 2.0f, -0.5f });
when(parent.getBoundingBox()).thenReturn(boundingBox);
visitor.accept(parent, depth);
result = visitor.getResult();
double expectedSumOfNewRange2 = 2.0 + 2.0;
double expectedProbOfCut2 = (1.0 + 0.5) / expectedSumOfNewRange2;
double[] expectedDifferenceInRangeVector2 = { 0.0, 1.0, 0.5, 0.0 };
double expectedScore2 = defaultScoreUnseenFunction(depth, parent.getMass());
double[] expectedUnnormalizedLow2 = new double[pointToScore.length];
double[] expectedUnnormalizedHigh2 = new double[pointToScore.length];
for (int i = 0; i < pointToScore.length; i++) {
double prob = expectedDifferenceInRangeVector2[2 * i] / expectedSumOfNewRange2;
expectedUnnormalizedHigh2[i] = prob * expectedScore2 + (1 - expectedProbOfCut2) * expectedUnnormalizedHigh[i];
prob = expectedDifferenceInRangeVector2[2 * i + 1] / expectedSumOfNewRange2;
expectedUnnormalizedLow2[i] = prob * expectedScore2 + (1 - expectedProbOfCut2) * expectedUnnormalizedLow[i];
}
for (int i = 0; i < pointToScore.length; i++) {
assertEquals(defaultScalarNormalizerFunction(expectedUnnormalizedLow2[i], treeMass), result.low[i], EPSILON);
assertEquals(defaultScalarNormalizerFunction(expectedUnnormalizedHigh2[i], treeMass), result.high[i], EPSILON);
}
// grandparent contains pointToScore
assertFalse(visitor.pointInsideBox);
depth--;
INodeView grandParent = mock(NodeView.class);
when(grandParent.getMass()).thenReturn(parentMass + 2);
when(grandParent.getBoundingBox()).thenReturn(boundingBox.getMergedBox(new BoundingBox(new float[] { -1.0f, 1.0f }).getMergedBox(new float[] { -0.5f, -1.5f })));
visitor.accept(grandParent, depth);
result = visitor.getResult();
for (int i = 0; i < pointToScore.length; i++) {
assertEquals(defaultScalarNormalizerFunction(expectedUnnormalizedLow2[i], treeMass), result.low[i], EPSILON);
assertEquals(defaultScalarNormalizerFunction(expectedUnnormalizedHigh2[i], treeMass), result.high[i], EPSILON);
}
}
use of com.amazon.randomcutforest.tree.INodeView in project random-cut-forest-by-aws by aws.
the class AnomalyAttributionVisitorTest method testAcceptLeafEquals.
@Test
public void testAcceptLeafEquals() {
float[] point = { 1.1f, -2.2f, 3.3f };
INodeView leafNode = mock(NodeView.class);
when(leafNode.getLeafPoint()).thenReturn(point);
when(leafNode.getBoundingBox()).thenReturn(new BoundingBox(point, point));
int leafDepth = 100;
int leafMass = 10;
when(leafNode.getMass()).thenReturn(leafMass);
int treeMass = 21;
AnomalyAttributionVisitor visitor = new AnomalyAttributionVisitor(point, treeMass, 0);
visitor.acceptLeaf(leafNode, leafDepth);
assertTrue(visitor.hitDuplicates);
double expectedScoreSum = CommonUtils.defaultDampFunction(leafMass, treeMass) / (leafDepth + Math.log(leafMass + 1) / Math.log(2));
double expectedScore = expectedScoreSum / (2 * point.length);
DiVector result = visitor.getResult();
for (int i = 0; i < point.length; i++) {
assertEquals(defaultScalarNormalizerFunction(expectedScore, treeMass), result.low[i], EPSILON);
assertEquals(defaultScalarNormalizerFunction(expectedScore, treeMass), result.high[i], EPSILON);
}
}
use of com.amazon.randomcutforest.tree.INodeView in project random-cut-forest-by-aws by aws.
the class NearNeighborVisitorTest method acceptLeafNotNear.
@Test
public void acceptLeafNotNear() {
float[] leafPoint = new float[] { 108.8f, 209.9f, -305.5f };
INodeView leafNode = mock(NodeView.class);
HashMap<Long, Integer> sequenceIndexes = new HashMap<>();
sequenceIndexes.put(1234L, 1);
sequenceIndexes.put(5678L, 1);
when(leafNode.getLeafPoint()).thenReturn(leafPoint);
when(leafNode.getLiftedLeafPoint()).thenReturn(leafPoint);
when(leafNode.getSequenceIndexes()).thenReturn(sequenceIndexes);
int depth = 12;
visitor.acceptLeaf(leafNode, depth);
Optional<Neighbor> optional = visitor.getResult();
assertFalse(optional.isPresent());
}
use of com.amazon.randomcutforest.tree.INodeView in project random-cut-forest-by-aws by aws.
the class AnomalyScoreVisitorTest method testAcceptEqualsLeafPoint.
@Test
public void testAcceptEqualsLeafPoint() {
float[] pointToScore = { 0.0f, 0.0f };
int sampleSize = 50;
AnomalyScoreVisitor visitor = new AnomalyScoreVisitor(pointToScore, sampleSize);
float[] point = Arrays.copyOf(pointToScore, pointToScore.length);
INodeView node = mock(NodeView.class);
when(node.getLeafPoint()).thenReturn(point);
when(node.getBoundingBox()).thenReturn(new BoundingBox(point, point));
int depth = 2;
visitor.acceptLeaf(node, depth);
double expectedScore = CommonUtils.defaultDampFunction(node.getMass(), sampleSize) / (depth + Math.log(node.getMass() + 1) / Math.log(2));
assertThat(visitor.getResult(), closeTo(CommonUtils.defaultScalarNormalizerFunction(expectedScore, sampleSize), EPSILON));
depth--;
IBoundingBoxView boundingBox = node.getBoundingBox().getMergedBox(new float[] { 1.0f, 1.0f });
node = new NodeView(null, null, Null);
visitor.accept(node, depth);
assertThat(visitor.getResult(), closeTo(CommonUtils.defaultScalarNormalizerFunction(expectedScore, sampleSize), EPSILON));
depth--;
boundingBox = boundingBox.getMergedBox(new float[] { -1.0f, -1.0f });
node = new NodeView(null, null, Null);
visitor.accept(node, depth);
assertThat(visitor.getResult(), closeTo(CommonUtils.defaultScalarNormalizerFunction(expectedScore, sampleSize), EPSILON));
}
Aggregations