Skip to content

Commit

Permalink
Fix optional handling and misc small fixes (#16)
Browse files Browse the repository at this point in the history
    Properly handle optional files
    Use enhanced switch where possible
    Check if element is null before getting as float
    Optimize imports
    Add description method (slightly pointless)
  • Loading branch information
alanocallaghan authored Feb 5, 2025
1 parent 7578c59 commit d2e0175
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 41 deletions.
8 changes: 3 additions & 5 deletions src/main/java/qupath/bioimageio/spec/Model.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand Down Expand Up @@ -285,7 +284,7 @@ public List<String> getTestInputs() {
if (ti.isEmpty() && isFormatNewerThan("0.5")) {
ti = inputs.stream()
.map(BaseTensor::getTestTensor)
.map(fd -> fd.get().source())
.map(ofd -> ofd.orElse(NULL_FILE).source())
.collect(Collectors.toList());
}
return toUnmodifiableList(ti);
Expand All @@ -304,8 +303,7 @@ public List<String> getTestOutputs() {
if (to.isEmpty() && isFormatNewerThan("0.5")) {
to = outputs.stream()
.map(BaseTensor::getTestTensor)
.map(ofd -> ofd.flatMap(fd -> Optional.of(fd.source())))
.map(Object::toString)
.map(ofd -> ofd.orElse(NULL_FILE).source())
.collect(Collectors.toList());
}
return toUnmodifiableList(to);
Expand Down Expand Up @@ -412,7 +410,7 @@ private static Path findRdf(Path path, Collection<String> names) throws IOExcept
if (Files.isDirectory(path)) {
// Check directory
try (Stream<Path> pathStream = Files.list(path)) {
List<Path> yamlFiles = pathStream.filter(Model::isYamlPath).collect(Collectors.toList());
List<Path> yamlFiles = pathStream.filter(Model::isYamlPath).toList();
if (yamlFiles.isEmpty())
return null;
if (yamlFiles.size() == 1)
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/qupath/bioimageio/spec/Resource.java
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ public String getFormatVersion() {
}

/**
* A [SPDX license identifier](https://spdx.org/licenses/).
* A <a href="https://spdx.org/licenses/">SPDX license identifier</a>.
* We do not support custom license beyond the SPDX license list.
* @return the license
*/
Expand Down
62 changes: 35 additions & 27 deletions src/main/java/qupath/bioimageio/spec/tensor/Processing.java
Original file line number Diff line number Diff line change
Expand Up @@ -354,53 +354,61 @@ public Processing deserialize(JsonElement json, Type typeOfT, JsonDeserializatio
var obj = json.getAsJsonObject();
var name = obj.has("name") ? obj.get("name").getAsString() : obj.get("id").getAsString();
JsonObject kwargs = deserializeField(context, obj, "kwargs", JsonObject.class, null);
switch (name) {
case "binarize":
var binarize = new Processing.Binarize();
return switch (name) {
case "binarize" -> {
var binarize = new Binarize();
binarize.threshold = deserializeField(context, kwargs, "threshold", Double.class, true);
return binarize;
case "clip":
var clip = new Processing.Clip();
yield binarize;
}
case "clip" -> {
var clip = new Clip();
clip.min = deserializeField(context, kwargs, "min", Double.class, Double.NEGATIVE_INFINITY);
clip.max = deserializeField(context, kwargs, "max", Double.class, Double.POSITIVE_INFINITY);
return clip;
case "scale_linear":
var scaleLinear = new Processing.ScaleLinear();
yield clip;
}
case "scale_linear" -> {
var scaleLinear = new ScaleLinear();
scaleLinear.axes = deserializeField(context, kwargs, "axes", Axis[].class, false);
scaleLinear.gain = deserializeField(context, kwargs, "gain", double[].class, false);
scaleLinear.offset = deserializeField(context, kwargs, "offset", double[].class, false);
return scaleLinear;
case "scale_mean_variance":
var scaleMeanVariance = new Processing.ScaleMeanVariance();
scaleMeanVariance.mode = deserializeField(context, kwargs, "mode", Processing.ProcessingMode.class, false);
yield scaleLinear;
}
case "scale_mean_variance" -> {
var scaleMeanVariance = new ScaleMeanVariance();
scaleMeanVariance.mode = deserializeField(context, kwargs, "mode", ProcessingMode.class, false);
scaleMeanVariance.axes = deserializeField(context, kwargs, "axes", Axis[].class, false);
scaleMeanVariance.eps = deserializeField(context, kwargs, "eps", Double.class, 1e-6);
scaleMeanVariance.referenceTensor = deserializeField(context, kwargs, "reference_tensor", String.class, null);
return scaleMeanVariance;
case "scale_range":
var scaleRange = new Processing.ScaleRange();
scaleRange.mode = deserializeField(context, kwargs, "mode", Processing.ProcessingMode.class, false);
yield scaleMeanVariance;
}
case "scale_range" -> {
var scaleRange = new ScaleRange();
scaleRange.mode = deserializeField(context, kwargs, "mode", ProcessingMode.class, false);
scaleRange.axes = deserializeField(context, kwargs, "axes", Axis[].class, false);
scaleRange.eps = deserializeField(context, kwargs, "eps", Double.class, 1e-6);
scaleRange.referenceTensor = deserializeField(context, obj, "reference_tensor", String.class, null);
scaleRange.maxPercentile = deserializeField(context, kwargs, "max_percentile", Double.class, 0.0);
scaleRange.minPercentile = deserializeField(context, kwargs, "min_percentile", Double.class, 100.0);
return scaleRange;
case "sigmoid":
return new Processing.Sigmoid();
case "zero_mean_unit_variance":
var zeroMeanUnitVariance = new Processing.ZeroMeanUnitVariance();
zeroMeanUnitVariance.mode = deserializeField(context, kwargs, "mode", Processing.ProcessingMode.class, false);
yield scaleRange;
}
case "sigmoid" -> {
yield new Sigmoid();
}
case "zero_mean_unit_variance" -> {
var zeroMeanUnitVariance = new ZeroMeanUnitVariance();
zeroMeanUnitVariance.mode = deserializeField(context, kwargs, "mode", ProcessingMode.class, false);
zeroMeanUnitVariance.axes = deserializeField(context, kwargs, "axes", Axis[].class, false);
zeroMeanUnitVariance.eps = deserializeField(context, kwargs, "eps", Double.class, 1e-6);
zeroMeanUnitVariance.mean = deserializeField(context, kwargs, "mean", double[].class, false);
zeroMeanUnitVariance.std = deserializeField(context, kwargs, "std", double[].class, false);
return zeroMeanUnitVariance;
default:
yield zeroMeanUnitVariance;
}
default -> {
var processing = new Processing(name);
processing.kwargs = kwargs == null ? Collections.emptyMap() : context.deserialize(kwargs, Map.class);
return processing;
}
yield processing;
}
};
}

}
Expand Down
7 changes: 5 additions & 2 deletions src/main/java/qupath/bioimageio/spec/tensor/Tensors.java
Original file line number Diff line number Diff line change
Expand Up @@ -214,8 +214,11 @@ public qupath.bioimageio.spec.tensor.TensorDataDescription deserialize(JsonEleme
range = List.of(Optional.empty(), Optional.empty());
} else {
range = r.getAsJsonArray().asList().stream()
.map(JsonElement::getAsFloat)
.map(Optional::of)
.map(je -> {
Optional<Float> o ;
o = je.isJsonNull() ? Optional.empty() : Optional.of(je.getAsFloat());
return o;
})
.collect(Collectors.toList());
}
JsonElement unit = jsonObject.get("unit");
Expand Down
7 changes: 1 addition & 6 deletions src/main/java/qupath/bioimageio/spec/tensor/axes/Axis.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,10 @@

package qupath.bioimageio.spec.tensor.axes;

import com.google.gson.JsonDeserializer;
import qupath.bioimageio.spec.tensor.sizes.Size;
import qupath.bioimageio.spec.tensor.BaseTensor;
import qupath.bioimageio.spec.tensor.sizes.Size;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
* Base axis class for 0.4 and 0.5 axes.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,12 @@ abstract class AxisBase implements Axis {
public String getID() {
return this.id;
}

/**
* Gets the description of the axis, if present
* @return the free text description (usually null)
*/
public String getDescription() {
return description;
}
}

0 comments on commit d2e0175

Please sign in to comment.