Skip to content
This repository has been archived by the owner on May 6, 2022. It is now read-only.

Commit

Permalink
Some refactoring.
Browse files Browse the repository at this point in the history
  • Loading branch information
Florian Lautenschlager committed Feb 19, 2016
1 parent 6cdebe9 commit f7b8454
Show file tree
Hide file tree
Showing 31 changed files with 916 additions and 2,283 deletions.
11 changes: 11 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
language: java

jdk:
- oraclejdk8

before_install:
- chmod +x gradlew

script: ./gradlew build jacocoTestReport

after_success: ./gradlew jacocoRootReport coveralls
Empty file modified gradlew
100644 → 100755
Empty file.
22 changes: 22 additions & 0 deletions src/main/java/de/qaware/chronix/distance/BinaryDistance.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Arrays.java Jul 14, 2004
*
* Copyright (c) 2004 Stan Salvador
* [email protected]
*/

package de.qaware.chronix.distance;


import java.util.Arrays;

public final class BinaryDistance implements DistanceFunction {
public double calcDistance(double[] vector1, double[] vector2) {
if (Arrays.equals(vector1, vector2)) {
return 0.0;
} else {
return 1.0;
}
}

}
13 changes: 13 additions & 0 deletions src/main/java/de/qaware/chronix/distance/DistanceFunction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/*
* Arrays.java Jul 14, 2004
*
* Copyright (c) 2004 Stan Salvador
* [email protected]
*/

package de.qaware.chronix.distance;


public interface DistanceFunction {
double calcDistance(double[] vector1, double[] vector2);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* Arrays.java Jul 14, 2004
*
* Copyright (c) 2004 Stan Salvador
* [email protected]
*/

package de.qaware.chronix.distance;


public final class DistanceFunctionFactory {
public static DistanceFunction EUCLIDEAN_DIST_FN = new EuclideanDistance();
public static DistanceFunction MANHATTAN_DIST_FN = new ManhattanDistance();
public static DistanceFunction BINARY_DIST_FN = new BinaryDistance();

public static DistanceFunction getDistFnByName(String distFnName) {
switch (distFnName) {
case "EuclideanDistance":
return EUCLIDEAN_DIST_FN;
case "ManhattanDistance":
return MANHATTAN_DIST_FN;
case "BinaryDistance":
return BINARY_DIST_FN;
default:
throw new IllegalArgumentException("There is no DistanceFunction for the name " + distFnName);
}
}
}
20 changes: 20 additions & 0 deletions src/main/java/de/qaware/chronix/distance/EuclideanDistance.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Arrays.java Jul 14, 2004
*
* Copyright (c) 2004 Stan Salvador
* [email protected]
*/

package de.qaware.chronix.distance;


public final class EuclideanDistance implements DistanceFunction {
public double calcDistance(double[] vector1, double[] vector2) {
double sqSum = 0.0;
for (int x = 0; x < vector1.length; x++)
sqSum += Math.pow(vector1[x] - vector2[x], 2.0);

return Math.sqrt(sqSum);
}

}
20 changes: 20 additions & 0 deletions src/main/java/de/qaware/chronix/distance/ManhattanDistance.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Arrays.java Jul 14, 2004
*
* Copyright (c) 2004 Stan Salvador
* [email protected]
*/

package de.qaware.chronix.distance;


public final class ManhattanDistance implements DistanceFunction {
public double calcDistance(double[] vector1, double[] vector2) {
double diffSum = 0.0;
for (int x = 0; x < vector1.length; x++)
diffSum += Math.abs(vector1[x] - vector2[x]);

return diffSum;
}

}
1 change: 0 additions & 1 deletion src/main/java/de/qaware/chronix/dtw/CostMatrix.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,4 @@ interface CostMatrix
double get(int col, int row);

int size();

}
126 changes: 37 additions & 89 deletions src/main/java/de/qaware/chronix/dtw/DTW.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,24 @@

import de.qaware.chronix.matrix.ColMajorCell;
import de.qaware.chronix.timeseries.TimeSeries;
import de.qaware.chronix.util.DistanceFunction;
import de.qaware.chronix.distance.DistanceFunction;

import java.util.Iterator;


