diff --git a/.devel/sphinx/index.md b/.devel/sphinx/index.md index 5b059cbd..3813152e 100644 --- a/.devel/sphinx/index.md +++ b/.devel/sphinx/index.md @@ -118,6 +118,10 @@ which we use for computing the normalised accuracy and pair sets index). About Author +Source Code (GitHub) +Bug Tracker and Feature Suggestions +PyPI Entry +CRAN Entry :::: @@ -149,11 +153,7 @@ rapi :maxdepth: 1 :caption: See Also -Source Code (GitHub) -Bug Tracker and Feature Suggestions -PyPI Entry -CRAN Entry -Clustering Benchmarks +Clustering Benchmarks Data Wrangling in Python :::: diff --git a/.devel/sphinx/news.md b/.devel/sphinx/news.md index 337f4a3c..4d707831 100644 --- a/.devel/sphinx/news.md +++ b/.devel/sphinx/news.md @@ -1,10 +1,10 @@ # What Is New in *genieclust* -## 1.1.x (under development) +## 1.1.0 (2022-09-05) -- [GENERAL] ..TO DO.. We now mention that the partition similarity scores - are discussed in more detail at + +- [GENERAL] The cluster validity measures are discussed in more detail at . - [Python and R] New function: @@ -12,7 +12,7 @@ - [Python and R] Implementations of the so-called internal cluster validity measures discussed in - DOI:[10.1016/j.ins.2021.10.004](https://doi.org/10.1016/j.ins.2021.10.004); + DOI: [10.1016/j.ins.2021.10.004](https://doi.org/10.1016/j.ins.2021.10.004); see our (GitHub-only) [CVI](https://github.com/gagolews/optim_cvi) package for R. In particular, the generalised Dunn indices are based on the code originally authored by Maciej Bartoszuk. Thanks. @@ -47,7 +47,7 @@ - [GENERAL] A paper on the `genieclust` package is now available: M. Gagolewski, genieclust: Fast and robust hierarchical clustering, - *SoftwareX* **15**, 100722, 2021, DOI: + SoftwareX 15, 100722, 2021, DOI: [10.1016/j.softx.2021.100722](https://doi.org/10.1016/j.softx.2021.100722). - [Python] `plots.plot_scatter` now uses a more accessible default palette diff --git a/.devel/sphinx/rapi/comparing_partitions.md b/.devel/sphinx/rapi/comparing_partitions.md index b67db077..2a092d40 100644 --- a/.devel/sphinx/rapi/comparing_partitions.md +++ b/.devel/sphinx/rapi/comparing_partitions.md @@ -36,11 +36,11 @@ normalizing_permutation(x, y = NULL) ## Arguments -| | | -|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `x` | an integer vector of length n (or an object coercible to) representing a K-partition of an n-set (e.g., a reference partition), or a confusion matrix with K rows and L columns (see [`table(x, y)`](https://stat.ethz.ch/R-manual/R-devel/library/base/html/table.html)) | -| `y` | an integer vector of length n (or an object coercible to) representing an L-partition of the same set (e.g., the output of a clustering algorithm we wish to compare with `x`), or NULL (if x is an K\*L confusion matrix) | -| `whether` | to assume E=1 in the definition of the pair sets index index, i.e., use Eq. (20) instead of (18); see (Rezaei, Franti, 2016). | +| | | +|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `x` | an integer vector of length n (or an object coercible to) representing a K-partition of an n-set (e.g., a reference partition), or a confusion matrix with K rows and L columns (see [`table(x, y)`](https://stat.ethz.ch/R-manual/R-devel/library/base/html/table.html)) | +| `y` | an integer vector of length n (or an object coercible to) representing an L-partition of the same set (e.g., the output of a clustering algorithm we wish to compare with `x`), or NULL (if x is an K\*L confusion matrix) | +| `simplified` | whether to assume E=1 in the definition of the pair sets index index, i.e., use Eq. (20) instead of (18); see (Rezaei, Franti, 2016). | ## Details @@ -80,7 +80,7 @@ Each cluster validity measure is a single numeric value. Gagolewski M., *A Framework for Benchmarking Clustering Algorithms*, 2022, . -Gagolewski M., Adjusted asymmetric accuracy: An interpretable external cluster validity measure, 2022, submitted for publication. +Gagolewski M., Adjusted asymmetric accuracy: A well-behaving external cluster validity measure, 2022, submitted for publication. Hubert L., Arabie P., Comparing partitions, *Journal of Classification* 2(1), 1985, 193-218, esp. Eqs. (2) and (4). diff --git a/DESCRIPTION b/DESCRIPTION index f3b162ba..d8df0d39 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: genieclust Type: Package Title: Fast and Robust Hierarchical Clustering with Noise Points Detection -Version: 1.0.0.9001 -Date: 2022-08-29 +Version: 1.1.0 +Date: 2022-09-05 Authors@R: c( person("Marek", "Gagolewski", role = c("aut", "cre", "cph"), diff --git a/MANIFEST b/MANIFEST index 3b48a1ac..562dd38c 100644 --- a/MANIFEST +++ b/MANIFEST @@ -2,13 +2,13 @@ LICENSE MANIFEST.in NEWS -README.rst requirements.txt setup.cfg setup.py genieclust/__init__.py genieclust/c_argfuns.pxd genieclust/c_compare_partitions.pxd +genieclust/c_cvi.pxd genieclust/c_disjoint_sets.pxd genieclust/c_genie.pxd genieclust/c_gini_disjoint_sets.pxd @@ -16,6 +16,7 @@ genieclust/c_inequity.pxd genieclust/c_mst.pxd genieclust/c_postprocess.pxd genieclust/c_preprocess.pxd +genieclust/cluster_validity.pyx genieclust/compare_partitions.pyx genieclust/genie.py genieclust/inequity.pyx @@ -25,6 +26,7 @@ genieclust/tools.pyx src/c_argfuns.h src/c_common.h src/c_compare_partitions.h +src/c_cvi.h src/c_disjoint_sets.h src/c_distance.h src/c_genie.h diff --git a/NEWS b/NEWS index 337f4a3c..4d707831 100644 --- a/NEWS +++ b/NEWS @@ -1,10 +1,10 @@ # What Is New in *genieclust* -## 1.1.x (under development) +## 1.1.0 (2022-09-05) -- [GENERAL] ..TO DO.. We now mention that the partition similarity scores - are discussed in more detail at + +- [GENERAL] The cluster validity measures are discussed in more detail at . - [Python and R] New function: @@ -12,7 +12,7 @@ - [Python and R] Implementations of the so-called internal cluster validity measures discussed in - DOI:[10.1016/j.ins.2021.10.004](https://doi.org/10.1016/j.ins.2021.10.004); + DOI: [10.1016/j.ins.2021.10.004](https://doi.org/10.1016/j.ins.2021.10.004); see our (GitHub-only) [CVI](https://github.com/gagolews/optim_cvi) package for R. In particular, the generalised Dunn indices are based on the code originally authored by Maciej Bartoszuk. Thanks. @@ -47,7 +47,7 @@ - [GENERAL] A paper on the `genieclust` package is now available: M. Gagolewski, genieclust: Fast and robust hierarchical clustering, - *SoftwareX* **15**, 100722, 2021, DOI: + SoftwareX 15, 100722, 2021, DOI: [10.1016/j.softx.2021.100722](https://doi.org/10.1016/j.softx.2021.100722). - [Python] `plots.plot_scatter` now uses a more accessible default palette diff --git a/R/RcppExports.R b/R/RcppExports.R index acc4d056..a8c7120b 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -91,7 +91,7 @@ #' Gagolewski M., \emph{A Framework for Benchmarking Clustering Algorithms}, #' 2022, \url{https://clustering-benchmarks.gagolewski.com}. #' -#' Gagolewski M., Adjusted asymmetric accuracy: An interpretable external +#' Gagolewski M., Adjusted asymmetric accuracy: A well-behaving external #' cluster validity measure, 2022, submitted for publication. #' #' Hubert L., Arabie P., Comparing partitions, @@ -126,7 +126,7 @@ #' clustering algorithm we wish to compare with \code{x}), #' or NULL (if x is an K*L confusion matrix) #' -#' @param whether to assume E=1 in the definition of the pair sets index index, +#' @param simplified whether to assume E=1 in the definition of the pair sets index index, #' i.e., use Eq. (20) instead of (18); see (Rezaei, Franti, 2016). #' #' diff --git a/README.md b/README.md index a10e45c3..5ee04a95 100644 --- a/README.md +++ b/README.md @@ -231,7 +231,7 @@ Gagolewski M., Bartoszuk M., Cena A., Are cluster validity measures (in)valid?, *Information Sciences* **581**, 2021, 620–636. [DOI: 10.1016/j.ins.2021.10.004](https://doi.org/10.1016/j.ins.2021.10.004). -Gagolewski M., *Adjusted asymmetric accuracy: An interpretable external +Gagolewski M., *Adjusted asymmetric accuracy: A well-behaving external cluster validity measure*, 2022, submitted for publication. Gagolewski M., *A Framework for Benchmarking Clustering Algorithms*. diff --git a/docs/_images/benchmarks_ar_plot_large_1.png b/docs/_images/benchmarks_ar_plot_large_1.png index 603b4812..53079ccc 100644 Binary files a/docs/_images/benchmarks_ar_plot_large_1.png and b/docs/_images/benchmarks_ar_plot_large_1.png differ diff --git a/docs/_images/benchmarks_ar_plot_small_1.png b/docs/_images/benchmarks_ar_plot_small_1.png index cefa10cc..48d3aacd 100644 Binary files a/docs/_images/benchmarks_ar_plot_small_1.png and b/docs/_images/benchmarks_ar_plot_small_1.png differ diff --git a/docs/_images/benchmarks_details_indices_large_1.png b/docs/_images/benchmarks_details_indices_large_1.png index 2a91ca85..77d0a27e 100644 Binary files a/docs/_images/benchmarks_details_indices_large_1.png and b/docs/_images/benchmarks_details_indices_large_1.png differ diff --git a/docs/_images/benchmarks_details_indices_small_1.png b/docs/_images/benchmarks_details_indices_small_1.png index da9f404f..45e00c5d 100644 Binary files a/docs/_images/benchmarks_details_indices_small_1.png and b/docs/_images/benchmarks_details_indices_small_1.png differ diff --git a/docs/_images/noise_noise-Genie1_1.png b/docs/_images/noise_noise-Genie1_1.png index 18246f67..edf14384 100644 Binary files a/docs/_images/noise_noise-Genie1_1.png and b/docs/_images/noise_noise-Genie1_1.png differ diff --git a/docs/_images/noise_noise-Genie2_1.png b/docs/_images/noise_noise-Genie2_1.png index 0b9eeaf2..85e87116 100644 Binary files a/docs/_images/noise_noise-Genie2_1.png and b/docs/_images/noise_noise-Genie2_1.png differ diff --git a/docs/_images/noise_noise-Genie3_1.png b/docs/_images/noise_noise-Genie3_1.png index bfb993eb..27c00910 100644 Binary files a/docs/_images/noise_noise-Genie3_1.png and b/docs/_images/noise_noise-Genie3_1.png differ diff --git a/docs/_images/noise_noise-HDBSCAN1_1.png b/docs/_images/noise_noise-HDBSCAN1_1.png index cdc0959f..f2f26a8b 100644 Binary files a/docs/_images/noise_noise-HDBSCAN1_1.png and b/docs/_images/noise_noise-HDBSCAN1_1.png differ diff --git a/docs/_images/noise_noise-HDBSCAN2_1.png b/docs/_images/noise_noise-HDBSCAN2_1.png index d54ec8f1..69c4fa41 100644 Binary files a/docs/_images/noise_noise-HDBSCAN2_1.png and b/docs/_images/noise_noise-HDBSCAN2_1.png differ diff --git a/docs/_images/noise_noise-scatter_1.png b/docs/_images/noise_noise-scatter_1.png index 98df7899..1c61ca78 100644 Binary files a/docs/_images/noise_noise-scatter_1.png and b/docs/_images/noise_noise-scatter_1.png differ diff --git a/docs/_images/r_ssi-map-1.png b/docs/_images/r_ssi-map-1.png index 6b4d09b2..9152e13b 100644 Binary files a/docs/_images/r_ssi-map-1.png and b/docs/_images/r_ssi-map-1.png differ diff --git a/docs/_images/r_ssi-oecd-dendrogram-1.png b/docs/_images/r_ssi-oecd-dendrogram-1.png index 25fb1154..4d9cea89 100644 Binary files a/docs/_images/r_ssi-oecd-dendrogram-1.png and b/docs/_images/r_ssi-oecd-dendrogram-1.png differ diff --git a/docs/_images/sklearn_toy_example_clustering_1.png b/docs/_images/sklearn_toy_example_clustering_1.png index 687d4cdb..96960beb 100644 Binary files a/docs/_images/sklearn_toy_example_clustering_1.png and b/docs/_images/sklearn_toy_example_clustering_1.png differ diff --git a/docs/_images/timings_timings-plot_1.png b/docs/_images/timings_digits_1.png similarity index 99% rename from docs/_images/timings_timings-plot_1.png rename to docs/_images/timings_digits_1.png index a6ffb00f..46eef6fa 100644 Binary files a/docs/_images/timings_timings-plot_1.png and b/docs/_images/timings_digits_1.png differ diff --git a/docs/_images/timings_g2mg-plot_1.png b/docs/_images/timings_g2mg-plot_1.png index a7b9b5ea..247fbc00 100644 Binary files a/docs/_images/timings_g2mg-plot_1.png and b/docs/_images/timings_g2mg-plot_1.png differ diff --git a/docs/_sources/genieclust.rst.txt b/docs/_sources/genieclust.rst.txt index e9dc6af2..3d0610d1 100644 --- a/docs/_sources/genieclust.rst.txt +++ b/docs/_sources/genieclust.rst.txt @@ -5,6 +5,7 @@ Python Package `genieclust` Reference .. autosummary:: genieclust.Genie + genieclust.cluster_validity genieclust.compare_partitions genieclust.inequity genieclust.internal @@ -18,6 +19,7 @@ Python Package `genieclust` Reference :caption: Modules and Classes: genieclust_genie + genieclust_cluster_validity genieclust_compare_partitions genieclust_inequity genieclust_internal diff --git a/docs/_sources/genieclust_cluster_validity.rst.txt b/docs/_sources/genieclust_cluster_validity.rst.txt new file mode 100644 index 00000000..6d56a9b3 --- /dev/null +++ b/docs/_sources/genieclust_cluster_validity.rst.txt @@ -0,0 +1,5 @@ +genieclust.cluster_validity +============================= + +.. automodule:: genieclust.cluster_validity + :members: diff --git a/docs/_sources/index.md.txt b/docs/_sources/index.md.txt new file mode 100644 index 00000000..3813152e --- /dev/null +++ b/docs/_sources/index.md.txt @@ -0,0 +1,179 @@ +# *genieclust*: Fast and Robust Hierarchical Clustering with Noise Point Detection + +::::{epigraph} +**Genie finds meaningful clusters and is fast even on large data sets.** +:::: + +::::{image} _static/img/genie_toy_example.png +:class: img-right-align-always +:alt: Genie +:width: 128px +:::: + + +The *genieclust* package {cite}`genieclust` equips Python and R users with +a faster and more powerful version of *Genie* {cite}`genieins` — a robust +and outlier resistant clustering algorithm, originally published as an R package +[*genie*](https://cran.r-project.org/web/packages/genie). + +The idea behind *Genie* is beautifully simple. First, make each individual +point the sole member of its own cluster. Then, keep merging pairs +of the closest clusters, one after another. However, to **prevent +the formation of clusters of highly imbalanced sizes** +a point group of the smallest size will sometimes be matched with its nearest +neighbours. + +Genie's appealing simplicity goes hand in hand with its usability; +it **often outperforms other clustering approaches** +such as K-means, BIRCH, or average, Ward, and complete linkage +on {any}`benchmark data `. + +Genie is also **very fast** — determining the whole cluster hierarchy +for datasets of millions of points, can be completed within +{any}`minutes `. +Therefore, it is capable of solving **extreme clustering tasks** +(large datasets with any number of clusters to detect) +on data that fit into memory. +Thanks to the use of *nmslib* {cite}`nmslib`, +sparse or string inputs are also supported. + +Genie also allows clustering with respect to mutual reachability distances +so that it can act as a **noise point detector** or a robustified version +of *HDBSCAN\** {cite}`hdbscan` that is able to detect a predefined +number of clusters and so it doesn't dependent on the *DBSCAN*'s somewhat +difficult-to-set `eps` parameter. + + + +The **Python version** of *genieclust* is available via +[PyPI](https://pypi.org/project/genieclust/), e.g., +via a call to + +```bash +pip3 install genieclust +``` + +from the command line or through your favourite package manager. +Note a familiar *scikit-learn*-like {cite}`sklearn_api` look-and-feel: + +```python +import genieclust +X = ... # some data +g = genieclust.Genie(n_clusters=2) +labels = g.fit_predict(X) +``` + +::::{epigraph} +*To learn more about Python, check out Marek's recent open-access (free!) textbook* +[Minimalist Data Wrangling in Python](https://datawranglingpy.gagolewski.com/) +{cite}`datawranglingpy`. +:::: + + + +The **R version** of *genieclust* can be downloaded from +[CRAN](https://cran.r-project.org/web/packages/genieclust/) +by calling: + +```r +install.packages("genieclust") +``` + +Its interface is compatible with the classic `stats::hclust()`, but there is more. + +```r +X <- ... # some data +h <- gclust(X) +plot(h) # plot cluster dendrogram +cutree(h, k=2) +# or simply: genie(X, k=2) +``` + + + +*genieclust* is distributed +under the open source GNU AGPL v3 license and can be downloaded from +[GitHub](https://github.com/gagolews/genieclust). +The core functionality is implemented in the form of a header-only C++ +library, so it may be adapted to new environments relatively easily — +any contributions are welcome (Julia, Matlab, etc.). + +**Author and Maintainer**: [Marek Gagolewski](https://www.gagolewski.com) + +**Contributors**: +[Maciej Bartoszuk](http://bartoszuk.rexamine.com), [Anna Cena](https://cena.rexamine.com) (R packages +[*genie*](https://cran.r-project.org/web/packages/genie) /*genieclust*'s predecessor {cite}`genieins`/ +and [*CVI*](https://github.com/gagolews/optim_cvi) /some internal cluster validity measures {cite}`cvi`/), +[Peter M. Larsen](https://github.com/pmla/) +(an [implementation](https://github.com/scipy/scipy/blob/main/scipy/optimize/rectangular_lsap/rectangular_lsap.cpp) +of the shortest augmenting path algorithm for the rectangular assignment problem +which we use for computing the normalised accuracy and pair sets index). + + + +::::{toctree} +:maxdepth: 2 +:caption: genieclust +:hidden: + +About +Author +Source Code (GitHub) +Bug Tracker and Feature Suggestions +PyPI Entry +CRAN Entry +:::: + + +::::{toctree} +:maxdepth: 2 +:caption: Examples and Tutorials + +weave/basics +weave/sklearn_toy_example +weave/benchmarks_ar +weave/timings +weave/noise +weave/sparse +weave/string +weave/r +:::: + + +::::{toctree} +:maxdepth: 1 +:caption: API Documentation + +genieclust +rapi +:::: + + +::::{toctree} +:maxdepth: 1 +:caption: See Also + +Clustering Benchmarks +Data Wrangling in Python +:::: + + +::::{toctree} +:maxdepth: 1 +:caption: Appendix + +news +weave/benchmarks_details +weave/benchmarks_approx +z_bibliography +:::: + + + diff --git a/docs/_sources/index.rst.txt b/docs/_sources/index.rst.txt deleted file mode 100644 index ba11ebfd..00000000 --- a/docs/_sources/index.rst.txt +++ /dev/null @@ -1,142 +0,0 @@ -Python and R Package `genieclust`: Fast and Robust Hierarchical Clustering with Noise Point Detection -===================================================================================================== - -.. epigraph:: - **Genie finds meaningful clusters and is fast even on large data sets.** - - -.. image:: _static/img/genie_toy_example.png - :class: img-right-align-always - :alt: Genie - :width: 128px - - -`genieclust` :cite:`genieclust` brings -a faster and more powerful version of **Genie** :cite:`genieins` — a robust -and outlier resistant clustering algorithm, originally published as an R package -`genie `_. - -The idea behind Genie is beautifully simple. First, make each individual -point the sole member of its own cluster. Then, keep merging pairs -of the closest clusters, one after another. However, to **prevent -the formation of clusters of highly imbalanced sizes** -a point group of the smallest size will sometimes be matched with its nearest -neighbours. - -Genie's appealing simplicity goes hand in hand with its usability; -it **often outperforms other clustering approaches** -such as K-means, BIRCH, or average, Ward, and complete linkage -on :any:`benchmark data `\ . - -Genie is also **very fast** — determining the whole cluster hierarchy -for datasets of millions of points can be completed within -:any:`a coffee break `\ . -Therefore, it is perfectly suited for solving of **extreme clustering tasks** -(large datasets with any number of clusters to detect) for data -that fit into memory. -Thanks to the use of `nmslib` :cite:`nmslib`\ , -sparse or string inputs are also supported. - -Genie also allows clustering with respect to mutual reachability distances -so that it can act as a **noise point detector** or a robustified version -of `HDBSCAN\*` :cite:`hdbscan` that is able to detect a predefined -number of clusters and so it doesn't dependent on the `DBSCAN`'s somewhat -difficult-to-set `eps` parameter. - - - -The Python language version of `genieclust` has -a familiar `scikit-learn`-like :cite:`sklearn_api` look-and-feel: - -.. code-block:: python - - import genieclust - X = ... # some data - g = genieclust.Genie(n_clusters=2) - labels = g.fit_predict(X) - - -.. epigraph:: - *To learn more about Python, check out Marek's recent open-access (free!) textbook* - `Minimalist Data Wrangling in Python `_ - :cite:`datawranglingpy`\ . - -The R language interface is compatible with ``hclust()``, but there is more. - -.. code-block:: r - - X <- ... # some data - h <- gclust(X) - plot(h) # plot cluster dendrogram - cutree(h, k=2) - # or genie(X, k=2) - - -The `genieclust` package is available for Python (via -`PyPI `_\ ) -and R (on `CRAN `_\ ). -Its source code is distributed -under the open source GNU AGPL v3 license and can be downloaded from -`GitHub `_. -The core functionality is implemented in the form of a header-only C++ -library, so it may be adapted to new environments relatively easily — -any contributions are welcome (Julia, Matlab, etc.). - - -.. toctree:: - :maxdepth: 2 - :caption: genieclust - :hidden: - - About - Author - - -.. toctree:: - :maxdepth: 2 - :caption: Examples and Tutorials - - weave/basics - weave/sklearn_toy_example - weave/benchmarks_ar - weave/timings - weave/noise - weave/sparse - weave/string - weave/r - -.. toctree:: - :maxdepth: 1 - :caption: API Documentation - - genieclust - rapi - -.. toctree:: - :maxdepth: 1 - :caption: See Also - - Source Code (GitHub) - Bug Tracker and Feature Suggestions - PyPI Entry - CRAN Entry - Clustering Benchmarks - Data Wrangling in Python - -.. toctree:: - :maxdepth: 1 - :caption: Appendix - - news - weave/benchmarks_details - weave/benchmarks_approx - z_bibliography - - -.. - Indices and Tables - ------------------ - - * :ref:`genindex` - * :ref:`modindex` - * :ref:`search` diff --git a/docs/_sources/news.md.txt b/docs/_sources/news.md.txt index 9d5ea2af..4d707831 100644 --- a/docs/_sources/news.md.txt +++ b/docs/_sources/news.md.txt @@ -1,12 +1,56 @@ # What Is New in *genieclust* -## genieclust 1.0.1 (2022-08-08) +## 1.1.0 (2022-09-05) -- [GENERAL] A paper on the `genieclust` package has appeared - in *SoftwareX*, see https://doi.org/10.1016/j.softx.2021.100722. -- [Python] `plot_scatter` now uses a more accessible default palette +- [GENERAL] The cluster validity measures are discussed in more detail at + . + +- [Python and R] New function: + `compare_partitions.adjusted_asymmetric_accuracy`. + +- [Python and R] Implementations of the so-called internal cluster + validity measures discussed in + DOI: [10.1016/j.ins.2021.10.004](https://doi.org/10.1016/j.ins.2021.10.004); + see our (GitHub-only) [CVI](https://github.com/gagolews/optim_cvi) package + for R. In particular, the generalised Dunn indices are based on the code + originally authored by Maciej Bartoszuk. Thanks. + + Functions added (to the `cluster_validity` module in the Python version): + `calinski_harabasz_index`, + `dunnowa_index`, + `generalised_dunn_index`, + `negated_ball_hall_index`, + `negated_davies_bouldin_index`, + `negated_wcss_index`, + `silhouette_index`, + `silhouette_w_index`, + `wcnn_index`. + +- [BACKWARD INCOMPATIBILITY] `compare_partitions.normalized_confusion_matrix` + now solves the maximal assignment problem instead of applying + a primitive partial pivoting. + +- [Python and R] New function: `compare_partitions.normalizing_permutation` + +- [R] New function: `normalized_confusion_matrix`. + +- [Python and R] New parameter to `compare_partitions.pair_sets_index`: + `simplified`. + +- [Python] New parameters to `plots.plot_scatter`: + `axis`, `title`, `xlabel`, `ylabel`, `xlim`, `ylim`. + + +## 1.0.1 (2022-08-08) + +- [GENERAL] A paper on the `genieclust` package is now available: + M. Gagolewski, genieclust: Fast and robust hierarchical clustering, + SoftwareX 15, 100722, 2021, DOI: + [10.1016/j.softx.2021.100722](https://doi.org/10.1016/j.softx.2021.100722). + +- [Python] `plots.plot_scatter` now uses a more accessible default palette (from R 4.0.0). - [Python] New function: `inequity.devergottini_index`. @@ -14,13 +58,13 @@ - [R] New function: `devergottini_index`. -## genieclust 1.0.0 (2021-04-22) +## 1.0.0 (2021-04-22) - [R] Use `mlpack` instead of `RcppMLPACK` (#72). This package is merely suggested, not dependent upon. -## genieclust 0.9.8 (2021-01-08) +## 0.9.8 (2021-01-08) - [Python] Require Python >= 3.7 (implied by `numpy`). @@ -31,12 +75,12 @@ - [R] Use `tinytest` for unit testing instead of `testthat`. -## genieclust 0.9.4 (2020-07-31) +## 0.9.4 (2020-07-31) - [BUGFIX] [R] Fix build errors on Solaris. -## genieclust 0.9.3 (2020-07-25) +## 0.9.3 (2020-07-25) - [BUGFIX] [Python] Add code coverage CI. Fix some minor inconsistencies. Automate the `bdist` build chain. @@ -44,12 +88,12 @@ - [R] Update DESCRIPTION to meet the CRAN policies. -## genieclust 0.9.2 (2020-07-22) +## 0.9.2 (2020-07-22) - [BUGFIX] [Python] Fix broken build script for OS X with no OpenMP. -## genieclust 0.9.1 (2020-07-18) +## 0.9.1 (2020-07-18) - [GENERAL] The package has been completely rewritten. The core functionality is now implemented in C++ (with OpenMP). @@ -70,6 +114,6 @@ by `nmslib` is added. -## genieclust 0.1a2 (2018-05-23) +## 0.1a2 (2018-05-23) - [Python] Initial PyPI release. diff --git a/docs/_sources/rapi.md.txt b/docs/_sources/rapi.md.txt index 4a373517..a3e880db 100644 --- a/docs/_sources/rapi.md.txt +++ b/docs/_sources/rapi.md.txt @@ -4,6 +4,7 @@ R Package *genieclust* Reference ```{toctree} :maxdepth: 1 +rapi/cluster_validity_measures rapi/comparing_partitions rapi/emst_mlpack rapi/gclust diff --git a/docs/_sources/rapi/cluster_validity_measures.md.txt b/docs/_sources/rapi/cluster_validity_measures.md.txt new file mode 100644 index 00000000..914ae173 --- /dev/null +++ b/docs/_sources/rapi/cluster_validity_measures.md.txt @@ -0,0 +1,93 @@ +# cluster_validity_measures: Internal Cluster Validity Measures + +## Description + +Implementation of a number of so-called cluster validity indices critically reviewed in (Gagolewski, Bartoszuk, Cena, 2021). See Section 2 therein and (Gagolewski, 2022) for the respective definitions. + +The greater the index value, the more *valid* (whatever that means) the assessed partition. For consistency, the Ball-Hall and Davies-Bouldin indexes as well as the within-cluster sum of squares (WCSS) take negative values. + +## Usage + +``` r +calinski_harabasz_index(X, y) + +dunnowa_index( + X, + y, + M = 25L, + owa_numerator = "SMin:5", + owa_denominator = "Const" +) + +generalised_dunn_index(X, y, lowercase_d, uppercase_d) + +negated_ball_hall_index(X, y) + +negated_davies_bouldin_index(X, y) + +negated_wcss_index(X, y) + +silhouette_index(X, y) + +silhouette_w_index(X, y) + +wcnn_index(X, y, M = 25L) +``` + +## Arguments + +| | | +|----------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `X` | numeric matrix with `n` rows and `d` columns, representing `n` points in a `d`-dimensional space | +| `y` | vector of `n` integer labels, representing a partition whose *quality* is to be assessed; `y[i]` is the cluster ID of the `i`-th point, `X[i, ]`; `1 <= y[i] <= K`, where `K` is the number or clusters | +| `M` | number of nearest neighbours | +| `owa_numerator, owa_denominator` | single string specifying the OWA operators to use in the definition of the DuNN index; one of: `"Mean"`, `"Min"`, `"Max"`, `"Const"`, `"SMin:D"`, `"SMax:D"`, where `D` is an integer defining the degree of smoothness | +| `lowercase_d` | an integer between 1 and 5, denoting $d_1$, \..., $d_5$ in the definition of the generalised Dunn (Bezdek-Pal) index (numerator: min, max, and mean pairwise intracluster distance, distance between cluster centroids, weighted point-centroid distance, respectively) | +| `uppercase_d` | an integer between 1 and 3, denoting $D_1$, \..., $D_3$ in the definition of the generalised Dunn (Bezdek-Pal) index (denominator: max and min pairwise intracluster distance, average point-centroid distance, respectively) | + +## Value + +A single numeric value (the more, the *better*). + +## Author(s) + +[Marek Gagolewski](https://www.gagolewski.com/) and other contributors + +## References + +Ball G.H., Hall D.J., *ISODATA: A novel method of data analysis and pattern classification*, Technical report No. AD699616, Stanford Research Institute, 1965. + +Bezdek J., Pal N., Some new indexes of cluster validity, *IEEE Transactions on Systems, Man, and Cybernetics, Part B* 28, 1998, 301-315, [doi:10.1109/3477.678624](https://doi.org/10.1109/3477.678624). + +Calinski T., Harabasz J., A dendrite method for cluster analysis, *Communications in Statistics* 3(1), 1974, 1-27, [doi:10.1080/03610927408827101](https://doi.org/10.1080/03610927408827101). + +Davies D.L., Bouldin D.W., A Cluster Separation Measure, *IEEE Transactions on Pattern Analysis and Machine Intelligence* PAMI-1 (2), 1979, 224-227, [doi:10.1109/TPAMI.1979.4766909](https://doi.org/10.1109/TPAMI.1979.4766909). + +Dunn J.C., A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters, *Journal of Cybernetics* 3(3), 1973, 32-57, [doi:10.1080/01969727308546046](https://doi.org/10.1080/01969727308546046). + +Gagolewski M., Bartoszuk M., Cena A., Are cluster validity measures (in)valid?, *Information Sciences* 581, 620-636, 2021, [doi:10.1016/j.ins.2021.10.004](https://doi.org/10.1016/j.ins.2021.10.004); preprint: . + +Gagolewski M., *A Framework for Benchmarking Clustering Algorithms*, 2022, . + +Rousseeuw P.J., Silhouettes: A Graphical Aid to the Interpretation and Validation of Cluster Analysis, *Computational and Applied Mathematics* 20, 1987, 53-65, [doi:10.1016/0377-0427(87)90125-7](https://doi.org/10.1016/0377-0427%2887%2990125-7). + +## See Also + +The official online manual of genieclust at + +Gagolewski M., genieclust: Fast and robust hierarchical clustering, *SoftwareX* 15:100722, 2021, [doi:10.1016/j.softx.2021.100722](https://doi.org/10.1016/j.softx.2021.100722). + +## Examples + + + + +```r +X <- as.matrix(iris[,1:4]) +X[,] <- jitter(X) # otherwise we get a non-unique solution +y <- as.integer(iris[[5]]) +calinski_harabasz_index(X, y) # good +## [1] 486.6681 +calinski_harabasz_index(X, sample(1:3, nrow(X), replace=TRUE)) # bad +## [1] 2.836713 +``` diff --git a/docs/_sources/rapi/comparing_partitions.md.txt b/docs/_sources/rapi/comparing_partitions.md.txt index 6eb295f2..2a092d40 100644 --- a/docs/_sources/rapi/comparing_partitions.md.txt +++ b/docs/_sources/rapi/comparing_partitions.md.txt @@ -1,12 +1,20 @@ -# comparing_partitions: Pairwise Partition Similarity Scores +# comparing_partitions: External Cluster Validity Measures and Pairwise Partition Similarity Scores ## Description -Let `x` and `y` represent two partitions of a set of $n$ elements into, respectively, $K$ and $L$ nonempty and pairwise disjoint subsets. For instance, these can be two clusterings of a dataset with $n$ observations specified by two vectors of labels. The functions described in this section quantify the similarity between `x` and `y`. They can be used as external cluster validity measures, i.e., in the presence of reference (ground-truth) partitions. +The functions described in this section quantify the similarity between two label vectors `x` and `y` which represent two partitions of a set of $n$ elements into, respectively, $K$ and $L$ nonempty and pairwise disjoint subsets. + +For instance, `x` and `y` can be two clusterings of a dataset with $n$ observations specified by two vectors of labels. These functions can be used as external cluster validity measures, where we assume that `x` is the reference (ground-truth) partition (compare Gagolewski, 2022). ## Usage ``` r +adjusted_asymmetric_accuracy(x, y = NULL) + +normalized_accuracy(x, y = NULL) + +pair_sets_index(x, y = NULL, simplified = FALSE) + adjusted_rand_score(x, y = NULL) rand_score(x, y = NULL) @@ -21,21 +29,30 @@ normalized_mi_score(x, y = NULL) adjusted_mi_score(x, y = NULL) -normalized_accuracy(x, y = NULL) +normalized_confusion_matrix(x, y = NULL) -pair_sets_index(x, y = NULL) +normalizing_permutation(x, y = NULL) ``` ## Arguments -| | | -|-----|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `x` | an integer vector of length n (or an object coercible to) representing a K-partition of an n-set, or a confusion matrix with K rows and L columns (see `table(x, y)`) | -| `y` | an integer vector of length n (or an object coercible to) representing an L-partition of the same set), or NULL (if x is an K\*L confusion matrix) | +| | | +|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `x` | an integer vector of length n (or an object coercible to) representing a K-partition of an n-set (e.g., a reference partition), or a confusion matrix with K rows and L columns (see [`table(x, y)`](https://stat.ethz.ch/R-manual/R-devel/library/base/html/table.html)) | +| `y` | an integer vector of length n (or an object coercible to) representing an L-partition of the same set (e.g., the output of a clustering algorithm we wish to compare with `x`), or NULL (if x is an K\*L confusion matrix) | +| `simplified` | whether to assume E=1 in the definition of the pair sets index index, i.e., use Eq. (20) instead of (18); see (Rezaei, Franti, 2016). | ## Details -Every index except `mi_score()` (which computes the mutual information score) outputs 1 given two identical partitions. Note that partitions are always defined up to a bijection of the set of possible labels, e.g., (1, 1, 2, 1) and (4, 4, 2, 4) represent the same 2-partition. +Each index except `adjusted_asymmetric_accuracy()` can act as a pairwise partition similarity score: it is symmetric, i.e., `index(x, y) == index(y, x)`. + +Each index except `mi_score()` (which computes the mutual information score) outputs 1 given two identical partitions. Note that partitions are always defined up to a bijection of the set of possible labels, e.g., (1, 1, 2, 1) and (4, 4, 2, 4) represent the same 2-partition. + +`adjusted_asymmetric_accuracy()` (Gagolewski, 2022) only accepts $K = L$. It is an external cluster validity measure which assumes that the label vector `x` (or rows in the confusion matrix) represents the reference (ground truth) partition. It is a corrected-for-chance summary of the proportion of correctly classified points in each cluster (with cluster matching based on the solution to the maximal linear sum assignment problem; see [`normalized_confusion_matrix`](comparing_partitions.md)), given by: $(\max_\sigma \sum_{i=1}^K (c_{i, \sigma(i)}/(c_{i, 1}+...+c_{i, K})) - 1)/(K - 1)$, where $C$ is the confusion matrix. + +`normalized_accuracy()` is defined as $(Accuracy(C_\sigma)-1/L)/(1-1/L)$, where $C_\sigma$ is a version of the confusion matrix for given `x` and `y`, $K \leq L$, with columns permuted based on the solution to the maximal linear sum assignment problem. The $Accuracy(C_\sigma)$ part is sometimes referred to as set-matching classification rate or pivoted accuracy. + +`pair_sets_index()` gives the Pair Sets Index (PSI) adjusted for chance (Rezaei, Franti, 2016), $K \leq L$. Pairing is based on the solution to the linear sum assignment problem of a transformed version of the confusion matrix. Its simplified version assumes E=1 in the definition of the index, i.e., uses Eq. (20) instead of (18). `rand_score()` gives the Rand score (the \"probability\" of agreement between the two partitions) and `adjusted_rand_score()` is its version corrected for chance, see (Hubert, Arabie, 1985), its expected value is 0.0 given two independent partitions. Due to the adjustment, the resulting index might also be negative for some inputs. @@ -45,13 +62,15 @@ Note that both the (unadjusted) Rand and FM scores are bounded from below by $1/ `mi_score()`, `adjusted_mi_score()` and `normalized_mi_score()` are information-theoretic scores, based on mutual information, see the definition of $AMI_{sum}$ and $NMI_{sum}$ in (Vinh et al., 2010). -`normalized_accuracy()` is defined as $(Accuracy(C_\sigma)-1/L)/(1-1/L)$, where $C_\sigma$ is a version of the confusion matrix for given `x` and `y`, $K \leq L$, with columns permuted based on the solution to the Maximal Linear Sum Assignment Problem. $Accuracy(C_\sigma)$ is sometimes referred to as Purity, e.g., in (Rendon et al. 2011). +`normalized_confusion_matrix()` computes the confusion matrix and permutes its rows and columns so that the sum of the elements of the main diagonal is the largest possible (by solving the maximal assignment problem). The function only accepts $K \leq L$. The sole reordering of the columns of a confusion matrix can be determined by calling `normalizing_permutation()`. -`pair_sets_index()` gives the Pair Sets Index (PSI) adjusted for chance (Rezaei, Franti, 2016), $K \leq L$. Pairing is based on the solution to the Linear Sum Assignment Problem of a transformed version of the confusion matrix. +Also note that the built-in [`table()`](https://stat.ethz.ch/R-manual/R-devel/library/base/html/table.html) determines the standard confusion matrix. ## Value -A single real value giving the similarity score. +Each cluster validity measure is a single numeric value. + +`normalized_confusion_matrix()` returns an integer matrix. ## Author(s) @@ -59,13 +78,19 @@ A single real value giving the similarity score. ## References -Hubert L., Arabie P., Comparing Partitions, Journal of Classification 2(1), 1985, 193-218, esp. Eqs. (2) and (4). +Gagolewski M., *A Framework for Benchmarking Clustering Algorithms*, 2022, . + +Gagolewski M., Adjusted asymmetric accuracy: A well-behaving external cluster validity measure, 2022, submitted for publication. -Rendon E., Abundez I., Arizmendi A., Quiroz E.M., Internal versus external cluster validation indexes, International Journal of Computers and Communications 5(1), 2011, 27-34. +Hubert L., Arabie P., Comparing partitions, *Journal of Classification* 2(1), 1985, 193-218, esp. Eqs. (2) and (4). -Rezaei M., Franti P., Set matching measures for external cluster validity, IEEE Transactions on Knowledge and Data Mining 28(8), 2016, 2173-2186. +Meila M., Heckerman D., An experimental comparison of model-based clustering methods, *Machine Learning* 42, 2001, pp. 9-29, [doi:10.1023/A:1007648401407](https://doi.org/10.1023/A%3A1007648401407). -Vinh N.X., Epps J., Bailey J., Information theoretic measures for clusterings comparison: Variants, properties, normalization and correction for chance, Journal of Machine Learning Research 11, 2010, 2837-2854. +Rezaei M., Franti P., Set matching measures for external cluster validity, *IEEE Transactions on Knowledge and Data Mining* 28(8), 2016, 2173-2186. + +Steinley D., Properties of the Hubert-Arabie adjusted Rand index, *Psychological Methods* 9(3), 2004, pp. 386-396, [doi:10.1037/1082-989X.9.3.386](https://doi.org/10.1037/1082-989X.9.3.386). + +Vinh N.X., Epps J., Bailey J., Information theoretic measures for clusterings comparison: Variants, properties, normalization and correction for chance, *Journal of Machine Learning Research* 11, 2010, 2837-2854. ## See Also @@ -81,6 +106,14 @@ Gagolewski M., genieclust: Fast and robust hierarchical ```r y_true <- iris[[5]] y_pred <- kmeans(as.matrix(iris[1:4]), 3)$cluster +adjusted_asymmetric_accuracy(y_true, y_pred) +## [1] 0.84 +normalized_accuracy(y_true, y_pred) +## [1] 0.84 +pair_sets_index(y_true, y_pred) +## [1] 0.7568238 +pair_sets_index(y_true, y_pred, simplified=TRUE) +## [1] 0.7470968 adjusted_rand_score(y_true, y_pred) ## [1] 0.7302383 rand_score(table(y_true, y_pred)) # the same @@ -95,8 +128,11 @@ normalized_mi_score(y_true, y_pred) ## [1] 0.7581757 adjusted_mi_score(y_true, y_pred) ## [1] 0.7551192 -normalized_accuracy(y_true, y_pred) -## [1] 0.84 -pair_sets_index(y_true, y_pred) -## [1] 0.7568238 +normalized_confusion_matrix(y_true, y_pred) +## [,1] [,2] [,3] +## [1,] 50 0 0 +## [2,] 0 48 2 +## [3,] 0 14 36 +normalizing_permutation(y_true, y_pred) +## [1] 1 2 3 ``` diff --git a/docs/_sources/rapi/emst_mlpack.md.txt b/docs/_sources/rapi/emst_mlpack.md.txt index 2eca548e..6988974b 100644 --- a/docs/_sources/rapi/emst_mlpack.md.txt +++ b/docs/_sources/rapi/emst_mlpack.md.txt @@ -29,9 +29,9 @@ An object of class `mst`, see [`mst()`](mst.md) for details. ## References -March W.B., Ram P., Gray A.G., Fast Euclidean Minimum Spanning Tree: Algorithm, Analysis, and Applications, Proc. ACM SIGKDD\'10 (2010) 603-611, . +March W.B., Ram P., Gray A.G., Fast Euclidean Minimum Spanning Tree: Algorithm, Analysis, and Applications, *Proc. ACM SIGKDD\'10*, 2010, 603-611, . -Curtin R.R., Edel M., Lozhnikov M., Mentekidis Y., Ghaisas S., Zhang S., mlpack 3: A fast, flexible machine learning library, Journal of Open Source Software 3(26), 726, 2018. +Curtin R.R., Edel M., Lozhnikov M., Mentekidis Y., Ghaisas S., Zhang S., mlpack 3: A fast, flexible machine learning library, *Journal of Open Source Software* 3(26), 2018, 726. ## See Also diff --git a/docs/_sources/rapi/gclust.md.txt b/docs/_sources/rapi/gclust.md.txt index b06740ac..23e36450 100644 --- a/docs/_sources/rapi/gclust.md.txt +++ b/docs/_sources/rapi/gclust.md.txt @@ -1,8 +1,8 @@ -# gclust: The Genie++ Hierarchical Clustering Algorithm +# gclust: Hierarchical Clustering Algorithm Genie ## Description -A reimplementation of *Genie* - a robust and outlier resistant clustering algorithm (see Gagolewski, Bartoszuk, Cena, 2016). The Genie algorithm is based on a minimum spanning tree (MST) of the pairwise distance graph of a given point set. Just like single linkage, it consumes the edges of the MST in increasing order of weights. However, it prevents the formation of clusters of highly imbalanced sizes; once the Gini index (see [`gini_index()`](inequity.md)) of the cluster size distribution raises above `gini_threshold`, a forced merge of a point group of the smallest size is performed. Its appealing simplicity goes hand in hand with its usability; Genie often outperforms other clustering approaches on benchmark data, such as . +A reimplementation of *Genie* - a robust and outlier resistant clustering algorithm (see Gagolewski, Bartoszuk, Cena, 2016). The Genie algorithm is based on a minimum spanning tree (MST) of the pairwise distance graph of a given point set. Just like the single linkage, it consumes the edges of the MST in an increasing order of weights. However, it prevents the formation of clusters of highly imbalanced sizes; once the Gini index (see [`gini_index()`](inequity.md)) of the cluster size distribution raises above `gini_threshold`, a forced merge of a point group of the smallest size is performed. Its appealing simplicity goes hand in hand with its usability; Genie often outperforms other clustering approaches on benchmark data, such as . The clustering can now also be computed with respect to the mutual reachability distance (based, e.g., on the Euclidean metric), which is used in the definition of the HDBSCAN\* algorithm (see Campello et al., 2015). If `M` \> 1, then the mutual reachability distance $m(i,j)$ with smoothing factor `M` is used instead of the chosen \"raw\" distance $d(i,j)$. It holds $m(i,j)=\max(d(i,j), c(i), c(j))$, where $c(i)$ is $d(i,k)$ with $k$ being the (`M`-1)-th nearest neighbour of $i$. This makes \"noise\" and \"boundary\" points being \"pulled away\" from each other. @@ -86,7 +86,7 @@ genie( ## Details -Note that as in the case of all the distance-based methods, the standardisation of the input features is definitely worth giving a try. +Note that, as in the case of all the distance-based methods, the standardisation of the input features is definitely worth giving a try. If `d` is a numeric matrix or an object of class `dist`, [`mst()`](mst.md) will be called to compute an MST, which generally takes at most $O(n^2)$ time (the algorithm we provide is parallelised, environment variable `OMP_NUM_THREADS` controls the number of threads in use). However, see [`emst_mlpack()`](emst_mlpack.md) for a very fast alternative in the case of Euclidean spaces of (very) low dimensionality and `M` = 1. diff --git a/docs/_sources/rapi/genieclust-package.md.txt b/docs/_sources/rapi/genieclust-package.md.txt index 3fa0df0c..2771f67e 100644 --- a/docs/_sources/rapi/genieclust-package.md.txt +++ b/docs/_sources/rapi/genieclust-package.md.txt @@ -1,4 +1,4 @@ -# genieclust-package: The Genie++ Hierarchical Clustering Algorithm (with Extras) +# genieclust-package: The Genie Hierarchical Clustering Algorithm (with Extras) ## Description diff --git a/docs/_sources/rapi/inequity.md.txt b/docs/_sources/rapi/inequity.md.txt index fdfc52f3..ea106941 100644 --- a/docs/_sources/rapi/inequity.md.txt +++ b/docs/_sources/rapi/inequity.md.txt @@ -68,11 +68,11 @@ The value of the inequity index, a number in $[0, 1]$. ## References -Bonferroni C., Elementi di Statistica Generale, Libreria Seber, Firenze, 1930. +Bonferroni C., *Elementi di Statistica Generale*, Libreria Seber, Firenze, 1930. -Gagolewski M., Bartoszuk M., Cena A., Genie: A new, fast, and outlier-resistant hierarchical clustering algorithm, Information Sciences 363, 2016, pp. 8-23. doi:10.1016/j.ins.2016.05.003 +Gagolewski M., Bartoszuk M., Cena A., Genie: A new, fast, and outlier-resistant hierarchical clustering algorithm, *Information Sciences* 363, 2016, pp. 8-23. [doi:10.1016/j.ins.2016.05.003](https://doi.org/10.1016/j.ins.2016.05.003) -Gini C., Variabilita e Mutabilita, Tipografia di Paolo Cuppini, Bologna, 1912. +Gini C., *Variabilita e Mutabilita*, Tipografia di Paolo Cuppini, Bologna, 1912. ## See Also @@ -86,13 +86,13 @@ Gagolewski M., genieclust: Fast and robust hierarchical ```r -gini_index(c(2, 2, 2, 2, 2)) # no inequality +gini_index(c(2, 2, 2, 2, 2)) # no inequality ## [1] 0 -gini_index(c(0, 0, 10, 0, 0)) # one has it all +gini_index(c(0, 0, 10, 0, 0)) # one has it all ## [1] 1 -gini_index(c(7, 0, 3, 0, 0)) # give to the poor, take away from the rich +gini_index(c(7, 0, 3, 0, 0)) # give to the poor, take away from the rich ## [1] 0.85 -gini_index(c(6, 0, 3, 1, 0)) # (a.k.a. Pigou-Dalton principle) +gini_index(c(6, 0, 3, 1, 0)) # (a.k.a. Pigou-Dalton principle) ## [1] 0.75 bonferroni_index(c(2, 2, 2, 2, 2)) ## [1] 0 diff --git a/docs/_sources/rapi/mst.md.txt b/docs/_sources/rapi/mst.md.txt index e616fcde..a8c05a86 100644 --- a/docs/_sources/rapi/mst.md.txt +++ b/docs/_sources/rapi/mst.md.txt @@ -27,14 +27,14 @@ mst(d, M = 1L, verbose = FALSE, ...) ## Arguments -| | | -|----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `d` | either a numeric matrix (or an object coercible to one, e.g., a data frame with numeric-like columns) or an object of class `dist`, see [`dist`](https://stat.ethz.ch/R-manual/R-devel/library/stats/help/dist.html). | -| `...` | further arguments passed to or from other methods. | -| `distance` | metric used to compute the linkage, one of: `"euclidean"` (synonym: `"l2"`), `"manhattan"` (a.k.a. `"l1"` and `"cityblock"`), `"cosine"`. | -| `M` | smoothing factor; `M` = 1 gives the selected `distance`; otherwise, the mutual reachability distance is used. | -| `cast_float32` | logical; whether to compute the distances using 32-bit instead of 64-bit precision floating-point arithmetic (up to 2x faster). | -| `verbose` | logical; whether to print diagnostic messages and progress information. | +| | | +|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `d` | either a numeric matrix (or an object coercible to one, e.g., a data frame with numeric-like columns) or an object of class `dist`, see [`dist`](https://stat.ethz.ch/R-manual/R-devel/library/stats/help/dist.html) | +| `...` | further arguments passed to or from other methods | +| `distance` | metric used to compute the linkage, one of: `"euclidean"` (synonym: `"l2"`), `"manhattan"` (a.k.a. `"l1"` and `"cityblock"`), `"cosine"` | +| `M` | smoothing factor; `M` = 1 gives the selected `distance`; otherwise, the mutual reachability distance is used | +| `cast_float32` | logical; whether to compute the distances using 32-bit instead of 64-bit precision floating-point arithmetic (up to 2x faster) | +| `verbose` | logical; whether to print diagnostic messages and progress information | ## Details @@ -62,13 +62,13 @@ If `M` \> 1, the `nn` attribute gives the indices of the `M`-1 nearest neighbour ## References -V. Jarnik, O jistem problemu minimalnim, Prace Moravske Prirodovedecke Spolecnosti 6 (1930) 57-63. +Jarnik V., O jistem problemu minimalnim, *Prace Moravske Prirodovedecke Spolecnosti* 6, 1930, 57-63. -Olson C.F., Parallel algorithms for hierarchical clustering, Parallel Comput. 21 (1995) 1313-1325. +Olson C.F., Parallel algorithms for hierarchical clustering, *Parallel Comput.* 21, 1995, 1313-1325. -Prim R., Shortest connection networks and some generalisations, Bell Syst. Tech. J. 36 (1957) 1389-1401. +Prim R., Shortest connection networks and some generalisations, *Bell Syst. Tech. J.* 36, 1957, 1389-1401. -Campello R., Moulavi D., Zimek A., Sander J., Hierarchical density estimates for data clustering, visualization, and outlier detection, ACM Transactions on Knowledge Discovery from Data 10(1) (2015) 5:1-5:51. +Campello R., Moulavi D., Zimek A., Sander J., Hierarchical density estimates for data clustering, visualization, and outlier detection, *ACM Transactions on Knowledge Discovery from Data* 10(1), 2015, 5:1-5:51. ## See Also diff --git a/docs/_sources/weave/basics.rst.txt b/docs/_sources/weave/basics.rst.txt index d0660fff..1c8aaaf7 100644 --- a/docs/_sources/weave/basics.rst.txt +++ b/docs/_sources/weave/basics.rst.txt @@ -14,7 +14,10 @@ in terms of clustering :any:`quality ` and :any:`speed `. Here are a few examples of basic interactions with the Python version -of the `genieclust` :cite:`genieclust` package. +of the `genieclust` :cite:`genieclust` package, +which can be installed from +`PyPI `_, e.g., +via a call to ``pip3 install genieclust`` from the command line. diff --git a/docs/_sources/weave/benchmarks_approx.rst.txt b/docs/_sources/weave/benchmarks_approx.rst.txt index 438caac7..90c34bd7 100644 --- a/docs/_sources/weave/benchmarks_approx.rst.txt +++ b/docs/_sources/weave/benchmarks_approx.rst.txt @@ -11,7 +11,7 @@ takes less than 5 minutes on a laptop. As *fast* does not necessarily mean *meaningful* (tl;dr spoiler alert: in our case, it does), let's again consider all the datasets -from the `Benchmark Suite for Clustering Algorithms — Version 1 `_ +from the `Benchmark Suite for Clustering Algorithms — Version 1 `_ :cite:`clustering_benchmarks_v1` (except the ``h2mg`` and ``g2mg`` batteries). Features with variance of 0 were removed, datasets were centred at **0** and scaled so that they have total diff --git a/docs/_sources/weave/benchmarks_ar.rst.txt b/docs/_sources/weave/benchmarks_ar.rst.txt index 916f7068..bbc72acc 100644 --- a/docs/_sources/weave/benchmarks_ar.rst.txt +++ b/docs/_sources/weave/benchmarks_ar.rst.txt @@ -3,7 +3,7 @@ Benchmarks (How Good Is It?) In this section we evaluate the usefulness of different clustering algorithms. -We consider the `Benchmark Suite for Clustering Algorithms — Version 1 `_ +We consider the `Benchmark Suite for Clustering Algorithms — Version 1 `_ :cite:`clustering_benchmarks_v1` which aggregates datasets from various sources, including, but not limited to :cite:`uci,kmsix,fcps,graves,chameleon,xnn`. Ground-truth/reference label vectors are provided alongside each dataset. diff --git a/docs/_sources/weave/benchmarks_details.rst.txt b/docs/_sources/weave/benchmarks_details.rst.txt index 6ccb9534..0e09f761 100644 --- a/docs/_sources/weave/benchmarks_details.rst.txt +++ b/docs/_sources/weave/benchmarks_details.rst.txt @@ -3,13 +3,14 @@ Benchmarks — Detailed Results In one of the :any:`above sections ` we have summarised the AR indices based on the datasets from -the `Benchmark Suite for Clustering Algorithms – Version 1 `_ +the `Benchmark Suite for Clustering Algorithms – Version 1 `_ :cite:`clustering_benchmarks_v1`. In this section we present more detailed results for some other partition similarity measures implemented in the `genieclust` package — Fowlkes–Mallows :cite:`fm`, adjusted Rand :cite:`comparing_partitions`, adjusted and normalised mutual information :cite:`nmi`, -normalised accuracy (purity) and pair sets index :cite:`psi`, +normalised accuracy (which is based on set-matching classification rate), +and pair sets index :cite:`psi`, see the API documentation of :mod:`genieclust.compare_partitions` for more details. In each case, score of 1.0 denotes perfect agreement between the clustering results and the reference partitions. diff --git a/docs/_sources/weave/r.md.txt b/docs/_sources/weave/r.md.txt index 2d5fac53..11ea07ee 100644 --- a/docs/_sources/weave/r.md.txt +++ b/docs/_sources/weave/r.md.txt @@ -10,8 +10,8 @@ install.packages("genieclust") ``` -Below are a few basic examples on how to interact with the package -(partially based on Marek's [forthcoming book](https://lmlcr.gagolewski.com)). +Below are a few basic examples of how to interact with the package. + @@ -22,10 +22,9 @@ library("genieclust") -Let's consider the Sustainable Society Indices Dataset -(see http://www.ssfindex.com/) -that measures the Human, Environmental, and Economic Wellbeing -in each country based on 7 categories on the scale $[0, 10]$. +Let's consider the [Sustainable Society Indices](http://www.ssfindex.com/) +dataset that measures the Human, Environmental, and Economic Wellbeing +in each country based on seven categories on the scale $[0, 10]$. ```r @@ -84,7 +83,7 @@ sample(y_pred, 25) # preview ``` This gives the cluster ID allocated to each country. -Let's depict the obtained partition with the `rworldmap` package: +Let's depict the obtained partition using the `rworldmap` package: ```r @@ -118,9 +117,9 @@ t(aggregate(as.data.frame(X), list(Cluster=y_pred), mean))[-1, ] ``` -Plotting of dendrograms is also possible. -For greater readability, we'll restrict ourselves to a smaller sample, say, -to the 37 members of the [OECD](https://en.wikipedia.org/wiki/OECD): +Dendrogram plotting is also possible. +For greater readability, we'll restrict ourselves to a smaller sample; +namely, to the 37 members of the [OECD](https://en.wikipedia.org/wiki/OECD): ```r @@ -155,6 +154,6 @@ calling `genie()` directly will be slightly faster than referring to (such as the Adjusted Rand or the Pair Sets Index) that can be used as external cluster validity measures. -For more details, refer to the package's documentation. -Don't forget to check out the Python examples regarding noise point detection, +For more details, refer to the package's {any}`documentation <../rapi>`. +Don't forget to check out the Python examples regarding noise points detection, benchmarking, timing, etc. diff --git a/docs/_sources/weave/string.rst.txt b/docs/_sources/weave/string.rst.txt index ebe58921..3e86acf1 100644 --- a/docs/_sources/weave/string.rst.txt +++ b/docs/_sources/weave/string.rst.txt @@ -25,6 +25,16 @@ as an example: strings[:5] # preview +:: + + ## /tmp/ipykernel_56999/1616393685.py:3: DeprecationWarning: `np.str` is + ## a deprecated alias for the builtin `str`. To silence this warning, use + ## `str` by itself. Doing this will not modify any behavior and is safe. + ## If you specifically wanted the numpy scalar type, use `np.str_` here. + ## Deprecated in NumPy 1.20; for more details and guidance: + ## https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations + ## strings = np.loadtxt("actg1.data.gz", dtype=np.str).tolist() + :: ## ['tataacaaccctgattacatcaagctacgctccggtgcgttgcctcggacgagtgctaatccctccccactgactgtattcatcttgacaata', diff --git a/docs/_sources/weave/timings.rst.txt b/docs/_sources/weave/timings.rst.txt index 58071100..72dc3776 100644 --- a/docs/_sources/weave/timings.rst.txt +++ b/docs/_sources/weave/timings.rst.txt @@ -51,7 +51,7 @@ Let's study the algorithm's run times for some of the "larger" datasets (70,000-105,600 observations, see section on :any:`benchmark results ` for discussion) from the -`Benchmark Suite for Clustering Algorithms — Version 1 `_ +`Benchmark Suite for Clustering Algorithms — Version 1 `_ :cite:`clustering_benchmarks_v1`\ . Features with variance of 0 were removed, datasets were centred at **0** and scaled so that they have total variance of 1. @@ -168,8 +168,7 @@ very large datasets. Only the system's memory limits might become a problem then .. figure:: figures/timings_g2mg-plot_1.png :width: 15 cm - Timings [s] as a function of the dataset size and dimensionality — problem sizes that can be solved during a coffee-break. - + Timings [s] as a function of the dataset size and dimensionality — problem sizes that can be solved in a few minutes. @@ -185,7 +184,7 @@ the ``mnist/digits`` dataset: -.. figure:: figures/timings_timings-plot_1.png +.. figure:: figures/timings_digits_1.png :width: 15 cm Timings [s] as a function of the number of clusters and threads. @@ -197,7 +196,6 @@ the ``mnist/digits`` dataset: - Summary ------- @@ -229,7 +227,7 @@ a first run of the algorithm: :: - ## time elapsed - first run: 13.850 + ## time elapsed - first run: 7.911 @@ -248,7 +246,6 @@ Changing some parameters and re-running the cluster search: :: - ## time elapsed - consecutive run: 0.030 - + ## time elapsed - consecutive run: 0.028 diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index a8968638..86fc9de0 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -2,6 +2,82 @@ Copyleft (C) 2021-2022, Marek Gagolewski -------------------------------------------------------------------------- */ +@import url("fonts/Alegreya-fontspec.css"); +@import url("fonts/ubuntu-fontspec.css"); + +h1, h2, h3, h4, h5, h6 { + font-weight: 700; + font-family: Alegreya Sans,Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif; +} + +body { + font-family: Lato,proxima-nova,Helvetica Neue,Arial,sans-serif; + font-weight: 400; +} + +footer p { + font-size: 75%; +} + + +ol.arabic li { + padding-bottom: 8pt; +} + +/* -------------------------------------------------------------------------- */ + + +.proof-type-exercise { + clear: both; + background: #F0F0F0; + padding: 12px; + line-height: 18px; + font-size: 14px; + margin-bottom: 24px; + box-sizing: border-box; +} + + +.proof-type-exercise { + font-size: 100%; +} + +.proof-type-exercise .proof-title { + background: #AAAAAA; + font-weight: 700; + display: block; + color: #fff; + padding: 6px 12px; + margin: -12px -12px 12px; +} + +.proof-content { + font-style: italic; + padding: 0; +} + +.proof-content p { + margin: 0; +} + +.proof-type-example { + clear: both; + background: #EFE1CE; + padding: 12px; + line-height: 24px; + margin-bottom: 24px; + box-sizing: border-box; +} + +.proof-type-example .proof-title { + background: #615550; + font-weight: 700; + display: block; + color: #fff; + padding: 6px 12px; + margin: -12px -12px 12px; +} + /* -------------------------------------------------------------------------- */ table.docutils p { @@ -38,62 +114,50 @@ strong.command, .rst-content code, .rst-content div[class^="highlight"] pre, .rs /* font-style: normal; */ } +.rst-content p { + overflow-wrap: break-word; +} /* -------------------------------------------------------------------------- */ +/* red theme */ + .wy-menu-vertical p.caption { -/* color: #ff2929; */ + color: #ff6767; } .wy-side-nav-search, .wy-nav-top { -/* background-color: #822222; */ -/* background-image: linear-gradient(#b32b2b, #822222); */ - background-image: linear-gradient(#1e70a6, #2980b9); + background-color: #751b15; + background-image: linear-gradient(#582a22, #751b15); } -.wy-side-nav-search input[type="text"] { - border: 0px solid #2980b9; +.wy-side-nav-search div.version { + color: #c36e6e; } -/* -------------------------------------------------------------------------- */ - -@font-face { - font-family: "Ubuntu Mono"; - font-style: normal; - font-weight: 400; - src: url("fonts/ubuntumono-regular.woff2") format("woff2"), - url("fonts/ubuntumono-regular.woff") format("woff"); +.wy-side-nav-search input[type="text"] { + border: 0px solid #751b15; } -@font-face { - font-family: "Ubuntu Mono"; - font-style: italic; - font-weight: 400; - src: url("fonts/ubuntumono-regular-italic.woff2") format("woff2"), - url("fonts/ubuntumono-regular-italic.woff") format("woff"); -} +/* -------------------------------------------------------------------------- */ -@font-face { - font-family: "Ubuntu Mono"; - font-style: normal; - font-weight: 700; - src: url("fonts/ubuntumono-bold.woff2") format("woff2"), - url("fonts/ubuntumono-bold.woff") format("woff"); +.wy-nav-top { + line-height: 20px; + padding-top: 12px; } -@font-face { - font-family: "Ubuntu Mono"; - font-style: italic; - font-weight: 700; - src: url("fonts/ubuntumono-bold-italic.woff2") format("woff2"), - url("fonts/ubuntumono-bold-italic.woff") format("woff"); +.wy-nav-top i { + padding-top: 0; } /* -------------------------------------------------------------------------- */ +.rst-content div.figure, .rst-content figure { + text-align: center; +} -ol.arabic li { - padding-bottom: 8pt; +.rst-content div.figure p.caption, .rst-content figure figcaption { + text-align: left; } img.img-left-align-always { @@ -111,14 +175,14 @@ img.img-right-align-always { } @media (max-width: 480px) { - img.img-left-align { + .rst-content img.img-left-align, img.img-left-align { display: block; margin-left: auto; margin-right: auto; border-radius: 0; } - img.img-right-align { + .rst-content img.img-right-align, img.img-right-align { display: block; margin-left: auto; margin-right: auto; @@ -127,14 +191,14 @@ img.img-right-align-always { } @media not (max-width: 480px) { - img.img-left-align { + .rst-content img.img-left-align, img.img-left-align { float: left; margin-right: 16px; margin-bottom: 16px; border-radius: 0; } - img.img-right-align { + .rst-content img.img-right-align, img.img-right-align { float: right; margin-left: 16px; margin-bottom: 16px; diff --git a/docs/_static/css/fonts/Alegreya-AUTHORS.txt b/docs/_static/css/fonts/Alegreya-AUTHORS.txt new file mode 100644 index 00000000..173516f3 --- /dev/null +++ b/docs/_static/css/fonts/Alegreya-AUTHORS.txt @@ -0,0 +1,8 @@ +# This is the official list of project authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS.txt file. +# See the latter for an explanation. +# +# Names should be added to this file as: +# Name or Organization + +Juan Pablo del Peral \ No newline at end of file diff --git a/docs/_static/css/fonts/Alegreya-Black.woff b/docs/_static/css/fonts/Alegreya-Black.woff new file mode 100644 index 00000000..7438b833 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-Black.woff differ diff --git a/docs/_static/css/fonts/Alegreya-Black.woff2 b/docs/_static/css/fonts/Alegreya-Black.woff2 new file mode 100644 index 00000000..eb7175e3 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-Black.woff2 differ diff --git a/docs/_static/css/fonts/Alegreya-BlackItalic.woff b/docs/_static/css/fonts/Alegreya-BlackItalic.woff new file mode 100644 index 00000000..67bb22f0 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-BlackItalic.woff differ diff --git a/docs/_static/css/fonts/Alegreya-BlackItalic.woff2 b/docs/_static/css/fonts/Alegreya-BlackItalic.woff2 new file mode 100644 index 00000000..fb492910 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-BlackItalic.woff2 differ diff --git a/docs/_static/css/fonts/Alegreya-Bold.woff b/docs/_static/css/fonts/Alegreya-Bold.woff new file mode 100644 index 00000000..619c0477 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-Bold.woff differ diff --git a/docs/_static/css/fonts/Alegreya-Bold.woff2 b/docs/_static/css/fonts/Alegreya-Bold.woff2 new file mode 100644 index 00000000..9bfed2ba Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-Bold.woff2 differ diff --git a/docs/_static/css/fonts/Alegreya-BoldItalic.woff b/docs/_static/css/fonts/Alegreya-BoldItalic.woff new file mode 100644 index 00000000..fe653167 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-BoldItalic.woff differ diff --git a/docs/_static/css/fonts/Alegreya-BoldItalic.woff2 b/docs/_static/css/fonts/Alegreya-BoldItalic.woff2 new file mode 100644 index 00000000..cbeba051 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-BoldItalic.woff2 differ diff --git a/docs/_static/css/fonts/Alegreya-CONTRIBUTORS.txt b/docs/_static/css/fonts/Alegreya-CONTRIBUTORS.txt new file mode 100644 index 00000000..b06ff0a6 --- /dev/null +++ b/docs/_static/css/fonts/Alegreya-CONTRIBUTORS.txt @@ -0,0 +1,17 @@ +# This is the list of people who have contributed to this project, +# and includes those not listed in AUTHORS.txt because they are not +# copyright authors. For example, company employees may be listed +# here because their company holds the copyright and is listed there. +# +# When adding J Random Contributor's name to this file, either J's +# name or J's organization's name should be added to AUTHORS.txt +# +# Names should be added to this file as: +# Name + +Panagiotis Haratzopoulos +Alexei Vanyashin +Gerry Leonidas +Thomas Linard +Marc Foley +Juan Pablo del Peral diff --git a/docs/_static/css/fonts/Alegreya-ExtraBold.woff b/docs/_static/css/fonts/Alegreya-ExtraBold.woff new file mode 100644 index 00000000..e5894844 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-ExtraBold.woff differ diff --git a/docs/_static/css/fonts/Alegreya-ExtraBold.woff2 b/docs/_static/css/fonts/Alegreya-ExtraBold.woff2 new file mode 100644 index 00000000..1a2bd44d Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-ExtraBold.woff2 differ diff --git a/docs/_static/css/fonts/Alegreya-ExtraBoldItalic.woff b/docs/_static/css/fonts/Alegreya-ExtraBoldItalic.woff new file mode 100644 index 00000000..4a984ac5 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-ExtraBoldItalic.woff differ diff --git a/docs/_static/css/fonts/Alegreya-ExtraBoldItalic.woff2 b/docs/_static/css/fonts/Alegreya-ExtraBoldItalic.woff2 new file mode 100644 index 00000000..a0225779 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-ExtraBoldItalic.woff2 differ diff --git a/docs/_static/css/fonts/Alegreya-Italic.woff b/docs/_static/css/fonts/Alegreya-Italic.woff new file mode 100644 index 00000000..708c8dd5 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-Italic.woff differ diff --git a/docs/_static/css/fonts/Alegreya-Italic.woff2 b/docs/_static/css/fonts/Alegreya-Italic.woff2 new file mode 100644 index 00000000..e6a6763d Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-Italic.woff2 differ diff --git a/docs/_static/css/fonts/Alegreya-LICENSE.txt b/docs/_static/css/fonts/Alegreya-LICENSE.txt new file mode 100644 index 00000000..ea10e0f9 --- /dev/null +++ b/docs/_static/css/fonts/Alegreya-LICENSE.txt @@ -0,0 +1,98 @@ +Copyright (c) 2011, Juan Pablo del Peral (juan@huertatipografica.com), with Reserved Font Names 'Alegreya' and 'Alegreya SC' + + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +# SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 + + +### PREAMBLE + +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +### DEFINITIONS + +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +### PERMISSION & CONDITIONS + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1. Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2. Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3. No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4. The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5. The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +### TERMINATION + +This license becomes null and void if any of the above conditions are +not met. + +### DISCLAIMER + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/_static/css/fonts/Alegreya-Medium.woff b/docs/_static/css/fonts/Alegreya-Medium.woff new file mode 100644 index 00000000..9980b5b2 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-Medium.woff differ diff --git a/docs/_static/css/fonts/Alegreya-Medium.woff2 b/docs/_static/css/fonts/Alegreya-Medium.woff2 new file mode 100644 index 00000000..0dd8a5e3 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-Medium.woff2 differ diff --git a/docs/_static/css/fonts/Alegreya-MediumItalic.woff b/docs/_static/css/fonts/Alegreya-MediumItalic.woff new file mode 100644 index 00000000..885ab9c0 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-MediumItalic.woff differ diff --git a/docs/_static/css/fonts/Alegreya-MediumItalic.woff2 b/docs/_static/css/fonts/Alegreya-MediumItalic.woff2 new file mode 100644 index 00000000..00f1db1b Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-MediumItalic.woff2 differ diff --git a/docs/_static/css/fonts/Alegreya-OFL.txt b/docs/_static/css/fonts/Alegreya-OFL.txt new file mode 100644 index 00000000..1a25b6d8 --- /dev/null +++ b/docs/_static/css/fonts/Alegreya-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2011 The Alegreya Project Authors (https://github.com/huertatipografica/Alegreya) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/docs/_static/css/fonts/Alegreya-README.txt b/docs/_static/css/fonts/Alegreya-README.txt new file mode 100644 index 00000000..0e9a2cf9 --- /dev/null +++ b/docs/_static/css/fonts/Alegreya-README.txt @@ -0,0 +1,44 @@ +# Alegreya + +This file provides detailed information on the Alegreya Font Software. + +This information should be distributed along with the Alegreya fonts and any derivative works. + +### Basic Font Information + +Alegreya is a typeface originally intended for literature. Among its crowning characteristics, it conveys a dynamic and varied rhythm which facilitates the reading of long texts. Also, it provides freshness to the page while referring to the calligraphic letter, not as a literal interpretation, but rather in a contemporary typographic language. + +The italic has just as much care and attention to detail in the design as the roman. The bold weights are strong, and the Black weights are really experimental for the genre. There is also a Small Caps sister family. + +Not only does Alegreya provide great performance, but also achieves a strong and harmonious text by means of elements designed in an atmosphere of diversity. + +The Alegreya type system is a "super family", originally intended for literature, and includes serif and sans serif sister families. + +It supports expert latin, greek and cyrillic character sets and provides advanced typography OpenType features such as small caps, dynamic ligatures and fractions, four set of figures, super and subscript characters, ordinals, localized accent forms for spanish, catalan, guaraní, dutch, turkish, romanian, serbian among others. + + +Alegreya was chosen at the ATypI Letter2 competition in September 2011, and one of the top 14 text type systems. It was also selected in the 2nd Bienal Iberoamericana de Diseño, competition held in Madrid in 2010 and Tipos Latinos. + +Designed by Juan Pablo del Peral for [Huerta Tipográfica](http://www.huertatipografica.com/). + + + +# Alegreya Sans + +This file provides detailed information on the Alegreya Sans Font Software. + +[Project homepage](http://www.huertatipografica.com/fonts/alegreya-sans-ht) + +This information should be distributed along with the +Alegreya Sans fonts and any derivative works. + +### Basic Font Information + + +Alegreya Sans is a humanist sans serif family with a calligraphic feeling that conveys a dynamic and varied rhythm. This gives a pleasant feeling to readers of long texts. + +The family follows humanist proportions and principles, just like the serif version of the family, Alegreya. It achieves a ludic and harmonious paragraph through elements carefully designed in an atmosphere of diversity. The italics bring a strong emphasis to the roman styles, and each have seven weights to bring you a wide typographic palette. + +Alegreya Sans supports expert latin, greek and cyrillic character sets and provides advanced typography OpenType features such as small caps, dynamic ligatures and fractions, four set of figures, super and subscript characters, ordinals, localized accent forms for spanish, catalan, guaraní, dutch, turkish, romanian, serbian among others. + +The Alegreya type system is a "super family", originally intended for literature, and includes sans and serif sister families. diff --git a/docs/_static/css/fonts/Alegreya-Regular.woff b/docs/_static/css/fonts/Alegreya-Regular.woff new file mode 100644 index 00000000..1cec2bab Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-Regular.woff differ diff --git a/docs/_static/css/fonts/Alegreya-Regular.woff2 b/docs/_static/css/fonts/Alegreya-Regular.woff2 new file mode 100644 index 00000000..3524f9d7 Binary files /dev/null and b/docs/_static/css/fonts/Alegreya-Regular.woff2 differ diff --git a/docs/_static/css/fonts/Alegreya-fontspec.css b/docs/_static/css/fonts/Alegreya-fontspec.css new file mode 100644 index 00000000..86a2ecbe --- /dev/null +++ b/docs/_static/css/fonts/Alegreya-fontspec.css @@ -0,0 +1,563 @@ +/* https://github.com/huertatipografica/Alegreya-Sans */ +/* https://github.com/huertatipografica/Alegreya */ + + +/* ------------------------------------------------------------------------- */ + +@font-face { + font-family: 'Alegreya'; + font-style: italic; + font-weight: 900; + src: local('Alegreya Black Italic'), local('Alegreya-BlackItalic'), url("Alegreya-BlackItalic.woff2") format("woff2"), url("Alegreya-BlackItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya'; + font-style: normal; + font-weight: 900; + src: local('Alegreya Black'), local('Alegreya-Black'), url("Alegreya-Black.woff2") format("woff2"), url("Alegreya-Black.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya'; + font-style: italic; + font-weight: 800; + src: local('Alegreya ExtraBold Italic'), local('Alegreya-ExtraBoldItalic'), url("Alegreya-ExtraBoldItalic.woff2") format("woff2"), url("Alegreya-ExtraBoldItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya'; + font-style: normal; + font-weight: 800; + src: local('Alegreya ExtraBold'), local('Alegreya-ExtraBold'), url("Alegreya-ExtraBold.woff2") format("woff2"), url("Alegreya-ExtraBold.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya'; + font-style: italic; + font-weight: 700; + src: local('Alegreya Bold Italic'), local('Alegreya-BoldItalic'), url("Alegreya-BoldItalic.woff2") format("woff2"), url("Alegreya-BoldItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya'; + font-style: normal; + font-weight: 700; + src: local('Alegreya Bold'), local('Alegreya-Bold'), url("Alegreya-Bold.woff2") format("woff2"), url("Alegreya-Bold.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya'; + font-style: italic; + font-weight: 500; + src: local('Alegreya Medium Italic'), local('Alegreya-MediumItalic'), url("Alegreya-MediumItalic.woff2") format("woff2"), url("Alegreya-MediumItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya'; + font-style: normal; + font-weight: 500; + src: local('Alegreya Medium'), local('Alegreya-Medium'), url("Alegreya-Medium.woff2") format("woff2"), url("Alegreya-Medium.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya'; + font-style: italic; + font-weight: 400; + src: local('Alegreya Italic'), local('Alegreya-Italic'), url("Alegreya-Italic.woff2") format("woff2"), url("Alegreya-Italic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya'; + font-style: normal; + font-weight: 400; + src: local('Alegreya Regular'), local('Alegreya-Regular'), url("Alegreya-Regular.woff2") format("woff2"), url("Alegreya-Regular.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + + +/* ------------------------------------------------------------------------- */ + + + + +@font-face { + font-family: 'Alegreya SC'; + font-style: italic; + font-weight: 900; + src: local('Alegreya SC Black Italic'), local('AlegreyaSC-BlackItalic'), url("AlegreyaSC-BlackItalic.woff2") format("woff2"), url("AlegreyaSC-BlackItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya SC'; + font-style: normal; + font-weight: 900; + src: local('Alegreya SC Black'), local('AlegreyaSC-Black'), url("AlegreyaSC-Black.woff2") format("woff2"), url("AlegreyaSC-Black.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya SC'; + font-style: italic; + font-weight: 800; + src: local('Alegreya SC ExtraBold Italic'), local('AlegreyaSC-ExtraBoldItalic'), url("AlegreyaSC-ExtraBoldItalic.woff2") format("woff2"), url("AlegreyaSC-ExtraBoldItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya SC'; + font-style: normal; + font-weight: 800; + src: local('Alegreya SC ExtraBold'), local('AlegreyaSC-ExtraBold'), url("AlegreyaSC-ExtraBold.woff2") format("woff2"), url("AlegreyaSC-ExtraBold.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya SC'; + font-style: italic; + font-weight: 700; + src: local('Alegreya SC Bold Italic'), local('AlegreyaSC-BoldItalic'), url("AlegreyaSC-BoldItalic.woff2") format("woff2"), url("AlegreyaSC-BoldItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya SC'; + font-style: normal; + font-weight: 700; + src: local('Alegreya SC Bold'), local('AlegreyaSC-Bold'), url("AlegreyaSC-Bold.woff2") format("woff2"), url("AlegreyaSC-Bold.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya SC'; + font-style: italic; + font-weight: 500; + src: local('Alegreya SC Medium Italic'), local('AlegreyaSC-MediumItalic'), url("AlegreyaSC-MediumItalic.woff2") format("woff2"), url("AlegreyaSC-MediumItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya SC'; + font-style: normal; + font-weight: 500; + src: local('Alegreya SC Medium'), local('AlegreyaSC-Medium'), url("AlegreyaSC-Medium.woff2") format("woff2"), url("AlegreyaSC-Medium.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya SC'; + font-style: italic; + font-weight: 400; + src: local('Alegreya SC Italic'), local('AlegreyaSC-Italic'), url("AlegreyaSC-Italic.woff2") format("woff2"), url("AlegreyaSC-Italic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya SC'; + font-style: normal; + font-weight: 400; + src: local('Alegreya SC Regular'), local('AlegreyaSC-Regular'), url("AlegreyaSC-Regular.woff2") format("woff2"), url("AlegreyaSC-Regular.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + + + + + + + + + + + + + +/* ------------------------------------------------------------------------- */ + +@font-face { + font-family: 'Alegreya Sans'; + font-style: italic; + font-weight: 900; + src: local('Alegreya Sans Black Italic'), local('AlegreyaSans-BlackItalic'), url("AlegreyaSans-BlackItalic.woff2") format("woff2"), url("AlegreyaSans-BlackItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans'; + font-style: normal; + font-weight: 900; + src: local('Alegreya Sans Black'), local('AlegreyaSans-Black'), url("AlegreyaSans-Black.woff2") format("woff2"), url("AlegreyaSans-Black.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans'; + font-style: italic; + font-weight: 800; + src: local('Alegreya Sans ExtraBold Italic'), local('AlegreyaSans-ExtraBoldItalic'), url("AlegreyaSans-ExtraBoldItalic.woff2") format("woff2"), url("AlegreyaSans-ExtraBoldItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans'; + font-style: normal; + font-weight: 800; + src: local('Alegreya Sans ExtraBold'), local('AlegreyaSans-ExtraBold'), url("AlegreyaSans-ExtraBold.woff2") format("woff2"), url("AlegreyaSans-ExtraBold.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans'; + font-style: italic; + font-weight: 700; + src: local('Alegreya Sans Bold Italic'), local('AlegreyaSans-BoldItalic'), url("AlegreyaSans-BoldItalic.woff2") format("woff2"), url("AlegreyaSans-BoldItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans'; + font-style: normal; + font-weight: 700; + src: local('Alegreya Sans Bold'), local('AlegreyaSans-Bold'), url("AlegreyaSans-Bold.woff2") format("woff2"), url("AlegreyaSans-Bold.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans'; + font-style: italic; + font-weight: 500; + src: local('Alegreya Sans Medium Italic'), local('AlegreyaSans-MediumItalic'), url("AlegreyaSans-MediumItalic.woff2") format("woff2"), url("AlegreyaSans-MediumItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans'; + font-style: normal; + font-weight: 500; + src: local('Alegreya Sans Medium'), local('AlegreyaSans-Medium'), url("AlegreyaSans-Medium.woff2") format("woff2"), url("AlegreyaSans-Medium.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans'; + font-style: italic; + font-weight: 400; + src: local('Alegreya Sans Italic'), local('AlegreyaSans-Italic'), url("AlegreyaSans-Italic.woff2") format("woff2"), url("AlegreyaSans-Italic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans'; + font-style: normal; + font-weight: 400; + src: local('Alegreya Sans Regular'), local('AlegreyaSans-Regular'), url("AlegreyaSans-Regular.woff2") format("woff2"), url("AlegreyaSans-Regular.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + + +@font-face { + font-family: 'Alegreya Sans'; + font-style: italic; + font-weight: 300; + src: local('Alegreya Sans Light Italic'), local('AlegreyaSans-LightItalic'), url("AlegreyaSans-LightItalic.woff2") format("woff2"), url("AlegreyaSans-LightItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans'; + font-style: normal; + font-weight: 300; + src: local('Alegreya Sans Light'), local('AlegreyaSans-Light'), url("AlegreyaSans-Light.woff2") format("woff2"), url("AlegreyaSans-Light.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + + + +@font-face { + font-family: 'Alegreya Sans'; + font-style: italic; + font-weight: 100; + src: local('Alegreya Sans Thin Italic'), local('AlegreyaSans-ThinItalic'), url("AlegreyaSans-ThinItalic.woff2") format("woff2"), url("AlegreyaSans-ThinItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans'; + font-style: normal; + font-weight: 100; + src: local('Alegreya Sans Thin'), local('AlegreyaSans-Thin'), url("AlegreyaSans-Thin.woff2") format("woff2"), url("AlegreyaSans-Thin.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +/* ------------------------------------------------------------------------- */ + + + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: italic; + font-weight: 900; + src: local('Alegreya Sans SC Black Italic'), local('AlegreyaSansSC-BlackItalic'), url("AlegreyaSansSC-BlackItalic.woff2") format("woff2"), url("AlegreyaSansSC-BlackItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: normal; + font-weight: 900; + src: local('Alegreya Sans SC Black'), local('AlegreyaSansSC-Black'), url("AlegreyaSansSC-Black.woff2") format("woff2"), url("AlegreyaSansSC-Black.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: italic; + font-weight: 800; + src: local('Alegreya Sans SC ExtraBold Italic'), local('AlegreyaSansSC-ExtraBoldItalic'), url("AlegreyaSansSC-ExtraBoldItalic.woff2") format("woff2"), url("AlegreyaSansSC-ExtraBoldItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: normal; + font-weight: 800; + src: local('Alegreya Sans SC ExtraBold'), local('AlegreyaSansSC-ExtraBold'), url("AlegreyaSansSC-ExtraBold.woff2") format("woff2"), url("AlegreyaSansSC-ExtraBold.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: italic; + font-weight: 700; + src: local('Alegreya Sans SC Bold Italic'), local('AlegreyaSansSC-BoldItalic'), url("AlegreyaSansSC-BoldItalic.woff2") format("woff2"), url("AlegreyaSansSC-BoldItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: normal; + font-weight: 700; + src: local('Alegreya Sans SC Bold'), local('AlegreyaSansSC-Bold'), url("AlegreyaSansSC-Bold.woff2") format("woff2"), url("AlegreyaSansSC-Bold.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: italic; + font-weight: 500; + src: local('Alegreya Sans SC Medium Italic'), local('AlegreyaSansSC-MediumItalic'), url("AlegreyaSansSC-MediumItalic.woff2") format("woff2"), url("AlegreyaSansSC-MediumItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: normal; + font-weight: 500; + src: local('Alegreya Sans SC Medium'), local('AlegreyaSansSC-Medium'), url("AlegreyaSansSC-Medium.woff2") format("woff2"), url("AlegreyaSansSC-Medium.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: italic; + font-weight: 400; + src: local('Alegreya Sans SC Italic'), local('AlegreyaSansSC-Italic'), url("AlegreyaSansSC-Italic.woff2") format("woff2"), url("AlegreyaSansSC-Italic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: normal; + font-weight: 400; + src: local('Alegreya Sans SC Regular'), local('AlegreyaSansSC-Regular'), url("AlegreyaSansSC-Regular.woff2") format("woff2"), url("AlegreyaSansSC-Regular.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: italic; + font-weight: 300; + src: local('Alegreya Sans SC Light Italic'), local('AlegreyaSansSC-LightItalic'), url("AlegreyaSansSC-LightItalic.woff2") format("woff2"), url("AlegreyaSansSC-LightItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: normal; + font-weight: 300; + src: local('Alegreya Sans SC Light'), local('AlegreyaSansSC-Light'), url("AlegreyaSansSC-Light.woff2") format("woff2"), url("AlegreyaSansSC-Light.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: italic; + font-weight: 100; + src: local('Alegreya Sans SC Thin Italic'), local('AlegreyaSansSC-ThinItalic'), url("AlegreyaSansSC-ThinItalic.woff2") format("woff2"), url("AlegreyaSansSC-ThinItalic.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + + +@font-face { + font-family: 'Alegreya Sans SC'; + font-style: normal; + font-weight: 100; + src: local('Alegreya Sans SC Thin'), local('AlegreyaSansSC-Thin'), url("AlegreyaSansSC-Thin.woff2") format("woff2"), url("AlegreyaSansSC-Thin.woff") format("woff"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD, + U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F, U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF, + U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB, U+0370-03FF, U+1F00-1FFF, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + diff --git a/docs/_static/css/fonts/AlegreyaSC-Black.woff b/docs/_static/css/fonts/AlegreyaSC-Black.woff new file mode 100644 index 00000000..fa9aad0e Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-Black.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSC-Black.woff2 b/docs/_static/css/fonts/AlegreyaSC-Black.woff2 new file mode 100644 index 00000000..8af997d5 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-Black.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSC-BlackItalic.woff b/docs/_static/css/fonts/AlegreyaSC-BlackItalic.woff new file mode 100644 index 00000000..bd5a42e5 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-BlackItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSC-BlackItalic.woff2 b/docs/_static/css/fonts/AlegreyaSC-BlackItalic.woff2 new file mode 100644 index 00000000..31830b76 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-BlackItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSC-Bold.woff b/docs/_static/css/fonts/AlegreyaSC-Bold.woff new file mode 100644 index 00000000..b2bc54f7 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-Bold.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSC-Bold.woff2 b/docs/_static/css/fonts/AlegreyaSC-Bold.woff2 new file mode 100644 index 00000000..cb07dd52 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-Bold.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSC-BoldItalic.woff b/docs/_static/css/fonts/AlegreyaSC-BoldItalic.woff new file mode 100644 index 00000000..aa786fdb Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-BoldItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSC-BoldItalic.woff2 b/docs/_static/css/fonts/AlegreyaSC-BoldItalic.woff2 new file mode 100644 index 00000000..e02c0163 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-BoldItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSC-ExtraBold.woff b/docs/_static/css/fonts/AlegreyaSC-ExtraBold.woff new file mode 100644 index 00000000..5dd331aa Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-ExtraBold.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSC-ExtraBold.woff2 b/docs/_static/css/fonts/AlegreyaSC-ExtraBold.woff2 new file mode 100644 index 00000000..22d487cb Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-ExtraBold.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSC-ExtraBoldItalic.woff b/docs/_static/css/fonts/AlegreyaSC-ExtraBoldItalic.woff new file mode 100644 index 00000000..30c354ec Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-ExtraBoldItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSC-ExtraBoldItalic.woff2 b/docs/_static/css/fonts/AlegreyaSC-ExtraBoldItalic.woff2 new file mode 100644 index 00000000..f8da9dd7 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-ExtraBoldItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSC-Italic.woff b/docs/_static/css/fonts/AlegreyaSC-Italic.woff new file mode 100644 index 00000000..2c3785bb Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-Italic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSC-Italic.woff2 b/docs/_static/css/fonts/AlegreyaSC-Italic.woff2 new file mode 100644 index 00000000..b6fc6d0c Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-Italic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSC-Medium.woff b/docs/_static/css/fonts/AlegreyaSC-Medium.woff new file mode 100644 index 00000000..a3dd076c Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-Medium.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSC-Medium.woff2 b/docs/_static/css/fonts/AlegreyaSC-Medium.woff2 new file mode 100644 index 00000000..d7a86af2 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-Medium.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSC-MediumItalic.woff b/docs/_static/css/fonts/AlegreyaSC-MediumItalic.woff new file mode 100644 index 00000000..3b932036 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-MediumItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSC-MediumItalic.woff2 b/docs/_static/css/fonts/AlegreyaSC-MediumItalic.woff2 new file mode 100644 index 00000000..8ada8758 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-MediumItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSC-Regular.woff b/docs/_static/css/fonts/AlegreyaSC-Regular.woff new file mode 100644 index 00000000..53759505 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-Regular.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSC-Regular.woff2 b/docs/_static/css/fonts/AlegreyaSC-Regular.woff2 new file mode 100644 index 00000000..4565f4fe Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSC-Regular.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Black.woff b/docs/_static/css/fonts/AlegreyaSans-Black.woff new file mode 100644 index 00000000..8ee35a16 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Black.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Black.woff2 b/docs/_static/css/fonts/AlegreyaSans-Black.woff2 new file mode 100644 index 00000000..936f5d06 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Black.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-BlackItalic.woff b/docs/_static/css/fonts/AlegreyaSans-BlackItalic.woff new file mode 100644 index 00000000..b842fbe5 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-BlackItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-BlackItalic.woff2 b/docs/_static/css/fonts/AlegreyaSans-BlackItalic.woff2 new file mode 100644 index 00000000..b03664be Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-BlackItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Bold.woff b/docs/_static/css/fonts/AlegreyaSans-Bold.woff new file mode 100644 index 00000000..6fbd3faf Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Bold.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Bold.woff2 b/docs/_static/css/fonts/AlegreyaSans-Bold.woff2 new file mode 100644 index 00000000..fb492047 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Bold.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-BoldItalic.woff b/docs/_static/css/fonts/AlegreyaSans-BoldItalic.woff new file mode 100644 index 00000000..46915063 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-BoldItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-BoldItalic.woff2 b/docs/_static/css/fonts/AlegreyaSans-BoldItalic.woff2 new file mode 100644 index 00000000..3e9a9185 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-BoldItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-ExtraBold.woff b/docs/_static/css/fonts/AlegreyaSans-ExtraBold.woff new file mode 100644 index 00000000..d1cb44c0 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-ExtraBold.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-ExtraBold.woff2 b/docs/_static/css/fonts/AlegreyaSans-ExtraBold.woff2 new file mode 100644 index 00000000..bce5516d Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-ExtraBold.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-ExtraBoldItalic.woff b/docs/_static/css/fonts/AlegreyaSans-ExtraBoldItalic.woff new file mode 100644 index 00000000..ac004097 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-ExtraBoldItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-ExtraBoldItalic.woff2 b/docs/_static/css/fonts/AlegreyaSans-ExtraBoldItalic.woff2 new file mode 100644 index 00000000..1e8062d1 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-ExtraBoldItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Italic.woff b/docs/_static/css/fonts/AlegreyaSans-Italic.woff new file mode 100644 index 00000000..97b68082 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Italic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Italic.woff2 b/docs/_static/css/fonts/AlegreyaSans-Italic.woff2 new file mode 100644 index 00000000..fff11042 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Italic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Light.woff b/docs/_static/css/fonts/AlegreyaSans-Light.woff new file mode 100644 index 00000000..b090e447 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Light.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Light.woff2 b/docs/_static/css/fonts/AlegreyaSans-Light.woff2 new file mode 100644 index 00000000..7e72522c Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Light.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-LightItalic.woff b/docs/_static/css/fonts/AlegreyaSans-LightItalic.woff new file mode 100644 index 00000000..bb8fba2f Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-LightItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-LightItalic.woff2 b/docs/_static/css/fonts/AlegreyaSans-LightItalic.woff2 new file mode 100644 index 00000000..b845bd9e Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-LightItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Medium.woff b/docs/_static/css/fonts/AlegreyaSans-Medium.woff new file mode 100644 index 00000000..f445419d Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Medium.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Medium.woff2 b/docs/_static/css/fonts/AlegreyaSans-Medium.woff2 new file mode 100644 index 00000000..9d3bd09e Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Medium.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-MediumItalic.woff b/docs/_static/css/fonts/AlegreyaSans-MediumItalic.woff new file mode 100644 index 00000000..45d30ae0 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-MediumItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-MediumItalic.woff2 b/docs/_static/css/fonts/AlegreyaSans-MediumItalic.woff2 new file mode 100644 index 00000000..8f225c4d Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-MediumItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Regular.woff b/docs/_static/css/fonts/AlegreyaSans-Regular.woff new file mode 100644 index 00000000..7b2d37c6 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Regular.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Regular.woff2 b/docs/_static/css/fonts/AlegreyaSans-Regular.woff2 new file mode 100644 index 00000000..51a523eb Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Regular.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Thin.woff b/docs/_static/css/fonts/AlegreyaSans-Thin.woff new file mode 100644 index 00000000..e55418f4 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Thin.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-Thin.woff2 b/docs/_static/css/fonts/AlegreyaSans-Thin.woff2 new file mode 100644 index 00000000..16de4333 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-Thin.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSans-ThinItalic.woff b/docs/_static/css/fonts/AlegreyaSans-ThinItalic.woff new file mode 100644 index 00000000..5edefbd6 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-ThinItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSans-ThinItalic.woff2 b/docs/_static/css/fonts/AlegreyaSans-ThinItalic.woff2 new file mode 100644 index 00000000..52cb13ca Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSans-ThinItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Black.woff b/docs/_static/css/fonts/AlegreyaSansSC-Black.woff new file mode 100644 index 00000000..b67987d8 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Black.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Black.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-Black.woff2 new file mode 100644 index 00000000..260f4403 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Black.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-BlackItalic.woff b/docs/_static/css/fonts/AlegreyaSansSC-BlackItalic.woff new file mode 100644 index 00000000..d700e13d Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-BlackItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-BlackItalic.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-BlackItalic.woff2 new file mode 100644 index 00000000..85ef8552 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-BlackItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Bold.woff b/docs/_static/css/fonts/AlegreyaSansSC-Bold.woff new file mode 100644 index 00000000..b3d64da4 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Bold.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Bold.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-Bold.woff2 new file mode 100644 index 00000000..528f7763 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Bold.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-BoldItalic.woff b/docs/_static/css/fonts/AlegreyaSansSC-BoldItalic.woff new file mode 100644 index 00000000..38b1f6f0 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-BoldItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-BoldItalic.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-BoldItalic.woff2 new file mode 100644 index 00000000..1422c2ff Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-BoldItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-ExtraBold.woff b/docs/_static/css/fonts/AlegreyaSansSC-ExtraBold.woff new file mode 100644 index 00000000..751c9d43 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-ExtraBold.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-ExtraBold.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-ExtraBold.woff2 new file mode 100644 index 00000000..8170e5f7 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-ExtraBold.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-ExtraBoldItalic.woff b/docs/_static/css/fonts/AlegreyaSansSC-ExtraBoldItalic.woff new file mode 100644 index 00000000..07a82bb7 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-ExtraBoldItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-ExtraBoldItalic.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-ExtraBoldItalic.woff2 new file mode 100644 index 00000000..5acaa336 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-ExtraBoldItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Italic.woff b/docs/_static/css/fonts/AlegreyaSansSC-Italic.woff new file mode 100644 index 00000000..fe32fcba Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Italic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Italic.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-Italic.woff2 new file mode 100644 index 00000000..610625c6 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Italic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Light.woff b/docs/_static/css/fonts/AlegreyaSansSC-Light.woff new file mode 100644 index 00000000..56f69808 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Light.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Light.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-Light.woff2 new file mode 100644 index 00000000..366b5746 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Light.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-LightItalic.woff b/docs/_static/css/fonts/AlegreyaSansSC-LightItalic.woff new file mode 100644 index 00000000..a384ccb8 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-LightItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-LightItalic.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-LightItalic.woff2 new file mode 100644 index 00000000..6a6ddfc9 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-LightItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Medium.woff b/docs/_static/css/fonts/AlegreyaSansSC-Medium.woff new file mode 100644 index 00000000..8163eb3d Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Medium.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Medium.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-Medium.woff2 new file mode 100644 index 00000000..5ed9a794 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Medium.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-MediumItalic.woff b/docs/_static/css/fonts/AlegreyaSansSC-MediumItalic.woff new file mode 100644 index 00000000..28d07ba1 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-MediumItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-MediumItalic.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-MediumItalic.woff2 new file mode 100644 index 00000000..3f399a26 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-MediumItalic.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Regular.woff b/docs/_static/css/fonts/AlegreyaSansSC-Regular.woff new file mode 100644 index 00000000..74831adb Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Regular.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Regular.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-Regular.woff2 new file mode 100644 index 00000000..0d5ebdbc Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Regular.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Thin.woff b/docs/_static/css/fonts/AlegreyaSansSC-Thin.woff new file mode 100644 index 00000000..7de08991 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Thin.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-Thin.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-Thin.woff2 new file mode 100644 index 00000000..ed354eee Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-Thin.woff2 differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-ThinItalic.woff b/docs/_static/css/fonts/AlegreyaSansSC-ThinItalic.woff new file mode 100644 index 00000000..67e86229 Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-ThinItalic.woff differ diff --git a/docs/_static/css/fonts/AlegreyaSansSC-ThinItalic.woff2 b/docs/_static/css/fonts/AlegreyaSansSC-ThinItalic.woff2 new file mode 100644 index 00000000..0f8785bb Binary files /dev/null and b/docs/_static/css/fonts/AlegreyaSansSC-ThinItalic.woff2 differ diff --git a/docs/_static/css/fonts/ubuntu-fontspec.css b/docs/_static/css/fonts/ubuntu-fontspec.css new file mode 100644 index 00000000..0ad34dd9 --- /dev/null +++ b/docs/_static/css/fonts/ubuntu-fontspec.css @@ -0,0 +1,31 @@ +@font-face { + font-family: "Ubuntu Mono"; + font-style: normal; + font-weight: 400; + src: url("ubuntumono-regular.woff2") format("woff2"), + url("ubuntumono-regular.woff") format("woff"); +} + +@font-face { + font-family: "Ubuntu Mono"; + font-style: italic; + font-weight: 400; + src: url("ubuntumono-regular-italic.woff2") format("woff2"), + url("ubuntumono-regular-italic.woff") format("woff"); +} + +@font-face { + font-family: "Ubuntu Mono"; + font-style: normal; + font-weight: 700; + src: url("ubuntumono-bold.woff2") format("woff2"), + url("ubuntumono-bold.woff") format("woff"); +} + +@font-face { + font-family: "Ubuntu Mono"; + font-style: italic; + font-weight: 700; + src: url("ubuntumono-bold-italic.woff2") format("woff2"), + url("ubuntumono-bold-italic.woff") format("woff"); +} diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js index 114d5bca..5016d160 100644 --- a/docs/_static/documentation_options.js +++ b/docs/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.0.1', + VERSION: '1.1.0', LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/_static/proof.css b/docs/_static/proof.css new file mode 100644 index 00000000..e69de29b diff --git a/docs/_static/proof.js b/docs/_static/proof.js new file mode 100644 index 00000000..e69de29b diff --git a/docs/_static/pygments.css b/docs/_static/pygments.css index 227cb88f..08bec689 100644 --- a/docs/_static/pygments.css +++ b/docs/_static/pygments.css @@ -4,71 +4,71 @@ span.linenos { color: inherit; background-color: transparent; padding-left: 5px; td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } -.highlight { background: #ffffff; } -.highlight .c { color: #888888 } /* Comment */ -.highlight .err { color: #FF0000; background-color: #FFAAAA } /* Error */ -.highlight .k { color: #008800; font-weight: bold } /* Keyword */ -.highlight .o { color: #333333 } /* Operator */ -.highlight .ch { color: #888888 } /* Comment.Hashbang */ -.highlight .cm { color: #888888 } /* Comment.Multiline */ -.highlight .cp { color: #557799 } /* Comment.Preproc */ -.highlight .cpf { color: #888888 } /* Comment.PreprocFile */ -.highlight .c1 { color: #888888 } /* Comment.Single */ -.highlight .cs { color: #cc0000; font-weight: bold } /* Comment.Special */ +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gr { color: #E40000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #888888 } /* Generic.Output */ -.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .highlight .gt { color: #0044DD } /* Generic.Traceback */ -.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #003388; font-weight: bold } /* Keyword.Pseudo */ -.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #333399; font-weight: bold } /* Keyword.Type */ -.highlight .m { color: #6600EE; font-weight: bold } /* Literal.Number */ -.highlight .s { background-color: #fff0f0 } /* Literal.String */ -.highlight .na { color: #0000CC } /* Name.Attribute */ -.highlight .nb { color: #007020 } /* Name.Builtin */ -.highlight .nc { color: #BB0066; font-weight: bold } /* Name.Class */ -.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ -.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ -.highlight .ni { color: #880000; font-weight: bold } /* Name.Entity */ -.highlight .ne { color: #FF0000; font-weight: bold } /* Name.Exception */ -.highlight .nf { color: #0066BB; font-weight: bold } /* Name.Function */ -.highlight .nl { color: #997700; font-weight: bold } /* Name.Label */ -.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ -.highlight .nt { color: #007700 } /* Name.Tag */ -.highlight .nv { color: #996633 } /* Name.Variable */ -.highlight .ow { color: #000000; font-weight: bold } /* Operator.Word */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ -.highlight .mb { color: #6600EE; font-weight: bold } /* Literal.Number.Bin */ -.highlight .mf { color: #6600EE; font-weight: bold } /* Literal.Number.Float */ -.highlight .mh { color: #005588; font-weight: bold } /* Literal.Number.Hex */ -.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ -.highlight .mo { color: #4400EE; font-weight: bold } /* Literal.Number.Oct */ -.highlight .sa { background-color: #fff0f0 } /* Literal.String.Affix */ -.highlight .sb { background-color: #fff0f0 } /* Literal.String.Backtick */ -.highlight .sc { color: #0044DD } /* Literal.String.Char */ -.highlight .dl { background-color: #fff0f0 } /* Literal.String.Delimiter */ -.highlight .sd { color: #DD4422 } /* Literal.String.Doc */ -.highlight .s2 { background-color: #fff0f0 } /* Literal.String.Double */ -.highlight .se { color: #666666; font-weight: bold; background-color: #fff0f0 } /* Literal.String.Escape */ -.highlight .sh { background-color: #fff0f0 } /* Literal.String.Heredoc */ -.highlight .si { background-color: #eeeeee } /* Literal.String.Interpol */ -.highlight .sx { color: #DD2200; background-color: #fff0f0 } /* Literal.String.Other */ -.highlight .sr { color: #000000; background-color: #fff0ff } /* Literal.String.Regex */ -.highlight .s1 { background-color: #fff0f0 } /* Literal.String.Single */ -.highlight .ss { color: #AA6600 } /* Literal.String.Symbol */ -.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ -.highlight .fm { color: #0066BB; font-weight: bold } /* Name.Function.Magic */ -.highlight .vc { color: #336699 } /* Name.Variable.Class */ -.highlight .vg { color: #dd7700; font-weight: bold } /* Name.Variable.Global */ -.highlight .vi { color: #3333BB } /* Name.Variable.Instance */ -.highlight .vm { color: #996633 } /* Name.Variable.Magic */ -.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ \ No newline at end of file +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/genieclust.html b/docs/genieclust.html index 3b520286..8a4a0e2f 100644 --- a/docs/genieclust.html +++ b/docs/genieclust.html @@ -2,13 +2,20 @@ + + - Python Package genieclust Reference — genieclust + Python Package genieclust Reference — Python and R Package genieclust + + + + + @@ -62,25 +69,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
- +
@@ -101,6 +114,10 @@

