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 96% rename from radius_clustering/radius_clustering.py rename to src/radius_clustering/radius_clustering.py index 5fbcc9f..db49a56 100644 --- a/radius_clustering/radius_clustering.py +++ b/src/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): @@ -172,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 +