com.amazon.randomcutforest.testutils.ShingledData Maven / Gradle / Ivy
/*
* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.amazon.randomcutforest.testutils;
import static java.lang.Math.PI;
import java.util.Random;
public class ShingledData {
public static double[][] generateShingledData(int size, int period, int dimensions, long seed) {
double[][] answer = new double[size][];
int entryIndex = 0;
boolean filledShingleAtleastOnce = false;
double[] history = new double[dimensions];
int count = 0;
double[] data = getData(size + dimensions - 1, period, 100, 5, seed);
for (int j = 0; j < size + dimensions - 1; ++j) { // we stream here ....
history[entryIndex] = data[j];
entryIndex = (entryIndex + 1) % dimensions;
if (entryIndex == 0) {
filledShingleAtleastOnce = true;
}
if (filledShingleAtleastOnce) {
answer[count++] = getShinglePoint(history, entryIndex, dimensions);
}
}
return answer;
}
private static double[] getShinglePoint(double[] recentPointsSeen, int indexOfOldestPoint, int shingleLength) {
double[] shingledPoint = new double[shingleLength];
int i = 0;
for (int j = 0; j < shingleLength; ++j) {
double point = recentPointsSeen[(j + indexOfOldestPoint) % shingleLength];
shingledPoint[i++] = point;
}
return shingledPoint;
}
private static double[] getData(int num, int period, double amplitude, double noise, long seed) {
double[] data = new double[num];
Random noiseprg = new Random(seed);
for (int i = 0; i < num; i++) {
data[i] = amplitude * Math.cos(2 * PI * (i + 50) / period) + noise * noiseprg.nextDouble();
if (noiseprg.nextDouble() < 0.01) {
double change = noiseprg.nextDouble() < 0.5 ? 10 * noise : -10 * noise;
data[i] += change;
System.out.println(" timestamp " + i + " changing by " + change);
}
}
return data;
}
}