Examples and Tutorials

@@ -191,20 +247,23 @@

Python Package genieclust Reference

genieclust.Genie([n_clusters, ...])

Genie++ hierarchical clustering algorithm

-

genieclust.compare_partitions

-

Partition similarity scores

+

genieclust.cluster_validity

+

So-called internal cluster validity indices

+ +

genieclust.compare_partitions

+

External cluster validity measures and partition similarity scores

-

genieclust.inequity

+

genieclust.inequity

Inequity (inequality) measures

-

genieclust.internal

+

genieclust.internal

Internal functions and classes

-

genieclust.plots

+

genieclust.plots

Various plotting functions

-

genieclust.tools

-

Functions a person might find useful, but not necessarily

+

genieclust.tools

+

Functions one might find useful, but not necessarily

@@ -212,6 +271,7 @@

Python Package genieclust ReferenceModules and Classes:

@@ -256,12 +324,7 @@

Python Package genieclust Reference + + + + + + + + + genieclust.cluster_validity — Python and R Package genieclust + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ + +
+ +
+ +
+ + + + + + \ No newline at end of file diff --git a/docs/genieclust_compare_partitions.html b/docs/genieclust_compare_partitions.html index cfd7ca3d..bd2f8f7b 100644 --- a/docs/genieclust_compare_partitions.html +++ b/docs/genieclust_compare_partitions.html @@ -2,13 +2,20 @@ + + - genieclust.compare_partitions — genieclust + genieclust.compare_partitions — Python and R Package genieclust + + + + + @@ -50,7 +57,7 @@ - + @@ -64,25 +71,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
- +
@@ -103,6 +116,10 @@

