From 368bf4074a93419ce142e4fbdd9d44cb65cf5a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Hanu=C5=A1?= Date: Mon, 1 Feb 2021 22:01:53 +0100 Subject: [PATCH 1/4] Add metadata test --- .../tests/bindings_test_metadata.py | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 python_bindings/tests/bindings_test_metadata.py diff --git a/python_bindings/tests/bindings_test_metadata.py b/python_bindings/tests/bindings_test_metadata.py new file mode 100644 index 00000000..69dce03d --- /dev/null +++ b/python_bindings/tests/bindings_test_metadata.py @@ -0,0 +1,49 @@ +import unittest + +import numpy as np + +import hnswlib + + +class RandomSelfTestCase(unittest.TestCase): + def testMetadata(self): + + dim = 16 + num_elements = 10000 + + # Generating sample data + data = np.float32(np.random.random((num_elements, dim))) + + # Declaring index + p = hnswlib.Index(space='l2', dim=dim) # possible options are l2, cosine or ip + + # Initing index + # max_elements - the maximum number of elements, should be known beforehand + # (probably will be made optional in the future) + # + # ef_construction - controls index search speed/build speed tradeoff + # M - is tightly connected with internal dimensionality of the data + # stronlgy affects the memory consumption + + p.init_index(max_elements=num_elements, ef_construction=100, M=16) + + # Controlling the recall by setting ef: + # higher ef leads to better accuracy, but slower search + p.set_ef(100) + + p.set_num_threads(4) # by default using all available cores + + print("Adding all elements (%d)" % (len(data))) + p.add_items(data) + + # test methods + self.assertEqual(p.get_max_elements(), num_elements) + self.assertEqual(p.get_current_count(), num_elements) + + # test properties + self.assertEqual(p.space, 'l2') + self.assertEqual(p.dim, dim) + self.assertEqual(p.M, 16) + self.assertEqual(p.ef_construction, 100) + self.assertEqual(p.max_elements, num_elements) + self.assertEqual(p.element_count, num_elements) From b4edc286a1d0c96dc4be997413368df32bfa6123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Hanu=C5=A1?= Date: Mon, 1 Feb 2021 22:33:22 +0100 Subject: [PATCH 2/4] Fix AttributeError: 'hnswlib.Index' object has no attribute 'get_max_elements' --- python_bindings/bindings.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/python_bindings/bindings.cpp b/python_bindings/bindings.cpp index 87e0c054..14d57538 100644 --- a/python_bindings/bindings.cpp +++ b/python_bindings/bindings.cpp @@ -670,6 +670,7 @@ PYBIND11_PLUGIN(hnswlib) { .def("load_index", &Index::loadIndex, py::arg("path_to_index"), py::arg("max_elements")=0) .def("mark_deleted", &Index::markDeleted, py::arg("label")) .def("resize_index", &Index::resizeIndex, py::arg("new_size")) + .def("get_max_elements", &Index::getMaxElements) .def_readonly("space", &Index::space_name) .def_readonly("dim", &Index::dim) .def_readwrite("num_threads", &Index::num_threads_default) From e128b3f0f57a829a6af897ba69b1ad7535d5ce19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Hanu=C5=A1?= Date: Mon, 1 Feb 2021 22:33:35 +0100 Subject: [PATCH 3/4] Fix AttributeError: 'hnswlib.Index' object has no attribute 'get_current_count' --- python_bindings/bindings.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/python_bindings/bindings.cpp b/python_bindings/bindings.cpp index 14d57538..93b79a60 100644 --- a/python_bindings/bindings.cpp +++ b/python_bindings/bindings.cpp @@ -671,6 +671,7 @@ PYBIND11_PLUGIN(hnswlib) { .def("mark_deleted", &Index::markDeleted, py::arg("label")) .def("resize_index", &Index::resizeIndex, py::arg("new_size")) .def("get_max_elements", &Index::getMaxElements) + .def("get_current_count", &Index::getCurrentCount) .def_readonly("space", &Index::space_name) .def_readonly("dim", &Index::dim) .def_readwrite("num_threads", &Index::num_threads_default) From b6d0b8d2ff407c11342f6c7d66b3e6fde1c11e0c Mon Sep 17 00:00:00 2001 From: Yury Malkov Date: Wed, 3 Feb 2021 19:54:37 -0800 Subject: [PATCH 4/4] Bump version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 15665f31..d9e57086 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ from setuptools import Extension, setup from setuptools.command.build_ext import build_ext -__version__ = '0.5.0' +__version__ = '0.5.1' include_dirs = [