From 756cdc582edc1dff85d59a015588d965baab24f8 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Fri, 4 Oct 2019 15:51:02 +0000 Subject: Add floor and ceil too --- build_settings.cmake | 2 +- staging_vespalib/src/tests/zncurve/CMakeLists.txt | 6 +++ staging_vespalib/src/vespa/vespalib/util/zncurve.h | 6 +++ .../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 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 _vector; std::vector _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 -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::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)) { @@ -57,6 +71,11 @@ ZNPoint::ZNPoint(const T * begin, uint32_t numDim) assert(bitPos == 0); } +template +ZNPoint::ZNPoint(const ZNPoint &) = default; +template +ZNPoint & ZNPoint::operator = (const ZNPoint &) = default; + template ZNPoint::~ZNPoint() = default; @@ -72,6 +91,38 @@ ZNPoint::distance(const ZNPoint & rhs) const return sqrt(sum); } +template +void +ZNPoint::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 +void +ZNPoint::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 bool ZNPoint::operator < (const ZNPoint & rhs) const -- cgit v1.2.3