Examples and Tutorials

@@ -185,7 +242,64 @@

genieclust.compare_partitions

-

Partition similarity scores

+

External cluster validity measures and partition similarity scores

+

These indices can be used for comparing the outputs of clustering algorithms +with reference (ground truth) labels.

+

For more details, see the +Framework for Benchmarking Clustering Algorithms.

+
+
+genieclust.compare_partitions.adjusted_asymmetric_accuracy(x, y)
+

Adjusted asymmetric accuracy (AAA) [1].

+
+
Parameters
+
+
x, yarray_like

Two vectors of “small” integers of identical lengths, +representing two partitions of the same set. +x is the set of ground truth (reference) labels +and y is a partition whose quality we would like to asses

+
+
+
+
Returns
+
+
double

Partition similarity measure.

+
+
+
+
+
+

See also

+
+
genieclust.compare_partitions.compare_partitions

Computes multiple similarity scores based on a confusion matrix

+
+
genieclust.compare_partitions.compare_partitions2

Computes multiple similarity scores based on two label vectors

+
+
genieclust.compare_partitions.normalized_confusion_matrix

Determines the confusion matrix and permutes the rows and columns so that the sum of the elements of the main diagonal is the largest possible

+
+
+
+

Notes

+

Let \(C\) be a confusion matrix with \(K\) rows +and \(K\) columns. +AAA is an external cluster validity measure. +It is a corrected-for-chance summary of the proportion of correctly +classified points in each cluster (with cluster matching based on the +solution to the maximal linear sum assignment problem; see +normalize_confusion_matrix()), given by: +\((\max_\sigma \sum_{i=1}^K (c_{i, \sigma(i)}/(c_{i, 1}+...+c_{i, K})) - 1)/(K - 1)\).