public class DTW {
public final class DTW {

private DTW() {
//avoid instances
}

// FUNCTIONS
public static double calcWarpCost(WarpPath path, TimeSeries tsI, TimeSeries tsJ, DistanceFunction distFn) {
double totalCost = 0.0;

for (int p = 0; p < path.size(); p++) {
final ColMajorCell currWarp = path.get(p);
totalCost += distFn.calcDistance(tsI.getMeasurementVector(currWarp.getCol()),
tsJ.getMeasurementVector(currWarp.getRow()));
totalCost += distFn.calcDistance(tsI.getMeasurementVector(currWarp.getCol()), tsJ.getMeasurementVector(currWarp.getRow()));
}

return totalCost;
}

Expand Down Expand Up @@ -73,20 +74,20 @@ public static double getWarpDistBetween(TimeSeries tsI, TimeSeries tsJ, Distance

// Minimum Cost is at (maxI,maxJ)
return currCol[maxJ];
} // end getWarpDistBetween(..)
}


public static WarpPath getWarpPathBetween(TimeSeries tsI, TimeSeries tsJ, DistanceFunction distFn) {
return DynamicTimeWarp(tsI, tsJ, distFn).getPath();
return dynamicTimeWarp(tsI, tsJ, distFn).getPath();
}


public static TimeWarpInfo getWarpInfoBetween(TimeSeries tsI, TimeSeries tsJ, DistanceFunction distFn) {
return DynamicTimeWarp(tsI, tsJ, distFn);
return dynamicTimeWarp(tsI, tsJ, distFn);
}


private static TimeWarpInfo DynamicTimeWarp(TimeSeries tsI, TimeSeries tsJ, DistanceFunction distFn) {
private static TimeWarpInfo dynamicTimeWarp(TimeSeries tsI, TimeSeries tsJ, DistanceFunction distFn) {
// COST MATRIX:
// 5|_|_|_|_|_|_|E| E = min Global Cost
// 4|_|_|_|_|_|_|_| S = Start point
Expand Down Expand Up @@ -124,33 +125,10 @@ private static TimeWarpInfo DynamicTimeWarp(TimeSeries tsI, TimeSeries tsJ, Dist
costMatrix[i][j - 1]));
costMatrix[i][j] = minGlobalCost + distFn.calcDistance(tsI.getMeasurementVector(i),
tsJ.getMeasurementVector(j));
} // end for loop
} // end for loop
}
}


/*
// writes a section of the cost matrix to a file
try
{
final PrintWriter out = new PrintWriter(new FileWriter("matrix1.csv"));
for (int j=maxJ; j>=0; j--)
{
for (int i=0; i<=maxI; i++)
{
out.print(costMatrix[i][j]);
if (i != maxI)
out.print(",");
}
out.println();
}
out.flush();
out.close();
}
catch (Exception e)
{
System.out.println(e);
e.printStackTrace();
}
*/
// Minimum Cost is at (maxIi,maxJ)
final double minimumCost = costMatrix[maxI][maxJ];

Expand Down Expand Up @@ -202,10 +180,10 @@ else if (i <= j) // leftCost==rightCost > diagCost

// Add the current step to the warp path.
minCostPath.addFirst(i, j);
} // end while loop
}

return new TimeWarpInfo(minimumCost, minCostPath);
} // end DynamicTimeWarp(..)
}


