Skip to content

Commit

Permalink
changes from code review comments
Browse files Browse the repository at this point in the history
  • Loading branch information
matakleo committed Jun 6, 2024
1 parent 1f71783 commit 56727d0
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 171 deletions.
2 changes: 1 addition & 1 deletion cdm/core/src/main/java/ucar/nc2/dataset/VariableDS.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Expand Down
97 changes: 5 additions & 92 deletions cdm/core/src/main/java/ucar/nc2/filter/Classifier.java
Original file line number Diff line number Diff line change
Expand Up @@ -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()];
Expand All @@ -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++;
}
Expand All @@ -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);
}
}


9 changes: 9 additions & 0 deletions cdm/core/src/test/data/ncml/enhance/testClassifier.ncml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,15 @@
<values>1 2 3 4 5</values>
</variable>

<variable name="intNegatives" shape="5" type="int">
<attribute name="classify"/>
<values>-1.0 -2.0 -3.0 -4.0 -5.0</values>
</variable>
<variable name="intMix" shape="5" type="int">
<attribute name="classify"/>
<values>1.0 -2.0 0.0 4.0 -5.0</values>
</variable>



</netcdf>
72 changes: 0 additions & 72 deletions cdm/core/src/test/java/ucar/nc2/filter/TestClassifier.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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));
}



}
23 changes: 17 additions & 6 deletions cdm/core/src/test/java/ucar/nc2/ncml/TestEnhanceClassifier.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
}

}
Expand Down

0 comments on commit 56727d0

Please sign in to comment.