+

Note that this measure is not symmetric, i.e., index(x, y) does not +have to be equal to index(y, x).

+

See [1] for more details and compare_partitions() for more functions.

+

References

+
+
1(1,2)
+

Gagolewski M., Adjusted asymmetric accuracy: A well-behaving external +cluster validity measure, 2022, submitted for publication.

+
+
+
+
genieclust.compare_partitions.adjusted_fm_score(x, y)
@@ -215,7 +329,7 @@

Notes

-

See genieclust.compare_partitions.compare_partitions for more details.

+

See compare_partitions() for more details.

@@ -247,7 +361,7 @@

Notes

-

See genieclust.compare_partitions.compare_partitions for more details.

+

See compare_partitions() for more details.

@@ -279,13 +393,13 @@

Notes

-

See genieclust.compare_partitions.compare_partitions for more details.

+

See compare_partitions() for more details.

genieclust.compare_partitions.compare_partitions(C)
-

Computes a series of partition similarity scores

+

Computes a series of external cluster validity measures

Parameters
@@ -312,10 +426,16 @@
'ami'

Adjusted mutual information \((\mathrm{AMI}_\mathrm{sum})\)

-
'nacc'

Normalised accuracy (purity)

+
'nacc'

Normalised (set-matching) accuracy

'psi'

