diff options
author | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2017-05-05 11:43:21 +0000 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@yahoo-inc.com> | 2017-05-05 12:15:34 +0000 |
commit | ab8222e18a54c4bab3bced832fa3ddd1dbeefad3 (patch) | |
tree | 92dd9be302ba85aeaa1038bbd518466545f59b87 /searchlib | |
parent | e221caec490e206dee6de86d6987934c4fd03c27 (diff) |
fixup! Add aggregator for calculating the population standard deviation
Diffstat (limited to 'searchlib')
4 files changed, 32 insertions, 29 deletions
diff --git a/searchlib/src/tests/aggregator/perdocexpr.cpp b/searchlib/src/tests/aggregator/perdocexpr.cpp index 0d023685186..6f374f1bea4 100644 --- a/searchlib/src/tests/aggregator/perdocexpr.cpp +++ b/searchlib/src/tests/aggregator/perdocexpr.cpp @@ -49,6 +49,7 @@ void testMin(const ResultNode & a, const ResultNode & b) { ExpressionNode::UP createVectorFloat(const std::vector<double> & v) { std::unique_ptr<FloatResultNodeVector> r = MU<FloatResultNodeVector>(); + r->reserve(v.size()); for (double d : v) { r->push_back(FloatResultNode(d)); } @@ -58,6 +59,7 @@ createVectorFloat(const std::vector<double> & v) { ExpressionNode::UP createVectorInt(const std::vector<double> & v) { std::unique_ptr<IntegerResultNodeVector> r = MU<IntegerResultNodeVector>(); + r->reserve(v.size()); for (double d : v) { r->push_back(Int64ResultNode(static_cast<int64_t>(d))); } diff --git a/searchlib/src/vespa/searchlib/aggregation/aggregation.cpp b/searchlib/src/vespa/searchlib/aggregation/aggregation.cpp index 72b04b9d5e8..9ccad83df19 100644 --- a/searchlib/src/vespa/searchlib/aggregation/aggregation.cpp +++ b/searchlib/src/vespa/searchlib/aggregation/aggregation.cpp @@ -502,6 +502,14 @@ Deserializer &ExpressionCountAggregationResult::onDeserialize( ExpressionCountAggregationResult::ExpressionCountAggregationResult() : AggregationResult(), _hll() { } ExpressionCountAggregationResult::~ExpressionCountAggregationResult() {} +StandardDeviationAggregationResult::StandardDeviationAggregationResult() + : AggregationResult(), _count(), _sum(), _sumOfSquared(), _stdDevScratchPad() +{ + _stdDevScratchPad.reset(new expression::FloatResultNode()); +} + +StandardDeviationAggregationResult::~StandardDeviationAggregationResult() {} + const NumericResultNode& StandardDeviationAggregationResult::getStandardDeviation() const noexcept { if (_count == 0) { @@ -543,18 +551,12 @@ void StandardDeviationAggregationResult::onReset() _sumOfSquared.set(0.0); } -static FieldBase _G_sumOfSquaredField("sumOfSquared"); - Serializer & StandardDeviationAggregationResult::onSerialize(Serializer & os) const { AggregationResult::onSerialize(os); double sum = _sum.getFloat(); double sumOfSquared = _sumOfSquared.getFloat(); - return os. - put(_G_countField, _count). - put(_G_sumField, sum). - put(_G_sumOfSquaredField, sumOfSquared); - + return os << _count << sum << sumOfSquared; } Deserializer & StandardDeviationAggregationResult::onDeserialize(Deserializer & is) @@ -562,9 +564,7 @@ Deserializer & StandardDeviationAggregationResult::onDeserialize(Deserializer & AggregationResult::onDeserialize(is); double sum; double sumOfSquared; - Deserializer & r = is.get(_G_countField, _count) - .get(_G_sumField, sum) - .get(_G_sumOfSquaredField, sumOfSquared); + auto& r = is >> _count >> sum >> sumOfSquared; _sum.set(sum); _sumOfSquared.set(sumOfSquared); return r; diff --git a/searchlib/src/vespa/searchlib/aggregation/standarddeviationaggregationresult.h b/searchlib/src/vespa/searchlib/aggregation/standarddeviationaggregationresult.h index d2889232101..283637d5f0b 100644 --- a/searchlib/src/vespa/searchlib/aggregation/standarddeviationaggregationresult.h +++ b/searchlib/src/vespa/searchlib/aggregation/standarddeviationaggregationresult.h @@ -13,18 +13,16 @@ class StandardDeviationAggregationResult : public AggregationResult { public: DECLARE_AGGREGATIONRESULT(StandardDeviationAggregationResult); - StandardDeviationAggregationResult() : AggregationResult(), _count(), _sum(), _sumOfSquared(), _stdDevScratchPad() - { - _stdDevScratchPad.reset(new expression::FloatResultNode()); - } - - virtual void visitMembers(vespalib::ObjectVisitor &visitor) const override; - const double getSum() const noexcept { return _sum.getFloat(); } - const double getSumOfSquared() const noexcept { return _sumOfSquared.getFloat(); } - const uint64_t getCount() const noexcept { return _count; } + StandardDeviationAggregationResult(); + ~StandardDeviationAggregationResult(); + + void visitMembers(vespalib::ObjectVisitor &visitor) const override; + double getSum() const noexcept { return _sum.getFloat(); } + double getSumOfSquared() const noexcept { return _sumOfSquared.getFloat(); } + uint64_t getCount() const noexcept { return _count; } private: - virtual const ResultNode& onGetRank() const noexcept override { return getStandardDeviation(); } - virtual void onPrepare(const ResultNode&, bool) override { }; + const ResultNode& onGetRank() const noexcept override { return getStandardDeviation(); } + void onPrepare(const ResultNode&, bool) override { }; const expression::NumericResultNode& getStandardDeviation() const noexcept; uint64_t _count; diff --git a/searchlib/src/vespa/searchlib/expression/resultvector.h b/searchlib/src/vespa/searchlib/expression/resultvector.h index dabfd9937c7..f91354ce771 100644 --- a/searchlib/src/vespa/searchlib/expression/resultvector.h +++ b/searchlib/src/vespa/searchlib/expression/resultvector.h @@ -31,6 +31,7 @@ public: virtual ResultNode & get(size_t index) = 0; virtual void clear() = 0; virtual void resize(size_t sz) = 0; + virtual void reserve(size_t sz) = 0; size_t size() const { return onSize(); } bool empty() const { return size() == 0; } /** @@ -93,6 +94,7 @@ public: ResultNode & get(size_t index) override { return _result[index]; } void clear() override { _result.clear(); } void resize(size_t sz) override { _result.resize(sz); } + void reserve(size_t sz) override { _result.reserve(sz); } void negate() override; private: void visitMembers(vespalib::ObjectVisitor &visitor) const override { visit(visitor, "Vector", _result); } @@ -220,7 +222,7 @@ public: B v; v.set(r); const std::vector<B> & vec(this->getVector()); - for(size_t i(0), m(vec.size()); i < m; i++) { + for (size_t i(0), m(vec.size()); i < m; i++) { v.multiply(vec[i]); } r.set(v); @@ -230,7 +232,7 @@ public: Int64ResultNode v; v.set(r); const std::vector<B> & vec(this->getVector()); - for(size_t i(0), m(vec.size()); i < m; i++) { + for (size_t i(0), m(vec.size()); i < m; i++) { v.andOp(vec[i]); } r.set(v); @@ -240,7 +242,7 @@ public: Int64ResultNode v; v.set(r); const std::vector<B> & vec(this->getVector()); - for(size_t i(0), m(vec.size()); i < m; i++) { + for (size_t i(0), m(vec.size()); i < m; i++) { v.orOp(vec[i]); } r.set(v); @@ -250,7 +252,7 @@ public: Int64ResultNode v; v.set(r); const std::vector<B> & vec(this->getVector()); - for(size_t i(0), m(vec.size()); i < m; i++) { + for (size_t i(0), m(vec.size()); i < m; i++) { v.xorOp(vec[i]); } r.set(v); @@ -260,7 +262,7 @@ public: B v; v.set(r); const std::vector<B> & vec(this->getVector()); - for(size_t i(0), m(vec.size()); i < m; i++) { + for (size_t i(0), m(vec.size()); i < m; i++) { v.add(vec[i]); } r.set(v); @@ -270,7 +272,7 @@ public: B v; v.set(r); const std::vector<B> & vec(this->getVector()); - for(size_t i(0), m(vec.size()); i < m; i++) { + for (size_t i(0), m(vec.size()); i < m; i++) { v.max(vec[i]); } r.set(v); @@ -280,7 +282,7 @@ public: B v; v.set(r); const std::vector<B> & vec(this->getVector()); - for(size_t i(0), m(vec.size()); i < m; i++) { + for (size_t i(0), m(vec.size()); i < m; i++) { v.min(vec[i]); } r.set(v); @@ -290,7 +292,7 @@ public: B v; v.set(r); const std::vector<B> & vec(this->getVector()); - for(size_t i(0), m(vec.size()); i < m; i++) { + for (size_t i(0), m(vec.size()); i < m; i++) { B squared; squared.set(vec[i]); squared.multiply(vec[i]); @@ -414,6 +416,7 @@ public: ResultNode & get(size_t index) override { return *_v[index]; } void clear() override { _v.clear(); } void resize(size_t sz) override { _v.resize(sz); } + void reserve(size_t sz) override { _v.reserve(sz); } private: int64_t onGetInteger(size_t index) const override { return _v[index]->getInteger(index); } double onGetFloat(size_t index) const override { return _v[index]->getFloat(index); } |