package mil.nga.giat.geowave.analytic.mapreduce.kmeans.runner;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import mil.nga.giat.geowave.analytic.AnalyticItemWrapper;
import mil.nga.giat.geowave.analytic.PropertyManagement;
import mil.nga.giat.geowave.analytic.clustering.CentroidManager;
import mil.nga.giat.geowave.analytic.clustering.LongCentroid;
import mil.nga.giat.geowave.analytic.clustering.exception.MatchingCentroidNotFoundException;
import mil.nga.giat.geowave.analytic.mapreduce.kmeans.runner.StripWeakCentroidsRunner.MaxChangeBreakStrategy;
import mil.nga.giat.geowave.analytic.mapreduce.kmeans.runner.StripWeakCentroidsRunner.StableChangeBreakStrategy;
import mil.nga.giat.geowave.analytic.mapreduce.kmeans.runner.StripWeakCentroidsRunner.TailMaxBreakStrategy;
import mil.nga.giat.geowave.analytic.mapreduce.kmeans.runner.StripWeakCentroidsRunner.TailStableChangeBreakStrategy;
import mil.nga.giat.geowave.core.geotime.ingest.SpatialDimensionalityTypeProvider;
import mil.nga.giat.geowave.core.index.ByteArrayId;
import mil.nga.giat.geowave.core.index.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.junit.Assert;
import org.junit.Test;
import com.vividsolutions.jts.geom.Coordinate;
public class StripWeakCentroidsRunnerTest
{
@Test
public void testStable()
throws Exception {
final StripWeakCentroidsRunnerForTest testObj = new StripWeakCentroidsRunnerForTest(
60,
62);
testObj.setBreakStrategy(new StableChangeBreakStrategy<Long>());
testObj.run(
new Configuration(),
new PropertyManagement());
}
@Test
public void testStable1()
throws Exception {
final List<AnalyticItemWrapper<Long>> list = new ArrayList<AnalyticItemWrapper<Long>>();
final int cnts[] = new int[] {
1000,
851,
750,
650,
525,
200,
100,
90,
70
};
for (int i = 0; i < cnts.length; i++) {
list.add(new LongCentroid(
i,
"",
cnts[i]));
}
final StableChangeBreakStrategy<Long> breakS = new StableChangeBreakStrategy<Long>();
assertEquals(
5,
breakS.getBreakPoint(list));
}
@Test
public void testStableUniform()
throws Exception {
final List<AnalyticItemWrapper<Long>> list = new ArrayList<AnalyticItemWrapper<Long>>();
final int cnts[] = new int[] {
1000,
851,
750,
650,
525,
200,
100,
90,
70
};
for (int i = 0; i < cnts.length; i++) {
list.add(new LongCentroid(
i,
"",
cnts[i]));
}
final TailStableChangeBreakStrategy<Long> breakS = new TailStableChangeBreakStrategy<Long>();
assertEquals(
5,
breakS.getBreakPoint(list));
}
@Test
public void testMaxDense()
throws Exception {
final List<AnalyticItemWrapper<Long>> list = new ArrayList<AnalyticItemWrapper<Long>>();
final int cnts[] = new int[] {
900,
600,
800,
};
for (int i = 0; i < cnts.length; i++) {
list.add(new LongCentroid(
i,
"",
cnts[i]));
}
final TailMaxBreakStrategy<Long> breakS = new TailMaxBreakStrategy<Long>();
assertEquals(
3,
breakS.getBreakPoint(list));
}
@Test
public void testMaxUniform()
throws Exception {
final List<AnalyticItemWrapper<Long>> list = new ArrayList<AnalyticItemWrapper<Long>>();
final int cnts[] = new int[] {
1000,
851,
750,
650,
525,
200,
90,
70
};
for (int i = 0; i < cnts.length; i++) {
list.add(new LongCentroid(
i,
"",
cnts[i]));
}
final TailMaxBreakStrategy<Long> breakS = new TailMaxBreakStrategy<Long>();
assertEquals(
5,
breakS.getBreakPoint(list));
}
@Test
public void testCliffMean()
throws Exception {
final StripWeakCentroidsRunnerForTest testObj = new StripWeakCentroidsRunnerForTest(
79,
81);
testObj.setBreakStrategy(new MaxChangeBreakStrategy<Long>());
testObj.run(
new Configuration(),
new PropertyManagement());
}
@Test
public void testCliff()
throws Exception {
final StripWeakCentroidsRunnerForTestOne testObj = new StripWeakCentroidsRunnerForTestOne();
testObj.run(
new Configuration(),
new PropertyManagement());
}
private static class StripWeakCentroidsRunnerForTest extends
StripWeakCentroidsRunner<Long>
{
private final List<AnalyticItemWrapper<Long>> testSet;
private final int min;
private final int max;
StripWeakCentroidsRunnerForTest(
final int min,
final int max ) {
super();
this.min = min;
this.max = max;
testSet = load();
}
@Override
protected CentroidManager<Long> constructCentroidManager(
final Configuration config,
final PropertyManagement runTimeProperties )
throws IOException {
return new CentroidManager<Long>() {
@Override
public AnalyticItemWrapper<Long> createNextCentroid(
final Long feature,
final String groupID,
final Coordinate coordinate,
final String[] extraNames,
final double[] extraValues ) {
return new LongCentroid(
feature,
groupID,
1);
}
@Override
public void clear() {
}
@Override
public void delete(
final String[] dataIds )
throws IOException {
Assert.assertTrue(
dataIds.length + "<=" + max,
dataIds.length <= max);
Assert.assertTrue(
dataIds.length + ">=" + min,
dataIds.length >= min);
}
@Override
public List<String> getAllCentroidGroups()
throws IOException {
return Arrays.asList("1");
}
@Override
public List<AnalyticItemWrapper<Long>> getCentroidsForGroup(
final String groupID )
throws IOException {
Assert.assertEquals(
"1",
groupID);
return testSet;
}
@Override
public List<AnalyticItemWrapper<Long>> getCentroidsForGroup(
final String batchID,
final String groupID )
throws IOException {
Assert.assertEquals(
"1",
groupID);
return testSet;
}
@Override
public int processForAllGroups(
final mil.nga.giat.geowave.analytic.clustering.CentroidManager.CentroidProcessingFn<Long> fn )
throws IOException {
return fn.processGroup(
"1",
testSet);
}
@Override
public AnalyticItemWrapper<Long> getCentroid(
final String id ) {
// TODO Auto-generated method stub
return null;
}
@Override
public ByteArrayId getDataTypeId() {
return new ByteArrayId(
StringUtils.stringToBinary("centroid"));
}
@Override
public ByteArrayId getIndexId() {
return new SpatialDimensionalityTypeProvider().createPrimaryIndex().getId();
}
@Override
public AnalyticItemWrapper<Long> getCentroidById(
final String id,
final String groupID )
throws IOException,
MatchingCentroidNotFoundException {
Assert.assertEquals(
"1",
groupID);
throw new MatchingCentroidNotFoundException(
id);
}
};
}
private List<AnalyticItemWrapper<Long>> load() {
final Random rand = new Random(
2331);
int begin = 100000000;
final List<AnalyticItemWrapper<Long>> centroids = new ArrayList<AnalyticItemWrapper<Long>>();
for (int i = 0; i <= 100; i++) {
if ((i > 0) && ((i % 20) == 0)) {
begin /= (Math.pow(
100,
i / 20));
}
centroids.add(new LongCentroid(
i,
"",
(int) (Math.abs(rand.nextDouble() * 10000) + begin)));
}
return centroids;
}
}
private static class StripWeakCentroidsRunnerForTestOne extends
StripWeakCentroidsRunner<Long>
{
private final List<AnalyticItemWrapper<Long>> testSet = Arrays
.asList((AnalyticItemWrapper<Long>) new LongCentroid(
1L,
"",
22));
StripWeakCentroidsRunnerForTestOne() {
super();
}
@Override
protected CentroidManager<Long> constructCentroidManager(
final Configuration config,
final PropertyManagement runTimeProperties )
throws IOException {
return new CentroidManager<Long>() {
@Override
public AnalyticItemWrapper<Long> createNextCentroid(
final Long feature,
final String groupID,
final Coordinate coordinate,
final String[] extraNames,
final double[] extraValues ) {
return new LongCentroid(
feature,
groupID,
1);
}
@Override
public void clear() {
}
@Override
public void delete(
final String[] dataIds )
throws IOException {
Assert.assertFalse(true);
}
@Override
public List<String> getAllCentroidGroups()
throws IOException {
return Arrays.asList("1");
}
@Override
public List<AnalyticItemWrapper<Long>> getCentroidsForGroup(
final String groupID )
throws IOException {
Assert.assertEquals(
"1",
groupID);
return testSet;
}
@Override
public List<AnalyticItemWrapper<Long>> getCentroidsForGroup(
final String batchID,
final String groupID )
throws IOException {
Assert.assertEquals(
"1",
groupID);
return testSet;
}
@Override
public int processForAllGroups(
final mil.nga.giat.geowave.analytic.clustering.CentroidManager.CentroidProcessingFn<Long> fn )
throws IOException {
return fn.processGroup(
"1",
testSet);
}
@Override
public AnalyticItemWrapper<Long> getCentroid(
final String id ) {
// TODO Auto-generated method stub
return null;
}
@Override
public ByteArrayId getDataTypeId() {
return new ByteArrayId(
StringUtils.stringToBinary("centroid"));
}
@Override
public ByteArrayId getIndexId() {
return new SpatialDimensionalityTypeProvider().createPrimaryIndex().getId();
}
@Override
public AnalyticItemWrapper<Long> getCentroidById(
final String id,
final String groupID )
throws IOException,
MatchingCentroidNotFoundException {
Assert.assertEquals(
"1",
groupID);
throw new MatchingCentroidNotFoundException(
id);
}
};
}
}
}