Pair sets index

+
'spsi'

Simplified pair sets index

+
+
'aaa'

Adjusted asymmetric accuracy (or nan if \(K \neq L\)); +it is assumed that rows in C represent the ground-truth +partition

+
@@ -326,8 +446,13 @@
genieclust.compare_partitions.confusion_matrix

Computes a confusion matrix

+
genieclust.compare_partitions.normalized_confusion_matrix

Determines the confusion matrix and permutes the rows and columns so that the sum of the elements of the main diagonal is the largest possible

+
genieclust.compare_partitions.compare_partitions2

A wrapper around this function that accepts two label vectors on input

+
genieclust.compare_partitions.adjusted_asymmetric_accuracy
+
genieclust.compare_partitions.normalized_accuracy
+
genieclust.compare_partitions.pair_sets_index
genieclust.compare_partitions.adjusted_rand_score
genieclust.compare_partitions.rand_score
genieclust.compare_partitions.adjusted_fm_score
@@ -335,8 +460,6 @@
genieclust.compare_partitions.mi_score
genieclust.compare_partitions.normalized_mi_score
genieclust.compare_partitions.adjusted_mi_score
-
genieclust.compare_partitions.normalized_accuracy
-
genieclust.compare_partitions.pair_sets_index

Notes

@@ -345,70 +468,86 @@ nonempty and pairwise disjoint subsets. For instance, these can be two clusterings of a dataset with \(n\) observations specified as vectors of labels. Moreover, let C be the -confusion matrix (with \(K\) rows and \(L\) columns, \(K \leq L\)) -corresponding to x and y, see also -genieclust.compare_partitions.confusion_matrix.

