summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-05-06 16:31:47 +0200
committerJon Bratseth <bratseth@gmail.com>2022-05-06 16:31:47 +0200
commit1f33495b8170f41f8d4a6a53d17e4471a464a8a0 (patch)
tree60684760dfb3b510b16b46e789e53f6e8efc3ee0
parent719332f44bdb9a6337f62751ef7891d34a60d815 (diff)
Parse mixed tensor short form
-rw-r--r--config-model/src/main/javacc/IntermediateParser.jj40
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/search/test/SchemaInfoTestCase.java7
2 files changed, 37 insertions, 10 deletions
diff --git a/config-model/src/main/javacc/IntermediateParser.jj b/config-model/src/main/javacc/IntermediateParser.jj
index 2520101fbc6..57fa9e4142c 100644
--- a/config-model/src/main/javacc/IntermediateParser.jj
+++ b/config-model/src/main/javacc/IntermediateParser.jj
@@ -39,6 +39,7 @@ import com.yahoo.searchlib.rankingexpression.Reference;
import com.yahoo.searchlib.rankingexpression.evaluation.TensorValue;
import com.yahoo.searchlib.rankingexpression.evaluation.Value;
import com.yahoo.tensor.Tensor;
+import com.yahoo.tensor.MixedTensor;
import com.yahoo.tensor.TensorType;
import com.yahoo.tensor.TensorAddress;
@@ -2476,7 +2477,7 @@ Tensor tensorValue(TensorType type) :
Tensor.Builder builder = Tensor.Builder.of(type);
}
{
- ( mappedTensorValue(builder) | indexedTensorValues(new TensorAddress.Builder(TensorType.empty).build(), builder) )
+ ( mappedTensorValue(builder) | indexedTensorValues(builder) )
{ return builder.build(); }
}
@@ -2489,19 +2490,35 @@ void mappedTensorValue(Tensor.Builder builder) : {}
void mappedTensorBlock(Tensor.Builder builder) :
{
- TensorAddress address;
+ TensorAddress mappedAddress;
}
{
- address = tensorAddress(builder.type()) <COLON> (<NL>)*
- ( mappedTensorCellValue(address, builder) | indexedTensorValues(address, builder) )
+ mappedAddress = tensorAddress(builder.type().mappedSubtype()) <COLON> (<NL>)*
+ ( mappedTensorCellValue(mappedAddress, builder) | indexedTensorBlockValues(mappedAddress, builder) )
}
-void indexedTensorValues(TensorAddress partialAddress, Tensor.Builder builder) :
+void indexedTensorBlockValues(TensorAddress sparseAddress, Tensor.Builder builder) :
{
- List<Double> values = new ArrayList<Double>();
+ List<Double> values;
}
{
- "[" ( indexedTensorValue(values) )* ( <COMMA> (<NL>)* indexedTensorValue(values) )* "]"
+ values = arrayTensorValues()
+ {
+ MixedTensor.BoundBuilder boundBuilder = (MixedTensor.BoundBuilder)builder;
+ double[] arrayValues = new double[values.size()];
+ for (int i = 0; i < values.size(); i++ ) {
+ arrayValues[i] = values.get(i);
+ }
+ boundBuilder.block(sparseAddress, arrayValues);
+ }
+}
+
+void indexedTensorValues(Tensor.Builder builder) :
+{
+ List<Double> values;
+}
+{
+ values = arrayTensorValues()
{
for (int i = 0; i < values.size(); i++ ) {
TensorAddress.Builder addressBuilder = new TensorAddress.Builder(builder.type());
@@ -2511,6 +2528,15 @@ void indexedTensorValues(TensorAddress partialAddress, Tensor.Builder builder) :
}
}
+List<Double> arrayTensorValues() :
+{
+ List<Double> values = new ArrayList<Double>();
+}
+{
+ "[" ( indexedTensorValue(values) )* ( <COMMA> (<NL>)* indexedTensorValue(values) )* "]"
+ { return values; }
+}
+
void indexedTensorValue(List<Double> values) :
{
Number value;
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/search/test/SchemaInfoTestCase.java b/config-model/src/test/java/com/yahoo/vespa/model/search/test/SchemaInfoTestCase.java
index fb2e736a79f..91234e9eeb1 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/search/test/SchemaInfoTestCase.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/search/test/SchemaInfoTestCase.java
@@ -14,6 +14,7 @@ public class SchemaInfoTestCase {
/** Schema-info should contain all schemas, independent of clusters. */
@Test
public void requireThatSchemaInfoIsAvailable() {
+ List.of(1.0,2.0,3.0).toArray(new Double[3]);
String inputs =
" rank-profile inputs {" +
" inputs {" +
@@ -23,7 +24,7 @@ public class SchemaInfoTestCase {
" query(myDouble2) tensor()" +
" query(myMap) tensor(key{}): { label1:1.0,\n \"label2\": 2.0, 'label3': 3.0 }" +
" query(myVector) tensor(x[3]):\n\n[1 ,2.0,3]" +
- // " query(myMixed) tensor(key{},x[2]): { key1:[-1.0, 1.1], key2: [1,2]}" +
+ " query(myMixed) tensor(key{},x[2]): { key1:[-1.0, 1.1], key2: [1,2]}" +
" }" +
" }";
List<String> schemas = List.of("type1", "type2");
@@ -51,14 +52,14 @@ public class SchemaInfoTestCase {
tester.assertRankProfile(schema, 5, "rankfeatures", false, true);
var inputs = tester.assertRankProfile(schema, 6, "inputs", false, false);
- assertEquals(6, inputs.input().size());
+ assertEquals(7, inputs.input().size());
assertInput("query(foo)", "tensor<float>(x[10])", inputs.input(0));
assertInput("query(bar)", "tensor(key{},x[1000])", inputs.input(1));
assertInput("query(myDouble1)", "tensor()", inputs.input(2));
assertInput("query(myDouble2)", "tensor()", inputs.input(3));
assertInput("query(myMap)", "tensor(key{})", inputs.input(4));
assertInput("query(myVector)", "tensor(x[3])", inputs.input(5));
- // assertInput("query(myMixed)", "tensor(key{},x[2])", inputs.input(5));
+ assertInput("query(myMixed)", "tensor(key{},x[2])", inputs.input(6));
assertEquals(2, schema.summaryclass().size());
assertEquals("default", schema.summaryclass(0).name());