aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-10-04 15:51:02 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2019-11-01 10:47:46 +0000
commit756cdc582edc1dff85d59a015588d965baab24f8 (patch)
tree3eb2719dc54d53a677458001892e1c5b766cacbc
parent4ca68e380802c40b328b1e7ea5cbd39650de5c1c (diff)
Add floor and ceil too
-rw-r--r--build_settings.cmake2
-rw-r--r--staging_vespalib/src/tests/zncurve/CMakeLists.txt6
-rw-r--r--staging_vespalib/src/vespa/vespalib/util/zncurve.h6
-rw-r--r--staging_vespalib/src/vespa/vespalib/util/zncurve.hpp57
4 files changed, 67 insertions, 4 deletions
diff --git a/build_settings.cmake b/build_settings.cmake
index 78afce822ed..b1b0b065771 100644
--- a/build_settings.cmake
+++ b/build_settings.cmake
@@ -46,7 +46,7 @@ else()
endif()
# C and C++ compiler flags
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fno-omit-frame-pointer ${C_WARN_OPTS} -fPIC ${VESPA_CXX_ABI_FLAGS} -DBOOST_DISABLE_ASSERTS ${VESPA_CPU_ARCH_FLAGS} -mtune=intel ${EXTRA_C_FLAGS}")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O3 -fno-omit-frame-pointer ${C_WARN_OPTS} -fPIC ${VESPA_CXX_ABI_FLAGS} -DBOOST_DISABLE_ASSERTS ${VESPA_CPU_ARCH_FLAGS} -mtune=intel ${EXTRA_C_FLAGS}")
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS} ${CXX_SPECIFIC_WARN_OPTS} -std=c++1z -fdiagnostics-color=auto ${EXTRA_CXX_FLAGS}")
else()
diff --git a/staging_vespalib/src/tests/zncurve/CMakeLists.txt b/staging_vespalib/src/tests/zncurve/CMakeLists.txt
index d0d42887b17..b5ed3b3595b 100644
--- a/staging_vespalib/src/tests/zncurve/CMakeLists.txt
+++ b/staging_vespalib/src/tests/zncurve/CMakeLists.txt
@@ -1,4 +1,10 @@
# Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(staging_vespalib_zncurve_benchmark_app TEST
+ SOURCES
+ zncurve_benchmark.cpp
+ DEPENDS
+ staging_vespalib
+)
vespa_add_executable(staging_vespalib_zncurve_test_app TEST
SOURCES
zncurve_test.cpp
diff --git a/staging_vespalib/src/vespa/vespalib/util/zncurve.h b/staging_vespalib/src/vespa/vespalib/util/zncurve.h
index d8d5954b4ad..8feb716ed9d 100644
--- a/staging_vespalib/src/vespa/vespalib/util/zncurve.h
+++ b/staging_vespalib/src/vespa/vespalib/util/zncurve.h
@@ -11,12 +11,18 @@ template<typename T>
class ZNPoint {
public:
ZNPoint(const T * begin, uint32_t numDim);
+ ZNPoint(const ZNPoint & rhs);
+ ZNPoint & operator = (const ZNPoint & rhs);
ZNPoint(ZNPoint && rhs) = default;
ZNPoint & operator = (ZNPoint && rhs) = default;
~ZNPoint();
+ ZNPoint ceil(uint32_t numLSB) const;
+ ZNPoint floor(uint32_t numLSB) const;
bool operator < (const ZNPoint & rhs) const;
double distance(const ZNPoint & rhs) const;
uint32_t numDim() const { return _vector.size(); }
+ void ceil(uint32_t numLSB);
+ void floor(uint32_t numLSB);
private:
std::vector<T> _vector;
std::vector<uint8_t> _point;
diff --git a/staging_vespalib/src/vespa/vespalib/util/zncurve.hpp b/staging_vespalib/src/vespa/vespalib/util/zncurve.hpp
index 1ebf98e091e..5cb931b56af 100644
--- a/staging_vespalib/src/vespa/vespalib/util/zncurve.hpp
+++ b/staging_vespalib/src/vespa/vespalib/util/zncurve.hpp
@@ -18,8 +18,9 @@ double squareDistance(T a, T b) {
return diff * diff;
}
-template<uint32_t>
-double squareDistance(uint32_t a, uint32_t b) {
+template<>
+double squareDistance(uint32_t a32, uint32_t b32) {
+ int64_t a = a32, b = b32;
int64_t diff = a - b;
return diff * diff;
}
@@ -46,7 +47,20 @@ ZNPoint<T>::ZNPoint(const T * begin, uint32_t numDim)
uint32_t bitPos = _point.size()*8;
for (uint32_t bitNum(0); bitNum < sizeof(ConvertedT)*8; bitNum++) {
- for (uint32_t dim(converted.size()); dim; dim--) {
+ uint32_t dim(converted.size());
+ for (; dim >= 8; dim -= 8) {
+ bitPos -= 8;
+ _point[byteIndex(bitPos)] =
+ ((converted[dim - 1] >> bitNum) & 0x01l) |
+ (((converted[dim - 2] >> bitNum) & 0x01l) << 1)|
+ (((converted[dim - 3] >> bitNum) & 0x01l) << 2)|
+ (((converted[dim - 4] >> bitNum) & 0x01l) << 3)|
+ (((converted[dim - 5] >> bitNum) & 0x01l) << 4)|
+ (((converted[dim - 6] >> bitNum) & 0x01l) << 5)|
+ (((converted[dim - 7] >> bitNum) & 0x01l) << 6)|
+ (((converted[dim - 8] >> bitNum) & 0x01l) << 7);
+ }
+ for (; dim; dim--) {
ConvertedT tmp = converted[dim - 1];
bitPos--;
if (tmp & (1 << bitNum)) {
@@ -58,6 +72,11 @@ ZNPoint<T>::ZNPoint(const T * begin, uint32_t numDim)
}
template<typename T>
+ZNPoint<T>::ZNPoint(const ZNPoint &) = default;
+template<typename T>
+ZNPoint<T> & ZNPoint<T>::operator = (const ZNPoint &) = default;
+
+template<typename T>
ZNPoint<T>::~ZNPoint() = default;
template<typename T>
@@ -73,6 +92,38 @@ ZNPoint<T>::distance(const ZNPoint & rhs) const
}
template<typename T>
+void
+ZNPoint<T>::ceil(uint32_t numLSB)
+{
+ uint32_t numBits2Set = numLSB * numDim();
+ uint32_t numBytes2Set = numBits2Set / 8;
+ uint32_t startByte = _point.size() - numBytes2Set;
+ for (uint32_t byteIdx(startByte); byteIdx < _point.size(); byteIdx++) {
+ _point[byteIdx] = 0xff;
+ }
+ for (uint32_t i(numBytes2Set * 8); i < numBits2Set; i++) {
+ uint32_t bitPos = (_point.size() * 8) - i;
+ _point[byteIndex(bitPos)] |= mask(bitPos);
+ }
+}
+
+template<typename T>
+void
+ZNPoint<T>::floor(uint32_t numLSB)
+{
+ uint32_t numBits2Set = numLSB * numDim();
+ uint32_t numBytes2Set = numBits2Set / 8;
+ uint32_t startByte = _point.size() - numBytes2Set;
+ for (uint32_t byteIdx(startByte); byteIdx < _point.size(); byteIdx++) {
+ _point[byteIdx] = 0x00;
+ }
+ for (uint32_t i(numBytes2Set * 8); i < numBits2Set; i++) {
+ uint32_t bitPos = (_point.size() * 8) - i;
+ _point[byteIndex(bitPos)] &= ~mask(bitPos);
+ }
+}
+
+template<typename T>
bool
ZNPoint<T>::operator < (const ZNPoint & rhs) const
{