You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datasketches.apache.org by al...@apache.org on 2021/02/12 00:05:07 UTC
[datasketches-cpp] branch allocation_tests created (now 4ffa048)
This is an automated email from the ASF dual-hosted git repository.
alsay pushed a change to branch allocation_tests
in repository https://gitbox.apache.org/repos/asf/datasketches-cpp.git.
at 4ffa048 test that allocator default constructor is not called
This branch includes the following new commits:
new 4ffa048 test that allocator default constructor is not called
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org
[datasketches-cpp] 01/01: test that allocator default constructor
is not called
Posted by al...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
alsay pushed a commit to branch allocation_tests
in repository https://gitbox.apache.org/repos/asf/datasketches-cpp.git
commit 4ffa0483da1378284c1bdb6d8f4c49ad4eb29f36
Author: AlexanderSaydakov <Al...@users.noreply.github.com>
AuthorDate: Thu Feb 11 16:04:50 2021 -0800
test that allocator default constructor is not called
---
common/test/test_allocator.hpp | 10 +-
cpc/test/CMakeLists.txt | 1 +
cpc/test/cpc_sketch_allocation_test.cpp | 236 +++++++++++++++++++++
fi/test/frequent_items_sketch_custom_type_test.cpp | 26 +--
hll/test/HllSketchTest.cpp | 95 ++++-----
kll/test/kll_sketch_custom_type_test.cpp | 18 +-
kll/test/kll_sketch_test.cpp | 84 ++++----
req/test/req_sketch_custom_type_test.cpp | 18 +-
sampling/test/CMakeLists.txt | 1 +
sampling/test/var_opt_allocation_test.cpp | 89 ++++++++
sampling/test/var_opt_union_test.cpp | 31 ---
tuple/test/CMakeLists.txt | 2 +-
12 files changed, 456 insertions(+), 155 deletions(-)
diff --git a/common/test/test_allocator.hpp b/common/test/test_allocator.hpp
index b383af6..d658e8f 100644
--- a/common/test/test_allocator.hpp
+++ b/common/test/test_allocator.hpp
@@ -22,6 +22,7 @@
#include <new>
#include <utility>
+#include <stdexcept>
// this allocator keeps the total allocated size in a global variable for testing
@@ -43,7 +44,14 @@ public:
template <class U>
struct rebind { typedef test_allocator<U> other; };
- test_allocator() {}
+ // this is to test that a given instance of an allocator is used instead of instantiating
+ static const bool DISALLOW_DEFAULT_CONSTRUCTOR = true;
+ test_allocator() {
+ if (DISALLOW_DEFAULT_CONSTRUCTOR) throw std::runtime_error("test_allocator: default constructor");
+ }
+ // call this constructor in tests and pass an allocator instance
+ test_allocator(int) {}
+
test_allocator(const test_allocator&) {}
template <class U>
test_allocator(const test_allocator<U>&) {}
diff --git a/cpc/test/CMakeLists.txt b/cpc/test/CMakeLists.txt
index 00bb4c5..9ffce32 100644
--- a/cpc/test/CMakeLists.txt
+++ b/cpc/test/CMakeLists.txt
@@ -41,4 +41,5 @@ target_sources(cpc_test
cpc_sketch_test.cpp
cpc_union_test.cpp
compression_test.cpp
+ cpc_sketch_allocation_test.cpp
)
diff --git a/cpc/test/cpc_sketch_allocation_test.cpp b/cpc/test/cpc_sketch_allocation_test.cpp
new file mode 100644
index 0000000..e52b09c
--- /dev/null
+++ b/cpc/test/cpc_sketch_allocation_test.cpp
@@ -0,0 +1,236 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+#include <cstring>
+#include <sstream>
+#include <fstream>
+
+#include <catch.hpp>
+
+#include "cpc_sketch.hpp"
+#include "test_allocator.hpp"
+
+namespace datasketches {
+
+using cpc_sketch_test_alloc = cpc_sketch_alloc<test_allocator<uint8_t>>;
+
+TEST_CASE("cpc sketch allocation: serialize deserialize empty", "[cpc_sketch]") {
+ test_allocator_total_bytes = 0;
+ test_allocator_net_allocations = 0;
+ {
+ cpc_sketch_test_alloc sketch(11, DEFAULT_SEED, 0);
+ std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
+ sketch.serialize(s);
+ auto deserialized = cpc_sketch_test_alloc::deserialize(s, DEFAULT_SEED, 0);
+ REQUIRE(deserialized.is_empty() == sketch.is_empty());
+ REQUIRE(deserialized.get_estimate() == sketch.get_estimate());
+ REQUIRE(deserialized.validate());
+ }
+ REQUIRE(test_allocator_total_bytes == 0);
+ REQUIRE(test_allocator_net_allocations == 0);
+}
+
+TEST_CASE("cpc sketch allocation: serialize deserialize sparse", "[cpc_sketch]") {
+ test_allocator_total_bytes = 0;
+ test_allocator_net_allocations = 0;
+ {
+ cpc_sketch_test_alloc sketch(11, DEFAULT_SEED, 0);
+ const int n(100);
+ for (int i = 0; i < n; i++) sketch.update(i);
+ std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
+ sketch.serialize(s);
+ auto deserialized = cpc_sketch_test_alloc::deserialize(s, DEFAULT_SEED, 0);
+ REQUIRE(deserialized.is_empty() == sketch.is_empty());
+ REQUIRE(deserialized.get_estimate() == sketch.get_estimate());
+ REQUIRE(deserialized.validate());
+ }
+ REQUIRE(test_allocator_total_bytes == 0);
+ REQUIRE(test_allocator_net_allocations == 0);
+}
+
+TEST_CASE("cpc sketch allocation: serialize deserialize hybrid", "[cpc_sketch]") {
+ test_allocator_total_bytes = 0;
+ test_allocator_net_allocations = 0;
+ {
+ cpc_sketch_test_alloc sketch(11, DEFAULT_SEED, 0);
+ const int n(200);
+ for (int i = 0; i < n; i++) sketch.update(i);
+ std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
+ sketch.serialize(s);
+ auto deserialized = cpc_sketch_test_alloc::deserialize(s, DEFAULT_SEED, 0);
+ REQUIRE(deserialized.is_empty() == sketch.is_empty());
+ REQUIRE(deserialized.get_estimate() == sketch.get_estimate());
+ REQUIRE(deserialized.validate());
+ }
+ REQUIRE(test_allocator_total_bytes == 0);
+ REQUIRE(test_allocator_net_allocations == 0);
+}
+
+TEST_CASE("cpc sketch allocation: serialize deserialize pinned", "[cpc_sketch]") {
+ test_allocator_total_bytes = 0;
+ test_allocator_net_allocations = 0;
+ {
+ cpc_sketch_test_alloc sketch(11, DEFAULT_SEED, 0);
+ const int n(2000);
+ for (int i = 0; i < n; i++) sketch.update(i);
+ std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
+ sketch.serialize(s);
+ auto deserialized = cpc_sketch_test_alloc::deserialize(s, DEFAULT_SEED, 0);
+ REQUIRE(deserialized.is_empty() == sketch.is_empty());
+ REQUIRE(deserialized.get_estimate() == sketch.get_estimate());
+ REQUIRE(deserialized.validate());
+ }
+ REQUIRE(test_allocator_total_bytes == 0);
+ REQUIRE(test_allocator_net_allocations == 0);
+}
+
+TEST_CASE("cpc sketch allocation: serialize deserialize sliding", "[cpc_sketch]") {
+ test_allocator_total_bytes = 0;
+ test_allocator_net_allocations = 0;
+ {
+ cpc_sketch_test_alloc sketch(11, DEFAULT_SEED, 0);
+ const int n(20000);
+ for (int i = 0; i < n; i++) sketch.update(i);
+ std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
+ sketch.serialize(s);
+ auto deserialized = cpc_sketch_test_alloc::deserialize(s, DEFAULT_SEED, 0);
+ REQUIRE(deserialized.is_empty() == sketch.is_empty());
+ REQUIRE(deserialized.get_estimate() == sketch.get_estimate());
+ REQUIRE(deserialized.validate());
+ }
+ REQUIRE(test_allocator_total_bytes == 0);
+ REQUIRE(test_allocator_net_allocations == 0);
+}
+
+TEST_CASE("cpc sketch allocation: serializing deserialize sliding large", "[cpc_sketch]") {
+ test_allocator_total_bytes = 0;
+ test_allocator_net_allocations = 0;
+ {
+ cpc_sketch_test_alloc sketch(11, DEFAULT_SEED, 0);
+ const int n(3000000);
+ for (int i = 0; i < n; i++) sketch.update(i);
+ std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
+ sketch.serialize(s);
+ auto deserialized = cpc_sketch_test_alloc::deserialize(s, DEFAULT_SEED, 0);
+ REQUIRE(deserialized.is_empty() == sketch.is_empty());
+ REQUIRE(deserialized.get_estimate() == sketch.get_estimate());
+ REQUIRE(deserialized.validate());
+ }
+ REQUIRE(test_allocator_total_bytes == 0);
+ REQUIRE(test_allocator_net_allocations == 0);
+}
+
+TEST_CASE("cpc sketch allocation: serialize deserialize empty, bytes", "[cpc_sketch]") {
+ test_allocator_total_bytes = 0;
+ test_allocator_net_allocations = 0;
+ {
+ cpc_sketch_test_alloc sketch(11, DEFAULT_SEED, 0);
+ auto bytes = sketch.serialize();
+ auto deserialized = cpc_sketch_test_alloc::deserialize(bytes.data(), bytes.size(), DEFAULT_SEED, 0);
+ REQUIRE(deserialized.is_empty() == sketch.is_empty());
+ REQUIRE(deserialized.get_estimate() == sketch.get_estimate());
+ REQUIRE(deserialized.validate());
+ REQUIRE_THROWS_AS(cpc_sketch_test_alloc::deserialize(bytes.data(), bytes.size() - 1, DEFAULT_SEED, 0), std::out_of_range);
+ }
+ REQUIRE(test_allocator_total_bytes == 0);
+ REQUIRE(test_allocator_net_allocations == 0);
+}
+
+TEST_CASE("cpc sketch allocation: serialize deserialize sparse, bytes", "[cpc_sketch]") {
+ test_allocator_total_bytes = 0;
+ test_allocator_net_allocations = 0;
+ {
+ cpc_sketch_test_alloc sketch(11, DEFAULT_SEED, 0);
+ const int n(100);
+ for (int i = 0; i < n; i++) sketch.update(i);
+ auto bytes = sketch.serialize();
+ auto deserialized = cpc_sketch_test_alloc::deserialize(bytes.data(), bytes.size(), DEFAULT_SEED, 0);
+ REQUIRE(deserialized.is_empty() == sketch.is_empty());
+ REQUIRE(deserialized.get_estimate() == sketch.get_estimate());
+ REQUIRE(deserialized.validate());
+ REQUIRE_THROWS_AS(cpc_sketch_test_alloc::deserialize(bytes.data(), 7, DEFAULT_SEED, 0), std::out_of_range);
+ REQUIRE_THROWS_AS(cpc_sketch_test_alloc::deserialize(bytes.data(), 15, DEFAULT_SEED, 0), std::out_of_range);
+ REQUIRE_THROWS_AS(cpc_sketch_test_alloc::deserialize(bytes.data(), bytes.size() - 1, DEFAULT_SEED, 0), std::out_of_range);
+ }
+ REQUIRE(test_allocator_total_bytes == 0);
+ REQUIRE(test_allocator_net_allocations == 0);
+}
+
+TEST_CASE("cpc sketch allocation: serialize deserialize hybrid, bytes", "[cpc_sketch]") {
+ test_allocator_total_bytes = 0;
+ test_allocator_net_allocations = 0;
+ {
+ cpc_sketch_test_alloc sketch(11, DEFAULT_SEED, 0);
+ const int n(200);
+ for (int i = 0; i < n; i++) sketch.update(i);
+ auto bytes = sketch.serialize();
+ auto deserialized = cpc_sketch_test_alloc::deserialize(bytes.data(), bytes.size(), DEFAULT_SEED, 0);
+ REQUIRE(deserialized.is_empty() == sketch.is_empty());
+ REQUIRE(deserialized.get_estimate() == sketch.get_estimate());
+ REQUIRE(deserialized.validate());
+ REQUIRE_THROWS_AS(cpc_sketch_test_alloc::deserialize(bytes.data(), 7, DEFAULT_SEED, 0), std::out_of_range);
+ REQUIRE_THROWS_AS(cpc_sketch_test_alloc::deserialize(bytes.data(), 15, DEFAULT_SEED, 0), std::out_of_range);
+ REQUIRE_THROWS_AS(cpc_sketch_test_alloc::deserialize(bytes.data(), bytes.size() - 1, DEFAULT_SEED, 0), std::out_of_range);
+ }
+ REQUIRE(test_allocator_total_bytes == 0);
+ REQUIRE(test_allocator_net_allocations == 0);
+}
+
+TEST_CASE("cpc sketch allocation: serialize deserialize pinned, bytes", "[cpc_sketch]") {
+ test_allocator_total_bytes = 0;
+ test_allocator_net_allocations = 0;
+ {
+ cpc_sketch_test_alloc sketch(11, DEFAULT_SEED, 0);
+ const int n(2000);
+ for (int i = 0; i < n; i++) sketch.update(i);
+ auto bytes = sketch.serialize();
+ auto deserialized = cpc_sketch_test_alloc::deserialize(bytes.data(), bytes.size(), DEFAULT_SEED, 0);
+ REQUIRE(deserialized.is_empty() == sketch.is_empty());
+ REQUIRE(deserialized.get_estimate() == sketch.get_estimate());
+ REQUIRE(deserialized.validate());
+ REQUIRE_THROWS_AS(cpc_sketch_test_alloc::deserialize(bytes.data(), 7, DEFAULT_SEED, 0), std::out_of_range);
+ REQUIRE_THROWS_AS(cpc_sketch_test_alloc::deserialize(bytes.data(), 15, DEFAULT_SEED, 0), std::out_of_range);
+ REQUIRE_THROWS_AS(cpc_sketch_test_alloc::deserialize(bytes.data(), bytes.size() - 1, DEFAULT_SEED, 0), std::out_of_range);
+ }
+ REQUIRE(test_allocator_total_bytes == 0);
+ REQUIRE(test_allocator_net_allocations == 0);
+}
+
+TEST_CASE("cpc sketch allocation: serialize deserialize sliding, bytes", "[cpc_sketch]") {
+ test_allocator_total_bytes = 0;
+ test_allocator_net_allocations = 0;
+ {
+ cpc_sketch_test_alloc sketch(11, DEFAULT_SEED, 0);
+ const int n(20000);
+ for (int i = 0; i < n; i++) sketch.update(i);
+ auto bytes = sketch.serialize();
+ auto deserialized = cpc_sketch_test_alloc::deserialize(bytes.data(), bytes.size(), DEFAULT_SEED, 0);
+ REQUIRE(deserialized.is_empty() == sketch.is_empty());
+ REQUIRE(deserialized.get_estimate() == sketch.get_estimate());
+ REQUIRE(deserialized.validate());
+ REQUIRE_THROWS_AS(cpc_sketch_test_alloc::deserialize(bytes.data(), 7, DEFAULT_SEED, 0), std::out_of_range);
+ REQUIRE_THROWS_AS(cpc_sketch_test_alloc::deserialize(bytes.data(), 15, DEFAULT_SEED, 0), std::out_of_range);
+ REQUIRE_THROWS_AS(cpc_sketch_test_alloc::deserialize(bytes.data(), bytes.size() - 1, DEFAULT_SEED, 0), std::out_of_range);
+ }
+ REQUIRE(test_allocator_total_bytes == 0);
+ REQUIRE(test_allocator_net_allocations == 0);
+}
+
+} /* namespace datasketches */
diff --git a/fi/test/frequent_items_sketch_custom_type_test.cpp b/fi/test/frequent_items_sketch_custom_type_test.cpp
index ec89a76..06d4467 100644
--- a/fi/test/frequent_items_sketch_custom_type_test.cpp
+++ b/fi/test/frequent_items_sketch_custom_type_test.cpp
@@ -22,13 +22,14 @@
#include "frequent_items_sketch.hpp"
#include "test_type.hpp"
+#include "test_allocator.hpp"
namespace datasketches {
-typedef frequent_items_sketch<test_type, float, test_type_hash, test_type_equal, test_type_serde> frequent_test_type_sketch;
+using frequent_test_type_sketch = frequent_items_sketch<test_type, float, test_type_hash, test_type_equal, test_type_serde, test_allocator<test_type>>;
TEST_CASE("frequent items: custom type", "[frequent_items_sketch]") {
- frequent_test_type_sketch sketch(3);
+ frequent_test_type_sketch sketch(3, frequent_test_type_sketch::LG_MIN_MAP_SIZE, 0);
sketch.update(1, 10); // should survive the purge
sketch.update(2);
sketch.update(3);
@@ -41,35 +42,36 @@ TEST_CASE("frequent items: custom type", "[frequent_items_sketch]") {
REQUIRE_FALSE(sketch.is_empty());
REQUIRE(sketch.get_total_weight() == 17);
REQUIRE(sketch.get_estimate(1) == 10);
- //std::cerr << "num active: " << sketch.get_num_active_items() << std::endl;
- //std::cerr << "get frequent items" << std::endl;
auto items = sketch.get_frequent_items(frequent_items_error_type::NO_FALSE_POSITIVES);
REQUIRE(items.size() == 1); // only 1 item should be above threshold
REQUIRE(items[0].get_item().get_value() == 1);
REQUIRE(items[0].get_estimate() == 10);
std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
- //std::cerr << "serialize" << std::endl;
sketch.serialize(s);
- //std::cerr << "deserialize" << std::endl;
- auto sketch2 = frequent_test_type_sketch::deserialize(s);
+ auto sketch2 = frequent_test_type_sketch::deserialize(s, 0);
REQUIRE_FALSE(sketch2.is_empty());
REQUIRE(sketch2.get_total_weight() == 17);
REQUIRE(sketch2.get_estimate(1) == 10);
REQUIRE(sketch.get_num_active_items() == sketch2.get_num_active_items());
REQUIRE(sketch.get_maximum_error() == sketch2.get_maximum_error());
- //std::cerr << "end" << std::endl;
- std::cout << sketch2.to_string(true);
+ auto bytes = sketch.serialize();
+ auto sketch3 = frequent_test_type_sketch::deserialize(bytes.data(), bytes.size(), 0);
+ REQUIRE_FALSE(sketch3.is_empty());
+ REQUIRE(sketch3.get_total_weight() == 17);
+ REQUIRE(sketch3.get_estimate(1) == 10);
+ REQUIRE(sketch.get_num_active_items() == sketch3.get_num_active_items());
+ REQUIRE(sketch.get_maximum_error() == sketch3.get_maximum_error());
}
// this is to see the debug print from test_type if enabled there to make sure items are moved
TEST_CASE("frequent items: moving merge", "[frequent_items_sketch]") {
- frequent_test_type_sketch sketch1(3);
+ frequent_test_type_sketch sketch1(3, frequent_test_type_sketch::LG_MIN_MAP_SIZE, 0);
sketch1.update(1);
- frequent_test_type_sketch sketch2(3);
+ frequent_test_type_sketch sketch2(3, frequent_test_type_sketch::LG_MIN_MAP_SIZE, 0);
sketch2.update(2);
sketch2.merge(std::move(sketch1));
@@ -77,7 +79,7 @@ TEST_CASE("frequent items: moving merge", "[frequent_items_sketch]") {
}
TEST_CASE("frequent items: negative weight", "[frequent_items_sketch]") {
- frequent_test_type_sketch sketch(3);
+ frequent_test_type_sketch sketch(3, frequent_test_type_sketch::LG_MIN_MAP_SIZE, 0);
REQUIRE_THROWS_AS(sketch.update(1, -1), std::invalid_argument);
}
diff --git a/hll/test/HllSketchTest.cpp b/hll/test/HllSketchTest.cpp
index dae2cab..be86321 100644
--- a/hll/test/HllSketchTest.cpp
+++ b/hll/test/HllSketchTest.cpp
@@ -24,10 +24,10 @@
namespace datasketches {
-typedef hll_sketch_alloc<test_allocator<uint8_t>> hll_sketch_test_alloc;
+using hll_sketch_test_alloc = hll_sketch_alloc<test_allocator<uint8_t>>;
static void runCheckCopy(int lgConfigK, target_hll_type tgtHllType) {
- hll_sketch_test_alloc sk(lgConfigK, tgtHllType);
+ hll_sketch_test_alloc sk(lgConfigK, tgtHllType, false, 0);
for (int i = 0; i < 7; ++i) {
sk.update(i);
@@ -71,7 +71,7 @@ static void copyAs(target_hll_type srcType, target_hll_type dstType) {
int n3 = 1000;
int base = 0;
- hll_sketch_test_alloc src(lgK, srcType);
+ hll_sketch_test_alloc src(lgK, srcType, false, 0);
for (int i = 0; i < n1; ++i) {
src.update(i + base);
}
@@ -110,7 +110,7 @@ TEST_CASE("hll sketch: check misc1", "[hll_sketch]") {
{
int lgConfigK = 8;
target_hll_type srcType = target_hll_type::HLL_8;
- hll_sketch_test_alloc sk(lgConfigK, srcType);
+ hll_sketch_test_alloc sk(lgConfigK, srcType, false, 0);
for (int i = 0; i < 7; ++i) { sk.update(i); } // LIST
REQUIRE(sk.get_compact_serialization_bytes() == 36);
@@ -135,7 +135,7 @@ TEST_CASE("hll sketch: check num std dev", "[hll_sketch]") {
}
void checkSerializationSizes(const int lgConfigK, target_hll_type tgtHllType) {
- hll_sketch_test_alloc sk(lgConfigK, tgtHllType);
+ hll_sketch_test_alloc sk(lgConfigK, tgtHllType, false, 0);
int i;
// LIST
@@ -162,27 +162,23 @@ TEST_CASE("hll sketch: check ser sizes", "[hll_sketch]") {
}
TEST_CASE("hll sketch: exercise to string", "[hll_sketch]") {
- test_allocator_total_bytes = 0;
- {
- hll_sketch_test_alloc sk(15, HLL_4);
- for (int i = 0; i < 25; ++i) { sk.update(i); }
- std::ostringstream oss(std::ios::binary);
- oss << sk.to_string(false, true, true, true);
- for (int i = 25; i < (1 << 20); ++i) { sk.update(i); }
- oss << sk.to_string(false, true, true, true);
- oss << sk.to_string(false, true, true, false);
-
- sk = hll_sketch_test_alloc(8, HLL_8);
- for (int i = 0; i < 25; ++i) { sk.update(i); }
- oss << sk.to_string(false, true, true, true);
- }
- REQUIRE(test_allocator_total_bytes == 0);
+ hll_sketch sk(15, HLL_4);
+ for (int i = 0; i < 25; ++i) { sk.update(i); }
+ std::ostringstream oss(std::ios::binary);
+ oss << sk.to_string(false, true, true, true);
+ for (int i = 25; i < (1 << 20); ++i) { sk.update(i); }
+ oss << sk.to_string(false, true, true, true);
+ oss << sk.to_string(false, true, true, false);
+
+ sk = hll_sketch(8, HLL_8);
+ for (int i = 0; i < 25; ++i) { sk.update(i); }
+ oss << sk.to_string(false, true, true, true);
}
// Creates and serializes then deserializes sketch.
// Returns true if deserialized sketch is compact.
static bool checkCompact(const int lgK, const int n, const target_hll_type type, bool compact) {
- hll_sketch_test_alloc sk(lgK, type);
+ hll_sketch_test_alloc sk(lgK, type, false, 0);
for (int i = 0; i < n; ++i) { sk.update(i); }
std::stringstream ss(std::ios::in | std::ios::out | std::ios::binary);
@@ -194,7 +190,7 @@ static bool checkCompact(const int lgK, const int n, const target_hll_type type,
REQUIRE(ss.tellp() == sk.get_updatable_serialization_bytes());
}
- hll_sketch_test_alloc sk2 = hll_sketch_test_alloc::deserialize(ss);
+ hll_sketch_test_alloc sk2 = hll_sketch_test_alloc::deserialize(ss, 0);
REQUIRE(sk2.get_estimate() == Approx(n).margin(0.01));
bool isCompact = sk2.is_compact();
@@ -233,11 +229,10 @@ TEST_CASE("hll sketch: check compact flag", "[hll_sketch]") {
TEST_CASE("hll sketch: check k limits", "[hll_sketch]") {
test_allocator_total_bytes = 0;
{
- hll_sketch_test_alloc sketch1(HllUtil<>::MIN_LOG_K, target_hll_type::HLL_8);
- hll_sketch_test_alloc sketch2(HllUtil<>::MAX_LOG_K, target_hll_type::HLL_4);
- REQUIRE_THROWS_AS(hll_sketch_test_alloc(HllUtil<>::MIN_LOG_K - 1), std::invalid_argument);
-
- REQUIRE_THROWS_AS(hll_sketch_test_alloc(HllUtil<>::MAX_LOG_K + 1), std::invalid_argument);
+ hll_sketch_test_alloc sketch1(HllUtil<>::MIN_LOG_K, target_hll_type::HLL_8, false, 0);
+ hll_sketch_test_alloc sketch2(HllUtil<>::MAX_LOG_K, target_hll_type::HLL_4, false, 0);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc(HllUtil<>::MIN_LOG_K - 1, target_hll_type::HLL_4, false, 0), std::invalid_argument);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc(HllUtil<>::MAX_LOG_K + 1, target_hll_type::HLL_4, false, 0), std::invalid_argument);
}
REQUIRE(test_allocator_total_bytes == 0);
}
@@ -245,7 +240,7 @@ TEST_CASE("hll sketch: check k limits", "[hll_sketch]") {
TEST_CASE("hll sketch: check input types", "[hll_sketch]") {
test_allocator_total_bytes = 0;
{
- hll_sketch_test_alloc sk(8, target_hll_type::HLL_8);
+ hll_sketch_test_alloc sk(8, target_hll_type::HLL_8, false, 0);
// inserting the same value as a variety of input types
sk.update((uint8_t) 102);
@@ -271,19 +266,19 @@ TEST_CASE("hll sketch: check input types", "[hll_sketch]") {
sk.update(str.c_str(), str.length());
REQUIRE(sk.get_estimate() == Approx(4.0).margin(0.01));
- sk = hll_sketch_test_alloc(8, target_hll_type::HLL_6);
+ sk = hll_sketch_test_alloc(8, target_hll_type::HLL_6, false, 0);
sk.update((float) 0.0);
sk.update((float) -0.0);
sk.update((double) 0.0);
sk.update((double) -0.0);
REQUIRE(sk.get_estimate() == Approx(1.0).margin(0.01));
- sk = hll_sketch_test_alloc(8, target_hll_type::HLL_4);
+ sk = hll_sketch_test_alloc(8, target_hll_type::HLL_4, false, 0);
sk.update(std::nanf("3"));
sk.update(std::nan("9"));
REQUIRE(sk.get_estimate() == Approx(1.0).margin(0.01));
- sk = hll_sketch_test_alloc(8, target_hll_type::HLL_4);
+ sk = hll_sketch_test_alloc(8, target_hll_type::HLL_4, false, 0);
sk.update(nullptr, 0);
sk.update("");
REQUIRE(sk.is_empty());
@@ -294,24 +289,24 @@ TEST_CASE("hll sketch: check input types", "[hll_sketch]") {
TEST_CASE("hll sketch: deserialize list mode buffer overrun", "[hll_sketch]") {
test_allocator_total_bytes = 0;
{
- hll_sketch_test_alloc sketch(10);
+ hll_sketch_test_alloc sketch(10, target_hll_type::HLL_4, false, 0);
sketch.update(1);
auto bytes = sketch.serialize_compact();
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), 7), std::out_of_range);
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), bytes.size() - 1), std::out_of_range);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), 7, 0), std::out_of_range);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), bytes.size() - 1, 0), std::out_of_range);
// ckeck for leaks on stream exceptions
{
std::stringstream ss;
ss.exceptions(std::ios::failbit | std::ios::badbit);
ss.str(std::string((char*)bytes.data(), 7));
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss), std::ios_base::failure);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss, 0), std::ios_base::failure);
}
{
std::stringstream ss;
ss.exceptions(std::ios::failbit | std::ios::badbit);
ss.str(std::string((char*)bytes.data(), bytes.size() - 1));
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss), std::ios_base::failure);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss, 0), std::ios_base::failure);
}
}
REQUIRE(test_allocator_total_bytes == 0);
@@ -320,25 +315,25 @@ TEST_CASE("hll sketch: deserialize list mode buffer overrun", "[hll_sketch]") {
TEST_CASE("hll sketch: deserialize set mode buffer overrun", "[hll_sketch]") {
test_allocator_total_bytes = 0;
{
- hll_sketch_test_alloc sketch(10);
+ hll_sketch_test_alloc sketch(10, target_hll_type::HLL_4, false, 0);
for (int i = 0; i < 10; ++i) sketch.update(i);
//std::cout << sketch.to_string();
auto bytes = sketch.serialize_updatable();
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), 7), std::out_of_range);
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), bytes.size() - 1), std::out_of_range);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), 7, 0), std::out_of_range);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), bytes.size() - 1, 0), std::out_of_range);
// ckeck for leaks on stream exceptions
{
std::stringstream ss;
ss.exceptions(std::ios::failbit | std::ios::badbit);
ss.str(std::string((char*)bytes.data(), 7));
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss), std::ios_base::failure);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss, 0), std::ios_base::failure);
}
{
std::stringstream ss;
ss.exceptions(std::ios::failbit | std::ios::badbit);
ss.str(std::string((char*)bytes.data(), bytes.size() - 1));
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss), std::ios_base::failure);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss, 0), std::ios_base::failure);
}
}
REQUIRE(test_allocator_total_bytes == 0);
@@ -348,39 +343,39 @@ TEST_CASE("hll sketch: deserialize HLL mode buffer overrun", "[hll_sketch]") {
test_allocator_total_bytes = 0;
{
// this sketch should have aux table
- hll_sketch_test_alloc sketch(15);
+ hll_sketch_test_alloc sketch(15, target_hll_type::HLL_4, false, 0);
for (int i = 0; i < 14444; ++i) sketch.update(i);
//std::cout << sketch.to_string();
auto bytes = sketch.serialize_compact();
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), 7), std::out_of_range);
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), 15), std::out_of_range);
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), 16420), std::out_of_range); // before aux table
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), bytes.size() - 1), std::out_of_range);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), 7, 0), std::out_of_range);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), 15, 0), std::out_of_range);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), 16420, 0), std::out_of_range); // before aux table
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(bytes.data(), bytes.size() - 1, 0), std::out_of_range);
// ckeck for leaks on stream exceptions
{
std::stringstream ss;
ss.exceptions(std::ios::failbit | std::ios::badbit);
ss.str(std::string((char*)bytes.data(), 7));
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss), std::ios_base::failure);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss, 0), std::ios_base::failure);
}
{
std::stringstream ss;
ss.exceptions(std::ios::failbit | std::ios::badbit);
ss.str(std::string((char*)bytes.data(), 15));
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss), std::ios_base::failure);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss, 0), std::ios_base::failure);
}
{
std::stringstream ss;
ss.exceptions(std::ios::failbit | std::ios::badbit);
ss.str(std::string((char*)bytes.data(), 16420)); // before aux table
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss), std::ios_base::failure);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss, 0), std::ios_base::failure);
}
{
std::stringstream ss;
ss.exceptions(std::ios::failbit | std::ios::badbit);
ss.str(std::string((char*)bytes.data(), bytes.size() - 1));
- REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss), std::ios_base::failure);
+ REQUIRE_THROWS_AS(hll_sketch_test_alloc::deserialize(ss, 0), std::ios_base::failure);
}
}
REQUIRE(test_allocator_total_bytes == 0);
diff --git a/kll/test/kll_sketch_custom_type_test.cpp b/kll/test/kll_sketch_custom_type_test.cpp
index 3844902..12c491a 100644
--- a/kll/test/kll_sketch_custom_type_test.cpp
+++ b/kll/test/kll_sketch_custom_type_test.cpp
@@ -34,7 +34,7 @@ TEST_CASE("kll sketch custom type", "[kll_sketch]") {
test_allocator_total_bytes = 0;
SECTION("compact level zero") {
- kll_test_type_sketch sketch(8);
+ kll_test_type_sketch sketch(8, 0);
REQUIRE_THROWS_AS(sketch.get_quantile(0), std::runtime_error);
REQUIRE_THROWS_AS(sketch.get_min_value(), std::runtime_error);
REQUIRE_THROWS_AS(sketch.get_max_value(), std::runtime_error);
@@ -59,10 +59,10 @@ TEST_CASE("kll sketch custom type", "[kll_sketch]") {
}
SECTION("merge small") {
- kll_test_type_sketch sketch1(8);
+ kll_test_type_sketch sketch1(8, 0);
sketch1.update(1);
- kll_test_type_sketch sketch2(8);
+ kll_test_type_sketch sketch2(8, 0);
sketch2.update(2);
sketch2.merge(sketch1);
@@ -76,7 +76,7 @@ TEST_CASE("kll sketch custom type", "[kll_sketch]") {
}
SECTION("merge higher levels") {
- kll_test_type_sketch sketch1(8);
+ kll_test_type_sketch sketch1(8, 0);
sketch1.update(1);
sketch1.update(2);
sketch1.update(3);
@@ -87,7 +87,7 @@ TEST_CASE("kll sketch custom type", "[kll_sketch]") {
sketch1.update(8);
sketch1.update(9);
- kll_test_type_sketch sketch2(8);
+ kll_test_type_sketch sketch2(8, 0);
sketch2.update(10);
sketch2.update(11);
sketch2.update(12);
@@ -109,7 +109,7 @@ TEST_CASE("kll sketch custom type", "[kll_sketch]") {
}
SECTION("serialize deserialize") {
- kll_test_type_sketch sketch1;
+ kll_test_type_sketch sketch1(200, 0);
const int n = 1000;
for (int i = 0; i < n; i++) sketch1.update(i);
@@ -117,7 +117,7 @@ TEST_CASE("kll sketch custom type", "[kll_sketch]") {
std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
sketch1.serialize(s);
REQUIRE((size_t) s.tellp() == sketch1.get_serialized_size_bytes());
- auto sketch2 = kll_test_type_sketch::deserialize(s);
+ auto sketch2 = kll_test_type_sketch::deserialize(s, 0);
REQUIRE((size_t) s.tellg() == sketch2.get_serialized_size_bytes());
REQUIRE(s.tellg() == s.tellp());
REQUIRE(sketch2.is_empty() == sketch1.is_empty());
@@ -135,9 +135,9 @@ TEST_CASE("kll sketch custom type", "[kll_sketch]") {
}
SECTION("moving merge") {
- kll_test_type_sketch sketch1(8);
+ kll_test_type_sketch sketch1(8, 0);
for (int i = 0; i < 10; i++) sketch1.update(i);
- kll_test_type_sketch sketch2(8);
+ kll_test_type_sketch sketch2(8, 0);
sketch2.update(10);
sketch2.merge(std::move(sketch1));
REQUIRE(sketch2.get_min_value().get_value() == 0);
diff --git a/kll/test/kll_sketch_test.cpp b/kll/test/kll_sketch_test.cpp
index 08e9abe..13f7673 100644
--- a/kll/test/kll_sketch_test.cpp
+++ b/kll/test/kll_sketch_test.cpp
@@ -48,14 +48,14 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
test_allocator_total_bytes = 0;
SECTION("k limits") {
- kll_float_sketch sketch1(kll_float_sketch::MIN_K); // this should work
- kll_float_sketch sketch2(kll_float_sketch::MAX_K); // this should work
- REQUIRE_THROWS_AS(new kll_float_sketch(kll_float_sketch::MIN_K - 1), std::invalid_argument);
+ kll_float_sketch sketch1(kll_float_sketch::MIN_K, 0); // this should work
+ kll_float_sketch sketch2(kll_float_sketch::MAX_K, 0); // this should work
+ REQUIRE_THROWS_AS(new kll_float_sketch(kll_float_sketch::MIN_K - 1, 0), std::invalid_argument);
// MAX_K + 1 makes no sense because k is uint16_t
}
SECTION("empty") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
REQUIRE(sketch.is_empty());
REQUIRE_FALSE(sketch.is_estimation_mode());
REQUIRE(sketch.get_n() == 0);
@@ -79,13 +79,13 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("get bad quantile") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
sketch.update(0); // has to be non-empty to reach the check
REQUIRE_THROWS_AS(sketch.get_quantile(-1), std::invalid_argument);
}
SECTION("one item") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
sketch.update(1);
REQUIRE_FALSE(sketch.is_empty());
REQUIRE_FALSE(sketch.is_estimation_mode());
@@ -112,7 +112,7 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("NaN") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
sketch.update(std::numeric_limits<float>::quiet_NaN());
REQUIRE(sketch.is_empty());
@@ -122,7 +122,7 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("many items, exact mode") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
const uint32_t n(200);
for (uint32_t i = 0; i < n; i++) {
sketch.update(i);
@@ -157,7 +157,7 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("10 items") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
sketch.update(1);
sketch.update(2);
sketch.update(3);
@@ -175,7 +175,7 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("100 items") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
for (int i = 0; i < 100; ++i) sketch.update(i);
REQUIRE(sketch.get_quantile(0) == 0);
REQUIRE(sketch.get_quantile(0.01) == 1);
@@ -185,7 +185,7 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("many items, estimation mode") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
const int n(1000000);
for (int i = 0; i < n; i++) {
sketch.update(i);
@@ -227,7 +227,7 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("consistency between get_rank adn get_PMF/CDF") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
const int n = 1000;
float values[n];
for (int i = 0; i < n; i++) {
@@ -256,7 +256,7 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
std::ifstream is;
is.exceptions(std::ios::failbit | std::ios::badbit);
is.open(testBinaryInputPath + "kll_sketch_from_java.sk", std::ios::binary);
- auto sketch = kll_float_sketch::deserialize(is);
+ auto sketch = kll_float_sketch::deserialize(is, 0);
REQUIRE_FALSE(sketch.is_empty());
REQUIRE(sketch.is_estimation_mode());
REQUIRE(sketch.get_n() == 1000000);
@@ -266,11 +266,11 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("stream serialize deserialize empty") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
sketch.serialize(s);
REQUIRE(static_cast<size_t>(s.tellp()) == sketch.get_serialized_size_bytes());
- auto sketch2 = kll_float_sketch::deserialize(s);
+ auto sketch2 = kll_float_sketch::deserialize(s, 0);
REQUIRE(static_cast<size_t>(s.tellp()) == sketch2.get_serialized_size_bytes());
REQUIRE(sketch2.is_empty() == sketch.is_empty());
REQUIRE(sketch2.is_estimation_mode() == sketch.is_estimation_mode());
@@ -283,9 +283,9 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("bytes serialize deserialize empty") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
auto bytes = sketch.serialize();
- auto sketch2 = kll_float_sketch::deserialize(bytes.data(), bytes.size());
+ auto sketch2 = kll_float_sketch::deserialize(bytes.data(), bytes.size(), 0);
REQUIRE(bytes.size() == sketch.get_serialized_size_bytes());
REQUIRE(sketch2.is_empty() == sketch.is_empty());
REQUIRE(sketch2.is_estimation_mode() == sketch.is_estimation_mode());
@@ -298,12 +298,12 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("serialize deserialize one item") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
sketch.update(1);
std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
sketch.serialize(s);
REQUIRE(static_cast<size_t>(s.tellp()) == sketch.get_serialized_size_bytes());
- auto sketch2 = kll_float_sketch::deserialize(s);
+ auto sketch2 = kll_float_sketch::deserialize(s, 0);
REQUIRE(static_cast<size_t>(s.tellp()) == sketch2.get_serialized_size_bytes());
REQUIRE(s.tellg() == s.tellp());
REQUIRE_FALSE(sketch2.is_empty());
@@ -321,7 +321,7 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
std::ifstream is;
is.exceptions(std::ios::failbit | std::ios::badbit);
is.open(testBinaryInputPath + "kll_sketch_float_one_item_v1.sk", std::ios::binary);
- auto sketch = kll_float_sketch::deserialize(is);
+ auto sketch = kll_float_sketch::deserialize(is, 0);
REQUIRE_FALSE(sketch.is_empty());
REQUIRE_FALSE(sketch.is_estimation_mode());
REQUIRE(sketch.get_n() == 1);
@@ -331,13 +331,13 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("stream serialize deserialize many floats") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
const int n(1000);
for (int i = 0; i < n; i++) sketch.update(i);
std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
sketch.serialize(s);
REQUIRE(static_cast<size_t>(s.tellp()) == sketch.get_serialized_size_bytes());
- auto sketch2 = kll_float_sketch::deserialize(s);
+ auto sketch2 = kll_float_sketch::deserialize(s, 0);
REQUIRE(static_cast<size_t>(s.tellp()) == sketch2.get_serialized_size_bytes());
REQUIRE(s.tellg() == s.tellp());
REQUIRE(sketch2.is_empty() == sketch.is_empty());
@@ -354,12 +354,12 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("bytes serialize deserialize many floats") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
const int n(1000);
for (int i = 0; i < n; i++) sketch.update(i);
auto bytes = sketch.serialize();
REQUIRE(bytes.size() == sketch.get_serialized_size_bytes());
- auto sketch2 = kll_float_sketch::deserialize(bytes.data(), bytes.size());
+ auto sketch2 = kll_float_sketch::deserialize(bytes.data(), bytes.size(), 0);
REQUIRE(bytes.size() == sketch2.get_serialized_size_bytes());
REQUIRE(sketch2.is_empty() == sketch.is_empty());
REQUIRE(sketch2.is_estimation_mode() == sketch.is_estimation_mode());
@@ -414,7 +414,7 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("out of order split points, float") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
sketch.update(0); // has too be non-empty to reach the check
float split_points[2] = {1, 0};
REQUIRE_THROWS_AS(sketch.get_CDF(split_points, 2), std::invalid_argument);
@@ -428,15 +428,15 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("NaN split point") {
- kll_float_sketch sketch;
+ kll_float_sketch sketch(200, 0);
sketch.update(0); // has too be non-empty to reach the check
float split_points[1] = {std::numeric_limits<float>::quiet_NaN()};
REQUIRE_THROWS_AS(sketch.get_CDF(split_points, 1), std::invalid_argument);
}
SECTION("merge") {
- kll_float_sketch sketch1;
- kll_float_sketch sketch2;
+ kll_float_sketch sketch1(200, 0);
+ kll_float_sketch sketch2(200, 0);
const int n = 10000;
for (int i = 0; i < n; i++) {
sketch1.update(i);
@@ -458,8 +458,8 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("merge lower k") {
- kll_float_sketch sketch1(256);
- kll_float_sketch sketch2(128);
+ kll_float_sketch sketch1(256, 0);
+ kll_float_sketch sketch2(128, 0);
const int n = 10000;
for (int i = 0; i < n; i++) {
sketch1.update(i);
@@ -488,8 +488,8 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("merge exact mode, lower k") {
- kll_float_sketch sketch1(256);
- kll_float_sketch sketch2(128);
+ kll_float_sketch sketch1(256, 0);
+ kll_float_sketch sketch2(128, 0);
const int n = 10000;
for (int i = 0; i < n; i++) {
sketch1.update(i);
@@ -513,8 +513,8 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("merge min value from other") {
- kll_float_sketch sketch1;
- kll_float_sketch sketch2;
+ kll_float_sketch sketch1(200, 0);
+ kll_float_sketch sketch2(200, 0);
sketch1.update(1);
sketch2.update(2);
sketch2.merge(sketch1);
@@ -523,9 +523,9 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("merge min and max values from other") {
- kll_float_sketch sketch1;
+ kll_float_sketch sketch1(200, 0);
for (int i = 0; i < 1000000; i++) sketch1.update(i);
- kll_float_sketch sketch2;
+ kll_float_sketch sketch2(200, 0);
sketch2.merge(sketch1);
REQUIRE(sketch2.get_min_value() == 0.0f);
REQUIRE(sketch2.get_max_value() == 999999.0f);
@@ -560,7 +560,7 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("sketch of strings stream") {
- kll_string_sketch sketch1;
+ kll_string_sketch sketch1(200, 0);
REQUIRE_THROWS_AS(sketch1.get_quantile(0), std::runtime_error);
REQUIRE_THROWS_AS(sketch1.get_min_value(), std::runtime_error);
REQUIRE_THROWS_AS(sketch1.get_max_value(), std::runtime_error);
@@ -575,7 +575,7 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
sketch1.serialize(s);
REQUIRE(static_cast<size_t>(s.tellp()) == sketch1.get_serialized_size_bytes());
- auto sketch2 = kll_string_sketch::deserialize(s);
+ auto sketch2 = kll_string_sketch::deserialize(s, 0);
REQUIRE(static_cast<size_t>(s.tellp()) == sketch2.get_serialized_size_bytes());
REQUIRE(s.tellg() == s.tellp());
REQUIRE(sketch2.is_empty() == sketch1.is_empty());
@@ -599,7 +599,7 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
}
SECTION("sketch of strings bytes") {
- kll_string_sketch sketch1;
+ kll_string_sketch sketch1(200, 0);
REQUIRE_THROWS_AS(sketch1.get_quantile(0), std::runtime_error);
REQUIRE_THROWS_AS(sketch1.get_min_value(), std::runtime_error);
REQUIRE_THROWS_AS(sketch1.get_max_value(), std::runtime_error);
@@ -613,7 +613,7 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
auto bytes = sketch1.serialize();
REQUIRE(bytes.size() == sketch1.get_serialized_size_bytes());
- auto sketch2 = kll_string_sketch::deserialize(bytes.data(), bytes.size());
+ auto sketch2 = kll_string_sketch::deserialize(bytes.data(), bytes.size(), 0);
REQUIRE(bytes.size() == sketch2.get_serialized_size_bytes());
REQUIRE(sketch2.is_empty() == sketch1.is_empty());
REQUIRE(sketch2.is_estimation_mode() == sketch1.is_estimation_mode());
@@ -630,11 +630,11 @@ TEST_CASE("kll sketch", "[kll_sketch]") {
SECTION("sketch of strings, single item, bytes") {
- kll_string_sketch sketch1;
+ kll_string_sketch sketch1(200, 0);
sketch1.update("a");
auto bytes = sketch1.serialize();
REQUIRE(bytes.size() == sketch1.get_serialized_size_bytes());
- auto sketch2 = kll_string_sketch::deserialize(bytes.data(), bytes.size());
+ auto sketch2 = kll_string_sketch::deserialize(bytes.data(), bytes.size(), 0);
REQUIRE(bytes.size() == sketch2.get_serialized_size_bytes());
}
diff --git a/req/test/req_sketch_custom_type_test.cpp b/req/test/req_sketch_custom_type_test.cpp
index 1d76c3c..05acfff 100644
--- a/req/test/req_sketch_custom_type_test.cpp
+++ b/req/test/req_sketch_custom_type_test.cpp
@@ -34,7 +34,7 @@ TEST_CASE("req sketch custom type", "[req_sketch]") {
test_allocator_total_bytes = 0;
SECTION("compact level zero") {
- req_test_type_sketch sketch(4);
+ req_test_type_sketch sketch(4, true, 0);
REQUIRE_THROWS_AS(sketch.get_quantile(0), std::runtime_error);
REQUIRE_THROWS_AS(sketch.get_min_value(), std::runtime_error);
REQUIRE_THROWS_AS(sketch.get_max_value(), std::runtime_error);
@@ -50,10 +50,10 @@ TEST_CASE("req sketch custom type", "[req_sketch]") {
}
SECTION("merge small") {
- req_test_type_sketch sketch1(4);
+ req_test_type_sketch sketch1(4, true, 0);
sketch1.update(1);
- req_test_type_sketch sketch2(4);
+ req_test_type_sketch sketch2(4, true, 0);
sketch2.update(2);
sketch2.merge(sketch1);
@@ -67,10 +67,10 @@ TEST_CASE("req sketch custom type", "[req_sketch]") {
}
SECTION("merge higher levels") {
- req_test_type_sketch sketch1(4);
+ req_test_type_sketch sketch1(4, true, 0);
for (int i = 0; i < 24; ++i) sketch1.update(i);
- req_test_type_sketch sketch2(4);
+ req_test_type_sketch sketch2(4, true, 0);
for (int i = 0; i < 24; ++i) sketch2.update(i);
sketch2.merge(sketch1);
@@ -84,7 +84,7 @@ TEST_CASE("req sketch custom type", "[req_sketch]") {
}
SECTION("serialize deserialize") {
- req_test_type_sketch sketch1(12);
+ req_test_type_sketch sketch1(12, true, 0);
const int n = 1000;
for (int i = 0; i < n; i++) sketch1.update(i);
@@ -92,7 +92,7 @@ TEST_CASE("req sketch custom type", "[req_sketch]") {
std::stringstream s(std::ios::in | std::ios::out | std::ios::binary);
sketch1.serialize(s);
REQUIRE((size_t) s.tellp() == sketch1.get_serialized_size_bytes());
- auto sketch2 = req_test_type_sketch::deserialize(s);
+ auto sketch2 = req_test_type_sketch::deserialize(s, 0);
REQUIRE((size_t) s.tellg() == sketch2.get_serialized_size_bytes());
REQUIRE(s.tellg() == s.tellp());
REQUIRE(sketch2.is_empty() == sketch1.is_empty());
@@ -108,9 +108,9 @@ TEST_CASE("req sketch custom type", "[req_sketch]") {
}
SECTION("moving merge") {
- req_test_type_sketch sketch1(4);
+ req_test_type_sketch sketch1(4, true, 0);
for (int i = 0; i < 10; i++) sketch1.update(i);
- req_test_type_sketch sketch2(4);
+ req_test_type_sketch sketch2(4, true, 0);
sketch2.update(10);
sketch2.merge(std::move(sketch1));
REQUIRE(sketch2.get_min_value().get_value() == 0);
diff --git a/sampling/test/CMakeLists.txt b/sampling/test/CMakeLists.txt
index da0939c..c6c7d83 100644
--- a/sampling/test/CMakeLists.txt
+++ b/sampling/test/CMakeLists.txt
@@ -40,4 +40,5 @@ target_sources(sampling_test
PRIVATE
var_opt_sketch_test.cpp
var_opt_union_test.cpp
+ var_opt_allocation_test.cpp
)
diff --git a/sampling/test/var_opt_allocation_test.cpp b/sampling/test/var_opt_allocation_test.cpp
new file mode 100644
index 0000000..24c7b52
--- /dev/null
+++ b/sampling/test/var_opt_allocation_test.cpp
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <var_opt_sketch.hpp>
+#include <var_opt_union.hpp>
+#include <test_type.hpp>
+#include <test_allocator.hpp>
+
+#include <catch.hpp>
+
+#include <sstream>
+
+namespace datasketches {
+
+using var_opt_test_sketch = var_opt_sketch<test_type, test_type_serde, test_allocator<test_type>>;
+using var_opt_test_union = var_opt_union<test_type, test_type_serde, test_allocator<test_type>>;
+
+TEST_CASE("varopt allocation test", "[var_opt_sketch]") {
+ test_allocator_total_bytes = 0;
+ test_allocator_net_allocations = 0;
+ {
+ var_opt_test_sketch sk1(10, var_opt_test_sketch::DEFAULT_RESIZE_FACTOR, 0);
+ for (int i = 0; i < 100; ++i) sk1.update(i);
+ auto bytes1 = sk1.serialize();
+ auto sk2 = var_opt_test_sketch::deserialize(bytes1.data(), bytes1.size(), 0);
+
+ std::stringstream ss;
+ sk1.serialize(ss);
+ auto sk3 = var_opt_test_sketch::deserialize(ss, 0);
+
+ var_opt_test_union u1(10, 0);
+ u1.update(sk1);
+ u1.update(sk2);
+ u1.update(sk3);
+
+ auto bytes2 = u1.serialize();
+ auto u2 = var_opt_test_union::deserialize(bytes2.data(), bytes2.size(), 0);
+ }
+ REQUIRE(test_allocator_total_bytes == 0);
+ REQUIRE(test_allocator_net_allocations == 0);
+}
+
+TEST_CASE( "varopt union: move", "[var_opt_union][test_type]") {
+ uint32_t n = 20;
+ uint32_t k = 5;
+ var_opt_union<test_type> u(k);
+ var_opt_sketch<test_type> sk1(k);
+ var_opt_sketch<test_type> sk2(k);
+
+ // move udpates
+ for (int i = 0; i < (int) n; ++i) {
+ sk1.update(i);
+ sk2.update(-i);
+ }
+ REQUIRE(sk1.get_n() == n);
+ REQUIRE(sk2.get_n() == n);
+
+ // move unions
+ u.update(std::move(sk2));
+ u.update(std::move(sk1));
+ REQUIRE(u.get_result().get_n() == 2 * n);
+
+ // move constructor
+ var_opt_union<test_type> u2(std::move(u));
+ REQUIRE(u2.get_result().get_n() == 2 * n);
+
+ // move assignment
+ var_opt_union<test_type> u3(k);
+ u3 = std::move(u2);
+ REQUIRE(u3.get_result().get_n() == 2 * n);
+}
+
+}
diff --git a/sampling/test/var_opt_union_test.cpp b/sampling/test/var_opt_union_test.cpp
index 0275901..e3343d9 100644
--- a/sampling/test/var_opt_union_test.cpp
+++ b/sampling/test/var_opt_union_test.cpp
@@ -18,7 +18,6 @@
*/
#include <var_opt_union.hpp>
-#include "test_type.hpp"
#include <catch.hpp>
@@ -325,34 +324,4 @@ TEST_CASE("varopt union: deserialize from java", "[var_opt_union]") {
REQUIRE(result.get_k() < 128);
}
-TEST_CASE( "varopt union: move", "[var_opt_union][test_type]") {
- uint32_t n = 20;
- uint32_t k = 5;
- var_opt_union<test_type> u(k);
- var_opt_sketch<test_type> sk1(k);
- var_opt_sketch<test_type> sk2(k);
-
- // move udpates
- for (int i = 0; i < (int) n; ++i) {
- sk1.update(i);
- sk2.update(-i);
- }
- REQUIRE(sk1.get_n() == n);
- REQUIRE(sk2.get_n() == n);
-
- // move unions
- u.update(std::move(sk2));
- u.update(std::move(sk1));
- REQUIRE(u.get_result().get_n() == 2 * n);
-
- // move constructor
- var_opt_union<test_type> u2(std::move(u));
- REQUIRE(u2.get_result().get_n() == 2 * n);
-
- // move assignment
- var_opt_union<test_type> u3(k);
- u3 = std::move(u2);
- REQUIRE(u3.get_result().get_n() == 2 * n);
-}
-
}
diff --git a/tuple/test/CMakeLists.txt b/tuple/test/CMakeLists.txt
index 8f04c5b..af01c34 100644
--- a/tuple/test/CMakeLists.txt
+++ b/tuple/test/CMakeLists.txt
@@ -39,7 +39,7 @@ add_test(
target_sources(tuple_test
PRIVATE
tuple_sketch_test.cpp
-# tuple_sketch_allocation_test.cpp
+ tuple_sketch_allocation_test.cpp
tuple_union_test.cpp
tuple_intersection_test.cpp
tuple_a_not_b_test.cpp
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org