summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorArne Juul <arnej@yahooinc.com>2023-11-30 13:48:01 +0000
committerArne Juul <arnej@yahooinc.com>2023-12-11 08:47:15 +0000
commit055b84652f6a0c9b517c76588c145d92216f6e02 (patch)
tree635c1763de83261409293d6ae9edb8fc03e9a51d /config-model
parent18e3fb5c91e9e40d46fccc1b8988c445f27ec19e (diff)
add parsing of special strings for inf/nan cell values
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/ConstantTensorJsonValidator.java16
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/application/validation/ConstantTensorJsonValidatorTest.java9
2 files changed, 22 insertions, 3 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/ConstantTensorJsonValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/ConstantTensorJsonValidator.java
index fcb99215565..c41c6e59a4f 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/ConstantTensorJsonValidator.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/ConstantTensorJsonValidator.java
@@ -7,6 +7,8 @@ import com.fasterxml.jackson.core.JsonToken;
import com.google.common.base.Joiner;
import com.yahoo.tensor.TensorType;
+import static com.yahoo.tensor.serialization.JsonFormat.decodeNumberString;
+
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
@@ -282,9 +284,19 @@ public class ConstantTensorJsonValidator {
}
private void validateNumeric(String where, JsonToken token) throws IOException {
- if (token != JsonToken.VALUE_NUMBER_FLOAT && token != JsonToken.VALUE_NUMBER_INT) {
- throw new InvalidConstantTensorException(parser, String.format("Inside '%s': cell value is not a number (%s)", where, token.toString()));
+ if (token == JsonToken.VALUE_NUMBER_FLOAT || token == JsonToken.VALUE_NUMBER_INT) {
+ return; // ok
+ }
+ if (token == JsonToken.VALUE_STRING) {
+ String input = parser.getValueAsString();
+ try {
+ double d = decodeNumberString(input);
+ return;
+ } catch (NumberFormatException e) {
+ throw new InvalidConstantTensorException(parser, String.format("Inside '%s': %s", where, e.getMessage()));
+ }
}
+ throw new InvalidConstantTensorException(parser, String.format("Inside '%s': cell value is not a number (%s)", where, token.toString()));
}
private void assertCurrentTokenIs(JsonToken wantedToken) {
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ConstantTensorJsonValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ConstantTensorJsonValidatorTest.java
index 4892c9acefa..9171aae170c 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ConstantTensorJsonValidatorTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ConstantTensorJsonValidatorTest.java
@@ -208,7 +208,7 @@ public class ConstantTensorJsonValidatorTest {
" ]",
"}"));
});
- assertTrue(exception.getMessage().contains("Inside 'value': cell value is not a number (VALUE_STRING)"));
+ assertTrue(exception.getMessage().contains("Inside 'value': Excepted a number, got string 'fruit'"));
}
@Test
@@ -295,6 +295,13 @@ public class ConstantTensorJsonValidatorTest {
}
@Test
+ void ensure_that_values_can_contain_special_values() {
+ validateTensorJson(
+ TensorType.fromSpec("tensor(x[5])"),
+ inputJsonToReader("['Infinity','+inf','NaN','-infinity','-nan']"));
+ }
+
+ @Test
void ensure_that_simple_object_for_map_works() {
validateTensorJson(
TensorType.fromSpec("tensor(x{})"),