Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 15 additions & 16 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -274,27 +274,32 @@ if(BUILD_PYTHON)
message(STATUS "Subdirectory 'extern/pybind11' added.")
endif()

# Build the Python module
pybind11_add_module(daisy pybinds/setup.cpp)
# Build the Python module as daisy._core
pybind11_add_module(daisy_core pybinds/setup.cpp)
set_target_properties(daisy_core PROPERTIES
OUTPUT_NAME "_core"
PREFIX "" # no 'lib' prefix, produce _core.cpython-*.so
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/daisy"
)
if(DEBUG_MSG)
message(STATUS "Python module 'daisy' created from pybinds/setup.cpp.")
message(STATUS "Python module 'daisy._core' created from pybinds/setup.cpp.")
endif()

target_link_libraries(daisy PRIVATE dino_lib)
target_link_libraries(daisy_core PRIVATE dino_lib)
if(DEBUG_MSG)
message(STATUS "Python module 'daisy' linked to 'dino_lib'.")
message(STATUS "Python module 'daisy._core' linked to 'dino_lib'.")
endif()

# Pass BUILD_SING_ENABLED definition to Python module
if (BUILD_SING_AVAILABLE)
target_compile_definitions(daisy PRIVATE SING_CUDA_ENABLED=1)
target_compile_definitions(daisy_core PRIVATE SING_CUDA_ENABLED=1)
if(DEBUG_MSG)
message(STATUS "Python module 'daisy' compiled with SING_CUDA_ENABLED=1.")
message(STATUS "Python module 'daisy._core' compiled with SING_CUDA_ENABLED=1.")
endif()
else()
target_compile_definitions(daisy PRIVATE SING_CUDA_ENABLED=0)
target_compile_definitions(daisy_core PRIVATE SING_CUDA_ENABLED=0)
if(DEBUG_MSG)
message(STATUS "Python module 'daisy' compiled with SING_CUDA_ENABLED=0.")
message(STATUS "Python module 'daisy._core' compiled with SING_CUDA_ENABLED=0.")
endif()
endif()

Expand All @@ -314,13 +319,7 @@ if(BUILD_PYTHON)
endif()
endif()

# Set output directory for the .so file (demos/ so that import daisy finds daisy.*.so when run from demos)
set_target_properties(daisy PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/demos"
)
if(DEBUG_MSG)
message(STATUS "Python module 'daisy' output directory set to: ${CMAKE_SOURCE_DIR}/demos")
endif()
# (Python module 'daisy._core' already configured to output into ${PROJECT_SOURCE_DIR}/daisy above)
else()
if(DEBUG_MSG)
message(STATUS "BUILD_PYTHON is OFF. Skipping Python bindings.")
Expand Down
34 changes: 27 additions & 7 deletions demos/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,28 @@ if(BUILD_DEMO)
message(STATUS "Include directories added for demo_Messi_DTW.")
endif()

# ////// SING DTW //////
if(BUILD_SING_AVAILABLE)
if(DEBUG_MSG)
message(STATUS "---")
message(STATUS "## Demo: Sing DTW")
message(STATUS "Attempting to add executable: demo_Sing_DTW")
endif()
add_executable(demo_Sing_DTW demo_Sing_DTW.cpp)
target_link_libraries(demo_Sing_DTW PRIVATE dino_lib commons_lib)
target_include_directories(demo_Sing_DTW PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../lib
${CMAKE_CURRENT_SOURCE_DIR}/../commons
)
if(DEBUG_MSG)
message(STATUS "Executable demo_Sing_DTW added and configured (CUDA/Sing available).")
endif()
else()
if(DEBUG_MSG)
message(STATUS "BUILD_SING_AVAILABLE is FALSE. demo_Sing_DTW will NOT be built.")
endif()
endif()

# ////// ODYSSEY L2Square //////
if(DEBUG_MSG)
message(STATUS "---")
Expand Down Expand Up @@ -325,25 +347,23 @@ if(BUILD_DEMO)
# ////// SING L2Square //////
if(DEBUG_MSG)
message(STATUS "---")
message(STATUS "## Demo: Sing")
message(STATUS "## Demo: Sing L2Square")
endif()

if(SING_CUDA_AVAILABLE)
if(BUILD_SING_AVAILABLE)
if(DEBUG_MSG)
message(STATUS "SING_CUDA_AVAILABLE is TRUE. Building demo_Sing_L2Square.")
message(STATUS "BUILD_SING_AVAILABLE is TRUE. Building demo_Sing_L2Square.")
endif()

add_executable(demo_Sing_L2Square demo_Sing_L2Square.cpp)

target_link_libraries(demo_Sing_L2Square PRIVATE dino_lib commons_lib CUDA::cudart)

