diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-10-04 15:51:02 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2019-11-01 10:47:46 +0000 |
commit | 756cdc582edc1dff85d59a015588d965baab24f8 (patch) | |
tree | 3eb2719dc54d53a677458001892e1c5b766cacbc | |
parent | 4ca68e380802c40b328b1e7ea5cbd39650de5c1c (diff) |
Add floor and ceil too
-rw-r--r-- | build_settings.cmake | 2 | ||||
-rw-r--r-- | staging_vespalib/src/tests/zncurve/CMakeLists.txt | 6 | ||||
-rw-r--r-- | staging_vespalib/src/vespa/vespalib/util/zncurve.h | 6 | ||||
-rw-r--r-- | staging_vespalib/src/vespa/vespalib/util/zncurve.hpp | 57 |
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 { |