package edu.hawaii.jmotif.experiment.twopatterns; import cc.mallet.util.Randoms; /** * CBF Domain data generator. * * @author psenin * */ public class TwoPatternsGenerator { private static Randoms randoms; private static final double UP = 5.0d; private static final double DOWN = -5.0d; static { randoms = new Randoms(); } public static synchronized int getStepWidth() { return (int) Math.round(randoms.nextUniform(20d, 30d)); } public static synchronized double[] dd(int[] t) { int len = t.length - 1; double[] res = new double[t.length]; int u1Width = getStepWidth(); int u2Width = getStepWidth(); int u1Start = (int) Math.floor(randoms.nextUniform(0d, (double) len - u1Width - u2Width)); int u2Start = (int) Math.floor(randoms.nextUniform(u1Start + u1Width, (double) len - u2Width)); // System.out.println(u1Start + ", " + u1Width + "; " + u2Start + ", " + u2Width); for (int i = 0; i < u1Start; i++) { res[i] = randoms.nextGaussian(); } for (int i = u1Start; i < u1Start + u1Width / 2; i++) { res[i] = UP; } for (int i = u1Start + u1Width / 2; i < u1Start + u1Width; i++) { res[i] = DOWN; } for (int i = u1Start + u1Width; i < u2Start; i++) { res[i] = randoms.nextGaussian(); } for (int i = u2Start; i < u2Start + u2Width / 2; i++) { res[i] = UP; } for (int i = u2Start + u2Width / 2; i < u2Start + u2Width; i++) { res[i] = DOWN; } for (int i = u2Start + u2Width; i < len; i++) { res[i] = randoms.nextGaussian(); } return res; } public static synchronized double[] ud(int[] t) { int len = t.length - 1; double[] res = new double[t.length]; int u1Width = getStepWidth(); int u2Width = getStepWidth(); int u1Start = (int) Math.floor(randoms.nextUniform(0d, (double) len - u1Width - u2Width)); int u2Start = (int) Math.floor(randoms.nextUniform(u1Start + u1Width, (double) len - u2Width)); // System.out.println(u1Start + ", " + u1Width + "; " + u2Start + ", " + u2Width); for (int i = 0; i < u1Start; i++) { res[i] = randoms.nextGaussian(); } for (int i = u1Start; i < u1Start + u1Width / 2; i++) { res[i] = DOWN; } for (int i = u1Start + u1Width / 2; i < u1Start + u1Width; i++) { res[i] = UP; } for (int i = u1Start + u1Width; i < u2Start; i++) { res[i] = randoms.nextGaussian(); } for (int i = u2Start; i < u2Start + u2Width / 2; i++) { res[i] = UP; } for (int i = u2Start + u2Width / 2; i < u2Start + u2Width; i++) { res[i] = DOWN; } for (int i = u2Start + u2Width; i < len; i++) { res[i] = randoms.nextGaussian(); } return res; } public static synchronized double[] uu(int[] t) { int len = t.length - 1; double[] res = new double[t.length]; int u1Width = getStepWidth(); int u2Width = getStepWidth(); int u1Start = (int) Math.floor(randoms.nextUniform(0d, (double) len - u1Width - u2Width)); int u2Start = (int) Math.floor(randoms.nextUniform(u1Start + u1Width, (double) len - u2Width)); // System.out.println(u1Start + ", " + u1Width + "; " + u2Start + ", " + u2Width); for (int i = 0; i < u1Start; i++) { res[i] = randoms.nextGaussian(); } for (int i = u1Start; i < u1Start + u1Width / 2; i++) { res[i] = DOWN; } for (int i = u1Start + u1Width / 2; i < u1Start + u1Width; i++) { res[i] = UP; } for (int i = u1Start + u1Width; i < u2Start; i++) { res[i] = randoms.nextGaussian(); } for (int i = u2Start; i < u2Start + u2Width / 2; i++) { res[i] = DOWN; } for (int i = u2Start + u2Width / 2; i < u2Start + u2Width; i++) { res[i] = UP; } for (int i = u2Start + u2Width; i < len; i++) { res[i] = randoms.nextGaussian(); } return res; } public static synchronized double[] du(int[] t) { int len = t.length - 1; double[] res = new double[t.length]; int u1Width = getStepWidth(); int u2Width = getStepWidth(); int u1Start = (int) Math.floor(randoms.nextUniform(0d, (double) len - u1Width - u2Width)); int u2Start = (int) Math.floor(randoms.nextUniform(u1Start + u1Width, (double) len - u2Width)); // System.out.println(u1Start + ", " + u1Width + "; " + u2Start + ", " + u2Width); for (int i = 0; i < u1Start; i++) { res[i] = randoms.nextGaussian(); } for (int i = u1Start; i < u1Start + u1Width / 2; i++) { res[i] = UP; } for (int i = u1Start + u1Width / 2; i < u1Start + u1Width; i++) { res[i] = DOWN; } for (int i = u1Start + u1Width; i < u2Start; i++) { res[i] = randoms.nextGaussian(); } for (int i = u2Start; i < u2Start + u2Width / 2; i++) { res[i] = DOWN; } for (int i = u2Start + u2Width / 2; i < u2Start + u2Width; i++) { res[i] = UP; } for (int i = u2Start + u2Width; i < len; i++) { res[i] = randoms.nextGaussian(); } return res; } }