diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7a939af0f..5c419542e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,3 @@ ## Contributing to distr6 -Please refer to [our wiki](https://github.com/alan-turing-institute/distr6/wiki/distr6-Wiki) for details on how to contribute to distr6 as well as the extension guidelines and appendices in [our website](https://alan-turing-institute.github.io/distr6/index.html). +Please refer to [our wiki](https://github.com/xoopr/distr6/wiki/distr6-Wiki) for details on how to contribute to distr6 as well as the extension guidelines and appendices in [our website](https://xoopr.github.io/distr6/index.html). diff --git a/DESCRIPTION b/DESCRIPTION index 7409c91aa..c19528c73 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -87,9 +87,9 @@ Description: An R6 object oriented distributions package. Unified Normal distribution and Michael et al. (1976) for sampling the Wald distribution. License: MIT + file LICENSE -URL: https://alan-turing-institute.github.io/distr6/, - https://github.com/alan-turing-institute/distr6/ -BugReports: https://github.com/alan-turing-institute/distr6/issues +URL: https://xoopr.github.io/distr6/, + https://github.com/xoopr/distr6/ +BugReports: https://github.com/xoopr/distr6/issues Imports: checkmate, data.table, diff --git a/NEWS.md b/NEWS.md index db1befeb4..517b092df 100644 --- a/NEWS.md +++ b/NEWS.md @@ -399,12 +399,12 @@ # distr6 1.0.0 - v1 API is ready to be shipped to CRAN! -- Again [see here](https://alan-turing-institute.github.io/distr6/articles/webs/api_lifecycle.html) for the updated API lifecycle -- Tutorials, extension guidelines and other documentation (in appendices) are now on the [website](https://alan-turing-institute.github.io/distr6/index.html) +- Again [see here](https://xoopr.github.io/distr6/articles/webs/api_lifecycle.html) for the updated API lifecycle +- Tutorials, extension guidelines and other documentation (in appendices) are now on the [website](https://xoopr.github.io/distr6/index.html) - distr6 is a complete, unified, object-oriented interface to probability distributions in R. Complete with 36 probability distributions and another 11 kernels, distr6 also allows functionality for numerical imputation of methods and statistical functions. # distr6 0.1.0.9000 - Now public! -- distr6 API as whole is still very much experimental but analytic features are fairly stable, [see here](https://alan-turing-institute.github.io/distr6/articles/webs/api_lifecycle.html) for details on feature lifecycles -- Development continues to be internal, through UCL and The Alan Turing Institute, but we welcome external users to test the API and report bugs, see our [contributing guidelines](https://github.com/alan-turing-institute/distr6/blob/master/CONTRIBUTING.md) for details including our [code of conduct](https://github.com/alan-turing-institute/distr6/blob/master/CODE_OF_CONDUCT.md) +- distr6 API as whole is still very much experimental but analytic features are fairly stable, [see here](https://xoopr.github.io/distr6/articles/webs/api_lifecycle.html) for details on feature lifecycles +- Development continues to be internal, through UCL and The Alan Turing Institute, but we welcome external users to test the API and report bugs, see our [contributing guidelines](https://github.com/xoopr/distr6/blob/master/CONTRIBUTING.md) for details including our [code of conduct](https://github.com/xoopr/distr6/blob/master/CODE_OF_CONDUCT.md) diff --git a/R/distr6-package.R b/R/distr6-package.R index 92ba4d00e..fa1b4f4a6 100644 --- a/R/distr6-package.R +++ b/R/distr6-package.R @@ -24,6 +24,6 @@ #' #' And for more advanced usage see the complete tutorials at #' -#' \href{https://alan-turing-institute.github.io/distr6/index.html}{https://alan-turing-institute.github.io/distr6/index.html} #nolint +#' \href{https://xoopr.github.io/distr6/index.html}{https://xoopr.github.io/distr6/index.html} #nolint #' "_PACKAGE" diff --git a/man/distr6-package.Rd b/man/distr6-package.Rd index cb49ceae3..7e35c935f 100644 --- a/man/distr6-package.Rd +++ b/man/distr6-package.Rd @@ -31,14 +31,14 @@ To learn more about distr6, start with the distr6 vignette: And for more advanced usage see the complete tutorials at -\href{https://alan-turing-institute.github.io/distr6/index.html}{https://alan-turing-institute.github.io/distr6/index.html} #nolint +\href{https://xoopr.github.io/distr6/index.html}{https://xoopr.github.io/distr6/index.html} #nolint } \seealso{ Useful links: \itemize{ - \item \url{https://alan-turing-institute.github.io/distr6/} - \item \url{https://github.com/alan-turing-institute/distr6/} - \item Report bugs at \url{https://github.com/alan-turing-institute/distr6/issues} + \item \url{https://xoopr.github.io/distr6/} + \item \url{https://github.com/xoopr/distr6/} + \item Report bugs at \url{https://github.com/xoopr/distr6/issues} } } diff --git a/vignettes/distr6.rmd b/vignettes/distr6.rmd index ebe5a9180..bb084dee2 100644 --- a/vignettes/distr6.rmd +++ b/vignettes/distr6.rmd @@ -8,7 +8,7 @@ vignette: > \usepackage[utf8]{inputenc} --- -distr6 is a unified, self-contained and scalable interface to probability distributions in R. Making use of the R6 paradigm, distr6 implements a fully object-oriented (OO) interface complete with distribution construction, full inheritance and more complex design patterns. The API is built to be scalable and intuitive, ensuring that every distribution has the same interface and that more complex properties are abstracted from the core functionality. A full set of tutorials can be found [here](https://alan-turing-institute.github.io/distr6/index.html). In this introductory vignette we briefly demonstrate how to construct a distribution, view and edit its parameters and evaluate different in-built methods. The [website](https://alan-turing-institute.github.io/distr6/index.html) covers more complex use-cases including composite distributions and decorators for numeric methods. +distr6 is a unified, self-contained and scalable interface to probability distributions in R. Making use of the R6 paradigm, distr6 implements a fully object-oriented (OO) interface complete with distribution construction, full inheritance and more complex design patterns. The API is built to be scalable and intuitive, ensuring that every distribution has the same interface and that more complex properties are abstracted from the core functionality. A full set of tutorials can be found [here](https://xoopr.github.io/distr6/index.html). In this introductory vignette we briefly demonstrate how to construct a distribution, view and edit its parameters and evaluate different in-built methods. The [website](https://xoopr.github.io/distr6/index.html) covers more complex use-cases including composite distributions and decorators for numeric methods. ## Getting Started @@ -80,7 +80,7 @@ N$traits ``` ### d/p/q/r -distr6 is intended not to replace R stats distributions but to be a different way of interfacing +distr6 is intended not to replace R stats distributions but to be a different way of interfacing them. All distributions in R stats can be found in distr6 and all their d/p/q/r functions which refer to density/cumulative distribution/quantile/random are all available in distr6. Continuing our Normal distribution example: @@ -142,6 +142,6 @@ head(listDistributions(filter = list(VaLueSupport = "continuous", package = "ext ## Further Documentation - * [Tutorials](https://alan-turing-institute.github.io/distr6/articles/webs/intro_to_r6.html) - * [Extension guidelines](https://alan-turing-institute.github.io/distr6/articles/webs/preliminaries.html) - * [Project Wiki](https://github.com/alan-turing-institute/distr6/wiki) + * [Tutorials](https://xoopr.github.io/distr6/articles/webs/intro_to_r6.html) + * [Extension guidelines](https://xoopr.github.io/distr6/articles/webs/preliminaries.html) + * [Project Wiki](https://github.com/xoopr/distr6/wiki) diff --git a/vignettes/webs/analytic_and_numeric_methods.rmd b/vignettes/webs/analytic_and_numeric_methods.rmd index 42a17ef66..94c671d62 100644 --- a/vignettes/webs/analytic_and_numeric_methods.rmd +++ b/vignettes/webs/analytic_and_numeric_methods.rmd @@ -14,7 +14,7 @@ set.seed(42) knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` -This document is for understanding how and when distr6 uses analytical or numerical results. For a tutorial on how to use decorators, [see here](https://alan-turing-institute.github.io/distr6/articles/webs/decorators.html). +This document is for understanding how and when distr6 uses analytical or numerical results. For a tutorial on how to use decorators, [see here](https://xoopr.github.io/distr6/articles/webs/decorators.html). distr6 operates under a strict rule that implemented distributions, of class `SDistribution`, and similarly implemented kernels, of class `Kernel`, should only contain analytical methods. This ensures that all results are as precise as possible and ensure optimal efficiency. @@ -63,8 +63,4 @@ Finally, even if an analytical expression for `expectation` exists, the `CoreSta -See the [decorators tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/decorators.html) for details on how to decorate a Distribution. - - - - +See the [decorators tutorial](https://xoopr.github.io/distr6/articles/webs/decorators.html) for details on how to decorate a Distribution. diff --git a/vignettes/webs/api_lifecycle.rmd b/vignettes/webs/api_lifecycle.rmd index f81e8de63..de55488e3 100644 --- a/vignettes/webs/api_lifecycle.rmd +++ b/vignettes/webs/api_lifecycle.rmd @@ -13,21 +13,21 @@ distr6 v1 is now live and most of the API is stable however some aspects are sti 1. [Maturing](#maturing-classes-and-methods) - Functioning but the internal methodology needs tweaking, API is unlikely to change 2. [Stable](#maturing-classes-and-methods) - Functioning as expected and (hopefully) bug free -The lists below use the headings name from the [reference page](https://alan-turing-institute.github.io/distr6/reference/#section-univariate-discrete-distributions) of the website. +The lists below use the headings name from the [reference page](https://xoopr.github.io/distr6/reference/#section-univariate-discrete-distributions) of the website. ## Maturing Classes and Methods ![](https://img.shields.io/badge/lifecycle-maturing-blue.svg) -* [Convolution](https://alan-turing-institute.github.io/distr6/reference/#section-decorators) +* [Convolution](https://xoopr.github.io/distr6/reference/#section-decorators) ## Stable Classes and Methods ![](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg) -* [Distributions](https://alan-turing-institute.github.io/distr6/reference/#section-distributions) -* [Kernels](https://alan-turing-institute.github.io/distr6/reference/#section-kernels) -* [Mathematical and Statistical](https://alan-turing-institute.github.io/distr6/reference/#section-mathematical-and-statistical) -* [Distribution Accessors](https://alan-turing-institute.github.io/distr6/reference/#section-distribution-accessors) -* [Decorators](https://alan-turing-institute.github.io/distr6/reference/#section-decorators) -* [Wrappers, except Scale and Convolution](https://alan-turing-institute.github.io/distr6/reference/#section-decorators) -* [Univariate Discrete Distributions](https://alan-turing-institute.github.io/distr6/reference/#section-univariate-discrete-distributions) -* [Univariate Continuous Distributions](https://alan-turing-institute.github.io/distr6/reference/#section-univariate-continuous-distributions) -* [Multivariate Distributions](https://alan-turing-institute.github.io/distr6/reference/#section-multivariate-distributions) -* [Assertions](https://alan-turing-institute.github.io/distr6/reference/#section-assertions) -* [Helper Functions](https://alan-turing-institute.github.io/distr6/reference/#section-helper-functions) +* [Distributions](https://xoopr.github.io/distr6/reference/#section-distributions) +* [Kernels](https://xoopr.github.io/distr6/reference/#section-kernels) +* [Mathematical and Statistical](https://xoopr.github.io/distr6/reference/#section-mathematical-and-statistical) +* [Distribution Accessors](https://xoopr.github.io/distr6/reference/#section-distribution-accessors) +* [Decorators](https://xoopr.github.io/distr6/reference/#section-decorators) +* [Wrappers, except Scale and Convolution](https://xoopr.github.io/distr6/reference/#section-decorators) +* [Univariate Discrete Distributions](https://xoopr.github.io/distr6/reference/#section-univariate-discrete-distributions) +* [Univariate Continuous Distributions](https://xoopr.github.io/distr6/reference/#section-univariate-continuous-distributions) +* [Multivariate Distributions](https://xoopr.github.io/distr6/reference/#section-multivariate-distributions) +* [Assertions](https://xoopr.github.io/distr6/reference/#section-assertions) +* [Helper Functions](https://xoopr.github.io/distr6/reference/#section-helper-functions) diff --git a/vignettes/webs/constructing_a_distribution.rmd b/vignettes/webs/constructing_a_distribution.rmd index 570d0035a..d551b247a 100644 --- a/vignettes/webs/constructing_a_distribution.rmd +++ b/vignettes/webs/constructing_a_distribution.rmd @@ -60,4 +60,4 @@ Normal$new(mean = 2, var = 2, sd = 3, prec = 4) ## Summary -In this tutorial we looked at constructing a distribution with different parameterisations. In the [next tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/parameters.html) we look at getting and setting parameters and how this functions with your chosen parameterisation. +In this tutorial we looked at constructing a distribution with different parameterisations. In the [next tutorial](https://xoopr.github.io/distr6/articles/webs/parameters.html) we look at getting and setting parameters and how this functions with your chosen parameterisation. diff --git a/vignettes/webs/create_decorator.rmd b/vignettes/webs/create_decorator.rmd index 7c2c2d917..893fc2cf9 100644 --- a/vignettes/webs/create_decorator.rmd +++ b/vignettes/webs/create_decorator.rmd @@ -72,7 +72,7 @@ ExoticStatistics$set("public", "survival", function(x1, log.p = FALSE) { }) ``` -Note the use of `private$.isCdf`, this checks to see if the `cdf` method is defined in the `Distribution`. Remember that every `Distribution` object always have public d/p/q/r methods defined but do not necessarily have a private d/p/q/r method which actually does all the work. Therefore every `Distribution` includes flags for whether or not the d/p/q/r method is defined. To test this yourself, create a custom distribution object with a pdf only, and see what happens when you call the `cdf` method (it will return NULL). +Note the use of `private$.isCdf`, this checks to see if the `cdf` method is defined in the `Distribution`. Remember that every `Distribution` object always have public d/p/q/r methods defined but do not necessarily have a private d/p/q/r method which actually does all the work. Therefore every `Distribution` includes flags for whether or not the d/p/q/r method is defined. To test this yourself, create a custom distribution object with a pdf only, and see what happens when you call the `cdf` method (it will return NULL). Therefore the use of `private$.isCdf` tells the decorator whether it can use analytical results or if numeric integration is required. @@ -82,11 +82,11 @@ Note: if the user has already decorated their distribution with `FunctionImputat 1. Decorators are simple to implement, just define a new class inheriting from `DistributionDecorator` 2. Add as many public methods as you want, but remember to include messages for numerical integration -3. Make use of the private `.isCdf`, `.isPdf`, `.isQuantile`, `.isRand` methods to exploit analytical results. +3. Make use of the private `.isCdf`, `.isPdf`, `.isQuantile`, `.isRand` methods to exploit analytical results. ## Extension Guidelines -* [SDistribution](https://alan-turing-institute.github.io/distr6/articles/webs/create_sdistribution.html) -* [Kernel](https://alan-turing-institute.github.io/distr6/articles/webs/create_kernel.html) -* [Wrapper](https://alan-turing-institute.github.io/distr6/articles/webs/create_wrapper.html) +* [SDistribution](https://xoopr.github.io/distr6/articles/webs/create_sdistribution.html) +* [Kernel](https://xoopr.github.io/distr6/articles/webs/create_kernel.html) +* [Wrapper](https://xoopr.github.io/distr6/articles/webs/create_wrapper.html) diff --git a/vignettes/webs/create_kernel.rmd b/vignettes/webs/create_kernel.rmd index e9748b605..76cb0ca7e 100644 --- a/vignettes/webs/create_kernel.rmd +++ b/vignettes/webs/create_kernel.rmd @@ -17,7 +17,7 @@ knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ## Kernel Class Similarly to implemented probability distributions, implemented kernels all inherit from a single -class 'kernel', which in turn inherits from `Distribution` (see the [uml diagram](https://raw.githubusercontent.com/wiki/alan-turing-institute/distr6/images/uml.png)). But this is a much simpler class with reduced methods and many of these return the same result and are therefore defined in the `kernel` parent class. For every kernel the following is true +class 'kernel', which in turn inherits from `Distribution` (see the [uml diagram](https://raw.githubusercontent.com/wiki/xoopr/distr6/images/uml.png)). But this is a much simpler class with reduced methods and many of these return the same result and are therefore defined in the `kernel` parent class. For every kernel the following is true * `kernel$mean()` == 0 * `kernel$median()` == 0 @@ -124,6 +124,6 @@ Kernels are much simpler to extend than SDistributions. Just remember the follow ## Extension Guidelines -* [SDistribution](https://alan-turing-institute.github.io/distr6/articles/webs/create_sdistribution.html) -* [Wrapper](https://alan-turing-institute.github.io/distr6/articles/webs/create_wrapper.html) -* [Decorator](https://alan-turing-institute.github.io/distr6/articles/webs/create_decorator.html) +* [SDistribution](https://xoopr.github.io/distr6/articles/webs/create_sdistribution.html) +* [Wrapper](https://xoopr.github.io/distr6/articles/webs/create_wrapper.html) +* [Decorator](https://xoopr.github.io/distr6/articles/webs/create_decorator.html) diff --git a/vignettes/webs/create_sdistribution.rmd b/vignettes/webs/create_sdistribution.rmd index 4a8fe23a3..0e0d8060e 100644 --- a/vignettes/webs/create_sdistribution.rmd +++ b/vignettes/webs/create_sdistribution.rmd @@ -18,7 +18,7 @@ This tutorial assumes that you have a good knowledge of R6 and so we will not be ## SDistribution Class -All implemented probability distributions (excluding Kernels) in distr6 inherit from the `SDistribution` class. This means they share a common interface. The only differences between these distributions is that some will have methods missing as no analytic results are available. See the [uml diagram](https://raw.githubusercontent.com/wiki/alan-turing-institute/distr6/images/uml.png) for an overview of how this all fits in together. A core design principle in distr6 is that only analytical methods are defined in the SDistribution child classes, all numerical results are available through decorators. See the [decorators](https://alan-turing-institute.github.io/distr6/articles/webs/decorators.html) tutorial for more information on decorators and the [analytical and numerical](https://alan-turing-institute.github.io/distr6/articles/webs/analytic_and_numeric_methods.html) article for further discussions on analytical and numerical methods. The summary is that when creating your own SDistribution class, please do not put any numerical methods in the core interface, if a closed form expression cannot be found, omit the method entirely and it can be imputed with a decorator. If your desired method is not available in one of our decorators but you think it is useful, see the [creating a decorator](https://alan-turing-institute.github.io/distr6/articles/webs/create_decorator.html) extension guidelines. +All implemented probability distributions (excluding Kernels) in distr6 inherit from the `SDistribution` class. This means they share a common interface. The only differences between these distributions is that some will have methods missing as no analytic results are available. See the [uml diagram](https://raw.githubusercontent.com/wiki/xoopr/distr6/images/uml.png) for an overview of how this all fits in together. A core design principle in distr6 is that only analytical methods are defined in the SDistribution child classes, all numerical results are available through decorators. See the [decorators](https://xoopr.github.io/distr6/articles/webs/decorators.html) tutorial for more information on decorators and the [analytical and numerical](https://xoopr.github.io/distr6/articles/webs/analytic_and_numeric_methods.html) article for further discussions on analytical and numerical methods. The summary is that when creating your own SDistribution class, please do not put any numerical methods in the core interface, if a closed form expression cannot be found, omit the method entirely and it can be imputed with a decorator. If your desired method is not available in one of our decorators but you think it is useful, see the [creating a decorator](https://xoopr.github.io/distr6/articles/webs/create_decorator.html) extension guidelines. ## Creating an SDistribution @@ -77,7 +77,7 @@ Normal$set("public", "mgf", function(t){ Note: -1. Methods that require parameters use the `self` keyword and the `getParameterValue` method, we looked at this in the [custom distribution tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/custom_distributions.html) +1. Methods that require parameters use the `self` keyword and the `getParameterValue` method, we looked at this in the [custom distribution tutorial](https://xoopr.github.io/distr6/articles/webs/custom_distributions.html) 2. The arguments to the methods are not optional, they must have the names given in the `?SDistribution` help page, this ensures that the automated S3 dispatch methods run correctly ### The Constructor @@ -165,6 +165,6 @@ In a separate script called getParameterSet.R we have the generic and dispatch m ## Extension Guidelines - * [Kernel](https://alan-turing-institute.github.io/distr6/articles/webs/create_kernel.html) - * [Wrapper](https://alan-turing-institute.github.io/distr6/articles/webs/create_wrapper.html) - * [Decorator](https://alan-turing-institute.github.io/distr6/articles/webs/create_decorator.html) + * [Kernel](https://xoopr.github.io/distr6/articles/webs/create_kernel.html) + * [Wrapper](https://xoopr.github.io/distr6/articles/webs/create_wrapper.html) + * [Decorator](https://xoopr.github.io/distr6/articles/webs/create_decorator.html) diff --git a/vignettes/webs/create_wrapper.rmd b/vignettes/webs/create_wrapper.rmd index 3d48903e1..4543045be 100644 --- a/vignettes/webs/create_wrapper.rmd +++ b/vignettes/webs/create_wrapper.rmd @@ -16,7 +16,7 @@ knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ## DistributionWrapper Class -Wrappers may the hardest class to extend in distr6, simply due to the fact that there are no set rules for what can and can't go in a wrapper. Every implemented wrapper inherits from the `DistributionWrapper` class which in turn inherits from `Distribution` (see the [uml diagram](https://raw.githubusercontent.com/wiki/alan-turing-institute/distr6/images/uml.png)). The `DistributionWrapper` class introduces its own constructor, the `wrappedModels` method and overloads the `setParameterValue` method. We will briefly discuss why these three methods are important to all implemented methods. +Wrappers may the hardest class to extend in distr6, simply due to the fact that there are no set rules for what can and can't go in a wrapper. Every implemented wrapper inherits from the `DistributionWrapper` class which in turn inherits from `Distribution` (see the [uml diagram](https://raw.githubusercontent.com/wiki/xoopr/distr6/images/uml.png)). The `DistributionWrapper` class introduces its own constructor, the `wrappedModels` method and overloads the `setParameterValue` method. We will briefly discuss why these three methods are important to all implemented methods. ### The Constructor @@ -49,7 +49,7 @@ We saw above the use of `wrappedModels`, this is a simple accessor found in all ## Creating a Wrapper -Now we have a background of the `DistributionWrapper` class we can discuss actually creating a wrapper. As discussed in the [wrappers tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/wrappers.html), there are multiple types of wrappers, each will be implemented slightly differently. Therefore we're just going to look at one quick example from each example and point you to the source code for further examples. +Now we have a background of the `DistributionWrapper` class we can discuss actually creating a wrapper. As discussed in the [wrappers tutorial](https://xoopr.github.io/distr6/articles/webs/wrappers.html), there are multiple types of wrappers, each will be implemented slightly differently. Therefore we're just going to look at one quick example from each example and point you to the source code for further examples. ### TruncatedDistribution @@ -92,7 +92,7 @@ All wrappers should pass the following to the parent-class constructor: 3. distlist - The named list of distributions (even if just one) 4. description - Optional, updated description after wrapping -And then any other arguments that may be changed by wrapping, remember that any arguments passed to the `DistributionWrapper` constructor are in turn passed to the `Distribution` constructor, hence we can think of implemented wrappers as custom distributions. Read the [custom distribution tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/custom_distributions.rmd) for more information about the arguments passed to the `Distribution` constructor. +And then any other arguments that may be changed by wrapping, remember that any arguments passed to the `DistributionWrapper` constructor are in turn passed to the `Distribution` constructor, hence we can think of implemented wrappers as custom distributions. Read the [custom distribution tutorial](https://xoopr.github.io/distr6/articles/webs/custom_distributions.rmd) for more information about the arguments passed to the `Distribution` constructor. Notice also that the new `pdf` and `cdf` methods reference the original model using the `wrappedModels` method. This will generally be the case with all wrappers. @@ -130,7 +130,7 @@ MixtureDistribution$set("private",".weights",numeric(0)) Again this is a shortened version of the code. Note the following in the above -1. As multiple distributions are wrapped we first call `makeUniqueDistributions`, a helper function that ensures the IDs of the distributions are unique. This automatically clones all distributions passed to it to prevent the R6 copying problem ([see here](https://alan-turing-institute.github.io/distr6/articles/webs/intro_to_r6.html)). +1. As multiple distributions are wrapped we first call `makeUniqueDistributions`, a helper function that ensures the IDs of the distributions are unique. This automatically clones all distributions passed to it to prevent the R6 copying problem ([see here](https://xoopr.github.io/distr6/articles/webs/intro_to_r6.html)). 2. We add a private variable `.weights` which is accessed in the pdf/cdf. In general we allow additional private variables and methods to be added to wrappers, but not public ones. 3. The type and support are updated to account for multiple distributions. 4. All implemented wrappers inherit from `DistributionWrapper` and again `lock_objects = FALSE` @@ -143,6 +143,6 @@ Again this is a shortened version of the code. Note the following in the above ## Extension Guidelines -* [SDistribution](https://alan-turing-institute.github.io/distr6/articles/webs/create_sdistribution.html) -* [Kernel](https://alan-turing-institute.github.io/distr6/articles/webs/create_kernel.html) -* [Decorator](https://alan-turing-institute.github.io/distr6/articles/webs/create_decorator.html) +* [SDistribution](https://xoopr.github.io/distr6/articles/webs/create_sdistribution.html) +* [Kernel](https://xoopr.github.io/distr6/articles/webs/create_kernel.html) +* [Decorator](https://xoopr.github.io/distr6/articles/webs/create_decorator.html) diff --git a/vignettes/webs/custom_distributions.rmd b/vignettes/webs/custom_distributions.rmd index ae93e3803..b9f22cd72 100644 --- a/vignettes/webs/custom_distributions.rmd +++ b/vignettes/webs/custom_distributions.rmd @@ -14,7 +14,7 @@ set.seed(42) knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` -The [previous tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/wrappers.html) introduced wrappers in distr6. This final tutorial puts everything we've learnt together to create your own custom distribution object (this is not the same as creating a new class!). All distributions implemented in distr6 inherit from class `SDistribution` this tells you that they are the 'special distributions' that we have implemented. `SDistribution` is an 'abstract' class, this means it can't be constructed to make a `SDistribution` object, however the `Distribution` class can be. +The [previous tutorial](https://xoopr.github.io/distr6/articles/webs/wrappers.html) introduced wrappers in distr6. This final tutorial puts everything we've learnt together to create your own custom distribution object (this is not the same as creating a new class!). All distributions implemented in distr6 inherit from class `SDistribution` this tells you that they are the 'special distributions' that we have implemented. `SDistribution` is an 'abstract' class, this means it can't be constructed to make a `SDistribution` object, however the `Distribution` class can be. ## Constructing a Custom Distribution @@ -136,8 +136,8 @@ U$survivalPNorm(3, 2, 6) These tutorials have covered everything from the basics of constructing an implemented `SDistribution` right the way through, accessing and setting parameters, analysis distributions, manipulating them with decorators and wrappers, and finally adding your own custom distribution and using decorators to analyse it. Everything we have covered also applies to the Kernels in distr6, although these have less functionality, to see which are implemented run `listKernels()`. -The [Extension Guidelines](https://alan-turing-institute.github.io/distr6/articles/webs/preliminaries.html) explain how to implement your own SDistribution, Kernel, Decorator or Wrapper and the Appendices include discussions about OOP, R6, C vs. R implementation, the current API lifecycle and other design decisions. The [project wiki](https://github.com/alan-turing-institute/distr6/wiki) includes design documentation and contributor guidelines, please read these before making a pull request. +The [Extension Guidelines](https://xoopr.github.io/distr6/articles/webs/preliminaries.html) explain how to implement your own SDistribution, Kernel, Decorator or Wrapper and the Appendices include discussions about OOP, R6, C vs. R implementation, the current API lifecycle and other design decisions. The [project wiki](https://github.com/xoopr/distr6/wiki) includes design documentation and contributor guidelines, please read these before making a pull request. -We hope you find distr6 intuitive to use but if you have any questions or want to report a bug, please don't hesitate to [raise an issue](https://github.com/alan-turing-institute/distr6/issues). +We hope you find distr6 intuitive to use but if you have any questions or want to report a bug, please don't hesitate to [raise an issue](https://github.com/xoopr/distr6/issues). Good luck and happy coding! diff --git a/vignettes/webs/decorators.rmd b/vignettes/webs/decorators.rmd index 35fc5d2a1..38c8804bd 100644 --- a/vignettes/webs/decorators.rmd +++ b/vignettes/webs/decorators.rmd @@ -31,7 +31,7 @@ set.seed(42) knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` -The [previous tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/s3_piping.html) introduced S3 and piping into distr6, allowing different approaches to calling R6 methods. In this tutorial we take a look at a big feature of distr6, decorators. +The [previous tutorial](https://xoopr.github.io/distr6/articles/webs/s3_piping.html) introduced S3 and piping into distr6, allowing different approaches to calling R6 methods. In this tutorial we take a look at a big feature of distr6, decorators. Note: Decorators in distr6 are still maturing, this means the API is still subject to minor changes and the internal computations may be improved, therefore we are aware performance may be sub-optimal. @@ -91,7 +91,7 @@ N$pdfPNorm(2,0,4) ### FunctionImputation -The final implemented decorator is used to impute missing d/p/q/r methods. We will return to the `FunctionImputation` decorator in a [future tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/custom_distributions.html) which looks at constructing custom distributions. +The final implemented decorator is used to impute missing d/p/q/r methods. We will return to the `FunctionImputation` decorator in a [future tutorial](https://xoopr.github.io/distr6/articles/webs/custom_distributions.html) which looks at constructing custom distributions. ## How to Decorate @@ -113,6 +113,6 @@ And that's all there is to it! If you forget which decorators are available, jus ## Summary -In this tutorial we looked at decorators in distr6 to obtain numeric results, methods for statistical modelling and imputation methods for missing d/p/q/r functions. In the [next tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/wrappers.html) we look at the next big feature in distr6, wrappers. +In this tutorial we looked at decorators in distr6 to obtain numeric results, methods for statistical modelling and imputation methods for missing d/p/q/r functions. In the [next tutorial](https://xoopr.github.io/distr6/articles/webs/wrappers.html) we look at the next big feature in distr6, wrappers. ## References diff --git a/vignettes/webs/listing.rmd b/vignettes/webs/listing.rmd index 59b2f8e6a..ed0787d8b 100644 --- a/vignettes/webs/listing.rmd +++ b/vignettes/webs/listing.rmd @@ -14,7 +14,7 @@ set.seed(42) knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` -In the [previous tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/multivariates.html) we looked at multivariate distributions and how to use the d/p/q/r functions to evaluate multiple points of these. This tutorial concludes the 'Basic' set of tutorials with the use of 'listing' in distr6. +In the [previous tutorial](https://xoopr.github.io/distr6/articles/webs/multivariates.html) we looked at multivariate distributions and how to use the d/p/q/r functions to evaluate multiple points of these. This tutorial concludes the 'Basic' set of tutorials with the use of 'listing' in distr6. ## Listing @@ -51,4 +51,3 @@ head(listDistributions(filter = list(variateform = "multivariate", package = "ex ## Summary In this tutorial we looked at the `listDistributions()` function so that you don't have to remember which are implemented in distr6. In this set of tutorials we covered the basics of constructing a (univariate) distribution, getting and setting parameters, evaluating statistical results and extending all this to multivariate distributions. The next set of tutorials cover more advanced functionality including decorators for numeric results, wrappers for composite distributions, custom distributions, S3 functionality, and symbolic sets. - diff --git a/vignettes/webs/multivariates.rmd b/vignettes/webs/multivariates.rmd index 262e0ea2a..e48843a05 100644 --- a/vignettes/webs/multivariates.rmd +++ b/vignettes/webs/multivariates.rmd @@ -14,7 +14,7 @@ set.seed(42) knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` -In the [previous tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/properties_traits.html) we used variables and methods to find properties and traits of the Normal distribution. Before that we looked at statistical methods and construction of the Normal distribution. In this tutorial we look at multivariate distributions, which should feel similar to univariate distributions. +In the [previous tutorial](https://xoopr.github.io/distr6/articles/webs/properties_traits.html) we used variables and methods to find properties and traits of the Normal distribution. Before that we looked at statistical methods and construction of the Normal distribution. In this tutorial we look at multivariate distributions, which should feel similar to univariate distributions. ## Constructing a Multivariate Distribution @@ -53,6 +53,4 @@ Note: `cdf()` and `quantile()` are often omitted from multivariate distributions ## Summary -In this tutorial we looked at multivariate distributions and discussed the difference between distr6 and R stats in using the d/p/q/r functions. The [next tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/listing.html) concludes the 'Basic' set of tutorials with a look at listing in distr6 to help you navigate the package more easily. - - +In this tutorial we looked at multivariate distributions and discussed the difference between distr6 and R stats in using the d/p/q/r functions. The [next tutorial](https://xoopr.github.io/distr6/articles/webs/listing.html) concludes the 'Basic' set of tutorials with a look at listing in distr6 to help you navigate the package more easily. diff --git a/vignettes/webs/parameters.rmd b/vignettes/webs/parameters.rmd index 134e2342d..021b9402e 100644 --- a/vignettes/webs/parameters.rmd +++ b/vignettes/webs/parameters.rmd @@ -14,7 +14,7 @@ set.seed(42) knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` -In our [previous tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/constructing_a_distribution.html) we constructed a Normal distribution with a variety of parameterisations. Now we will look at how to access the parameters of the distribution and how to update them. Parameters are handled by [param6](https://cran.r-project.org/package=param6), full documentation can be found at the package [website](https://xoopr.github.io/param6/). +In our [previous tutorial](https://xoopr.github.io/distr6/articles/webs/constructing_a_distribution.html) we constructed a Normal distribution with a variety of parameterisations. Now we will look at how to access the parameters of the distribution and how to update them. Parameters are handled by [param6](https://cran.r-project.org/package=param6), full documentation can be found at the package [website](https://xoopr.github.io/param6/). ## Accessing Parameters @@ -72,4 +72,4 @@ N$parameters() ## Summary -In this tutorial we looked at getting and setting parameters for the Normal distribution. In the [next tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/statistical_methods.html) we look at accessing mathematical and statistical methods including the d/p/q/r functions. +In this tutorial we looked at getting and setting parameters for the Normal distribution. In the [next tutorial](https://xoopr.github.io/distr6/articles/webs/statistical_methods.html) we look at accessing mathematical and statistical methods including the d/p/q/r functions. diff --git a/vignettes/webs/preliminaries.rmd b/vignettes/webs/preliminaries.rmd index 5fa0c1c41..38d15033f 100644 --- a/vignettes/webs/preliminaries.rmd +++ b/vignettes/webs/preliminaries.rmd @@ -16,19 +16,19 @@ knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ## Here Be Dragons -When extending SDistributions, Kernels, Wrappers and Decorators, there are no formal checks on the quality or accuracy of your code. Whilst distr6 is modularised in such a way that a new class with a bug in it won't crash the rest of the package, it is still important that they can be interfaced properly with parent classes. The next few tutorials will go through how to extend the SDistribution, Kernel, Wrapper and Decorator classes but first please make sure you have gone through the preliminary checklist below. Of course, if you don't intend to make a pull-request to add your extension to the distr6 package, then feel free to go right on ahead and [start here](https://alan-turing-institute.github.io/distr6/articles/webs/create_sdistribution.html). +When extending SDistributions, Kernels, Wrappers and Decorators, there are no formal checks on the quality or accuracy of your code. Whilst distr6 is modularised in such a way that a new class with a bug in it won't crash the rest of the package, it is still important that they can be interfaced properly with parent classes. The next few tutorials will go through how to extend the SDistribution, Kernel, Wrapper and Decorator classes but first please make sure you have gone through the preliminary checklist below. Of course, if you don't intend to make a pull-request to add your extension to the distr6 package, then feel free to go right on ahead and [start here](https://xoopr.github.io/distr6/articles/webs/create_sdistribution.html). ## distr6 Pull-Request Preliminaries -* [Analytic and numeric methods](https://alan-turing-institute.github.io/distr6/articles/webs/analytic_and_numeric_methods.html) for how we separate numeric and analytic methods and where these should go -* [Documentation](https://alan-turing-institute.github.io/distr6/articles/webs/documentation_in_r6.html) for the correct way to document your new class or function -* [R vs C](https://alan-turing-institute.github.io/distr6/articles/webs/r_vs_c.html) for why we won't accept pull requests written in C -* [R6 and Design patterns](https://alan-turing-institute.github.io/distr6/articles/webs/r6_and_design_patterns.html) for our R6 design pattern workarounds -* [Project wiki](https://github.com/alan-turing-institute/distr6/wiki) for a summary of the above as well as guidelines on unit tests and file naming +* [Analytic and numeric methods](https://xoopr.github.io/distr6/articles/webs/analytic_and_numeric_methods.html) for how we separate numeric and analytic methods and where these should go +* [Documentation](https://xoopr.github.io/distr6/articles/webs/documentation_in_r6.html) for the correct way to document your new class or function +* [R vs C](https://xoopr.github.io/distr6/articles/webs/r_vs_c.html) for why we won't accept pull requests written in C +* [R6 and Design patterns](https://xoopr.github.io/distr6/articles/webs/r6_and_design_patterns.html) for our R6 design pattern workarounds +* [Project wiki](https://github.com/xoopr/distr6/wiki) for a summary of the above as well as guidelines on unit tests and file naming ## Extension Guidelines -* [SDistribution](https://alan-turing-institute.github.io/distr6/articles/webs/create_sdistribution.html) -* [Kernel](https://alan-turing-institute.github.io/distr6/articles/webs/create_kernel.html) -* [Wrapper](https://alan-turing-institute.github.io/distr6/articles/webs/create_wrapper.html) -* [Decorator](https://alan-turing-institute.github.io/distr6/articles/webs/create_decorator.html) +* [SDistribution](https://xoopr.github.io/distr6/articles/webs/create_sdistribution.html) +* [Kernel](https://xoopr.github.io/distr6/articles/webs/create_kernel.html) +* [Wrapper](https://xoopr.github.io/distr6/articles/webs/create_wrapper.html) +* [Decorator](https://xoopr.github.io/distr6/articles/webs/create_decorator.html) diff --git a/vignettes/webs/properties_traits.rmd b/vignettes/webs/properties_traits.rmd index 5f8ffa5d4..c6e82fd66 100644 --- a/vignettes/webs/properties_traits.rmd +++ b/vignettes/webs/properties_traits.rmd @@ -14,7 +14,7 @@ set.seed(42) knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` -In the [previous tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/statistical_methods.html) we evaluated the density, distribution and quantile functions from a Standard Normal distributions. As well as sampling from this distribution and accessing various statistical results. In this tutorial we cover how to access distribution properties and traits. +In the [previous tutorial](https://xoopr.github.io/distr6/articles/webs/statistical_methods.html) we evaluated the density, distribution and quantile functions from a Standard Normal distributions. As well as sampling from this distribution and accessing various statistical results. In this tutorial we cover how to access distribution properties and traits. ## Properties vs Traits @@ -22,7 +22,7 @@ Before discussing how to actually view properties and traits it is worth underst ## Traits -In distr6 we refer to three traits: type, valueSupport and variateForm. The distribution type is the set of values theoretically be produced from the density function. Usually these are one of, the set of Reals, the set of Positive Reals, the set of Integers. valueSupport is one of "continuous", "discrete" or "mixture", this tells us what values the distribution can take as an input. Continuous distributions can take any (usually) real-valued input, discrete distributions can only take integers as inputs, and mixtures can take a combination of the two. We use the convention in distr6 that if a non-integer is passed to a discrete distribution then '0' is returned without error. Finally variateForm refers to the distribution being one of univariate, multivariate or matrixvariate. Currently most distributions in distr6 are univariate but we have a few multivariates implemented (see the [next tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/multivariates.html)). If a distribution is univariate then it requires only one point to be evaluated, where as a multivariate distribution requires multiple points (a matrixvariate distribution requires a whole matrix!). +In distr6 we refer to three traits: type, valueSupport and variateForm. The distribution type is the set of values theoretically be produced from the density function. Usually these are one of, the set of Reals, the set of Positive Reals, the set of Integers. valueSupport is one of "continuous", "discrete" or "mixture", this tells us what values the distribution can take as an input. Continuous distributions can take any (usually) real-valued input, discrete distributions can only take integers as inputs, and mixtures can take a combination of the two. We use the convention in distr6 that if a non-integer is passed to a discrete distribution then '0' is returned without error. Finally variateForm refers to the distribution being one of univariate, multivariate or matrixvariate. Currently most distributions in distr6 are univariate but we have a few multivariates implemented (see the [next tutorial](https://xoopr.github.io/distr6/articles/webs/multivariates.html)). If a distribution is univariate then it requires only one point to be evaluated, where as a multivariate distribution requires multiple points (a matrixvariate distribution requires a whole matrix!). To view all the traits of the Normal distribution, call the method `traits()`, ```{r} @@ -60,8 +60,4 @@ N$description ## Summary -In this tutorial we covered the difference between properties and traits, how to call properties and traits as a list or as individual items, and finally distribution variables. Remember you don't have to learn all these method and variable names off by heart, it's all listed in every distribution help page. In the [next tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/multivariates.html) we turn to multivariate distributions. - - - - +In this tutorial we covered the difference between properties and traits, how to call properties and traits as a list or as individual items, and finally distribution variables. Remember you don't have to learn all these method and variable names off by heart, it's all listed in every distribution help page. In the [next tutorial](https://xoopr.github.io/distr6/articles/webs/multivariates.html) we turn to multivariate distributions. diff --git a/vignettes/webs/s3_piping.rmd b/vignettes/webs/s3_piping.rmd index 9de6fe453..af17ac905 100644 --- a/vignettes/webs/s3_piping.rmd +++ b/vignettes/webs/s3_piping.rmd @@ -71,7 +71,7 @@ getParameterValue(N, "var") ## Piping -We won't go into too much detail about piping because it will be familiar to users who need to make use of it and may not be necessary for others. Piping is the process of calling functions in a set order using the pipe, `%>%` notation, from the magrittr package [@magrittr]. We specifically mention piping because it goes hand-in-hand with method chaining, which we discussed in the [introduction to R6 tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/intro_to_r6.html). Below are some examples of how piping can be used in distr6. +We won't go into too much detail about piping because it will be familiar to users who need to make use of it and may not be necessary for others. Piping is the process of calling functions in a set order using the pipe, `%>%` notation, from the magrittr package [@magrittr]. We specifically mention piping because it goes hand-in-hand with method chaining, which we discussed in the [introduction to R6 tutorial](https://xoopr.github.io/distr6/articles/webs/intro_to_r6.html). Below are some examples of how piping can be used in distr6. ```{r} library(magrittr) @@ -89,6 +89,6 @@ Notice that usually the S3 methods require the first argument to be the object, ## Summary -In this tutorial we covered using S3 and piping instead of/as well as R6 syntax in distr6. These allow you to use whichever syntax you're most comfortable with whilst maintaining the integrity of a well-designed and (hopefully) user-friendly object-oriented interface. In the [next tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/decorators.html) we look at another big feature in distr6, decorators. +In this tutorial we covered using S3 and piping instead of/as well as R6 syntax in distr6. These allow you to use whichever syntax you're most comfortable with whilst maintaining the integrity of a well-designed and (hopefully) user-friendly object-oriented interface. In the [next tutorial](https://xoopr.github.io/distr6/articles/webs/decorators.html) we look at another big feature in distr6, decorators. ## References diff --git a/vignettes/webs/statistical_methods.rmd b/vignettes/webs/statistical_methods.rmd index b398bbd93..d6ca3f165 100644 --- a/vignettes/webs/statistical_methods.rmd +++ b/vignettes/webs/statistical_methods.rmd @@ -14,7 +14,7 @@ set.seed(42) knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` -In the [previous tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/parameters.html) we constructed a Normal distribution and accessed and updated its parameters for a variety of parameterisations. In this tutorial we cover how to access mathematical and statistical methods of the Normal distribution including the `dnorm/pnorm/qnorm/rnorm` equivalents in distr6. +In the [previous tutorial](https://xoopr.github.io/distr6/articles/webs/parameters.html) we constructed a Normal distribution and accessed and updated its parameters for a variety of parameterisations. In this tutorial we cover how to access mathematical and statistical methods of the Normal distribution including the `dnorm/pnorm/qnorm/rnorm` equivalents in distr6. ## d/p/q/r @@ -36,7 +36,7 @@ N$rand(5) # 5 samples from the Normal distribution ## Other Mathematical and Statistical Methods -We have seen in the [first tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/constructing_a_distribution.html) how the `summary` method can be used to view quick statistics about a probability distribution, i.e. +We have seen in the [first tutorial](https://xoopr.github.io/distr6/articles/webs/constructing_a_distribution.html) how the `summary` method can be used to view quick statistics about a probability distribution, i.e. ```{r} N$summary() ``` @@ -55,4 +55,4 @@ N$mgf(2) ## Summary -In this tutorial we looked at using the d/p/q/r functions in distr6 and accessing other statistical results. In the [next tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/properties_traits.html) we take a quick look at distribution properties and traits, whilst trying not to get into too big a discussion about object-oriented programming! +In this tutorial we looked at using the d/p/q/r functions in distr6 and accessing other statistical results. In the [next tutorial](https://xoopr.github.io/distr6/articles/webs/properties_traits.html) we take a quick look at distribution properties and traits, whilst trying not to get into too big a discussion about object-oriented programming! diff --git a/vignettes/webs/wrappers.rmd b/vignettes/webs/wrappers.rmd index 03dbcc8ca..6fc2a26d4 100644 --- a/vignettes/webs/wrappers.rmd +++ b/vignettes/webs/wrappers.rmd @@ -31,7 +31,7 @@ set.seed(42) knitr::opts_chunk$set(collapse = TRUE, comment = "#>") ``` -The [previous tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/decorators.html) introduced decorators in distr6. These are used to add numeric and more complex methods to the distribution interface. Wrappers are the next big distr6 feature and serve a similar purpose. +The [previous tutorial](https://xoopr.github.io/distr6/articles/webs/decorators.html) introduced decorators in distr6. These are used to add numeric and more complex methods to the distribution interface. Wrappers are the next big distr6 feature and serve a similar purpose. ## Wrappers @@ -140,6 +140,6 @@ M$cdf(1:3) ## Summary -There are plenty other wrappers to explore, including vector distributions that combine distributions into one vector and array distributions that are a type of product distribution for k-dimensional distributions of a specific type. The tools learnt from this tutorial are all applicable to every other wrapper and we hope you find the rest intuitive to use. In the next and [final tutorial](https://alan-turing-institute.github.io/distr6/articles/webs/custom_distributions.html) we conclude with running through how to construct your own custom distribution. +There are plenty other wrappers to explore, including vector distributions that combine distributions into one vector and array distributions that are a type of product distribution for k-dimensional distributions of a specific type. The tools learnt from this tutorial are all applicable to every other wrapper and we hope you find the rest intuitive to use. In the next and [final tutorial](https://xoopr.github.io/distr6/articles/webs/custom_distributions.html) we conclude with running through how to construct your own custom distribution. ## References