package net.seninp.grammarviz.anomaly;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import net.seninp.gi.logic.GrammarRuleRecord;
import net.seninp.gi.logic.GrammarRules;
import net.seninp.gi.logic.RuleInterval;
import net.seninp.gi.sequitur.SequiturFactory;
import net.seninp.grammarviz.GrammarVizAnomaly;
import net.seninp.jmotif.sax.NumerosityReductionStrategy;
import net.seninp.jmotif.sax.TSProcessor;
import net.seninp.jmotif.sax.discord.BruteForceDiscordImplementation;
import net.seninp.jmotif.sax.discord.DiscordRecord;
import net.seninp.jmotif.sax.discord.DiscordRecords;
import net.seninp.jmotif.sax.discord.HOTSAXImplementation;
import net.seninp.jmotif.sax.registry.LargeWindowAlgorithm;
import net.seninp.util.StackTrace;
public class TestRRAanomaly {
private static final String TEST_DATA_FNAME = "src/resources/test-data/ecg0606_1.csv";
private static final int WIN_SIZE = 100;
private static final int PAA_SIZE = 3;
private static final int ALPHABET_SIZE = 3;
private static final double NORM_THRESHOLD = 0.5;
private static final int DISCORDS_TO_TEST = 1;
private static final NumerosityReductionStrategy STRATEGY = NumerosityReductionStrategy.NONE;
private double[] series;
@Before
public void setUp() throws Exception {
series = TSProcessor.readFileColumn(TEST_DATA_FNAME, 0, 0);
series = Arrays.copyOf(series, 1600);
}
@Test
public void test() {
DiscordRecords discordsBruteForce = null;
DiscordRecords discordsHash = null;
DiscordRecords discordsRRA = null;
try {
discordsBruteForce = BruteForceDiscordImplementation.series2BruteForceDiscords(series,
WIN_SIZE, DISCORDS_TO_TEST, new LargeWindowAlgorithm(), NORM_THRESHOLD);
for (DiscordRecord d : discordsBruteForce) {
System.out.println("brute force discord " + d.toString());
}
discordsHash = HOTSAXImplementation.series2Discords(series, DISCORDS_TO_TEST, WIN_SIZE,
PAA_SIZE, ALPHABET_SIZE, STRATEGY, NORM_THRESHOLD);
for (DiscordRecord d : discordsHash) {
System.out.println("hotsax hash discord " + d.toString());
}
// RRA
//
//
GrammarRules rules = SequiturFactory.series2SequiturRules(series, WIN_SIZE, PAA_SIZE,
ALPHABET_SIZE, STRATEGY, NORM_THRESHOLD);
ArrayList<RuleInterval> intervals = new ArrayList<RuleInterval>();
// populate all intervals with their frequency
for (GrammarRuleRecord rule : rules) {
if (0 != rule.ruleNumber()) {
for (RuleInterval ri : rule.getRuleIntervals()) {
RuleInterval i = (RuleInterval) ri.clone();
i.setCoverage(rule.getRuleIntervals().size());
i.setId(rule.ruleNumber());
intervals.add(i);
}
}
}
// get the coverage array
//
int[] coverageArray = new int[series.length];
for (GrammarRuleRecord rule : rules) {
if (0 != rule.ruleNumber()) {
ArrayList<RuleInterval> arrPos = rule.getRuleIntervals();
for (RuleInterval saxPos : arrPos) {
int startPos = saxPos.getStart();
int endPos = saxPos.getEnd();
for (int j = startPos; j < endPos; j++) {
coverageArray[j] = coverageArray[j] + 1;
}
}
}
}
// look for zero-covered intervals and add those to the list
//
List<RuleInterval> zeros = GrammarVizAnomaly.getZeroIntervals(coverageArray);
if (zeros.size() > 0) {
intervals.addAll(zeros);
}
discordsRRA = RRAImplementation.series2RRAAnomalies(series, DISCORDS_TO_TEST, intervals,
NORM_THRESHOLD);
for (DiscordRecord d : discordsRRA) {
System.out.println("RRA discords " + d.toString());
}
}
catch (Exception e) {
fail("shouldn't throw an exception, exception thrown: \n" + StackTrace.toString(e));
e.printStackTrace();
}
for (int i = 0; i < DISCORDS_TO_TEST; i++) {
Double d1 = discordsBruteForce.get(i).getNNDistance();
Double d2 = discordsHash.get(i).getNNDistance();
assertEquals(d1, d2);
Integer p1 = discordsBruteForce.get(i).getPosition();
Integer p2 = discordsHash.get(i).getPosition();
Integer p3 = discordsRRA.get(i).getPosition();
assertEquals(p1, p2);
assertTrue(Math.abs(p1 - p3) < 50);
}
}
}