+confusion matrix (with \(K\) rows and \(L\) columns, +\(K \leq L\)) corresponding to x and y; see also +confusion_matrix().

This function implements a few scores that aim to quantify -the similarity between x and y. -Partition similarity scores can be used as external cluster validity -measures — for comparing the outputs of clustering algorithms -with reference (ground truth) labels, see, e.g., -https://github.com/gagolews/clustering_benchmarks_v1 -for a suite of benchmark datasets.

-

Every index except mi_score (which computes the mutual -information score) outputs 1 given two identical partitions. +the similarity between x and y.

+

These functions can be used as external cluster +validity measures, where we assume that x is +the reference (ground-truth) partition; compare [5].

+

Each index except adjusted_asymmetric_accuracy +can act as a pairwise partition similarity score: it is symmetric, +i.e., index(x, y) == index(y, x).

+

Each index except mi_score (which computes the mutual information score) +outputs the value of 1.0 if two identical partitions are given. Note that partitions are always defined up to a bijection of the set of possible labels, e.g., (1, 1, 2, 1) and (4, 4, 2, 4) represent the same 2-partition.

+

adjusted_asymmetric_accuracy [2] +only accepts \(K = L\). It is an external cluster validity measure +which assumes that the label vector x (or rows in the confusion +matrix) represents the reference (ground truth) partition. +It is a corrected-for-chance summary of the proportion of correctly +classified points in each cluster (with cluster matching based on the +solution to the maximal linear sum assignment problem; see +normalize_confusion_matrix()), given by: +\((\max_\sigma \sum_{i=1}^K (c_{i, \sigma(i)}/(c_{i, 1}+...+c_{i, K})) - 1)/(K - 1)\), +where \(C\) is the confusion matrix.

