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)


Reply via email to