diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-10-27 09:07:03 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-10-27 09:07:03 +0200 |
commit | 69e4b41cd83b8cd3f0a12a41f15691e8acf7ff87 (patch) | |
tree | 1028afa4f85996cee7c973cba04baf1d63a5b3dd /vespajlib | |
parent | 04ca5c7f537f43efd3b9b048033addd2e60da316 (diff) |
Tensor function language skeleton
Diffstat (limited to 'vespajlib')
8 files changed, 162 insertions, 0 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/tensor/Tensor.java b/vespajlib/src/main/java/com/yahoo/tensor/Tensor.java index 89847228b31..41882738e89 100644 --- a/vespajlib/src/main/java/com/yahoo/tensor/Tensor.java +++ b/vespajlib/src/main/java/com/yahoo/tensor/Tensor.java @@ -8,7 +8,11 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; +import java.util.function.DoubleBinaryOperator; +import java.util.function.DoubleFunction; +import java.util.function.DoubleUnaryOperator; import java.util.function.UnaryOperator; /** @@ -44,7 +48,23 @@ public interface Tensor { /** Returns the value of a cell, or NaN if this cell does not exist/have no value */ double get(TensorAddress address); + + // ----------------- Level 0 functions + + default Tensor map(Tensor tensor, DoubleUnaryOperator mapper) { + throw new UnsupportedOperationException("Not implemented"); + } + + default Tensor reduce(Tensor tensor, String dimension, + DoubleBinaryOperator reductor, Optional<DoubleBinaryOperator> postTransformation) { + throw new UnsupportedOperationException("Not implemented"); + } + + default Tensor join(Tensor tensorA, Tensor tensorB, DoubleBinaryOperator combinator) { + throw new UnsupportedOperationException("Not implemented"); + } + // ----------------- Old stuff /** * Returns the <i>sparse tensor product</i> of this tensor and the argument tensor. * This is the all-to-all combinations of cells in the argument tenors, except the combinations diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/CompositeTensorFunction.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/CompositeTensorFunction.java new file mode 100644 index 00000000000..fa4a70d264a --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/CompositeTensorFunction.java @@ -0,0 +1,11 @@ +package com.yahoo.tensor.functions; + +/** + * A composite tensor function is a tensor function which can be expressed (less tersely) + * as a tree of primitive tensor functions. + * + * @author bratseth + */ +public abstract class CompositeTensorFunction { + +} diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/Join.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/Join.java new file mode 100644 index 00000000000..421ea631ee3 --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/Join.java @@ -0,0 +1,30 @@ +package com.yahoo.tensor.functions; + +import java.util.function.DoubleBinaryOperator; + +/** + * The join tensor function. + * + * @author bratseth + */ +public class Join extends PrimitiveTensorFunction { + + private final TensorFunction argumentA, argumentB; + private final DoubleBinaryOperator combinator; + + public Join(TensorFunction argumentA, TensorFunction argumentB, DoubleBinaryOperator combinator) { + this.argumentA = argumentA; + this.argumentB = argumentB; + this.combinator = combinator; + } + + public TensorFunction argumentA() { return argumentA; } + public TensorFunction argumentB() { return argumentB; } + public DoubleBinaryOperator combinator() { return combinator; } + + @Override + public PrimitiveTensorFunction toPrimitive() { + return new Join(argumentA.toPrimitive(), argumentB.toPrimitive(), combinator); + } + +} diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/Map.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/Map.java new file mode 100644 index 00000000000..cb0615693ae --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/Map.java @@ -0,0 +1,29 @@ +package com.yahoo.tensor.functions; + +import java.util.function.DoubleBinaryOperator; +import java.util.function.DoubleUnaryOperator; + +/** + * The join tensor function. + * + * @author bratseth + */ +public class Map extends PrimitiveTensorFunction { + + private final TensorFunction argument; + private final DoubleUnaryOperator mapper; + + public Map(TensorFunction argument, DoubleUnaryOperator mapper) { + this.argument = argument; + this.mapper = mapper; + } + + public TensorFunction argument() { return argument; } + public DoubleUnaryOperator mapper() { return mapper; } + + @Override + public PrimitiveTensorFunction toPrimitive() { + return new Map(argument.toPrimitive(), mapper); + } + +} diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/PrimitiveTensorFunction.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/PrimitiveTensorFunction.java new file mode 100644 index 00000000000..1c41990af23 --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/PrimitiveTensorFunction.java @@ -0,0 +1,10 @@ +package com.yahoo.tensor.functions; + +/** + * A primitive tensor function is a tensor function which cannot be expressed in terms of other tensor functions. + * All tensor implementations must implement all primitive tensor functions. + * + * @author bratseth + */ +public abstract class PrimitiveTensorFunction extends TensorFunction { +} diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/Product.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/Product.java new file mode 100644 index 00000000000..a95eea213c7 --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/Product.java @@ -0,0 +1,9 @@ +package com.yahoo.tensor.functions; + +/** + * The product tensor function + * + * @author bratseth + */ +public class Product extends CompositeTensorFunction { +} diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/Reduce.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/Reduce.java new file mode 100644 index 00000000000..327234701ad --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/Reduce.java @@ -0,0 +1,33 @@ +package com.yahoo.tensor.functions; + +import java.util.Optional; +import java.util.function.DoubleBinaryOperator; + +/** + * The reduce tensor function. + * + * @author bratseth + */ +public class Reduce extends PrimitiveTensorFunction { + + private final TensorFunction argument; + private final String dimension; + private final DoubleBinaryOperator reductor; + private final Optional<DoubleBinaryOperator> postTransformation; + + public Reduce(TensorFunction argument, String dimension, + DoubleBinaryOperator reductor, Optional<DoubleBinaryOperator> postTransformation) { + this.argument = argument; + this.dimension = dimension; + this.reductor = reductor; + this.postTransformation = postTransformation; + } + + public TensorFunction argument() { return argument; } + + @Override + public PrimitiveTensorFunction toPrimitive() { + return new Reduce(argument.toPrimitive(), dimension, reductor, postTransformation); + } + +} diff --git a/vespajlib/src/main/java/com/yahoo/tensor/functions/TensorFunction.java b/vespajlib/src/main/java/com/yahoo/tensor/functions/TensorFunction.java new file mode 100644 index 00000000000..bce2e237e6a --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/tensor/functions/TensorFunction.java @@ -0,0 +1,20 @@ +package com.yahoo.tensor.functions; + +/** + * An inspectable representation of a tensor function which is able to be translated to a set of primitive + * tensor functions if necessary. + * All tensor functions are immutable. + * + * @author bratseth + */ +public abstract class TensorFunction { + + /** + * Translate this function - and all of its arguments recursively - + * to a tree of primitive functions only. + * + * @return a tree of primitive functions implementing this + */ + public abstract PrimitiveTensorFunction toPrimitive(); + +} |