diff options
author | Håvard Pettersen <havardpe@oath.com> | 2021-02-04 11:23:59 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2021-02-04 12:19:58 +0000 |
commit | 74d55d62b2eaa30424a6c8fdedcac90dcf0dc571 (patch) | |
tree | 1eef5289f42df1ef39bed479839ccc93b35392a7 /eval | |
parent | 7bfb2536fc656e401469107d4c1dd182be80248b (diff) |
use GenSpec in tensor_model.cpp
Diffstat (limited to 'eval')
-rw-r--r-- | eval/src/apps/tensor_conformance/generate.cpp | 2 | ||||
-rw-r--r-- | eval/src/vespa/eval/eval/test/gen_spec.h | 4 | ||||
-rw-r--r-- | eval/src/vespa/eval/eval/test/tensor_conformance.cpp | 4 | ||||
-rw-r--r-- | eval/src/vespa/eval/eval/test/tensor_model.cpp | 70 | ||||
-rw-r--r-- | eval/src/vespa/eval/eval/test/tensor_model.h | 15 |
5 files changed, 13 insertions, 82 deletions
diff --git a/eval/src/apps/tensor_conformance/generate.cpp b/eval/src/apps/tensor_conformance/generate.cpp index 537e35dee1f..5feb6b3b3e4 100644 --- a/eval/src/apps/tensor_conformance/generate.cpp +++ b/eval/src/apps/tensor_conformance/generate.cpp @@ -32,7 +32,7 @@ void generate_reduce(Aggr aggr, const Sequence &seq, TestBuilder &dst) { TensorSpec input = spec(layout, seq); for (const Domain &domain: layout) { vespalib::string expr = vespalib::make_string("reduce(a,%s,%s)", - AggrNames::name_of(aggr)->c_str(), domain.dimension.c_str()); + AggrNames::name_of(aggr)->c_str(), domain.name().c_str()); dst.add(expr, {{"a", input}}); } { diff --git a/eval/src/vespa/eval/eval/test/gen_spec.h b/eval/src/vespa/eval/eval/test/gen_spec.h index 6b9631c66c7..280f6c1d8db 100644 --- a/eval/src/vespa/eval/eval/test/gen_spec.h +++ b/eval/src/vespa/eval/eval/test/gen_spec.h @@ -94,6 +94,9 @@ private: public: GenSpec() : _dims(), _cells(CellType::DOUBLE), _seq(N()) {} + GenSpec(double bias) : _dims(), _cells(CellType::DOUBLE), _seq(N(bias)) {} + GenSpec(const std::vector<DimSpec> &dims_in) : _dims(dims_in), _cells(CellType::DOUBLE), _seq(N()) {} + GenSpec(GenSpec &&other); GenSpec(const GenSpec &other); GenSpec &operator=(GenSpec &&other); @@ -125,6 +128,7 @@ public: _seq = seq_in; return *this; } + // TODO: stop using and remove GenSpec &seq_bias(double bias) { return seq(N(bias)); } ValueType type() const; TensorSpec gen() const; diff --git a/eval/src/vespa/eval/eval/test/tensor_conformance.cpp b/eval/src/vespa/eval/eval/test/tensor_conformance.cpp index 1e9afde3cb9..779ce30663f 100644 --- a/eval/src/vespa/eval/eval/test/tensor_conformance.cpp +++ b/eval/src/vespa/eval/eval/test/tensor_conformance.cpp @@ -142,9 +142,9 @@ struct TestContext { TensorSpec input = spec(layout, seq); for (const Domain &domain: layout) { TEST_STATE(fmt("shape: %s, reduce dimension: %s", - infer_type(layout).c_str(), domain.dimension.c_str()).c_str()); + infer_type(layout).c_str(), domain.name().c_str()).c_str()); vespalib::string expr = fmt("reduce(a,%s,%s)", - AggrNames::name_of(aggr)->c_str(), domain.dimension.c_str()); + AggrNames::name_of(aggr)->c_str(), domain.name().c_str()); TEST_DO(verify_result(factory, expr, {input})); } { diff --git a/eval/src/vespa/eval/eval/test/tensor_model.cpp b/eval/src/vespa/eval/eval/test/tensor_model.cpp index 7860563bccd..3d30a7a6734 100644 --- a/eval/src/vespa/eval/eval/test/tensor_model.cpp +++ b/eval/src/vespa/eval/eval/test/tensor_model.cpp @@ -5,9 +5,6 @@ namespace vespalib::eval::test { -Domain::Domain(const Domain &) = default; -Domain::~Domain() = default; - Layout float_cells(const Layout &layout) { return Layout(CellType::FLOAT, layout.domains); } @@ -24,77 +21,18 @@ Domain z() { return Domain("z", {}); } Domain z(size_t size) { return Domain("z", size); } Domain z(const std::vector<vespalib::string> &keys) { return Domain("z", keys); } -// Infer the tensor type spanned by the given spaces vespalib::string infer_type(const Layout &layout) { - std::vector<ValueType::Dimension> dimensions; - for (const auto &domain: layout) { - if (domain.size == 0) { - dimensions.emplace_back(domain.dimension); // mapped - } else { - dimensions.emplace_back(domain.dimension, domain.size); // indexed - } - } - return ValueType::tensor_type(dimensions, layout.cell_type).to_spec(); + return GenSpec(layout.domains).cells(layout.cell_type).type().to_spec(); } -// Wrapper for the things needed to generate a tensor -struct Source { - using Address = TensorSpec::Address; - - const Layout &layout; - const Sequence &seq; - Source(const Layout &layout_in, const Sequence &seq_in) - : layout(layout_in), seq(seq_in) {} -}; - -// Mix layout with a number sequence to make a tensor spec -class TensorSpecBuilder -{ -private: - using Label = TensorSpec::Label; - using Address = TensorSpec::Address; - - Source _source; - TensorSpec _spec; - Address _addr; - size_t _idx; - - void generate(size_t layout_idx) { - if (layout_idx == _source.layout.size()) { - _spec.add(_addr, _source.seq(_idx++)); - } else { - const Domain &domain = _source.layout[layout_idx]; - if (domain.size > 0) { // indexed - for (size_t i = 0; i < domain.size; ++i) { - _addr.emplace(domain.dimension, Label(i)).first->second = Label(i); - generate(layout_idx + 1); - } - } else { // mapped - for (const vespalib::string &key: domain.keys) { - _addr.emplace(domain.dimension, Label(key)).first->second = Label(key); - generate(layout_idx + 1); - } - } - } - } - -public: - TensorSpecBuilder(const Layout &layout, const Sequence &seq) - : _source(layout, seq), _spec(infer_type(layout)), _addr(), _idx(0) {} - TensorSpec build() { - generate(0); - return _spec; - } -}; - TensorSpec spec(const Layout &layout, const Sequence &seq) { - return TensorSpecBuilder(layout, seq).build(); + return GenSpec(layout.domains).cells(layout.cell_type).seq(seq).gen(); } TensorSpec spec(const Domain &domain, const Sequence &seq) { - return TensorSpecBuilder(Layout({domain}), seq).build(); + return spec(Layout({domain}), seq); } TensorSpec spec(double value) { - return spec(Layout({}), Seq({value})); + return GenSpec(value).gen(); } TensorSpec spec(const vespalib::string &type, diff --git a/eval/src/vespa/eval/eval/test/tensor_model.h b/eval/src/vespa/eval/eval/test/tensor_model.h index 56504795cee..85f6e5ccfa4 100644 --- a/eval/src/vespa/eval/eval/test/tensor_model.h +++ b/eval/src/vespa/eval/eval/test/tensor_model.h @@ -29,18 +29,7 @@ struct MyIn { } }; -// A collection of labels for a single dimension -struct Domain { - vespalib::string dimension; - size_t size; // indexed - std::vector<vespalib::string> keys; // mapped - Domain(const Domain &); - Domain(const vespalib::string &dimension_in, size_t size_in) - : dimension(dimension_in), size(size_in), keys() {} - Domain(const vespalib::string &dimension_in, const std::vector<vespalib::string> &keys_in) - : dimension(dimension_in), size(0), keys(keys_in) {} - ~Domain(); -}; +using Domain = DimSpec; struct Layout { CellType cell_type; @@ -69,7 +58,7 @@ Domain z(); Domain z(size_t size); Domain z(const std::vector<vespalib::string> &keys); -// Infer the tensor type spanned by the given spaces +// Infer the tensor type implied by the given layout vespalib::string infer_type(const Layout &layout); TensorSpec spec(const Layout &layout, const Sequence &seq); |