Hello community, here is the log from the commit of package python-fastcluster for openSUSE:Factory checked in at 2020-02-03 11:12:44 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-fastcluster (Old) and /work/SRC/openSUSE:Factory/.python-fastcluster.new.26092 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-fastcluster" Mon Feb 3 11:12:44 2020 rev:6 rq:768781 version:1.1.26 Changes: -------- --- /work/SRC/openSUSE:Factory/python-fastcluster/python-fastcluster.changes 2018-09-18 11:50:23.599478400 +0200 +++ /work/SRC/openSUSE:Factory/.python-fastcluster.new.26092/python-fastcluster.changes 2020-02-03 11:12:57.209833869 +0100 @@ -1,0 +2,6 @@ +Thu Jan 30 14:49:33 UTC 2020 - Todd R <[email protected]> + +- update to version 1.1.26: + * Small updates for Python 3.8. + +------------------------------------------------------------------- Old: ---- fastcluster-1.1.25.tar.gz New: ---- fastcluster-1.1.26.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-fastcluster.spec ++++++ --- /var/tmp/diff_new_pack.PsSOfZ/_old 2020-02-03 11:12:57.905834220 +0100 +++ /var/tmp/diff_new_pack.PsSOfZ/_new 2020-02-03 11:12:57.905834220 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-fastcluster # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,12 +18,12 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-fastcluster -Version: 1.1.25 +Version: 1.1.26 Release: 0 Summary: Hierarchical clustering routines for Python License: BSD-2-Clause Group: Development/Languages/Python -URL: http://danifold.net +URL: https://github.com/dmuellner/fastcluster Source: https://files.pythonhosted.org/packages/source/f/fastcluster/fastcluster-%{version}.tar.gz BuildRequires: %{python_module devel} BuildRequires: %{python_module nose} ++++++ fastcluster-1.1.25.tar.gz -> fastcluster-1.1.26.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fastcluster-1.1.25/MANIFEST.in new/fastcluster-1.1.26/MANIFEST.in --- old/fastcluster-1.1.25/MANIFEST.in 2015-10-15 22:59:51.000000000 +0200 +++ new/fastcluster-1.1.26/MANIFEST.in 2018-08-12 07:44:09.000000000 +0200 @@ -1,3 +1,4 @@ +include pyproject.toml include docs/* include *.txt include src/*.cpp diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fastcluster-1.1.25/NEWS.txt new/fastcluster-1.1.26/NEWS.txt --- old/fastcluster-1.1.25/NEWS.txt 2018-05-31 21:11:47.000000000 +0200 +++ new/fastcluster-1.1.26/NEWS.txt 2019-12-30 22:34:30.000000000 +0100 @@ -203,4 +203,10 @@ • Removed all “#pragma GCC diagnostic” directives in .cpp files due to changed CRAN requirements (CRAN repository only, not the GitHub repository). + • Updated build scripts for Python 3.7 (thanks to Forest Gregg). + • Simplified setup.py. + • Updated and corrected documentation. +Version 1.1.26, 12/30/2019 + +• Small updates for Python 3.8. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fastcluster-1.1.25/PKG-INFO new/fastcluster-1.1.26/PKG-INFO --- old/fastcluster-1.1.25/PKG-INFO 2018-05-31 21:18:10.000000000 +0200 +++ new/fastcluster-1.1.26/PKG-INFO 2019-12-31 15:06:06.206344600 +0100 @@ -1,6 +1,6 @@ -Metadata-Version: 1.1 +Metadata-Version: 2.1 Name: fastcluster -Version: 1.1.25 +Version: 1.1.26 Summary: Fast hierarchical clustering routines for R and Python. Home-page: http://danifold.net Author: Daniel Müllner @@ -26,8 +26,8 @@ <https://github.com/dmuellner/fastcluster/raw/master/docs/fastcluster.pdf>`_. Installation files for Windows are provided on `PyPI - <https://pypi.python.org/pypi/fastcluster>`_ and on `Christoph Gohlke's web - page <http://www.lfd.uci.edu/~gohlke/pythonlibs/#fastcluster>`_. + <https://pypi.org/project/fastcluster/#files>`__ and on `Christoph Gohlke's + web page <http://www.lfd.uci.edu/~gohlke/pythonlibs/#fastcluster>`_. **The fastcluster package is considered stable and will undergo few changes from now on. If some years from now there have not been any updates, this @@ -37,15 +37,15 @@ `my GitHub repository <https://github.com/dmuellner/fastcluster/>`_ **for bug reports, pull requests etc.** - Note that PyPI and my GitHub repository host the source code for the Python - interface only. The archive with both the R and the Python interface is - available on `CRAN - <https://CRAN.R-project.org/package=fastcluster>`_ and the - GitHub repository `“cran/fastcluster” - <https://github.com/cran/fastcluster>`_. Even though I appear as the author also - of this second GitHub repository, this is just an automatic, read-only mirror - of the CRAN archive, so please do not attempt to report bugs or contact me via - this repository. + Note that `PyPI <https://pypi.org/project/fastcluster/>`__ and `my GitHub + repository <https://github.com/dmuellner/fastcluster/>`_ host the source code + for the Python interface only. The archive with both the R and the Python + interface is available on `CRAN + <https://CRAN.R-project.org/package=fastcluster>`_ and the GitHub repository + `“cran/fastcluster” <https://github.com/cran/fastcluster>`_. Even though I + appear as the author also of this second GitHub repository, this is just an + automatic, read-only mirror of the CRAN archive, so please do not attempt to + report bugs or contact me via this repository. Christoph Dalitz wrote a pure `C++ interface to fastcluster <http://informatik.hsnr.de/~dalitz/data/hclust>`_. @@ -71,3 +71,5 @@ Classifier: Development Status :: 5 - Production/Stable Requires: numpy Provides: fastcluster +Description-Content-Type: text/x-rst +Provides-Extra: test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fastcluster-1.1.25/docs/fastcluster.Rtex new/fastcluster-1.1.26/docs/fastcluster.Rtex --- old/fastcluster-1.1.25/docs/fastcluster.Rtex 2018-05-31 21:03:43.000000000 +0200 +++ new/fastcluster-1.1.26/docs/fastcluster.Rtex 2019-12-30 22:35:50.000000000 +0100 @@ -1,4 +1,4 @@ -\def\fastclusterversion{1.1.25} +\def\fastclusterversion{1.1.26} \documentclass[fontsize=10pt,paper=letter,BCOR=-6mm]{scrartcl} \usepackage[utf8]{inputenc} \usepackage{lmodern} @@ -52,17 +52,22 @@ \DeclareMathOperator\size{size} \DeclareMathOperator\Var{Var} -\newcommand*\linkage{\href{http://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.linkage.html}{\texttt{linkage}}} -\newcommand*\hierarchy{\href{http://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.linkage.html}{\texttt{scipy.\hskip0pt cluster.\hskip0pt hierarchy}}} -\newcommand*\hclust{\href{http://stat.ethz.ch/R-manual/R-patched/library/stats/html/hclust.html}{\texttt{hclust}}} -\newcommand*\stats{\href{http://stat.ethz.ch/R-manual/R-devel/library/stats/html/00Index.html}{\texttt{stats}}} -\newcommand*\flashClustPack{\href{http://cran.r-project.org/web/packages/flashClust/index.html}{\texttt{flashClust}}} -\newcommand*\dist{\href{http://stat.ethz.ch/R-manual/R-devel/library/stats/html/dist.html}{\texttt{dist}}} -\newcommand*\print{\href{http://stat.ethz.ch/R-manual/R-patched/library/base/html/print.html}{\texttt{print}}} -\newcommand*\plot{\href{http://stat.ethz.ch/R-manual/R-patched/library/graphics/html/plot.html}{\texttt{plot}}} -\newcommand*\identify{\href{http://stat.ethz.ch/R-manual/R-patched/library/stats/html/identify.hclust.html}{\texttt{identify}}} -\newcommand*\rect{\href{http://stat.ethz.ch/R-manual/R-patched/library/stats/html/rect.hclust.html}{\texttt{rect.hclust}}} -\newcommand*\NA{\href{http://stat.ethz.ch/R-manual/R-devel/library/base/html/NA.html}{\texttt{NA}}} +\newcommand*\linkage{\href{https://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.linkage.html}{\texttt{linkage}}} +\newcommand*\hierarchy{\href{https://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.linkage.html}{\texttt{scipy.\hskip0pt cluster.\hskip0pt hierarchy}}} +\newcommand*\hclust{\href{https://stat.ethz.ch/R-manual/R-patched/library/stats/html/hclust.html}{\texttt{hclust}}} +\newcommand*\stats{\href{https://stat.ethz.ch/R-manual/R-patched/library/stats/html/00Index.html}{\texttt{stats}}} +\newcommand*\flashClustPack{\href{https://CRAN.R-project.org/package=flashClust}{\texttt{flashClust}}} +\newcommand*\dist{\href{https://stat.ethz.ch/R-manual/R-patched/library/stats/html/dist.html}{\texttt{dist}}} +\newcommand*\print{\href{https://stat.ethz.ch/R-manual/R-patched/library/base/html/print.html}{\texttt{print}}} +\newcommand*\plot{\href{https://stat.ethz.ch/R-manual/R-patched/library/graphics/html/plot.html}{\texttt{plot}}} +\newcommand*\identify{\href{https://stat.ethz.ch/R-manual/R-patched/library/stats/html/identify.hclust.html}{\texttt{identify}}} +\newcommand*\rect{\href{https://stat.ethz.ch/R-manual/R-patched/library/stats/html/rect.hclust.html}{\texttt{rect.hclust}}} +\newcommand*\NA{\href{https://stat.ethz.ch/R-manual/R-patched/library/base/html/NA.html}{\texttt{NA}}} +\newcommand*\double{\href{https://stat.ethz.ch/R-manual/R-patched/library/base/html/double.html}{\texttt{double}}} +\newcommand*\matchcall{\href{https://stat.ethz.ch/R-manual/R-patched/library/base/html/match.call.html}{\texttt{match.call}}} +\newcommand*\NumPyarray{\href{https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html}{NumPy array}} +\newcommand*\maskedarrays{\href{https://docs.scipy.org/doc/numpy/reference/maskedarray.html}{masked arrays}} +\newcommand*\pdist{\href{https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html}{\texttt{scipy.spatial.distance.pdist}}} %\usepackage{showframe} @@ -89,7 +94,7 @@ %\VignetteIndexEntry{User's manual} \title{The \textit{fastcluster} package: User's manual} \author{\href{http://danifold.net}{Daniel Müllner}} -\date{May 29, 2018} +\date{December 30, 2019} \subtitle{Version \fastclusterversion} \maketitle @@ -137,7 +142,7 @@ \flashClustPack{} package in your R files to not accidentally overwrite the \hclust{} function with the \flashClustPack{} version. -The \hyperref[hclust]{new \texttt{hclust} function} has exactly the same calling conventions as the old one. You may just load the package and immediately and effortlessly enjoy the performance improvements. The function is also an improvement to the \texttt{flashClust} function from the \flashClustPack{} package. Just replace every call to \texttt{flashClust} by \hyperref[hclust]{\texttt{hclust}} and expect your code to work as before, only faster.\footnote{If you are using flashClust prior to version 1.01, update it! See the change log for \flashClustPack{} at \url{http://cran.r-project.org/web/packages/flashClust/ChangeLog}.} In case the data includes infinite or NaN values, see \autoref{sec:infnan}. +The \hyperref[hclust]{new \texttt{hclust} function} has exactly the same calling conventions as the old one. You may just load the package and immediately and effortlessly enjoy the performance improvements. The function is also an improvement to the \texttt{flashClust} function from the \flashClustPack{} package. Just replace every call to \texttt{flashClust} by \hyperref[hclust]{\texttt{hclust}} and expect your code to work as before, only faster.\footnote{If you are using flashClust prior to version 1.01, update it! See the change log for \flashClustPack{} at \url{https://cran.r-project.org/web/packages/flashClust/ChangeLog}.} In case the data includes infinite or NaN values, see \autoref{sec:infnan}. If you need to access the old function or make sure that the right function is called, specify the package as follows: @@ -167,7 +172,7 @@ The argument \textit{method} is one of the strings \textit{\q single\q}, \textit{\q complete\q}, \textit{\q average\q}, \textit{\q mcquitty\q}, \textit{\q centroid\q}, \textit{\q median\q}, \textit{\q ward.D\q}, \textit{\q ward.D2\q} or an unambiguous abbreviation thereof. -The argument \textit{members} specifies the sizes of the initial nodes, ie.\ the number of observations in the initial clusters. The default value \texttt{NULL} says that all initial nodes are singletons, ie.\ have size 1. Otherwise, \textit{members} must be a vector whose size is the number of input points. The vector is processed as a \href{http://stat.ethz.ch/R-manual/R-patched/library/base/html/double.html}{\texttt{double}} array so that not only integer cardinalities of nodes can be accounted for but also weighted nodes with real weights. +The argument \textit{members} specifies the sizes of the initial nodes, ie.\ the number of observations in the initial clusters. The default value \texttt{NULL} says that all initial nodes are singletons, ie.\ have size 1. Otherwise, \textit{members} must be a vector whose size is the number of input points. The vector is processed as a \double{} array so that not only integer cardinalities of nodes can be accounted for but also weighted nodes with real weights. The general scheme of the agglomerative clustering procedure is as follows: \begin{enumerate} @@ -196,7 +201,7 @@ The (unabbreviated) string for the \textit{\q method\q} parameter. See below for a specification of all available methods. \item[\normalfont\textit{call}] -The full command that produced the result. See \href{http://stat.ethz.ch/R-manual/R-patched/library/base/html/match.call.html}{\texttt{match.call}}. +The full command that produced the result. See \matchcall. \item[\normalfont\textit{dist.method}] This \textit{\q method\q} attribute of the first input parameter $d$. This specifies which metric was used in the \texttt{dist} method which generated the first argument. @@ -277,13 +282,13 @@ \addcontentsline{toc}{subsection}{\texttt{hclust.vector}} This performs hierarchical, agglomerative clustering on vector data with memory-saving algorithms. While the \hyperref[hclust]{\texttt{hclust}} method requires $\Theta(N^2)$ memory for clustering of $N$ points, this method needs $\Theta(ND)$ for $N$ points in $\mathbb R^D$, which is usually much smaller. -The argument $X$ must be a two-dimensional matrix with \href{http://stat.ethz.ch/R-manual/R-patched/library/base/html/double.html}{\texttt{double}} precision values. It describes $N$ data points in $\mathbb R^D$ as an $(N\times D)$ matrix. +The argument $X$ must be a two-dimensional matrix with \double{} precision values. It describes $N$ data points in $\mathbb R^D$ as an $(N\times D)$ matrix. The parameter \textit{\q members\q} is the same as for \hyperref[hclust]{\texttt{hclust}}. The parameter \textit{\q method\q} is one of the strings \textit{\q single\q}, \textit{\q centroid\q}, \textit{\q median\q}, \textit{\q ward\q}, or an unambiguous abbreviation thereof. -If \textit{method} is \textit{\q single\q}, single linkage clustering is performed on the data points with the metric which is specified by the \textit{metric} parameter. The choices are the same as in the \href{http://stat.ethz.ch/R-manual/R-patched/library/stats/html/dist.html}{\texttt{dist}} method: \textit{\q euclidean\q}, \textit{\q maximum\q}, \textit{\q manhattan\q}, \textit{\q canberra\q}, \textit{\q binary\q} and \textit{\q minkowski\q}. Any unambiguous substring can be given. The parameter \textit{p} is used for the \textit{\q minkowski\q} metric only. +If \textit{method} is \textit{\q single\q}, single linkage clustering is performed on the data points with the metric which is specified by the \textit{metric} parameter. The choices are the same as in the \dist{} method: \textit{\q euclidean\q}, \textit{\q maximum\q}, \textit{\q manhattan\q}, \textit{\q canberra\q}, \textit{\q binary\q} and \textit{\q minkowski\q}. Any unambiguous substring can be given. The parameter \textit{p} is used for the \textit{\q minkowski\q} metric only. The call \begin{quote} @@ -305,9 +310,9 @@ \] Summands with $u_j=v_j=0$ always contribute 0 to the sum. The second, newer formula equals SciPy's definition. -The fastcluster package detects the R version at runtime and chooses the formula accordingly, so that fastcluster and the \href{http://stat.ethz.ch/R-manual/R-patched/library/stats/html/dist.html}{\texttt{dist}} method always use the same formula for a given R version. +The fastcluster package detects the R version at runtime and chooses the formula accordingly, so that fastcluster and the \dist{} method always use the same formula for a given R version. -If \textit{method} is one of \textit{\q centroid\q}, \textit{\q median\q}, \textit{\q ward\q}, clustering is performed with respect to Euclidean distances. In this case, the parameter \textit{metric} must be \textit{\q euclidean\q}. Notice that \texttt{hclust.vector} operates on Euclidean distances for compatibility reasons with the \dist{} method, while \hyperref[hclust]{\texttt{hclust}} assumes \textbf{squared} Euclidean distances for compatibility with the \href{http://stat.ethz.ch/R-manual/R-patched/library/stats/html/hclust.html}{\texttt{stats::hclust}} method! Hence, the call +If \textit{method} is one of \textit{\q centroid\q}, \textit{\q median\q}, \textit{\q ward\q}, clustering is performed with respect to Euclidean distances. In this case, the parameter \textit{metric} must be \textit{\q euclidean\q}. Notice that \texttt{hclust.vector} operates on Euclidean distances for compatibility reasons with the \dist{} method, while \hyperref[hclust]{\texttt{hclust}} assumes \textbf{squared} Euclidean distances for compatibility with the \href{https://stat.ethz.ch/R-manual/R-patched/library/stats/html/hclust.html}{\texttt{stats::hclust}} method! Hence, the call \phantomsection\label{squared} \begin{quote} \texttt{hc = hclust.vector(X, method=\q centroid\q)} @@ -351,9 +356,9 @@ Apart from the argument \textit{preserve\_input}, the method has the same input parameters and output format as the function of the same name in the module \hierarchy. -The argument $X$ is preferably a \href{http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html}{NumPy array} with floating point entries (\texttt{X.dtype\hskip0pt==\hskip0pt numpy.double}). Any other data format will be converted before it is processed. NumPy's \href{http://docs.scipy.org/doc/numpy/reference/maskedarray.html}{masked arrays} are not treated as special, and the mask is simply ignored. +The argument $X$ is preferably a \NumPyarray{} with floating point entries (\texttt{X.dtype\hskip0pt==\hskip0pt numpy.double}). Any other data format will be converted before it is processed. NumPy's \maskedarrays{} are not treated as special, and the mask is simply ignored. -If $X$ is a one-dimensional array, it is considered a condensed matrix of pairwise dissimilarities in the format which is returned by \href{http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html}{\texttt{scipy.spatial.distance.pdist}}. It contains the flattened, upper-triangular part of a pairwise dissimilarity matrix. That is, if there are $N$ data points and the matrix $d$ contains the dissimilarity between the $i$-th and $j$-th observation at position $d_{i,j}$, the vector $X$ has length $\binom N2$ and is ordered as follows: +If $X$ is a one-dimensional array, it is considered a condensed matrix of pairwise dissimilarities in the format which is returned by \pdist. It contains the flattened, upper-triangular part of a pairwise dissimilarity matrix. That is, if there are $N$ data points and the matrix $d$ contains the dissimilarity between the $i$-th and $j$-th observation at position $d_{i,j}$, the vector $X$ has length $\binom N2$ and is ordered as follows: \[ d = \begin{pmatrix} @@ -398,7 +403,7 @@ \item Repeat $N-1$ times from step 2, until there is one big node, which contains all original input points. \end{enumerate} -The output of \texttt{linkage} is \emph{stepwise dendrogram}, which is represented as an $(N-1)\times 4$ \href{http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html}{NumPy array} with floating point entries (\texttt{dtype=numpy.double}). The first two columns contain the node indices which are joined in each step. The input nodes are labeled $0,\ldots,N-1$, and the newly generated nodes have the labels $N,\ldots, 2N-2$. The third column contains the distance between the two nodes at each step, ie.\ the current minimal distance at the time of the merge. The fourth column counts the number of points which comprise each new node. +The output of \texttt{linkage} is \emph{stepwise dendrogram}, which is represented as an $(N-1)\times 4$ \NumPyarray{} with floating point entries (\texttt{dtype=numpy.double}). The first two columns contain the node indices which are joined in each step. The input nodes are labeled $0,\ldots,N-1$, and the newly generated nodes have the labels $N,\ldots, 2N-2$. The third column contains the distance between the two nodes at each step, ie.\ the current minimal distance at the time of the merge. The fourth column counts the number of points which comprise each new node. The parameter \textit{method} specifies which clustering scheme to use. The clustering scheme determines the distance from a new node to the other nodes. Denote the dissimilarities by $d$, the nodes to be joined by $I,J$, the new node by $K$ and any other node by $L$. The symbol $|I|$ denotes the size of the cluster $I$. @@ -437,7 +442,7 @@ \begin{description} \item [\normalfont\textit{method=\q centroid\q}:] -$\displaystyle d(K,L) = \sqrt{\frac{|I|\cdot d(I,L)+|J|\cdot d(J,L)}{|I|+|J|}-\frac{|I|\cdot|J|\cdot d(I,J)}{(|I|+|J|)^2}}$ +$\displaystyle d(K,L) = \sqrt{\frac{|I|\cdot d(I,L)^2+|J|\cdot d(J,L)^2}{|I|+|J|}-\frac{|I|\cdot|J|\cdot d(I,J)^2}{(|I|+|J|)^2}}$ There is a geometric interpretation: $d(A,B)$ is the distance between the centroids (ie.\ barycenters) of the clusters in Euclidean space: \[ @@ -446,7 +451,7 @@ where $\vec c_A$ denotes the centroid of the points in cluster $A$.\pagebreak[2] \item [\normalfont\textit{method=\q median\q}:] -$\displaystyle d(K,L) = \sqrt{\tfrac12 d(I,L)+\tfrac12 d(J,L)-\tfrac14 d(I,J)}$ +$\displaystyle d(K,L) = \sqrt{\tfrac12 d(I,L)^2+\tfrac12 d(J,L)^2-\tfrac14 d(I,J)^2}$ Define the midpoint $\vec w_K$ of a cluster $K$ iteratively as $\vec w_K=k$ if $K=\{k\}$ is a singleton and as the midpoint $\frac12(\vec w_I+\vec w_J)$ if $K$ is formed by joining $I$ and $J$. Then we have \[ @@ -455,7 +460,7 @@ in Euclidean space for all nodes $A,B$. Notice however that this distance depends on the order of the merging steps. \item [\normalfont\textit{method=\q ward\q}:] -$\displaystyle d(K,L) = \sqrt{\frac{(|I|+|L|)\cdot d(I,L)+(|J|+|L|)\cdot d(J,L)-|L|\cdot d(I,J)}{|I|+|J|+|L|}}$ +$\displaystyle d(K,L) = \sqrt{\frac{(|I|+|L|)\cdot d(I,L)^2+(|J|+|L|)\cdot d(J,L)^2-|L|\cdot d(I,J)^2}{|I|+|J|+|L|}}$ The global cluster dissimilarity can be expressed as \[ @@ -498,9 +503,9 @@ The argument $X$ has the same format as before, when $X$ describes vector data, ie.\ it is an $(N\times D)$ array. Also the output array has the same format. The parameter \textit{method} must be one of \textit{\q single\q}, \textit{\q centroid\q}, \textit{\q median\q}, \textit{\q ward\q}, ie.\ only for these methods there exist memory-saving algorithms currently. If \textit{method}, is one of \textit{\q centroid\q}, \textit{\q median\q}, \textit{\q ward\q}, the \textit{metric} must be \textit{\q euclidean\q}. -Like the \texttt{linkage} method, \texttt{linkage\_vector} does not treat NumPy's \href{http://docs.scipy.org/doc/numpy/reference/maskedarray.html}{masked arrays} as special and simply ignores the mask. +Like the \texttt{linkage} method, \texttt{linkage\_vector} does not treat NumPy's \maskedarrays{} as special and simply ignores the mask. -For single linkage clustering, any dissimilarity function may be chosen. Basically, every metric which is implemented in the method \href{http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html}{\texttt{scipy.spatial.distance.pdist}} is reimplemented here. However, the metrics differ in some instances since a number of mistakes and typos (both in the code and in the documentation) were corrected in the \textit{fastcluster} package.\footnote{Hopefully, the SciPy metric will be corrected in future versions and some day coincide with the \textit{fastcluster} definitions. See the bug reports at \url{http://projects.scipy.org/scipy/ticket/1484}, \url{http://projects.scipy.org/scipy/ticket/1486}.} +For single linkage clustering, any dissimilarity function may be chosen. Basically, every metric which is implemented in the method \pdist{} is reimplemented here. However, the metrics differ in some instances since a number of mistakes and typos (both in the code and in the documentation) were corrected in the \textit{fastcluster} package.\footnote{Hopefully, the SciPy metric will be corrected in future versions and some day coincide with the \textit{fastcluster} definitions. See the bug reports at \url{https://github.com/scipy/scipy/issues/2009}, \url{https://github.com/scipy/scipy/issues/2011}.} Therefore, the available metrics with their definitions are listed below as a reference. The symbols $u$ and $v$ mostly denote vectors in $\mathbb R^D$ with coordinates $u_j$ and $v_j$ respectively. See below for additional metrics for Boolean vectors. Unless otherwise stated, the input array $X$ is converted to a floating point array (\texttt{X.dtype==numpy.double}) if it does has have already the required data type. Some metrics accept Boolean input; in this case this is stated explicitly below. @@ -673,13 +678,13 @@ \section{References} \begin{trivlist} \item -\textit{NumPy: Scientific computing tools for Python}, \url{http://numpy.scipy.org/}. +\textit{NumPy: Scientific computing tools for Python}, \url{http://numpy.org/}. \item -Eric Jones, Travis Oliphant, Pearu Peterson et al., \textit{SciPy: Open Source Scientific Tools for Python}, 2001, \url{http://www.scipy.org}. +Eric Jones, Travis Oliphant, Pearu Peterson et al., \textit{SciPy: Open Source Scientific Tools for Python}, 2001, \url{https://www.scipy.org}. \item -\textit{R: A Language and Environment for Statistical Computing}, R Foundation for Statistical Computing, Vienna, 2011, \url{http://www.r-project.org}. +\textit{R: A Language and Environment for Statistical Computing}, R Foundation for Statistical Computing, Vienna, 2011, \url{https://www.r-project.org}. \end{trivlist} \end{document} %%% Local variables: Binary files old/fastcluster-1.1.25/docs/fastcluster.pdf and new/fastcluster-1.1.26/docs/fastcluster.pdf differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fastcluster-1.1.25/fastcluster.egg-info/PKG-INFO new/fastcluster-1.1.26/fastcluster.egg-info/PKG-INFO --- old/fastcluster-1.1.25/fastcluster.egg-info/PKG-INFO 2018-05-31 21:18:10.000000000 +0200 +++ new/fastcluster-1.1.26/fastcluster.egg-info/PKG-INFO 2019-12-31 15:06:06.000000000 +0100 @@ -1,6 +1,6 @@ -Metadata-Version: 1.1 +Metadata-Version: 2.1 Name: fastcluster -Version: 1.1.25 +Version: 1.1.26 Summary: Fast hierarchical clustering routines for R and Python. Home-page: http://danifold.net Author: Daniel Müllner @@ -26,8 +26,8 @@ <https://github.com/dmuellner/fastcluster/raw/master/docs/fastcluster.pdf>`_. Installation files for Windows are provided on `PyPI - <https://pypi.python.org/pypi/fastcluster>`_ and on `Christoph Gohlke's web - page <http://www.lfd.uci.edu/~gohlke/pythonlibs/#fastcluster>`_. + <https://pypi.org/project/fastcluster/#files>`__ and on `Christoph Gohlke's + web page <http://www.lfd.uci.edu/~gohlke/pythonlibs/#fastcluster>`_. **The fastcluster package is considered stable and will undergo few changes from now on. If some years from now there have not been any updates, this @@ -37,15 +37,15 @@ `my GitHub repository <https://github.com/dmuellner/fastcluster/>`_ **for bug reports, pull requests etc.** - Note that PyPI and my GitHub repository host the source code for the Python - interface only. The archive with both the R and the Python interface is - available on `CRAN - <https://CRAN.R-project.org/package=fastcluster>`_ and the - GitHub repository `“cran/fastcluster” - <https://github.com/cran/fastcluster>`_. Even though I appear as the author also - of this second GitHub repository, this is just an automatic, read-only mirror - of the CRAN archive, so please do not attempt to report bugs or contact me via - this repository. + Note that `PyPI <https://pypi.org/project/fastcluster/>`__ and `my GitHub + repository <https://github.com/dmuellner/fastcluster/>`_ host the source code + for the Python interface only. The archive with both the R and the Python + interface is available on `CRAN + <https://CRAN.R-project.org/package=fastcluster>`_ and the GitHub repository + `“cran/fastcluster” <https://github.com/cran/fastcluster>`_. Even though I + appear as the author also of this second GitHub repository, this is just an + automatic, read-only mirror of the CRAN archive, so please do not attempt to + report bugs or contact me via this repository. Christoph Dalitz wrote a pure `C++ interface to fastcluster <http://informatik.hsnr.de/~dalitz/data/hclust>`_. @@ -71,3 +71,5 @@ Classifier: Development Status :: 5 - Production/Stable Requires: numpy Provides: fastcluster +Description-Content-Type: text/x-rst +Provides-Extra: test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fastcluster-1.1.25/fastcluster.egg-info/SOURCES.txt new/fastcluster-1.1.26/fastcluster.egg-info/SOURCES.txt --- old/fastcluster-1.1.25/fastcluster.egg-info/SOURCES.txt 2018-05-31 21:18:10.000000000 +0200 +++ new/fastcluster-1.1.26/fastcluster.egg-info/SOURCES.txt 2019-12-31 15:06:06.000000000 +0100 @@ -6,6 +6,7 @@ README.txt dev-requirements.txt fastcluster.py +pyproject.toml setup.py docs/Makefile docs/fastcluster.Rtex diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fastcluster-1.1.25/fastcluster.egg-info/requires.txt new/fastcluster-1.1.26/fastcluster.egg-info/requires.txt --- old/fastcluster-1.1.25/fastcluster.egg-info/requires.txt 2018-05-31 21:18:10.000000000 +0200 +++ new/fastcluster-1.1.26/fastcluster.egg-info/requires.txt 2019-12-31 15:06:06.000000000 +0100 @@ -1 +1,4 @@ numpy>=1.9 + +[test] +scipy diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fastcluster-1.1.25/fastcluster.py new/fastcluster-1.1.26/fastcluster.py --- old/fastcluster-1.1.25/fastcluster.py 2018-05-31 21:09:30.000000000 +0200 +++ new/fastcluster-1.1.26/fastcluster.py 2019-12-30 22:36:41.000000000 +0100 @@ -20,7 +20,7 @@ """ __all__ = ['single', 'complete', 'average', 'weighted', 'ward', 'centroid', 'median', 'linkage', 'linkage_vector'] -__version_info__ = ('1', '1', '25') +__version_info__ = ('1', '1', '26') __version__ = '.'.join(__version_info__) from numpy import double, empty, array, ndarray, var, cov, dot, bool, \ @@ -240,7 +240,7 @@ else: assert X.ndim==2 N = len(X) - X = pdist(X, metric) + X = pdist(X, metric=metric) X = array(X, dtype=double, copy=False, order='C', subok=True) Z = empty((N-1,4)) if N > 1: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fastcluster-1.1.25/pyproject.toml new/fastcluster-1.1.26/pyproject.toml --- old/fastcluster-1.1.25/pyproject.toml 1970-01-01 01:00:00.000000000 +0100 +++ new/fastcluster-1.1.26/pyproject.toml 2019-12-29 21:28:04.000000000 +0100 @@ -0,0 +1,19 @@ +[build-system] +# We specify older version of numpy for the build environment because +# numpy tries to maintain backwards compatibility but not forward +# compatibility. So, if a user tries to use an extension that was compiled +# along with an earlier version of numpy (say 1.12) than the user has on +# their current system, that will work (say 1.15). However, if the +# extension was compiled with a numpy 1.15 and the user has 1.12 on their +# system, the extension will not work. +# +# For each version of Python, we choose the earliest versions of numpy that +# has binary wheels for that Python version for window, mac, and linux. +# Otherwise building fastcluster would require compiling numpy which +# would make things much, much slower. +requires = ["setuptools", + "wheel", + "numpy==1.10.4; python_version<'3.6'", + "numpy==1.12.1; python_version=='3.6'", + "numpy==1.15.0; python_version=='3.7'", + "numpy==1.17.3; python_version=='3.8'"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fastcluster-1.1.25/setup.py new/fastcluster-1.1.26/setup.py --- old/fastcluster-1.1.25/setup.py 2018-05-31 21:15:55.000000000 +0200 +++ new/fastcluster-1.1.26/setup.py 2019-12-30 22:57:32.000000000 +0100 @@ -1,31 +1,19 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import os -import sys - -#import distutils.debug -#distutils.debug.DEBUG = 'yes' -from setuptools import setup, Extension - -if sys.hexversion < 0x03000000: # uniform unicode handling for both Python 2.x and 3.x - def u(x): - return x.decode('utf-8') - def textfileopen(filename): - return open(filename, mode='r') -else: - def u(x): - return x - def textfileopen(filename): - return open(filename, mode='r', encoding='utf_8') -u(''' +u''' fastcluster: Fast hierarchical clustering routines for R and Python Copyright: * Until package version 1.1.23: © 2011 Daniel Müllner <http://danifold.net> * All changes from version 1.1.24 on: © Google Inc. <http://google.com> -''') +''' +import os +import sys +import numpy +from setuptools import setup, Extension +from io import open -with textfileopen('fastcluster.py') as f: +with open('fastcluster.py', encoding='utf_8') as f: for line in f: if line.find('__version_info__ =') == 0: version = '.'.join(line.split("'")[1:-1:2]) @@ -33,29 +21,11 @@ print('Version: ' + version) - -def get_include_dirs(): - """ Avoid importing numpy until here, so that users can run "setup.py install" - without having numpy installed yet. """ - def is_special_command(): - special_list = ('--help-commands', - 'egg_info', - '--version', - 'clean') - return ('--help' in sys.argv[1:] or - sys.argv[1] in special_list) - - if len(sys.argv) >= 2 and is_special_command(): - return [] - - import numpy - return [numpy.get_include()] - setup(name='fastcluster', version=version, py_modules=['fastcluster'], description='Fast hierarchical clustering routines for R and Python.', - long_description=u(""" + long_description=u""" This library provides Python functions for hierarchical clustering. It generates hierarchical clusters from distance matrices or from vector data. @@ -75,8 +45,8 @@ <https://github.com/dmuellner/fastcluster/raw/master/docs/fastcluster.pdf>`_. Installation files for Windows are provided on `PyPI -<https://pypi.python.org/pypi/fastcluster>`_ and on `Christoph Gohlke's web -page <http://www.lfd.uci.edu/~gohlke/pythonlibs/#fastcluster>`_. +<https://pypi.org/project/fastcluster/#files>`__ and on `Christoph Gohlke's +web page <http://www.lfd.uci.edu/~gohlke/pythonlibs/#fastcluster>`_. **The fastcluster package is considered stable and will undergo few changes from now on. If some years from now there have not been any updates, this @@ -86,15 +56,15 @@ `my GitHub repository <https://github.com/dmuellner/fastcluster/>`_ **for bug reports, pull requests etc.** -Note that PyPI and my GitHub repository host the source code for the Python -interface only. The archive with both the R and the Python interface is -available on `CRAN -<https://CRAN.R-project.org/package=fastcluster>`_ and the -GitHub repository `“cran/fastcluster” -<https://github.com/cran/fastcluster>`_. Even though I appear as the author also -of this second GitHub repository, this is just an automatic, read-only mirror -of the CRAN archive, so please do not attempt to report bugs or contact me via -this repository. +Note that `PyPI <https://pypi.org/project/fastcluster/>`__ and `my GitHub +repository <https://github.com/dmuellner/fastcluster/>`_ host the source code +for the Python interface only. The archive with both the R and the Python +interface is available on `CRAN +<https://CRAN.R-project.org/package=fastcluster>`_ and the GitHub repository +`“cran/fastcluster” <https://github.com/cran/fastcluster>`_. Even though I +appear as the author also of this second GitHub repository, this is just an +automatic, read-only mirror of the CRAN archive, so please do not attempt to +report bugs or contact me via this repository. Christoph Dalitz wrote a pure `C++ interface to fastcluster <http://informatik.hsnr.de/~dalitz/data/hclust>`_. @@ -102,14 +72,16 @@ Reference: Daniel Müllner, *fastcluster: Fast Hierarchical, Agglomerative Clustering Routines for R and Python*, Journal of Statistical Software, **53** (2013), no. 9, 1–18, http://www.jstatsoft.org/v53/i09/. -"""), +""", + long_description_content_type='text/x-rst', requires=['numpy'], install_requires=["numpy>=1.9"], + extras_require={'test': ['scipy']}, provides=['fastcluster'], ext_modules=[Extension('_fastcluster', ['src/fastcluster_python.cpp'], extra_compile_args=['/EHsc'] if os.name == 'nt' else [], - include_dirs=get_include_dirs(), + include_dirs=[numpy.get_include()], # Feel free to uncomment the line below if you use the GCC. # This switches to more aggressive optimization and turns # more warning switches on. No warning should appear in @@ -130,7 +102,7 @@ )], keywords=['dendrogram', 'linkage', 'cluster', 'agglomerative', 'hierarchical', 'hierarchy', 'ward'], - author=u("Daniel Müllner"), + author=u"Daniel Müllner", author_email="[email protected]", license="BSD <http://opensource.org/licenses/BSD-2-Clause>", classifiers=[ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fastcluster-1.1.25/tests/nantest.py new/fastcluster-1.1.26/tests/nantest.py --- old/fastcluster-1.1.25/tests/nantest.py 2018-05-31 21:07:22.000000000 +0200 +++ new/fastcluster-1.1.26/tests/nantest.py 2019-12-30 22:37:08.000000000 +0100 @@ -10,7 +10,7 @@ import numpy as np import fastcluster -version = '1.1.25' +version = '1.1.26' if fastcluster.__version__ != version: raise ValueError('Wrong module version: {} instead of {}.'.format(fastcluster.__version__, version)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fastcluster-1.1.25/tests/test.py new/fastcluster-1.1.26/tests/test.py --- old/fastcluster-1.1.25/tests/test.py 2018-05-31 21:07:33.000000000 +0200 +++ new/fastcluster-1.1.26/tests/test.py 2019-12-30 22:37:03.000000000 +0100 @@ -11,7 +11,7 @@ from scipy.spatial.distance import pdist, squareform import math -version = '1.1.25' +version = '1.1.26' if fc.__version__ != version: raise ValueError('Wrong module version: {} instead of {}.'.format(fc.__version__, version)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fastcluster-1.1.25/tests/vectortest.py new/fastcluster-1.1.26/tests/vectortest.py --- old/fastcluster-1.1.25/tests/vectortest.py 2018-05-31 21:07:49.000000000 +0200 +++ new/fastcluster-1.1.26/tests/vectortest.py 2019-12-30 22:36:57.000000000 +0100 @@ -13,7 +13,7 @@ from scipy.spatial.distance import pdist, squareform import math -version = '1.1.25' +version = '1.1.26' if fc.__version__ != version: raise ValueError('Wrong module version: {} instead of {}.'.format(fc.__version__, version)) @@ -61,7 +61,7 @@ # http://projects.scipy.org/scipy/ticket/1484 ): sys.stdout.write("Metric: " + metric + "...") - D = pdist(pcd, metric) + D = pdist(pcd, metric=metric) D = correct_for_zero_vectors(D, pcd, metric) try: @@ -92,15 +92,15 @@ if metric=='minkowski': p = np.random.uniform(1.,10.) sys.stdout.write("p: " + str(p) + "...") - D = pdist(pcd, metric, p) + D = pdist(pcd, metric=metric, p=p) Z2 = fc.linkage_vector(pcd, method, metric, p) elif metric=='user': # Euclidean metric as a user function fn = (lambda u, v: np.sqrt(((u-v)*(u-v).T).sum())) - D = pdist(pcd, fn) + D = pdist(pcd, metric=fn) Z2 = fc.linkage_vector(pcd, method, fn) else: - D = pdist(pcd, metric) + D = pdist(pcd, metric=metric) D = correct_for_zero_vectors(D, pcd, metric) try: Z2 = fc.linkage_vector(pcd, method, metric)