+

normalized_accuracy is a measure defined as +\((\mathrm{Accuracy}(C_\sigma)-1/L)/(1-1/L)\), +where \(C_\sigma\) is a version of the confusion matrix +for given x and y, \(K \leq L\), with columns permuted +based on the solution to the maximal linear sum assignment problem. +Note that the \(\mathrm{Accuracy}(C_\sigma)\) part +is sometimes referred to as set-matching classification +rate or pivoted accuracy.

+

pair_sets_index gives the Pair Sets Index (PSI) +adjusted for chance [3], \(K \leq L\). +Pairing is based on the solution to the linear sum assignment problem +of a transformed version of the confusion matrix. +Its simplified version assumes E=1 in the definition of the index, +i.e., uses Eq. (20) instead of (18); see [3].

rand_score gives the Rand score (the “probability” of agreement between the two partitions) and adjusted_rand_score is its version -corrected for chance [1] (especially Eqs. (2) and (4) therein): +corrected for chance [1] (especially Eqs. (2) and (4) therein): its expected value is 0.0 for two independent partitions. Due to the adjustment, the resulting index might also be negative for some inputs.

Similarly, fm_score gives the Fowlkes-Mallows (FM) score -and adjusted_fm_score is its adjusted-for-chance version [1].

+and adjusted_fm_score is its adjusted-for-chance version [1].

Note that both the (unadjusted) Rand and FM scores are bounded from below by \(1/(K+1)\) if \(K = L\), hence their adjusted versions are preferred.

mi_score, adjusted_mi_score and normalized_mi_score are information-theoretic indices based on mutual information, see the definition of \(\mathrm{AMI}_\mathrm{sum}\) -and \(\mathrm{NMI}_\mathrm{sum}\) in [4].

-

normalized_accuracy is defined as -\((\mathrm{Accuracy}(C_\sigma)-1/L)/(1-1/L)\), -where \(C_\sigma\) is a version of the confusion matrix -for given x and y, \(K \leq L\), with columns permuted -based on the solution to the Maximal Linear Sum Assignment Problem. -\(\mathrm{Accuracy}(C_\sigma)\) is sometimes referred to as Purity, -e.g., in [2].

-

pair_sets_index gives the Pair Sets Index (PSI) -adjusted for chance [3], \(K \leq L\). -Pairing is based on the solution to the Linear Sum Assignment Problem -of a transformed version of the confusion matrix.

+and \(\mathrm{NMI}_\mathrm{sum}\) in [4].

References

-
1(1,2)
+
1(1,2)

Hubert L., Arabie P., Comparing Partitions, Journal of Classification 2(1), 1985, 193-218.

-
2
-

Rendon E., Abundez I., Arizmendi A., Quiroz E.M., -Internal versus external cluster validation indexes, -International Journal of Computers and Communications 5(1), 2011, -27-34.

+
2
+

Gagolewski M., Adjusted asymmetric accuracy: A well-behaving external +cluster validity measure, 2022, submitted for publication.

-
3
+
3(1,2)

Rezaei M., Franti P., Set matching measures for external cluster validity, IEEE Transactions on Knowledge and Data Mining 28(8), 2016, -2173-2186. doi:10.1109/TKDE.2016.2551240.

+2173-2186. https://doi.org/10.1109/TKDE.2016.2551240.

-
4
+
4

Vinh N.X., Epps J., Bailey J., Information theoretic measures for clusterings comparison: Variants, properties, normalization and correction for chance, Journal of Machine Learning Research 11, 2010, 2837-2854.

+
5
+

Gagolewski M., A Framework for Benchmarking Clustering Algorithms, +https://clustering-benchmarks.gagolewski.com

+

Examples

>>> x = np.r_[1, 1, 2, 1, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 2, 1, 2]
@@ -419,12 +558,12 @@
        [ 8,  2]])
 >>> {k : round(v, 2) for k, v in
 ...      genieclust.compare_partitions.compare_partitions(C).items()}
-{'ar': 0.49, 'r': 0.74, 'fm': 0.73, 'afm': 0.49, 'mi': 0.29, 'nmi': 0.41, 'ami': 0.39, 'nacc': 0.71, 'psi': 0.65}
+{'ar': 0.49, 'r': 0.74, 'fm': 0.73, 'afm': 0.49, 'mi': 0.29, 'nmi': 0.41, 'ami': 0.39, 'nacc': 0.71, 'psi': 0.65, 'spsi': 0.63, 'aaa': 0.71}
 >>> {k : round(v, 2) for k, v in
 ...      genieclust.compare_partitions.compare_partitions2(x,y).items()}
-{'ar': 0.49, 'r': 0.74, 'fm': 0.73, 'afm': 0.49, 'mi': 0.29, 'nmi': 0.41, 'ami': 0.39, 'nacc': 0.71, 'psi': 0.65}
->>> round(genieclust.compare_partitions.adjusted_rand_score(x, y), 2)
-0.49
+{'ar': 0.49, 'r': 0.74, 'fm': 0.73, 'afm': 0.49, 'mi': 0.29, 'nmi': 0.41, 'ami': 0.39, 'nacc': 0.71, 'psi': 0.65, 'spsi': 0.63, 'aaa': 0.71}
+>>> round(genieclust.compare_partitions.adjusted_asymmetric_accuracy(x, y), 2)
+0.71
 
@@ -455,11 +594,13 @@
genieclust.compare_partitions.confusion_matrix

Determines the contingency table

+
genieclust.compare_partitions.normalized_confusion_matrix

Determines the confusion matrix and permutes the rows and columns so that the sum of the elements of the main diagonal is the largest possible

+

Notes

-

Calls genieclust.compare_partitions.compare_partitions(C), -where C = genieclust.compare_partitions.confusion_matrix(x, y).

+

Calls compare_partitions() on the result of +returned by confusion_matrix().

@@ -485,7 +626,7 @@

See also

-
genieclust.compare_partitions.normalize_confusion_matrix

Applies pivoting

+
genieclust.compare_partitions.normalize_confusion_matrix

Permutes the rows and columns of a confusion matrix so that the sum of the elements of the main diagonal is the largest possible

@@ -530,7 +671,7 @@

Notes

-

See genieclust.compare_partitions.compare_partitions for more details.

+

See compare_partitions() for more details.

@@ -562,17 +703,21 @@

Notes

-

See genieclust.compare_partitions.compare_partitions for more details.

+

See compare_partitions() for more details.

genieclust.compare_partitions.normalize_confusion_matrix(C)
-

Applies pivoting to a given confusion matrix

+

Permutes the rows and columns of a confusion matrix +so that the sum of the elements +on the main diagonal is the largest possible (by solving +the maximal assignment problem)

Parameters
-
Cndarray

A c_contiguous confusion matrix (contingency table).

+
Cndarray

A confusion matrix (contingency table), +whose row count is not greater than the column count

@@ -588,13 +733,15 @@
genieclust.compare_partitions.confusion_matrix

Determines the confusion matrix

+
genieclust.compare_partitions.normalized_confusion_matrix

Determines the confusion matrix and permutes the rows and columns so that the sum of the elements of the main diagonal is the largest possible

+
+
genieclust.compare_partitions.normalizing_permutation

The underlying function to determine the ordering permutation of the columns

+

Notes

-

This function permutes the columns of C so as to relocate the largest -elements in each row onto the main diagonal.

-

It may come in handy whenever C summarises the results generated -by clustering algorithms, where actual label values do not matter +

This function comes in handy when C summarises the results generated +by clustering algorithms, where the actual label values do not matter (e.g., (1, 2, 0) can be remapped to (0, 2, 1) with no change in meaning).

Examples

>>> x = np.r_[1, 2, 1, 2, 2, 2, 3, 1, 2, 1, 2, 1, 2, 2]
@@ -614,9 +761,8 @@
 
 
-genieclust.compare_partitions.normalized_accuracy()
-

genieclust.compare_partitions.normalized accuracy(x, y)

-

Normalised accuracy

+genieclust.compare_partitions.normalized_accuracy(x, y) +

Normalised accuracy

Parameters
@@ -639,21 +785,28 @@
genieclust.compare_partitions.compare_partitions2

Computes multiple similarity scores based on two label vectors

+
genieclust.compare_partitions.normalized_confusion_matrix

Determines the confusion matrix and permutes the rows and columns so that the sum of the elements of the main diagonal is the largest possible

+

Notes

-

See genieclust.compare_partitions.compare_partitions for more details.

+

See compare_partitions() for more details.

genieclust.compare_partitions.normalized_confusion_matrix(x, y)
-

Computes the confusion matrix for two label vectors and applies pivoting

+

Computes the confusion matrix for two label vectors and +permutes its rows and columns so that the sum of the elements +of the main diagonal is the largest possible (by solving +the maximal assignment problem)

Parameters
x, yarray_like

Two vectors of “small” integers of identical lengths.

+
use_sumbool

Whether the pivoting should be based on

+
Returns
@@ -668,7 +821,7 @@

See also

-
genieclust.compare_partitions.normalize_confusion_matrix

Applies pivoting

+
genieclust.compare_partitions.normalizing_permutation

The underlying function to determine the ordering permutation of the columns

genieclust.compare_partitions.confusion_matrix

Determines the confusion matrix

@@ -714,7 +867,60 @@

Notes

-

See genieclust.compare_partitions.compare_partitions for more details.

+

See compare_partitions() for more details.

+
+ +
+
+genieclust.compare_partitions.normalizing_permutation(C)
+

Determines the permutation of columns of a confusion matrix +so that the sum of the elements on the main diagonal is the largest +possible (by solving the maximal assignment problem)

+
+
Parameters
+
+
Cndarray

A confusion matrix (contingency table), +whose row count is not greater than the column count

+
+
+
+
Returns
+
+
ndarray

A vector of indexes

+
+
+
+
+
+

See also

+
+
genieclust.compare_partitions.confusion_matrix

Determines the confusion matrix

+
+
genieclust.compare_partitions.normalized_confusion_matrix

Determines the confusion matrix and permutes the rows and columns so that the sum of the elements of the main diagonal is the largest possible

+
+
+
+

Notes

+

This function comes in handy when C summarises the results generated +by clustering algorithms, where the actual label values do not matter +(e.g., (1, 2, 0) can be remapped to (0, 2, 1) with no change in meaning).

+

Examples

+
>>> x = np.r_[1, 2, 1, 2, 2, 2, 3, 1, 2, 1, 2, 1, 2, 2]
+>>> y = np.r_[3, 3, 3, 3, 2, 2, 3, 1, 2, 3, 2, 3, 2, 2]
+>>> C = genieclust.compare_partitions.confusion_matrix(x, y)
+>>> C
+array([[1, 0, 4],
+       [0, 6, 2],
+       [0, 0, 1]])
+>>> I = genieclust.compare_partitions.normalizing_permutation(C)
+>>> I
+array([2, 1, 0])
+>>> C[:, I]
+array([[4, 0, 1],
+       [2, 6, 0],
+       [1, 0, 0]])
+
+
@@ -727,6 +933,9 @@
x, yarray_like

Two vectors of “small” integers of identical lengths, representing two partitions of the same set.

+
simplifiedbool

Whether to assume E=1 in the definition of the index, +i.e., use Eq. (20) instead of (18); see [1].

+
Returns
@@ -743,10 +952,20 @@
genieclust.compare_partitions.compare_partitions2

Computes multiple similarity scores based on two label vectors

+
genieclust.compare_partitions.normalized_confusion_matrix

Determines the confusion matrix and permutes the rows and columns so that the sum of the elements of the main diagonal is the largest possible

+

Notes

-

See genieclust.compare_partitions.compare_partitions for more details.

+

See compare_partitions() for more details.

+

References

+
+
1
+

Rezaei M., Franti P., Set matching measures for external cluster validity, +IEEE Transactions on Knowledge and Data Mining 28(8), 2016, +2173-2186. https://doi.org/10.1109/TKDE.2016.2551240.

+
+
@@ -778,7 +997,7 @@

Notes

-

See genieclust.compare_partitions.compare_partitions for more details.

+

See compare_partitions() for more details.

@@ -787,23 +1006,31 @@ -
@@ -818,12 +1045,7 @@ jQuery(function () { SphinxRtdTheme.Navigation.enable(true); }); - - - - - - + \ No newline at end of file diff --git a/docs/genieclust_genie.html b/docs/genieclust_genie.html index 58d3bc1d..e6d94c38 100644 --- a/docs/genieclust_genie.html +++ b/docs/genieclust_genie.html @@ -2,13 +2,20 @@ + + - genieclust.Genie — genieclust + genieclust.Genie — Python and R Package genieclust + + + + + @@ -49,7 +56,7 @@ - + @@ -64,25 +71,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
@@ -575,23 +632,31 @@

genieclust.Genie +
+
-

© Copyright 2018–2022, Marek Gagolewski. - Last updated on 2022-08-09T17:56:16+1000. -

-
+

+ Copyright © 2018–2022 by Marek Gagolewski. Some rights reserved. Licensed under CC BY-NC-ND 4.0. - Built with Sphinx using a - theme - provided by Read the Docs. - + Built with Sphinx + and a customised rtd + theme. + + Last updated on 2022-09-05T12:45:35+1000. + + + + This site will never display any ads: it is a non-profit project. + It does not collect any data. + +

+

@@ -606,12 +671,7 @@

