diff --git a/cdm/core/src/main/java/ucar/nc2/dataset/VariableDS.java b/cdm/core/src/main/java/ucar/nc2/dataset/VariableDS.java index 9228a994ba..5581a1faf4 100644 --- a/cdm/core/src/main/java/ucar/nc2/dataset/VariableDS.java +++ b/cdm/core/src/main/java/ucar/nc2/dataset/VariableDS.java @@ -944,7 +944,7 @@ private void createEnhancements() { this.normalizer = Normalizer.createFromVariable(this); } Attribute classifierAtt = findAttribute(CDM.CLASSIFY); - if (classifierAtt != null && this.enhanceMode.contains(Enhance.ApplyClassifier) && dataType.isFloatingPoint()) { + if (classifierAtt != null && this.enhanceMode.contains(Enhance.ApplyClassifier) && dataType.isNumeric()) { this.classifier = Classifier.createFromVariable(this); } } diff --git a/cdm/core/src/main/java/ucar/nc2/filter/Classifier.java b/cdm/core/src/main/java/ucar/nc2/filter/Classifier.java index 15103529d2..650b273d59 100644 --- a/cdm/core/src/main/java/ucar/nc2/filter/Classifier.java +++ b/cdm/core/src/main/java/ucar/nc2/filter/Classifier.java @@ -15,51 +15,21 @@ public class Classifier implements Enhancement { public static Classifier createFromVariable(VariableDS var) { try { Array arr = var.read(); - DataType type = var.getDataType(); - return createFromArray(arr, type); + // DataType type = var.getDataType(); + return emptyClassifier(); } catch (IOException e) { return emptyClassifier(); } } - public static Classifier createFromArray(Array arr, DataType type) { - /** what is the type of array? */ - return new Classifier(arr, type); - - } - public static Classifier emptyClassifier() { emptyClassifier = new Classifier(); return emptyClassifier; } - /** wEmpty in case data not good */ + /** Enough of a constructor */ public Classifier() {} - private Classifier(Array arr, DataType type) { - classifier = new Classifier(); - /** how about doubles? */ - - } - - /** Classify integer array */ - public int[] classifyIntArray(Array arr) { - classifiedArray = new int[(int) arr.getSize()]; - int i = 0; - IndexIterator iterArr = arr.getIndexIterator(); - while (iterArr.hasNext()) { - Number value = (Number) iterArr.getObjectNext(); - if (value.intValue() < 0) { - classifiedArray[i] = 0; - } else { - classifiedArray[i] = 1; - } - i++; - } - - return classifiedArray; - } - /** Classify double array */ public int[] classifyDoubleArray(Array arr) { int[] classifiedArray = new int[(int) arr.getSize()]; @@ -68,30 +38,8 @@ public int[] classifyDoubleArray(Array arr) { while (iterArr.hasNext()) { Number value = (Number) iterArr.getObjectNext(); if (!Double.isNaN(value.doubleValue())) { - if (value.doubleValue() < 0) { - classifiedArray[i] = 0; - } else { - classifiedArray[i] = 1; - } - } - i++; - } - return classifiedArray; - } - /** Classify float array */ - public int[] classifyFloatArray(Array arr) { - int[] classifiedArray = new int[(int) arr.getSize()]; - int i = 0; - IndexIterator iterArr = arr.getIndexIterator(); - while (iterArr.hasNext()) { - Number value = (Number) iterArr.getObjectNext(); - if (!Float.isNaN(value.floatValue())) { - if (value.floatValue() < 0) { - classifiedArray[i] = 0; - } else { - classifiedArray[i] = 1; - } + classifiedArray[i] = classifyArray(value.doubleValue()); } i++; } @@ -111,47 +59,12 @@ public int classifyArray(double val) { return classifiedVal; } - /** for a single float */ - public int classifyArray(float val) { - if (val >= 0) { - classifiedVal = 1; - } else { - classifiedVal = 0; - } - - return classifiedVal; - } - - /** for a single int ? */ - public int classifyArray(int val) { - if (val >= 0) { - classifiedVal = 1; - } else { - classifiedVal = 0; - } - - return classifiedVal; - } - - /** - * Method to classify int array - * maybe not needed if enhancement applied only to doubles and floats? - */ - - - @Override public double convert(double val) { - return classifier.classifyArray(val); + return emptyClassifier.classifyArray(val); } - public double convert(float val) { - return classifier.classifyArray(val); - } - public double convert(int val) { - return classifier.classifyArray(val); - } } diff --git a/cdm/core/src/test/data/ncml/enhance/testClassifier.ncml b/cdm/core/src/test/data/ncml/enhance/testClassifier.ncml index 8d21e2f8f1..b649675d99 100644 --- a/cdm/core/src/test/data/ncml/enhance/testClassifier.ncml +++ b/cdm/core/src/test/data/ncml/enhance/testClassifier.ncml @@ -40,6 +40,15 @@ 1 2 3 4 5 + + + -1.0 -2.0 -3.0 -4.0 -5.0 + + + + 1.0 -2.0 0.0 4.0 -5.0 + + diff --git a/cdm/core/src/test/java/ucar/nc2/filter/TestClassifier.java b/cdm/core/src/test/java/ucar/nc2/filter/TestClassifier.java index 91ec9a23cf..967861064e 100644 --- a/cdm/core/src/test/java/ucar/nc2/filter/TestClassifier.java +++ b/cdm/core/src/test/java/ucar/nc2/filter/TestClassifier.java @@ -6,41 +6,8 @@ public class TestClassifier { - @Test - public void testClassifyIntArray_AllPositive() { - Classifier classifier = new Classifier(); - int[] input = {1, 2, 3}; - int[] expected = {1, 1, 1}; - Array DATA = Array.makeFromJavaArray(input); - assertArrayEquals(expected, classifier.classifyIntArray(DATA)); - } - @Test - public void testClassifyIntArray_AllNegative() { - Classifier classifier = new Classifier(); - int[] input = {-1, -2, -3}; - int[] expected = {0, 0, 0}; - Array DATA = Array.makeFromJavaArray(input); - assertArrayEquals(expected, classifier.classifyIntArray(DATA)); - } - @Test - public void testClassifyIntArray_Mixed() { - Classifier classifier = new Classifier(); - int[] input = {-1, 2, -3, 4}; - int[] expected = {0, 1, 0, 1}; - Array DATA = Array.makeFromJavaArray(input); - assertArrayEquals(expected, classifier.classifyIntArray(DATA)); - } - - @Test - public void testClassifyIntArray_WithZero() { - Classifier classifier = new Classifier(); - int[] input = {0, -1, 1, 0, 0, 0}; - int[] expected = {1, 0, 1, 1, 1, 1}; - Array DATA = Array.makeFromJavaArray(input); - assertArrayEquals(expected, classifier.classifyIntArray(DATA)); - } /** test doubles */ @Test @@ -81,43 +48,4 @@ public void testClassifyDoubleArray_WithZero() { - /** testing with floats */ - @Test - public void testClassifyFloatArray_AllPositive() { - Classifier classifier = new Classifier(); - float[] input = {1.1f, 2.2f, 3.3f}; - int[] expected = {1, 1, 1}; - Array DATA = Array.makeFromJavaArray(input); - assertArrayEquals(expected, classifier.classifyFloatArray(DATA)); - } - - @Test - public void testClassifyFloatArray_AllNegative() { - Classifier classifier = new Classifier(); - float[] input = {-1.1f, -2.2f, -3.3f}; - int[] expected = {0, 0, 0}; - Array DATA = Array.makeFromJavaArray(input); - assertArrayEquals(expected, classifier.classifyFloatArray(DATA)); - } - - @Test - public void testClassifyFloatArray_Mixed() { - Classifier classifier = new Classifier(); - float[] input = {-1.1f, 2.2f, -3.3f, 4.4f}; - int[] expected = {0, 1, 0, 1}; - Array DATA = Array.makeFromJavaArray(input); - assertArrayEquals(expected, classifier.classifyFloatArray(DATA)); - } - - @Test - public void testClassifyFloatArray_WithZero() { - Classifier classifier = new Classifier(); - float[] input = {0.0f, -1.1f, 1.1f}; - int[] expected = {1, 0, 1}; - Array DATA = Array.makeFromJavaArray(input); - assertArrayEquals(expected, classifier.classifyFloatArray(DATA)); - } - - - } diff --git a/cdm/core/src/test/java/ucar/nc2/ncml/TestEnhanceClassifier.java b/cdm/core/src/test/java/ucar/nc2/ncml/TestEnhanceClassifier.java index c324dbae64..00fac9b05d 100644 --- a/cdm/core/src/test/java/ucar/nc2/ncml/TestEnhanceClassifier.java +++ b/cdm/core/src/test/java/ucar/nc2/ncml/TestEnhanceClassifier.java @@ -22,8 +22,7 @@ public class TestEnhanceClassifier { public static final Array DATA_all_zeroes = Array.makeFromJavaArray(all_zeroes); public static final int[] mixNumbers = {1, 0, 1, 1, 0}; public static final Array DATA_mixNumbers = Array.makeFromJavaArray(mixNumbers); - public static final int[] inttest = {1, 2, 3, 4, 5}; - public static final Array DATA_inttest = Array.makeFromJavaArray(inttest); + /** test on doubles, all positives, all negatives and a mixed array */ @Test @@ -59,8 +58,8 @@ public void testEnhanceClassifier_doubles() throws IOException { @Test public void testEnhanceClassifier_floats() throws IOException { try (NetcdfFile ncfile = NetcdfDatasets.openDataset(dataDir + "testClassifier.ncml", true, null)) { - Variable floatPositives = ncfile.findVariable("floatPositives"); + Variable floatPositives = ncfile.findVariable("floatPositives"); assertThat((Object) floatPositives).isNotNull(); assertThat(floatPositives.getDataType()).isEqualTo(DataType.FLOAT); assertThat(floatPositives.attributes().hasAttribute("classify")).isTrue(); @@ -95,9 +94,21 @@ public void testEnhanceClassifier_integers() throws IOException { assertThat(IntegerPositives.getDataType()).isEqualTo(DataType.INT); assertThat(IntegerPositives.attributes().hasAttribute("classify")).isTrue(); Array dataIntegers = IntegerPositives.read(); - assertThat(nearlyEquals(dataIntegers, DATA_inttest)).isTrue(); - - + assertThat(nearlyEquals(dataIntegers, DATA_all_ones)).isTrue(); + + Variable intNegatives = ncfile.findVariable("intNegatives"); + assertThat((Object) intNegatives).isNotNull(); + assertThat(intNegatives.getDataType()).isEqualTo(DataType.INT); + assertThat(intNegatives.attributes().hasAttribute("classify")).isTrue(); + Array dataintNegatives = intNegatives.read(); + assertThat(nearlyEquals(dataintNegatives, DATA_all_zeroes)).isTrue(); + + Variable intMix = ncfile.findVariable("intMix"); + assertThat((Object) intMix).isNotNull(); + assertThat(intMix.getDataType()).isEqualTo(DataType.INT); + assertThat(intMix.attributes().hasAttribute("classify")).isTrue(); + Array dataintMix = intMix.read(); + assertThat(nearlyEquals(dataintMix, DATA_mixNumbers)).isTrue(); } }