/**
* Copyright (c) 2013 Oculus Info Inc.
* http://www.oculusinfo.com/
*
* Released under the MIT License.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is furnished to do
* so, subject to the following conditions:
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package spimedb.cluster.distance;
import org.junit.Test;
import spimedb.cluster.feature.temporal.TemporalFeature;
import spimedb.cluster.feature.temporal.distance.TemporalDistance;
import java.util.*;
import static org.junit.Assert.assertTrue;
public class TestTemporalDistance {
final long MS_PER_DAY = 86400000;
final long MS_PER_WEEK = MS_PER_DAY * 7;
final long MS_PER_MONTH = MS_PER_DAY * 30;
final long MS_PER_YEAR = MS_PER_DAY * 365;
final double epsilon = 0.00001;
private boolean isEqual(double d1, double d2) {
return (Math.abs( d1 - d2 ) < epsilon );
}
@Test
public void testIdenticalPoints() {
Date date = (new GregorianCalendar(2010, 01, 01)).getTime();
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date, date);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date, date);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
assertTrue(isEqual(distance, 0));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, 0));
}
@Test
public void testSymmetric1() {
Date date = (new GregorianCalendar(2010, 01, 01)).getTime();
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date, date);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date, date);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testDisjointYearPoints() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = (new GregorianCalendar(2011, 01, 01)).getTime();
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date1);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date2, date2);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
assertTrue(isEqual(distance, 1));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, 1));
}
@Test
public void testSymmetric2() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = (new GregorianCalendar(2011, 01, 01)).getTime();
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date1);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date2, date2);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testDisjointMonthPoints() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = (new GregorianCalendar(2010, 02, 01)).getTime();
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date1);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date2, date2);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
assertTrue(isEqual(distance, 1));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, 1));
}
@Test
public void testSymmetric3() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = (new GregorianCalendar(2010, 02, 01)).getTime();
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date1);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date2, date2);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testDisjointDayPoints() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = (new GregorianCalendar(2010, 01, 02)).getTime();
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date1);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date2, date2);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
assertTrue(isEqual(distance, 1));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, 1));
}
@Test
public void testSymmetric4() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = (new GregorianCalendar(2010, 01, 02)).getTime();
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date1);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date2, date2);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testIdenticalRegions() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = (new GregorianCalendar(2011, 01, 01)).getTime();
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date1, date2);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
assertTrue(isEqual(distance, 0));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, 0));
}
@Test
public void testSymmetric5() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = (new GregorianCalendar(2011, 01, 01)).getTime();
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date1, date2);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testDisjointRegions() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = (new GregorianCalendar(2011, 01, 01)).getTime();
Date date3 = (new GregorianCalendar(2012, 01, 01)).getTime();
Date date4 = (new GregorianCalendar(2013, 01, 01)).getTime();
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
assertTrue(isEqual(distance, 1));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, 1));
}
@Test
public void testSymmetric6() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = (new GregorianCalendar(2011, 01, 01)).getTime();
Date date3 = (new GregorianCalendar(2012, 01, 01)).getTime();
Date date4 = (new GregorianCalendar(2013, 01, 01)).getTime();
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testOverlappingByDayInYearRegions() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_YEAR );
Date date3 = date2;
Date date4 = new Date( date3.getTime() + MS_PER_YEAR );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
double expected = 1.0 - (2.0 * MS_PER_DAY / (2.0 * MS_PER_YEAR));
assertTrue(isEqual(distance, expected));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, expected));
}
@Test
public void testSymmetric7() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_YEAR );
Date date3 = date2;
Date date4 = new Date( date3.getTime() + MS_PER_YEAR );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testOverlappingByDayInMonthRegions() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_MONTH );
Date date3 = date2;
Date date4 = new Date( date3.getTime() + MS_PER_MONTH );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
double expected = 1.0 - (2.0 * MS_PER_DAY / (2.0 * MS_PER_MONTH));
assertTrue(isEqual(distance, expected));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, expected));
}
@Test
public void testSymmetric8() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_MONTH );
Date date3 = date2;
Date date4 = new Date( date3.getTime() + MS_PER_MONTH );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testOverlappingByDayInWeekRegions() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_WEEK );
Date date3 = date2;
Date date4 = new Date( date3.getTime() + MS_PER_WEEK );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
double expected = 1.0 - (2.0 * MS_PER_DAY / (2.0 * MS_PER_WEEK));
assertTrue(isEqual(distance, expected));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, expected));
}
@Test
public void testSymmetric9() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_WEEK );
Date date3 = date2;
Date date4 = new Date( date3.getTime() + MS_PER_WEEK );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testOverlappingByWeekInYearRegions() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_YEAR );
Date date3 = new Date( date2.getTime() - MS_PER_WEEK );
Date date4 = new Date( date3.getTime() + MS_PER_YEAR );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
double expected = 1.0 - (2.0 * MS_PER_WEEK / (2.0 * MS_PER_YEAR));
assertTrue(isEqual(distance, expected));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, expected));
}
@Test
public void testSymmetric10() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_YEAR );
Date date3 = new Date( date2.getTime() - MS_PER_WEEK );
Date date4 = new Date( date3.getTime() + MS_PER_YEAR );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testOverlappingByWeekInMonthRegions() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_MONTH );
Date date3 = new Date( date2.getTime() - MS_PER_WEEK );
Date date4 = new Date( date3.getTime() + MS_PER_MONTH );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
double expected = 1.0 - (2.0 * MS_PER_WEEK / (2.0 * MS_PER_MONTH));
assertTrue(isEqual(distance, expected));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, expected));
}
@Test
public void testSymmetric11() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_MONTH );
Date date3 = new Date( date2.getTime() - MS_PER_WEEK );
Date date4 = new Date( date3.getTime() + MS_PER_MONTH );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testOverlappingByMonthInYearRegions() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_YEAR );
Date date3 = new Date( date2.getTime() - MS_PER_MONTH );
Date date4 = new Date( date3.getTime() + MS_PER_YEAR );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
double expected = 1.0 - (2.0 * MS_PER_MONTH / (2.0 * MS_PER_YEAR));
assertTrue(isEqual(distance, expected));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, expected));
}
@Test
public void testSymmetric12() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_YEAR );
Date date3 = new Date( date2.getTime() - MS_PER_MONTH );
Date date4 = new Date( date3.getTime() + MS_PER_YEAR );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testOverlappingByFourMonthsInYearRegions() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_YEAR );
Date date3 = new Date( date2.getTime() - 4 * MS_PER_MONTH );
Date date4 = new Date( date3.getTime() + MS_PER_YEAR );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
double expected = 1.0 - (2.0 * 4 * MS_PER_MONTH / (2.0 * MS_PER_YEAR));
assertTrue(isEqual(distance, expected));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, expected));
}
@Test
public void testSymmetric13() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_YEAR );
Date date3 = new Date( date2.getTime() - 4 * MS_PER_MONTH );
Date date4 = new Date( date3.getTime() + MS_PER_YEAR );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testOverlappingByTenMonthsInYearRegions() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_YEAR );
Date date3 = new Date( date2.getTime() - 10 * MS_PER_MONTH );
Date date4 = new Date( date3.getTime() + MS_PER_YEAR );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
double expected = 1.0 - (2.0 * 10 * MS_PER_MONTH / (2.0 * MS_PER_YEAR));
assertTrue(isEqual(distance, expected));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, expected));
}
@Test
public void testSymmetric14() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_YEAR );
Date date3 = new Date( date2.getTime() - 10 * MS_PER_MONTH );
Date date4 = new Date( date3.getTime() + MS_PER_YEAR );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testTotalCoverSixDaysInRegions() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_MONTH );
Date date3 = new Date( date2.getTime() - 6 * MS_PER_DAY );
Date date4 = new Date( date3.getTime() + 6 * MS_PER_DAY );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double distance = d.distance(t1, t2);
double expected = 1.0 - (2.0 * 6 * MS_PER_DAY / (MS_PER_MONTH + 6 * MS_PER_DAY));
assertTrue(isEqual(distance, expected));
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
assertTrue(isEqual(distance, expected));
}
@Test
public void testSymmetric15() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_MONTH );
Date date3 = new Date( date2.getTime() - 6 * MS_PER_DAY );
Date date4 = new Date( date3.getTime() + 6 * MS_PER_DAY );
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.distance(t1, t2);
double d2 = d.distance(t2, t1);
assertTrue(isEqual(d1, d2));
d1 = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
d2 = d.aveMinDistance(Collections.singletonList(t2), Collections.singletonList(t1));
assertTrue(isEqual(d1, d2));
}
@Test
public void testOverlapEqualNumMultipleRegions() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_MONTH );
Date date3 = (new GregorianCalendar(2011, 01, 01)).getTime();
Date date4 = new Date( date1.getTime() + MS_PER_YEAR );
Date date5 = new Date( date2.getTime() - 6 * MS_PER_DAY );
Date date6 = new Date( date5.getTime() + 6 * MS_PER_DAY );
Date date7 = new Date( date4.getTime() - MS_PER_MONTH );
Date date8 = new Date( date7.getTime() + 6 * MS_PER_MONTH );
// Two identical points in time
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
List<TemporalFeature> set1 = new LinkedList<TemporalFeature>();
set1.add(t1);
set1.add(t2);
TemporalFeature t3 = new TemporalFeature();
t3.setValue(date5, date6);
TemporalFeature t4 = new TemporalFeature();
t4.setValue(date7, date8);
List<TemporalFeature> set2 = new LinkedList<TemporalFeature>();
set2.add(t3);
set2.add(t4);
TemporalDistance d = new TemporalDistance(1);
double expected = 0.8278084714548803;
double distance = d.aveMinDistance(set1, set2);
assertTrue(isEqual(distance, expected));
}
@Test
public void testSymmetric16() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_MONTH );
Date date3 = (new GregorianCalendar(2011, 01, 01)).getTime();
Date date4 = new Date( date1.getTime() + MS_PER_YEAR );
Date date5 = new Date( date2.getTime() - 6 * MS_PER_DAY );
Date date6 = new Date( date5.getTime() + 6 * MS_PER_DAY );
Date date7 = new Date( date4.getTime() - MS_PER_MONTH );
Date date8 = new Date( date7.getTime() + 6 * MS_PER_MONTH );
// Two identical points in time
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
List<TemporalFeature> set1 = new LinkedList<TemporalFeature>();
set1.add(t1);
set1.add(t2);
TemporalFeature t3 = new TemporalFeature();
t3.setValue(date5, date6);
TemporalFeature t4 = new TemporalFeature();
t4.setValue(date7, date8);
List<TemporalFeature> set2 = new LinkedList<TemporalFeature>();
set2.add(t3);
set2.add(t4);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.aveMinDistance(set1, set2);
double d2 = d.aveMinDistance(set2, set1);
assertTrue(isEqual(d1, d2));
}
@SuppressWarnings("unused")
@Test
public void testOverlapUnEqualNumMultipleRegions() {
Date date1 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_MONTH );
Date date3 = (new GregorianCalendar(2011, 01, 01)).getTime();
Date date4 = new Date( date1.getTime() + MS_PER_YEAR );
Date date5 = new Date( date2.getTime() - 6 * MS_PER_DAY );
Date date6 = new Date( date5.getTime() + 6 * MS_PER_DAY );
Date date7 = new Date( date4.getTime() - MS_PER_MONTH );
Date date8 = new Date( date7.getTime() + 6 * MS_PER_MONTH );
Date date9 = (new GregorianCalendar(2008, 01, 01)).getTime();
Date date10 = new Date( date9.getTime() + MS_PER_MONTH );
// Two identical points in time
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
Collection<TemporalFeature> set1 = new LinkedList<TemporalFeature>();
set1.add(t1);
set1.add(t2);
TemporalFeature t3 = new TemporalFeature();
t3.setValue(date5, date6);
TemporalFeature t4 = new TemporalFeature();
t4.setValue(date7, date8);
TemporalFeature t5 = new TemporalFeature();
t5.setValue(date9, date10);
Collection<TemporalFeature> set2 = new LinkedList<TemporalFeature>();
set2.add(t3);
set2.add(t4);
set2.add(t5);
TemporalDistance d = new TemporalDistance(1);
double expected = 0.8622467771639043;
long start = System.currentTimeMillis();
double distance = 0;
for (int i=0; i < 300000/**30000*/; i++) {
// distance = d.distance(t1, t2);
// distance = d.aveMinDistance(set1, set2);
distance = d.aveMinDistance(Collections.singletonList(t1), Collections.singletonList(t2));
}
double distanceTime = System.currentTimeMillis() - start;
System.out.println("Time: " + distanceTime/1000);
// assertTrue(isEqual(distance, expected));
}
@Test
public void testDisjointUnEqualNumMultipleRegions() {
Date date1 = (new GregorianCalendar(2007, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_MONTH );
Date date3 = (new GregorianCalendar(2008, 01, 01)).getTime();
Date date4 = new Date( date1.getTime() + MS_PER_YEAR );
Date date5 = (new GregorianCalendar(2009, 01, 01)).getTime();
Date date6 = new Date( date5.getTime() + 6 * MS_PER_DAY );
Date date7 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date8 = new Date( date7.getTime() + 6 * MS_PER_MONTH );
Date date9 = (new GregorianCalendar(2011, 01, 01)).getTime();
Date date10 = new Date( date9.getTime() + MS_PER_MONTH );
// Two identical points in time
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
List<TemporalFeature> set1 = new LinkedList<TemporalFeature>();
set1.add(t1);
set1.add(t2);
TemporalFeature t3 = new TemporalFeature();
t3.setValue(date5, date6);
TemporalFeature t4 = new TemporalFeature();
t4.setValue(date7, date8);
TemporalFeature t5 = new TemporalFeature();
t5.setValue(date9, date10);
List<TemporalFeature> set2 = new LinkedList<TemporalFeature>();
set2.add(t3);
set2.add(t4);
set2.add(t5);
TemporalDistance d = new TemporalDistance(1);
double expected = 1;
double distance = d.aveMinDistance(set1, set2);
assertTrue(isEqual(distance, expected));
}
@Test
public void testSymmetric17() {
Date date1 = (new GregorianCalendar(2007, 01, 01)).getTime();
Date date2 = new Date( date1.getTime() + MS_PER_MONTH );
Date date3 = (new GregorianCalendar(2008, 01, 01)).getTime();
Date date4 = new Date( date1.getTime() + MS_PER_YEAR );
Date date5 = (new GregorianCalendar(2009, 01, 01)).getTime();
Date date6 = new Date( date5.getTime() + 6 * MS_PER_DAY );
Date date7 = (new GregorianCalendar(2010, 01, 01)).getTime();
Date date8 = new Date( date7.getTime() + 6 * MS_PER_MONTH );
Date date9 = (new GregorianCalendar(2011, 01, 01)).getTime();
Date date10 = new Date( date9.getTime() + MS_PER_MONTH );
// Two identical points in time
TemporalFeature t1 = new TemporalFeature();
t1.setValue(date1, date2);
TemporalFeature t2 = new TemporalFeature();
t2.setValue(date3, date4);
List<TemporalFeature> set1 = new LinkedList<TemporalFeature>();
set1.add(t1);
set1.add(t2);
TemporalFeature t3 = new TemporalFeature();
t3.setValue(date5, date6);
TemporalFeature t4 = new TemporalFeature();
t4.setValue(date7, date8);
TemporalFeature t5 = new TemporalFeature();
t5.setValue(date9, date10);
List<TemporalFeature> set2 = new LinkedList<TemporalFeature>();
set2.add(t3);
set2.add(t4);
set2.add(t5);
TemporalDistance d = new TemporalDistance(1);
double d1 = d.aveMinDistance(set1, set2);
double d2 = d.aveMinDistance(set2, set1);
assertTrue(isEqual(d1, d2));
}
}