From 98a5bb1a4ab4baefb6561dcee1483dc8024a7243 Mon Sep 17 00:00:00 2001 From: Quentin Date: Wed, 26 Feb 2025 16:57:58 +0100 Subject: [PATCH 1/2] fix _check_symmetry --- radius_clustering/radius_clustering.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/radius_clustering/radius_clustering.py b/radius_clustering/radius_clustering.py index 5fbcc9f..2037e68 100644 --- a/radius_clustering/radius_clustering.py +++ b/radius_clustering/radius_clustering.py @@ -51,6 +51,10 @@ def __init__(self, manner="approx", threshold=0.5): self.threshold = threshold def _check_symmetric(self, a, tol=1e-8): + if a.ndim != 2: + raise ValueError("Input must be a 2D array.") + if a.shape[0] != a.shape[1]: + return False return np.allclose(a, a.T, atol=tol) def fit(self, X, y=None): From dbaf47d7b266ed721bff6eba4b42e7ef8e3b21ca Mon Sep 17 00:00:00 2001 From: Quentin Date: Wed, 26 Feb 2025 17:51:55 +0100 Subject: [PATCH 2/2] fixing buffer error in mds files --- pyproject.toml | 9 ++++++++- setup.py | 12 ++++++------ .../radius_clustering}/__init__.py | 0 .../radius_clustering}/radius_clustering.py | 2 +- .../radius_clustering}/utils/__init__.py | 0 .../radius_clustering}/utils/emos.pyx | 0 .../radius_clustering}/utils/main-emos.c | 0 .../radius_clustering}/utils/mds.pyx | 2 +- .../radius_clustering}/utils/mds3-util.h | 0 .../radius_clustering}/utils/mds_core.cpp | 0 .../radius_clustering}/utils/random_manager.cpp | 0 .../radius_clustering}/utils/random_manager.h | 0 .../radius_clustering}/utils/util_heap.h | 0 tests/conftest.py | 3 +++ 14 files changed, 19 insertions(+), 9 deletions(-) rename {radius_clustering => src/radius_clustering}/__init__.py (100%) rename {radius_clustering => src/radius_clustering}/radius_clustering.py (98%) rename {radius_clustering => src/radius_clustering}/utils/__init__.py (100%) rename {radius_clustering => src/radius_clustering}/utils/emos.pyx (100%) rename {radius_clustering => src/radius_clustering}/utils/main-emos.c (100%) rename {radius_clustering => src/radius_clustering}/utils/mds.pyx (95%) rename {radius_clustering => src/radius_clustering}/utils/mds3-util.h (100%) rename {radius_clustering => src/radius_clustering}/utils/mds_core.cpp (100%) rename {radius_clustering => src/radius_clustering}/utils/random_manager.cpp (100%) rename {radius_clustering => src/radius_clustering}/utils/random_manager.h (100%) rename {radius_clustering => src/radius_clustering}/utils/util_heap.h (100%) create mode 100644 tests/conftest.py diff --git a/pyproject.toml b/pyproject.toml index 7dd0a63..bf4b4c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -79,7 +79,14 @@ doc = [ ] [tool.setuptools] -packages = ["radius_clustering"] +packages.find = {where = ["src"], include = ["radius_clustering", "radius_clustering.*"]} + +[tool.pytest.ini_options] +pythonpath = "src" +testpaths = ["tests"] +addopts = [ + "--import-mode=importlib", +] [tool.ruff] # Exclude a variety of commonly ignored directories. diff --git a/setup.py b/setup.py index 37755ba..bcab66c 100644 --- a/setup.py +++ b/setup.py @@ -21,18 +21,18 @@ extensions = [ Extension( "radius_clustering.utils._emos", - ["radius_clustering/utils/emos.pyx", "radius_clustering/utils/main-emos.c"], - include_dirs=[np.get_include(), "radius_clustering/utils"], + ["src/radius_clustering/utils/emos.pyx", "src/radius_clustering/utils/main-emos.c"], + include_dirs=[np.get_include(), "src/radius_clustering/utils"], extra_compile_args=C_COMPILE_ARGS, ), Extension( "radius_clustering.utils._mds_approx", [ - "radius_clustering/utils/mds.pyx", - "radius_clustering/utils/mds_core.cpp", - "radius_clustering/utils/random_manager.cpp", + "src/radius_clustering/utils/mds.pyx", + "src/radius_clustering/utils/mds_core.cpp", + "src/radius_clustering/utils/random_manager.cpp", ], - include_dirs=[np.get_include(), "radius_clustering/utils"], + include_dirs=[np.get_include(), "src/radius_clustering/utils"], language="c++", extra_compile_args=CXX_COMPILE_ARGS, extra_link_args=CXX_LINK_ARGS, diff --git a/radius_clustering/__init__.py b/src/radius_clustering/__init__.py similarity index 100% rename from radius_clustering/__init__.py rename to src/radius_clustering/__init__.py diff --git a/radius_clustering/radius_clustering.py b/src/radius_clustering/radius_clustering.py similarity index 98% rename from radius_clustering/radius_clustering.py rename to src/radius_clustering/radius_clustering.py index 2037e68..db49a56 100644 --- a/radius_clustering/radius_clustering.py +++ b/src/radius_clustering/radius_clustering.py @@ -176,7 +176,7 @@ def _clustering_approx(self, n): This function uses the approximation method to solve the MDS problem. See [casado]_ for more details. """ - result = solve_mds(n, self.edges.flatten(), self.nb_edges, "test") + result = solve_mds(n, self.edges.flatten().astype(np.int32), self.nb_edges, "test") self.centers_ = [x for x in result["solution_set"]] self._mds_exec_time = result["Time"] diff --git a/radius_clustering/utils/__init__.py b/src/radius_clustering/utils/__init__.py similarity index 100% rename from radius_clustering/utils/__init__.py rename to src/radius_clustering/utils/__init__.py diff --git a/radius_clustering/utils/emos.pyx b/src/radius_clustering/utils/emos.pyx similarity index 100% rename from radius_clustering/utils/emos.pyx rename to src/radius_clustering/utils/emos.pyx diff --git a/radius_clustering/utils/main-emos.c b/src/radius_clustering/utils/main-emos.c similarity index 100% rename from radius_clustering/utils/main-emos.c rename to src/radius_clustering/utils/main-emos.c diff --git a/radius_clustering/utils/mds.pyx b/src/radius_clustering/utils/mds.pyx similarity index 95% rename from radius_clustering/utils/mds.pyx rename to src/radius_clustering/utils/mds.pyx index 488ae90..1112db2 100644 --- a/radius_clustering/utils/mds.pyx +++ b/src/radius_clustering/utils/mds.pyx @@ -39,7 +39,7 @@ cdef extern from "mds_core.cpp": cdef Result iterated_greedy_wrapper(int numNodes, const vector[int]& edges_list, int nb_edges, string name) nogil -def solve_mds(int num_nodes, np.ndarray[int, ndim=1, mode="c"] edges not None, int nb_edges, str name): +def solve_mds(int num_nodes, np.ndarray[np.uint32_t, ndim=1, mode="c"] edges not None, int nb_edges, str name): """ Solve the Minimum Dominating Set problem for a given graph. diff --git a/radius_clustering/utils/mds3-util.h b/src/radius_clustering/utils/mds3-util.h similarity index 100% rename from radius_clustering/utils/mds3-util.h rename to src/radius_clustering/utils/mds3-util.h diff --git a/radius_clustering/utils/mds_core.cpp b/src/radius_clustering/utils/mds_core.cpp similarity index 100% rename from radius_clustering/utils/mds_core.cpp rename to src/radius_clustering/utils/mds_core.cpp diff --git a/radius_clustering/utils/random_manager.cpp b/src/radius_clustering/utils/random_manager.cpp similarity index 100% rename from radius_clustering/utils/random_manager.cpp rename to src/radius_clustering/utils/random_manager.cpp diff --git a/radius_clustering/utils/random_manager.h b/src/radius_clustering/utils/random_manager.h similarity index 100% rename from radius_clustering/utils/random_manager.h rename to src/radius_clustering/utils/random_manager.h diff --git a/radius_clustering/utils/util_heap.h b/src/radius_clustering/utils/util_heap.h similarity index 100% rename from radius_clustering/utils/util_heap.h rename to src/radius_clustering/utils/util_heap.h diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..6c981a2 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,3 @@ +import sys +from pathlib import Path +