Repository: phenology/cgc (language: python)

Issue:
A few cosmetic fixes



Discussion / hints:

Fix patch:
diff --git a/.github/workflows/draft-pdf.yml b/.github/workflows/draft-pdf.yml
new file mode 100644
index 0000000..d8e1ce6
--- /dev/null
+++ b/.github/workflows/draft-pdf.yml
@@ -0,0 +1,26 @@
+on: 
+  push:
+    paths:
+      - 'manuscript/**'
+
+jobs:
+  paper:
+    runs-on: ubuntu-latest
+    name: Paper Draft
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+      - name: Build draft PDF
+        uses: openjournals/openjournals-draft-action@master
+        with:
+          journal: joss
+          # This should be the path to the paper within your repo.
+          paper-path: manuscript/paper.md
+      - name: Upload
+        uses: actions/upload-artifact@v1
+        with:
+          name: paper
+          # This is the output path where Pandoc will write the compiled
+          # PDF. Note, this should be the same directory as the input
+          # paper.md
+          path: manuscript/paper.pdf
diff --git a/manuscript/README.md b/manuscript/README.md
new file mode 100644
index 0000000..953b81b
--- /dev/null
+++ b/manuscript/README.md
@@ -0,0 +1,6 @@
+# Build manuscript locally
+
+In order to build the pdf version of the manuscript locally you can run:
+```shell
+pandoc --citeproc paper.md -o paper.pdf
+```
diff --git a/manuscript/paper.bib b/manuscript/paper.bib
new file mode 100644
index 0000000..64ca79a
--- /dev/null
+++ b/manuscript/paper.bib
@@ -0,0 +1,438 @@
+
+@inproceedings{Ailem:2015,
+	author = {Ailem, Melissa and Role, Fran\c{c}ois and Nadif, Mohamed},
+	title = {Co-Clustering Document-Term Matrices by Direct Maximization of Graph Modularity},
+	year = {2015},
+	isbn = {9781450337946},
+	publisher = {Association for Computing Machinery},
+	address = {New York, NY, USA},
+	url = {https://doi.org/10.1145/2806416.2806639},
+	doi = {10.1145/2806416.2806639},
+	abstract = {We present Coclus, a novel diagonal co-clustering algorithm which is able to effectively co-cluster binary or contingency matrices by directly maximizing an adapted version of the modularity measure traditionally used for networks. While some effective co-clustering algorithms already exist that use network-related measures (normalized cut, modularity), they do so by using spectral relaxations of the discrete optimization problems. In contrast, Coclus allows to get even better co-clusters by directly maximizing modularity using an iterative alternating optimization procedure. Extensive comparative experiments performed on various document-term datasets demonstrate that our algorithm is very effective, stable and outperforms other co-clustering algorithms.},
+	booktitle = {Proceedings of the 24th ACM International on Conference on Information and Knowledge Management},
+	pages = {1807–1810},
+	numpages = {4},
+	keywords = {modularity, co-clustering},
+	location = {Melbourne, Australia},
+	series = {CIKM '15}}
+
+@inproceedings{Andrienko:2009,
+	Address = {Atlantic City, NJ, USA},
+	Author = {Andrienko, Gennady and Andrienko, Natalia and Rinzivillo, Salvatore and Nanni, Mirco and Pedreschi, Dino and Giannotti, Fosca},
+	Booktitle = {2009 {IEEE} {Symposium} on {Visual} {Analytics} {Science} and {Technology}},
+	Doi = {10.1109/VAST.2009.5332584},
+	Isbn = {9781424452835},
+	Month = oct,
+	Pages = {3--10},
+	Publisher = {IEEE},
+	Title = {Interactive visual clustering of large collections of trajectories},
+	Url = {https://ieeexplore.ieee.org/document/5332584/},
+	Urldate = {2021-10-01},
+	Year = {2009},
+	Bdsk-Url-1 = {https://ieeexplore.ieee.org/document/5332584/},
+	Bdsk-Url-2 = {https://doi.org/10.1109/VAST.2009.5332584}}
+
+@article{Banerjee:2007,
+	author  = {Arindam Banerjee and Inderjit Dhillon and Joydeep Ghosh and Srujana Merugu and Dharmendra S. Modha},
+  	title   = {A Generalized Maximum Entropy Approach to Bregman Co-clustering and Matrix Approximation},
+  	journal = {Journal of Machine Learning Research},
+  	year    = {2007},
+  	volume  = {8},
+  	number  = {67},
+  	pages   = {1919-1986},
+  	url     = {http://jmlr.org/papers/v8/banerjee07a.html}}
+
+@article{Barkow:2006,
+    author = {Barkow, Simon and Bleuler, Stefan and Prelić, Amela and Zimmermann, Philip and Zitzler, Eckart},
+    title = "{BicAT: a biclustering analysis toolbox}",
+    journal = {Bioinformatics},
+    volume = {22},
+    number = {10},
+    pages = {1282-1283},
+    year = {2006},
+    month = {03},
+    abstract = "{Summary: Besides classical clustering methods such as hierarchical clustering, in recent years biclustering has become a popular approach to analyze biological data sets, e.g. gene expression data. The Biclustering Analysis Toolbox (BicAT) is a software platform for clustering-based data analysis that integrates various biclustering and clustering techniques in terms of a common graphical user interface. Furthermore, BicAT provides different facilities for data preparation, inspection and postprocessing such as discretization, filtering of biclusters according to specific criteria or gene pair analysis for constructing gene interconnection graphs. The possibility to use different biclustering algorithms inside a single graphical tool allows the user to compare clustering results and choose the algorithm that best fits a specific biological scenario. The toolbox is described in the context of gene expression analysis, but is also applicable to other types of data, e.g. data from proteomics or synthetic lethal experiments.Availability: The BicAT toolbox is freely available at  and runs on all operating systems. The Java source code of the program and a developer's guide is provided on the website as well. Therefore, users may modify the program and add further algorithms or extensions.Contact:barkow@tik.ee.ethz.ch}",
+    issn = {1367-4803},
+    doi = {10.1093/bioinformatics/btl099},
+    url = {https://doi.org/10.1093/bioinformatics/btl099},
+    eprint = {https://academic.oup.com/bioinformatics/article-pdf/22/10/1282/651164/btl099.pdf}}
+
+@inproceedings{Cheng:2000,
+	url = {https://www.aaai.org/Library/ISMB/2000/ismb00-010.php},
+	author = {Cheng, Yizong and Church, George M.}, 
+	title = {Biclustering of Expression Data}, 
+	year = {2000}, 
+	isbn = {1577351150}, 
+	publisher = {AAAI Press}, 
+	booktitle = {Proceedings of the Eighth International Conference on Intelligent Systems for Molecular Biology}, 
+	pages = {93–103}, 
+	numpages = {11}}
+
+@Manual{Dask:2016,
+	title = {Dask: Library for dynamic task scheduling},
+	author = {{Dask Development Team}},
+	year = {2016},
+	url = {https://dask.org}}
+
+@inproceedings{Dhillon:2001,
+	author = {Dhillon, Inderjit S.},
+	title = {Co-Clustering Documents and Words Using Bipartite Spectral Graph Partitioning},
+	year = {2001},
+	isbn = {158113391X},
+	publisher = {Association for Computing Machinery},
+	address = {New York, NY, USA},
+	url = {https://doi.org/10.1145/502512.502550},
+	doi = {10.1145/502512.502550},
+	abstract = {Both document clustering and word clustering are well studied problems. Most existing algorithms cluster documents and words separately but not simultaneously. In this paper we present the novel idea of modeling the document collection as a bipartite graph between documents and words, using which the simultaneous clustering problem can be posed as a bipartite graph partitioning problem. To solve the partitioning problem, we use a new spectral co-clustering algorithm that uses the second left and right singular vectors of an appropriately scaled word-document matrix to yield good bipartitionings. The spectral algorithm enjoys some optimality properties; it can be shown that the singular vectors solve a real relaxation to the NP-complete graph bipartitioning problem. We present experimental results to verify that the resulting co-clustering algorithm works well in practice.},
+	booktitle = {Proceedings of the Seventh ACM SIGKDD International Conference on Knowledge Discovery and Data Mining},
+	pages = {269–274},
+	numpages = {6},
+	location = {San Francisco, California},
+	series = {KDD '01}}																																																																																																																																																															
+
+@inproceedings{Dhillon:2003,
+	Address = {Washington, D.C.},
+	Author = {Dhillon, Inderjit S. and Mallela, Subramanyam and Modha, Dharmendra S.},
+	Booktitle = {Proceedings of the ninth {ACM} {SIGKDD} international conference on {Knowledge} discovery and data mining - {KDD} '03},
+	Doi = {10.1145/956750.956764},
+	Isbn = {9781581137378},
+	Language = {en},
+	Pages = {89},
+	Publisher = {ACM Press},
+	Title = {Information-theoretic co-clustering},
+	Url = {http://portal.acm.org/citation.cfm?doid=956750.956764},
+	Urldate = {2021-10-01},
+	Year = {2003},
+	Bdsk-Url-1 = {http://portal.acm.org/citation.cfm?doid=956750.956764},
+	Bdsk-Url-2 = {https://doi.org/10.1145/956750.956764}}
+
+@article{Eren:2012,
+    author = {Eren, Kemal and Deveci, Mehmet and Küçüktunç, Onur and Çatalyürek, Ümit V.},
+    title = "{A comparative analysis of biclustering algorithms for gene expression data}",
+    journal = {Briefings in Bioinformatics},
+    volume = {14},
+    number = {3},
+    pages = {279-292},
+    year = {2012},
+    month = {07},
+    abstract = "{The need to analyze high-dimension biological data is driving the development of new data mining methods. Biclustering algorithms have been successfully applied to gene expression data to discover local patterns, in which a subset of genes exhibit similar expression levels over a subset of conditions. However, it is not clear which algorithms are best suited for this task. Many algorithms have been published in the past decade, most of which have been compared only to a small number of algorithms. Surveys and comparisons exist in the literature, but because of the large number and variety of biclustering algorithms, they are quickly outdated. In this article we partially address this problem of evaluating the strengths and weaknesses of existing biclustering methods. We used the BiBench package to compare 12 algorithms, many of which were recently published or have not been extensively studied. The algorithms were tested on a suite of synthetic data sets to measure their performance on data with varying conditions, such as different bicluster models, varying noise, varying numbers of biclusters and overlapping biclusters. The algorithms were also tested on eight large gene expression data sets obtained from the Gene Expression Omnibus. Gene Ontology enrichment analysis was performed on the resulting biclusters, and the best enrichment terms are reported. Our analyses show that the biclustering method and its parameters should be selected based on the desired model, whether that model allows overlapping biclusters, and its robustness to noise. In addition, we observe that the biclustering algorithms capable of finding more than one model are more successful at capturing biologically relevant clusters.}",
+    issn = {1467-5463},
+    doi = {10.1093/bib/bbs032},
+    url = {https://doi.org/10.1093/bib/bbs032},
+    eprint = {https://academic.oup.com/bib/article-pdf/14/3/279/709239/bbs032.pdf}}
+
+@article{Govaert:2018,
+	title = {Mutual information, phi-squared and model-based co-clustering for contingency tables},
+	volume = {12},
+	issn = {1862-5355},
+	url = {https://doi.org/10.1007/s11634-016-0274-6},
+	doi = {10.1007/s11634-016-0274-6},
+	abstract = {Many of the datasets encountered in statistics are two-dimensional in nature and can be represented by a matrix. Classical clustering procedures seek to construct separately an optimal partition of rows or, sometimes, of columns. In contrast, co-clustering methods cluster the rows and the columns simultaneously and organize the data into homogeneous blocks (after suitable permutations). Methods of this kind have practical importance in a wide variety of applications such as document clustering, where data are typically organized in two-way contingency tables. Our goal is to offer coherent frameworks for understanding some existing criteria and algorithms for co-clustering contingency tables, and to propose new ones. We look at two different frameworks for the problem of co-clustering. The first involves minimizing an objective function based on measures of association and in particular on phi-squared and mutual information. The second uses a model-based co-clustering approach, and we consider two models: the block model and the latent block model. We establish connections between different approaches, criteria and algorithms, and we highlight a number of implicit assumptions in some commonly used algorithms. Our contribution is illustrated by numerical experiments on simulated and real-case datasets that show the relevance of the presented methods in the document clustering field.},
+	language = {en},
+	number = {3},
+	urldate = {2022-02-05},
+	journal = {Advances in Data Analysis and Classification},
+	author = {Govaert, Gérard and Nadif, Mohamed},
+	month = sep,
+	year = {2018},
+	pages = {455--488}}
+
+@article{Grubesic:2014,
+	Author = {Grubesic, Tony H. and Wei, Ran and Murray, Alan T.},
+	Doi = {10.1080/00045608.2014.958389},
+	Issn = {0004-5608, 1467-8306},
+	Journal = {Annals of the Association of American Geographers},
+	Language = {en},
+	Month = nov,
+	Number = {6},
+	Pages = {1134--1156},
+	Shorttitle = {Spatial {Clustering} {Overview} and {Comparison}},
+	Title = {Spatial {Clustering} {Overview} and {Comparison}: {Accuracy}, {Sensitivity}, and {Computational} {Expense}},
+	Url = {http://www.tandfonline.com/doi/abs/10.1080/00045608.2014.958389},
+	Urldate = {2021-10-01},
+	Volume = {104},
+	Year = {2014},
+	Bdsk-Url-1 = {http://www.tandfonline.com/doi/abs/10.1080/00045608.2014.958389},
+	Bdsk-Url-2 = {https://doi.org/10.1080/00045608.2014.958389}}
+
+@article{Hagenauer:2013,
+	Author = {Hagenauer, Julian and Helbich, Marco},
+	Doi = {10.1080/13658816.2013.788249},
+	Issn = {1365-8816, 1362-3087},
+	Journal = {International Journal of Geographical Information Science},
+	Language = {en},
+	Month = oct,
+	Number = {10},
+	Pages = {2026--2042},
+	Title = {Hierarchical self-organizing maps for clustering spatiotemporal data},
+	Url = {http://www.tandfonline.com/doi/abs/10.1080/13658816.2013.788249},
+	Urldate = {2021-10-01},
+	Volume = {27},
+	Year = {2013},
+	Bdsk-Url-1 = {http://www.tandfonline.com/doi/abs/10.1080/13658816.2013.788249},
+	Bdsk-Url-2 = {https://doi.org/10.1080/13658816.2013.788249}}
+
+@article{Harris:2020,
+   title={Array programming with NumPy},
+   volume={585},
+   ISSN={1476-4687},
+   url={http://dx.doi.org/10.1038/s41586-020-2649-2},
+   DOI={10.1038/s41586-020-2649-2},
+   number={7825},
+   journal={Nature},
+   publisher={Springer Science and Business Media LLC},
+   author={Harris, Charles R. and Millman, K. Jarrod and van der Walt, Stéfan J. and Gommers, Ralf and Virtanen, Pauli and Cournapeau, David and Wieser, Eric and Taylor, Julian and Berg, Sebastian and Smith, Nathaniel J. and Kern, Robert and Picus, Matti and Hoyer, Stephan and van Kerkwijk, Marten H. and Brett, Matthew and Haldane, Allan and del Río, Jaime Fernández and Wiebe, Mark and Peterson, Pearu and Gérard-Marchant, Pierre and Sheppard, Kevin and Reddy, Tyler and Weckesser, Warren and Abbasi, Hameer and Gohlke, Christoph and Oliphant, Travis E.},
+   year={2020},
+   month={Sep},
+   pages={357–362}}
+
+@article{Hartigan:1972,
+	Author = {Hartigan, J. A.},
+	Doi = {10.1080/01621459.1972.10481214},
+	Issn = {0162-1459, 1537-274X},
+	Journal = {Journal of the American Statistical Association},
+	Language = {en},
+	Month = mar,
+	Number = {337},
+	Pages = {123--129},
+	Title = {Direct {Clustering} of a {Data} {Matrix}},
+	Url = {http://www.tandfonline.com/doi/abs/10.1080/01621459.1972.10481214},
+	Urldate = {2021-10-01},
+	Volume = {67},
+	Year = {1972},
+	Bdsk-Url-1 = {http://www.tandfonline.com/doi/abs/10.1080/01621459.1972.10481214},
+	Bdsk-Url-2 = {https://doi.org/10.1080/01621459.1972.10481214}}
+
+@article{Hoyer:2017,
+	Author = {Hoyer, Stephan and Hamman, Joseph J.},
+	Doi = {10.5334/jors.148},
+	Issn = {2049-9647},
+	Journal = {Journal of Open Research Software},
+	Language = {en},
+	Month = apr,
+	Pages = {10},
+	Shorttitle = {xarray},
+	Title = {xarray: {N}-{D} labeled {Arrays} and {Datasets} in {Python}},
+	Url = {http://openresearchsoftware.metajnl.com/articles/10.5334/jors.148/},
+	Urldate = {2021-10-01},
+	Volume = {5},
+	Year = {2017},
+	Bdsk-Url-1 = {http://openresearchsoftware.metajnl.com/articles/10.5334/jors.148/},
+	Bdsk-Url-2 = {https://doi.org/10.5334/jors.148}}
+
+@inproceedings{Jupyter:2018,
+	Address = {Austin, Texas},
+	Author = {{Jupyter Project} and Bussonnier, Matthias and Forde, Jessica and Freeman, Jeremy and Granger, Brian and Head, Tim and Holdgraf, Chris and Kelley, Kyle and Nalvarte, Gladys and Osheroff, Andrew and Pacer, M and Panda, Yuvi and Perez, Fernando and Ragan-Kelley, Benjamin and Willing, Carol},
+	Doi = {10.25080/Majora-4af1f417-011},
+	Pages = {113--120},
+	Title = {Binder 2.0 - {Reproducible}, interactive, sharable environments for science at scale},
+	Url = {https://conference.scipy.org/proceedings/scipy2018/project_jupyter.html},
+	Urldate = {2021-10-01},
+	Year = {2018},
+	Bdsk-Url-1 = {https://conference.scipy.org/proceedings/scipy2018/project_jupyter.html},
+	Bdsk-Url-2 = {https://doi.org/10.25080/Majora-4af1f417-011}}
+
+@article{Kluger:2003,
+	title = {Spectral {Biclustering} of {Microarray} {Data}: {Coclustering} {Genes} and {Conditions}},
+	volume = {13},
+	issn = {1088-9051},
+	shorttitle = {Spectral {Biclustering} of {Microarray} {Data}},
+	url = {https://www.ncbi.nlm.nih.gov/pmc/articles/PMC430175/},
+	doi = {10.1101/gr.648603},
+	abstract = {Global analyses of RNA expression levels are useful for classifying genes and overall phenotypes. Often these classification problems are linked, and one wants to find “marker genes” that are differentially expressed in particular sets of “conditions.” We have developed a method that simultaneously clusters genes and conditions, finding distinctive “checkerboard” patterns in matrices of gene expression data, if they exist. In a cancer context, these checkerboards correspond to genes that are markedly up- or downregulated in patients with particular types of tumors. Our method, spectral biclustering, is based on the observation that checkerboard structures in matrices of expression data can be found in eigenvectors corresponding to characteristic expression patterns across genes or conditions. In addition, these eigenvectors can be readily identified by commonly used linear algebra approaches, in particular the singular value decomposition (SVD), coupled with closely integrated normalization steps. We present a number of variants of the approach, depending on whether the normalization over genes and conditions is done independently or in a coupled fashion. We then apply spectral biclustering to a selection of publicly available cancer expression data sets, and examine the degree to which the approach is able to identify checkerboard structures. Furthermore, we compare the performance of our biclustering methods against a number of reasonable benchmarks (e.g., direct application of SVD or normalized cuts to raw data).},
+	number = {4},
+	urldate = {2022-02-05},
+	journal = {Genome Research},
+	author = {Kluger, Yuval and Basri, Ronen and Chang, Joseph T. and Gerstein, Mark},
+	month = apr,
+	year = {2003},
+	pmid = {12671006},
+	pmcid = {PMC430175},
+	pages = {703--716}}
+
+@inproceedings{Kluyver:2016,
+	booktitle = {Positioning and Power in Academic Publishing: Players, Agents and Agendas},
+	editor = {Fernando Loizides and Birgit Scmidt},
+	title = {Jupyter Notebooks - a publishing format for reproducible computational workflows},
+	author = {Kluyver, Thomas and Ragan-Kelley, Benjamin and P{\'e}rez, Fernando and Granger, Brian and Bussonnier, Matthias and Frederic, Jonathan and Kelley, Kyle and Hamrick, Jessica and Grout, Jason and Corlay, Sylvain and Ivanov, Paul and Avila, Dami{\'a}n and Abdalla, Safia and Willing, Carol and {Jupyter development team}},
+	publisher = {IOS Press},
+	year = {2016},
+	pages = {87--90},
+	url = {https://eprints.soton.ac.uk/403913/},
+	abstract = {It is increasingly necessary for researchers in all fields to write computer code, and in order to reproduce research results, it is important that this code is published. We present Jupyter notebooks, a document format for publishing code, results and explanations in a form that is both readable and executable. We discuss various tools and use cases for notebook documents.}}
+
+@article{Kullback:1951,
+	title = {On {Information} and {Sufficiency}},
+	volume = {22},
+	issn = {0003-4851},
+	url = {http://projecteuclid.org/euclid.aoms/1177729694},
+	doi = {10.1214/aoms/1177729694},
+	language = {en},
+	number = {1},
+	urldate = {2022-02-15},
+	journal = {The Annals of Mathematical Statistics},
+	author = {Kullback, S. and Leibler, R. A.},
+	month = mar,
+	year = {1951},
+	pages = {79--86}}
+
+@inproceedings{Lam:2015,
+	author = {Lam, Siu Kwan and Pitrou, Antoine and Seibert, Stanley},
+	title = {Numba: A LLVM-Based Python JIT Compiler},
+	year = {2015},
+	isbn = {9781450340052},
+	publisher = {Association for Computing Machinery},
+	address = {New York, NY, USA},
+	url = {https://doi.org/10.1145/2833157.2833162},
+	doi = {10.1145/2833157.2833162},
+	abstract = {Dynamic, interpreted languages, like Python, are attractive for domain-experts and scientists experimenting with new ideas. However, the performance of the interpreter is often a barrier when scaling to larger data sets. This paper presents a just-in-time compiler for Python that focuses in scientific and array-oriented computing. Starting with the simple syntax of Python, Numba compiles a subset of the language into efficient machine code that is comparable in performance to a traditional compiled language. In addition, we share our experience in building a JIT compiler using LLVM[1].},
+	booktitle = {Proceedings of the Second Workshop on the LLVM Compiler Infrastructure in HPC},
+	articleno = {7},
+	numpages = {6},
+	keywords = {compiler, LLVM, Python},
+	location = {Austin, Texas},
+	series = {LLVM '15}}
+
+ @misc{Merugu:2004,
+	year = {2004},
+	title={Bregman {Co}-clustering code in {Matlab}},
+	url={http://www.ideal.ece.utexas.edu/software.html},
+	author={Merugu, Srujana and Banerjee, Arindam}}
+
+@book{Mirkin:1996,
+	Address = {Dordrecht ; Boston},
+	Author = {Mirkin, B. G.},
+	Isbn = {9780792341598},
+	Keywords = {Discriminant analysis, Cluster analysis},
+	Number = {v. 11},
+	Publisher = {Kluwer Academic Publishers},
+	Series = {Nonconvex optimization and its applications},
+	Title = {Mathematical classification and clustering},
+	Year = {1996}}
+
+@article{Pedregosa:2011,
+	url = {https://www.jmlr.org/papers/v12/pedregosa11a.html},
+	author = {Pedregosa, Fabian and Varoquaux, Ga\"{e}l and Gramfort, Alexandre and Michel, Vincent and Thirion, Bertrand and Grisel, Olivier and Blondel, Mathieu and Prettenhofer, Peter and Weiss, Ron and Dubourg, Vincent and Vanderplas, Jake and Passos, Alexandre and Cournapeau, David and Brucher, Matthieu and Perrot, Matthieu and Duchesnay, \'{E}douard}, 
+	title = {Scikit-Learn: Machine Learning in Python}, 
+	year = {2011}, 
+	issue_date = {2/1/2011}, 
+	publisher = {JMLR.org}, 
+	volume = {12}, 
+	number = {85}, 
+	issn = {1532-4435}, 
+	abstract = {Scikit-learn is a Python module integrating a wide range of state-of-the-art machine learning algorithms for medium-scale supervised and unsupervised problems. This package focuses on bringing machine learning to non-specialists using a general-purpose high-level language. Emphasis is put on ease of use, performance, documentation, and API consistency. It has minimal dependencies and is distributed under the simplified BSD license, encouraging its use in both academic and commercial settings. Source code, binaries, and documentation can be downloaded from http://scikit-learn.sourceforge.net.}, 
+	journal = {Journal of Machine Learning Research}, 
+	month = {nov}, 
+	pages = {2825–2830}, 
+	numpages = {6}}
+
+@article{Role:2019,
+	Author = {Role, Fran{\c c}ois and Morbieu, Stanislas and Nadif, Mohamed},
+	Doi = {10.18637/jss.v088.i07},
+	Issn = {1548-7660},
+	Journal = {Journal of Statistical Software},
+	Language = {en},
+	Number = {7},
+	Shorttitle = {\textbf{{CoClust}}},
+	Title = {\textbf{{CoClust}} : {A} \textit{{Python}} {Package} for {Co}-{Clustering}},
+	Url = {http://www.jstatsoft.org/v88/i07/},
+	Urldate = {2021-10-01},
+	Volume = {88},
+	Year = {2019},
+	Bdsk-Url-1 = {http://www.jstatsoft.org/v88/i07/},
+	Bdsk-Url-2 = {https://doi.org/10.18637/jss.v088.i07}}
+
+@article{Rousseeuw:1987,
+	Author = {Rousseeuw, Peter J.},
+	Doi = {10.1016/0377-0427(87)90125-7},
+	Issn = {03770427},
+	Journal = {Journal of Computational and Applied Mathematics},
+	Language = {en},
+	Month = nov,
+	Pages = {53--65},
+	Shorttitle = {Silhouettes},
+	Title = {Silhouettes: {A} graphical aid to the interpretation and validation of cluster analysis},
+	Url = {https://linkinghub.elsevier.com/retrieve/pii/0377042787901257},
+	Urldate = {2021-10-01},
+	Volume = {20},
+	Year = {1987},
+	Bdsk-Url-1 = {https://linkinghub.elsevier.com/retrieve/pii/0377042787901257},
+	Bdsk-Url-2 = {https://doi.org/10.1016/0377-0427(87)90125-7}}
+
+@article{Shi:2018,
+  	title={Discovering the Trading Pattern of Financial Market Participants: Comparison of Two Co-Clustering Methods},
+  	author={Guangwei Shi and Liying Ren and Zhongchen Miao and Jian Gao and Yanzhe Che and Jidong Lu},
+  	journal={IEEE Access},
+  	year={2018},
+  	volume={6},
+  	pages={14431-14438},
+	doi={10.1109/ACCESS.2018.2801263}}
+
+@article{Wu:2015,
+	Author = {Wu, Xiaojing and Zurita-Milla, Raul and Kraak, Menno-Jan},
+	Doi = {10.1080/13658816.2014.994520},
+	Issn = {1365-8816, 1362-3087},
+	Journal = {International Journal of Geographical Information Science},
+	Language = {en},
+	Month = apr,
+	Number = {4},
+	Pages = {624--642},
+	Shorttitle = {Co-clustering geo-referenced time series},
+	Title = {Co-clustering geo-referenced time series: exploring spatio-temporal patterns in {Dutch} temperature data},
+	Url = {http://www.tandfonline.com/doi/full/10.1080/13658816.2014.994520},
+	Urldate = {2021-10-01},
+	Volume = {29},
+	Year = {2015},
+	Bdsk-Url-1 = {http://www.tandfonline.com/doi/full/10.1080/13658816.2014.994520},
+	Bdsk-Url-2 = {https://doi.org/10.1080/13658816.2014.994520}}
+
+@article{Wu:2016,
+	Author = {Wu, Xiaojing and Zurita-Milla, Raul and Kraak, Menno-Jan},
+	Doi = {10.1002/2015JG003308},
+	Issn = {21698953},
+	Journal = {Journal of Geophysical Research: Biogeosciences},
+	Language = {en},
+	Month = jun,
+	Number = {6},
+	Pages = {1434--1448},
+	Shorttitle = {A novel analysis of spring phenological patterns over {Europe} based on co-clustering},
+	Title = {A novel analysis of spring phenological patterns over {Europe} based on co-clustering: {Co}-{Clustering} {European} {Spring} {Phenology}},
+	Url = {http://doi.wiley.com/10.1002/2015JG003308},
+	Urldate = {2021-10-01},
+	Volume = {121},
+	Year = {2016},
+	Bdsk-Url-1 = {http://doi.wiley.com/10.1002/2015JG003308},
+	Bdsk-Url-2 = {https://doi.org/10.1002/2015JG003308}}
+
+@article{Wu:2018,
+	Author = {Wu, Xiaojing and Zurita-Milla, Raul and Izquierdo-Verdiguier, Emma and Kraak, Menno-Jan},
+	Doi = {10.1080/24694452.2017.1325725},
+	Issn = {2469-4452, 2469-4460},
+	Journal = {Annals of the American Association of Geographers},
+	Language = {en},
+	Month = jan,
+	Number = {1},
+	Pages = {71--87},
+	Title = {Triclustering {Georeferenced} {Time} {Series} for {Analyzing} {Patterns} of {Intra}-{Annual} {Variability} in {Temperature}},
+	Url = {https://www.tandfonline.com/doi/full/10.1080/24694452.2017.1325725},
+	Urldate = {2021-10-01},
+	Volume = {108},
+	Year = {2018},
+	Bdsk-Url-1 = {https://www.tandfonline.com/doi/full/10.1080/24694452.2017.1325725},
+	Bdsk-Url-2 = {https://doi.org/10.1080/24694452.2017.1325725}}
+
+@article{Wu:2020,
+	Author = {Wu, Xiaojing and Poorthuis, Ate and Zurita-Milla, Raul and Kraak, Menno-Jan},
+	Doi = {10.1016/j.cageo.2020.104420},
+	Issn = {00983004},
+	Journal = {Computers \& Geosciences},
+	Language = {en},
+	Month = apr,
+	Pages = {104420},
+	Title = {An interactive web-based geovisual analytics platform for co-clustering spatio-temporal data},
+	Url = {https://linkinghub.elsevier.com/retrieve/pii/S0098300419308672},
+	Urldate = {2021-10-01},
+	Volume = {137},
+	Year = {2020},
+	Bdsk-Url-1 = {https://linkinghub.elsevier.com/retrieve/pii/S0098300419308672},
+	Bdsk-Url-2 = {https://doi.org/10.1016/j.cageo.2020.104420}}
diff --git a/manuscript/paper.md b/manuscript/paper.md
new file mode 100644
index 0000000..1d97f55
--- /dev/null
+++ b/manuscript/paper.md
@@ -0,0 +1,185 @@
+---
+title: 'CGC: a scalable Python package for co- and tri-clustering of geodata cubes'
+tags:
+  - Python
+  - clustering
+  - co-clustering
+  - tri-clustering
+  - geospatial
+authors:
+  - name: Francesco Nattino
+    orcid: 0000-0003-3286-0139
+    affiliation: "1" # (Multiple affiliations must be quoted)
+  - name: Ou Ku 
+    orcid: 0000-0002-5373-5209
+    affiliation: "1"
+  - name: Meiert W. Grootes 
+    orcid: 0000-0002-5733-4795
+    affiliation: "1"
+  - name: Emma Izquierdo-Verdiguier
+    orcid: 0000-0003-2179-1262
+    affiliation: "2"
+  - name: Serkan Girgin
+    orcid: 0000-0002-0156-185X
+    affiliation: "3"
+  - name: Raul Zurita-Milla
+    orcid: 0000-0002-1769-6310
+    affiliation: "3"
+affiliations:
+ - name: Netherlands eScience Center, Science Park 140, 1098 XG Amsterdam, The Netherlands
+   index: 1
+ - name: Institute of Geomatics, University of Natural Resources and Life Science (BOKU), 1190, Vienna, Austria
+   index: 2
+ - name: Faculty of Geo-Information Science and Earth Observation (ITC), University of Twente, PO Box 217, 7500 AE, Enschede, the Netherlands
+   index: 3
+date: 17 December 2021
+bibliography: paper.bib
+---
+# Summary
+
+Multidimensional data cubes are increasingly ubiquitous, in particular in the geosciences. Clustering techniques encompassing their full dimensionality are necessary to identify patterns "hidden" within these cubes. Clustering Geodata Cubes (CGC) is a Python package designed for partitional clustering, which identifies groups of similar data across two (e.g., spatial and temporal) or three (e.g., spatial, temporal, and thematic) dimensions. CGC provides efficient and scalable co- and tri-clustering functionality appropriate to analyze both small and large datasets as well as a cluster refinement functionality that supports users in their quest to make sense of complex datasets.   
+
+
+# Introduction
+
+Faced with the increasing ubiquity of large datasets, data mining techniques have become essential to extracting patterns and generating insights. In this regard, clustering techniques, which aim to identify groups or subgroups with similar properties within a larger dataset, are becoming ever more popular.
+
+Traditional clustering techniques focus on a single dimension and may therefore obfuscate relevant groups [@Hartigan:1972;@Cheng:2000]. Hence, clustering techniques capable of simultaneously grouping data along multiple dimensions are needed. These techniques -- referred to as co- or bi-clustering and tri-clustering in the case of two and three dimensions, respectively -- have seen significant development and adoption in fields ranging from bioinformatics [@Cheng:2000] to finance [@Shi:2018] and natural language processing [@Dhillon:2001].
+
+The exponential growth of multidimensional data referring to geographical features (e.g., time series of satellite images) has resulted in a wide variety of geodata cubes, which can benefit from co- and tri-clustering. Indeed, following the development of a general information-theoretical approach [@Dhillon:2003] to partitional co-clustering [@Banerjee:2007], Wu et al. presented an application of co-clustering to geodata [@Wu:2015], as well as its extension to three dimensions [@Wu:2018]. 
+
+In light of the eminent employability of co- and tri-clustering approaches to geospatial disciplines like geo-information science and Earth observation, and the transferability to other (geo)scientific domains, this paper presents the Clustering Geodata Cubes (CGC) package.
+CGC provides efficient and scalable co- and tri-clustering methods to analyze both small and large datasets on single or multiple computing node systems. It also features a cluster refinement functionality that allows users to make sense of complex datasets more easily. An example of its application is the ongoing work on the analysis of spring onset datasets at high spatial resolution and continental scale, a preview of which is presented in the CGC tutorial. Although the package aims to meet the needs of geospatial data scientists, the algorithms implemented remain widely applicable and can easily be applied in other domains that require performing partitional clustering of positive data matrices.
+
+
+# Statement of need 
+
+The CGC package focuses on the needs of geospatial data scientists who require tools to make sense of multi-dimensional data cubes by providing the following features and functionalities:
+
+- **Partitional co- and tri-clustering methods suitable for spatiotemporal (multi-dimensional) data.** 
+  CGC includes clustering methods designed to simultaneously group elements into disjoint clusters along two or three dimensions. These methods are advantageous over one-dimensional clustering in that they provide a strategy to identify patterns that unfold across multiple dimensions, e.g. space and time. In addition, CGC provides functionality to refine the identified co- and tri-clusters. This post-processing step reduces the number of clusters to facilitate the identification and visualization of patterns.
+ 
+- **Scalable clustering of small and big datasets.**
+  CGC offers functionality to efficiently utilize available computational resources (ranging from single machines to computing clusters) and to tackle a wide range of dataset sizes. For single machine execution the package offers optimized support of multi-core CPUs and/or limited system memory. For large datasets CGC supports the use of distributed data and computation on computing clusters
+
+- **Easy integration into geospatial analysis workflows.** 
+  CGC is written in Python, which is widely used for geospatial scripting and applications, and employs NumPy [@Harris:2020] and Dask [@Dask:2016] arrays as input and output data types, guaranteeing seamless integration to the Python ecosystem and interoperability with the libraries prevalent in the field of big (geo)data. This furthermore ensures the interoperability of CGC with the Xarray package [@Hoyer:2017], so that this versatile 
+  and popular tool can be used for data loading and manipulation before and after analyses with CGC.
+
+- **Ease of use and reproducibility.**
+  To facilitate community use and adoption, documentation and tutorials illustrating domain-science examples, applications, and use cases are available via the [publicly accessible repository](https://github.com/phenology/cgc), where development takes place, and which provides a platform for issue tracking. CGC is distributed via the 
+  [Python Package Index (PyPI)](https://pypi.org/project/clustering-geodata-cubes/), and code-release snapshots archived on [Zenodo](https://zenodo.org/record/5788737) facilitate reproducible analysis.
+
+
+# Algorithms
+
+## Co-clustering
+
+CGC implements the Bregman block average co-clustering (BBAC) algorithm from @Banerjee:2007 as inspired by the MATLAB code of [@Merugu:2004].
+Briefly, the BBAC algorithm iteratively optimizes the clustering of rows and columns of a data matrix starting from a random initial assignment until convergence. The information loss from the original matrix to the clustered one, which is constructed as the matrix of the co-cluster means, is minimized using a loss function that is based on the I-divergence [@Kullback:1951;@Dhillon:2003]. CGC also supports a user-defined convergence threshold. To limit the influence of the initial conditions on the final clustering and to avoid local minima several runs are carried out, with the cluster assignments from the lowest loss function value ultimately being selected. Number of runs can be altered by the user.
+
+Note that in the CGC implementation of the algorithm, the update in the row- and column-cluster assignments is computed only from the previous iteration’s row and column. Contrarily to the original MATLAB implementation [@Merugu:2004], this makes the algorithm independent of the order in which the dimensions are considered, while still leading to an optimal clustering solution. 
+
+
+## Tri-clustering
+
+For tri-clustering CGC implements the so-called Bregman cube average tri-clustering (BCAT) algorithm, which is a generalization of the BBAC algorithm to three dimensions [@Wu:2018]. The algorithmic implementation with respect to the loss function and the update schema are analogous to that described above for the co-clustering. Similarly, the tri-clustering outcome is independent of the order in which the three dimensions of the input array are provided.
+
+
+## Cluster refinement
+
+The CGC package implements an optional, secondary cluster refinement step based on the k-means method [@Wu:2016] and optimized using the Silhouette metric [@Rousseeuw:1987] as implemented in the scikit-learn package [@Pedregosa:2011]. This secondary grouping is based on statistical properties of the co- or tri-clusters (see the [package documentation](https://cgc.readthedocs.io)) and helps to better capture patterns in the data by combining clusters and going beyond strict checkerboard structures.  
+
+
+# Related Software
+
+A number of co-/bi-clustering implementations based on different algorithms exist. While some of the available packages
+focus on specific applications, like gene expression data [@Barkow:2006;@Eren:2012], generic co-clustering tools include biclust 
+(R) and CoClust (Python) [@Role:2019], as well as two implementations from the scikit-learn Python library [@Pedregosa:2011]. 
+Most of the available algorithms target tabular data with a hidden blocked-diagonal structure, 
+where each row and column of the input matrix is assigned to only one co-cluster. In contrast, in spatio-temporal data a
+set of spatial elements often exhibits the same behaviour within multiple time windows and vice versa. This type of data 
+requires algorithms where a subset taken along one dimension can be associated to multiple subsets taken along the other
+dimension. Partitioning algorithms of this type, such as the BBAC and BCAT algorithms implemented in CGC, can discover 
+checkerboard-like patterns in the input data matrix. The package additionally enables the user to recover 
+more of the intrinsic structure of the data in a second step, going beyond the limits on structure imposed 
+
+Within the Python ecosystem, prominent implementations targeting checkerboard-like structures akin to CGC's intial step are the 
+scikit-learn SpectralBiclustering algorithm, which implements the method from [@Kluger:2003], and the CoclustInfo 
+algorithm from CoClust, also based on information-theoretic co-clustering [@Dhillon:2003;@Govaert:2018]. However, both 
+approaches differ from CGC in the field of applicability. Spectral methods like the former are fast, but their accuracy 
+has been shown to be limited [@Ailem:2015;@Role:2019]. The latter focuses on datasets representing joint-probability 
+distributions, preserving statistics other than the co-cluster average (the row and column averages) in the search for 
+the optimal clustering solution [@Banerjee:2007]. This requirement does not generally apply to the geospatial datasets
+which CGC is targeting. Neither, however, offers the ability to "break out" of the algorithmically-imposed checkerboard 
+pattern.
+
+Finally, to the best of our knowledge, CGC is unique in being designed from the outset for use with big data (e.g. by 
+including an implementation that supports multi-node distributed computing), being able to analyze more complex data cubes via 
+tri-clustering, and being able to perform secondary cluster refinement.
+
+# Software package overview 
+
+The CGC software is structured in the following main modules, details of which are described in the 
+[online package documentation](https://cgc.readthedocs.io):
+
+- [`coclustering`](https://cgc.readthedocs.io/en/latest/coclustering.html#), containing the following implementations of the co-clustering algorithm:
+
+    - The [NumPy-based, vectorized single machine implementation with threading support for optimal usage of multi-core CPUs.](https://cgc.readthedocs.io/en/latest/coclustering.html#local-numpy-based)
+
+    - The [NumPy-based single machine implementation with a reduced memory footprint](https://cgc.readthedocs.io/en/latest/coclustering.html#local-numpy-based-low-memory-footprint). This implementation trades performance for low memory usage, but uses Numba's
+       just-in-time compilation [@Lam:2015] to mitigate performance loss.
+
+    - The [Dask-based implementation](https://cgc.readthedocs.io/en/latest/coclustering.html#distributed-dask-based). This 
+      implementation provides support for clustering large, out-of-core datasets by distributing the computation across multiple nodes using Dask arrays. 
+
+      
+- [`triclustering`](https://cgc.readthedocs.io/en/latest/triclustering.html), containing the following tri-clustering 
+  implementations:
+
+    - A [NumPy-based implementation](https://cgc.readthedocs.io/en/latest/triclustering.html#local-numpy-based) 
+      analogous to the co-clustering one described above (note that the low-memory version is currently not available).
+    - A [Dask-based implementation](https://cgc.readthedocs.io/en/latest/triclustering.html#distributed-dask-based), 
+      also analogous to the corresponding co-clustering version described above. 
+
+- [`kmeans`](https://cgc.readthedocs.io/en/latest/kmeans.html), which implements the k-means cluster refinement step for 
+  both co- and tri-clustering.
+
+- [`utils`](https://https://cgc.readthedocs.io/en/latest/utils.html), which includes a collection of utility functions e.g., memory consumption estimation and cluster averaging. 
+ 
+Performance comparisons between the various [co-clustering](https://cgc.readthedocs.io/en/latest/coclustering.html#performance-comparison) 
+and [tri-clustering](https://cgc.readthedocs.io/en/latest/triclustering.html#performance-comparison) implementations are 
+also briefly discussed in the package documentation. 
+
+# Tutorial 
+	
+The software package is complemented by an [online tutorial](https://cgc-tutorial.readthedocs.io) (in the form of Jupyter notebooks [@Kluyver:2016]) that illustrates how to perform cluster analysis of geospatial datasets using CGC. Notebooks are made directly available via a 
+[dedicated GitHub repository](https://github.com/esciencecenter-digital-skills/tutorial-cgc), and are also 
+published as [static web pages](https://cgc-tutorial.readthedocs.io) for reference and linked to the 
+[CGC documentation](https://cgc.readthedocs.io) via a 'Tutorials' tab. The tutorials are designed to run on systems with 
+limited CPU/memory capacity, which, together with environment requirement specifications in a standardized format 
+(`conda` YAML file) and binder badges, give users the possibility to easily run the notebooks live on 
+`mybinder.org` [@Jupyter:2018].
+
+Tutorials cover the following topics:
+
+- Co- and tri-cluster analysis. 
+- K-means-based cluster refinement.
+- Choice of the suitable implementation for a given problem size/infrastructure available.
+- Loading of geospatial data, common data-manipulation tasks in a workflow involving CGC, visualization of the output. 
+
+Note that while the tutorial is aimed at geospatial uses cases, it illustrates some real-case applications that are 
+likely to make it easier for users to carry out cluster analysis using CGC in other fields as well. 
+ 
+
+# Acknowledgements
+
+The authors would like to thank Dr. Yifat Dzigan for the helpful discussions and support and Dr. Romulo Goncalves for the 
+preliminary work that led to the development of the software package presented here. We also would like to thank SURF for providing computational resources to test the first versions of the CGC package via the e-infra190130 grant.  
+ 
+
+# Author contributions 
+
+All co-authors contributed to the conceptualization of the work, which was led by R.Z.M. and E.I.V.. F.N., M.W.G., and O.K. prepared the first draft of the tutorials, and wrote the initial draft of this manuscript. F.N. suggested changes to the co- and tri-clustering algorithms. R.Z.M., E.I.V., and S.G. led the design of experiments to test and improve the CGC package. R.Z.M. and E.I.V. helped to improve the tutorials. S.G. provided the required computational resources to run the experiments and tutorials and made suggestions for code optimizations. All co-authors reviewed and edited the final document.  
+
+# References


Test patch:
diff --git a/tests/test_utils.py b/tests/test_utils.py
index 504fce3..d6456e1 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -10,8 +10,8 @@ def test_size_list():
     mat_size_list = [(300000, 50), (500000000, 50), (100, 600000000),
                      (5000, 5000)]
     cls_num_list = [(100, 5), (250, 5), (10, 300), (40, 40)]
-    expect_res_list = [(686.7, 'MB', 1), (2514.6, 'GB', 1), (3799.8, 'GB', 2),
-                       (196.8, 'MB', 1)]
+    expect_res_list = [(600.85, 'MB', 1), (2165.32, 'GB', 1),
+                       (3296.88, 'GB', 2), (195.69, 'MB', 1)]
     test_size = []
     for nrowcol, nrowcol_cls, expect_res in zip(mat_size_list, cls_num_list,
                                                 expect_res_list):
@@ -30,7 +30,7 @@ def test_human_size(self):
     def test_mem_estimate_coclustering_numpy(self, test_size_list):
         for size_input, size_expect in test_size_list:
             size_estimate = utils.mem_estimate_coclustering_numpy(*size_input)
-            assert size_estimate[0] - size_expect[0] < 1.
+            assert np.abs(size_estimate[0] - size_expect[0]) < 1.
             assert size_estimate[1] == size_expect[1]
             assert size_estimate[2] == size_expect[2]