genieclust.Genie + + - genieclust.inequity — genieclust + genieclust.inequity — Python and R Package genieclust + + + + + @@ -64,25 +71,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
@@ -411,23 +468,31 @@
-
@@ -442,12 +507,7 @@ jQuery(function () { SphinxRtdTheme.Navigation.enable(true); }); - - - - - - + \ No newline at end of file diff --git a/docs/genieclust_internal.html b/docs/genieclust_internal.html index 8569a4c9..bc2c76e5 100644 --- a/docs/genieclust_internal.html +++ b/docs/genieclust_internal.html @@ -2,13 +2,20 @@ + + - genieclust.internal — genieclust + genieclust.internal — Python and R Package genieclust + + + + + @@ -64,25 +71,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
@@ -505,23 +562,31 @@
-
@@ -536,12 +601,7 @@ jQuery(function () { SphinxRtdTheme.Navigation.enable(true); }); - - - - - - + \ No newline at end of file diff --git a/docs/genieclust_plots-1.pdf b/docs/genieclust_plots-1.pdf index e0b709de..37782fe9 100644 Binary files a/docs/genieclust_plots-1.pdf and b/docs/genieclust_plots-1.pdf differ diff --git a/docs/genieclust_plots-2.pdf b/docs/genieclust_plots-2.pdf index 3c455295..8cc4d958 100644 Binary files a/docs/genieclust_plots-2.pdf and b/docs/genieclust_plots-2.pdf differ diff --git a/docs/genieclust_plots-3.pdf b/docs/genieclust_plots-3.pdf index f714aef7..b892058a 100644 Binary files a/docs/genieclust_plots-3.pdf and b/docs/genieclust_plots-3.pdf differ diff --git a/docs/genieclust_plots-4.pdf b/docs/genieclust_plots-4.pdf index ce7b5e88..bd949e3e 100644 Binary files a/docs/genieclust_plots-4.pdf and b/docs/genieclust_plots-4.pdf differ diff --git a/docs/genieclust_plots.html b/docs/genieclust_plots.html index ad343abe..be9d9898 100644 --- a/docs/genieclust_plots.html +++ b/docs/genieclust_plots.html @@ -2,13 +2,20 @@ + + - genieclust.plots — genieclust + genieclust.plots — Python and R Package genieclust + + + + + @@ -62,25 +69,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
@@ -186,7 +243,7 @@

Various plotting functions

-genieclust.plots.plot_scatter(X, y=None, labels=None, **kwargs)
+genieclust.plots.plot_scatter(X, y=None, labels=None, axis=None, title=None, xlabel=None, ylabel=None, xlim=None, ylim=None, **kwargs)

Draws a scatter plot

Parameters
@@ -200,6 +257,9 @@
labelsNone or array_like

A vector of n integer labels that correspond to each point in X, that gives its plot style.

+
axis, title, xlabel, ylabel, xlim, ylimNone or object

If not None, values passed to matplotlib.pyplot.axis, +matplotlib.pyplot.title, etc.

+
**kwargsCollection properties

Further arguments to matplotlib.pyplot.scatter.

@@ -319,23 +379,31 @@
-
@@ -350,12 +418,7 @@ jQuery(function () { SphinxRtdTheme.Navigation.enable(true); }); - - - - - - + \ No newline at end of file diff --git a/docs/genieclust_tools.html b/docs/genieclust_tools.html index d6252abf..09beb727 100644 --- a/docs/genieclust_tools.html +++ b/docs/genieclust_tools.html @@ -2,13 +2,20 @@ + + - genieclust.tools — genieclust + genieclust.tools — Python and R Package genieclust + + + + + @@ -64,25 +71,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
@@ -185,7 +242,7 @@

genieclust.tools

-

Functions a person might find useful, but not necessarily

+

Functions one might find useful, but not necessarily

genieclust.tools.argkmin(x, k)
@@ -300,10 +357,6 @@
genieclust.tools.cummin

Cumulative minimum

-
numpy.cumsum

Cumulative sum

-
-
numpy.cumprod

Cumulative product

-

Examples

@@ -338,10 +391,6 @@
genieclust.tools.cummax

Cumulative maximum

-
numpy.cumsum

Cumulative sum

-
-
numpy.cumprod

Cumulative product

-

Examples

@@ -357,23 +406,31 @@ -
@@ -388,12 +445,7 @@ jQuery(function () { SphinxRtdTheme.Navigation.enable(true); }); - - - - - - + \ No newline at end of file diff --git a/docs/genindex.html b/docs/genindex.html index 8c976662..557f6b1e 100644 --- a/docs/genindex.html +++ b/docs/genindex.html @@ -2,12 +2,19 @@ + + - Index — genieclust + Index — Python and R Package genieclust + + + + + @@ -59,25 +66,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
- +
@@ -98,6 +111,10 @@

Examples and Tutorials

    @@ -117,11 +134,7 @@

See Also

Appendix

@@ -154,13 +167,49 @@ @@ -332,12 +426,7 @@

Examples + + - emst_mlpack: Euclidean Minimum Spanning Tree — genieclust + emst_mlpack: Euclidean Minimum Spanning Tree — Python and R Package genieclust + + + + + @@ -47,8 +54,8 @@ - - + + @@ -62,25 +69,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
- +
@@ -101,6 +114,10 @@

Examples and Tutorials

+ + + +
@@ -236,8 +293,8 @@

Author(s)

References

-

March W.B., Ram P., Gray A.G., Fast Euclidean Minimum Spanning Tree: Algorithm, Analysis, and Applications, Proc. ACM SIGKDD’10 (2010) 603-611, https://mlpack.org/papers/emst.pdf.

-

Curtin R.R., Edel M., Lozhnikov M., Mentekidis Y., Ghaisas S., Zhang S., mlpack 3: A fast, flexible machine learning library, Journal of Open Source Software 3(26), 726, 2018.

+

March W.B., Ram P., Gray A.G., Fast Euclidean Minimum Spanning Tree: Algorithm, Analysis, and Applications, Proc. ACM SIGKDD’10, 2010, 603-611, https://mlpack.org/papers/emst.pdf.

+

Curtin R.R., Edel M., Lozhnikov M., Mentekidis Y., Ghaisas S., Zhang S., mlpack 3: A fast, flexible machine learning library, Journal of Open Source Software 3(26), 2018, 726.

See Also

@@ -250,23 +307,31 @@

See Also - - +
+
-

© Copyright 2018–2022, Marek Gagolewski. - Last updated on 2022-08-09T17:56:16+1000. -

-
+

+ Copyright © 2018–2022 by Marek Gagolewski. Some rights reserved. Licensed under CC BY-NC-ND 4.0. - Built with Sphinx using a - theme - provided by Read the Docs. - + Built with Sphinx + and a customised rtd + theme. + + Last updated on 2022-09-05T12:45:35+1000. + + + + This site will never display any ads: it is a non-profit project. + It does not collect any data. + +

+

@@ -281,12 +346,7 @@

See Also + + - gclust: The Genie++ Hierarchical Clustering Algorithm — genieclust + gclust: Hierarchical Clustering Algorithm Genie — Python and R Package genieclust + + + + + @@ -49,7 +56,7 @@ - + @@ -64,25 +71,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
- +
@@ -103,6 +116,10 @@

Examples and Tutorials

-
-

gclust: The Genie++ Hierarchical Clustering Algorithm

+
+

gclust: Hierarchical Clustering Algorithm Genie

Description

-

A reimplementation of Genie - a robust and outlier resistant clustering algorithm (see Gagolewski, Bartoszuk, Cena, 2016). The Genie algorithm is based on a minimum spanning tree (MST) of the pairwise distance graph of a given point set. Just like single linkage, it consumes the edges of the MST in increasing order of weights. However, it prevents the formation of clusters of highly imbalanced sizes; once the Gini index (see gini_index()) of the cluster size distribution raises above gini_threshold, a forced merge of a point group of the smallest size is performed. Its appealing simplicity goes hand in hand with its usability; Genie often outperforms other clustering approaches on benchmark data, such as https://github.com/gagolews/clustering_benchmarks_v1.

+

A reimplementation of Genie - a robust and outlier resistant clustering algorithm (see Gagolewski, Bartoszuk, Cena, 2016). The Genie algorithm is based on a minimum spanning tree (MST) of the pairwise distance graph of a given point set. Just like the single linkage, it consumes the edges of the MST in an increasing order of weights. However, it prevents the formation of clusters of highly imbalanced sizes; once the Gini index (see gini_index()) of the cluster size distribution raises above gini_threshold, a forced merge of a point group of the smallest size is performed. Its appealing simplicity goes hand in hand with its usability; Genie often outperforms other clustering approaches on benchmark data, such as https://github.com/gagolews/clustering-benchmarks.

The clustering can now also be computed with respect to the mutual reachability distance (based, e.g., on the Euclidean metric), which is used in the definition of the HDBSCAN* algorithm (see Campello et al., 2015). If M > 1, then the mutual reachability distance \(m(i,j)\) with smoothing factor M is used instead of the chosen “raw” distance \(d(i,j)\). It holds \(m(i,j)=\max(d(i,j), c(i), c(j))\), where \(c(i)\) is \(d(i,k)\) with \(k\) being the (M-1)-th nearest neighbour of \(i\). This makes “noise” and “boundary” points being “pulled away” from each other.

The Genie correction together with the smoothing factor M > 1 (note that M = 2 corresponds to the original distance) gives a robustified version of the HDBSCAN* algorithm that is able to detect a predefined number of clusters. Hence it does not dependent on the DBSCAN’s somewhat magical eps parameter or the HDBSCAN’s min_cluster_size one.

@@ -307,7 +364,7 @@

Arguments

Details

-

Note that as in the case of all the distance-based methods, the standardisation of the input features is definitely worth giving a try.

+

Note that, as in the case of all the distance-based methods, the standardisation of the input features is definitely worth giving a try.

If d is a numeric matrix or an object of class dist, mst() will be called to compute an MST, which generally takes at most \(O(n^2)\) time (the algorithm we provide is parallelised, environment variable OMP_NUM_THREADS controls the number of threads in use). However, see emst_mlpack() for a very fast alternative in the case of Euclidean spaces of (very) low dimensionality and M = 1.

Given an minimum spanning tree, the algorithm runs in \(O(n \sqrt{n})\) time. Therefore, if you want to test different gini_thresholds, (or ks), it is best to explicitly compute the MST first.

According to the algorithm’s original definition, the resulting partition tree (dendrogram) might violate the ultrametricity property (merges might occur at levels that are not increasing w.r.t. a between-cluster distance). Departures from ultrametricity are corrected by applying height = rev(cummin(rev(height))).

@@ -361,23 +418,31 @@

Examples +
+
-

© Copyright 2018–2022, Marek Gagolewski. - Last updated on 2022-08-09T17:56:16+1000. -

-
+

+ Copyright © 2018–2022 by Marek Gagolewski. Some rights reserved. Licensed under CC BY-NC-ND 4.0. - Built with Sphinx using a - theme - provided by Read the Docs. - + Built with Sphinx + and a customised rtd + theme. + + Last updated on 2022-09-05T12:45:35+1000. + + + + This site will never display any ads: it is a non-profit project. + It does not collect any data. + +

+

@@ -392,12 +457,7 @@

Examples + + - genieclust-package: The Genie++ Hierarchical Clustering Algorithm (with Extras) — genieclust + genieclust-package: The Genie Hierarchical Clustering Algorithm (with Extras) — Python and R Package genieclust + + + + + @@ -48,7 +55,7 @@ - + @@ -62,25 +69,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
- +
@@ -101,6 +114,10 @@

Examples and Tutorials

-

genieclust-package: The Genie++ Hierarchical Clustering Algorithm (with Extras)

+

genieclust-package: The Genie Hierarchical Clustering Algorithm (with Extras)

Description

See genie() for more details.

@@ -207,23 +264,31 @@

See Also - +
+
-

© Copyright 2018–2022, Marek Gagolewski. - Last updated on 2022-08-09T17:56:16+1000. -

-
+

+ Copyright © 2018–2022 by Marek Gagolewski. Some rights reserved. Licensed under CC BY-NC-ND 4.0. - Built with Sphinx using a - theme - provided by Read the Docs. - + Built with Sphinx + and a customised rtd + theme. + + Last updated on 2022-09-05T12:45:35+1000. + + + + This site will never display any ads: it is a non-profit project. + It does not collect any data. + +

+

@@ -238,12 +303,7 @@

See Also + + - inequity: Inequity (Inequality) Measures — genieclust + inequity: Inequity (Inequality) Measures — Python and R Package genieclust + + + + + @@ -50,7 +57,7 @@ - + @@ -64,25 +71,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
- +
@@ -103,6 +116,10 @@

Examples and Tutorials

@@ -267,9 +324,9 @@

Author(s)

References

-

Bonferroni C., Elementi di Statistica Generale, Libreria Seber, Firenze, 1930.

-

Gagolewski M., Bartoszuk M., Cena A., Genie: A new, fast, and outlier-resistant hierarchical clustering algorithm, Information Sciences 363, 2016, pp. 8-23. doi:10.1016/j.ins.2016.05.003

-

Gini C., Variabilita e Mutabilita, Tipografia di Paolo Cuppini, Bologna, 1912.

+

Bonferroni C., Elementi di Statistica Generale, Libreria Seber, Firenze, 1930.

+

Gagolewski M., Bartoszuk M., Cena A., Genie: A new, fast, and outlier-resistant hierarchical clustering algorithm, Information Sciences 363, 2016, pp. 8-23. doi:10.1016/j.ins.2016.05.003

+

Gini C., Variabilita e Mutabilita, Tipografia di Paolo Cuppini, Bologna, 1912.

See Also

@@ -278,13 +335,13 @@

See Also

Examples

-
gini_index(c(2, 2, 2, 2, 2))  # no inequality
+
gini_index(c(2, 2, 2, 2, 2))   # no inequality
 ## [1] 0
-gini_index(c(0, 0, 10, 0, 0)) # one has it all
+gini_index(c(0, 0, 10, 0, 0))  # one has it all
 ## [1] 1
-gini_index(c(7, 0, 3, 0, 0))  # give to the poor, take away from the rich
+gini_index(c(7, 0, 3, 0, 0))   # give to the poor, take away from the rich
 ## [1] 0.85
-gini_index(c(6, 0, 3, 1, 0))  # (a.k.a. Pigou-Dalton principle)
+gini_index(c(6, 0, 3, 1, 0))   # (a.k.a. Pigou-Dalton principle)
 ## [1] 0.75
 bonferroni_index(c(2, 2, 2, 2, 2))
 ## [1] 0
@@ -311,23 +368,31 @@ 

Examples - +
+
-

© Copyright 2018–2022, Marek Gagolewski. - Last updated on 2022-08-09T17:56:16+1000. -

-
+

+ Copyright © 2018–2022 by Marek Gagolewski. Some rights reserved. Licensed under CC BY-NC-ND 4.0. - Built with Sphinx using a - theme - provided by Read the Docs. - + Built with Sphinx + and a customised rtd + theme. + + Last updated on 2022-09-05T12:45:35+1000. + + + + This site will never display any ads: it is a non-profit project. + It does not collect any data. + +

+

@@ -342,12 +407,7 @@

Examples + + - mst: Minimum Spanning Tree of the Pairwise Distance Graph — genieclust + mst: Minimum Spanning Tree of the Pairwise Distance Graph — Python and R Package genieclust + + + + + @@ -64,25 +71,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
- +
@@ -103,6 +116,10 @@

Examples and Tutorials

@@ -230,22 +287,22 @@

Arguments

d

-

either a numeric matrix (or an object coercible to one, e.g., a data frame with numeric-like columns) or an object of class dist, see dist.

+

either a numeric matrix (or an object coercible to one, e.g., a data frame with numeric-like columns) or an object of class dist, see dist

...

-

further arguments passed to or from other methods.

+

further arguments passed to or from other methods

distance

-

metric used to compute the linkage, one of: "euclidean" (synonym: "l2"), "manhattan" (a.k.a. "l1" and "cityblock"), "cosine".

+

metric used to compute the linkage, one of: "euclidean" (synonym: "l2"), "manhattan" (a.k.a. "l1" and "cityblock"), "cosine"

M

-

smoothing factor; M = 1 gives the selected distance; otherwise, the mutual reachability distance is used.

+

smoothing factor; M = 1 gives the selected distance; otherwise, the mutual reachability distance is used

cast_float32

-

logical; whether to compute the distances using 32-bit instead of 64-bit precision floating-point arithmetic (up to 2x faster).

+

logical; whether to compute the distances using 32-bit instead of 64-bit precision floating-point arithmetic (up to 2x faster)

verbose

-

logical; whether to print diagnostic messages and progress information.

+

logical; whether to print diagnostic messages and progress information

@@ -270,10 +327,10 @@

Author(s)

References

-

V. Jarnik, O jistem problemu minimalnim, Prace Moravske Prirodovedecke Spolecnosti 6 (1930) 57-63.

-

Olson C.F., Parallel algorithms for hierarchical clustering, Parallel Comput. 21 (1995) 1313-1325.

-

Prim R., Shortest connection networks and some generalisations, Bell Syst. Tech. J. 36 (1957) 1389-1401.

-

Campello R., Moulavi D., Zimek A., Sander J., Hierarchical density estimates for data clustering, visualization, and outlier detection, ACM Transactions on Knowledge Discovery from Data 10(1) (2015) 5:1-5:51.

+

Jarnik V., O jistem problemu minimalnim, Prace Moravske Prirodovedecke Spolecnosti 6, 1930, 57-63.

+

Olson C.F., Parallel algorithms for hierarchical clustering, Parallel Comput. 21, 1995, 1313-1325.

+

Prim R., Shortest connection networks and some generalisations, Bell Syst. Tech. J. 36, 1957, 1389-1401.

+

Campello R., Moulavi D., Zimek A., Sander J., Hierarchical density estimates for data clustering, visualization, and outlier detection, ACM Transactions on Knowledge Discovery from Data 10(1), 2015, 5:1-5:51.

See Also

@@ -296,23 +353,31 @@

Examples - +
+
-

© Copyright 2018–2022, Marek Gagolewski. - Last updated on 2022-08-09T17:56:16+1000. -

-
+

+ Copyright © 2018–2022 by Marek Gagolewski. Some rights reserved. Licensed under CC BY-NC-ND 4.0. - Built with Sphinx using a - theme - provided by Read the Docs. - + Built with Sphinx + and a customised rtd + theme. + + Last updated on 2022-09-05T12:45:35+1000. + + + + This site will never display any ads: it is a non-profit project. + It does not collect any data. + +

+

@@ -327,12 +392,7 @@

Examples + + - Search — genieclust + Search — Python and R Package genieclust + + + + + @@ -62,25 +69,31 @@ - genieclust + genieclust +
+ Python and R Package
v1.1.0 +
+ +
- +
@@ -101,6 +114,10 @@

Examples and Tutorials

    @@ -120,11 +137,7 @@

See Also

Appendix

@@ -157,13 +170,49 @@