package org.numenta.nupic.algorithms; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import gnu.trove.list.TDoubleList; import gnu.trove.list.array.TDoubleArrayList; import java.util.ArrayList; import java.util.List; import org.joda.time.DateTime; import org.junit.Test; import org.numenta.nupic.algorithms.Anomaly.AveragedAnomalyRecordList; import org.numenta.nupic.algorithms.AnomalyLikelihood.AnomalyParams; public class AnomalyLikelihoodMetricsTest { @SuppressWarnings("serial") @Test public void testEquals() { double[] likelihoods = new double[] { 0.2, 0.3 }; Sample s = new Sample(new DateTime(), 0.1, 0.1); List<Sample> samples = new ArrayList<>(); samples.add(s); TDoubleList d = new TDoubleArrayList(); d.add(0.5); double total = 0.4; AveragedAnomalyRecordList avges = ( new Anomaly() { @Override public double compute(int[] activeColumns, int[] predictedColumns, double inputValue, long timestamp) { return 0; } } ).new AveragedAnomalyRecordList(samples, d, total); Statistic stat = new Statistic(0.1, 0.1, 0.1); MovingAverage ma = new MovingAverage(new TDoubleArrayList(), 1); AnomalyParams params = new AnomalyParams(new String[] { Anomaly.KEY_DIST, Anomaly.KEY_MVG_AVG, Anomaly.KEY_HIST_LIKE}, stat, ma, likelihoods); // Test equality AnomalyLikelihoodMetrics metrics = new AnomalyLikelihoodMetrics(likelihoods, avges, params); AnomalyLikelihoodMetrics metrics2 = metrics.copy(); assertEquals(metrics, metrics2); assertTrue(metrics.equals(metrics)); assertFalse(metrics.equals(null)); assertFalse(metrics.equals(s)); AnomalyLikelihoodMetrics metricsNoRecs = new AnomalyLikelihoodMetrics(likelihoods, null, params); assertFalse(metricsNoRecs.equals(metrics)); double[] likelihoods2 = new double[] { 0.1, 0.2 }; AnomalyLikelihoodMetrics metricsDiffLikes = new AnomalyLikelihoodMetrics(likelihoods2, avges, params); assertFalse(metrics.equals(metricsDiffLikes)); AnomalyLikelihoodMetrics metricsNoLikes = new AnomalyLikelihoodMetrics(null, avges, params); assertFalse(metricsNoLikes.equals(metricsDiffLikes)); AnomalyLikelihoodMetrics metricsNoParams = new AnomalyLikelihoodMetrics(likelihoods, avges, null); assertFalse(metricsNoParams.equals(metrics)); } @SuppressWarnings("serial") @Test public void testCopy() { double[] likelihoods = new double[] { 0.2, 0.3 }; Sample s = new Sample(new DateTime(), 0.1, 0.1); List<Sample> samples = new ArrayList<>(); samples.add(s); TDoubleList d = new TDoubleArrayList(); d.add(0.5); double total = 0.4; AveragedAnomalyRecordList avges = ( new Anomaly() { @Override public double compute(int[] activeColumns, int[] predictedColumns, double inputValue, long timestamp) { return 0; } } ).new AveragedAnomalyRecordList(samples, d, total); Statistic stat = new Statistic(0.1, 0.1, 0.1); MovingAverage ma = new MovingAverage(new TDoubleArrayList(), 1); AnomalyParams params = new AnomalyParams(new String[] { Anomaly.KEY_DIST, Anomaly.KEY_MVG_AVG, Anomaly.KEY_HIST_LIKE}, stat, ma, likelihoods); // Test equality AnomalyLikelihoodMetrics metrics = new AnomalyLikelihoodMetrics(likelihoods, avges, params); AnomalyLikelihoodMetrics metrics2 = metrics.copy(); assertEquals(metrics, metrics2); } @Test public void testHashCodeAndEquals() { double[] likelihoods = new double[] { 0.2, 0.3 }; DateTime metricTime = new DateTime(); Sample s = new Sample(metricTime, 0.1, 0.1); List<Sample> samples = new ArrayList<>(); samples.add(s); TDoubleList d = new TDoubleArrayList(); d.add(0.5); double total = 0.4; AveragedAnomalyRecordList avges = ( new Anomaly() { private static final long serialVersionUID = 1L; @Override public double compute(int[] activeColumns, int[] predictedColumns, double inputValue, long timestamp) { return 0; } } ).new AveragedAnomalyRecordList(samples, d, total); Statistic stat = new Statistic(0.1, 0.1, 0.1); MovingAverage ma = new MovingAverage(new TDoubleArrayList(), 1); AnomalyParams params = new AnomalyParams(new String[] { Anomaly.KEY_DIST, Anomaly.KEY_MVG_AVG, Anomaly.KEY_HIST_LIKE}, stat, ma, likelihoods); AnomalyLikelihoodMetrics metrics = new AnomalyLikelihoodMetrics(likelihoods, avges, params); AnomalyLikelihoodMetrics metrics2 = metrics.copy(); assertEquals(metrics, metrics2); assertEquals(metrics.hashCode(), metrics2.hashCode()); ////////////////////////// NEGATIVE TESTS ////////////////////////// // Test with different Samples / Different Date double[] likelihoods2 = new double[] { 0.2, 0.3 }; samples = new ArrayList<Sample>(); Sample s2 = new Sample(new DateTime(), 0.1, 0.1); // Different date samples.add(s2); avges = ( new Anomaly() { private static final long serialVersionUID = 1L; @Override public double compute(int[] activeColumns, int[] predictedColumns, double inputValue, long timestamp) { return 0; } } ).new AveragedAnomalyRecordList(samples, d, total); Statistic stat2 = new Statistic(0.1, 0.1, 0.1); MovingAverage ma2 = new MovingAverage(new TDoubleArrayList(), 1); AnomalyParams params2 = new AnomalyParams(new String[] { Anomaly.KEY_DIST, Anomaly.KEY_MVG_AVG, Anomaly.KEY_HIST_LIKE}, stat2, ma2, likelihoods2); AnomalyLikelihoodMetrics metrics3 = new AnomalyLikelihoodMetrics(likelihoods, avges, params2); assertNotEquals(metrics, metrics3); /////////////////////////// // Test with different Samples / Different Value double[] likelihoods3 = new double[] { 0.2, 0.3 }; samples = new ArrayList<Sample>(); Sample s3 = new Sample(s2.date, 0.2, 0.1); // Different Value samples.add(s3); avges = ( new Anomaly() { private static final long serialVersionUID = 1L; @Override public double compute(int[] activeColumns, int[] predictedColumns, double inputValue, long timestamp) { return 0; } } ).new AveragedAnomalyRecordList(samples, d, total); Statistic stat3 = new Statistic(0.1, 0.1, 0.1); MovingAverage ma3 = new MovingAverage(new TDoubleArrayList(), 1); AnomalyParams params3 = new AnomalyParams(new String[] { Anomaly.KEY_DIST, Anomaly.KEY_MVG_AVG, Anomaly.KEY_HIST_LIKE}, stat3, ma3, likelihoods3); AnomalyLikelihoodMetrics metrics4 = new AnomalyLikelihoodMetrics(likelihoods, avges, params3); assertNotEquals(metrics, metrics4); /////////////////////////// // Test with different Samples / Different Score double[] likelihoods4 = new double[] { 0.2, 0.3 }; samples = new ArrayList<Sample>(); Sample s4 = new Sample(s2.date, 0.1, 0.9); // Different Value samples.add(s4); avges = ( new Anomaly() { private static final long serialVersionUID = 1L; @Override public double compute(int[] activeColumns, int[] predictedColumns, double inputValue, long timestamp) { return 0; } } ).new AveragedAnomalyRecordList(samples, d, total); Statistic stat4 = new Statistic(0.1, 0.1, 0.1); MovingAverage ma4 = new MovingAverage(new TDoubleArrayList(), 1); AnomalyParams params4 = new AnomalyParams(new String[] { Anomaly.KEY_DIST, Anomaly.KEY_MVG_AVG, Anomaly.KEY_HIST_LIKE}, stat4, ma4, likelihoods4); AnomalyLikelihoodMetrics metrics5 = new AnomalyLikelihoodMetrics(likelihoods, avges, params4); assertNotEquals(metrics, metrics5); /////////////////////////// // Test with different Samples / Different Params avges = ( new Anomaly() { private static final long serialVersionUID = 1L; @Override public double compute(int[] activeColumns, int[] predictedColumns, double inputValue, long timestamp) { return 0; } } ).new AveragedAnomalyRecordList(samples, d, total); Statistic stat5 = new Statistic(0.5, 0.1, 0.1); AnomalyParams params5 = new AnomalyParams(new String[] { Anomaly.KEY_DIST, Anomaly.KEY_MVG_AVG, Anomaly.KEY_HIST_LIKE}, stat5, ma4, likelihoods4); AnomalyLikelihoodMetrics metrics6 = new AnomalyLikelihoodMetrics(likelihoods, avges, params5); assertNotEquals(metrics, metrics6); ////////////////////////// // Test same Samples / Different Params likelihoods = new double[] { 0.2, 0.3 }; s = new Sample(metricTime, 0.1, 0.1); samples = new ArrayList<>(); samples.add(s); d = new TDoubleArrayList(); d.add(0.5); total = 0.4; avges = ( new Anomaly() { private static final long serialVersionUID = 1L; @Override public double compute(int[] activeColumns, int[] predictedColumns, double inputValue, long timestamp) { return 0; } } ).new AveragedAnomalyRecordList(samples, d, total); Statistic stat6 = new Statistic(0.1, 0.1, 0.1); MovingAverage ma6 = new MovingAverage(new TDoubleArrayList(), 1); AnomalyParams params6 = new AnomalyParams(new String[] { Anomaly.KEY_DIST, Anomaly.KEY_MVG_AVG, Anomaly.KEY_HIST_LIKE}, stat6, ma6, likelihoods); AnomalyLikelihoodMetrics metrics7 = new AnomalyLikelihoodMetrics(likelihoods, avges, params6); assertNotEquals(metrics, metrics7); } }