public static double getWarpDistBetween(TimeSeries tsI, TimeSeries tsJ, SearchWindow window, DistanceFunction distFn) {
Expand All @@ -225,37 +203,35 @@ public static double getWarpDistBetween(TimeSeries tsI, TimeSeries tsJ, SearchWi

// Get an iterator that traverses the window cells in the order that the cost matrix is filled.
// (first to last row (1..maxI), bottom to top (1..MaxJ)
final Iterator matrixIterator = window.iterator();
final Iterator<ColMajorCell> matrixIterator = window.iterator();

calcCostMatrix(tsI, tsJ, distFn, costMatrix, matrixIterator);
// Minimum Cost is at (maxI, maxJ)
return costMatrix.get(maxI, maxJ);

}

private static void calcCostMatrix(TimeSeries tsI, TimeSeries tsJ, DistanceFunction distFn, CostMatrix costMatrix, Iterator<ColMajorCell> matrixIterator) {
while (matrixIterator.hasNext()) {
final ColMajorCell currentCell = (ColMajorCell) matrixIterator.next(); // current cell being filled
final ColMajorCell currentCell = matrixIterator.next(); // current cell being filled
final int i = currentCell.getCol();
final int j = currentCell.getRow();

if ((i == 0) && (j == 0)) // bottom left cell (first row AND first column)
costMatrix.put(i, j, distFn.calcDistance(tsI.getMeasurementVector(0), tsJ.getMeasurementVector(0)));
else if (i == 0) // first column
else if (i == 0) // first column
{
costMatrix.put(i, j, distFn.calcDistance(tsI.getMeasurementVector(0), tsJ.getMeasurementVector(j)) +
costMatrix.get(i, j - 1));
costMatrix.put(i, j, distFn.calcDistance(tsI.getMeasurementVector(0), tsJ.getMeasurementVector(j)) + costMatrix.get(i, j - 1));
} else if (j == 0) // first row
{
costMatrix.put(i, j, distFn.calcDistance(tsI.getMeasurementVector(i), tsJ.getMeasurementVector(0)) +
costMatrix.get(i - 1, j));
costMatrix.put(i, j, distFn.calcDistance(tsI.getMeasurementVector(i), tsJ.getMeasurementVector(0)) + costMatrix.get(i - 1, j));
} else // not first column or first row
{
final double minGlobalCost = Math.min(costMatrix.get(i - 1, j),
Math.min(costMatrix.get(i - 1, j - 1),
costMatrix.get(i, j - 1)));
costMatrix.put(i, j, minGlobalCost + distFn.calcDistance(tsI.getMeasurementVector(i),
tsJ.getMeasurementVector(j)));
} // end if
} // end while loop

// Minimum Cost is at (maxI, maxJ)
return costMatrix.get(maxI, maxJ);

} // end getWarpDistBetween(...)
final double minGlobalCost = Math.min(costMatrix.get(i - 1, j), Math.min(costMatrix.get(i - 1, j - 1), costMatrix.get(i, j - 1)));
costMatrix.put(i, j, minGlobalCost + distFn.calcDistance(tsI.getMeasurementVector(i), tsJ.getMeasurementVector(j)));
}
}
}


public static WarpPath getWarpPathBetween(TimeSeries tsI, TimeSeries tsJ, SearchWindow window, DistanceFunction distFn) {
Expand Down Expand Up @@ -285,32 +261,9 @@ private static TimeWarpInfo constrainedTimeWarp(TimeSeries tsI, TimeSeries tsJ,

// Get an iterator that traverses the window cells in the order that the cost matrix is filled.
// (first to last row (1..maxI), bottom to top (1..MaxJ)
final Iterator matrixIterator = window.iterator();
final Iterator<ColMajorCell> matrixIterator = window.iterator();

while (matrixIterator.hasNext()) {
final ColMajorCell currentCell = (ColMajorCell) matrixIterator.next(); // current cell being filled
final int i = currentCell.getCol();
final int j = currentCell.getRow();

if ((i == 0) && (j == 0)) // bottom left cell (first row AND first column)
costMatrix.put(i, j, distFn.calcDistance(tsI.getMeasurementVector(0), tsJ.getMeasurementVector(0)));
else if (i == 0) // first column
{
costMatrix.put(i, j, distFn.calcDistance(tsI.getMeasurementVector(0), tsJ.getMeasurementVector(j)) +
costMatrix.get(i, j - 1));
} else if (j == 0) // first row
{
costMatrix.put(i, j, distFn.calcDistance(tsI.getMeasurementVector(i), tsJ.getMeasurementVector(0)) +
costMatrix.get(i - 1, j));
} else // not first column or first row
{
final double minGlobalCost = Math.min(costMatrix.get(i - 1, j),
Math.min(costMatrix.get(i - 1, j - 1),
costMatrix.get(i, j - 1)));
costMatrix.put(i, j, minGlobalCost + distFn.calcDistance(tsI.getMeasurementVector(i),
tsJ.getMeasurementVector(j)));
} // end if
} // end while loop
calcCostMatrix(tsI, tsJ, distFn, costMatrix, matrixIterator);

// Minimum Cost is at (maxI, maxJ)
final double minimumCost = costMatrix.get(maxI, maxJ);
Expand Down Expand Up @@ -364,11 +317,6 @@ else if (i <= j) // leftCost==rightCost > diagCost
minCostPath.addFirst(i, j);
} // end while loop

// Free any rescources associated with the costMatrix (a swap file may have been created if the swa file did not
// fit into main memory).
costMatrix.freeMem();

return new TimeWarpInfo(minimumCost, minCostPath);
} // end ConstrainedTimeWarp

} // end class DtwTest
}
}
Loading

0 comments on commit f7b8454

Please sign in to comment.