aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@yahoo-inc.com>2017-05-05 11:43:21 +0000
committerBjørn Christian Seime <bjorncs@yahoo-inc.com>2017-05-05 12:15:34 +0000
commitab8222e18a54c4bab3bced832fa3ddd1dbeefad3 (patch)
tree92dd9be302ba85aeaa1038bbd518466545f59b87 /searchlib
parente221caec490e206dee6de86d6987934c4fd03c27 (diff)
fixup! Add aggregator for calculating the population standard deviation
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/aggregator/perdocexpr.cpp2
-rw-r--r--searchlib/src/vespa/searchlib/aggregation/aggregation.cpp20
-rw-r--r--searchlib/src/vespa/searchlib/aggregation/standarddeviationaggregationresult.h20
-rw-r--r--searchlib/src/vespa/searchlib/expression/resultvector.h19
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); }