target_link_libraries(demo_Sing_L2Square PRIVATE dino_lib commons_lib)
target_include_directories(demo_Sing_L2Square PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../lib
${CMAKE_CURRENT_SOURCE_DIR}/../commons
)
else()
if(DEBUG_MSG)
message(STATUS "SING_CUDA_AVAILABLE is FALSE. demo_Sing_L2Square will NOT be built.")
message(STATUS "BUILD_SING_AVAILABLE is FALSE. demo_Sing_L2Square will NOT be built.")
endif()
endif()

Expand Down
2 changes: 1 addition & 1 deletion demos/demo_Messi_DTW.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ int main(){
printf("Loaded %llu database points and %llu query points with dimension %llu\n", n_database, n_query, dim);

daisy::Messi messi_search(daisy::DistanceType::DTW);
messi_search.setNumThreads(4);
messi_search.setNumThreads(1);

int warp_window = std::max(1, static_cast<int>(dim * 0.1));
messi_search.setWarpingWindow(warp_window);
Expand Down
6 changes: 3 additions & 3 deletions demos/demo_Messi_DTW.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@

def main():

n_database = 200000
dim = 96
n_query = 10
n_database = 840000
dim = 128
n_query = 20
k = 5

np.random.seed(100)
Expand Down
45 changes: 45 additions & 0 deletions demos/demo_Sing_DTW.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#include "../commons/dataloaders.hpp"
#include "../lib/daisy.hpp"
#include <chrono>
#include <algorithm>

int main() {
daisy::idx_t n_database = 200000;
unsigned long long dim = 96;
unsigned long long n_query = 10;
daisy::idx_t k = 1; // current Sing DTW implementation supports only k = 1

float *database = loadRandomData(n_database, dim, 100, true);
float *query = loadRandomData(n_query, dim, 50, true);

daisy::Sing sing_search(daisy::DistanceType::DTW);
sing_search.setNumThreads(1);

// Sing::buildIndex expects a DataSource*, use InMemoryDataSource as in other components.
daisy::InMemoryDataSource data_source(database, n_database, dim);
printf("indexing\n");
sing_search.buildIndex(&data_source);
printf("finished indexing\n");

daisy::idx_t *I = new daisy::idx_t[n_query * k];
float *D = new float[n_query * k];
printf("querying\n");
sing_search.searchIndex(query, n_query, k, I, D);
printf("finished querying\n");

for (daisy::idx_t i = 0; i < n_query; i++) {
printf("Query %llu:\n", i);
printf(" Distances: ");
for (daisy::idx_t j = 0; j < k; j++) {
printf("%f ", D[i * k + j]);
}
}

delete[] database;
delete[] query;
delete[] I;
delete[] D;

return 0;
}

52 changes: 52 additions & 0 deletions demos/demo_Sing_DTW.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"""
Demo Sing DTW — build index from NumPy array and run DTW search.
Requires Sing to be built with CUDA (SING_CUDA_ENABLED).
Note: current Sing DTW implementation only supports k = 1.
"""
import sys
import os
import time
import numpy as np

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))

from daisy import DistanceType, Sing


def main():
# Small-ish sizes so the demo runs quickly
n_database = 50000
dim = 128
n_query = 5
k = 1 # DTW implementation in Sing currently supports only k = 1

np.random.seed(100)
db = np.random.randn(n_database, dim).astype(np.float32)
np.random.seed(50)
query = np.random.randn(n_query, dim).astype(np.float32)
print(f"Loaded {n_database} database points and {n_query} query points with dimension {dim}")

sing_search = Sing(DistanceType.DTW)
# Optional: use multiple threads
sing_search.setNumThreads(4)

sing_search.buildIndex(db)
print(f"buildIndex (DTW) done")

print(f"Starting DTW search (n_query={n_query}, k={k})...")
I, D = sing_search.searchIndex(query, k)
print(f"Search done)")

print("\nPython Sing DTW Search Results:")
for i in range(n_query):
print(f"Query {i}:")
print("Distances:", D[i])
print("Indices:", I[i])
print()

return 0


if __name__ == "__main__":
sys.exit(main())

6 changes: 3 additions & 3 deletions lib/algos/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -128,9 +128,9 @@ if(DEBUG_MSG)
endif()

# ////// SING //////
if (SING_CUDA_AVAILABLE)
if (BUILD_SING_AVAILABLE)
if(DEBUG_MSG)
message(STATUS "SING_CUDA_AVAILABLE is TRUE. Configuring CUDA for SING components.")
message(STATUS "BUILD_SING_AVAILABLE is TRUE. Configuring CUDA for SING components.")
message(STATUS "Adding CUDA Toolkit include directories to dino_lib...")
endif()

Expand Down Expand Up @@ -171,7 +171,7 @@ if (SING_CUDA_AVAILABLE)
endif()
else()
if(DEBUG_MSG)
message(STATUS "SING_CUDA_AVAILABLE is FALSE. CUDA configuration for SING skipped.")
message(STATUS "BUILD_SING_AVAILABLE is FALSE. CUDA configuration for SING skipped.")
endif()
target_compile_definitions(dino_lib PUBLIC SING_CUDA_ENABLED=0)
endif()
Expand Down
Loading
Loading