diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 00000000..b60928a8 --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1,26 @@ +bin +bin64 +*.*# +temp + +# Because of CMake and VS2017 +Win32 +x64 + +cmake-build-*/ +cmake-build/ +build/* +!build/Jamfile +local/ +tmp/ +AGENTS.md +CLAUDE.md +.roadmap/ +.idea/ +doc/modules/reference/ +node_modules/ + +# Doxygen output for Antora attachments (generated by scripts/run_doxygen_accumulators_framework.sh) +modules/ROOT/attachments/doxygen/accumulators_framework_reference/ +doxygen/Doxyfile._runtime +tmp_layout/ \ No newline at end of file diff --git a/doc/Jamfile.v2 b/doc/Jamfile.v2 deleted file mode 100644 index 42fc2311..00000000 --- a/doc/Jamfile.v2 +++ /dev/null @@ -1,257 +0,0 @@ -# Copyright Eric Niebler 2005. Use, modification, and distribution are -# subject to the Boost Software License, Version 1.0. (See accompanying -# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -import os ; -import common ; -import doxygen ; -import quickbook ; - -# -# Accumulators docs are dependent upon -# latex dvips and ps being in your PATH. -# This is true for most Unix installs, but -# not on Win32, where you will need to install -# MkTex and Ghostscript and add these tools -# to your path. -# -make latex.check : : @check-latex ; -actions check-latex -{ - latex -version > latex.version -} - -make dvips.check : : @check-dvips ; -actions check-dvips -{ - dvips -version > dvips.version -} - -make gs.check : : @check-gs ; - -import os ; - -if [ os.name ] = "NT" -{ - actions check-gs - { - gswin32c -version > gs.version - } -} -else -{ - actions check-gs - { - gs -version > gs.version - } -} - -# Use Doxygen to emit a tagfile with the definition of depends_on<>. That -# tagfile will be used by Doxygen below when generating the Statistics Library -# Reference. This is all so that the Doxygen-generated documentation for the -# features shows the dependency relationships between them. -doxygen tagfile - : - ../include/boost/accumulators/framework/depends_on.hpp - ../include/boost/accumulators/framework/extractor.hpp - : - MACRO_EXPANSION=YES - EXPAND_ONLY_PREDEF=YES - GENERATE_TAGFILE=accumulators.tag - "PREDEFINED=\"BOOST_ACCUMULATORS_DOXYGEN_INVOKED=1\" \\ - \"BOOST_PP_REPEAT_FROM_TO(a,b,c,d)=\" \\ - \"BOOST_PP_ENUM_PARAMS(a,b)=b ## 1, b ## 2, ...\"" - latex.check - dvips.check - gs.check - ; - -doxygen accdoc - : - [ glob ../include/boost/accumulators/accumulators*.hpp ] - [ glob ../include/boost/accumulators/framework/*.hpp ] - [ glob ../include/boost/accumulators/framework/parameters/*.hpp ] - [ glob ../include/boost/accumulators/framework/accumulators/*.hpp ] - : - EXTRACT_ALL=YES - "PREDEFINED=\"BOOST_ACCUMULATORS_DOXYGEN_INVOKED=1\" \\ - \"BOOST_PP_REPEAT_FROM_TO(a,b,c,d)=\" \\ - \"BOOST_PP_REPEAT(a,b,c)=\" \\ - \"BOOST_PARAMETER_KEYWORD(a,b)=\\ - namespace a { struct b {}; } \\ - boost::parameter::keyword const b;\" \\ - \"BOOST_PP_ENUM_PARAMS(a,b)=b ## 1, b ## 2, ...\"" - HIDE_UNDOC_MEMBERS=NO - EXTRACT_PRIVATE=NO - ENABLE_PREPROCESSING=YES - MACRO_EXPANSION=YES - EXPAND_ONLY_PREDEF=YES - SEARCH_INCLUDES=NO - "Accumulators Framework Reference" - latex.check - dvips.check - gs.check - ; - -# Generate the HTML form of the stats documentation, as this causes Doxygen to -# generate .png images for the LaTeX formulas embedded in the doc comments. -doxygen statsdoc.html - : - [ glob ../include/boost/accumulators/statistics*.hpp ] - [ glob ../include/boost/accumulators/statistics/*.hpp ] - [ glob ../include/boost/accumulators/statistics/variates/*.hpp ] - : - latex.check - dvips.check - gs.check - ; - -if [ os.name ] = NT -{ - CP = copy /y ; - MKDIR = mkdir ; - FROM = \\..\\..\\..\\html\\statsdoc\\*.png ; - TOHTML = .\\html\\images\\accumulators ; - TOPDF = \\images\\accumulators ; -} -else -{ - CP = cp ; - MKDIR = mkdir -p ; - FROM = /../../html/statsdoc/*.png ; - TOHTML = ./html/images/accumulators ; - TOPDF = /images/accumulators ; -} - -actions copy-latex-pngs -{ - $(MKDIR) $(TOHTML) - $(MKDIR) $(<:D)$(TOPDF) - $(CP) $(<:D)$(FROM) $(TOHTML) - $(CP) $(<:D)$(FROM) $(<:D)$(TOPDF) - echo "Stamped" > "$(<)" -} - -# This causes the png files built above to be copied into the -# html/images/accumulators directory. -make statsdoclatex.tag - : statsdoc.html - : @copy-latex-pngs - ; - -doxygen statsdoc - : - [ glob ../include/boost/accumulators/statistics*.hpp ] - [ glob ../include/boost/accumulators/statistics/*.hpp ] - [ glob ../include/boost/accumulators/statistics/variates/*.hpp ] - : - EXTRACT_ALL=YES - "PREDEFINED=\"BOOST_ACCUMULATORS_DOXYGEN_INVOKED=1\" \\ - \"BOOST_PP_REPEAT_FROM_TO(a,b,c,d)=\" \\ - \"BOOST_PP_REPEAT(a,b,c)=\" \\ - \"BOOST_PARAMETER_KEYWORD(a,b)=\\ - namespace a { struct b {}; } \\ - boost::parameter::keyword const b;\" \\ - \"BOOST_PP_ENUM_PARAMS(a,b)=b ## 1, b ## 2, ...\"" - HIDE_UNDOC_MEMBERS=NO - EXTRACT_PRIVATE=NO - ENABLE_PREPROCESSING=YES - MACRO_EXPANSION=YES - EXPAND_ONLY_PREDEF=YES - SEARCH_INCLUDES=NO - TAGFILES=accumulators.tag - boost.doxygen.formuladir=images/accumulators/ - "Statistics Library Reference" - tagfile - statsdoclatex.tag - latex.check - dvips.check - gs.check - ; - -doxygen opdoc - : - [ glob ../include/boost/accumulators/numeric/functional.hpp ] - [ glob ../include/boost/accumulators/numeric/functional/*.hpp ] - : - EXTRACT_ALL=YES - "PREDEFINED=\"BOOST_NUMERIC_FUNCTIONAL_DOXYGEN_INVOKED=1\" \\ - \"BOOST_NUMERIC_FUNCTIONAL_DEFINE_BINARY_OP(a,b,c)=\\ - namespace functional { \\ - template struct a ## _base \\ - : std::binary_function() b lvalue())> { \\ - /** \\return left b right */ \\ - result_type operator()(Left &left, Right &right) const; }; \\ - template::type, \\ - class RightTag=typename tag::type> \\ - struct a : a ## _base {}; } \\ - namespace op { \\ - struct a : boost::detail::function2< \\ - functional::a<_1,_2,functional::tag<_1>,functional::tag<_2> > > {}; } \\ - namespace { \\ - /** \\return functional::a()(left, right) */ \\ - op::a const & a = boost::detail::pod_singleton::instance; } \" \\ - \"BOOST_NUMERIC_FUNCTIONAL_DEFINE_UNARY_OP(a,b)=\\ - namespace functional { \\ - template struct a ## _base \\ - : std::unary_function())> { \\ - /** \\return b arg */ \\ - result_type operator()(Arg & arg) const; }; \\ - template::type> \\ - struct a : a ## _base {}; } \\ - namespace op { \\ - struct a : boost::detail::function1< \\ - functional::a<_,functional::tag<_> > > {}; } \\ - namespace { \\ - /** \\return functional::a()(arg) */ \\ - op::a const & a = boost::detail::pod_singleton::instance; }\"" - HIDE_UNDOC_MEMBERS=NO - EXTRACT_PRIVATE=NO - ENABLE_PREPROCESSING=YES - MACRO_EXPANSION=YES - EXPAND_ONLY_PREDEF=YES - SEARCH_INCLUDES=NO - "Numeric Operators Library Reference" - latex.check - dvips.check - gs.check - ; - -xml accumulators - : - accumulators.qbk - : - boost.max.id.length=1024 - toc.max.depth=4 - toc.section.depth=4 - chunk.section.depth=2 - ; - -path-constant images_location : html ; - -boostbook standalone - : - accumulators - : - boost.root=../../../.. - boost.max.id.length=1024 - toc.max.depth=4 - toc.section.depth=4 - chunk.section.depth=2 - accdoc - statsdoc - opdoc - pdf:img.src.path=$(images_location)/ - pdf:boost.url.prefix=http://www.boost.org/doc/libs/release/doc/html - ; - -############################################################################### -alias boostdoc - : accumulators - : - : accdoc statsdoc opdoc - : ; -explicit boostdoc ; -alias boostrelease ; -explicit boostrelease ; diff --git a/doc/accumulators.qbk b/doc/accumulators.qbk deleted file mode 100644 index 7e6d1f43..00000000 --- a/doc/accumulators.qbk +++ /dev/null @@ -1,4180 +0,0 @@ - -[library Boost.Accumulators - [quickbook 1.3] - [authors [Niebler, Eric]] - [copyright 2005 2006 Eric Niebler] - [category math] - [id accumulators] - [dirname accumulators] - [purpose - Incremental accumulation framework and statistical accumulator library. - ] - [license - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at - [@http://www.boost.org/LICENSE_1_0.txt]) - ] -] - -[/ Images ] - -[def _note_ [$images/note.png]] -[def _alert_ [$images/caution.png]] -[def _detail_ [$images/note.png]] -[def _tip_ [$images/tip.png]] - -[/ Links ] - -[def _sample_type_ '''sample-type'''] -[def _weight_type_ '''weight-type'''] -[def _variate_type_ '''variate-type'''] -[def _variate_tag_ '''variate-tag'''] -[def _left_or_right_ '''left-or-right'''] -[def _implementation_defined_ '''implementation-defined'''] -[def _boost_ [@http://www.boost.org Boost]] -[def _mpl_ [@../../libs/mpl/index.html MPL]] -[def _mpl_lambda_expression_ [@../../libs/mpl/doc/refmanual/lambda-expression.html MPL Lambda Expression]] -[def _parameter_ [@../../libs/parameter/index.html Boost.Parameter]] -[def _accumulator_set_ [classref boost::accumulators::accumulator_set `accumulator_set<>`]] -[def _accumulator_base_ [classref boost::accumulators::accumulator_base `accumulator_base`]] -[def _depends_on_ [classref boost::accumulators::depends_on `depends_on<>`]] -[def _feature_of_ [classref boost::accumulators::feature_of `feature_of<>`]] -[def _as_feature_ [classref boost::accumulators::as_feature `as_feature<>`]] -[def _features_ [classref boost::accumulators::features `features<>`]] -[def _external_ [classref boost::accumulators::external `external<>`]] -[def _droppable_ [classref boost::accumulators::droppable `droppable<>`]] -[def _droppable_accumulator_ [classref boost::accumulators::droppable_accumulator `droppable_accumulator<>`]] -[def _extractor_ [classref boost::accumulators::tag::extractor `extractor<>`]] -[def _tail_ [classref boost::accumulators::tag::tail `tail`]] -[def _tail_variate_ [classref boost::accumulators::tag::tail_variate `tail_variate<>`]] -[def _extract_result_ [funcref boost::accumulators::extract_result `extract_result()`]] -[def _ZKB_ [@http://www.zkb.com Z'''ü'''rcher Kantonalbank]] - -[section Preface] - -[:["It is better to be approximately right than exactly wrong.]\n['-- Old adage]] - -[h2 Description] - -Boost.Accumulators is both a library for incremental statistical computation as -well as an extensible framework for incremental calculation in general. The library -deals primarily with the concept of an ['accumulator], which is a primitive -computational entity that accepts data one sample at a time and maintains some -internal state. These accumulators may offload some of their computations on other -accumulators, on which they depend. Accumulators are grouped within an ['accumulator -set]. Boost.Accumulators resolves the inter-dependencies between accumulators in a -set and ensures that accumulators are processed in the proper order. - -[endsect] - -[section User's Guide] - -This section describes how to use the Boost.Accumulators framework to create new -accumulators and how to use the existing statistical accumulators to perform incremental -statistical computation. For detailed information regarding specific components in -Boost.Accumulators, check the [link accumulators_framework_reference Reference] section. - -[h2 Hello, World!] - -Below is a complete example of how to use the Accumulators Framework and the -Statistical Accumulators to perform an incremental statistical calculation. It -calculates the mean and 2nd moment of a sequence of doubles. - - #include - #include - #include - #include - #include - using namespace boost::accumulators; - - int main() - { - // Define an accumulator set for calculating the mean and the - // 2nd moment ... - accumulator_set > > acc; - - // push in some data ... - acc(1.2); - acc(2.3); - acc(3.4); - acc(4.5); - - // Display the results ... - std::cout << "Mean: " << mean(acc) << std::endl; - std::cout << "Moment: " << moment<2>(acc) << std::endl; - - return 0; - } - -This program displays the following: - -[pre -Mean: 2.85 -Moment: 9.635 -] - -[section The Accumulators Framework] - -The Accumulators Framework is framework for performing incremental calculations. Usage -of the framework follows the following pattern: - -* Users build a computational object, called an ['_accumulator_set_], by selecting - the computations in which they are interested, or authoring their own computational - primitives which fit within the framework. -* Users push data into the _accumulator_set_ object one sample at a time. -* The _accumulator_set_ computes the requested quantities in the most efficient method - possible, resolving dependencies between requested calculations, possibly caching - intermediate results. - -The Accumulators Framework defines the utilities needed for defining primitive -computational elements, called ['accumulators]. It also provides the _accumulator_set_ -type, described above. - -[h2 Terminology] - -The following terms are used in the rest of the documentation. - -[variablelist - [[Sample] [[#sample_type] A datum that is pushed into an _accumulator_set_. - The type of the sample is the ['sample type].]] - [[Weight] [[#weight_type] An optional scalar value passed along with the - sample specifying the weight of the sample. Conceptually, each - sample is multiplied with its weight. The type of the weight is - the ['weight type].]] - [[Feature] [An abstract primitive computational entity. When defining an - _accumulator_set_, users specify the features in which they are - interested, and the _accumulator_set_ figures out which - ['accumulators] would best provide those features. Features may - depend on other features. If they do, the accumulator set figures - out which accumulators to add to satisfy the dependencies.]] - [[Accumulator] [A concrete primitive computational entity. An accumulator is a - concrete implementation of a feature. It satisfies exactly one - abstract feature. Several different accumulators may provide the - same feature, but may represent different implementation strategies.]] - [[Accumulator Set] [A collection of accumulators. An accumulator set is specified with - a sample type and a list of features. The accumulator set uses this - information to generate an ordered set of accumulators depending on - the feature dependency graph. An accumulator set accepts samples one - datum at a time, propagating them to each accumulator in order. At any - point, results can be extracted from the accumulator set.]] - [[Extractor] [A function or function object that can be used to extract a result - from an _accumulator_set_.]] -] - -[h2 Overview] - -Here is a list of the important types and functions in the Accumulator Framework and -a brief description of each. - -[table Accumulators Toolbox - [[Tool] [Description]] - [[_accumulator_set_] [This is the most important type in the Accumulators Framework. - It is a collection of accumulators. A datum pushed into an - _accumulator_set_ is forwarded to each accumulator, in an order - determined by the dependency relationships between the - accumulators. Computational results can be extracted from an - accumulator at any time.]] - [[_depends_on_ ] [Used to specify which other features a feature depends on.]] - [[_feature_of_ ] [Trait used to tell the Accumulators Framework that, for the purpose - of feature-based dependency resolution, one feature should be - treated the same as another.]] - [[_as_feature_ ] [Used to create an alias for a feature. For example, if there are - two features, fast_X and accurate_X, they can be mapped to - X(fast) and X(accurate) with _as_feature_. This is just syntactic - sugar.]] - [[_features_ ] [An _mpl_ sequence. We can use _features_ as the second template - parameter when declaring an _accumulator_set_.]] - [[_external_ ] [Used when declaring an _accumulator_set_. If the weight type is - specified with _external_, then the weight accumulators are - assumed to reside in a separate accumulator set which will be passed - in with a named parameter.]] - [[_extractor_ ] [A class template useful for creating an extractor function object. - It is parameterized on a feature, and it has member functions for - extracting from an _accumulator_set_ the result corresponding to - that feature.]] -] - -[section Using [^accumulator_set<>]] - -Our tour of the _accumulator_set_ class template begins with the forward declaration: - - template< typename Sample, typename Features, typename Weight = void > - struct accumulator_set; - -The template parameters have the following meaning: - -[variablelist - [[`Sample`] [The type of the data that will be accumulated.]] - [[`Features`] [An _mpl_ sequence of features to be calculated.]] - [[`Weight`] [The type of the (optional) weight paramter.]] -] - -For example, the following line declares an _accumulator_set_ that will accept -a sequence of doubles one at a time and calculate the min and mean: - - accumulator_set< double, features< tag::min, tag::mean > > acc; - -Notice that we use the _features_ template to specify a list of features to be calculated. -_features_ is an MPL sequence of features. - -[note _features_ is a synonym of `mpl::vector<>`. In fact, we could use `mpl::vector<>` - or any MPL sequence if we prefer, and the meaning would be the same.] - -Once we have defined an _accumulator_set_, we can then push data into it, -and it will calculate the quantities you requested, as shown below. - - // push some data into the accumulator_set ... - acc(1.2); - acc(2.3); - acc(3.4); - -Since _accumulator_set_ defines its accumulate function to be the function call operator, -we might be tempted to use an _accumulator_set_ as a UnaryFunction to a standard -algorithm such as `std::for_each`. That's fine as long as we keep in mind that the standard -algorithms take UnaryFunction objects by value, which involves making a copy of the -_accumulator_set_ object. Consider the following: - - // The data for which we wish to calculate statistical properties: - std::vector< double > data( /* stuff */ ); - - // The accumulator set which will calculate the properties for us: - accumulator_set< double, features< tag::min, tag::mean > > acc; - - // Use std::for_each to accumulate the statistical properties: - acc = std::for_each( data.begin(), data.end(), acc ); - -Notice how we must assign the return value of `std::for_each` back to the _accumulator_set_. -This works, but some accumulators are not cheap to copy. For -example, the _tail_ and _tail_variate_ accumulators must store a `std::vector<>`, so copying -these accumulators involves a dynamic allocation. We might be better off in this -case passing the accumulator by reference, with the help of `boost::bind()` and -`boost::ref()`. See below: - - // The data for which we wish to calculate statistical properties: - std::vector< double > data( /* stuff */ ); - - // The accumulator set which will calculate the properties for us: - accumulator_set< double, features< tag::tail > > acc( - tag::tail::cache_size = 4 ); - - // Use std::for_each to accumulate the statistical properties: - std::for_each( data.begin(), data.end(), bind( ref(acc), _1 ) ); - -Notice now that we don't care about the return value of `std::for_each()` anymore because -`std::for_each()` is modifying `acc` directly. - -[note To use `boost::bind()` and `boost::ref()`, you must `#include` [^] -and [^]] - -[endsect] - -[section Extracting Results] - -Once we have declared an _accumulator_set_ and pushed data into it, we need to be able -to extract results from it. For each feature we can add to an _accumulator_set_, there -is a corresponding extractor for fetching its result. Usually, the extractor has the -same name as the feature, but in a different namespace. For example, if we accumulate -the `tag::min` and `tag::max` features, we can extract the results with the `min` and `max` -extractors, as follows: - - // Calculate the minimum and maximum for a sequence of integers. - accumulator_set< int, features< tag::min, tag::max > > acc; - acc( 2 ); - acc( -1 ); - acc( 1 ); - - // This displays "(-1, 2)" - std::cout << '(' << min( acc ) << ", " << max( acc ) << ")\n"; - -The extractors are all declared in the `boost::accumulators::extract` namespace, but they -are brought into the `boost::accumulators` namespace with a `using` declaration. - -[tip On the Windows platform, `min` and `max` are preprocessor macros defined in [^WinDef.h]. - To use the `min` and `max` extractors, you should either compile with `NOMINMAX` defined, or - you should invoke the extractors like: `(min)( acc )` and `(max)( acc )`. The parentheses - keep the macro from being invoked.] - -Another way to extract a result from an _accumulator_set_ is with the -`extract_result()` function. This can be more convenient if there isn't an extractor -object handy for a certain feature. The line above which displays results could -equally be written as: - - // This displays "(-1, 2)" - std::cout << '(' << extract_result< tag::min >( acc ) - << ", " << extract_result< tag::max >( acc ) << ")\n"; - -Finally, we can define our own extractor using the _extractor_ class template. For -instance, another way to avoid the `min` / `max` macro business would be to define -extractors with names that don't conflict with the macros, like this: - - extractor< tag::min > min_; - extractor< tag::min > max_; - - // This displays "(-1, 2)" - std::cout << '(' << min_( acc ) << ", " << max_( acc ) << ")\n"; - -[endsect] - -[section Passing Optional Parameters] - -Some accumulators need initialization parameters. In addition, perhaps some auxiliary -information needs to be passed into the _accumulator_set_ along with each sample. -Boost.Accumulators handles these cases with named parameters from the _parameter_ -library. - -For example, consider the _tail_ and _tail_variate_ features. _tail_ keeps -an ordered list of the largest [^['N]] samples, where [^['N]] can be specified at -construction time. Also, the _tail_variate_ feature, which depends on _tail_, keeps -track of some data that is covariate with the [^['N]] samples tracked by _tail_. The -code below shows how this all works, and is described in more detail below. - - // Define a feature for tracking covariate data - typedef tag::tail_variate< int, tag::covariate1, left > my_tail_variate_tag; - - // This will calculate the left tail and my_tail_variate_tag for N == 2 - // using the tag::tail::cache_size named parameter - accumulator_set< double, features< my_tail_variate_tag > > acc( - tag::tail::cache_size = 2 ); - - // push in some samples and some covariates by using - // the covariate1 named parameter - acc( 1.2, covariate1 = 12 ); - acc( 2.3, covariate1 = -23 ); - acc( 3.4, covariate1 = 34 ); - acc( 4.5, covariate1 = -45 ); - - // Define an extractor for the my_tail_variate_tag feature - extractor< my_tail_variate_tag > my_tail_variate; - - // Write the tail statistic to std::cout. This will print "4.5, 3.4, " - std::ostream_iterator< double > dout( std::cout, ", " ); - std::copy( tail( acc ).begin(), tail( acc ).end(), dout ); - - // Write the tail_variate statistic to std::cout. This will print "-45, 34, " - std::ostream_iterator< int > iout( std::cout, ", " ); - std::copy( my_tail_variate( acc ).begin(), my_tail_variate( acc ).end(), iout ); - -There are several things to note about the code above. First, notice that we didn't have -to request that the _tail_ feature be calculated. That is implicit because the _tail_variate_ -feature depends on the _tail_ feature. Next, notice how the `acc` object -is initialized: `acc( tag::tail::cache_size = 2 )`. Here, `cache_size` is a named parameter. -It is used to tell the _tail_ and _tail_variate_ accumulators how many samples and -covariates to store. Conceptually, every construction parameter is made available to -every accumulator in an accumulator set. - -We also use a named parameter to pass covariate data into the accumulator set along with -the samples. As with the constructor parameters, all parameters to the accumulate function -are made available to all the accumulators in the set. In this case, only the accumulator -for the `my_tail_variate` feature would be interested in the value of the `covariate1` named -parameter. - -We can make one final observation about the example above. Since _tail_ and _tail_variate_ -are multi-valued features, the result we extract for them is represented as an iterator -range. That is why we can say `tail( acc ).begin()` and `tail( acc ).end()`. - -Even the extractors can accept named parameters. In a bit, we'll see a situation where that -is useful. - -[endsect] - -[section Weighted Samples] - -Some accumulators, statistical accumulators in particular, deal with data that are -['weighted]. Each sample pushed into the accumulator has an associated weight, by which -the sample is conceptually multiplied. The Statistical Accumulators Library provides an -assortment of these weighted statistical accumulators. And many unweighted statistical -accumulators have weighted variants. For instance, the weighted variant of the `sum` -accumulator is called `weighted_sum`, and is calculated by accumulating all the -samples multiplied by their weights. - -To declare an _accumulator_set_ that accepts weighted samples, you must specify the -type of the weight parameter as the 3rd template parameter, as follows: - - // 3rd template parameter 'int' means this is a weighted - // accumulator set where the weights have type 'int' - accumulator_set< int, features< tag::sum >, int > acc; - -When you specify a weight, all the accumulators in the set are replaced with -their weighted equivalents. For example, the above _accumulator_set_ declaration -is equivalent to the following: - - // Since we specified a weight, tag::sum becomes tag::weighted_sum - accumulator_set< int, features< tag::weighted_sum >, int > acc; - -When passing samples to the accumulator set, you must also specify the -weight of each sample. You can do that with the `weight` named parameter, -as follows: - - acc(1, weight = 2); // 1 * 2 - acc(2, weight = 4); // 2 * 4 - acc(3, weight = 6); // + 3 * 6 - // ------- - // = 28 - -You can then extract the result with the `sum()` extractor, as follows: - - // This prints "28" - std::cout << sum(acc) << std::endl; - -[note When working with weighted statistical accumulators from the Statistical -Accumulators Library, be sure to include the appropriate header. For instance, -`weighted_sum` is defined in ``.] - -[endsect] - -[section Numeric Operators Sub-Library] - -This section describes the function objects in the `boost::numeric` namespace, which -is a sub-library that provides function objects and meta-functions corresponding -to the infix operators in C++. - -In the `boost::numeric::operators` namespace are additional operator overloads for -some useful operations not provided by the standard library, such as multiplication -of a `std::complex<>` with a scalar. - -In the `boost::numeric::functional` namespace are function object equivalents of -the infix operators. These function object types are heterogeneous, and so are more -general than the standard ones found in the [^] header. They use the -Boost.Typeof library to deduce the return types of the infix expressions they -evaluate. In addition, they look within the `boost::numeric::operators` namespace -to consider any additional overloads that might be defined there. - -In the `boost::numeric` namespace are global polymorphic function objects -corresponding to the function object types defined in the `boost::numeric::functional` -namespace. For example, `boost::numeric::plus(a, b)` is equivalent to -`boost::numeric::functional::plus()(a, b)`, and both are equivalent to -`using namespace boost::numeric::operators; a + b;`. - -The Numeric Operators Sub-Library also gives several ways to sub-class and -a way to sub-class and specialize operations. One way uses tag dispatching on -the types of the operands. The other way is based on the compile-time -properties of the operands. - -[endsect] - -[section Extending the Accumulators Framework] - -This section describes how to extend the Accumulators Framework by defining new accumulators, -features and extractors. Also covered are how to control the dependency resolution of -features within an accumulator set. - -[section Defining a New Accumulator] - -All new accumulators must satisfy the [link -accumulators.user_s_guide.the_accumulators_framework.concepts.accumulator_concept Accumulator -Concept]. Below is a sample class that satisfies the accumulator concept, which simply sums -the values of all samples passed into it. - - #include - #include - - namespace boost { // Putting your accumulators in the - namespace accumulators { // impl namespace has some - namespace impl { // advantages. See below. - - template - struct sum_accumulator // All accumulators should inherit from - : accumulator_base // accumulator_base. - { - typedef Sample result_type; // The type returned by result() below. - - template // The constructor takes an argument pack. - sum_accumulator(Args const & args) - : sum(args[sample | Sample()]) // Maybe there is an initial value in the - { // argument pack. ('sample' is defined in - } // sample.hpp, included above.) - - template // The accumulate function is the function - void operator ()(Args const & args) // call operator, and it also accepts an - { // argument pack. - this->sum += args[sample]; - } - - result_type result(dont_care) const // The result function will also be passed - { // an argument pack, but we don't use it here, - return this->sum; // so we use "dont_care" as the argument type. - } - private: - Sample sum; - }; - - }}} - -Much of the above should be pretty self-explanatory, except for the use of argument packs -which may be confusing if you have never used the _parameter_ library before. An argument -pack is a cluster of values, each of which can be accessed with a key. So `args[sample]` -extracts from the pack the value associated with the `sample` key. And the cryptic -`args[sample | Sample()]` evaluates to the value associated with the `sample` key if it -exists, or a default-constructed `Sample` if it doesn't. - -The example above demonstrates the most common attributes of an accumulator. There are -other optional member functions that have special meaning. In particular: - -[variablelist Optional Accumulator Member Functions -[[[^on_drop(Args)]] [Defines an action to be taken when this accumulator is - dropped. See the section on - [link accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_accumulator.droppable_accumulators - Droppable Accumulators].]] -] - -[h3 Accessing Other Accumulators in the Set] - -Some accumulators depend on other accumulators within the same accumulator set. In those -cases, it is necessary to be able to access those other accumulators. To make this possible, -the _accumulator_set_ passes a reference to itself when invoking the member functions of -its contained accumulators. It can be accessed by using the special `accumulator` key with -the argument pack. Consider how we might implement `mean_accumulator`: - - // Mean == (Sum / Count) - template - struct mean_accumulator : accumulator_base - { - typedef Sample result_type; - mean_accumulator(dont_care) {} - - template - result_type result(Args const &args) const - { - return sum(args[accumulator]) / count(args[accumulator]); - } - }; - -`mean` depends on the `sum` and `count` accumulators. (We'll see in the next section how -to specify these dependencies.) The result of the mean accumulator is merely the result of -the sum accumulator divided by the result of the count accumulator. Consider how we write -that: `sum(args[accumulator]) / count(args[accumulator])`. The expression `args[accumulator]` -evaluates to a reference to the _accumulator_set_ that contains this `mean_accumulator`. It -also contains the `sum` and `count` accumulators, and we can access their results with the -extractors defined for those features: `sum` and `count`. - -[note Accumulators that inherit from _accumulator_base_ get an empty `operator ()`, so - accumulators like `mean_accumulator` above need not define one.] - -All the member functions that accept an argument pack have access to the enclosing -_accumulator_set_ via the `accumulator` key, including the constructor. The -accumulators within the set are constructed in an order determined by their interdependencies. -As a result, it is safe for an accumulator to access one on which it depends during construction. - -[h3 Infix Notation and the Numeric Operators Sub-Library] - -Although not necessary, it can be a good idea to put your accumulator implementations in -the `boost::accumulators::impl` namespace. This namespace pulls in any operators defined -in the `boost::numeric::operators` namespace with a using directive. The Numeric Operators -Sub-Library defines some additional overloads that will make your accumulators work with -all sorts of data types. - -Consider `mean_accumulator` defined above. It divides the sum of the samples by the count. -The type of the count is `std::size_t`. What if the sample type doesn't define division by -`std::size_t`? That's the case for `std::complex<>`. You might think that if the sample type -is `std::complex<>`, the code would not work, but in fact it does. That's because -Numeric Operators Sub-Library defines an overloaded `operator/` for `std::complex<>` -and `std::size_t`. This operator is defined in the `boost::numeric::operators` namespace and -will be found within the `boost::accumulators::impl` namespace. That's why it's a good idea -to put your accumulators there. - -[h3 Droppable Accumulators] - -The term "droppable" refers to an accumulator that can be removed from the _accumulator_set_. -You can request that an accumulator be made droppable by using the _droppable_ class template. - - // calculate sum and count, make sum droppable: - accumulator_set< double, features< tag::count, droppable > > acc; - - // add some data - acc(3.0); - acc(2.0); - - // drop the sum (sum is 5 here) - acc.drop(); - - // add more data - acc(1.0); - - // This will display "3" and "5" - std::cout << count(acc) << ' ' << sum(acc); - -Any accumulators that get added to an accumulator set in order to satisfy -dependencies on droppable accumulators are themselves droppable. Consider -the following accumulator: - - // Sum is not droppable. Mean is droppable. Count, brought in to - // satisfy mean's dependencies, is implicitly droppable, too. - accumulator_set< double, features< tag::sum, droppable > > acc; - -`mean` depends on `sum` and `count`. Since `mean` is droppable, so too is `count`. -However, we have explicitly requested that `sum` be not droppable, so it isn't. Had -we left `tag::sum` out of the above declaration, the `sum` accumulator would have -been implicitly droppable. - -A droppable accumulator is reference counted, and is only really dropped after all the -accumulators that depend on it have been dropped. This can lead to some surprising -behavior in some situations. - - // calculate sum and mean, make mean droppable. - accumulator_set< double, features< tag::sum, droppable > > acc; - - // add some data - acc(1.0); - acc(2.0); - - // drop the mean. mean's reference count - // drops to 0, so it's really dropped. So - // too, count's reference count drops to 0 - // and is really dropped. - acc.drop(); - - // add more data. Sum continues to accumulate! - acc(3.0); - - // This will display "6 2 3" - std::cout << sum(acc) << ' ' - << count(acc) << ' ' - << mean(acc); - -Note that at the point at which `mean` is dropped, `sum` is 3, `count` is 2, and -therefore `mean` is 1.5. But since `sum` continues to accumulate even after `mean` -has been dropped, the value of `mean` continues to change. If you want to remember -the value of `mean` at the point it is dropped, you should save its value into -a local variable. - -The following rules more precisely specify how droppable and non-droppable -accumulators behave within an accumulator set. - -* There are two types of accumulators: droppable and non-droppable. - The default is non-droppable. -* For any feature `X`, both `X` and `droppable` satisfy the `X` dependency. -* If feature `X` depends on `Y` and `Z`, then `droppable` depends on - `droppable` and `droppable`. -* All accumulators have `add_ref()` and `drop()` member functions. -* For non-droppable accumulators, `drop()` is a no-op, and `add_ref()` - invokes `add_ref()` on all accumulators corresponding to the features - upon which the current accumulator depends. -* Droppable accumulators have a reference count and define `add_ref()` - and `drop()` to manipulate the reference count. -* For droppable accumulators, `add_ref()` increments the accumulator's - reference count, and also `add_ref()`'s the accumulators corresponding - to the features upon which the current accumulator depends. -* For droppable accumulators, `drop()` decrements the accumulator's - reference count, and also `drop()`'s the accumulators corresponding to - the features upon which the current accumulator depends. -* The accumulator_set constructor walks the list of *user-specified* - features and `add_ref()`'s the accumulator that corresponds to each of - them. (Note: that means that an accumulator that is not user-specified - but in the set merely to satisfy a dependency will be dropped as soon - as all its dependencies have been dropped. Ones that have been user - specified are not dropped until their dependencies have been - dropped *and* the user has explicitly dropped the accumulator.) -* Droppable accumulators check their reference count in their - accumulate member function. If the reference count is 0, the function - is a no-op. -* Users are not allowed to drop a feature that is not user-specified and - marked as droppable. - -And as an optimization: - -* If the user specifies the non-droppable feature `X`, which depends on `Y` - and `Z`, then the accumulators for `Y` and `Z` can be safely made - non-droppable, as well as any accumulators on which they depend. - -[endsect] - -[section Defining a New Feature] - -Once we have implemented an accumulator, we must define a feature for it so -that users can specify the feature when declaring an _accumulator_set_. We -typically put the features into a nested namespace, so that later we can -define an extractor of the same name. All features must satisfy the -[link accumulators.user_s_guide.the_accumulators_framework.concepts.feature_concept -Feature Concept]. Using _depends_on_ makes satisfying the concept simple. -Below is an example of a feature definition. - - namespace boost { namespace accumulators { namespace tag { - - struct mean // Features should inherit from - : depends_on< count, sum > // depends_on<> to specify dependencies - { - // Define a nested typedef called 'impl' that specifies which - // accumulator implements this feature. - typedef accumulators::impl::mean_accumulator< mpl::_1 > impl; - }; - - }}} - -The only two things we must do to define the `mean` feature is to specify the -dependencies with _depends_on_ and define the nested `impl` typedef. Even features -that have no dependencies should inherit from _depends_on_. The nested `impl` type -must be an _mpl_lambda_expression_. The result of -`mpl::apply< impl, _sample_type_, _weight_type_ >::type` must be -be the type of the accumulator that implements this feature. The use of _mpl_ -placeholders like `mpl::_1` make it especially easy to make a template such -as `mean_accumulator<>` an _mpl_lambda_expression_. Here, `mpl::_1` will be -replaced with the sample type. Had we used `mpl::_2`, it would have been replaced -with the weight type. - -What about accumulator types that are not templates? If you have a `foo_accumulator` -which is a plain struct and not a template, you could turn it into an -_mpl_lambda_expression_ using `mpl::always<>`, like this: - - // An MPL lambda expression that always evaluates to - // foo_accumulator: - typedef mpl::always< foo_accumulator > impl; - -If you are ever unsure, or if you are not comfortable with MPL lambda expressions, -you could always define `impl` explicitly: - - // Same as 'typedef mpl::always< foo_accumulator > impl;' - struct impl - { - template< typename Sample, typename Weight > - struct apply - { - typedef foo_accumulator type; - }; - }; - -Here, `impl` is a binary [@../../libs/mpl/doc/refmanual/metafunction-class.html -MPL Metafunction Class], which is a kind of _mpl_lambda_expression_. The nested -`apply<>` template is part of the metafunction class protocol and tells MPL how -to build the accumulator type given the sample and weight types. - -All features must also provide a nested `is_weight_accumulator` typedef. It must -be either `mpl::true_` or `mpl::false_`. _depends_on_ provides a default of -`mpl::false_` for all features that inherit from it, but that can be overridden -(or hidden, technically speaking) in the derived type. When the feature represents -an accumulation of information about the weights instead of the samples, we -can mark this feature as such with `typedef mpl::true_ is_weight_accumulator;`. -The weight accumulators are made external if the weight type is specified using -the _external_ template. - -[endsect] - -[section Defining a New Extractor] - -Now that we have an accumulator and a feature, the only thing lacking is a way -to get results from the accumulator set. The Accumulators Framework provides the -_extractor_ class template to make it simple to define an extractor for your -feature. Here's an extractor for the `mean` feature we defined above: - - namespace boost { - namespace accumulators { // By convention, we put extractors - namespace extract { // in the 'extract' namespace - - extractor< tag::mean > const mean = {}; // Simply define our extractor with - // our feature tag, like this. - } - using extract::mean; // Pull the extractor into the - // enclosing namespace. - }} - -Once defined, the `mean` extractor can be used to extract the result of the -`tag::mean` feature from an _accumulator_set_. - -Parameterized features complicate this simple picture. Consider the `moment` -feature, for calculating the [^['N]]-th moment, where [^['N]] is specified as -a template parameter: - - // An accumulator set for calculating the N-th moment, for N == 2 ... - accumulator_set< double, features< tag::moment<2> > > acc; - - // ... add some data ... - - // Display the 2nd moment ... - std::cout << "2nd moment is " << accumulators::moment<2>(acc) << std::endl; - -In the expression `accumulators::moment<2>(acc)`, what is `moment`? It cannot be an object -- -the syntax of C++ will not allow it. Clearly, if we want to provide this syntax, -we must make `moment` a function template. Here's what the definition of the -`moment` extractor looks like: - - namespace boost { - namespace accumulators { // By convention, we put extractors - namespace extract { // in the 'extract' namespace - - template - typename mpl::apply >::type::result_type - moment(AccumulatorSet const &acc) - { - return extract_result >(acc); - } - - } - using extract::moment; // Pull the extractor into the - // enclosing namespace. - }} - -The return type deserves some explanation. Every _accumulator_set_ type -is actually a unary [@../../libs/mpl/doc/refmanual/metafunction-class.html -MPL Metafunction Class]. When you `mpl::apply<>` an _accumulator_set_ and -a feature, the result is the type of the accumulator within the set that -implements that feature. And every accumulator provides a nested `result_type` -typedef that tells what its return type is. The extractor simply delegates -its work to the _extract_result_ function. - -[endsect] - -[section Controlling Dependencies] - -The feature-based dependency resolution of the Accumulators Framework is -designed to allow multiple different implementation strategies for each -feature. For instance, two different accumulators may calculate the same -quantity with different rounding modes, or using different algorithms with -different size/speed tradeoffs. Other accumulators that depend on that -quantity shouldn't care how it's calculated. The Accumulators Framework -handles this by allowing several different accumulators satisfy the same -feature. - -[*Aliasing feature dependencies with [^feature_of<>]] - -Imagine that you would like to implement the hypothetical ['fubar] statistic, -and that you know two ways to calculate fubar on a bunch of samples: an -accurate but slow calculation and an approximate but fast calculation. You -might opt to make the accurate calculation the default, so you implement -two accumulators and call them `impl::fubar_impl` and `impl::fast_fubar_impl`. -You would also define the `tag::fubar` and `tag::fast_fubar` features as described -[link accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_feature above]. -Now, you would like to inform the Accumulators Framework that these two features -are the same from the point of view of dependency resolution. You can do that -with _feature_of_, as follows: - - namespace boost { namespace accumulators - { - // For the purposes of feature-based dependency resolution, - // fast_fubar provides the same feature as fubar - template<> - struct feature_of - : feature_of - { - }; - }} - -The above code instructs the Accumulators Framework that, if another accumulator -in the set depends on the `tag::fubar` feature, the `tag::fast_fubar` feature -is an acceptable substitute. - -[*Registering feature variants with [^as_feature<>]] - -You may have noticed that some feature variants in the Accumulators Framework can be -specified with a nicer syntax. For instance, instead of `tag::mean` and `tag::immediate_mean` -you can specify them with `tag::mean(lazy)` and `tag::mean(immediate)` respectively. -These are merely aliases, but the syntax makes the relationship between the two clearer. -You can create these feature aliases with the _as_feature_ trait. Given the fubar example -above, you might decide to alias `tag::fubar(accurate)` with `tag::fubar` and -`tag::fubar(fast)` with `tag::fast_fubar`. You would do that as follows: - - namespace boost { namespace accumulators - { - struct fast {}; // OK to leave these tags empty - struct accurate {}; - - template<> - struct as_feature - { - typedef tag::fubar type; - }; - - template<> - struct as_feature - { - typedef tag::fast_fubar type; - }; - }} - -Once you have done this, users of your fubar accumulator can request the `tag::fubar(fast)` -and `tag::fubar(accurate)` features when defining their `accumulator_set`s and get the correct -accumulator. - -[endsect] - -[section:operators_ex Specializing Numeric Operators] - -This section describes how to adapt third-party numeric types to work with the Accumulator -Framework. - -Rather than relying on the built-in operators, the Accumulators Framework relies on functions -and operator overloads defined in the -[link accumulators.user_s_guide.the_accumulators_framework.numeric_operators_sub_library -Numeric Operators Sub-Library] for many of its numeric operations. This is so that it -is possible to assign non-standard meanings to arithmetic operations. For instance, when -calculating an average by dividing two integers, the standard integer division behavior -would be mathematically incorrect for most statistical quantities. So rather than use `x / y`, -the Accumulators Framework uses `numeric::fdiv(x, y)`, which does floating-point division -even if both `x` and `y` are integers. - -Another example where the Numeric Operators Sub-Library is useful is when a type does not -define the operator overloads required to use it for some statistical calculations. For instance, -`std::vector<>` does not overload any arithmetic operators, yet it may be useful to use -`std::vector<>` as a sample or variate type. The Numeric Operators Sub-Library -defines the necessary operator overloads in the `boost::numeric::operators` namespace, -which is brought into scope by the Accumulators Framework with a using directive. - -[*Numeric Function Objects and Tag Dispatching] - -How are the numeric function object defined by the Numeric Operators Sub-Library made -to work with types such as `std::vector<>`? The free functions in the `boost::numeric` namespace -are implemented in terms of the function objects in the `boost::numeric::functional` namespace, -so to make `boost::numeric::fdiv()` do something sensible with a `std::vector<>`, for instance, -we'll need to partially specialize the `boost::numeric::functional::fdiv<>` function object. - -The functional objects make use of a technique known as -[@http://www.boost.org/community/generic_programming.html#tag_dispatching ['tag dispatching]] to -select the proper implementation for the given operands. It works as follows: - - namespace boost { namespace numeric { namespace functional - { - // Metafunction for looking up the tag associated with - // a given numeric type T. - template - struct tag - { - // by default, all types have void as a tag type - typedef void type; - }; - - // Forward declaration looks up the tag types of each operand - template< - typename Left - , typename Right - , typename LeftTag = typename tag::type - , typename RightTag = typename tag::type - > - struct fdiv; - }}} - -If you have some user-defined type `MyDouble` for which you would like to customize the behavior -of `numeric::fdiv()`, you would specialize `numeric::functional::fdiv<>` by -first defining a tag type, as shown below: - - namespace boost { namespace numeric { namespace functional - { - // Tag type for MyDouble - struct MyDoubleTag {}; - - // Specialize tag<> for MyDouble. - // This only needs to be done once. - template<> - struct tag - { - typedef MyDoubleTag type; - }; - - // Specify how to divide a MyDouble by an integral count - template - struct fdiv - { - // Define the type of the result - typedef ... result_type; - - result_type operator()(Left & left, Right & right) const - { - return ...; - } - }; - }}} - -Once you have done this, `numeric::fdiv()` will use your specialization -of `numeric::functional::fdiv<>` when the first argument is a `MyDouble` -object. All of the function objects in the Numeric Operators Sub-Library can -be customized in a similar fashion. - -[endsect] - -[endsect] - -[section Concepts] - -[h2 Accumulator Concept] - -In the following table, `Acc` is the type of an accumulator, `acc` and `acc2` are objects of type -`Acc`, and `args` is the name of an argument pack from the _parameter_ library. - -[table Accumulator Requirements - [[[*Expression]] [[*Return type]] [[*Assertion / Note / - Pre- / Post-condition]]] - [[`Acc::result_type`] [['implementation - defined]] [The type returned by `Acc::result()`.]] - [[`Acc acc(args)`] [none] [Construct from an argument pack.]] - [[`Acc acc(acc2)`] [none] [Post: `acc.result(args)` is equivalent - to `acc2.result(args)`]] - [[`acc(args)`] [['unspecified]] []] - [[`acc.on_drop(args)`] [['unspecified]] []] - [[`acc.result(args)`] [`Acc::result_type`] []] -] - -[h2 Feature Concept] - -In the following table, `F` is the type of a feature and `S` is some scalar type. - -[table Feature Requirements - [[[*Expression]] [[*Return type]] [[*Assertion / Note / - Pre- / Post-condition]]] - [[`F::dependencies`] [['unspecified]] [An MPL sequence of other features on - which `F` depends.]] - [[`F::is_weight_accumulator`] [`mpl::true_` or - `mpl::false_`] [`mpl::true_` if the accumulator for - this feature should be made external - when the weight type for the accumulator - set is `external`, `mpl::false_` - otherwise.]] - [[`F::impl`] [['unspecified]] [An _mpl_lambda_expression_ that - returns the type of the accumulator that - implements this feature when passed a - sample type and a weight type.]] -] - -[endsect] - -[endsect] - -[section The Statistical Accumulators Library] - -The Statistical Accumulators Library defines accumulators for incremental statistical -computations. It is built on top of [link accumulators.user_s_guide.the_accumulators_framework -The Accumulator Framework]. - -[section:count count] - -The `count` feature is a simple counter that tracks the -number of samples pushed into the accumulator set. - -[variablelist - [[Result Type] [`` - std::size_t - ``]] - [[Depends On] [['none]]] - [[Variants] [['none]]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _COUNT_HPP_ [headerref boost/accumulators/statistics/count.hpp]] - - #include <_COUNT_HPP_> - -[*Example] - - accumulator_set > acc; - acc(0); - acc(0); - acc(0); - assert(3 == count(acc)); - -[*See also] - -* [classref boost::accumulators::impl::count_impl `count_impl`] - -[endsect] - -[section:covariance covariance] - -The `covariance` feature is an iterative Monte Carlo estimator for the covariance. -It is specified as `tag::covariance<_variate_type_, _variate_tag_>`. - -[variablelist - [[Result Type] [`` - numeric::functional::outer_product< - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - , numeric::functional::fdiv<_variate_type_, std::size_t>::result_type - >::result_type - ``]] - [[Depends On] [`count` \n `mean` \n `mean_of_variates<_variate_type_, _variate_tag_>`]] - [[Variants] [`abstract_covariance`]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [[~variate-tag]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [O(1)]] -] - -[*Headers] -[def _COVARIANCE_HPP_ [headerref boost/accumulators/statistics/covariance.hpp]] -[def _COVARIATE_HPP_ [headerref boost/accumulators/statistics/variates/covariate.hpp]] - - #include <_COVARIANCE_HPP_> - #include <_COVARIATE_HPP_> - -[*Example] - - accumulator_set > > acc; - acc(1., covariate1 = 2.); - acc(1., covariate1 = 4.); - acc(2., covariate1 = 3.); - acc(6., covariate1 = 1.); - assert(covariance(acc) == -1.75); - -[*See also] - -* [classref boost::accumulators::impl::covariance_impl [^covariance_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.mean [^mean]] - -[endsect] - -[section:density density] - -The `tag::density` feature returns a histogram of the sample distribution. For more -implementation details, see [classref boost::accumulators::impl::density_impl [^density_impl]]. - -[variablelist - [[Result Type] [`` - iterator_range< - std::vector< - std::pair< - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - , numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - > - >::iterator - > - ``]] - [[Depends On] [`count` \n `min` \n `max`]] - [[Variants] [['none]]] - [[Initialization Parameters] [`density::cache_size` \n `density::num_bins`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [O(N), when N is `density::num_bins`]] -] - -[*Header] -[def _DENSITY_HPP_ [headerref boost/accumulators/statistics/density.hpp]] - - #include <_DENSITY_HPP_> - -[*Note] - -Results from the `density` accumulator can only be extracted after the number of -samples meets or exceeds the cache size. - -[/ TODO add example ] - -[*See also] - -* [classref boost::accumulators::impl::density_impl [^density_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.min [^min]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.max [^max]] - -[endsect] - -[section:error_of_mean error_of] - -The `error_of` feature calculates the error of the mean feature. It is equal to -`sqrt(variance / (count - 1))`. - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [`count` \n `variance`]] - [[Variants] [`error_of`]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _ERROR_OF_HPP_ [headerref boost/accumulators/statistics/error_of.hpp]] -[def _ERROR_OF_MEAN_HPP_ [headerref boost/accumulators/statistics/error_of_mean.hpp]] - - #include <_ERROR_OF_HPP_> - #include <_ERROR_OF_MEAN_HPP_> - -[*Example] - - accumulator_set > > acc; - acc(1.1); - acc(1.2); - acc(1.3); - assert(0.057735 == error_of(acc)); - -[*See also] - -* [classref boost::accumulators::impl::error_of_mean_impl [^error_of_mean_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.variance [^variance]] - -[endsect] - -[section:extended_p_square extended_p_square] - -Multiple quantile estimation with the extended [^P^2] algorithm. For further -details, see [classref boost::accumulators::impl::extended_p_square_impl [^extended_p_square_impl]]. - -[variablelist - [[Result Type] [`` - boost::iterator_range< - _implementation_defined_ - > - ``]] - [[Depends On] [`count`]] - [[Variants] [['none]]] - [[Initialization Parameters] [`tag::extended_p_square::probabilities`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _EXTENDED_P_SQUARE_HPP_ [headerref boost/accumulators/statistics/extended_p_square.hpp]] - - #include <_EXTENDED_P_SQUARE_HPP_> - -[*Example] - - boost::array probs = {0.001,0.01,0.1,0.25,0.5,0.75,0.9,0.99,0.999}; - accumulator_set > - acc(tag::extended_p_square::probabilities = probs); - - boost::lagged_fibonacci607 rng; // a random number generator - for (int i=0; i<10000; ++i) - acc(rng()); - - BOOST_CHECK_CLOSE(extended_p_square(acc)[0], probs[0], 25); - BOOST_CHECK_CLOSE(extended_p_square(acc)[1], probs[1], 10); - BOOST_CHECK_CLOSE(extended_p_square(acc)[2], probs[2], 5); - - for (std::size_t i=3; i < probs.size(); ++i) - { - BOOST_CHECK_CLOSE(extended_p_square(acc)[i], probs[i], 2); - } - -[*See also] - -* [classref boost::accumulators::impl::extended_p_square_impl [^extended_p_square_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] - -[endsect] - -[section:extended_p_square_quantile extended_p_square_quantile ['and variants]] - -Quantile estimation using the extended [^P^2] algorithm for weighted and unweighted samples. -By default, the calculation is linear and unweighted, but quadratic and weighted variants -are also provided. For further implementation details, see -[classref boost::accumulators::impl::extended_p_square_quantile_impl [^extended_p_square_quantile_impl]]. - -All the variants share the `tag::quantile` feature and can be extracted using the `quantile()` -extractor. - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [weighted variants depend on `weighted_extended_p_square` \n - unweighted variants depend on `extended_p_square`]] - [[Variants] [`extended_p_square_quantile_quadratic` \n - `weighted_extended_p_square_quantile` \n - `weighted_extended_p_square_quantile_quadratic`]] - [[Initialization Parameters] [`tag::extended_p_square::probabilities`]] - [[Accumulator Parameters] [`weight` for the weighted variants]] - [[Extractor Parameters] [`quantile_probability`]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [O(N) where N is the count of probabilities.]] -] - -[*Header] -[def _EXTENDED_P_SQUARE_QUANTILE_HPP_ [headerref boost/accumulators/statistics/extended_p_square_quantile.hpp]] - - #include <_EXTENDED_P_SQUARE_QUANTILE_HPP_> - -[*Example] - - typedef accumulator_set > - accumulator_t; - typedef accumulator_set, double > - accumulator_t_weighted; - typedef accumulator_set > - accumulator_t_quadratic; - typedef accumulator_set, double > - accumulator_t_weighted_quadratic; - - // tolerance - double epsilon = 1; - - // a random number generator - boost::lagged_fibonacci607 rng; - - boost::array probs = { 0.990, 0.991, 0.992, 0.993, 0.994, - 0.995, 0.996, 0.997, 0.998, 0.999 }; - accumulator_t acc(extended_p_square_probabilities = probs); - accumulator_t_weighted acc_weighted(extended_p_square_probabilities = probs); - accumulator_t_quadratic acc2(extended_p_square_probabilities = probs); - accumulator_t_weighted_quadratic acc_weighted2(extended_p_square_probabilities = probs); - - for (int i=0; i<10000; ++i) - { - double sample = rng(); - acc(sample); - acc2(sample); - acc_weighted(sample, weight = 1.); - acc_weighted2(sample, weight = 1.); - } - - for (std::size_t i = 0; i < probs.size() - 1; ++i) - { - BOOST_CHECK_CLOSE( - quantile(acc, quantile_probability = 0.99025 + i*0.001) - , 0.99025 + i*0.001 - , epsilon - ); - BOOST_CHECK_CLOSE( - quantile(acc2, quantile_probability = 0.99025 + i*0.001) - , 0.99025 + i*0.001 - , epsilon - ); - BOOST_CHECK_CLOSE( - quantile(acc_weighted, quantile_probability = 0.99025 + i*0.001) - , 0.99025 + i*0.001 - , epsilon - ); - BOOST_CHECK_CLOSE( - quantile(acc_weighted2, quantile_probability = 0.99025 + i*0.001) - , 0.99025 + i*0.001 - , epsilon - ); - } - -[*See also] - -* [classref boost::accumulators::impl::extended_p_square_quantile_impl [^extended_p_square_quantile_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.extended_p_square [^extended_p_square]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.weighted_extended_p_square [^weighted_extended_p_square]] - -[endsect] - -[section:kurtosis kurtosis] - -The kurtosis of a sample distribution is defined as the ratio of the 4th central moment and the -square of the 2nd central moment (the variance) of the samples, minus 3. The term [^-3] is added -in order to ensure that the normal distribution has zero kurtosis. For more implementation -details, see [classref boost::accumulators::impl::kurtosis_impl [^kurtosis_impl]] - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, _sample_type_>::result_type - ``]] - [[Depends On] [`mean` \n `moment<2>` \n `moment<3>` \n `moment<4>`]] - [[Variants] [['none]]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _KURTOSIS_HPP_ [headerref boost/accumulators/statistics/kurtosis.hpp]] - - #include <_KURTOSIS_HPP_> - -[*Example] - - accumulator_set > acc; - - acc(2); - acc(7); - acc(4); - acc(9); - acc(3); - - BOOST_CHECK_EQUAL( mean(acc), 5 ); - BOOST_CHECK_EQUAL( accumulators::moment<2>(acc), 159./5. ); - BOOST_CHECK_EQUAL( accumulators::moment<3>(acc), 1171./5. ); - BOOST_CHECK_EQUAL( accumulators::moment<4>(acc), 1863 ); - BOOST_CHECK_CLOSE( kurtosis(acc), -1.39965397924, 1e-6 ); - -[*See also] - -* [classref boost::accumulators::impl::kurtosis_impl [^kurtosis_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.mean [^mean]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.moment [^moment]] - -[endsect] - -[section:max max] - -Calculates the maximum value of all the samples. - -[variablelist - [[Result Type] [`` - _sample_type_ - ``]] - [[Depends On] [['none]]] - [[Variants] [['none]]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _MAX_HPP_ [headerref boost/accumulators/statistics/max.hpp]] - - #include <_MAX_HPP_> - -[*Example] - - accumulator_set > acc; - - acc(1); - BOOST_CHECK_EQUAL(1, (max)(acc)); - - acc(0); - BOOST_CHECK_EQUAL(1, (max)(acc)); - - acc(2); - BOOST_CHECK_EQUAL(2, (max)(acc)); - -[*See also] - -* [classref boost::accumulators::impl::max_impl [^max_impl]] - -[endsect] - -[section:mean mean ['and variants]] - -Calculates the mean of samples, weights or variates. The calculation is either -lazy (in the result extractor), or immediate (in the accumulator). The lazy implementation -is the default. For more implementation details, see -[classref boost::accumulators::impl::mean_impl [^mean_impl]] or. -[classref boost::accumulators::impl::immediate_mean_impl [^immediate_mean_impl]] - -[variablelist - [[Result Type] [For samples, `numeric::functional::fdiv<_sample_type_, std::size_t>::result_type` \n - For weights, `numeric::functional::fdiv<_weight_type_, std::size_t>::result_type` \n - For variates, `numeric::functional::fdiv<_variate_type_, std::size_t>::result_type`]] - [[Depends On] [`count` \n - The lazy mean of samples depends on `sum` \n - The lazy mean of weights depends on `sum_of_weights` \n - The lazy mean of variates depends on `sum_of_variates<>`]] - [[Variants] [`mean_of_weights` \n - `mean_of_variates<_variate_type_, _variate_tag_>` \n - `immediate_mean` \n - `immediate_mean_of_weights` \n - `immediate_mean_of_variates<_variate_type_, _variate_tag_>`]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _MEAN_HPP_ [headerref boost/accumulators/statistics/mean.hpp]] - - #include <_MEAN_HPP_> - -[*Example] - - accumulator_set< - int - , stats< - tag::mean - , tag::mean_of_weights - , tag::mean_of_variates - > - , int - > acc; - - acc(1, weight = 2, covariate1 = 3); - BOOST_CHECK_CLOSE(1., mean(acc), 1e-5); - BOOST_CHECK_EQUAL(1u, count(acc)); - BOOST_CHECK_EQUAL(2, sum(acc)); - BOOST_CHECK_CLOSE(2., mean_of_weights(acc), 1e-5); - BOOST_CHECK_CLOSE(3., (accumulators::mean_of_variates(acc)), 1e-5); - - acc(0, weight = 4, covariate1 = 4); - BOOST_CHECK_CLOSE(0.33333333333333333, mean(acc), 1e-5); - BOOST_CHECK_EQUAL(2u, count(acc)); - BOOST_CHECK_EQUAL(2, sum(acc)); - BOOST_CHECK_CLOSE(3., mean_of_weights(acc), 1e-5); - BOOST_CHECK_CLOSE(3.5, (accumulators::mean_of_variates(acc)), 1e-5); - - acc(2, weight = 9, covariate1 = 8); - BOOST_CHECK_CLOSE(1.33333333333333333, mean(acc), 1e-5); - BOOST_CHECK_EQUAL(3u, count(acc)); - BOOST_CHECK_EQUAL(20, sum(acc)); - BOOST_CHECK_CLOSE(5., mean_of_weights(acc), 1e-5); - BOOST_CHECK_CLOSE(5., (accumulators::mean_of_variates(acc)), 1e-5); - - accumulator_set< - int - , stats< - tag::mean(immediate) - , tag::mean_of_weights(immediate) - , tag::mean_of_variates(immediate) - > - , int - > acc2; - - acc2(1, weight = 2, covariate1 = 3); - BOOST_CHECK_CLOSE(1., mean(acc2), 1e-5); - BOOST_CHECK_EQUAL(1u, count(acc2)); - BOOST_CHECK_CLOSE(2., mean_of_weights(acc2), 1e-5); - BOOST_CHECK_CLOSE(3., (accumulators::mean_of_variates(acc2)), 1e-5); - - acc2(0, weight = 4, covariate1 = 4); - BOOST_CHECK_CLOSE(0.33333333333333333, mean(acc2), 1e-5); - BOOST_CHECK_EQUAL(2u, count(acc2)); - BOOST_CHECK_CLOSE(3., mean_of_weights(acc2), 1e-5); - BOOST_CHECK_CLOSE(3.5, (accumulators::mean_of_variates(acc2)), 1e-5); - - acc2(2, weight = 9, covariate1 = 8); - BOOST_CHECK_CLOSE(1.33333333333333333, mean(acc2), 1e-5); - BOOST_CHECK_EQUAL(3u, count(acc2)); - BOOST_CHECK_CLOSE(5., mean_of_weights(acc2), 1e-5); - BOOST_CHECK_CLOSE(5., (accumulators::mean_of_variates(acc2)), 1e-5); - -[*See also] - -* [classref boost::accumulators::impl::mean_impl [^mean_impl]] -* [classref boost::accumulators::impl::immediate_mean_impl [^immediate_mean_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.sum [^sum]] - -[endsect] - -[section:median median ['and variants]] - -Median estimation based on the [^P^2] quantile estimator, the density estimator, or -the [^P^2] cumulative distribution estimator. For more implementation details, see -[classref boost::accumulators::impl::median_impl [^median_impl]], -[classref boost::accumulators::impl::with_density_median_impl [^with_density_median_impl]], -and [classref boost::accumulators::impl::with_p_square_cumulative_distribution_median_impl [^with_p_square_cumulative_distribution_median_impl]]. - -The three median accumulators all satisfy the `tag::median` feature, and can all be -extracted with the `median()` extractor. - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [`median` depends on `p_square_quantile_for_median` \n - `with_density_median` depends on `count` and `density` \n - `with_p_square_cumulative_distribution_median` depends on `p_square_cumulative_distribution`]] - [[Variants] [`with_density_median` \n - `with_p_square_cumulative_distribution_median`]] - [[Initialization Parameters] [`with_density_median` requires `tag::density::cache_size` and `tag::density::num_bins` \n - `with_p_square_cumulative_distribution_median` requires `tag::p_square_cumulative_distribution::num_cells`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [TODO]] -] - -[*Header] -[def _MEDIAN_HPP_ [headerref boost/accumulators/statistics/median.hpp]] - - #include <_MEDIAN_HPP_> - -[*Example] - - // two random number generators - double mu = 1.; - boost::lagged_fibonacci607 rng; - boost::normal_distribution<> mean_sigma(mu,1); - boost::variate_generator > - normal(rng, mean_sigma); - - accumulator_set > acc; - accumulator_set > - acc_dens( density_cache_size = 10000, density_num_bins = 1000 ); - accumulator_set > - acc_cdist( p_square_cumulative_distribution_num_cells = 100 ); - - for (std::size_t i=0; i<100000; ++i) - { - double sample = normal(); - acc(sample); - acc_dens(sample); - acc_cdist(sample); - } - - BOOST_CHECK_CLOSE(1., median(acc), 1.); - BOOST_CHECK_CLOSE(1., median(acc_dens), 1.); - BOOST_CHECK_CLOSE(1., median(acc_cdist), 3.); - -[*See also] - -* [classref boost::accumulators::impl::median_impl [^median_impl]] -* [classref boost::accumulators::impl::with_density_median_impl [^with_density_median_impl]] -* [classref boost::accumulators::impl::with_p_square_cumulative_distribution_median_impl [^with_p_square_cumulative_distribution_median_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.p_square_quantile [^p_square_quantile]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.p_square_cumulative_distribution [^p_square_cumulative_distribution]] - -[endsect] - -[section:min min] - -Calculates the minimum value of all the samples. - -[variablelist - [[Result Type] [`` - _sample_type_ - ``]] - [[Depends On] [['none]]] - [[Variants] [['none]]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _MIN_HPP_ [headerref boost/accumulators/statistics/min.hpp]] - - #include <_MIN_HPP_> - -[*Example] - - accumulator_set > acc; - - acc(1); - BOOST_CHECK_EQUAL(1, (min)(acc)); - - acc(0); - BOOST_CHECK_EQUAL(0, (min)(acc)); - - acc(2); - BOOST_CHECK_EQUAL(0, (min)(acc)); - -[*See also] - -* [classref boost::accumulators::impl::min_impl [^min_impl]] - -[endsect] - -[section:moment moment] - -Calculates the N-th moment of the samples, which is defined as the sum of the N-th power of the -samples over the count of samples. - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [`count`]] - [[Variants] [['none]]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _MOMENT_HPP_ [headerref boost/accumulators/statistics/moment.hpp]] - - #include <_MOMENT_HPP_> - -[*Example] - - accumulator_set > > acc1; - - acc1(2); // 4 - acc1(4); // 16 - acc1(5); // + 25 - // = 45 / 3 = 15 - - BOOST_CHECK_CLOSE(15., accumulators::moment<2>(acc1), 1e-5); - - accumulator_set > > acc2; - - acc2(2); // 32 - acc2(3); // 243 - acc2(4); // 1024 - acc2(5); // + 3125 - // = 4424 / 4 = 1106 - - BOOST_CHECK_CLOSE(1106., accumulators::moment<5>(acc2), 1e-5); - -[*See also] - -* [classref boost::accumulators::impl::moment_impl [^moment_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] - -[endsect] - -[section:p_square_cumulative_distribution p_square_cumulative_distribution] - -Histogram calculation of the cumulative distribution with the [^P^2] algorithm. -For more implementation details, see -[classref boost::accumulators::impl::p_square_cumulative_distribution_impl [^p_square_cumulative_distribution_impl]] - -[variablelist - [[Result Type] [`` - iterator_range< - std::vector< - std::pair< - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - , numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - > - >::iterator - > - ``]] - [[Depends On] [`count`]] - [[Variants] [['none]]] - [[Initialization Parameters] [`tag::p_square_cumulative_distribution::num_cells`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [O(N) where N is `num_cells`]] -] - -[*Header] -[def _P_SQUARE_CUMULATIVE_DISTRIBUTION_HPP_ [headerref boost/accumulators/statistics/p_square_cumul_dist.hpp]] - - #include <_P_SQUARE_CUMULATIVE_DISTRIBUTION_HPP_> - -[*Example] - - // tolerance in % - double epsilon = 3; - - typedef accumulator_set > accumulator_t; - - accumulator_t acc(tag::p_square_cumulative_distribution::num_cells = 100); - - // two random number generators - boost::lagged_fibonacci607 rng; - boost::normal_distribution<> mean_sigma(0,1); - boost::variate_generator > normal(rng, mean_sigma); - - for (std::size_t i=0; i<100000; ++i) - { - acc(normal()); - } - - typedef iterator_range >::iterator > histogram_type; - histogram_type histogram = p_square_cumulative_distribution(acc); - - for (std::size_t i = 0; i < histogram.size(); ++i) - { - // problem with small results: epsilon is relative (in percent), not absolute! - if ( histogram[i].second > 0.001 ) - BOOST_CHECK_CLOSE( 0.5 * (1.0 + erf( histogram[i].first / sqrt(2.0) )), histogram[i].second, epsilon ); - } - -[*See also] - -* [classref boost::accumulators::impl::p_square_cumulative_distribution_impl [^p_square_cumulative_distribution_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] - -[endsect] - -[section:p_square_quantile p_square_quantile ['and variants]] - -Single quantile estimation with the [^P^2] algorithm. For more implementation details, see -[classref boost::accumulators::impl::p_square_quantile_impl [^p_square_quantile_impl]] - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [`count`]] - [[Variants] [`p_square_quantile_for_median`]] - [[Initialization Parameters] [`quantile_probability`, which defaults to `0.5`. - (Note: for `p_square_quantile_for_median`, the `quantile_probability` - parameter is ignored and is always `0.5`.)]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _P_SQUARE_QUANTILE_HPP_ [headerref boost/accumulators/statistics/p_square_quantile.hpp]] - - #include <_P_SQUARE_QUANTILE_HPP_> - -[*Example] - - typedef accumulator_set > accumulator_t; - - // tolerance in % - double epsilon = 1; - - // a random number generator - boost::lagged_fibonacci607 rng; - - accumulator_t acc0(quantile_probability = 0.001); - accumulator_t acc1(quantile_probability = 0.01 ); - accumulator_t acc2(quantile_probability = 0.1 ); - accumulator_t acc3(quantile_probability = 0.25 ); - accumulator_t acc4(quantile_probability = 0.5 ); - accumulator_t acc5(quantile_probability = 0.75 ); - accumulator_t acc6(quantile_probability = 0.9 ); - accumulator_t acc7(quantile_probability = 0.99 ); - accumulator_t acc8(quantile_probability = 0.999); - - for (int i=0; i<100000; ++i) - { - double sample = rng(); - acc0(sample); - acc1(sample); - acc2(sample); - acc3(sample); - acc4(sample); - acc5(sample); - acc6(sample); - acc7(sample); - acc8(sample); - } - - BOOST_CHECK_CLOSE( p_square_quantile(acc0), 0.001, 15*epsilon ); - BOOST_CHECK_CLOSE( p_square_quantile(acc1), 0.01 , 5*epsilon ); - BOOST_CHECK_CLOSE( p_square_quantile(acc2), 0.1 , epsilon ); - BOOST_CHECK_CLOSE( p_square_quantile(acc3), 0.25 , epsilon ); - BOOST_CHECK_CLOSE( p_square_quantile(acc4), 0.5 , epsilon ); - BOOST_CHECK_CLOSE( p_square_quantile(acc5), 0.75 , epsilon ); - BOOST_CHECK_CLOSE( p_square_quantile(acc6), 0.9 , epsilon ); - BOOST_CHECK_CLOSE( p_square_quantile(acc7), 0.99 , epsilon ); - BOOST_CHECK_CLOSE( p_square_quantile(acc8), 0.999, epsilon ); - -[*See also] - -* [classref boost::accumulators::impl::p_square_quantile_impl [^p_square_quantile_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] - -[endsect] - -[section:peaks_over_threshold peaks_over_threshold ['and variants]] - -Peaks Over Threshold method for quantile and tail mean estimation. For implementation -details, see [classref boost::accumulators::impl::peaks_over_threshold_impl [^peaks_over_threshold_impl]] -and [classref boost::accumulators::impl::peaks_over_threshold_prob_impl [^peaks_over_threshold_prob_impl]]. - -Both `tag::peaks_over_threshold` and `tag::peaks_over_threshold_prob<>` satisfy the `tag::abstract_peaks_over_threshold` -feature, and can be extracted with the `peaks_over_threshold()` extractor. The result is a 3-tuple representing -the fit parameters `u_bar`, `beta_bar` and `xi_hat`. - -[variablelist - [[Result Type] [`` - boost::tuple< - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type // u_bar - , numeric::functional::fdiv<_sample_type_, std::size_t>::result_type // beta_bar - , numeric::functional::fdiv<_sample_type_, std::size_t>::result_type // xi_hat - > - ``]] - [[Depends On] [`count` \n - In addition, `tag::peaks_over_threshold_prob<>` depends on `tail<_left_or_right_>`]] - [[Variants] [`peaks_over_threshold_prob<_left_or_right_>`]] - [[Initialization Parameters] [ `tag::peaks_over_threshold::threshold_value` \n - `tag::peaks_over_threshold_prob::threshold_probability` \n - `tag::tail<_left_or_right_>::cache_size` ]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [TODO]] -] - -[*Header] -[def _PEAKS_OVER_THRESHOLD_HPP_ [headerref boost/accumulators/statistics/peaks_over_threshold.hpp]] - - #include <_PEAKS_OVER_THRESHOLD_HPP_> - -[*Example] - -See example for [link accumulators.user_s_guide.the_statistical_accumulators_library.pot_quantile [^pot_quantile]]. - -[*See also] - -* [classref boost::accumulators::impl::peaks_over_threshold_impl [^peaks_over_threshold_impl]] -* [classref boost::accumulators::impl::peaks_over_threshold_prob_impl [^peaks_over_threshold_prob_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.tail [^tail]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.pot_quantile [^pot_quantile]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.pot_tail_mean [^pot_tail_mean]] - -[endsect] - -[section:pot_quantile pot_quantile ['and variants]] - -Quantile estimation based on Peaks over Threshold method (for both left and right tails). For -implementation details, see [classref boost::accumulators::impl::pot_quantile_impl [^pot_quantile_impl]]. - -Both `tag::pot_quantile<_left_or_right_>` and `tag::pot_quantile_prob<_left_or_right_>` satisfy the -`tag::quantile` feature and can be extracted using the `quantile()` extractor. - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [`pot_quantile<_left_or_right_>` depends on `peaks_over_threshold<_left_or_right_>` \n - `pot_quantile_prob<_left_or_right_>` depends on `peaks_over_threshold_prob<_left_or_right_>` ]] - [[Variants] [`pot_quantile_prob<_left_or_right_>`]] - [[Initialization Parameters] [ `tag::peaks_over_threshold::threshold_value` \n - `tag::peaks_over_threshold_prob::threshold_probability` \n - `tag::tail<_left_or_right_>::cache_size` ]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [`quantile_probability`]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [TODO]] -] - -[*Header] -[def _POT_QUANTILE_HPP_ [headerref boost/accumulators/statistics/pot_quantile.hpp]] - - #include <_POT_QUANTILE_HPP_> - -[*Example] - - // tolerance in % - double epsilon = 1.; - - double alpha = 0.999; - double threshold_probability = 0.99; - double threshold = 3.; - - // two random number generators - boost::lagged_fibonacci607 rng; - boost::normal_distribution<> mean_sigma(0,1); - boost::exponential_distribution<> lambda(1); - boost::variate_generator > normal(rng, mean_sigma); - boost::variate_generator > exponential(rng, lambda); - - accumulator_set(with_threshold_value)> > acc1( - tag::peaks_over_threshold::threshold_value = threshold - ); - accumulator_set(with_threshold_probability)> > acc2( - tag::tail::cache_size = 2000 - , tag::peaks_over_threshold_prob::threshold_probability = threshold_probability - ); - - threshold_probability = 0.995; - threshold = 5.; - - accumulator_set(with_threshold_value)> > acc3( - tag::peaks_over_threshold::threshold_value = threshold - ); - accumulator_set(with_threshold_probability)> > acc4( - tag::tail::cache_size = 2000 - , tag::peaks_over_threshold_prob::threshold_probability = threshold_probability - ); - - for (std::size_t i = 0; i < 100000; ++i) - { - double sample = normal(); - acc1(sample); - acc2(sample); - } - - for (std::size_t i = 0; i < 100000; ++i) - { - double sample = exponential(); - acc3(sample); - acc4(sample); - } - - BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = alpha), 3.090232, epsilon ); - BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = alpha), 3.090232, epsilon ); - - BOOST_CHECK_CLOSE( quantile(acc3, quantile_probability = alpha), 6.908, epsilon ); - BOOST_CHECK_CLOSE( quantile(acc4, quantile_probability = alpha), 6.908, epsilon ); - -[*See also] - -* [classref boost::accumulators::impl::pot_quantile_impl [^pot_quantile_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.peaks_over_threshold [^peaks_over_threshold]] - -[endsect] - -[section:pot_tail_mean pot_tail_mean] - -Estimation of the (coherent) tail mean based on the peaks over threshold method (for both left and right tails). -For implementation details, see [classref boost::accumulators::impl::pot_tail_mean_impl [^pot_tail_mean_impl]]. - -Both `tag::pot_tail_mean<_left_or_right_>` and `tag::pot_tail_mean_prob<_left_or_right_>` satisfy the -`tag::tail_mean` feature and can be extracted using the `tail_mean()` extractor. - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [`pot_tail_mean<_left_or_right_>` depends on `peaks_over_threshold<_left_or_right_>` - and `pot_quantile<_left_or_right_>` \n - `pot_tail_mean_prob<_left_or_right_>` depends on `peaks_over_threshold_prob<_left_or_right_>` - and `pot_quantile_prob<_left_or_right_>` ]] - [[Variants] [`pot_tail_mean_prob<_left_or_right_>`]] - [[Initialization Parameters] [ `tag::peaks_over_threshold::threshold_value` \n - `tag::peaks_over_threshold_prob::threshold_probability` \n - `tag::tail<_left_or_right_>::cache_size` ]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [`quantile_probability`]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [TODO]] -] - -[*Header] -[def _POT_TAIL_MEAN_HPP_ [headerref boost/accumulators/statistics/pot_tail_mean.hpp]] - - #include <_POT_TAIL_MEAN_HPP_> - -[*Example] - - // TODO - -[*See also] - -* [classref boost::accumulators::impl::pot_tail_mean_impl [^pot_tail_mean_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.peaks_over_threshold [^peaks_over_threshold]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.pot_quantile [^pot_quantile]] - -[endsect] - -[section:rolling_count rolling_count] - -The rolling count is the current number of elements in the rolling window. - -[variablelist - [[Result Type] [``std::size_t``]] - [[Depends On] [`rolling_window_plus1`]] - [[Variants] [['none]]] - [[Initialization Parameters] [`tag::rolling_window::window_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _ROLLING_COUNT_HPP_ [headerref boost/accumulators/statistics/rolling_count.hpp]] - - #include <_ROLLING_COUNT_HPP_> - -[*Example] - - accumulator_set > acc(tag::rolling_window::window_size = 3); - - BOOST_CHECK_EQUAL(0u, rolling_count(acc)); - - acc(1); - BOOST_CHECK_EQUAL(1u, rolling_count(acc)); - - acc(1); - BOOST_CHECK_EQUAL(2u, rolling_count(acc)); - - acc(1); - BOOST_CHECK_EQUAL(3u, rolling_count(acc)); - - acc(1); - BOOST_CHECK_EQUAL(3u, rolling_count(acc)); - - acc(1); - BOOST_CHECK_EQUAL(3u, rolling_count(acc)); - -[*See also] - -* [classref boost::accumulators::impl::rolling_count_impl [^rolling_count_impl]] - -[endsect] - -[section:rolling_sum rolling_sum] - -The rolling sum is the sum of the last /N/ samples. - -[variablelist - [[Result Type] [``_sample_type_``]] - [[Depends On] [`rolling_window_plus1`]] - [[Variants] [['none]]] - [[Initialization Parameters] [`tag::rolling_window::window_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _ROLLING_SUM_HPP_ [headerref boost/accumulators/statistics/rolling_sum.hpp]] - - #include <_ROLLING_SUM_HPP_> - -[*Example] - - accumulator_set > acc(tag::rolling_window::window_size = 3); - - BOOST_CHECK_EQUAL(0, rolling_sum(acc)); - - acc(1); - BOOST_CHECK_EQUAL(1, rolling_sum(acc)); - - acc(2); - BOOST_CHECK_EQUAL(3, rolling_sum(acc)); - - acc(3); - BOOST_CHECK_EQUAL(6, rolling_sum(acc)); - - acc(4); - BOOST_CHECK_EQUAL(9, rolling_sum(acc)); - - acc(5); - BOOST_CHECK_EQUAL(12, rolling_sum(acc)); - -[*See also] - -* [classref boost::accumulators::impl::rolling_sum_impl [^rolling_sum_impl]] - -[endsect] - -[section:rolling_mean rolling_mean] - -The rolling mean is the mean over the last /N/ samples. It is computed by dividing -the rolling sum by the rolling count. - -Lazy or iterative calculation of the mean over the last /N/ samples. The lazy calculation is associated with the `tag::lazy_rolling_mean` -feature, and the iterative calculation (which is the default) with the `tag::immediate_rolling_mean` feature. Both can be extracted -using the `tag::rolling_mean()` extractor. For more implementation details, see -[classref boost::accumulators::impl::lazy_rolling_mean_impl [^lazy_rolling_mean_impl]] and -[classref boost::accumulators::impl::immediate_rolling_mean_impl [^immediate_rolling_mean_impl]] - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [`lazy_rolling_mean` depends on `rolling_sum` and `rolling_count` \n - `immediate_rolling_mean` depends on `rolling_count`]] - [[Variants] [`lazy_rolling_mean` (a.k.a. `rolling_mean(lazy))` \n - `immediate_rolling_mean` (a.k.a. `rolling_mean(immediate)`)]] - [[Initialization Parameters] [`tag::rolling_window::window_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _ROLLING_MEAN_HPP_ [headerref boost/accumulators/statistics/rolling_mean.hpp]] - - #include <_ROLLING_MEAN_HPP_> - -[*Example] - - accumulator_set > acc(tag::rolling_window::window_size = 5); - - acc(1); - acc(2); - acc(3); - - BOOST_CHECK_CLOSE( rolling_mean(acc), 2.0, 1e-6 ); - - acc(4); - acc(5); - acc(6); - acc(7); - - BOOST_CHECK_CLOSE( rolling_mean(acc), 5.0, 1e-6 ); - -[*See also] - -* [classref boost::accumulators::impl::lazy_rolling_mean_impl [^lazy_rolling_mean_impl]] -* [classref boost::accumulators::impl::immediate_rolling_mean_impl [^immediate_rolling_mean_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.rolling_count [^rolling_count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.rolling_sum [^rolling_sum]] - -[endsect] - -[section:rolling_moment rolling_moment] - -rolling_moment calculates the /M/-th moment of the samples, which is defined as the sum of the /M/-th power of the samples over the count of samples, over the last /N/ samples. - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [['none]]] - [[Variants] [['none]]] - [[Initialization Parameters] [`tag::rolling_window::window_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _ROLLING_MOMENT_HPP_ [headerref boost/accumulators/statistics/rolling_moment.hpp]] - - #include <_ROLLING_MOMENT_HPP_> - -[*Example] - - accumulator_set > > acc(tag::rolling_window::window_size = 3); - - acc(2); - acc(4); - - BOOST_CHECK_CLOSE( rolling_moment<2>(acc), (4.0 + 16.0)/2, 1e-5 ); - - acc(5); - acc(6); - - BOOST_CHECK_CLOSE( rolling_moment<2>(acc), (16.0 + 25.0 + 36.0)/3, 1e-5 ); - -[*See also] - -* [classref boost::accumulators::impl::rolling_moment_impl [^rolling_moment_impl]] - -[endsect] - -[section:rolling_variance rolling_variance] - -Lazy or iterative calculation of the variance over the last /N/ samples. The lazy calculation is associated with the `tag::lazy_rolling_variance` -feature, and the iterative calculation with the `tag::immediate_rolling_variance` feature. Both can be extracted using the `tag::rolling_variance()` extractor. -For more implementation details, see -[classref boost::accumulators::impl::lazy_rolling_variance_impl [^lazy_rolling_variance_impl]] and -[classref boost::accumulators::impl::immediate_rolling_variance_impl [^immediate_rolling_variance_impl]] - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [`lazy_rolling_variance` depends on `rolling_moment<2>`, `rolling_count` and `rolling_mean` \n - `immediate_rolling_variance` depends on `rolling_count` and `immediate_rolling_mean`]] - [[Variants] [`lazy_rolling_variance` (a.k.a. `rolling_variance(lazy))` \n - `immediate_rolling_variance` (a.k.a. `rolling_variance(immediate)`)]] - [[Initialization Parameters] [`tag::rolling_window::window_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _ROLLING_VARIANCE_HPP_ [headerref boost/accumulators/statistics/rolling_variance.hpp]] - - #include <_ROLLING_VARIANCE_HPP_> - -[*Example] - - accumulator_set > acc(tag::rolling_window::window_size = 4); - - acc(1.2); - - BOOST_CHECK_CLOSE( rolling_variance(acc), 0.0, 1e-10 ); // variance is not defined for a single sample - - acc(2.3); - acc(3.4); - - BOOST_CHECK_CLOSE( rolling_variance(acc), 1.21, 1e-10 ); // variance over samples 1-3 - - acc(4.5); - acc(0.4); - acc(2.2); - acc(7.1); - - BOOST_CHECK_CLOSE( rolling_variance(acc), 8.41666666666667, 1e-10 ); // variance over samples 4-7 - -[*See also] - -* [classref boost::accumulators::impl::lazy_rolling_variance_impl [^lazy_rolling_variance_impl]] -* [classref boost::accumulators::impl::immediate_rolling_variance_impl [^immediate_rolling_variance_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.rolling_count [^rolling_count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.rolling_mean [^rolling_mean]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.immediate_rolling_mean [^immediate_rolling_mean]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.rolling_moment [^rolling_moment]] - -[endsect] - - -[section:skewness skewness] - -The skewness of a sample distribution is defined as the ratio of the 3rd central moment and the [^3/2]-th power -of the 2nd central moment (the variance) of the samples 3. For implementation details, see -[classref boost::accumulators::impl::skewness_impl [^skewness_impl]]. - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, _sample_type_>::result_type - ``]] - [[Depends On] [`mean` \n `moment<2>` \n `moment<3>`]] - [[Variants] [['none]]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _SKEWNESS_HPP_ [headerref boost/accumulators/statistics/skewness.hpp]] - - #include <_SKEWNESS_HPP_> - -[*Example] - - accumulator_set > acc2; - - acc2(2); - acc2(7); - acc2(4); - acc2(9); - acc2(3); - - BOOST_CHECK_EQUAL( mean(acc2), 5 ); - BOOST_CHECK_EQUAL( accumulators::moment<2>(acc2), 159./5. ); - BOOST_CHECK_EQUAL( accumulators::moment<3>(acc2), 1171./5. ); - BOOST_CHECK_CLOSE( skewness(acc2), 0.406040288214, 1e-6 ); - -[*See also] - -* [classref boost::accumulators::impl::skewness_impl [^skewness_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.mean [^mean]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.moment [^moment]] - -[endsect] - -[section:sum sum ['and variants]] - -For summing the samples, weights or variates. The default implementation uses the standard sum operation, -but variants using the Kahan summation algorithm are also provided. - -[variablelist - [[Result Type] [`_sample_type_` for summing samples \n - `_weight_type_` for summing weights \n - `_variate_type_` for summing variates]] - [[Depends On] [['none]]] - [[Variants] [`tag::sum` \n - `tag::sum_of_weights` \n - `tag::sum_of_variates<_variate_type_, _variate_tag_>` \n - `tag::sum_kahan` (a.k.a. `tag::sum(kahan)`) \n - `tag::sum_of_weights_kahan` (a.k.a. `tag::sum_of_weights(kahan)`) \n - `tag::sum_of_variates_kahan<_variate_type_, _variate_tag_>` \n]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [`weight` for summing weights \n - `_variate_tag_` for summing variates]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1). Note that the Kahan sum performs four floating-point sum - operations per accumulated value, whereas the naive sum - performs only one.]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _SUM_HPP_ [headerref boost/accumulators/statistics/sum.hpp]] -[def _SUM_KAHAN_HPP_ [headerref boost/accumulators/statistics/sum_kahan.hpp]] - - #include <_SUM_HPP_> - #include <_SUM_KAHAN_HPP_> - -[*Example] - - accumulator_set< - int - , stats< - tag::sum - , tag::sum_of_weights - , tag::sum_of_variates - > - , int - > acc; - - acc(1, weight = 2, covariate1 = 3); - BOOST_CHECK_EQUAL(2, sum(acc)); // weighted sample = 1 * 2 - BOOST_CHECK_EQUAL(2, sum_of_weights(acc)); - BOOST_CHECK_EQUAL(3, sum_of_variates(acc)); - - acc(2, weight = 4, covariate1 = 6); - BOOST_CHECK_EQUAL(10, sum(acc)); // weighted sample = 2 * 4 - BOOST_CHECK_EQUAL(6, sum_of_weights(acc)); - BOOST_CHECK_EQUAL(9, sum_of_variates(acc)); - - acc(3, weight = 6, covariate1 = 9); - BOOST_CHECK_EQUAL(28, sum(acc)); // weighted sample = 3 * 6 - BOOST_CHECK_EQUAL(12, sum_of_weights(acc)); - BOOST_CHECK_EQUAL(18, sum_of_variates(acc)); - - // demonstrate Kahan summation - accumulator_set > acc; - BOOST_CHECK_EQUAL(0.0f, sum_kahan(acc)); - for (size_t i = 0; i < 1e6; ++i) { - acc(1e-6f); - } - BOOST_CHECK_EQUAL(1.0f, sum_kahan(acc)); - -[*See also] - -* [classref boost::accumulators::impl::sum_impl [^sum_impl]] -* [classref boost::accumulators::impl::sum_kahan_impl [^sum_kahan_impl]] - -[endsect] - -[section:tail tail] - -Tracks the largest or smallest [^N] values. `tag::tail` tracks the largest [^N], -and `tag::tail` tracks the smallest. The parameter [^N] is specified with the -`tag::tail<_left_or_right_>::cache_size` initialization parameter. For implementation details, see -[classref boost::accumulators::impl::tail_impl [^tail_impl]]. - -Both `tag::tail` and `tag::tail` satisfy the `tag::abstract_tail` feature and -can be extracted with the `tail()` extractor. - -[variablelist - [[Result Type] [`` - boost::iterator_range< - boost::reverse_iterator< - boost::permutation_iterator< - std::vector<_sample_type_>::const_iterator // samples - , std::vector::iterator // indices - > - > - > - ``]] - [[Depends On] [['none]]] - [[Variants] [`abstract_tail`]] - [[Initialization Parameters] [`tag::tail<_left_or_right_>::cache_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(log N), where N is the cache size]] - [[Extractor Complexity] [O(N log N), where N is the cache size]] -] - -[*Header] -[def _TAIL_HPP_ [headerref boost/accumulators/statistics/tail.hpp]] - - #include <_TAIL_HPP_> - -[*Example] - -See the Example for [link accumulators.user_s_guide.the_statistical_accumulators_library.tail_variate [^tail_variate]]. - -[*See also] - -* [classref boost::accumulators::impl::tail_impl [^tail_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.tail_variate [^tail_variate]] - -[endsect] - -[section:coherent_tail_mean coherent_tail_mean] - -Estimation of the coherent tail mean based on order statistics (for both left and right tails). -The left coherent tail mean feature is `tag::coherent_tail_mean`, and the right coherent -tail mean feature is `tag::coherent_tail_mean`. They both share the `tag::tail_mean` feature -and can be extracted with the `tail_mean()` extractor. For more implementation details, see -[classref boost::accumulators::impl::coherent_tail_mean_impl [^coherent_tail_mean_impl]] - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [`count` \n `quantile` \n `non_coherent_tail_mean<_left_or_right_>`]] - [[Variants] [['none]]] - [[Initialization Parameters] [`tag::tail<_left_or_right_>::cache_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [`quantile_probability`]] - [[Accumulator Complexity] [O(log N), where N is the cache size]] - [[Extractor Complexity] [O(N log N), where N is the cache size]] -] - -[*Header] -[def _TAIL_MEAN_HPP_ [headerref boost/accumulators/statistics/tail_mean.hpp]] - - #include <_TAIL_MEAN_HPP_> - -[*Example] - -See the example for -[link accumulators.user_s_guide.the_statistical_accumulators_library.non_coherent_tail_mean [^non_coherent_tail_mean]]. - -[*See also] - -* [classref boost::accumulators::impl::coherent_tail_mean_impl [^coherent_tail_mean_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.extended_p_square_quantile [^extended_p_square_quantile]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.pot_quantile [^pot_quantile]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.tail_quantile [^tail_quantile]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.non_coherent_tail_mean [^non_coherent_tail_mean]] - -[endsect] - -[section:non_coherent_tail_mean non_coherent_tail_mean] - -Estimation of the (non-coherent) tail mean based on order statistics (for both left and right tails). -The left non-coherent tail mean feature is `tag::non_coherent_tail_mean`, and the right non-choherent -tail mean feature is `tag::non_coherent_tail_mean`. They both share the `tag::abstract_non_coherent_tail_mean` -feature and can be extracted with the `non_coherent_tail_mean()` extractor. For more implementation details, see -[classref boost::accumulators::impl::non_coherent_tail_mean_impl [^non_coherent_tail_mean_impl]] - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [`count` \n `tail<_left_or_right_>`]] - [[Variants] [`abstract_non_coherent_tail_mean`]] - [[Initialization Parameters] [`tag::tail<_left_or_right_>::cache_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [`quantile_probability`]] - [[Accumulator Complexity] [O(log N), where N is the cache size]] - [[Extractor Complexity] [O(N log N), where N is the cache size]] -] - -[*Header] -[def _TAIL_MEAN_HPP_ [headerref boost/accumulators/statistics/tail_mean.hpp]] - - #include <_TAIL_MEAN_HPP_> - -[*Example] - - // tolerance in % - double epsilon = 1; - - std::size_t n = 100000; // number of MC steps - std::size_t c = 10000; // cache size - - typedef accumulator_set, tag::tail_quantile > > accumulator_t_right1; - typedef accumulator_set, tag::tail_quantile > > accumulator_t_left1; - typedef accumulator_set, tag::tail_quantile > > accumulator_t_right2; - typedef accumulator_set, tag::tail_quantile > > accumulator_t_left2; - - accumulator_t_right1 acc0( right_tail_cache_size = c ); - accumulator_t_left1 acc1( left_tail_cache_size = c ); - accumulator_t_right2 acc2( right_tail_cache_size = c ); - accumulator_t_left2 acc3( left_tail_cache_size = c ); - - // a random number generator - boost::lagged_fibonacci607 rng; - - for (std::size_t i = 0; i < n; ++i) - { - double sample = rng(); - acc0(sample); - acc1(sample); - acc2(sample); - acc3(sample); - } - - // check uniform distribution - BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc0, quantile_probability = 0.95), 0.975, epsilon ); - BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc0, quantile_probability = 0.975), 0.9875, epsilon ); - BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc0, quantile_probability = 0.99), 0.995, epsilon ); - BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc0, quantile_probability = 0.999), 0.9995, epsilon ); - BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc1, quantile_probability = 0.05), 0.025, epsilon ); - BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc1, quantile_probability = 0.025), 0.0125, epsilon ); - BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc1, quantile_probability = 0.01), 0.005, 5 ); - BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc1, quantile_probability = 0.001), 0.0005, 10 ); - BOOST_CHECK_CLOSE( tail_mean(acc2, quantile_probability = 0.95), 0.975, epsilon ); - BOOST_CHECK_CLOSE( tail_mean(acc2, quantile_probability = 0.975), 0.9875, epsilon ); - BOOST_CHECK_CLOSE( tail_mean(acc2, quantile_probability = 0.99), 0.995, epsilon ); - BOOST_CHECK_CLOSE( tail_mean(acc2, quantile_probability = 0.999), 0.9995, epsilon ); - BOOST_CHECK_CLOSE( tail_mean(acc3, quantile_probability = 0.05), 0.025, epsilon ); - BOOST_CHECK_CLOSE( tail_mean(acc3, quantile_probability = 0.025), 0.0125, epsilon ); - BOOST_CHECK_CLOSE( tail_mean(acc3, quantile_probability = 0.01), 0.005, 5 ); - BOOST_CHECK_CLOSE( tail_mean(acc3, quantile_probability = 0.001), 0.0005, 10 ); - -[*See also] - -* [classref boost::accumulators::impl::non_coherent_tail_mean_impl [^non_coherent_tail_mean_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.tail [^tail]] - -[endsect] - -[section:tail_quantile tail_quantile] - -Tail quantile estimation based on order statistics (for both left and right tails). -The left tail quantile feature is `tag::tail_quantile`, and the right -tail quantile feature is `tag::tail_quantile`. They both share the `tag::quantile` -feature and can be extracted with the `quantile()` extractor. For more implementation details, see -[classref boost::accumulators::impl::tail_quantile_impl [^tail_quantile_impl]] - -[variablelist - [[Result Type] [`` - _sample_type_ - ``]] - [[Depends On] [`count` \n `tail<_left_or_right_>`]] - [[Variants] [['none]]] - [[Initialization Parameters] [`tag::tail<_left_or_right_>::cache_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [`quantile_probability`]] - [[Accumulator Complexity] [O(log N), where N is the cache size]] - [[Extractor Complexity] [O(N log N), where N is the cache size]] -] - -[*Header] -[def _TAIL_QUANTILE_HPP_ [headerref boost/accumulators/statistics/tail_quantile.hpp]] - - #include <_TAIL_QUANTILE_HPP_> - -[*Example] - - // tolerance in % - double epsilon = 1; - - std::size_t n = 100000; // number of MC steps - std::size_t c = 10000; // cache size - - typedef accumulator_set > > accumulator_t_right; - typedef accumulator_set > > accumulator_t_left; - - accumulator_t_right acc0( tag::tail::cache_size = c ); - accumulator_t_right acc1( tag::tail::cache_size = c ); - accumulator_t_left acc2( tag::tail::cache_size = c ); - accumulator_t_left acc3( tag::tail::cache_size = c ); - - // two random number generators - boost::lagged_fibonacci607 rng; - boost::normal_distribution<> mean_sigma(0,1); - boost::variate_generator > normal(rng, mean_sigma); - - for (std::size_t i = 0; i < n; ++i) - { - double sample1 = rng(); - double sample2 = normal(); - acc0(sample1); - acc1(sample2); - acc2(sample1); - acc3(sample2); - } - - // check uniform distribution - BOOST_CHECK_CLOSE( quantile(acc0, quantile_probability = 0.95 ), 0.95, epsilon ); - BOOST_CHECK_CLOSE( quantile(acc0, quantile_probability = 0.975), 0.975, epsilon ); - BOOST_CHECK_CLOSE( quantile(acc0, quantile_probability = 0.99 ), 0.99, epsilon ); - BOOST_CHECK_CLOSE( quantile(acc0, quantile_probability = 0.999), 0.999, epsilon ); - BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.05 ), 0.05, 2 ); - BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.025), 0.025, 2 ); - BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.01 ), 0.01, 3 ); - BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.001), 0.001, 20 ); - - // check standard normal distribution - BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = 0.975), 1.959963, epsilon ); - BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = 0.999), 3.090232, epsilon ); - BOOST_CHECK_CLOSE( quantile(acc3, quantile_probability = 0.025), -1.959963, epsilon ); - BOOST_CHECK_CLOSE( quantile(acc3, quantile_probability = 0.001), -3.090232, epsilon ); - -[*See also] - -* [classref boost::accumulators::impl::tail_quantile_impl [^tail_quantile_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.tail [^tail]] - -[endsect] - -[section:tail_variate tail_variate] - -Tracks the covariates of largest or smallest [^N] samples. -`tag::tail_variate<_variate_type_, _variate_tag_, right>` tracks the covariate associated with -_variate_tag_ for the largest [^N], and `tag::tail_variate<_variate_type_, _variate_tag_, left>` -for the smallest. The parameter [^N] is specified with the `tag::tail<_left_or_right_>::cache_size` -initialization parameter. For implementation details, see -[classref boost::accumulators::impl::tail_variate_impl [^tail_variate_impl]]. - -Both `tag::tail_variate<_variate_type_, _variate_tag_, right>` and -`tag::tail_variate<_variate_type_, _variate_tag_, left>` satisfy the `tag::abstract_tail_variate` feature -and can be extracted with the `tail_variate()` extractor. - -[variablelist - [[Result Type] [`` - boost::iterator_range< - boost::reverse_iterator< - boost::permutation_iterator< - std::vector<_variate_type_>::const_iterator // variates - , std::vector::iterator // indices - > - > - > - ``]] - [[Depends On] [`tail<_left_or_right_>`]] - [[Variants] [`abstract_tail_variate`]] - [[Initialization Parameters] [`tag::tail<_left_or_right_>::cache_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(log N), where N is the cache size]] - [[Extractor Complexity] [O(N log N), where N is the cache size]] -] - -[*Header] -[def _TAIL_VARIATE_HPP_ [headerref boost/accumulators/statistics/tail_variate.hpp]] - - #include <_TAIL_VARIATE_HPP_> - -[*Example] - - accumulator_set > > acc( - tag::tail::cache_size = 4 - ); - - acc(8, covariate1 = 3); - CHECK_RANGE_EQUAL(tail(acc), {8}); - CHECK_RANGE_EQUAL(tail_variate(acc), {3}); - - acc(16, covariate1 = 1); - CHECK_RANGE_EQUAL(tail(acc), {16, 8}); - CHECK_RANGE_EQUAL(tail_variate(acc), {1, 3}); - - acc(12, covariate1 = 4); - CHECK_RANGE_EQUAL(tail(acc), {16, 12, 8}); - CHECK_RANGE_EQUAL(tail_variate(acc), {1, 4, 3}); - - acc(24, covariate1 = 5); - CHECK_RANGE_EQUAL(tail(acc), {24, 16, 12, 8}); - CHECK_RANGE_EQUAL(tail_variate(acc), {5, 1, 4, 3}); - - acc(1, covariate1 = 9); - CHECK_RANGE_EQUAL(tail(acc), {24, 16, 12, 8}); - CHECK_RANGE_EQUAL(tail_variate(acc), {5, 1, 4, 3}); - - acc(9, covariate1 = 7); - CHECK_RANGE_EQUAL(tail(acc), {24, 16, 12, 9}); - CHECK_RANGE_EQUAL(tail_variate(acc), {5, 1, 4, 7}); - -[*See also] - -* [classref boost::accumulators::impl::tail_variate_impl [^tail_variate_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.tail [^tail]] - -[endsect] - -[section:tail_variate_means tail_variate_means ['and variants]] - -Estimation of the absolute and relative tail variate means (for both left and right tails). -The absolute tail variate means has the feature -`tag::absolute_tail_variate_means<_left_or_right_, _variate_type_, _variate_tag_>` -and the relative tail variate mean has the feature -`tag::relative_tail_variate_means<_left_or_right_, _variate_type_, _variate_tag_>`. All -absolute tail variate mean features share the `tag::abstract_absolute_tail_variate_means` -feature and can be extracted with the `tail_variate_means()` extractor. All the -relative tail variate mean features share the `tag::abstract_relative_tail_variate_means` -feature and can be extracted with the `relative_tail_variate_means()` extractor. - -For more implementation details, see -[classref boost::accumulators::impl::tail_variate_means_impl [^tail_variate_means_impl]] - -[variablelist - [[Result Type] [`` - boost::iterator_range< - std::vector< - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - >::iterator - > - ``]] - [[Depends On] [`non_coherent_tail_mean<_left_or_right_>` \n - `tail_variate<_variate_type_, _variate_tag_, _left_or_right_>`]] - [[Variants] [`tag::absolute_tail_variate_means<_left_or_right_, _variate_type_, _variate_tag_>` \n - `tag::relative_tail_variate_means<_left_or_right_, _variate_type_, _variate_tag_>`]] - [[Initialization Parameters] [`tag::tail<_left_or_right_>::cache_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [`quantile_probability`]] - [[Accumulator Complexity] [O(log N), where N is the cache size]] - [[Extractor Complexity] [O(N log N), where N is the cache size]] -] - -[*Header] -[def _TAIL_VARIATE_MEANS_HPP_ [headerref boost/accumulators/statistics/tail_variate_means.hpp]] - - #include <_TAIL_VARIATE_MEANS_HPP_> - -[*Example] - - std::size_t c = 5; // cache size - - typedef double variate_type; - typedef std::vector variate_set_type; - - typedef accumulator_set(relative)>, tag::tail > - accumulator_t1; - - typedef accumulator_set(absolute)>, tag::tail > - accumulator_t2; - - typedef accumulator_set(relative)>, tag::tail > - accumulator_t3; - - typedef accumulator_set(absolute)>, tag::tail > - accumulator_t4; - - accumulator_t1 acc1( right_tail_cache_size = c ); - accumulator_t2 acc2( right_tail_cache_size = c ); - accumulator_t3 acc3( left_tail_cache_size = c ); - accumulator_t4 acc4( left_tail_cache_size = c ); - - variate_set_type cov1, cov2, cov3, cov4, cov5; - double c1[] = { 10., 20., 30., 40. }; // 100 - double c2[] = { 26., 4., 17., 3. }; // 50 - double c3[] = { 46., 64., 40., 50. }; // 200 - double c4[] = { 1., 3., 70., 6. }; // 80 - double c5[] = { 2., 2., 2., 14. }; // 20 - cov1.assign(c1, c1 + sizeof(c1)/sizeof(variate_type)); - cov2.assign(c2, c2 + sizeof(c2)/sizeof(variate_type)); - cov3.assign(c3, c3 + sizeof(c3)/sizeof(variate_type)); - cov4.assign(c4, c4 + sizeof(c4)/sizeof(variate_type)); - cov5.assign(c5, c5 + sizeof(c5)/sizeof(variate_type)); - - acc1(100., covariate1 = cov1); - acc1( 50., covariate1 = cov2); - acc1(200., covariate1 = cov3); - acc1( 80., covariate1 = cov4); - acc1( 20., covariate1 = cov5); - - acc2(100., covariate1 = cov1); - acc2( 50., covariate1 = cov2); - acc2(200., covariate1 = cov3); - acc2( 80., covariate1 = cov4); - acc2( 20., covariate1 = cov5); - - acc3(100., covariate1 = cov1); - acc3( 50., covariate1 = cov2); - acc3(200., covariate1 = cov3); - acc3( 80., covariate1 = cov4); - acc3( 20., covariate1 = cov5); - - acc4(100., covariate1 = cov1); - acc4( 50., covariate1 = cov2); - acc4(200., covariate1 = cov3); - acc4( 80., covariate1 = cov4); - acc4( 20., covariate1 = cov5); - - // check relative risk contributions - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.7).begin() ), 14./75. ); // (10 + 46) / 300 = 14/75 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 1), 7./25. ); // (20 + 64) / 300 = 7/25 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 2), 7./30. ); // (30 + 40) / 300 = 7/30 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 3), 3./10. ); // (40 + 50) / 300 = 3/10 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.3).begin() ), 14./35. ); // (26 + 2) / 70 = 14/35 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 1), 3./35. ); // ( 4 + 2) / 70 = 3/35 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 2), 19./70. ); // (17 + 2) / 70 = 19/70 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 3), 17./70. ); // ( 3 + 14) / 70 = 17/70 - - // check absolute risk contributions - BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.7).begin() ), 28 ); // (10 + 46) / 2 = 28 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.7).begin() + 1), 42 ); // (20 + 64) / 2 = 42 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.7).begin() + 2), 35 ); // (30 + 40) / 2 = 35 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.7).begin() + 3), 45 ); // (40 + 50) / 2 = 45 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.3).begin() ), 14 ); // (26 + 2) / 2 = 14 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.3).begin() + 1), 3 ); // ( 4 + 2) / 2 = 3 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.3).begin() + 2),9.5 ); // (17 + 2) / 2 = 9.5 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.3).begin() + 3),8.5 ); // ( 3 + 14) / 2 = 8.5 - - // check relative risk contributions - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.9).begin() ), 23./100. ); // 46/200 = 23/100 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 1), 8./25. ); // 64/200 = 8/25 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 2), 1./5. ); // 40/200 = 1/5 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 3), 1./4. ); // 50/200 = 1/4 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.1).begin() ), 1./10. ); // 2/ 20 = 1/10 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 1), 1./10. ); // 2/ 20 = 1/10 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 2), 1./10. ); // 2/ 20 = 1/10 - BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 3), 7./10. ); // 14/ 20 = 7/10 - - // check absolute risk contributions - BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.9).begin() ), 46 ); // 46 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.9).begin() + 1), 64 ); // 64 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.9).begin() + 2), 40 ); // 40 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.9).begin() + 3), 50 ); // 50 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.1).begin() ), 2 ); // 2 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.1).begin() + 1), 2 ); // 2 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.1).begin() + 2), 2 ); // 2 - BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.1).begin() + 3), 14 ); // 14 - -[*See also] - -* [classref boost::accumulators::impl::tail_variate_means_impl [^tail_variate_means_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.non_coherent_tail_mean [^non_coherent_tail_mean]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.tail_variate [^tail_variate]] - -[endsect] - -[section:variance variance ['and variants]] - -Lazy or iterative calculation of the variance. The lazy calculation is associated with the `tag::lazy_variance` -feature, and the iterative calculation with the `tag::variance` feature. Both can be extracted -using the `tag::variance()` extractor. For more implementation details, see -[classref boost::accumulators::impl::lazy_variance_impl [^lazy_variance_impl]] and -[classref boost::accumulators::impl::variance_impl [^variance_impl]] - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [`tag::lazy_variance` depends on `tag::moment<2>` and `tag::mean` \n - `tag::variance` depends on `tag::count` and `tag::immediate_mean`]] - [[Variants] [`tag::lazy_variance` (a.k.a. `tag::variance(lazy))` \n - `tag::variance` (a.k.a. `tag::variance(immediate)`)]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _VARIANCE_HPP_ [headerref boost/accumulators/statistics/variance.hpp]] - - #include <_VARIANCE_HPP_> - -[*Example] - - // lazy variance - accumulator_set > acc1; - - acc1(1); - acc1(2); - acc1(3); - acc1(4); - acc1(5); - - BOOST_CHECK_EQUAL(5u, count(acc1)); - BOOST_CHECK_CLOSE(3., mean(acc1), 1e-5); - BOOST_CHECK_CLOSE(11., accumulators::moment<2>(acc1), 1e-5); - BOOST_CHECK_CLOSE(2., variance(acc1), 1e-5); - - // immediate variance - accumulator_set > acc2; - - acc2(1); - acc2(2); - acc2(3); - acc2(4); - acc2(5); - - BOOST_CHECK_EQUAL(5u, count(acc2)); - BOOST_CHECK_CLOSE(3., mean(acc2), 1e-5); - BOOST_CHECK_CLOSE(2., variance(acc2), 1e-5); - -[*See also] - -* [classref boost::accumulators::impl::lazy_variance_impl [^lazy_variance_impl]] -* [classref boost::accumulators::impl::variance_impl [^variance_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.mean [^mean]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.moment [^moment]] - -[endsect] - -[section:weighted_covariance weighted_covariance] - -An iterative Monte Carlo estimator for the weighted covariance. The feature is specified as -`tag::weighted_covariance<_variate_type_, _variate_tag_>` and is extracted with the `weighted_variate()` -extractor. For more implementation details, see -[classref boost::accumulators::impl::weighted_covariance_impl [^weighted_covariance_impl]] - -[variablelist - [[Result Type] [`` - numeric::functional::outer_product< - numeric::functional::multiplies< - _weight_type_ - , numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - >::result_type - , numeric::functional::multiplies< - _weight_type_ - , numeric::functional::fdiv<_variate_type_, std::size_t>::result_type - >::result_type - > - ``]] - [[Depends On] [`count` \n - `sum_of_weights` \n - `weighted_mean` \n - `weighted_mean_of_variates<_variate_type_, _variate_tag_>`]] - [[Variants] [`abstract_weighted_covariance`]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [`weight` \n - `_variate_tag_`]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _WEIGHTED_COVARIANCE_HPP_ [headerref boost/accumulators/statistics/weighted_covariance.hpp]] - - #include <_WEIGHTED_COVARIANCE_HPP_> - -[*Example] - - accumulator_set >, double > acc; - - acc(1., weight = 1.1, covariate1 = 2.); - acc(1., weight = 2.2, covariate1 = 4.); - acc(2., weight = 3.3, covariate1 = 3.); - acc(6., weight = 4.4, covariate1 = 1.); - - double epsilon = 1e-6; - BOOST_CHECK_CLOSE(weighted_covariance(acc), -2.39, epsilon); - -[*See also] - -* [classref boost::accumulators::impl::weighted_covariance_impl [^weighted_covariance_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.sum [^sum]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.weighted_mean [^weighted_mean]] - -[endsect] - -[section:weighted_density weighted_density] - -The `tag::weighted_density` feature returns a histogram of the weighted sample distribution. For more -implementation details, see [classref boost::accumulators::impl::weighted_density_impl [^weighted_density_impl]]. - -[variablelist - [[Result Type] [`` - iterator_range< - std::vector< - std::pair< - numeric::functional::fdiv<_weight_type_, std::size_t>::result_type - , numeric::functional::fdiv<_weight_type_, std::size_t>::result_type - > - >::iterator - > - ``]] - [[Depends On] [`count` \n `sum_of_weights` \n `min` \n `max`]] - [[Variants] [['none]]] - [[Initialization Parameters] [`tag::weighted_density::cache_size` \n `tag::weighted_density::num_bins`]] - [[Accumulator Parameters] [`weight`]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [O(N), when N is `weighted_density::num_bins`]] -] - -[*Header] -[def _WEIGHTED_DENSITY_HPP_ [headerref boost/accumulators/statistics/weighted_density.hpp]] - - #include <_WEIGHTED_DENSITY_HPP_> - -[/ TODO add example ] - -[*See also] - -* [classref boost::accumulators::impl::weighted_density_impl [^weighted_density_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.sum [^sum]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.min [^min]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.max [^max]] - -[endsect] - -[section:weighted_extended_p_square weighted_extended_p_square] - -Multiple quantile estimation with the extended [^P^2] algorithm for weighted samples. For further -details, see [classref boost::accumulators::impl::weighted_extended_p_square_impl [^weighted_extended_p_square_impl]]. - -[variablelist - [[Result Type] [`` - boost::iterator_range< - _implementation_defined_ - > - ``]] - [[Depends On] [`count` \n `sum_of_weights`]] - [[Variants] [['none]]] - [[Initialization Parameters] [`tag::weighted_extended_p_square::probabilities`]] - [[Accumulator Parameters] [`weight`]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _WEIGHTED_EXTENDED_P_SQUARE_HPP_ [headerref boost/accumulators/statistics/weighted_extended_p_square.hpp]] - - #include <_WEIGHTED_EXTENDED_P_SQUARE_HPP_> - -[*Example] - - typedef accumulator_set, double> accumulator_t; - - // tolerance in % - double epsilon = 1; - - // some random number generators - double mu1 = -1.0; - double mu2 = 1.0; - boost::lagged_fibonacci607 rng; - boost::normal_distribution<> mean_sigma1(mu1, 1); - boost::normal_distribution<> mean_sigma2(mu2, 1); - boost::variate_generator > normal1(rng, mean_sigma1); - boost::variate_generator > normal2(rng, mean_sigma2); - - std::vector probs_uniform, probs_normal1, probs_normal2, probs_normal_exact1, probs_normal_exact2; - - double p1[] = {/*0.001,*/ 0.01, 0.1, 0.5, 0.9, 0.99, 0.999}; - probs_uniform.assign(p1, p1 + sizeof(p1) / sizeof(double)); - - double p2[] = {0.001, 0.025}; - double p3[] = {0.975, 0.999}; - probs_normal1.assign(p2, p2 + sizeof(p2) / sizeof(double)); - probs_normal2.assign(p3, p3 + sizeof(p3) / sizeof(double)); - - double p4[] = {-3.090232, -1.959963}; - double p5[] = {1.959963, 3.090232}; - probs_normal_exact1.assign(p4, p4 + sizeof(p4) / sizeof(double)); - probs_normal_exact2.assign(p5, p5 + sizeof(p5) / sizeof(double)); - - accumulator_t acc_uniform(tag::weighted_extended_p_square::probabilities = probs_uniform); - accumulator_t acc_normal1(tag::weighted_extended_p_square::probabilities = probs_normal1); - accumulator_t acc_normal2(tag::weighted_extended_p_square::probabilities = probs_normal2); - - for (std::size_t i = 0; i < 100000; ++i) - { - acc_uniform(rng(), weight = 1.); - - double sample1 = normal1(); - double sample2 = normal2(); - acc_normal1(sample1, weight = std::exp(-mu1 * (sample1 - 0.5 * mu1))); - acc_normal2(sample2, weight = std::exp(-mu2 * (sample2 - 0.5 * mu2))); - } - - // check for uniform distribution - for (std::size_t i = 0; i < probs_uniform.size(); ++i) - { - BOOST_CHECK_CLOSE(weighted_extended_p_square(acc_uniform)[i], probs_uniform[i], epsilon); - } - - // check for standard normal distribution - for (std::size_t i = 0; i < probs_normal1.size(); ++i) - { - BOOST_CHECK_CLOSE(weighted_extended_p_square(acc_normal1)[i], probs_normal_exact1[i], epsilon); - BOOST_CHECK_CLOSE(weighted_extended_p_square(acc_normal2)[i], probs_normal_exact2[i], epsilon); - } - -[*See also] - -* [classref boost::accumulators::impl::weighted_extended_p_square_impl [^weighted_extended_p_square_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.sum [^sum]] - -[endsect] - -[section:weighted_kurtosis weighted_kurtosis] - -The kurtosis of a sample distribution is defined as the ratio of the 4th central moment and the -square of the 2nd central moment (the variance) of the samples, minus 3. The term [^-3] is added -in order to ensure that the normal distribution has zero kurtosis. For more implementation -details, see [classref boost::accumulators::impl::weighted_kurtosis_impl [^weighted_kurtosis_impl]] - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv< - numeric::functional::multiplies<_sample_type_, _weight_type_>::result_type - , numeric::functional::multiplies<_sample_type_, _weight_type_>::result_type - >::result_type - ``]] - [[Depends On] [`weighted_mean` \n `weighted_moment<2>` \n `weighted_moment<3>` \n `weighted_moment<4>`]] - [[Variants] [['none]]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _WEIGHTED_KURTOSIS_HPP_ [headerref boost/accumulators/statistics/weighted_kurtosis.hpp]] - - #include <_WEIGHTED_KURTOSIS_HPP_> - -[*Example] - - accumulator_set, int > acc2; - - acc2(2, weight = 4); - acc2(7, weight = 1); - acc2(4, weight = 3); - acc2(9, weight = 1); - acc2(3, weight = 2); - - BOOST_CHECK_EQUAL( weighted_mean(acc2), 42./11. ); - BOOST_CHECK_EQUAL( accumulators::weighted_moment<2>(acc2), 212./11. ); - BOOST_CHECK_EQUAL( accumulators::weighted_moment<3>(acc2), 1350./11. ); - BOOST_CHECK_EQUAL( accumulators::weighted_moment<4>(acc2), 9956./11. ); - BOOST_CHECK_CLOSE( weighted_kurtosis(acc2), 0.58137026432, 1e-6 ); - -[*See also] - -* [classref boost::accumulators::impl::weighted_kurtosis_impl [^weighted_kurtosis_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.weighted_mean [^weighted_mean]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.weighted_moment [^weighted_moment]] - -[endsect] - -[section:weighted_mean weighted_mean ['and variants]] - -Calculates the weighted mean of samples or variates. The calculation is either -lazy (in the result extractor), or immediate (in the accumulator). The lazy implementation -is the default. For more implementation details, see -[classref boost::accumulators::impl::weighted_mean_impl [^weighted_mean_impl]] or. -[classref boost::accumulators::impl::immediate_weighted_mean_impl [^immediate_weighted_mean_impl]] - -[variablelist - [[Result Type] [For samples, `numeric::functional::fdiv::result_type, _weight_type_>::result_type` \n - For variates, `numeric::functional::fdiv::result_type, _weight_type_>::result_type`]] - [[Depends On] [`sum_of_weights` \n - The lazy mean of samples depends on `weighted_sum` \n - The lazy mean of variates depends on `weighted_sum_of_variates<>`]] - [[Variants] [`weighted_mean_of_variates<_variate_type_, _variate_tag_>` \n - `immediate_weighted_mean` \n - `immediate_weighted_mean_of_variates<_variate_type_, _variate_tag_>`]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _WEIGHTED_MEAN_HPP_ [headerref boost/accumulators/statistics/weighted_mean.hpp]] - - #include <_WEIGHTED_MEAN_HPP_> - -[*Example] - - accumulator_set< - int - , stats< - tag::weighted_mean - , tag::weighted_mean_of_variates - > - , int - > acc; - - acc(10, weight = 2, covariate1 = 7); // 20 - BOOST_CHECK_EQUAL(2, sum_of_weights(acc)); // - // - acc(6, weight = 3, covariate1 = 8); // 18 - BOOST_CHECK_EQUAL(5, sum_of_weights(acc)); // - // - acc(4, weight = 4, covariate1 = 9); // 16 - BOOST_CHECK_EQUAL(9, sum_of_weights(acc)); // - // - acc(6, weight = 5, covariate1 = 6); //+ 30 - BOOST_CHECK_EQUAL(14, sum_of_weights(acc)); // - //= 84 / 14 = 6 - - BOOST_CHECK_EQUAL(6., weighted_mean(acc)); - BOOST_CHECK_EQUAL(52./7., (accumulators::weighted_mean_of_variates(acc))); - - accumulator_set< - int - , stats< - tag::weighted_mean(immediate) - , tag::weighted_mean_of_variates(immediate) - > - , int - > acc2; - - acc2(10, weight = 2, covariate1 = 7); // 20 - BOOST_CHECK_EQUAL(2, sum_of_weights(acc2)); // - // - acc2(6, weight = 3, covariate1 = 8); // 18 - BOOST_CHECK_EQUAL(5, sum_of_weights(acc2)); // - // - acc2(4, weight = 4, covariate1 = 9); // 16 - BOOST_CHECK_EQUAL(9, sum_of_weights(acc2)); // - // - acc2(6, weight = 5, covariate1 = 6); //+ 30 - BOOST_CHECK_EQUAL(14, sum_of_weights(acc2)); // - //= 84 / 14 = 6 - - BOOST_CHECK_EQUAL(6., weighted_mean(acc2)); - BOOST_CHECK_EQUAL(52./7., (accumulators::weighted_mean_of_variates(acc2))); - -[*See also] - -* [classref boost::accumulators::impl::weighted_mean_impl [^weighted_mean_impl]] -* [classref boost::accumulators::impl::immediate_weighted_mean_impl [^immediate_weighted_mean_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.weighted_sum [^weighted_sum]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.sum [^sum]] - -[endsect] - -[section:weighted_median weighted_median ['and variants]] - -Median estimation for weighted samples based on the [^P^2] quantile estimator, the density estimator, or -the [^P^2] cumulative distribution estimator. For more implementation details, see -[classref boost::accumulators::impl::weighted_median_impl [^weighted_median_impl]], -[classref boost::accumulators::impl::with_weighted_density_median_impl [^with_weighted_density_median_impl]], -and [classref boost::accumulators::impl::with_weighted_p_square_cumulative_distribution_median_impl [^with_weighted_p_square_cumulative_distribution_median_impl]]. - -The three median accumulators all satisfy the `tag::weighted_median` feature, and can all be -extracted with the `weighted_median()` extractor. - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv<_sample_type_, std::size_t>::result_type - ``]] - [[Depends On] [`weighted_median` depends on `weighted_p_square_quantile_for_median` \n - `with_weighted_density_median` depends on `count` and `weighted_density` \n - `with_weighted_p_square_cumulative_distribution_median` depends on `weighted_p_square_cumulative_distribution`]] - [[Variants] [`with_weighted_density_median` (a.k.a. `weighted_median(with_weighted_density)`) \n - `with_weighted_p_square_cumulative_distribution_median` (a.k.a. `weighted_median(with_weighted_p_square_cumulative_distribution)`)]] - [[Initialization Parameters] [`with_weighted_density_median` requires `tag::weighted_density::cache_size` and `tag::weighted_density::num_bins` \n - `with_weighted_p_square_cumulative_distribution_median` requires `tag::weighted_p_square_cumulative_distribution::num_cells`]] - [[Accumulator Parameters] [`weight`]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [TODO]] -] - -[*Header] -[def _WEIGHTED_MEDIAN_HPP_ [headerref boost/accumulators/statistics/weighted_median.hpp]] - - #include <_WEIGHTED_MEDIAN_HPP_> - -[*Example] - - // Median estimation of normal distribution N(1,1) using samples from a narrow normal distribution N(1,0.01) - // The weights equal to the likelihood ratio of the corresponding samples - - // two random number generators - double mu = 1.; - double sigma_narrow = 0.01; - double sigma = 1.; - boost::lagged_fibonacci607 rng; - boost::normal_distribution<> mean_sigma_narrow(mu,sigma_narrow); - boost::variate_generator > normal_narrow(rng, mean_sigma_narrow); - - accumulator_set, double > acc; - accumulator_set, double > - acc_dens( tag::weighted_density::cache_size = 10000, tag::weighted_density::num_bins = 1000 ); - accumulator_set, double > - acc_cdist( tag::weighted_p_square_cumulative_distribution::num_cells = 100 ); - - for (std::size_t i=0; i<100000; ++i) - { - double sample = normal_narrow(); - acc(sample, weight = std::exp(0.5 * (sample - mu) * (sample - mu) * ( 1./sigma_narrow/sigma_narrow - 1./sigma/sigma ))); - acc_dens(sample, weight = std::exp(0.5 * (sample - mu) * (sample - mu) * ( 1./sigma_narrow/sigma_narrow - 1./sigma/sigma ))); - acc_cdist(sample, weight = std::exp(0.5 * (sample - mu) * (sample - mu) * ( 1./sigma_narrow/sigma_narrow - 1./sigma/sigma ))); - } - - BOOST_CHECK_CLOSE(1., weighted_median(acc), 1e-1); - BOOST_CHECK_CLOSE(1., weighted_median(acc_dens), 1e-1); - BOOST_CHECK_CLOSE(1., weighted_median(acc_cdist), 1e-1); - -[*See also] - -* [classref boost::accumulators::impl::weighted_median_impl [^weighted_median_impl]] -* [classref boost::accumulators::impl::with_weighted_density_median_impl [^with_weighted_density_median_impl]] -* [classref boost::accumulators::impl::with_weighted_p_square_cumulative_distribution_median_impl [^with_weighted_p_square_cumulative_distribution_median_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.weighted_p_square_quantile [^weighted_p_square_quantile]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.weighted_p_square_cumulative_distribution [^weighted_p_square_cumulative_distribution]] - -[endsect] - -[section:weighted_moment weighted_moment] - -Calculates the N-th moment of the weighted samples, which is defined as the sum of the weighted N-th -power of the samples over the sum of the weights. - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv< - numeric::functional::multiplies<_sample_type_, _weight_type_>::result_type - , weight_type - >::result_type - ``]] - [[Depends On] [`count` \n `sum_of_weights`]] - [[Variants] [['none]]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [`weight`]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _WEIGHTED_MOMENT_HPP_ [headerref boost/accumulators/statistics/weighted_moment.hpp]] - - #include <_WEIGHTED_MOMENT_HPP_> - -[*Example] - - accumulator_set >, double> acc2; - accumulator_set >, double> acc7; - - acc2(2.1, weight = 0.7); - acc2(2.7, weight = 1.4); - acc2(1.8, weight = 0.9); - - acc7(2.1, weight = 0.7); - acc7(2.7, weight = 1.4); - acc7(1.8, weight = 0.9); - - BOOST_CHECK_CLOSE(5.403, accumulators::weighted_moment<2>(acc2), 1e-5); - BOOST_CHECK_CLOSE(548.54182, accumulators::weighted_moment<7>(acc7), 1e-5); - -[*See also] - -* [classref boost::accumulators::impl::weighted_moment_impl [^weighted_moment_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.sum [^sum]] - -[endsect] - -[section:weighted_p_square_cumulative_distribution weighted_p_square_cumulative_distribution] - -Histogram calculation of the cumulative distribution with the [^P^2] algorithm for weighted samples. -For more implementation details, see -[classref boost::accumulators::impl::weighted_p_square_cumulative_distribution_impl [^weighted_p_square_cumulative_distribution_impl]] - -[variablelist - [[Result Type] [`` - iterator_range< - std::vector< - std::pair< - numeric::functional::fdiv::result_type - , numeric::functional::fdiv::result_type - > - >::iterator - > - `` - where `weighted_sample` is `numeric::functional::multiplies<_sample_type_, _weight_type_>::result_type`]] - [[Depends On] [`count` \n `sum_or_weights`]] - [[Variants] [['none]]] - [[Initialization Parameters] [`tag::weighted_p_square_cumulative_distribution::num_cells`]] - [[Accumulator Parameters] [`weight`]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [O(N) where N is `num_cells`]] -] - -[*Header] -[def _WEIGHTED_P_SQUARE_CUMULATIVE_DISTRIBUTION_HPP_ [headerref boost/accumulators/statistics/weighted_p_square_cumul_dist.hpp]] - - #include <_WEIGHTED_P_SQUARE_CUMULATIVE_DISTRIBUTION_HPP_> - -[*Example] - - // tolerance in % - double epsilon = 4; - - typedef accumulator_set, double > accumulator_t; - - accumulator_t acc_upper(tag::weighted_p_square_cumulative_distribution::num_cells = 100); - accumulator_t acc_lower(tag::weighted_p_square_cumulative_distribution::num_cells = 100); - - // two random number generators - double mu_upper = 1.0; - double mu_lower = -1.0; - boost::lagged_fibonacci607 rng; - boost::normal_distribution<> mean_sigma_upper(mu_upper,1); - boost::normal_distribution<> mean_sigma_lower(mu_lower,1); - boost::variate_generator > normal_upper(rng, mean_sigma_upper); - boost::variate_generator > normal_lower(rng, mean_sigma_lower); - - for (std::size_t i=0; i<100000; ++i) - { - double sample = normal_upper(); - acc_upper(sample, weight = std::exp(-mu_upper * (sample - 0.5 * mu_upper))); - } - - for (std::size_t i=0; i<100000; ++i) - { - double sample = normal_lower(); - acc_lower(sample, weight = std::exp(-mu_lower * (sample - 0.5 * mu_lower))); - } - - typedef iterator_range >::iterator > histogram_type; - histogram_type histogram_upper = weighted_p_square_cumulative_distribution(acc_upper); - histogram_type histogram_lower = weighted_p_square_cumulative_distribution(acc_lower); - - // Note that applying importance sampling results in a region of the distribution - // to be estimated more accurately and another region to be estimated less accurately - // than without importance sampling, i.e., with unweighted samples - - for (std::size_t i = 0; i < histogram_upper.size(); ++i) - { - // problem with small results: epsilon is relative (in percent), not absolute! - - // check upper region of distribution - if ( histogram_upper[i].second > 0.1 ) - BOOST_CHECK_CLOSE( 0.5 * (1.0 + erf( histogram_upper[i].first / sqrt(2.0) )), histogram_upper[i].second, epsilon ); - // check lower region of distribution - if ( histogram_lower[i].second < -0.1 ) - BOOST_CHECK_CLOSE( 0.5 * (1.0 + erf( histogram_lower[i].first / sqrt(2.0) )), histogram_lower[i].second, epsilon ); - } - -[*See also] - -* [classref boost::accumulators::impl::weighted_p_square_cumulative_distribution_impl [^weighted_p_square_cumulative_distribution_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.sum [^sum]] - -[endsect] - -[section:weighted_p_square_quantile weighted_p_square_quantile ['and variants]] - -Single quantile estimation with the [^P^2] algorithm. For more implementation details, see -[classref boost::accumulators::impl::weighted_p_square_quantile_impl [^weighted_p_square_quantile_impl]] - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv< - numeric::functional::multiplies<_sample_type_, _weight_type_>::result_type - , std::size_t - >::result_type - ``]] - [[Depends On] [`count` \n `sum_of_weights`]] - [[Variants] [`weighted_p_square_quantile_for_median`]] - [[Initialization Parameters] [`quantile_probability`, which defaults to `0.5`. - (Note: for `weighted_p_square_quantile_for_median`, the `quantile_probability` - parameter is ignored and is always `0.5`.)]] - [[Accumulator Parameters] [`weight`]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _WEIGHTED_P_SQUARE_QUANTILE_HPP_ [headerref boost/accumulators/statistics/weighted_p_square_quantile.hpp]] - - #include <_WEIGHTED_P_SQUARE_QUANTILE_HPP_> - -[*Example] - - typedef accumulator_set, double> accumulator_t; - - // tolerance in % - double epsilon = 1; - - // some random number generators - double mu4 = -1.0; - double mu5 = -1.0; - double mu6 = 1.0; - double mu7 = 1.0; - boost::lagged_fibonacci607 rng; - boost::normal_distribution<> mean_sigma4(mu4, 1); - boost::normal_distribution<> mean_sigma5(mu5, 1); - boost::normal_distribution<> mean_sigma6(mu6, 1); - boost::normal_distribution<> mean_sigma7(mu7, 1); - boost::variate_generator > normal4(rng, mean_sigma4); - boost::variate_generator > normal5(rng, mean_sigma5); - boost::variate_generator > normal6(rng, mean_sigma6); - boost::variate_generator > normal7(rng, mean_sigma7); - - accumulator_t acc0(quantile_probability = 0.001); - accumulator_t acc1(quantile_probability = 0.025); - accumulator_t acc2(quantile_probability = 0.975); - accumulator_t acc3(quantile_probability = 0.999); - - accumulator_t acc4(quantile_probability = 0.001); - accumulator_t acc5(quantile_probability = 0.025); - accumulator_t acc6(quantile_probability = 0.975); - accumulator_t acc7(quantile_probability = 0.999); - - - for (std::size_t i=0; i<100000; ++i) - { - double sample = rng(); - acc0(sample, weight = 1.); - acc1(sample, weight = 1.); - acc2(sample, weight = 1.); - acc3(sample, weight = 1.); - - double sample4 = normal4(); - double sample5 = normal5(); - double sample6 = normal6(); - double sample7 = normal7(); - acc4(sample4, weight = std::exp(-mu4 * (sample4 - 0.5 * mu4))); - acc5(sample5, weight = std::exp(-mu5 * (sample5 - 0.5 * mu5))); - acc6(sample6, weight = std::exp(-mu6 * (sample6 - 0.5 * mu6))); - acc7(sample7, weight = std::exp(-mu7 * (sample7 - 0.5 * mu7))); - } - - // check for uniform distribution with weight = 1 - BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc0), 0.001, 15 ); - BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc1), 0.025, 5 ); - BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc2), 0.975, epsilon ); - BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc3), 0.999, epsilon ); - - // check for shifted standard normal distribution ("importance sampling") - BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc4), -3.090232, epsilon ); - BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc5), -1.959963, epsilon ); - BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc6), 1.959963, epsilon ); - BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc7), 3.090232, epsilon ); - -[*See also] - -* [classref boost::accumulators::impl::weighted_p_square_quantile_impl [^weighted_p_square_quantile_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.sum [^sum]] - -[endsect] - -[section:weighted_peaks_over_threshold weighted_peaks_over_threshold ['and variants]] - -Weighted peaks over threshold method for weighted quantile and weighted tail mean estimation. -For more implementation details, -see [classref boost::accumulators::impl::weighted_peaks_over_threshold_impl [^weighted_peaks_over_threshold_impl]] -and [classref boost::accumulators::impl::weighted_peaks_over_threshold_prob_impl [^weighted_peaks_over_threshold_prob_impl]]. - -Both `tag::weighted_peaks_over_threshold<_left_or_right_>` and -`tag::weighted_peaks_over_threshold_prob<_left_or_right_>` satisfy the -`tag::weighted_peaks_over_threshold<_left_or_right_>` feature and can be extracted using the -`weighted_peaks_over_threshold()` extractor. - -[variablelist - [[Result Type] [`tuple` where `float_type` is - `` - numeric::functional::fdiv< - numeric::functional::multiplies<_sample_type_, _weight_type_>::result_type - , std::size_t - >::result_type - ``]] - [[Depends On] [`weighted_peaks_over_threshold<_left_or_right_>` depends on `sum_of_weights` \n - `weighted_peaks_over_threshold_prob<_left_or_right_>` depends on `sum_of_weights` and `tail_weights<_left_or_right_>`]] - [[Variants] [`weighted_peaks_over_threshold_prob`]] - [[Initialization Parameters] [ `tag::peaks_over_threshold::threshold_value` \n - `tag::peaks_over_threshold_prob::threshold_probability` \n - `tag::tail<_left_or_right_>::cache_size` ]] - [[Accumulator Parameters] [`weight`]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [TODO]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _WEIGHTED_PEAKS_OVER_THRESHOLD_HPP_ [headerref boost/accumulators/statistics/weighted_peaks_over_threshold.hpp]] - - #include <_WEIGHTED_PEAKS_OVER_THRESHOLD_HPP_> - -[/ TODO Add example] - -[*See also] - -* [classref boost::accumulators::impl::weighted_peaks_over_threshold_impl [^weighted_peaks_over_threshold_impl]] -* [classref boost::accumulators::impl::weighted_peaks_over_threshold_prob_impl [^weighted_peaks_over_threshold_prob_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.sum [^sum]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.tail [^tail]] - -[endsect] - -[section:weighted_skewness weighted_skewness] - -The skewness of a sample distribution is defined as the ratio of the 3rd central moment and the [^3/2]-th power -of the 2nd central moment (the variance) of the samples 3. The skewness estimator for weighted samples -is formally identical to the estimator for unweighted samples, except that the weighted counterparts of -all measures it depends on are to be taken. - -For implementation details, see -[classref boost::accumulators::impl::weighted_skewness_impl [^weighted_skewness_impl]]. - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv< - numeric::functional::multiplies<_sample_type_, _weight_type_>::result_type - , numeric::functional::multiplies<_sample_type_, _weight_type_>::result_type - >::result_type - ``]] - [[Depends On] [`weighted_mean` \n `weighted_moment<2>` \n `weighted_moment<3>`]] - [[Variants] [['none]]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [`weight`]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _WEIGHTED_SKEWNESS_HPP_ [headerref boost/accumulators/statistics/weighted_skewness.hpp]] - - #include <_WEIGHTED_SKEWNESS_HPP_> - -[*Example] - - accumulator_set, int > acc2; - - acc2(2, weight = 4); - acc2(7, weight = 1); - acc2(4, weight = 3); - acc2(9, weight = 1); - acc2(3, weight = 2); - - BOOST_CHECK_EQUAL( weighted_mean(acc2), 42./11. ); - BOOST_CHECK_EQUAL( accumulators::weighted_moment<2>(acc2), 212./11. ); - BOOST_CHECK_EQUAL( accumulators::weighted_moment<3>(acc2), 1350./11. ); - BOOST_CHECK_CLOSE( weighted_skewness(acc2), 1.30708406282, 1e-6 ); - -[*See also] - -* [classref boost::accumulators::impl::weighted_skewness_impl [^weighted_skewness_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.weighted_mean [^weighted_mean]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.weighted_moment [^weighted_moment]] - -[endsect] - -[section:weighted_sum weighted_sum ['and variants]] - -For summing the weighted samples or variates. All of the `tag::weighted_sum_of_variates<>` features -can be extracted with the `weighted_sum_of_variates()` extractor. Variants that implement the Kahan -summation algorithm are also provided. - -[variablelist - [[Result Type] [`numeric::functional::multiplies<_sample_type_, _weight_type_>::result_type` for summing weighted samples \n - `numeric::functional::multiplies<_variate_type_, _weight_type_>::result_type` for summing weighted variates]] - [[Depends On] [['none]]] - [[Variants] [`tag::weighted_sum` \n - `tag::weighted_sum_of_variates<_variate_type_, _variate_tag_>` \n - `tag::weighted_sum_kahan` (a.k.a. tag::weighted_sum(kahan)) \n - `tag::weighted_sum_of_variates_kahan<_variate_type_, _variate_tag_>` \n]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [`weight` \n - `_variate_tag_` for summing variates]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1). Note that the Kahan sum performs four floating-point sum - operations per accumulated value, whereas the naive sum - performs only one.]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _WEIGHTED_SUM_HPP_ [headerref boost/accumulators/statistics/weighted_sum.hpp]] -[def _WEIGHTED_SUM_KAHAN_HPP_ [headerref boost/accumulators/statistics/weighted_sum_kahan.hpp]] - - #include <_WEIGHTED_SUM_HPP_> - #include <_WEIGHTED_SUM_KAHAN_HPP_> - - -[*Example] - - accumulator_set >, int> acc; - - acc(1, weight = 2, covariate1 = 3); - BOOST_CHECK_EQUAL(2, weighted_sum(acc)); - BOOST_CHECK_EQUAL(6, weighted_sum_of_variates(acc)); - - acc(2, weight = 3, covariate1 = 6); - BOOST_CHECK_EQUAL(8, weighted_sum(acc)); - BOOST_CHECK_EQUAL(24, weighted_sum_of_variates(acc)); - - acc(4, weight = 6, covariate1 = 9); - BOOST_CHECK_EQUAL(32, weighted_sum(acc)); - BOOST_CHECK_EQUAL(78, weighted_sum_of_variates(acc)); - - // demonstrate weighted Kahan summation - accumulator_set, float > acc; - BOOST_CHECK_EQUAL(0.0f, weighted_sum_kahan(acc)); - for (size_t i = 0; i < 1e6; ++i) { - acc(1.0f, weight = 1e-6f); - } - BOOST_CHECK_EQUAL(1.0f, weighted_sum_kahan(acc)); - -[*See also] - -* [classref boost::accumulators::impl::weighted_sum_impl [^weighted_sum_impl]] -* [classref boost::accumulators::impl::weighted_sum_impl [^weighted_sum_kahan_impl]] - -[endsect] - -[section:non_coherent_weighted_tail_mean non_coherent_weighted_tail_mean] - -Estimation of the (non-coherent) weighted tail mean based on order statistics (for both left and right tails). -The left non-coherent weighted tail mean feature is `tag::non_coherent_weighted_tail_mean`, and the right -non-choherent weighted tail mean feature is `tag::non_coherent_weighted_tail_mean`. They both share the -`tag::abstract_non_coherent_tail_mean` feature with the unweighted non-coherent tail mean accumulators and can -be extracted with either the `non_coherent_tail_mean()` or the `non_coherent_weighted_tail_mean()` extractors. -For more implementation details, see -[classref boost::accumulators::impl::non_coherent_weighted_tail_mean_impl [^non_coherent_weighted_tail_mean_impl]]. - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv< - numeric::functional::multiplies<_sample_type_, _weight_type_>::result_type - , std::size_t - >::result_type - ``]] - [[Depends On] [`sum_of_weights` \n `tail_weights<_left_or_right_>`]] - [[Variants] [`abstract_non_coherent_tail_mean`]] - [[Initialization Parameters] [`tag::tail<_left_or_right_>::cache_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [`quantile_probability`]] - [[Accumulator Complexity] [O(log N), where N is the cache size]] - [[Extractor Complexity] [O(N log N), where N is the cache size]] -] - -[*Header] -[def _WEIGHTED_TAIL_MEAN_HPP_ [headerref boost/accumulators/statistics/weighted_tail_mean.hpp]] - - #include <_WEIGHTED_TAIL_MEAN_HPP_> - -[*Example] - - // tolerance in % - double epsilon = 1; - - std::size_t n = 100000; // number of MC steps - std::size_t c = 25000; // cache size - - accumulator_set >, double > - acc0( right_tail_cache_size = c ); - accumulator_set >, double > - acc1( left_tail_cache_size = c ); - - // random number generators - boost::lagged_fibonacci607 rng; - - for (std::size_t i = 0; i < n; ++i) - { - double smpl = std::sqrt(rng()); - acc0(smpl, weight = 1./smpl); - } - - for (std::size_t i = 0; i < n; ++i) - { - double smpl = rng(); - acc1(smpl*smpl, weight = smpl); - } - - // check uniform distribution - BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc0, quantile_probability = 0.95), 0.975, epsilon ); - BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc0, quantile_probability = 0.975), 0.9875, epsilon ); - BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc0, quantile_probability = 0.99), 0.995, epsilon ); - BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc0, quantile_probability = 0.999), 0.9995, epsilon ); - BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc1, quantile_probability = 0.05), 0.025, epsilon ); - BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc1, quantile_probability = 0.025), 0.0125, epsilon ); - BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc1, quantile_probability = 0.01), 0.005, epsilon ); - BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc1, quantile_probability = 0.001), 0.0005, 5*epsilon ); - -[*See also] - -* [classref boost::accumulators::impl::non_coherent_weighted_tail_mean_impl [^non_coherent_weighted_tail_mean_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.sum [^sum]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.tail [^tail]] - -[endsect] - -[section:weighted_tail_quantile weighted_tail_quantile] - -Tail quantile estimation based on order statistics of weighted samples (for both left -and right tails). The left weighted tail quantile feature is `tag::weighted_tail_quantile`, -and the right weighted tail quantile feature is `tag::weighted_tail_quantile`. They both -share the `tag::quantile` feature with the unweighted tail quantile accumulators and can be -extracted with either the `quantile()` or the `weighted_tail_quantile()` extractors. For more -implementation details, see -[classref boost::accumulators::impl::weighted_tail_quantile_impl [^weighted_tail_quantile_impl]] - -[variablelist - [[Result Type] [`` - _sample_type_ - ``]] - [[Depends On] [`sum_of_weights` \n `tail_weights<_left_or_right_>`]] - [[Variants] [['none]]] - [[Initialization Parameters] [`tag::tail<_left_or_right_>::cache_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [`quantile_probability`]] - [[Accumulator Complexity] [O(log N), where N is the cache size]] - [[Extractor Complexity] [O(N log N), where N is the cache size]] -] - -[*Header] -[def _WEIGHTED_TAIL_QUANTILE_HPP_ [headerref boost/accumulators/statistics/weighted_tail_quantile.hpp]] - - #include <_WEIGHTED_TAIL_QUANTILE_HPP_> - -[*Example] - - // tolerance in % - double epsilon = 1; - - std::size_t n = 100000; // number of MC steps - std::size_t c = 20000; // cache size - - double mu1 = 1.0; - double mu2 = -1.0; - boost::lagged_fibonacci607 rng; - boost::normal_distribution<> mean_sigma1(mu1,1); - boost::normal_distribution<> mean_sigma2(mu2,1); - boost::variate_generator > normal1(rng, mean_sigma1); - boost::variate_generator > normal2(rng, mean_sigma2); - - accumulator_set >, double> - acc1(right_tail_cache_size = c); - - accumulator_set >, double> - acc2(left_tail_cache_size = c); - - for (std::size_t i = 0; i < n; ++i) - { - double sample1 = normal1(); - double sample2 = normal2(); - acc1(sample1, weight = std::exp(-mu1 * (sample1 - 0.5 * mu1))); - acc2(sample2, weight = std::exp(-mu2 * (sample2 - 0.5 * mu2))); - } - - // check standard normal distribution - BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = 0.975), 1.959963, epsilon ); - BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = 0.999), 3.090232, epsilon ); - BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.025), -1.959963, epsilon ); - BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.001), -3.090232, epsilon ); - -[*See also] - -* [classref boost::accumulators::impl::weighted_tail_quantile_impl [^weighted_tail_quantile_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.sum [^sum]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.tail [^tail]] - -[endsect] - -[section:weighted_tail_variate_means weighted_tail_variate_means ['and variants]] - -Estimation of the absolute and relative weighted tail variate means (for both left and right tails) -The absolute weighted tail variate means has the feature -`tag::absolute_weighted_tail_variate_means<_left_or_right_, _variate_type_, _variate_tag_>` -and the relative weighted tail variate mean has the feature -`tag::relative_weighted_tail_variate_means<_left_or_right_, _variate_type_, _variate_tag_>`. All -absolute weighted tail variate mean features share the `tag::abstract_absolute_tail_variate_means` -feature with their unweighted variants and can be extracted with the `tail_variate_means()` and -`weighted_tail_variate_means()` extractors. All the relative weighted tail variate mean features -share the `tag::abstract_relative_tail_variate_means` feature with their unweighted variants -and can be extracted with either the `relative_tail_variate_means()` or -`relative_weighted_tail_variate_means()` extractors. - -For more implementation details, see -[classref boost::accumulators::impl::weighted_tail_variate_means_impl [^weighted_tail_variate_means_impl]] - -[variablelist - [[Result Type] [`` - boost::iterator_range< - numeric::functional::fdiv< - numeric::functional::multiplies<_variate_type_, _weight_type_>::result_type - , _weight_type_ - >::result_type::iterator - > - ``]] - [[Depends On] [`non_coherent_weighted_tail_mean<_left_or_right_>` \n - `tail_variate<_variate_type_, _variate_tag_, _left_or_right_>` \n - `tail_weights<_left_or_right_>`]] - [[Variants] [`tag::absolute_weighted_tail_variate_means<_left_or_right_, _variate_type_, _variate_tag_>` \n - `tag::relative_weighted_tail_variate_means<_left_or_right_, _variate_type_, _variate_tag_>`]] - [[Initialization Parameters] [`tag::tail<_left_or_right_>::cache_size`]] - [[Accumulator Parameters] [['none]]] - [[Extractor Parameters] [`quantile_probability`]] - [[Accumulator Complexity] [O(log N), where N is the cache size]] - [[Extractor Complexity] [O(N log N), where N is the cache size]] -] - -[*Header] -[def _WEIGHTED_TAIL_VARIATE_MEANS_HPP_ [headerref boost/accumulators/statistics/weighted_tail_variate_means.hpp]] - - #include <_WEIGHTED_TAIL_VARIATE_MEANS_HPP_> - -[*Example] - - std::size_t c = 5; // cache size - - typedef double variate_type; - typedef std::vector variate_set_type; - - accumulator_set(relative)>, double > - acc1( right_tail_cache_size = c ); - accumulator_set(absolute)>, double > - acc2( right_tail_cache_size = c ); - accumulator_set(relative)>, double > - acc3( left_tail_cache_size = c ); - accumulator_set(absolute)>, double > - acc4( left_tail_cache_size = c ); - - variate_set_type cov1, cov2, cov3, cov4, cov5; - double c1[] = { 10., 20., 30., 40. }; // 100 - double c2[] = { 26., 4., 17., 3. }; // 50 - double c3[] = { 46., 64., 40., 50. }; // 200 - double c4[] = { 1., 3., 70., 6. }; // 80 - double c5[] = { 2., 2., 2., 14. }; // 20 - cov1.assign(c1, c1 + sizeof(c1)/sizeof(variate_type)); - cov2.assign(c2, c2 + sizeof(c2)/sizeof(variate_type)); - cov3.assign(c3, c3 + sizeof(c3)/sizeof(variate_type)); - cov4.assign(c4, c4 + sizeof(c4)/sizeof(variate_type)); - cov5.assign(c5, c5 + sizeof(c5)/sizeof(variate_type)); - - acc1(100., weight = 0.8, covariate1 = cov1); - acc1( 50., weight = 0.9, covariate1 = cov2); - acc1(200., weight = 1.0, covariate1 = cov3); - acc1( 80., weight = 1.1, covariate1 = cov4); - acc1( 20., weight = 1.2, covariate1 = cov5); - - acc2(100., weight = 0.8, covariate1 = cov1); - acc2( 50., weight = 0.9, covariate1 = cov2); - acc2(200., weight = 1.0, covariate1 = cov3); - acc2( 80., weight = 1.1, covariate1 = cov4); - acc2( 20., weight = 1.2, covariate1 = cov5); - - acc3(100., weight = 0.8, covariate1 = cov1); - acc3( 50., weight = 0.9, covariate1 = cov2); - acc3(200., weight = 1.0, covariate1 = cov3); - acc3( 80., weight = 1.1, covariate1 = cov4); - acc3( 20., weight = 1.2, covariate1 = cov5); - - acc4(100., weight = 0.8, covariate1 = cov1); - acc4( 50., weight = 0.9, covariate1 = cov2); - acc4(200., weight = 1.0, covariate1 = cov3); - acc4( 80., weight = 1.1, covariate1 = cov4); - acc4( 20., weight = 1.2, covariate1 = cov5); - - // check relative risk contributions - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.7).begin() ), (0.8*10 + 1.0*46)/(0.8*100 + 1.0*200) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 1), (0.8*20 + 1.0*64)/(0.8*100 + 1.0*200) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 2), (0.8*30 + 1.0*40)/(0.8*100 + 1.0*200) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 3), (0.8*40 + 1.0*50)/(0.8*100 + 1.0*200) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.3).begin() ), (0.9*26 + 1.2*2)/(0.9*50 + 1.2*20) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 1), (0.9*4 + 1.2*2)/(0.9*50 + 1.2*20) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 2), (0.9*17 + 1.2*2)/(0.9*50 + 1.2*20) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 3), (0.9*3 + 1.2*14)/(0.9*50 + 1.2*20) ); - - // check absolute risk contributions - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.7).begin() ), (0.8*10 + 1.0*46)/1.8 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.7).begin() + 1), (0.8*20 + 1.0*64)/1.8 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.7).begin() + 2), (0.8*30 + 1.0*40)/1.8 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.7).begin() + 3), (0.8*40 + 1.0*50)/1.8 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.3).begin() ), (0.9*26 + 1.2*2)/2.1 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.3).begin() + 1), (0.9*4 + 1.2*2)/2.1 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.3).begin() + 2), (0.9*17 + 1.2*2)/2.1 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.3).begin() + 3), (0.9*3 + 1.2*14)/2.1 ); - - // check relative risk contributions - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.9).begin() ), 1.0*46/(1.0*200) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 1), 1.0*64/(1.0*200) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 2), 1.0*40/(1.0*200) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 3), 1.0*50/(1.0*200) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.1).begin() ), 1.2*2/(1.2*20) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 1), 1.2*2/(1.2*20) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 2), 1.2*2/(1.2*20) ); - BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 3), 1.2*14/(1.2*20) ); - - // check absolute risk contributions - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.9).begin() ), 1.0*46/1.0 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.9).begin() + 1), 1.0*64/1.0 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.9).begin() + 2), 1.0*40/1.0 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.9).begin() + 3), 1.0*50/1.0 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.1).begin() ), 1.2*2/1.2 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.1).begin() + 1), 1.2*2/1.2 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.1).begin() + 2), 1.2*2/1.2 ); - BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.1).begin() + 3), 1.2*14/1.2 ); - -[*See also] - -* [classref boost::accumulators::impl::weighted_tail_variate_means_impl [^weighted_tail_variate_means_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.non_coherent_weighted_tail_mean [^non_coherent_weighted_tail_mean]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.tail_variate [^tail_variate]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.tail [^tail]] - -[endsect] - -[section:weighted_variance weighted_variance ['and variants]] - -Lazy or iterative calculation of the weighted variance. The lazy calculation is associated with the `tag::lazy_weighted_variance` -feature, and the iterative calculation with the `tag::weighted_variance` feature. Both can be extracted -using the `tag::weighted_variance()` extractor. For more implementation details, see -[classref boost::accumulators::impl::lazy_weighted_variance_impl [^lazy_weighted_variance_impl]] and -[classref boost::accumulators::impl::weighted_variance_impl [^weighted_variance_impl]] - -[variablelist - [[Result Type] [`` - numeric::functional::fdiv< - numeric::functional::multiplies<_sample_type_, _weight_type_>::result_type - , std::size_t - >::result_type - ``]] - [[Depends On] [`tag::lazy_weighted_variance` depends on `tag::weighted_moment<2>` and `tag::weighted_mean` \n - `tag::weighted_variance` depends on `tag::count` and `tag::immediate_weighted_mean`]] - [[Variants] [`tag::lazy_weighted_variance` (a.k.a. `tag::weighted_variance(lazy))` \n - `tag::weighted_variance` (a.k.a. `tag::weighted_variance(immediate)`)]] - [[Initialization Parameters] [['none]]] - [[Accumulator Parameters] [`weight`]] - [[Extractor Parameters] [['none]]] - [[Accumulator Complexity] [O(1)]] - [[Extractor Complexity] [O(1)]] -] - -[*Header] -[def _WEIGHTED_VARIANCE_HPP_ [headerref boost/accumulators/statistics/weighted_variance.hpp]] - - #include <_WEIGHTED_VARIANCE_HPP_> - -[*Example] - - // lazy weighted_variance - accumulator_set, int> acc1; - - acc1(1, weight = 2); // 2 - acc1(2, weight = 3); // 6 - acc1(3, weight = 1); // 3 - acc1(4, weight = 4); // 16 - acc1(5, weight = 1); // 5 - - // weighted_mean = (2+6+3+16+5) / (2+3+1+4+1) = 32 / 11 = 2.9090909090909090909090909090909 - - BOOST_CHECK_EQUAL(5u, count(acc1)); - BOOST_CHECK_CLOSE(2.9090909, weighted_mean(acc1), 1e-5); - BOOST_CHECK_CLOSE(10.1818182, accumulators::weighted_moment<2>(acc1), 1e-5); - BOOST_CHECK_CLOSE(1.7190083, weighted_variance(acc1), 1e-5); - - // immediate weighted_variance - accumulator_set, int> acc2; - - acc2(1, weight = 2); - acc2(2, weight = 3); - acc2(3, weight = 1); - acc2(4, weight = 4); - acc2(5, weight = 1); - - BOOST_CHECK_EQUAL(5u, count(acc2)); - BOOST_CHECK_CLOSE(2.9090909, weighted_mean(acc2), 1e-5); - BOOST_CHECK_CLOSE(1.7190083, weighted_variance(acc2), 1e-5); - - // check lazy and immediate variance with random numbers - - // two random number generators - boost::lagged_fibonacci607 rng; - boost::normal_distribution<> mean_sigma(0,1); - boost::variate_generator > normal(rng, mean_sigma); - - accumulator_set, double > acc_lazy; - accumulator_set, double > acc_immediate; - - for (std::size_t i=0; i<10000; ++i) - { - double value = normal(); - acc_lazy(value, weight = rng()); - acc_immediate(value, weight = rng()); - } - - BOOST_CHECK_CLOSE(1., weighted_variance(acc_lazy), 1.); - BOOST_CHECK_CLOSE(1., weighted_variance(acc_immediate), 1.); - -[*See also] - -* [classref boost::accumulators::impl::lazy_weighted_variance_impl [^lazy_weighted_variance_impl]] -* [classref boost::accumulators::impl::weighted_variance_impl [^weighted_variance_impl]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.count [^count]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.weighted_mean [^weighted_mean]] -* [link accumulators.user_s_guide.the_statistical_accumulators_library.weighted_moment [^weighted_moment]] - -[endsect] - -[endsect] - -[endsect] - -[section Acknowledgements] - -Boost.Accumulators represents the efforts of many individuals. I would like to thank -Daniel Egloff of _ZKB_ for helping to conceive the library and realize its -implementation. I would also like to thank David Abrahams and Matthias Troyer for -their key contributions to the design of the library. Many thanks are due to Michael -Gauckler and Olivier Gygi, who, along with Daniel Egloff, implemented many of the -statistical accumulators. - -I would also like to thank Simon West for all his assistance maintaining -Boost.Accumulators. - -Finally, I would like to thank _ZKB_ for sponsoring the work on Boost.Accumulators -and graciously donating it to the community. - -[endsect] - -[section Reference] - -[xinclude accdoc.xml] - -[xinclude statsdoc.xml] - -[xinclude opdoc.xml] - -[endsect] diff --git a/doc/antora.yml b/doc/antora.yml new file mode 100644 index 00000000..9a90f909 --- /dev/null +++ b/doc/antora.yml @@ -0,0 +1,31 @@ +# +# Generated for Boost.Accumulators documentation (Antora). +# Distributed under the Boost Software License, Version 1.0. +# + +name: accumulators +version: ~ +title: Boost.Accumulators +start_page: index.adoc +asciidoc: + attributes: + source-language: asciidoc@ + table-caption: false +nav: + - modules/ROOT/nav.adoc +ext: + cpp-reference: + config: doc/mrdocs.yml + cpp-tagfiles: + files: + - file: ./doc/tagfiles/boost-system-doxygen.tag.xml + base_url: https://www.boost.org/doc/libs/master/libs/system/doc/html/ + - file: ./doc/tagfiles/boost-core-doxygen.tag.xml + base_url: https://www.boost.org/doc/libs/master/libs/core/doc/html/ + - file: ./doc/tagfiles/boost-filesystem-doxygen.tag.xml + base_url: https://www.boost.org/doc/libs/master/libs/filesystem/doc/ + using-namespaces: + - boost::accumulators + - boost::system + - boost::core + diff --git a/doc/build_antora.sh b/doc/build_antora.sh new file mode 100644 index 00000000..e1fce179 --- /dev/null +++ b/doc/build_antora.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +# +# Copyright 2005, 2006 Eric Niebler +# Copyright 2026 boost-doc-modernize contributors +# +# Distributed under the Boost Software License, Version 1.0. +# +# Delegates to boost/tools/boost-doc-antora/boost_antora_build.sh (see there for +# BOOST_SRC_DIR, ANTORA_PLAYBOOK, ANTORA_FULL_PLAYBOOK, WSL + lite playbook). +# + +set -xe + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +cd "$SCRIPT_DIR" + +if [ -z "${BOOST_SRC_DIR:-}" ]; then + CANDIDATE=$( cd "$SCRIPT_DIR/../../.." 2>/dev/null && pwd ) + if [ -n "$CANDIDATE" ]; then + BOOST_SRC_DIR_IS_VALID=ON + for F in "CMakeLists.txt" "Jamroot" "boost-build.jam" "bootstrap.sh" "libs"; do + if [ ! -e "$CANDIDATE/$F" ]; then + BOOST_SRC_DIR_IS_VALID=OFF + break + fi + done + if [ "$BOOST_SRC_DIR_IS_VALID" = "ON" ]; then + export BOOST_SRC_DIR="$CANDIDATE" + echo "Using BOOST_SRC_DIR=$BOOST_SRC_DIR" + fi + fi +fi + +if [ $# -eq 0 ] + then + echo "No playbook supplied, using default playbook" + PLAYBOOK="local-playbook.yml" + else + PLAYBOOK=$1 +fi + +echo "Building documentation with Antora..." +echo "Installing npm dependencies..." +npm ci + +echo "Building docs in custom dir..." +PATH="$(pwd)/node_modules/.bin:${PATH}" +export PATH + +echo "Generating Doxygen framework API (Antora attachments)..." +bash scripts/run_doxygen_accumulators_framework.sh + +npx antora --clean --fetch "$PLAYBOOK" --stacktrace --log-level all +echo "Done" diff --git a/doc/doxygen/Doxyfile.accumulators_framework b/doc/doxygen/Doxyfile.accumulators_framework new file mode 100644 index 00000000..78205ad6 --- /dev/null +++ b/doc/doxygen/Doxyfile.accumulators_framework @@ -0,0 +1,59 @@ +# Doxygen input for Boost.Accumulators framework API (Antora attachment). +# Paths are relative to this file's directory (doc/doxygen/). +# Requires BOOST_SRC_DIR (Boost super-project root with libs/accumulators/...). + +PROJECT_NAME = Boost.Accumulators +PROJECT_BRIEF = "Accumulators framework (Doxygen API HTML)" +OUTPUT_DIRECTORY = ../modules/ROOT/attachments/doxygen +CREATE_SUBDIRS = NO +ALLOW_UNICODE_NAMES = NO +OUTPUT_LANGUAGE = English + +GENERATE_HTML = YES +HTML_OUTPUT = accumulators_framework_reference +HTML_COLORSTYLE = LIGHT +HTML_EXTRA_FILES = branding/antora-doxygen-bridge.css +GENERATE_LATEX = NO +GENERATE_XML = NO + +# Match classic pre-generated HTML (accumulators-doc5.5): no top tab index, no tree +# sidebar, no client-side search UI; breadcrumb + in-page summary only. +GENERATE_TREEVIEW = NO +FULL_SIDEBAR = NO +DISABLE_INDEX = YES +SEARCHENGINE = NO +HTML_DYNAMIC_MENUS = NO + +EXTRACT_ALL = YES +EXTRACT_PRIVATE = NO +EXTRACT_PRIV_VIRTUAL = NO +EXTRACT_PACKAGE = NO +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO + +FILE_PATTERNS = *.hpp +EXTENSION_MAPPING = hpp=C++ +RECURSIVE = YES + +INPUT = $(BOOST_SRC_DIR)/libs/accumulators/include/boost/accumulators +STRIP_FROM_PATH = $(BOOST_SRC_DIR)/libs/accumulators/include +INCLUDE_PATH = $(BOOST_SRC_DIR) + +QUIET = NO +WARN_IF_UNDOCUMENTED = NO +WARN_NO_PARAMDOC = NO + +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = NO +SKIP_FUNCTION_MACROS = YES + +SOURCE_BROWSER = YES +VERBATIM_HEADERS = YES +SEARCH_INCLUDES = YES + +# Graph toggles written by scripts/run_doxygen_accumulators_framework.sh +@INCLUDE = Doxyfile._runtime diff --git a/doc/doxygen/branding/antora-doxygen-bridge.css b/doc/doxygen/branding/antora-doxygen-bridge.css new file mode 100644 index 00000000..12c6affa --- /dev/null +++ b/doc/doxygen/branding/antora-doxygen-bridge.css @@ -0,0 +1,272 @@ +/* + * Unified bridge: Doxygen HTML under Antora attachment trees. + * Scope with html.boost-doc-antora (added by postprocess_doxygen_antora_bridge.py). + * Goals: typography and code blocks closer to Antora default UI; tame Doxygen blues. + */ + +html.boost-doc-antora { + font-family: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; + line-height: 1.6; + color: #191919; + background-color: #fff; +} + +html.boost-doc-antora body { + max-width: 52rem; + margin: 1.5rem auto; + padding: 0 1rem; +} + +html.boost-doc-antora #doc-content, +html.boost-doc-antora #top { + font-size: 1rem; +} + +html.boost-doc-antora #titlearea { + border-bottom: 1px solid #e1e1e1; + margin-bottom: 1rem; + padding-bottom: 0.5rem; +} + +html.boost-doc-antora #projectname { + font-weight: 600; + font-size: 1.15rem; +} + +html.boost-doc-antora #projectbrief { + color: #555; + font-size: 0.95rem; +} + +html.boost-doc-antora .navpath ul { + font-size: 0.9rem; +} + +html.boost-doc-antora .navpath a, +html.boost-doc-antora a.el, +html.boost-doc-antora a.code, +html.boost-doc-antora a:link { + color: #1565c0; + text-decoration: none; +} + +html.boost-doc-antora .navpath a:hover, +html.boost-doc-antora a.el:hover { + text-decoration: underline; +} + +html.boost-doc-antora h1, +html.boost-doc-antora h2, +html.boost-doc-antora h3, +html.boost-doc-antora .title, +html.boost-doc-antora .headertitle .title { + font-weight: 500; + color: #191919; +} + +html.boost-doc-antora .headertitle .title { + font-size: 1.75rem; + border-bottom: 1px solid #e1e1e1; + padding-bottom: 0.25rem; + margin-top: 0; +} + +html.boost-doc-antora h2.groupheader, +html.boost-doc-antora .groupheader { + font-size: 1.25rem; + margin-top: 1.5rem; + padding-top: 0.25rem; + border-top: 1px solid #eee; +} + +html.boost-doc-antora .boost-ref-subtitle { + color: #555; + font-size: 0.95rem; + font-weight: normal; + margin-top: 0.35rem; +} + +html.boost-doc-antora pre.fragment, +html.boost-doc-antora div.fragment, +html.boost-doc-antora pre.programlisting, +html.boost-doc-antora .fragment { + font-family: "Roboto Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; + font-size: 0.875rem; + background: #f7f7f8 !important; + border: 1px solid #e1e1e1 !important; + border-radius: 4px; + padding: 0.75rem 1rem !important; + overflow-x: auto; +} + +html.boost-doc-antora .memitem, +html.boost-doc-antora .memproto, +html.boost-doc-antora .memdoc { + border-radius: 4px; +} + +html.boost-doc-antora .memtitle { + font-weight: 500; + background: #f0f7ff !important; + border: 1px solid #c5d8ef !important; +} + +html.boost-doc-antora table.memberdecls, +html.boost-doc-antora table.markdownTable, +html.boost-doc-antora table.fieldtable { + border-collapse: collapse; + width: 100%; +} + +html.boost-doc-antora td.memItemLeft, +html.boost-doc-antora td.memItemRight, +html.boost-doc-antora td.memTemplItemLeft, +html.boost-doc-antora td.memTemplItemRight { + font-family: "Roboto Mono", ui-monospace, monospace; + font-size: 0.85rem; +} + +html.boost-doc-antora .memSeparator { + border: none; + height: 1px; + background: #eee; +} + +html.boost-doc-antora #main-nav:empty { + display: none; + height: 0; + margin: 0; + padding: 0; +} + +html.boost-doc-antora .dynheader { + font-weight: 500; +} + +html.boost-doc-antora .textblock { + max-width: 100%; +} + +html.boost-doc-antora hr.footer { + margin-top: 2rem; +} + +/* Injected handbook chrome; attachments do not load Antora UI. */ +html.boost-doc-antora .boost-doxy-site-toolbar { + border-bottom: 1px solid #e1e1e1; + margin: -1.5rem -1rem 1rem -1rem; + padding: 0.5rem 1rem; + background: #fafafa; + font-size: 0.95rem; +} + +html.boost-doc-antora .boost-doxy-site-toolbar__row { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + gap: 0.75rem; + max-width: 52rem; + margin: 0 auto; +} + +html.boost-doc-antora .boost-doxy-site-toolbar__home { + display: inline-flex; + align-items: center; + justify-content: center; + width: 2rem; + height: 2rem; + border: 1px solid #d0d0d0; + border-radius: 4px; + background: #fff; + text-decoration: none; + color: #191919; + font-size: 1rem; + line-height: 1; +} + +html.boost-doc-antora .boost-doxy-site-toolbar__links { + display: flex; + flex-wrap: wrap; + gap: 1rem; + flex: 1; + justify-content: center; +} + +html.boost-doc-antora .boost-doxy-site-toolbar__links a { + color: #1565c0; + text-decoration: none; +} + +html.boost-doc-antora .boost-doxy-site-toolbar__links a:hover { + text-decoration: underline; +} + +html.boost-doc-antora .boost-doxy-site-toolbar__aux { + display: flex; + gap: 0.75rem; + align-items: center; +} + +html.boost-doc-antora .boost-doxy-site-toolbar__aux a { + color: #555; + font-size: 0.9rem; + text-decoration: none; +} + +html.boost-doc-antora .boost-doxy-site-toolbar__aux a:hover { + color: #1565c0; + text-decoration: underline; +} + +html.boost-doc-antora .boost-doxy-site-toolbar__searchhint { + border-left: 1px solid #ddd; + padding-left: 0.75rem; + margin-left: 0.25rem; +} + +html.boost-doc-antora .boost-doxy-page-nav { + margin: 2rem -1rem -1rem -1rem; + padding: 1rem; + border-top: 1px solid #e1e1e1; + background: #fafafa; +} + +html.boost-doc-antora .boost-doxy-page-nav__inner { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1rem; + max-width: 52rem; + margin: 0 auto; +} + +html.boost-doc-antora .boost-doxy-page-nav__cell { + border: 1px solid #e1e1e1; + border-radius: 6px; + padding: 0.75rem 1rem; + background: #fff; +} + +html.boost-doc-antora .boost-doxy-page-nav__dir { + display: block; + font-size: 0.8rem; + color: #777; + margin-bottom: 0.25rem; +} + +html.boost-doc-antora .boost-doxy-page-nav__title { + font-weight: 600; + color: #191919; + text-decoration: none; +} + +html.boost-doc-antora .boost-doxy-page-nav__title:hover { + color: #1565c0; + text-decoration: underline; +} + +@media (max-width: 520px) { + html.boost-doc-antora .boost-doxy-page-nav__inner { + grid-template-columns: 1fr; + } +} diff --git a/doc/doxygen/branding/doxygen_html_footer.html b/doc/doxygen/branding/doxygen_html_footer.html new file mode 100644 index 00000000..9f72f4e4 --- /dev/null +++ b/doc/doxygen/branding/doxygen_html_footer.html @@ -0,0 +1 @@ + diff --git a/doc/doxygen/branding/doxygen_html_header.html b/doc/doxygen/branding/doxygen_html_header.html new file mode 100644 index 00000000..ea974f9b --- /dev/null +++ b/doc/doxygen/branding/doxygen_html_header.html @@ -0,0 +1 @@ + diff --git a/doc/generate-files.mjs b/doc/generate-files.mjs new file mode 100644 index 00000000..9271c74a --- /dev/null +++ b/doc/generate-files.mjs @@ -0,0 +1,340 @@ +#!/usr/bin/env node + +// +// Copyright (c) 2023 Alan de Freitas (alandefreitas@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/boostorg/accumulators +// + +'use strict'; +import {execSync} from 'child_process' +import fs from 'fs' +import path from 'path' +import os from 'os' +import request from 'sync-request' + +/* + Helper functions + */ +function mkdirp(dir) { + if (!fs.existsSync(dir)) { + mkdirp(path.dirname(dir)) + fs.mkdirSync(dir) + } +} + +function findExecutable(executableName) { + if (Array.isArray(executableName)) { + for (const name of executableName) { + const result = findExecutable(name) + if (result) { + return result + } + } + return undefined + } + + const isWin = process.platform === 'win32'; + const pathDirs = process.env.PATH.split(isWin ? ';' : ':'); + const extensions = isWin ? ['.exe', '.bat', '.cmd'] : ['']; + + function isExecutable(filePath) { + try { + if (!isWin) { + fs.accessSync(filePath, fs.constants.X_OK); + } + return true; + } catch (error) { + return false; + } + } + + // Try to find the exact executable first + for (const dir of pathDirs) { + for (const ext of extensions) { + const fullPath = path.join(dir, executableName + ext); + if (fs.existsSync(fullPath) && isExecutable(fullPath)) { + return fullPath; + } + } + } + + function escapeRegExp(string) { + // Escape special characters for use in regex + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } + + // If the exact executable is not found, search for versioned executables + const versionedExecutables = []; + const escapedExecutableName = escapeRegExp(executableName); + const versionRegex = new RegExp(`${escapedExecutableName}-(\\d+)$`); + + for (const dir of pathDirs) { + try { + const files = fs.readdirSync(dir); + for (const file of files) { + if (!extensions.some(ext => file.endsWith(ext))) { + continue + } + const fullPath = path.join(dir, file); + if (!isExecutable(fullPath)) { + continue + } + const ext = path.extname(file); + const basename = path.basename(file, ext); + const match = basename.match(versionRegex); + if (match) { + versionedExecutables.push({ + path: fullPath, + version: parseInt(match[1], 10) + }); + } + } + } catch (error) { + // Ignore errors from reading directories + } + } + + if (versionedExecutables.length > 0) { + versionedExecutables.sort((a, b) => b.version - a.version); + return versionedExecutables[0].path; + } + + return undefined; +} + +function mkTmpDir() { + let tempDir = undefined + try { + tempDir = fs.mkdtempSync(os.tmpdir()) + } catch (error) { + console.error(`Could not create temporary directory with fs.mkdtempSync(os.tmpdir()): ${error}.`) + try { + console.error(`Trying to create temporary directory in fs.mkdtempSync('~/tmp')...`) + tempDir = fs.mkdtempSync(path.join(os.homedir(), 'tmp')); + } catch (error) { + console.error(`Could not create temporary directory with fs.mkdtempSync('~/tmp'): ${error}.`) + try { + console.error(`Trying to create temporary directory in fs.mkdtempSync(path.join(cwd, 'tmp'))...`) + tempDir = fs.mkdtempSync(path.join(cwd, 'tmp')); + console.log(`Created temporary directory ${tempDir}`) + } catch (error) { + console.error(`Could not create temporary directory: ${error}`) + } + } + } + return tempDir +} + +function downloadAndDecompress(downloadUrl, downloadPath, extractPath) { + try { + console.log(`Downloading ${downloadUrl} to ${downloadPath}...`); + const response = request('GET', downloadUrl) + fs.writeFileSync(downloadPath, response.getBody()); + console.log(`File ${downloadUrl} downloaded successfully to ${downloadPath}.`); + if (path.extname(downloadPath) === '.7z') { + const cmd = `7z x ${downloadPath} -o${extractPath}` + console.log(`Decompressing with command: ${cmd}`) + execSync(cmd, {stdio: 'inherit'}) + } else if (/\.tar\.gz$/.test(downloadPath)) { + mkdirp(extractPath) + const cmd = `tar -vxzf ${downloadPath} -C ${extractPath}` + console.log(`Decompressing with command: ${cmd}`) + execSync(cmd, {stdio: 'inherit'}) + } + console.log(`File decompressed successfully to ${extractPath}.`); + } catch (error) { + console.error('Error:', error.message); + } +} + +/* + Find C++ compilers + Clang++ is preferred over g++ and cl for MrDocs + */ +const cwd = process.cwd() +let cxxCompiler = findExecutable(['clang++', 'g++', 'cl']) || process.env.CXX_COMPILER || process.env.CXX +if (cxxCompiler && process.platform === "win32") { + // Replace "\" with "/" in CXX_COMPILER + cxxCompiler = cxxCompiler.replace(/\\/g, '/') +} +if (cxxCompiler === undefined) { + console.error('Could not find a C++ compiler. Please set the CXX_COMPILER environment variable.') + process.exit(1) +} +process.env.CMAKE_CXX_COMPILER = cxxCompiler +process.env.CXX = cxxCompiler + +const cxxCompilerName = path.basename(cxxCompiler).replace(/\.exe$/, '') +let cCompiler = findExecutable(['clang', 'gcc', 'cl']) || process.env.C_COMPILER || process.env.CC +if (cCompiler && process.platform === "win32") { + // Replace "\" with "/" in CXX_COMPILER + cCompiler = cCompiler.replace(/\\/g, '/') +} +if (cCompiler === undefined) { + console.error('Could not find a C compiler. Please set the C_COMPILER environment variable.') + process.exit(1) +} +const cCompilerName = path.basename(cCompiler).replace(/\.exe$/, '') +process.env.CMAKE_C_COMPILER = cCompiler +process.env.CC = cCompiler + +console.log(`C++ compiler: ${cxxCompilerName} (${cxxCompiler})`) +console.log(`C compiler: ${cCompilerName} (${cCompiler})`) + +/* + Download Boost + */ +function isBoostDir(dir) { + if (!fs.existsSync(dir)) { + return false + } + console.log(`Checking if ${dir} is a Boost source directory`) + const boostFiles = ['CMakeLists.txt', 'Jamroot', 'boost-build.jam', 'bootstrap.sh', 'libs'] + for (const file of boostFiles) { + const filePath = path.join(cwdParentParent, file) + console.log(`Checking if ${filePath} exists`) + if (!fs.existsSync(filePath)) { + return false + } + } + return true +} + +// Check if we need to download boost. This is usually the case in CI, but we want to reuse the local boost directory +// in local builds. +const librariesJsonPath = path.join(cwd, 'meta', 'libraries.json') +const librariesJson = JSON.parse(fs.readFileSync(librariesJsonPath, 'utf-8')) +const module = librariesJson['key'] +const self = module || path.basename(cwd) +console.log(`self: ${self}`) + +// Check if cwdParentParent contains the files "CMakeLists.txt" "Jamroot" "boost-build.jam" "bootstrap.sh" "libs" +let tempDir = undefined +let boostDir = undefined +const cwdParentParent = path.dirname(path.dirname(cwd)) +if (isBoostDir(cwdParentParent)) { + boostDir = cwdParentParent + console.log(`Found Boost at ${cwdParentParent}`) +} else { + const branch = execSync('git rev-parse --abbrev-ref HEAD', {encoding: 'utf-8'}).trim() + const boostBranchRegex = /^boost-1\.\d+\.\d+$/ + const isValidBoostBranch = branch === 'master' || branch === 'develop' || boostBranchRegex.test(branch); + const boostBranch = isValidBoostBranch ? branch : 'develop' + + // Clone boost in a temporary directory + if (!tempDir) { + tempDir = mkTmpDir() + } + console.log(`Created temporary directory ${tempDir}`) + let boostDownloadCmd = `git clone https://github.com/boostorg/boost.git --depth 1 --branch ${boostBranch}` + execSync(boostDownloadCmd, {cwd: tempDir}) + boostDir = path.join(tempDir, 'boost') + console.log(`Initializing submodules in ${boostDir}`) + execSync('git submodule update --init --recursive', {cwd: boostDir}) + console.log(`Cloned Boost to ${boostDir}`) + + // Delete `self` from boost/libs + const selfDir = path.join(boostDir, 'libs', self) + console.log(`Deleting ${selfDir}`) + execSync(`rm -rf ${selfDir}`) + + // Copy contents of cwd to boost/libs/self + // const selfDirParent = path.join(boostDir, 'libs') + console.log(`Copying ${cwd} to ${selfDir}`) + execSync(`cp -r ${cwd} ${selfDir}`) +} + +/* + Find and run MrDocs to generate the documentation + + Install MrDocs with: + - Linux: + wget https://github.com/cppalliance/mrdocs/releases/download/develop-release/MrDocs-0.0.1-Linux.tar.gz + sudo tar -xzf MrDocs-0.0.1-Linux.tar.gz -C /usr/local --strip-components=1 + - Windows (Powershell): + Invoke-WebRequest -Uri 'https://github.com/cppalliance/mrdocs/releases/download/develop-release/MrDocs-0.0.1-win64.7z' -OutFile 'MrDocs-0.0.1-win64.7z' + 7z x -o"C:\Users\$env:USERNAME\Applications" 'MrDocs-0.0.1-win64.7z' + ( Adapt the destination path as needed ) + + */ +// https://github.com/terascope/fetch-github-release +let mrDocsExec = findExecutable('mrdocs') +if (!mrDocsExec) { + console.log(`Could not find MrDocs. Downloading...`) + if (!tempDir) { + tempDir = mkTmpDir() + } + const releasesResponse = request('GET', 'https://api.github.com/repos/cppalliance/mrdocs/releases', { + headers: { + 'User-Agent': 'request' + } + }) + const releasesInfo = JSON.parse(releasesResponse.getBody('utf-8')) + console.log(`Found ${releasesInfo.length} MrDocs releases`) + let downloadUrl = undefined + for (const latestRelease of releasesInfo) { + console.log(`Latest release: ${latestRelease['tag_name']}`) + const latestAssets = latestRelease['assets'].map(asset => asset['browser_download_url']) + console.log(`Latest assets: ${latestAssets}`) + downloadUrl = process.platform === "win32" ? latestAssets.find(asset => asset.endsWith('win64.7z')) : latestAssets.find(asset => asset.endsWith('Linux.tar.gz')) + if (downloadUrl) { + break + } + console.warn(`Could not find MrDocs binaries in ${latestRelease['tag_name']} release for ${process.platform}`) + } + if (!downloadUrl) { + console.error(`Could not find MrDocs binaries for ${process.platform}`) + process.exit(1) + } + const downloadFilename = path.basename(downloadUrl) + console.log(`Downloading ${downloadUrl} to ${path.join(tempDir, downloadFilename)}...`) + downloadAndDecompress( + downloadUrl, + path.join(tempDir, downloadFilename), + path.join(tempDir, 'MrDocs') + ) + console.log(`Extracted ${downloadFilename} to ${path.join(tempDir, 'MrDocs')}`) + const downloadExtractDir = downloadFilename.replace(/\.(7z|tar\.gz)$/, '') + const downloadExtractBinFilename = process.platform === "win32" ? 'mrdocs.exe' : 'mrdocs' + mrDocsExec = path.join(tempDir, 'MrDocs', downloadExtractDir, 'bin', downloadExtractBinFilename) + if (!fs.existsSync(mrDocsExec)) { + console.error(`Could not find MrDocs at ${mrDocsExec}`) + process.exit(1) + } else { + console.log(`Found MrDocs executable at ${mrDocsExec}`) + } +} +console.log(`Found MrDocs at ${mrDocsExec}`) + +// Reference goes to another module so that its relative links work +// Antora does not support relative xrefs: https://gitlab.com/antora/antora/-/issues/428 +const buildDirectory = path.join(cwd, 'doc', 'build') +const mrDocsOutputDir = path.join(buildDirectory, 'generated-files', 'modules', 'reference', 'pages') +const mrDocsProjectPath = path.join(boostDir, 'libs', 'accumulators') +const mrDocsConfigPath = path.join(mrDocsProjectPath, 'doc', 'mrdocs.yml') +const mrDocsCmd = `${mrDocsExec} --config="${mrDocsConfigPath}" "${mrDocsProjectPath}" --output="${mrDocsOutputDir}"` +console.log(`Generating documentation with command: ${mrDocsCmd}`) +// Execute mrDocsCmd with execSync, get output and print it to stdout. Also get return code. +// If return code is not 0, print output to stderr and exit with return code. +let mrDocsExitCode = 0 +try { + const mrDocsOutput = execSync(mrDocsCmd) + console.log(mrDocsOutput.toString()) + console.log(`Generated documentation at ${mrDocsOutputDir}`) +} catch (error) { + console.error('Failed to run MrDocs') + console.error(error.stdout.toString()) + mrDocsExitCode = error.status +} +if (tempDir) { + console.log(`Deleting temporary directory ${tempDir}`) + execSync(`rm -rf ${tempDir}`) +} +if (mrDocsExitCode !== 0) { + console.log(`Exiting with code ${mrDocsExitCode}`) +} +process.exit(mrDocsExitCode) diff --git a/doc/local-playbook-lite.yml b/doc/local-playbook-lite.yml new file mode 100644 index 00000000..2c5283b3 --- /dev/null +++ b/doc/local-playbook-lite.yml @@ -0,0 +1,44 @@ +# +# Antora playbook without @cppalliance/antora-cpp-reference-extension (no MrDocs). +# Expect DEBUG from cpp-tagfiles ("No cpp-reference tagfile registry…"); there is no +# MrDocs producer in this playbook. Use local-playbook.yml for full tagfile integration. +# Use from WSL when Windows Node/LLVM on PATH would pull win32 MrDocs and hit EPERM +# on rename under %AppData%. Full API reference: use local-playbook.yml on Windows +# or a Linux-native toolchain with ACCUMULATORS_FULL_PLAYBOOK=1. +# + +site: + title: Boost.Accumulators + url: https://antora.cppalliance.org/develop/lib/doc + start_page: accumulators::index.adoc + robots: allow + keys: + repo_url: 'https://github.com/boostorg/accumulators' + +content: + sources: + - url: .. + start_path: doc + edit_url: 'https://github.com/boostorg/accumulators/edit/{refname}/{path}' + +ui: + bundle: + url: https://github.com/boostorg/website-v2-docs/releases/download/ui-master/ui-bundle.zip + snapshot: true + +antora: + extensions: + - require: '@antora/lunr-extension' + index_latest_only: true + - require: '@cppalliance/antora-cpp-tagfiles-extension' + cpp-tagfiles: + using-namespaces: + - 'boost::' + - require: '@cppalliance/antora-downloads-extension' + +asciidoc: + attributes: + page-pagination: '' + extensions: + - '@cppalliance/asciidoctor-boost-links' + - '@asciidoctor/tabs' diff --git a/doc/local-playbook.yml b/doc/local-playbook.yml new file mode 100644 index 00000000..328236eb --- /dev/null +++ b/doc/local-playbook.yml @@ -0,0 +1,55 @@ +# +# Local Antora playbook for Boost.Accumulators +# +# site.url is baked into canonical links, sitemap, and Lunr-related output. Set it +# to the base URL where this site is actually served, or keep a separate playbook +# (e.g. publish-playbook.yml) for production while this file targets preview/staging. + +site: + title: Boost.Accumulators + url: https://antora.cppalliance.org/develop/lib/doc + start_page: accumulators::index.adoc + robots: allow + keys: + repo_url: 'https://github.com/boostorg/accumulators' + +content: + sources: + - url: .. + start_path: doc + edit_url: 'https://github.com/boostorg/accumulators/edit/{refname}/{path}' + +ui: + bundle: + url: https://github.com/boostorg/website-v2-docs/releases/download/ui-master/ui-bundle.zip + snapshot: true + +antora: + extensions: + - require: '@antora/lunr-extension' # https://gitlab.com/antora/antora-lunr-extension + index_latest_only: true + # MrDocs reference must register before cpp-tagfiles: both listen on contentAggregated; + # tagfiles consumes playbook.runtime.cppReferenceTagfileRegistry on that event (see + # extension tests). At --log-level=debug you may still see one early "No cpp-reference + # tagfile registry" from cpp-tagfiles' beforeProcess hook; the registry loads on contentAggregated. + - require: '@cppalliance/antora-cpp-reference-extension' + dependencies: + - name: 'boost' + repo: 'https://github.com/boostorg/boost.git' + tag: 'develop' + variable: 'BOOST_SRC_DIR' + system-env: 'BOOST_SRC_DIR' + - require: '@cppalliance/antora-cpp-tagfiles-extension' + cpp-tagfiles: + using-namespaces: + - 'boost::' + - require: '@cppalliance/antora-downloads-extension' + +asciidoc: + attributes: + # Enable pagination + page-pagination: '' + source-highlighter: none + extensions: + - '@cppalliance/asciidoctor-boost-links' + - '@asciidoctor/tabs' diff --git a/doc/modules/ROOT/nav.adoc b/doc/modules/ROOT/nav.adoc new file mode 100644 index 00000000..63b4f5e8 --- /dev/null +++ b/doc/modules/ROOT/nav.adoc @@ -0,0 +1,5 @@ +* xref:index.adoc[] +* xref:preface.adoc[Preface] +* xref:user_s_guide.adoc[User's Guide] +* xref:acknowledgements.adoc[Acknowledgements] +* xref:reference.adoc[Reference] diff --git a/doc/modules/ROOT/pages/acknowledgements.adoc b/doc/modules/ROOT/pages/acknowledgements.adoc new file mode 100644 index 00000000..cf343237 --- /dev/null +++ b/doc/modules/ROOT/pages/acknowledgements.adoc @@ -0,0 +1,8 @@ += Acknowledgements +:id: accumulators.acknowledgements + +Boost.Accumulators represents the efforts of many individuals. I would like to thank Daniel Egloff of link:http://www.zkb.com[Zürcher Kantonalbank] for helping to conceive the library and realize its implementation. I would also like to thank David Abrahams and Matthias Troyer for their key contributions to the design of the library. Many thanks are due to Michael Gauckler and Olivier Gygi, who, along with Daniel Egloff, implemented many of the statistical accumulators. + +I would also like to thank Simon West for all his assistance maintaining Boost.Accumulators. + +Finally, I would like to thank link:http://www.zkb.com[Zürcher Kantonalbank] for sponsoring the work on Boost.Accumulators and graciously donating it to the community. diff --git a/doc/modules/ROOT/pages/index.adoc b/doc/modules/ROOT/pages/index.adoc new file mode 100644 index 00000000..db2a3edb --- /dev/null +++ b/doc/modules/ROOT/pages/index.adoc @@ -0,0 +1,37 @@ += Chapter 1. Boost.Accumulators + +*Eric Niebler* + +Incremental accumulation framework and statistical accumulator library. + +Copyright (C) 2005, 2006 Eric Niebler + +Distributed under the Boost Software License, Version 1.0. + +(See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt) + +[.accumulators-mini-toc] +**** +**Table of Contents** + +* xref:preface.adoc[Preface] +* xref:user_s_guide.adoc[User's Guide] +** xref:user_s_guide.adoc#accumulators.user_s_guide.the_accumulators_framework[The Accumulators Framework] +** xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library[The Statistical Accumulators Library] +* xref:acknowledgements.adoc[Acknowledgements] +* xref:reference.adoc[Reference] +** xref:reference.adoc#accumulators_framework_reference[Accumulators Framework Reference] +** xref:reference.adoc#statistics_library_reference[Statistics Library Reference] +** xref:reference.adoc#numeric_operators_library_reference[Numeric Operators Library Reference] +**** + +== Preface + +[quote] +____ +It is better to be approximately right than exactly wrong. + +-- Old adage +____ + +== Description + +Boost.Accumulators is both a library for incremental statistical computation as well as an extensible framework for incremental calculation in general. The library deals primarily with the concept of an _accumulator_, which is a primitive computational entity that accepts data one sample at a time and maintains some internal state. These accumulators may offload some of their computations on other accumulators, on which they depend. Accumulators are grouped within an _accumulator set_. Boost.Accumulators resolves the inter-dependencies between accumulators in a set and ensures that accumulators are processed in the proper order. diff --git a/doc/modules/ROOT/pages/preface.adoc b/doc/modules/ROOT/pages/preface.adoc new file mode 100644 index 00000000..5f24a427 --- /dev/null +++ b/doc/modules/ROOT/pages/preface.adoc @@ -0,0 +1,16 @@ += Preface +:id: accumulators.preface + +[quote] +____ +It is better to be approximately right than exactly wrong. -- Old adage +____ + + +[[accumulators.preface.h0]] + +[[accumulators.preface.description]] + +== Description + +Boost.Accumulators is both a library for incremental statistical computation as well as an extensible framework for incremental calculation in general. The library deals primarily with the concept of an _accumulator_, which is a primitive computational entity that accepts data one sample at a time and maintains some internal state. These accumulators may offload some of their computations on other accumulators, on which they depend. Accumulators are grouped within an _accumulator set_. Boost.Accumulators resolves the inter-dependencies between accumulators in a set and ensures that accumulators are processed in the proper order. diff --git a/doc/modules/ROOT/pages/reference.adoc b/doc/modules/ROOT/pages/reference.adoc new file mode 100644 index 00000000..a74bbff6 --- /dev/null +++ b/doc/modules/ROOT/pages/reference.adoc @@ -0,0 +1,2158 @@ += Reference +:page-toclevels: 3 + +// Synopsis blocks follow the official Boost.Accumulators Reference; TOC and cross-links are maintained here. + +++++ + +++++ + +[.accumulators-mini-toc] +**** +* xref:#accumulators_framework_reference[Accumulators Framework Reference] +* xref:#statistics_library_reference[Statistics Library Reference] +* xref:#numeric_operators_library_reference[Numeric Operators Library Reference] +**** + +[[accumulators_framework_reference]] +== Accumulators Framework Reference + +[.accumulators-mini-toc] +**** +* xref:#doxygen.accumulators_framework_reference.accumulators_8hpp[Header ] +* xref:#+++doxygen.accumulators_framework_reference.accumulators__fwd_8hpp+++[Header ] +* xref:#+++doxygen.accumulators_framework_reference.accumulator__base_8hpp+++[Header ] +* xref:#+++doxygen.accumulators_framework_reference.accumulator__concept_8hpp+++[Header ] +* xref:#+++doxygen.accumulators_framework_reference.accumulator__set_8hpp+++[Header ] +* xref:#+++doxygen.accumulators_framework_reference.droppable__accumulator_8hpp+++[Header ] +* xref:#+++doxygen.accumulators_framework_reference.external__accumulator_8hpp+++[Header ] +* xref:#+++doxygen.accumulators_framework_reference.reference__accumulator_8hpp+++[Header ] +* xref:#+++doxygen.accumulators_framework_reference.value__accumulator_8hpp+++[Header ] +* xref:#+++doxygen.accumulators_framework_reference.depends__on_8hpp+++[Header ] +* xref:#doxygen.accumulators_framework_reference.extractor_8hpp[Header ] +* xref:#doxygen.accumulators_framework_reference.features_8hpp[Header ] +* xref:#doxygen.accumulators_framework_reference.accumulator_8hpp[Header ] +* xref:#doxygen.accumulators_framework_reference.sample_8hpp[Header ] +* xref:#doxygen.accumulators_framework_reference.weight_8hpp[Header ] +* xref:#doxygen.accumulators_framework_reference.weights_8hpp[Header ] +**** + +[[doxygen.accumulators_framework_reference.accumulators_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/accumulators_8hpp.html[Header < boost/accumulators/accumulators.hpp >] + +Includes all of the Accumulators Framework. + +[[doxygen.accumulators_framework_reference.accumulators__fwd_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/accumulators__fwd_8hpp.html+++[Header < boost/accumulators/accumulators_fwd.hpp >] + +++++ +
+++++ + +[[doxygen.accumulators_framework_reference.accumulator__base_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/accumulator__base_8hpp.html+++[Header < boost/accumulators/framework/accumulator_base.hpp >] + ++++
+++
++++namespace+++ boost +++{+++
+  +++namespace accumulators {+++
+    +++struct accumulator_base;+++
+    +++struct dont_care;+++
+  +++}+++
++++}+++
++++
+++ + + +[[doxygen.accumulators_framework_reference.accumulator__concept_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/accumulator__concept_8hpp.html+++[Header < boost/accumulators/framework/accumulator_concept.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename Stat> struct accumulator_concept;
+  }
+}
+
+++++ + +[[doxygen.accumulators_framework_reference.accumulator__set_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/accumulator__set_8hpp.html+++[Header < boost/accumulators/framework/accumulator_set.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename Sample, typename Features, typename Weight>
+      struct accumulator_set;
+
+    // This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
+    template<typename Feature, typename AccumulatorSet>
+      mpl::apply< AccumulatorSet, Feature >::type const &
+      find_accumulator(AccumulatorSet const & acc);
+    template<typename Feature, typename AccumulatorSet>
+      mpl::apply< AccumulatorSet, Feature >::type::result_type
+      extract_result(AccumulatorSet const & acc);
+    template<typename Feature, typename AccumulatorSet>
+      mpl::apply< AccumulatorSet, Feature >::type &
+      find_accumulator(AccumulatorSet &acc  BOOST_ACCUMULATORS_PROTO_DISABLE_IF_IS_CONST);
+  }
+}
+
+++++ + +[[doxygen.accumulators_framework_reference.droppable__accumulator_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/droppable__accumulator_8hpp.html+++[Header < boost/accumulators/framework/accumulators/droppable_accumulator.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename Feature> struct as_feature<tag::droppable< Feature >>;
+    template<typename Feature>
+      struct as_weighted_feature<tag::droppable< Feature >>;
+
+    template<typename Feature> struct droppable;
+    template<typename Accumulator> struct droppable_accumulator;
+    template<typename Accumulator> struct droppable_accumulator_base;
+
+    template<typename Feature> struct feature_of<tag::droppable< Feature >>;
+
+    template<typename Accumulator> struct with_cached_result;
+    namespace tag {
+      template<typename Feature> struct as_droppable;
+
+      template<typename Feature> struct as_droppable<droppable< Feature >>;
+
+      template<typename Feature> struct droppable;
+    }
+  }
+}
+
+++++ + +[[doxygen.accumulators_framework_reference.external__accumulator_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/external__accumulator_8hpp.html+++[Header < boost/accumulators/framework/accumulators/external_accumulator.hpp >] + +Detailed API (Doxygen): xref:ROOT:attachment$doxygen/accumulators_framework_reference/structboost_1_1accumulators_1_1external.html[`boost::accumulators::external`] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename Feature, typename Tag, typename AccumulatorSet> 
+      struct external;
+
+    template<typename Feature, typename Tag, typename AccumulatorSet> 
+      struct feature_of<tag::external< Feature, Tag, AccumulatorSet >>;
+    namespace impl {
+    }
+    namespace tag {
+      template<typename Feature, typename Tag, typename AccumulatorSet> 
+        struct external;
+
+      template<typename Feature, typename Tag> 
+        struct external<Feature, Tag, void>;
+    }
+  }
+}
+
+++++ + +[[doxygen.accumulators_framework_reference.reference__accumulator_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/reference__accumulator_8hpp.html+++[Header < boost/accumulators/framework/accumulators/reference_accumulator.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename ValueType, typename Tag> 
+      struct feature_of<tag::reference< ValueType, Tag >>;
+    namespace extract {
+    }
+    namespace impl {
+      template<typename Referent, typename Tag> struct reference_accumulator_impl;
+    }
+    namespace tag {
+      template<typename Referent, typename Tag> struct reference;
+      template<typename Tag> struct reference_tag;
+    }
+  }
+}
+
+++++ + +[[doxygen.accumulators_framework_reference.value__accumulator_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/value__accumulator_8hpp.html+++[Header < boost/accumulators/framework/accumulators/value_accumulator.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename ValueType, typename Tag> 
+      struct feature_of<tag::value< ValueType, Tag >>;
+    namespace extract {
+    }
+    namespace impl {
+      template<typename ValueType, typename Tag> struct value_accumulator_impl;
+    }
+    namespace tag {
+      template<typename ValueType, typename Tag> struct value;
+      template<typename Tag> struct value_tag;
+    }
+  }
+}
+
+++++ + +[[doxygen.accumulators_framework_reference.depends__on_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/depends__on_8hpp.html+++[Header < boost/accumulators/framework/depends_on.hpp >] + +Detailed API (Doxygen): link:+++_attachments/doxygen/accumulators_framework_reference/structboost_1_1accumulators_1_1depends__on.html+++[`boost::accumulators::depends_on`] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename Feature> struct as_feature;
+    template<typename Feature> struct as_weighted_feature;
+    template<typename Feature1, typename Feature2, ...> struct depends_on;
+    template<typename Feature> struct feature_of;
+  }
+}
+
+++++ + +[[doxygen.accumulators_framework_reference.extractor_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/extractor_8hpp.html[Header < boost/accumulators/framework/extractor.hpp >] + +++++ +
BOOST_ACCUMULATORS_DEFINE_EXTRACTOR(Tag, Feature, ParamSeq)
+
+++++ + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename Feature> struct extractor;
+  }
+}
+
+++++ + +[[doxygen.accumulators_framework_reference.features_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/features_8hpp.html[Header < boost/accumulators/framework/features.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename Feature1, typename Feature2, ...> struct features;
+  }
+}
+
+++++ + +[[doxygen.accumulators_framework_reference.accumulator_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/accumulator_8hpp.html[Header < boost/accumulators/framework/parameters/accumulator.hpp >] + +[[doxygen.accumulators_framework_reference.sample_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/sample_8hpp.html[Header < boost/accumulators/framework/parameters/sample.hpp >] + +[[doxygen.accumulators_framework_reference.weight_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/weight_8hpp.html[Header < boost/accumulators/framework/parameters/weight.hpp >] + +[[doxygen.accumulators_framework_reference.weights_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/weights_8hpp.html[Header < boost/accumulators/framework/parameters/weights.hpp >] + +[[statistics_library_reference]] +== Statistics Library Reference + +[.accumulators-mini-toc] +**** +* xref:#doxygen.statistics_library_reference.statistics_8hpp[Header ] +* xref:#doxygen.statistics_library_reference.count_8hpp[Header ] +* xref:#doxygen.statistics_library_reference.covariance_8hpp[Header ] +* xref:#doxygen.statistics_library_reference.density_8hpp[Header ] +* xref:#+++doxygen.statistics_library_reference.error__of_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.error__of__mean_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.extended__p__square_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.extended__p__square__quantile_8hpp+++[Header ] +* xref:#doxygen.statistics_library_reference.kurtosis_8hpp[Header ] +* xref:#doxygen.statistics_library_reference.max_8hpp[Header ] +* xref:#doxygen.statistics_library_reference.mean_8hpp[Header ] +* xref:#doxygen.statistics_library_reference.median_8hpp[Header ] +* xref:#doxygen.statistics_library_reference.min_8hpp[Header ] +* xref:#doxygen.statistics_library_reference.moment_8hpp[Header ] +* xref:#+++doxygen.statistics_library_reference.p__square__cumul__dist_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.p__square__quantile_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.peaks__over__threshold_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.pot__quantile_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.pot__tail__mean_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.rolling__count_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.rolling__mean_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.rolling__moment_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.rolling__sum_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.rolling__variance_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.rolling__window_8hpp+++[Header ] +* xref:#doxygen.statistics_library_reference.skewness_8hpp[Header ] +* xref:#doxygen.statistics_library_reference.stats_8hpp[Header ] +* xref:#doxygen.statistics_library_reference.sum_8hpp[Header ] +* xref:#+++doxygen.statistics_library_reference.sum__kahan_8hpp+++[Header ] +* xref:#doxygen.statistics_library_reference.tail_8hpp[Header ] +* xref:#+++doxygen.statistics_library_reference.tail__mean_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.tail__quantile_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.tail__variate_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.tail__variate__means_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.times2__iterator_8hpp+++[Header ] +* xref:#doxygen.statistics_library_reference.variance_8hpp[Header ] +* xref:#doxygen.statistics_library_reference.covariate_8hpp[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__covariance_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__density_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__extended__p__square_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__kurtosis_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__mean_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__median_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__moment_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__p__square__cumul__dist_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__p__square__quantile_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__peaks__over__threshold_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__skewness_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__sum_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__sum__kahan_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__tail__mean_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__tail__quantile_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__tail__variate__means_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.weighted__variance_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.with__error_8hpp+++[Header ] +* xref:#+++doxygen.statistics_library_reference.statistics__fwd_8hpp+++[Header ] +**** + +[[doxygen.statistics_library_reference.statistics_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/statistics_8hpp.html[Header < boost/accumulators/statistics.hpp >] + +[[doxygen.statistics_library_reference.count_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/count_8hpp.html[Header < boost/accumulators/statistics/count.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::count > const count;
+    }
+    namespace impl {
+      struct count_impl;
+    }
+    namespace tag {
+      struct count;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.covariance_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/covariance_8hpp.html[Header < boost/accumulators/statistics/covariance.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename VariateType, typename VariateTag> 
+      struct as_weighted_feature<tag::covariance< VariateType, VariateTag >>;
+    template<typename VariateType, typename VariateTag> 
+      struct feature_of<tag::covariance< VariateType, VariateTag >>;
+    template<typename VariateType, typename VariateTag> 
+      struct feature_of<tag::weighted_covariance< VariateType, VariateTag >>;
+    namespace extract {
+      extractor< tag::abstract_covariance > const covariance;
+    }
+    namespace impl {
+      template<typename Sample, typename VariateType, typename VariateTag> 
+        struct covariance_impl;
+    }
+    namespace tag {
+      struct abstract_covariance;
+      template<typename VariateType, typename VariateTag> struct covariance;
+    }
+  }
+  namespace numeric {
+    namespace functional {
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct outer_product;
+
+      template<typename Left, typename Right> 
+        struct outer_product<Left, Right, std_vector_tag, std_vector_tag>;
+
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct outer_product_base;
+    }
+    namespace op {
+      struct outer_product;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.density_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/density_8hpp.html[Header < boost/accumulators/statistics/density.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_weighted_feature<tag::density>;
+    template<> struct feature_of<tag::weighted_density>;
+    namespace extract {
+      extractor< tag::density > const density;
+    }
+    namespace impl {
+      template<typename Sample> struct density_impl;
+    }
+    namespace tag {
+      struct density;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.error__of_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/error__of_8hpp.html+++[Header < boost/accumulators/statistics/error_of.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename Feature> struct as_feature<tag::error_of< Feature >>;
+    template<typename Feature> 
+      struct as_weighted_feature<tag::error_of< Feature >>;
+    namespace extract {
+    }
+    namespace impl {
+    }
+    namespace tag {
+      template<typename Feature> struct error_of;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.error__of__mean_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/error__of__mean_8hpp.html+++[Header < boost/accumulators/statistics/error_of_mean.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace impl {
+      template<typename Sample, typename Variance> struct error_of_mean_impl;
+    }
+    namespace tag {
+      template<> struct error_of<immediate_mean>;
+      template<> struct error_of<mean>;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.extended__p__square_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/extended__p__square_8hpp.html+++[Header < boost/accumulators/statistics/extended_p_square.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_weighted_feature<tag::extended_p_square>;
+    template<> struct feature_of<tag::weighted_extended_p_square>;
+    namespace extract {
+      extractor< tag::extended_p_square > const extended_p_square;
+    }
+    namespace impl {
+      template<typename Sample> struct extended_p_square_impl;
+    }
+    namespace tag {
+      struct extended_p_square;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.extended__p__square__quantile_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/extended__p__square__quantile_8hpp.html+++[Header < boost/accumulators/statistics/extended_p_square_quantile.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_feature<tag::extended_p_square_quantile(linear)>;
+    template<> struct as_feature<tag::extended_p_square_quantile(quadratic)>;
+    template<> 
+      struct as_feature<tag::weighted_extended_p_square_quantile(linear)>;
+    template<> 
+      struct as_feature<tag::weighted_extended_p_square_quantile(quadratic)>;
+    template<> struct as_weighted_feature<tag::extended_p_square_quantile>;
+    template<> 
+      struct as_weighted_feature<tag::extended_p_square_quantile_quadratic>;
+    template<> struct feature_of<tag::extended_p_square_quantile>;
+    template<> struct feature_of<tag::extended_p_square_quantile_quadratic>;
+    template<> struct feature_of<tag::weighted_extended_p_square_quantile>;
+    template<> 
+      struct feature_of<tag::weighted_extended_p_square_quantile_quadratic>;
+    namespace extract {
+      extractor< tag::extended_p_square_quantile > const extended_p_square_quantile;
+      extractor< tag::extended_p_square_quantile_quadratic > const extended_p_square_quantile_quadratic;
+      extractor< tag::weighted_extended_p_square_quantile > const weighted_extended_p_square_quantile;
+      extractor< tag::weighted_extended_p_square_quantile_quadratic > const weighted_extended_p_square_quantile_quadratic;
+    }
+    namespace impl {
+      template<typename Sample, typename Impl1, typename Impl2> 
+        struct extended_p_square_quantile_impl;
+    }
+    namespace tag {
+      struct extended_p_square_quantile;
+      struct extended_p_square_quantile_quadratic;
+      struct weighted_extended_p_square_quantile;
+      struct weighted_extended_p_square_quantile_quadratic;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.kurtosis_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/kurtosis_8hpp.html[Header < boost/accumulators/statistics/kurtosis.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_weighted_feature<tag::kurtosis>;
+    template<> struct feature_of<tag::weighted_kurtosis>;
+    namespace extract {
+      extractor< tag::kurtosis > const kurtosis;
+    }
+    namespace impl {
+      template<typename Sample> struct kurtosis_impl;
+    }
+    namespace tag {
+      struct kurtosis;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.max_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/max_8hpp.html[Header < boost/accumulators/statistics/max.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::max > const max;
+    }
+    namespace impl {
+      template<typename Sample> struct max_impl;
+    }
+    namespace tag {
+      struct max;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.mean_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/mean_8hpp.html[Header < boost/accumulators/statistics/mean.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_feature<tag::mean(immediate)>;
+    template<> struct as_feature<tag::mean(lazy)>;
+    template<typename VariateType, typename VariateTag> 
+      struct as_feature<tag::mean_of_variates< VariateType, VariateTag >(immediate)>;
+    template<typename VariateType, typename VariateTag> 
+      struct as_feature<tag::mean_of_variates< VariateType, VariateTag >(lazy)>;
+    template<> struct as_feature<tag::mean_of_weights(immediate)>;
+    template<> struct as_feature<tag::mean_of_weights(lazy)>;
+    template<> struct as_weighted_feature<tag::immediate_mean>;
+    template<typename VariateType, typename VariateTag> 
+      struct as_weighted_feature<tag::immediate_mean_of_variates< VariateType, VariateTag >>;
+    template<> struct as_weighted_feature<tag::mean>;
+    template<typename VariateType, typename VariateTag> 
+      struct as_weighted_feature<tag::mean_of_variates< VariateType, VariateTag >>;
+    template<> struct feature_of<tag::immediate_mean>;
+    template<typename VariateType, typename VariateTag> 
+      struct feature_of<tag::immediate_mean_of_variates< VariateType, VariateTag >>;
+    template<> struct feature_of<tag::immediate_mean_of_weights>;
+    template<> struct feature_of<tag::immediate_weighted_mean>;
+    template<typename VariateType, typename VariateTag> 
+      struct feature_of<tag::immediate_weighted_mean_of_variates< VariateType, VariateTag >>;
+    template<> struct feature_of<tag::weighted_mean>;
+    template<typename VariateType, typename VariateTag> 
+      struct feature_of<tag::weighted_mean_of_variates< VariateType, VariateTag >>;
+    namespace extract {
+      extractor< tag::mean > const mean;
+      extractor< tag::mean_of_weights > const mean_of_weights;
+    }
+    namespace impl {
+      template<typename Sample, typename Tag> struct immediate_mean_impl;
+      template<typename Sample, typename SumFeature> struct mean_impl;
+    }
+    namespace tag {
+      struct immediate_mean;
+      template<typename VariateType, typename VariateTag> 
+        struct immediate_mean_of_variates;
+      struct immediate_mean_of_weights;
+      struct mean;
+      template<typename VariateType, typename VariateTag> struct mean_of_variates;
+      struct mean_of_weights;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.median_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/median_8hpp.html[Header < boost/accumulators/statistics/median.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_feature<tag::median(with_density)>;
+    template<> 
+      struct as_feature<tag::median(with_p_square_cumulative_distribution)>;
+    template<> struct as_feature<tag::median(with_p_square_quantile)>;
+    template<> struct as_weighted_feature<tag::median>;
+    template<> struct as_weighted_feature<tag::with_density_median>;
+    template<> 
+      struct as_weighted_feature<tag::with_p_square_cumulative_distribution_median>;
+    template<> struct feature_of<tag::weighted_median>;
+    template<> struct feature_of<tag::with_density_median>;
+    template<> struct feature_of<tag::with_density_weighted_median>;
+    template<> 
+      struct feature_of<tag::with_p_square_cumulative_distribution_median>;
+    template<> 
+      struct feature_of<tag::with_p_square_cumulative_distribution_weighted_median>;
+    namespace extract {
+      extractor< tag::median > const median;
+      extractor< tag::with_density_median > const with_density_median;
+      extractor< tag::with_p_square_cumulative_distribution_median > const with_p_square_cumulative_distribution_median;
+    }
+    namespace impl {
+      template<typename Sample> struct median_impl;
+      template<typename Sample> struct with_density_median_impl;
+      template<typename Sample> 
+        struct with_p_square_cumulative_distribution_median_impl;
+    }
+    namespace tag {
+      struct median;
+      struct with_density_median;
+      struct with_p_square_cumulative_distribution_median;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.min_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/min_8hpp.html[Header < boost/accumulators/statistics/min.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::min > const min;
+    }
+    namespace impl {
+      template<typename Sample> struct min_impl;
+    }
+    namespace tag {
+      struct min;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.moment_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/moment_8hpp.html[Header < boost/accumulators/statistics/moment.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<int N> struct as_weighted_feature<tag::moment< N >>;
+    template<int N> struct feature_of<tag::weighted_moment< N >>;
+    namespace extract {
+    }
+    namespace impl {
+      template<typename N, typename Sample> struct moment_impl;
+    }
+    namespace tag {
+      template<int N> struct moment;
+    }
+  }
+  namespace numeric {
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.p__square__cumul__dist_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/p__square__cumul__dist_8hpp.html+++[Header < boost/accumulators/statistics/p_square_cumul_dist.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> 
+      struct as_weighted_feature<tag::p_square_cumulative_distribution>;
+    template<> 
+      struct feature_of<tag::weighted_p_square_cumulative_distribution>;
+    namespace extract {
+      extractor< tag::p_square_cumulative_distribution > const p_square_cumulative_distribution;
+    }
+    namespace impl {
+      template<typename Sample> struct p_square_cumulative_distribution_impl;
+    }
+    namespace tag {
+      struct p_square_cumulative_distribution;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.p__square__quantile_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/p__square__quantile_8hpp.html+++[Header < boost/accumulators/statistics/p_square_quantile.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_weighted_feature<tag::p_square_quantile>;
+    template<> struct feature_of<tag::weighted_p_square_quantile>;
+    namespace extract {
+      extractor< tag::p_square_quantile > const p_square_quantile;
+      extractor< tag::p_square_quantile_for_median > const p_square_quantile_for_median;
+    }
+    namespace impl {
+      template<typename Sample, typename Impl> struct p_square_quantile_impl;
+    }
+    namespace tag {
+      struct p_square_quantile;
+      struct p_square_quantile_for_median;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.peaks__over__threshold_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/peaks__over__threshold_8hpp.html+++[Header < boost/accumulators/statistics/peaks_over_threshold.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename LeftRight> 
+      struct as_feature<tag::peaks_over_threshold< LeftRight >(with_threshold_probability)>;
+    template<typename LeftRight> 
+      struct as_feature<tag::peaks_over_threshold< LeftRight >(with_threshold_value)>;
+    template<typename LeftRight> 
+      struct as_weighted_feature<tag::peaks_over_threshold< LeftRight >>;
+    template<typename LeftRight> 
+      struct as_weighted_feature<tag::peaks_over_threshold_prob< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::peaks_over_threshold< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::peaks_over_threshold_prob< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::weighted_peaks_over_threshold< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::weighted_peaks_over_threshold_prob< LeftRight >>;
+    namespace extract {
+      extractor< tag::abstract_peaks_over_threshold > const peaks_over_threshold;
+    }
+    namespace impl {
+      template<typename Sample, typename LeftRight> 
+        struct peaks_over_threshold_impl;
+      template<typename Sample, typename LeftRight> 
+        struct peaks_over_threshold_prob_impl;
+    }
+    namespace tag {
+      struct abstract_peaks_over_threshold;
+      template<typename LeftRight> struct peaks_over_threshold;
+      template<typename LeftRight> struct peaks_over_threshold_prob;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.pot__quantile_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/pot__quantile_8hpp.html+++[Header < boost/accumulators/statistics/pot_quantile.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename LeftRight> 
+      struct as_feature<tag::pot_quantile< LeftRight >(with_threshold_probability)>;
+    template<typename LeftRight> 
+      struct as_feature<tag::pot_quantile< LeftRight >(with_threshold_value)>;
+    template<typename LeftRight> 
+      struct as_feature<tag::weighted_pot_quantile< LeftRight >(with_threshold_probability)>;
+    template<typename LeftRight> 
+      struct as_feature<tag::weighted_pot_quantile< LeftRight >(with_threshold_value)>;
+    template<typename LeftRight> 
+      struct as_weighted_feature<tag::pot_quantile< LeftRight >>;
+    template<typename LeftRight> 
+      struct as_weighted_feature<tag::pot_quantile_prob< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::pot_quantile< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::pot_quantile_prob< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::weighted_pot_quantile< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::weighted_pot_quantile_prob< LeftRight >>;
+    namespace impl {
+      template<typename Sample, typename Impl, typename LeftRight> 
+        struct pot_quantile_impl;
+    }
+    namespace tag {
+      template<typename LeftRight> struct pot_quantile;
+      template<typename LeftRight> struct pot_quantile_prob;
+      template<typename LeftRight> struct weighted_pot_quantile;
+      template<typename LeftRight> struct weighted_pot_quantile_prob;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.pot__tail__mean_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/pot__tail__mean_8hpp.html+++[Header < boost/accumulators/statistics/pot_tail_mean.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename LeftRight> 
+      struct as_feature<tag::pot_tail_mean< LeftRight >(with_threshold_probability)>;
+    template<typename LeftRight> 
+      struct as_feature<tag::pot_tail_mean< LeftRight >(with_threshold_value)>;
+    template<typename LeftRight> 
+      struct as_feature<tag::weighted_pot_tail_mean< LeftRight >(with_threshold_probability)>;
+    template<typename LeftRight> 
+      struct as_feature<tag::weighted_pot_tail_mean< LeftRight >(with_threshold_value)>;
+    template<typename LeftRight> 
+      struct as_weighted_feature<tag::pot_tail_mean< LeftRight >>;
+    template<typename LeftRight> 
+      struct as_weighted_feature<tag::pot_tail_mean_prob< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::pot_tail_mean< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::pot_tail_mean_prob< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::weighted_pot_tail_mean< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::weighted_pot_tail_mean_prob< LeftRight >>;
+    namespace impl {
+      template<typename Sample, typename Impl, typename LeftRight> 
+        struct pot_tail_mean_impl;
+    }
+    namespace tag {
+      template<typename LeftRight> struct pot_tail_mean;
+      template<typename LeftRight> struct pot_tail_mean_prob;
+      template<typename LeftRight> struct weighted_pot_tail_mean;
+      template<typename LeftRight> struct weighted_pot_tail_mean_prob;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.rolling__count_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/rolling__count_8hpp.html+++[Header < boost/accumulators/statistics/rolling_count.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::rolling_count > const rolling_count;
+    }
+    namespace impl {
+      template<typename Sample> struct rolling_count_impl;
+    }
+    namespace tag {
+      struct rolling_count;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.rolling__mean_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/rolling__mean_8hpp.html+++[Header < boost/accumulators/statistics/rolling_mean.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_feature<tag::rolling_mean(immediate)>;
+    template<> struct as_feature<tag::rolling_mean(lazy)>;
+    template<> struct feature_of<tag::immediate_rolling_mean>;
+    template<> struct feature_of<tag::lazy_rolling_mean>;
+    namespace extract {
+      extractor< tag::lazy_rolling_mean > const lazy_rolling_mean;
+      extractor< tag::immediate_rolling_mean > const immediate_rolling_mean;
+      extractor< tag::rolling_mean > const rolling_mean;
+    }
+    namespace impl {
+      template<typename Sample> struct immediate_rolling_mean_impl;
+      template<typename Sample> struct lazy_rolling_mean_impl;
+    }
+    namespace tag {
+      struct immediate_rolling_mean;
+      struct lazy_rolling_mean;
+      struct rolling_mean;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.rolling__moment_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/rolling__moment_8hpp.html+++[Header < boost/accumulators/statistics/rolling_moment.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+    }
+    namespace impl {
+      template<typename N, typename Sample> struct rolling_moment_impl;
+    }
+    namespace tag {
+      template<int N> struct rolling_moment;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.rolling__sum_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/rolling__sum_8hpp.html+++[Header < boost/accumulators/statistics/rolling_sum.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::rolling_sum > const rolling_sum;
+    }
+    namespace impl {
+      template<typename Sample> struct rolling_sum_impl;
+    }
+    namespace tag {
+      struct rolling_sum;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.rolling__variance_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/rolling__variance_8hpp.html+++[Header < boost/accumulators/statistics/rolling_variance.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_feature<tag::rolling_variance(immediate)>;
+    template<> struct as_feature<tag::rolling_variance(lazy)>;
+    template<> struct feature_of<tag::immediate_rolling_variance>;
+    template<> struct feature_of<tag::lazy_rolling_variance>;
+    namespace extract {
+      extractor< tag::lazy_rolling_variance > const lazy_rolling_variance;
+      extractor< tag::immediate_rolling_variance > const immediate_rolling_variance;
+      extractor< tag::rolling_variance > const rolling_variance;
+    }
+    namespace impl {
+      template<typename Sample> struct immediate_rolling_variance_impl;
+      template<typename Sample> struct lazy_rolling_variance_impl;
+    }
+    namespace tag {
+      struct immediate_rolling_variance;
+      struct lazy_rolling_variance;
+      struct rolling_variance;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.rolling__window_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/rolling__window_8hpp.html+++[Header < boost/accumulators/statistics/rolling_window.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::rolling_window_plus1 > const rolling_window_plus1;
+      extractor< tag::rolling_window > const rolling_window;
+    }
+    namespace impl {
+      template<typename Sample> struct rolling_window_impl;
+      template<typename Sample> struct rolling_window_plus1_impl;
+      template<typename Args> 
+        bool is_rolling_window_plus1_full(Args const & args);
+    }
+    namespace tag {
+      struct rolling_window;
+      struct rolling_window_plus1;
+    }
+  }
+  namespace serialization {
+    template<typename Archive, typename T> 
+      void save(Archive & ar, const circular_buffer< T > & b, 
+                const unsigned int);
+    template<typename Archive, typename T> 
+      void load(Archive & ar, circular_buffer< T > & b, const unsigned int);
+    template<typename Archive, typename T> 
+      void serialize(Archive & ar, circular_buffer< T > & b, 
+                     const unsigned int version);
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.skewness_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/skewness_8hpp.html[Header < boost/accumulators/statistics/skewness.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_weighted_feature<tag::skewness>;
+    template<> struct feature_of<tag::weighted_skewness>;
+    namespace extract {
+      extractor< tag::skewness > const skewness;
+    }
+    namespace impl {
+      template<typename Sample> struct skewness_impl;
+    }
+    namespace tag {
+      struct skewness;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.stats_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/stats_8hpp.html[Header < boost/accumulators/statistics/stats.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename Stat1, typename Stat2, ...> struct stats;
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.sum_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/sum_8hpp.html[Header < boost/accumulators/statistics/sum.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_weighted_feature<tag::sum>;
+    template<typename VariateType, typename VariateTag> 
+      struct feature_of<tag::sum_of_variates< VariateType, VariateTag >>;
+    template<> struct feature_of<tag::weighted_sum>;
+    namespace extract {
+      extractor< tag::sum > const sum;
+      extractor< tag::sum_of_weights > const sum_of_weights;
+      extractor< tag::abstract_sum_of_variates > const sum_of_variates;
+    }
+    namespace impl {
+      template<typename Sample, typename Tag> struct sum_impl;
+    }
+    namespace tag {
+      struct abstract_sum_of_variates;
+      struct sum;
+      template<typename VariateType, typename VariateTag> struct sum_of_variates;
+      struct sum_of_weights;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.sum__kahan_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/sum__kahan_8hpp.html+++[Header < boost/accumulators/statistics/sum_kahan.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_feature<tag::sum(kahan)>;
+    template<> struct as_feature<tag::sum_of_weights(kahan)>;
+    template<> struct as_weighted_feature<tag::sum_kahan>;
+    template<> struct feature_of<tag::sum_kahan>;
+    template<typename VariateType, typename VariateTag> 
+      struct feature_of<tag::sum_of_variates_kahan< VariateType, VariateTag >>;
+    template<> struct feature_of<tag::sum_of_weights_kahan>;
+    template<> struct feature_of<tag::weighted_sum_kahan>;
+    namespace extract {
+      extractor< tag::sum_kahan > const sum_kahan;
+      extractor< tag::sum_of_weights_kahan > const sum_of_weights_kahan;
+      extractor< tag::abstract_sum_of_variates > const sum_of_variates_kahan;
+    }
+    namespace impl {
+      template<typename Sample, typename Tag> struct sum_kahan_impl;
+    }
+    namespace tag {
+      struct sum_kahan;
+      template<typename VariateType, typename VariateTag> 
+        struct sum_of_variates_kahan;
+      struct sum_of_weights_kahan;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.tail_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/tail_8hpp.html[Header < boost/accumulators/statistics/tail.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename LeftRight> struct feature_of<tag::tail< LeftRight >>;
+
+    template<typename T> struct tail_cache_size_named_arg;
+
+    template<> struct tail_cache_size_named_arg<left>;
+    template<> struct tail_cache_size_named_arg<right>;
+    namespace extract {
+      extractor< tag::abstract_tail > const tail;
+    }
+    namespace impl {
+      template<typename Sample, typename LeftRight> struct tail_impl;
+    }
+    namespace tag {
+      struct abstract_tail;
+      template<typename LeftRight> struct tail;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.tail__mean_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/tail__mean_8hpp.html+++[Header < boost/accumulators/statistics/tail_mean.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename LeftRight> 
+      struct as_weighted_feature<tag::non_coherent_tail_mean< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::coherent_tail_mean< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::non_coherent_tail_mean< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::non_coherent_weighted_tail_mean< LeftRight >>;
+    namespace extract {
+      extractor< tag::abstract_non_coherent_tail_mean > const non_coherent_tail_mean;
+      extractor< tag::tail_mean > const coherent_tail_mean;
+    }
+    namespace impl {
+      template<typename Sample, typename LeftRight> 
+        struct coherent_tail_mean_impl;
+      template<typename Sample, typename LeftRight> 
+        struct non_coherent_tail_mean_impl;
+    }
+    namespace tag {
+      struct abstract_non_coherent_tail_mean;
+      template<typename LeftRight> struct coherent_tail_mean;
+      template<typename LeftRight> struct non_coherent_tail_mean;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.tail__quantile_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/tail__quantile_8hpp.html+++[Header < boost/accumulators/statistics/tail_quantile.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename LeftRight> 
+      struct as_weighted_feature<tag::tail_quantile< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::tail_quantile< LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::weighted_tail_quantile< LeftRight >>;
+    namespace extract {
+      extractor< tag::quantile > const tail_quantile;
+    }
+    namespace impl {
+      template<typename Sample, typename LeftRight> struct tail_quantile_impl;
+    }
+    namespace tag {
+      template<typename LeftRight> struct tail_quantile;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.tail__variate_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/tail__variate_8hpp.html+++[Header < boost/accumulators/statistics/tail_variate.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename VariateType, typename VariateTag, typename LeftRight> 
+      struct feature_of<tag::tail_variate< VariateType, VariateTag, LeftRight >>;
+    template<typename LeftRight> 
+      struct feature_of<tag::tail_weights< LeftRight >>;
+    namespace extract {
+      extractor< tag::abstract_tail_variate > const tail_variate;
+      extractor< tag::abstract_tail_weights > const tail_weights;
+    }
+    namespace impl {
+      template<typename VariateType, typename VariateTag, typename LeftRight> 
+        struct tail_variate_impl;
+    }
+    namespace tag {
+      struct abstract_tail_variate;
+      struct abstract_tail_weights;
+      template<typename VariateType, typename VariateTag, typename LeftRight> 
+        struct tail_variate;
+      template<typename LeftRight> struct tail_weights;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.tail__variate__means_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/tail__variate__means_8hpp.html+++[Header < boost/accumulators/statistics/tail_variate_means.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename LeftRight, typename VariateType, typename VariateTag> 
+      struct as_feature<tag::tail_variate_means< LeftRight, VariateType, VariateTag >(absolute)>;
+    template<typename LeftRight, typename VariateType, typename VariateTag> 
+      struct as_feature<tag::tail_variate_means< LeftRight, VariateType, VariateTag >(relative)>;
+    template<typename LeftRight, typename VariateType, typename VariateTag> 
+      struct as_weighted_feature<tag::absolute_tail_variate_means< LeftRight, VariateType, VariateTag >>;
+    template<typename LeftRight, typename VariateType, typename VariateTag> 
+      struct as_weighted_feature<tag::relative_tail_variate_means< LeftRight, VariateType, VariateTag >>;
+    template<typename LeftRight, typename VariateType, typename VariateTag> 
+      struct feature_of<tag::absolute_tail_variate_means< LeftRight, VariateType, VariateTag >>;
+    template<typename LeftRight, typename VariateType, typename VariateTag> 
+      struct feature_of<tag::absolute_weighted_tail_variate_means< LeftRight, VariateType, VariateTag >>;
+    template<typename LeftRight, typename VariateType, typename VariateTag> 
+      struct feature_of<tag::relative_tail_variate_means< LeftRight, VariateType, VariateTag >>;
+    template<typename LeftRight, typename VariateType, typename VariateTag> 
+      struct feature_of<tag::relative_weighted_tail_variate_means< LeftRight, VariateType, VariateTag >>;
+    namespace extract {
+      extractor< tag::abstract_absolute_tail_variate_means > const tail_variate_means;
+      extractor< tag::abstract_relative_tail_variate_means > const relative_tail_variate_means;
+    }
+    namespace impl {
+      template<typename Sample, typename Impl, typename LeftRight, 
+               typename VariateTag> 
+        struct tail_variate_means_impl;
+    }
+    namespace tag {
+      template<typename LeftRight, typename VariateType, typename VariateTag> 
+        struct absolute_tail_variate_means;
+      struct abstract_absolute_tail_variate_means;
+      struct abstract_relative_tail_variate_means;
+      template<typename LeftRight, typename VariateType, typename VariateTag> 
+        struct relative_tail_variate_means;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.times2__iterator_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/times2__iterator_8hpp.html+++[Header < boost/accumulators/statistics/times2_iterator.hpp >] + +[[doxygen.statistics_library_reference.variance_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/variance_8hpp.html[Header < boost/accumulators/statistics/variance.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_feature<tag::variance(immediate)>;
+    template<> struct as_feature<tag::variance(lazy)>;
+    template<> struct as_weighted_feature<tag::lazy_variance>;
+    template<> struct as_weighted_feature<tag::variance>;
+    template<> struct feature_of<tag::lazy_variance>;
+    template<> struct feature_of<tag::lazy_weighted_variance>;
+    template<> struct feature_of<tag::weighted_variance>;
+    namespace extract {
+      extractor< tag::lazy_variance > const lazy_variance;
+      extractor< tag::variance > const variance;
+    }
+    namespace impl {
+      template<typename Sample, typename MeanFeature> struct lazy_variance_impl;
+      template<typename Sample, typename MeanFeature, typename Tag> 
+        struct variance_impl;
+    }
+    namespace tag {
+      struct lazy_variance;
+      struct variance;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.covariate_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/covariate_8hpp.html[Header < boost/accumulators/statistics/variates/covariate.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    boost::parameter::keyword< tag ::covariate1 > const covariate1;
+    boost::parameter::keyword< tag ::covariate2 > const covariate2;
+    namespace tag {
+      struct covariate1;
+      struct covariate2;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__covariance_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__covariance_8hpp.html+++[Header < boost/accumulators/statistics/weighted_covariance.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::abstract_covariance > const weighted_covariance;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight, typename VariateType, 
+               typename VariateTag> 
+        struct weighted_covariance_impl;
+    }
+    namespace tag {
+      template<typename VariateType, typename VariateTag> 
+        struct weighted_covariance;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__density_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__density_8hpp.html+++[Header < boost/accumulators/statistics/weighted_density.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::density > const weighted_density;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight> struct weighted_density_impl;
+    }
+    namespace tag {
+      struct weighted_density;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__extended__p__square_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__extended__p__square_8hpp.html+++[Header < boost/accumulators/statistics/weighted_extended_p_square.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::weighted_extended_p_square > const weighted_extended_p_square;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight> 
+        struct weighted_extended_p_square_impl;
+    }
+    namespace tag {
+      struct weighted_extended_p_square;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__kurtosis_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__kurtosis_8hpp.html+++[Header < boost/accumulators/statistics/weighted_kurtosis.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::weighted_kurtosis > const weighted_kurtosis;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight> struct weighted_kurtosis_impl;
+    }
+    namespace tag {
+      struct weighted_kurtosis;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__mean_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__mean_8hpp.html+++[Header < boost/accumulators/statistics/weighted_mean.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_feature<tag::weighted_mean(immediate)>;
+    template<> struct as_feature<tag::weighted_mean(lazy)>;
+    template<typename VariateType, typename VariateTag> 
+      struct as_feature<tag::weighted_mean_of_variates< VariateType, VariateTag >(immediate)>;
+    template<typename VariateType, typename VariateTag> 
+      struct as_feature<tag::weighted_mean_of_variates< VariateType, VariateTag >(lazy)>;
+    namespace extract {
+      extractor< tag::mean > const weighted_mean;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight, typename Tag> 
+        struct immediate_weighted_mean_impl;
+      template<typename Sample, typename Weight, typename Tag> 
+        struct weighted_mean_impl;
+    }
+    namespace tag {
+      struct immediate_weighted_mean;
+      template<typename VariateType, typename VariateTag> 
+        struct immediate_weighted_mean_of_variates;
+      struct weighted_mean;
+      template<typename VariateType, typename VariateTag> 
+        struct weighted_mean_of_variates;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__median_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__median_8hpp.html+++[Header < boost/accumulators/statistics/weighted_median.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_feature<tag::weighted_median(with_density)>;
+    template<> 
+      struct as_feature<tag::weighted_median(with_p_square_cumulative_distribution)>;
+    template<> struct as_feature<tag::weighted_median(with_p_square_quantile)>;
+    namespace extract {
+      extractor< tag::median > const weighted_median;
+    }
+    namespace impl {
+      template<typename Sample> struct weighted_median_impl;
+      template<typename Sample> struct with_density_weighted_median_impl;
+      template<typename Sample, typename Weight> 
+        struct with_p_square_cumulative_distribution_weighted_median_impl;
+    }
+    namespace tag {
+      struct weighted_median;
+      struct with_density_weighted_median;
+      struct with_p_square_cumulative_distribution_weighted_median;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__moment_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__moment_8hpp.html+++[Header < boost/accumulators/statistics/weighted_moment.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+    }
+    namespace impl {
+      template<typename N, typename Sample, typename Weight> 
+        struct weighted_moment_impl;
+    }
+    namespace tag {
+      template<int N> struct weighted_moment;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__p__square__cumul__dist_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__p__square__cumul__dist_8hpp.html+++[Header < boost/accumulators/statistics/weighted_p_square_cumul_dist.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::weighted_p_square_cumulative_distribution > const weighted_p_square_cumulative_distribution;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight> 
+        struct weighted_p_square_cumulative_distribution_impl;
+    }
+    namespace tag {
+      struct weighted_p_square_cumulative_distribution;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__p__square__quantile_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__p__square__quantile_8hpp.html+++[Header < boost/accumulators/statistics/weighted_p_square_quantile.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::weighted_p_square_quantile > const weighted_p_square_quantile;
+      extractor< tag::weighted_p_square_quantile_for_median > const weighted_p_square_quantile_for_median;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight, typename Impl> 
+        struct weighted_p_square_quantile_impl;
+    }
+    namespace tag {
+      struct weighted_p_square_quantile;
+      struct weighted_p_square_quantile_for_median;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__peaks__over__threshold_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__peaks__over__threshold_8hpp.html+++[Header < boost/accumulators/statistics/weighted_peaks_over_threshold.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename LeftRight> 
+      struct as_feature<tag::weighted_peaks_over_threshold< LeftRight >(with_threshold_probability)>;
+    template<typename LeftRight> 
+      struct as_feature<tag::weighted_peaks_over_threshold< LeftRight >(with_threshold_value)>;
+    namespace extract {
+      extractor< tag::abstract_peaks_over_threshold > const weighted_peaks_over_threshold;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight, typename LeftRight> 
+        struct weighted_peaks_over_threshold_impl;
+      template<typename Sample, typename Weight, typename LeftRight> 
+        struct weighted_peaks_over_threshold_prob_impl;
+    }
+    namespace tag {
+      template<typename LeftRight> struct weighted_peaks_over_threshold;
+      template<typename LeftRight> struct weighted_peaks_over_threshold_prob;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__skewness_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__skewness_8hpp.html+++[Header < boost/accumulators/statistics/weighted_skewness.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::weighted_skewness > const weighted_skewness;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight> struct weighted_skewness_impl;
+    }
+    namespace tag {
+      struct weighted_skewness;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__sum_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__sum_8hpp.html+++[Header < boost/accumulators/statistics/weighted_sum.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename VariateType, typename VariateTag> 
+      struct feature_of<tag::weighted_sum_of_variates< VariateType, VariateTag >>;
+    namespace extract {
+      extractor< tag::weighted_sum > const weighted_sum;
+      extractor< tag::abstract_weighted_sum_of_variates > const weighted_sum_of_variates;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight, typename Tag> 
+        struct weighted_sum_impl;
+    }
+    namespace tag {
+      struct abstract_weighted_sum_of_variates;
+      struct weighted_sum;
+      template<typename VariateType, typename VariateTag> 
+        struct weighted_sum_of_variates;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__sum__kahan_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__sum__kahan_8hpp.html+++[Header < boost/accumulators/statistics/weighted_sum_kahan.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_feature<tag::weighted_sum(kahan)>;
+    template<typename VariateType, typename VariateTag> 
+      struct feature_of<tag::weighted_sum_of_variates_kahan< VariateType, VariateTag >>;
+    namespace extract {
+      extractor< tag::weighted_sum_kahan > const weighted_sum_kahan;
+      extractor< tag::abstract_weighted_sum_of_variates > const weighted_sum_of_variates_kahan;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight, typename Tag> 
+        struct weighted_sum_kahan_impl;
+    }
+    namespace tag {
+      struct weighted_sum_kahan;
+      template<typename VariateType, typename VariateTag> 
+        struct weighted_sum_of_variates_kahan;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__tail__mean_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__tail__mean_8hpp.html+++[Header < boost/accumulators/statistics/weighted_tail_mean.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::abstract_non_coherent_tail_mean > const non_coherent_weighted_tail_mean;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight, typename LeftRight> 
+        struct non_coherent_weighted_tail_mean_impl;
+    }
+    namespace tag {
+      template<typename LeftRight> struct non_coherent_weighted_tail_mean;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__tail__quantile_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__tail__quantile_8hpp.html+++[Header < boost/accumulators/statistics/weighted_tail_quantile.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    namespace extract {
+      extractor< tag::quantile > const weighted_tail_quantile;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight, typename LeftRight> 
+        struct weighted_tail_quantile_impl;
+    }
+    namespace tag {
+      template<typename LeftRight> struct weighted_tail_quantile;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__tail__variate__means_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__tail__variate__means_8hpp.html+++[Header < boost/accumulators/statistics/weighted_tail_variate_means.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename LeftRight, typename VariateType, typename VariateTag> 
+      struct as_feature<tag::weighted_tail_variate_means< LeftRight, VariateType, VariateTag >(absolute)>;
+    template<typename LeftRight, typename VariateType, typename VariateTag> 
+      struct as_feature<tag::weighted_tail_variate_means< LeftRight, VariateType, VariateTag >(relative)>;
+    namespace extract {
+      extractor< tag::abstract_absolute_tail_variate_means > const weighted_tail_variate_means;
+      extractor< tag::abstract_relative_tail_variate_means > const relative_weighted_tail_variate_means;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight, typename Impl, 
+               typename LeftRight, typename VariateType> 
+        struct weighted_tail_variate_means_impl;
+    }
+    namespace tag {
+      template<typename LeftRight, typename VariateType, typename VariateTag> 
+        struct absolute_weighted_tail_variate_means;
+      template<typename LeftRight, typename VariateType, typename VariateTag> 
+        struct relative_weighted_tail_variate_means;
+    }
+  }
+  namespace numeric {
+    namespace functional {
+      template<typename T, typename U> struct multiply_and_promote_to_double;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.weighted__variance_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/weighted__variance_8hpp.html+++[Header < boost/accumulators/statistics/weighted_variance.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<> struct as_feature<tag::weighted_variance(immediate)>;
+    template<> struct as_feature<tag::weighted_variance(lazy)>;
+    namespace extract {
+      extractor< tag::lazy_weighted_variance > const lazy_weighted_variance;
+      extractor< tag::weighted_variance > const weighted_variance;
+    }
+    namespace impl {
+      template<typename Sample, typename Weight, typename MeanFeature> 
+        struct lazy_weighted_variance_impl;
+      template<typename Sample, typename Weight, typename MeanFeature, 
+               typename Tag> 
+        struct weighted_variance_impl;
+    }
+    namespace tag {
+      struct lazy_weighted_variance;
+      struct weighted_variance;
+    }
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.with__error_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/with__error_8hpp.html+++[Header < boost/accumulators/statistics/with_error.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    template<typename Feature1, typename Feature2, ...> struct with_error;
+  }
+}
+
+++++ + +[[doxygen.statistics_library_reference.statistics__fwd_8hpp]] +=== link:+++_attachments/doxygen/accumulators_framework_reference/statistics__fwd_8hpp.html+++[Header < boost/accumulators/statistics_fwd.hpp >] + +++++ +
namespace boost {
+  namespace accumulators {
+    struct absolute;
+    struct for_median;
+    struct immediate;
+    struct kahan;
+    struct lazy;
+    struct left;
+    struct linear;
+    struct quadratic;
+    struct regular;
+    struct relative;
+    struct right;
+    struct unweighted;
+    struct weighted;
+    struct with_density;
+    struct with_p_square_cumulative_distribution;
+    struct with_p_square_quantile;
+    struct with_threshold_probability;
+    struct with_threshold_value;
+    namespace extract {
+      extractor< tag::quantile > const quantile;
+      extractor< tag::tail_mean > const tail_mean;
+    }
+    namespace impl {
+      template<typename Sample> struct rolling_mean_impl;
+    }
+    namespace tag {
+      template<typename VariateType, typename VariateTag, typename LeftRight> 
+        struct left_tail_variate;
+      struct quantile;
+      template<typename VariateType, typename VariateTag, typename LeftRight> 
+        struct right_tail_variate;
+      struct tail_mean;
+      template<typename LeftRight, typename VariateType, typename VariateTag> 
+        struct tail_variate_means;
+      template<typename LeftRight, typename VariateType, typename VariateTag> 
+        struct weighted_tail_variate_means;
+    }
+  }
+}
+
+++++ + +[[numeric_operators_library_reference]] +== Numeric Operators Library Reference + +[.accumulators-mini-toc] +**** +* xref:#doxygen.numeric_operators_library_reference.functional_8hpp[Header ] +* xref:#doxygen.numeric_operators_library_reference.complex_8hpp[Header ] +* xref:#doxygen.numeric_operators_library_reference.valarray_8hpp[Header ] +* xref:#doxygen.numeric_operators_library_reference.vector_8hpp[Header ] +**** + +[[doxygen.numeric_operators_library_reference.functional_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/functional_8hpp.html[Header < boost/accumulators/numeric/functional.hpp >] + +++++ +
namespace boost {
+  namespace numeric {
+    template<typename T> struct default_;
+    template<typename T> struct one;
+    template<typename T> struct one_or_default;
+    template<typename T> struct zero;
+    template<typename T> struct zero_or_default;
+
+    T const default_< T >::value;
+    T const one< T >::value;
+    T const zero< T >::value;
+    template<typename To, typename From> 
+      lazy_disable_if< is_const< From >, mpl::if_< is_same< To, From >, To &, To > >::type 
+      promote(From & from);
+    template<typename To, typename From> 
+      mpl::if_< is_same< Toconst, Fromconst >, Toconst &, Toconst >::type 
+      promote(From const & from);
+    namespace functional {
+      template<typename Arg, typename Tag> struct as_max;
+      template<typename Arg, typename EnableIf> struct as_max_base;
+      template<typename Arg, typename Tag> struct as_min;
+      template<typename Arg, typename EnableIf> struct as_min_base;
+
+      template<typename Arg> 
+        struct as_min_base<Arg, typename enable_if< is_floating_point< Arg > >::type>;
+
+      template<typename Arg, typename Tag> struct as_one;
+      template<typename Arg, typename EnableIf> struct as_one_base;
+      template<typename Arg, typename Tag> struct as_zero;
+      template<typename Arg, typename EnableIf> struct as_zero_base;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct assign;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct assign_base;
+      template<typename Arg, typename Tag = typename tag<Arg>::type> 
+        struct complement;
+      template<typename Arg, typename EnableIf = void> struct complement_base;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct divides;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct divides_assign;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct divides_assign_base;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct divides_base;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct equal_to;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct equal_to_base;
+      template<typename Left, typename Right, typename LeftTag, 
+               typename RightTag> 
+        struct fdiv;
+      template<typename Left, typename Right, typename EnableIf> struct fdiv_base;
+
+      template<typename Left, typename Right> 
+        struct fdiv_base<Left, Right, typename enable_if< are_integral< Left, Right > >::type>;
+
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct greater;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct greater_base;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct greater_equal;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct greater_equal_base;
+      template<typename Left, typename Right> struct left_ref;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct less;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct less_base;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct less_equal;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct less_equal_base;
+      template<typename Arg, typename Tag = typename tag<Arg>::type> 
+        struct logical_not;
+      template<typename Arg, typename EnableIf = void> struct logical_not_base;
+      template<typename Left, typename Right, typename LeftTag, 
+               typename RightTag> 
+        struct max_assign;
+      template<typename Left, typename Right, typename EnableIf> 
+        struct max_assign_base;
+      template<typename Left, typename Right, typename LeftTag, 
+               typename RightTag> 
+        struct min_assign;
+      template<typename Left, typename Right, typename EnableIf> 
+        struct min_assign_base;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct minus;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct minus_assign;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct minus_assign_base;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct minus_base;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct modulus;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct modulus_assign;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct modulus_assign_base;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct modulus_base;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct multiplies;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct multiplies_assign;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct multiplies_assign_base;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct multiplies_base;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct not_equal_to;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct not_equal_to_base;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct plus;
+      template<typename Left, typename Right, 
+               typename LeftTag = typename tag<Left>::type, 
+               typename RightTag = typename tag<Right>::type> 
+        struct plus_assign;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct plus_assign_base;
+      template<typename Left, typename Right, typename EnableIf = void> 
+        struct plus_base;
+      template<typename To, typename From, typename ToTag, typename FromTag> 
+        struct promote;
+      template<typename To, typename From, typename EnableIf> struct promote_base;
+
+      template<typename ToFrom> struct promote_base<ToFrom, ToFrom, void>;
+
+      template<typename Arg, typename Tag = typename tag<Arg>::type> 
+        struct unary_minus;
+      template<typename Arg, typename EnableIf = void> struct unary_minus_base;
+      template<typename Arg, typename Tag = typename tag<Arg>::type> 
+        struct unary_plus;
+      template<typename Arg, typename EnableIf = void> struct unary_plus_base;
+    }
+    namespace op {
+      struct as_max;
+      struct as_min;
+      struct as_one;
+      struct as_zero;
+      struct assign;
+      struct complement;
+      struct divides;
+      struct divides_assign;
+      struct equal_to;
+      struct fdiv;
+      struct greater;
+      struct greater_equal;
+      struct less;
+      struct less_equal;
+      struct logical_not;
+      struct max_assign;
+      struct min_assign;
+      struct minus;
+      struct minus_assign;
+      struct modulus;
+      struct modulus_assign;
+      struct multiplies;
+      struct multiplies_assign;
+      struct not_equal_to;
+      struct plus;
+      struct plus_assign;
+      template<typename To> struct promote;
+      struct unary_minus;
+      struct unary_plus;
+    }
+  }
+}
+
+++++ + +[[doxygen.numeric_operators_library_reference.complex_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/complex_8hpp.html[Header < boost/accumulators/numeric/functional/complex.hpp >] + +++++ +
namespace boost {
+  namespace numeric {
+    namespace operators {
+      template<typename T, typename U> 
+        disable_if< mpl::or_< is_same< T, U >, is_same< std::complex< T >, U > >, std::complex< T > >::type 
+        operator*(std::complex< T > ri, U const & u);
+      template<typename T, typename U> 
+        disable_if< mpl::or_< is_same< T, U >, is_same< std::complex< T >, U > >, std::complex< T > >::type 
+        operator/(std::complex< T > ri, U const & u);
+    }
+  }
+}
+
+++++ + +[[doxygen.numeric_operators_library_reference.valarray_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/valarray_8hpp.html[Header < boost/accumulators/numeric/functional/valarray.hpp >] + +++++ +
namespace boost {
+  namespace numeric {
+    namespace functional {
+      template<typename T> struct as_max<T, std_valarray_tag>;
+      template<typename T> struct as_min<T, std_valarray_tag>;
+      template<typename T> struct as_one<T, std_valarray_tag>;
+      template<typename T> struct as_zero<T, std_valarray_tag>;
+      template<typename Left, typename Right, typename RightTag> 
+        struct fdiv<Left, Right, std_valarray_tag, RightTag>;
+      template<typename Left, typename Right> 
+        struct max_assign<Left, Right, std_valarray_tag, std_valarray_tag>;
+      template<typename Left, typename Right> 
+        struct min_assign<Left, Right, std_valarray_tag, std_valarray_tag>;
+      template<typename From> 
+        struct promote<bool const, From, void, std_valarray_tag>;
+      template<typename From> struct promote<bool, From, void, std_valarray_tag>;
+      template<typename To, typename From> 
+        struct promote<To, From, std_valarray_tag, std_valarray_tag>;
+      template<typename ToFrom> 
+        struct promote<ToFrom, ToFrom, std_valarray_tag, std_valarray_tag>;
+      template<typename T> struct tag<std::valarray< T >>;
+    }
+    namespace operators {
+      template<typename Left, typename Right> 
+        unspecified operator/(std::valarray< Left > const & left, 
+                              Right const & right);
+      template<typename Left, typename Right> 
+        unspecified operator*(std::valarray< Left > const & left, 
+                              Right const & right);
+      template<typename Left, typename Right> 
+        unspecified operator+(std::valarray< Left > const & left, 
+                              std::valarray< Right > const & right);
+    }
+  }
+}
+
+++++ + +[[doxygen.numeric_operators_library_reference.vector_8hpp]] +=== xref:ROOT:attachment$doxygen/accumulators_framework_reference/vector_8hpp.html[Header < boost/accumulators/numeric/functional/vector.hpp >] + +++++ +
namespace boost {
+  namespace numeric {
+    namespace functional {
+      template<typename T> struct as_max<T, std_vector_tag>;
+      template<typename T> struct as_min<T, std_vector_tag>;
+      template<typename T> struct as_one<T, std_vector_tag>;
+      template<typename T> struct as_zero<T, std_vector_tag>;
+      template<typename Left, typename Right> 
+        struct fdiv<Left, Right, std_vector_tag, void>;
+      template<typename Left, typename Right> 
+        struct max_assign<Left, Right, std_vector_tag, std_vector_tag>;
+      template<typename Left, typename Right> 
+        struct min_assign<Left, Right, std_vector_tag, std_vector_tag>;
+      template<typename To, typename From> 
+        struct promote<To, From, std_vector_tag, std_vector_tag>;
+      template<typename ToFrom> 
+        struct promote<ToFrom, ToFrom, std_vector_tag, std_vector_tag>;
+      template<typename T, typename Al> struct tag<std::vector< T, Al >>;
+    }
+    namespace operators {
+      template<typename Left, typename Right> 
+        unspecified operator/(std::vector< Left > const & left, 
+                              Right const & right);
+      template<typename Left, typename Right> 
+        std::vector< typename functional::divides< Left, Right >::result_type > 
+        operator/(std::vector< Left > const & left, 
+                  std::vector< Right > const & right);
+      template<typename Left, typename Right> 
+        unspecified operator*(std::vector< Left > const & left, 
+                              Right const & right);
+      template<typename Left, typename Right> 
+        unspecified operator*(Left const & left, 
+                              std::vector< Right > const & right);
+      template<typename Left, typename Right> 
+        std::vector< typename functional::multiplies< Left, Right >::result_type > 
+        operator*(std::vector< Left > const & left, 
+                  std::vector< Right > const & right);
+      template<typename Left, typename Right> 
+        std::vector< typename functional::plus< Left, Right >::result_type > 
+        operator+(std::vector< Left > const & left, 
+                  std::vector< Right > const & right);
+      template<typename Left, typename Right> 
+        std::vector< typename functional::minus< Left, Right >::result_type > 
+        operator-(std::vector< Left > const & left, 
+                  std::vector< Right > const & right);
+      template<typename Left> 
+        std::vector< Left > & 
+        operator+=(std::vector< Left > & left, 
+                   std::vector< Left > const & right);
+      template<typename Arg> 
+        std::vector< typename functional::unary_minus< Arg >::result_type > 
+        operator-(std::vector< Arg > const & arg);
+    }
+  }
+}
+
+++++ + diff --git a/doc/modules/ROOT/pages/user_s_guide.adoc b/doc/modules/ROOT/pages/user_s_guide.adoc new file mode 100644 index 00000000..63240b7a --- /dev/null +++ b/doc/modules/ROOT/pages/user_s_guide.adoc @@ -0,0 +1,4951 @@ += User's Guide +:id: accumulators.user_s_guide +// Doxygen HTML filenames contain `__`; reference them via attributes so xref targets are not mangled by subs. +:doxy-html-accumulator-set: structboost_1_1accumulators_1_1accumulator__set.html +:doxy-html-depends-on: structboost_1_1accumulators_1_1depends__on.html +:doxy-html-feature-of: structboost_1_1accumulators_1_1feature__of.html +:doxy-html-as-feature: structboost_1_1accumulators_1_1as__feature.html + +[[accumulators.user_s_guide]] + +++++ + +++++ + +[.accumulators-mini-toc] +**** +* xref:#accumulators.user_s_guide.the_accumulators_framework[The Accumulators Framework] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library[The Statistical Accumulators Library] +**** + +This section describes how to use the Boost.Accumulators framework to create new accumulators and how to use the existing statistical accumulators to perform incremental statistical computation. For detailed information regarding specific components in Boost.Accumulators, check the xref:reference.adoc#accumulators_framework_reference[Reference] section. + +[[accumulators.user_s_guide.h0]] + +[[accumulators.user_s_guide.hello__world_]] + +== Hello, World! + +Below is a complete example of how to use the Accumulators Framework and the Statistical Accumulators to perform an incremental statistical calculation. It calculates the mean and 2nd moment of a sequence of doubles. + +[source,c++] +---- +#include +#include +#include +#include +#include +using namespace boost::accumulators; + +int main() +{ + // Define an accumulator set for calculating the mean and the + // 2nd moment ... + accumulator_set > > acc; + + // push in some data ... + acc(1.2); + acc(2.3); + acc(3.4); + acc(4.5); + + // Display the results ... + std::cout << "Mean: " << mean(acc) << std::endl; + std::cout << "Moment: " << moment<2>(acc) << std::endl; + + return 0; +} +---- + + +This program displays the following: + +[source,text] +---- +Mean: 2.85 +Moment: 9.635 +---- + + +[[accumulators.user_s_guide.the_accumulators_framework]] + +== The Accumulators Framework + +[.accumulators-mini-toc] +**** +* xref:#+++accumulators.user_s_guide.the_accumulators_framework.using___accumulator_set___+++[Using `accumulator_set<>`] +* xref:#accumulators.user_s_guide.the_accumulators_framework.extracting_results[Extracting Results] +* xref:#accumulators.user_s_guide.the_accumulators_framework.passing_optional_parameters[Passing Optional Parameters] +* xref:#accumulators.user_s_guide.the_accumulators_framework.weighted_samples[Weighted Samples] +* xref:#accumulators.user_s_guide.the_accumulators_framework.numeric_operators_sub_library[Numeric Operators Sub-Library] +* xref:#accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework[Extending the Accumulators Framework] +* xref:#accumulators.user_s_guide.the_accumulators_framework.concepts[Concepts] +**** + +The Accumulators Framework is framework for performing incremental calculations. Usage of the framework follows the following pattern: + +* Users build a computational object, called an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++], by selecting the computations in which they are interested, or authoring their own computational primitives which fit within the framework. +* Users push data into the xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] object one sample at a time. +* The xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] computes the requested quantities in the most efficient method possible, resolving dependencies between requested calculations, possibly caching intermediate results. + +The Accumulators Framework defines the utilities needed for defining primitive computational elements, called _accumulators_. It also provides the xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] type, described above. + +[[accumulators.user_s_guide.the_accumulators_framework.h0]] + +[[accumulators.user_s_guide.the_accumulators_framework.terminology]] + +== Terminology + +The following terms are used in the rest of the documentation. + +Sample:: + [[sample_type]] A datum that is pushed into an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++]. The type of the sample is the _sample type_. + +Weight:: + [[weight_type]] An optional scalar value passed along with the sample specifying the weight of the sample. Conceptually, each sample is multiplied with its weight. The type of the weight is the _weight type_. + +Feature:: + An abstract primitive computational entity. When defining an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++], users specify the features in which they are interested, and the xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] figures out which _accumulators_ would best provide those features. Features may depend on other features. If they do, the accumulator set figures out which accumulators to add to satisfy the dependencies. + +Accumulator:: + A concrete primitive computational entity. An accumulator is a concrete implementation of a feature. It satisfies exactly one abstract feature. Several different accumulators may provide the same feature, but may represent different implementation strategies. + +Accumulator Set:: + A collection of accumulators. An accumulator set is specified with a sample type and a list of features. The accumulator set uses this information to generate an ordered set of accumulators depending on the feature dependency graph. An accumulator set accepts samples one datum at a time, propagating them to each accumulator in order. At any point, results can be extracted from the accumulator set. + +Extractor:: + A function or function object that can be used to extract a result from an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++]. + +[[accumulators.user_s_guide.the_accumulators_framework.h1]] + +[[accumulators.user_s_guide.the_accumulators_framework.overview]] + +== Overview + +Here is a list of the important types and functions in the Accumulator Framework and a brief description of each. + +[caption="Table 1.1. "] +.Accumulators Toolbox +[cols="1,1",options="header"] +|=== +| Tool | Description + +| xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] | This is the most important type in the Accumulators Framework. It is a collection of accumulators. A datum pushed into an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] is forwarded to each accumulator, in an order determined by the dependency relationships between the accumulators. Computational results can be extracted from an accumulator at any time. + +| xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-depends-on}[+++depends_on<>+++] | Used to specify which other features a feature depends on. + +| xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-feature-of}[+++feature_of<>+++] | Trait used to tell the Accumulators Framework that, for the purpose of feature-based dependency resolution, one feature should be treated the same as another. + +| xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-as-feature}[+++as_feature<>+++] | Used to create an alias for a feature. For example, if there are two features, fast_X and accurate_X, they can be mapped to X(fast) and X(accurate) with xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-as-feature}[+++as_feature<>+++]. This is just syntactic sugar. + +| xref:ROOT:attachment$doxygen/accumulators_framework_reference/structboost_1_1accumulators_1_1features.html[+++features<>+++] | An link:https://www.boost.org/doc/libs/latest/libs/mpl/index.html[MPL] sequence. We can use xref:ROOT:attachment$doxygen/accumulators_framework_reference/structboost_1_1accumulators_1_1features.html[+++features<>+++] as the second template parameter when declaring an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++]. + +| xref:ROOT:attachment$doxygen/accumulators_framework_reference/structboost_1_1accumulators_1_1external.html[+++external<>+++] | Used when declaring an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++]. If the weight type is specified with xref:ROOT:attachment$doxygen/accumulators_framework_reference/structboost_1_1accumulators_1_1external.html[+++external<>+++], then the weight accumulators are assumed to reside in a separate accumulator set which will be passed in with a named parameter. + +| +++extractor<>+++ | A class template useful for creating an extractor function object. It is parameterized on a feature, and it has member functions for extracting from an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] the result corresponding to that feature. + +|=== + + +[[accumulators.user_s_guide.the_accumulators_framework.using___accumulator_set___]] + +=== Using `accumulator_set<>` + +Our tour of the xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] class template begins with the forward declaration: + +[source,c++] +---- +template< typename Sample, typename Features, typename Weight = void > +struct accumulator_set; +---- + + +The template parameters have the following meaning: + +Sample:: + The type of the data that will be accumulated. + +Features:: + An link:https://www.boost.org/doc/libs/latest/libs/mpl/index.html[MPL] sequence of features to be calculated. + +Weight:: + The type of the (optional) weight paramter. + +For example, the following line declares an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] that will accept a sequence of doubles one at a time and calculate the min and mean: + +[source,text] +---- +accumulator_set< double, features< tag::min, tag::mean > > acc; +---- + + +Notice that we use the xref:ROOT:attachment$doxygen/accumulators_framework_reference/structboost_1_1accumulators_1_1features.html[+++features<>+++] template to specify a list of features to be calculated. xref:ROOT:attachment$doxygen/accumulators_framework_reference/structboost_1_1accumulators_1_1features.html[+++features<>+++] is an MPL sequence of features. + +[NOTE] +==== +features<> is a synonym of mpl::vector<>. In fact, we could use mpl::vector<> or any MPL sequence if we prefer, and the meaning would be the same. +==== + + +Once we have defined an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++], we can then push data into it, and it will calculate the quantities you requested, as shown below. + +[source,text] +---- +// push some data into the accumulator_set ... +acc(1.2); +acc(2.3); +acc(3.4); +---- + + +Since xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] defines its accumulate function to be the function call operator, we might be tempted to use an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] as a UnaryFunction to a standard algorithm such as `std::for_each`. That's fine as long as we keep in mind that the standard algorithms take UnaryFunction objects by value, which involves making a copy of the xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] object. Consider the following: + +[source,text] +---- +// The data for which we wish to calculate statistical properties: +std::vector< double > data( /* stuff */ ); + +// The accumulator set which will calculate the properties for us: +accumulator_set< double, features< tag::min, tag::mean > > acc; + +// Use std::for_each to accumulate the statistical properties: +acc = std::for_each( data.begin(), data.end(), acc ); +---- + + +Notice how we must assign the return value of `std::for_each` back to the xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++]. This works, but some accumulators are not cheap to copy. For example, the xref:reference.adoc#doxygen.statistics_library_reference.tail_8hpp[+++tail+++] and xref:reference.adoc#+++doxygen.statistics_library_reference.tail__variate_8hpp+++[+++tail_variate<>+++] accumulators must store a `std::vector<>`, so copying these accumulators involves a dynamic allocation. We might be better off in this case passing the accumulator by reference, with the help of `boost::bind()` and `boost::ref()`. See below: + +[source,text] +---- +// The data for which we wish to calculate statistical properties: +std::vector< double > data( /* stuff */ ); + +// The accumulator set which will calculate the properties for us: +accumulator_set< double, features< tag::tail > > acc( + tag::tail::cache_size = 4 ); + +// Use std::for_each to accumulate the statistical properties: +std::for_each( data.begin(), data.end(), bind( ref(acc), _1 ) ); +---- + + +Notice now that we don't care about the return value of `std::for_each()` anymore because `std::for_each()` is modifying `acc` directly. + +[NOTE] +==== +To use boost::bind() and boost::ref(), you must #include and +==== + +[[accumulators.user_s_guide.the_accumulators_framework.extracting_results]] + +=== Extracting Results + +Once we have declared an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] and pushed data into it, we need to be able to extract results from it. For each feature we can add to an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++], there is a corresponding extractor for fetching its result. Usually, the extractor has the same name as the feature, but in a different namespace. For example, if we accumulate the `tag::min` and `tag::max` features, we can extract the results with the `min` and `max` extractors, as follows: + +[source,text] +---- +// Calculate the minimum and maximum for a sequence of integers. +accumulator_set< int, features< tag::min, tag::max > > acc; +acc( 2 ); +acc( -1 ); +acc( 1 ); + +// This displays "(-1, 2)" +std::cout << '(' << min( acc ) << ", " << max( acc ) << ")\n"; +---- + + +The extractors are all declared in the `boost::accumulators::extract` namespace, but they are brought into the `boost::accumulators` namespace with a `using` declaration. + +[TIP] +==== +On the Windows platform, min and max are preprocessor macros defined in WinDef.h. To use the min and max extractors, you should either compile with NOMINMAX defined, or you should invoke the extractors like: (min)( acc ) and (max)( acc ). The parentheses keep the macro from being invoked. +==== + + +Another way to extract a result from an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] is with the `extract_result()` function. This can be more convenient if there isn't an extractor object handy for a certain feature. The line above which displays results could equally be written as: + +[source,text] +---- +// This displays "(-1, 2)" +std::cout << '(' << extract_result< tag::min >( acc ) + << ", " << extract_result< tag::max >( acc ) << ")\n"; +---- + + +Finally, we can define our own extractor using the +++extractor<>+++ class template. For instance, another way to avoid the `min` / `max` macro business would be to define extractors with names that don't conflict with the macros, like this: + +[source,text] +---- +extractor< tag::min > min_; +extractor< tag::min > max_; + +// This displays "(-1, 2)" +std::cout << '(' << min_( acc ) << ", " << max_( acc ) << ")\n"; +---- + +[[accumulators.user_s_guide.the_accumulators_framework.passing_optional_parameters]] + +=== Passing Optional Parameters + +Some accumulators need initialization parameters. In addition, perhaps some auxiliary information needs to be passed into the xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] along with each sample. Boost.Accumulators handles these cases with named parameters from the link:https://www.boost.org/doc/libs/latest/libs/parameter/index.html[Boost.Parameter] library. + +For example, consider the xref:reference.adoc#doxygen.statistics_library_reference.tail_8hpp[+++tail+++] and xref:reference.adoc#+++doxygen.statistics_library_reference.tail__variate_8hpp+++[+++tail_variate<>+++] features. xref:reference.adoc#doxygen.statistics_library_reference.tail_8hpp[+++tail+++] keeps an ordered list of the largest `N` samples, where `N` can be specified at construction time. Also, the xref:reference.adoc#+++doxygen.statistics_library_reference.tail__variate_8hpp+++[+++tail_variate<>+++] feature, which depends on xref:reference.adoc#doxygen.statistics_library_reference.tail_8hpp[+++tail+++], keeps track of some data that is covariate with the `N` samples tracked by xref:reference.adoc#doxygen.statistics_library_reference.tail_8hpp[+++tail+++]. The code below shows how this all works, and is described in more detail below. + +[source,text] +---- +// Define a feature for tracking covariate data +typedef tag::tail_variate< int, tag::covariate1, left > my_tail_variate_tag; + +// This will calculate the left tail and my_tail_variate_tag for N == 2 +// using the tag::tail::cache_size named parameter +accumulator_set< double, features< my_tail_variate_tag > > acc( + tag::tail::cache_size = 2 ); + +// push in some samples and some covariates by using +// the covariate1 named parameter +acc( 1.2, covariate1 = 12 ); +acc( 2.3, covariate1 = -23 ); +acc( 3.4, covariate1 = 34 ); +acc( 4.5, covariate1 = -45 ); + +// Define an extractor for the my_tail_variate_tag feature +extractor< my_tail_variate_tag > my_tail_variate; + +// Write the tail statistic to std::cout. This will print "4.5, 3.4, " +std::ostream_iterator< double > dout( std::cout, ", " ); +std::copy( tail( acc ).begin(), tail( acc ).end(), dout ); + +// Write the tail_variate statistic to std::cout. This will print "-45, 34, " +std::ostream_iterator< int > iout( std::cout, ", " ); +std::copy( my_tail_variate( acc ).begin(), my_tail_variate( acc ).end(), iout ); +---- + + +There are several things to note about the code above. First, notice that we didn't have to request that the xref:reference.adoc#doxygen.statistics_library_reference.tail_8hpp[+++tail+++] feature be calculated. That is implicit because the xref:reference.adoc#+++doxygen.statistics_library_reference.tail__variate_8hpp+++[+++tail_variate<>+++] feature depends on the xref:reference.adoc#doxygen.statistics_library_reference.tail_8hpp[+++tail+++] feature. Next, notice how the `acc` object is initialized: `acc( tag::tail::cache_size = 2 )`. Here, `cache_size` is a named parameter. It is used to tell the xref:reference.adoc#doxygen.statistics_library_reference.tail_8hpp[+++tail+++] and xref:reference.adoc#+++doxygen.statistics_library_reference.tail__variate_8hpp+++[+++tail_variate<>+++] accumulators how many samples and covariates to store. Conceptually, every construction parameter is made available to every accumulator in an accumulator set. + +We also use a named parameter to pass covariate data into the accumulator set along with the samples. As with the constructor parameters, all parameters to the accumulate function are made available to all the accumulators in the set. In this case, only the accumulator for the `my_tail_variate` feature would be interested in the value of the `covariate1` named parameter. + +We can make one final observation about the example above. Since xref:reference.adoc#doxygen.statistics_library_reference.tail_8hpp[+++tail+++] and xref:reference.adoc#+++doxygen.statistics_library_reference.tail__variate_8hpp+++[+++tail_variate<>+++] are multi-valued features, the result we extract for them is represented as an iterator range. That is why we can say `tail( acc ).begin()` and `tail( acc ).end()`. + +Even the extractors can accept named parameters. In a bit, we'll see a situation where that is useful. + +[[accumulators.user_s_guide.the_accumulators_framework.weighted_samples]] + +=== Weighted Samples + +Some accumulators, statistical accumulators in particular, deal with data that are _weighted_. Each sample pushed into the accumulator has an associated weight, by which the sample is conceptually multiplied. The Statistical Accumulators Library provides an assortment of these weighted statistical accumulators. And many unweighted statistical accumulators have weighted variants. For instance, the weighted variant of the `sum` accumulator is called `weighted_sum`, and is calculated by accumulating all the samples multiplied by their weights. + +To declare an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] that accepts weighted samples, you must specify the type of the weight parameter as the 3rd template parameter, as follows: + +[source,text] +---- +// 3rd template parameter 'int' means this is a weighted +// accumulator set where the weights have type 'int' +accumulator_set< int, features< tag::sum >, int > acc; +---- + + +When you specify a weight, all the accumulators in the set are replaced with their weighted equivalents. For example, the above xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] declaration is equivalent to the following: + +[source,text] +---- +// Since we specified a weight, tag::sum becomes tag::weighted_sum +accumulator_set< int, features< tag::weighted_sum >, int > acc; +---- + + +When passing samples to the accumulator set, you must also specify the weight of each sample. You can do that with the `weight` named parameter, as follows: + +[source,text] +---- +acc(1, weight = 2); // 1 * 2 +acc(2, weight = 4); // 2 * 4 +acc(3, weight = 6); // + 3 * 6 + // ------- + // = 28 +---- + + +You can then extract the result with the `sum()` extractor, as follows: + +[source,text] +---- +// This prints "28" +std::cout << sum(acc) << std::endl; +---- + + +[NOTE] +==== +When working with weighted statistical accumulators from the Statistical Accumulators Library, be sure to include the appropriate header. For instance, weighted_sum is defined in . +==== + +[[accumulators.user_s_guide.the_accumulators_framework.numeric_operators_sub_library]] + +=== Numeric Operators Sub-Library + +This section describes the function objects in the `boost::numeric` namespace, which is a sub-library that provides function objects and meta-functions corresponding to the infix operators in C++. + +In the `boost::numeric::operators` namespace are additional operator overloads for some useful operations not provided by the standard library, such as multiplication of a `std::complex<>` with a scalar. + +In the `boost::numeric::functional` namespace are function object equivalents of the infix operators. These function object types are heterogeneous, and so are more general than the standard ones found in the `` header. They use the Boost.Typeof library to deduce the return types of the infix expressions they evaluate. In addition, they look within the `boost::numeric::operators` namespace to consider any additional overloads that might be defined there. + +In the `boost::numeric` namespace are global polymorphic function objects corresponding to the function object types defined in the `boost::numeric::functional` namespace. For example, `boost::numeric::plus(a, b)` is equivalent to `boost::numeric::functional::plus()(a, b)`, and both are equivalent to `using namespace boost::numeric::operators; a + b;`. + +The Numeric Operators Sub-Library also gives several ways to sub-class and a way to sub-class and specialize operations. One way uses tag dispatching on the types of the operands. The other way is based on the compile-time properties of the operands. + +[[accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework]] + +=== Extending the Accumulators Framework + +[.accumulators-mini-toc] +**** +* xref:#accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_accumulator[__Defining a New Accumulator__] +* xref:#accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_feature[__Defining a New Feature__] +* xref:#accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_extractor[__Defining a New Extractor__] +* xref:#accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.controlling_dependencies[__Controlling Dependencies__] +* xref:#accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.operators_ex[__Specializing Numeric Operators__] +**** + +This section describes how to extend the Accumulators Framework by defining new accumulators, features and extractors. Also covered are how to control the dependency resolution of features within an accumulator set. + +[[accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_accumulator]] + +==== __Defining a New Accumulator__ + +All new accumulators must satisfy the xref:user_s_guide.adoc#accumulators.user_s_guide.the_accumulators_framework.concepts.accumulator_concept[Accumulator Concept]. Below is a sample class that satisfies the accumulator concept, which simply sums the values of all samples passed into it. + +[source,c++] +---- +#include +#include + +namespace boost { // Putting your accumulators in the +namespace accumulators { // impl namespace has some +namespace impl { // advantages. See below. + +template +struct sum_accumulator // All accumulators should inherit from + : accumulator_base // accumulator_base. +{ + typedef Sample result_type; // The type returned by result() below. + + template // The constructor takes an argument pack. + sum_accumulator(Args const & args) + : sum(args[sample | Sample()]) // Maybe there is an initial value in the + { // argument pack. ('sample' is defined in + } // sample.hpp, included above.) + + template // The accumulate function is the function + void operator ()(Args const & args) // call operator, and it also accepts an + { // argument pack. + this->sum += args[sample]; + } + + result_type result(dont_care) const // The result function will also be passed + { // an argument pack, but we don't use it here, + return this->sum; // so we use "dont_care" as the argument type. + } +private: + Sample sum; +}; + +}}} +---- + + +Much of the above should be pretty self-explanatory, except for the use of argument packs which may be confusing if you have never used the link:https://www.boost.org/doc/libs/latest/libs/parameter/index.html[Boost.Parameter] library before. An argument pack is a cluster of values, each of which can be accessed with a key. So `args[sample]` extracts from the pack the value associated with the `sample` key. And the cryptic `args[sample | Sample()]` evaluates to the value associated with the `sample` key if it exists, or a default-constructed `Sample` if it doesn't. + +The example above demonstrates the most common attributes of an accumulator. There are other optional member functions that have special meaning. In particular: + +*Optional Accumulator Member Functions* + +on_drop(Args):: + Defines an action to be taken when this accumulator is dropped. See the section on xref:user_s_guide.adoc#accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_accumulator.droppable_accumulators[Droppable Accumulators]. + +[[accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_accumulator.h0]] + +[[accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_accumulator.accessing_other_accumulators_in_the_set]] + +=== Accessing Other Accumulators in the Set + +Some accumulators depend on other accumulators within the same accumulator set. In those cases, it is necessary to be able to access those other accumulators. To make this possible, the xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] passes a reference to itself when invoking the member functions of its contained accumulators. It can be accessed by using the special `accumulator` key with the argument pack. Consider how we might implement `mean_accumulator`: + +[source,c++] +---- +// Mean == (Sum / Count) +template +struct mean_accumulator : accumulator_base +{ + typedef Sample result_type; + mean_accumulator(dont_care) {} + + template + result_type result(Args const &args) const + { + return sum(args[accumulator]) / count(args[accumulator]); + } +}; +---- + + +`mean` depends on the `sum` and `count` accumulators. (We'll see in the next section how to specify these dependencies.) The result of the mean accumulator is merely the result of the sum accumulator divided by the result of the count accumulator. Consider how we write that: `sum(args[accumulator]) / count(args[accumulator])`. The expression `args[accumulator]` evaluates to a reference to the xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] that contains this `mean_accumulator`. It also contains the `sum` and `count` accumulators, and we can access their results with the extractors defined for those features: `sum` and `count`. + +[NOTE] +==== +Accumulators that inherit from accumulator_base get an empty operator (), so accumulators like mean_accumulator above need not define one. +==== + + +All the member functions that accept an argument pack have access to the enclosing xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] via the `accumulator` key, including the constructor. The accumulators within the set are constructed in an order determined by their interdependencies. As a result, it is safe for an accumulator to access one on which it depends during construction. + +[[accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_accumulator.h1]] + +[[accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_accumulator.infix_notation_and_the_numeric_operators_sub_library]] + +=== Infix Notation and the Numeric Operators Sub-Library + +Although not necessary, it can be a good idea to put your accumulator implementations in the `boost::accumulators::impl` namespace. This namespace pulls in any operators defined in the `boost::numeric::operators` namespace with a using directive. The Numeric Operators Sub-Library defines some additional overloads that will make your accumulators work with all sorts of data types. + +Consider `mean_accumulator` defined above. It divides the sum of the samples by the count. The type of the count is `std::size_t`. What if the sample type doesn't define division by `std::size_t`? That's the case for `std::complex<>`. You might think that if the sample type is `std::complex<>`, the code would not work, but in fact it does. That's because Numeric Operators Sub-Library defines an overloaded `operator/` for `std::complex<>` and `std::size_t`. This operator is defined in the `boost::numeric::operators` namespace and will be found within the `boost::accumulators::impl` namespace. That's why it's a good idea to put your accumulators there. + +[[accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_accumulator.h2]] + +[[accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_accumulator.droppable_accumulators]] + +=== Droppable Accumulators + +The term "droppable" refers to an accumulator that can be removed from the xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++]. You can request that an accumulator be made droppable by using the xref:ROOT:attachment$doxygen/accumulators_framework_reference/structboost_1_1accumulators_1_1droppable.html[+++droppable<>+++] class template. + +[source,text] +---- +// calculate sum and count, make sum droppable: +accumulator_set< double, features< tag::count, droppable > > acc; + +// add some data +acc(3.0); +acc(2.0); + +// drop the sum (sum is 5 here) +acc.drop(); + +// add more data +acc(1.0); + +// This will display "3" and "5" +std::cout << count(acc) << ' ' << sum(acc); +---- + + +Any accumulators that get added to an accumulator set in order to satisfy dependencies on droppable accumulators are themselves droppable. Consider the following accumulator: + +[source,text] +---- +// Sum is not droppable. Mean is droppable. Count, brought in to +// satisfy mean's dependencies, is implicitly droppable, too. +accumulator_set< double, features< tag::sum, droppable > > acc; +---- + + +`mean` depends on `sum` and `count`. Since `mean` is droppable, so too is `count`. However, we have explicitly requested that `sum` be not droppable, so it isn't. Had we left `tag::sum` out of the above declaration, the `sum` accumulator would have been implicitly droppable. + +A droppable accumulator is reference counted, and is only really dropped after all the accumulators that depend on it have been dropped. This can lead to some surprising behavior in some situations. + +[source,text] +---- +// calculate sum and mean, make mean droppable. +accumulator_set< double, features< tag::sum, droppable > > acc; + +// add some data +acc(1.0); +acc(2.0); + +// drop the mean. mean's reference count +// drops to 0, so it's really dropped. So +// too, count's reference count drops to 0 +// and is really dropped. +acc.drop(); + +// add more data. Sum continues to accumulate! +acc(3.0); + +// This will display "6 2 3" +std::cout << sum(acc) << ' ' + << count(acc) << ' ' + << mean(acc); +---- + + +Note that at the point at which `mean` is dropped, `sum` is 3, `count` is 2, and therefore `mean` is 1.5. But since `sum` continues to accumulate even after `mean` has been dropped, the value of `mean` continues to change. If you want to remember the value of `mean` at the point it is dropped, you should save its value into a local variable. + +The following rules more precisely specify how droppable and non-droppable accumulators behave within an accumulator set. + +* There are two types of accumulators: droppable and non-droppable. The default is non-droppable. +* For any feature `X`, both `X` and `droppable` satisfy the `X` dependency. +* If feature `X` depends on `Y` and `Z`, then `droppable` depends on `droppable` and `droppable`. +* All accumulators have `add_ref()` and `drop()` member functions. +* For non-droppable accumulators, `drop()` is a no-op, and `add_ref()` invokes `add_ref()` on all accumulators corresponding to the features upon which the current accumulator depends. +* Droppable accumulators have a reference count and define `add_ref()` and `drop()` to manipulate the reference count. +* For droppable accumulators, `add_ref()` increments the accumulator's reference count, and also `add_ref()`'s the accumulators corresponding to the features upon which the current accumulator depends. +* For droppable accumulators, `drop()` decrements the accumulator's reference count, and also `drop()`'s the accumulators corresponding to the features upon which the current accumulator depends. +* The accumulator_set constructor walks the list of *user-specified* features and `add_ref()`'s the accumulator that corresponds to each of them. (Note: that means that an accumulator that is not user-specified but in the set merely to satisfy a dependency will be dropped as soon as all its dependencies have been dropped. Ones that have been user specified are not dropped until their dependencies have been dropped *and* the user has explicitly dropped the accumulator.) +* Droppable accumulators check their reference count in their accumulate member function. If the reference count is 0, the function is a no-op. +* Users are not allowed to drop a feature that is not user-specified and marked as droppable. + +And as an optimization: + +* If the user specifies the non-droppable feature `X`, which depends on `Y` and `Z`, then the accumulators for `Y` and `Z` can be safely made non-droppable, as well as any accumulators on which they depend. + +[[accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_feature]] + +==== __Defining a New Feature__ + +Once we have implemented an accumulator, we must define a feature for it so that users can specify the feature when declaring an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++]. We typically put the features into a nested namespace, so that later we can define an extractor of the same name. All features must satisfy the xref:user_s_guide.adoc#accumulators.user_s_guide.the_accumulators_framework.concepts.feature_concept[Feature Concept]. Using xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-depends-on}[+++depends_on<>+++] makes satisfying the concept simple. Below is an example of a feature definition. + +[source,text] +---- +namespace boost { namespace accumulators { namespace tag { + +struct mean // Features should inherit from + : depends_on< count, sum > // depends_on<> to specify dependencies +{ + // Define a nested typedef called 'impl' that specifies which + // accumulator implements this feature. + typedef accumulators::impl::mean_accumulator< mpl::_1 > impl; +}; + +}}} +---- + + +The only two things we must do to define the `mean` feature is to specify the dependencies with xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-depends-on}[+++depends_on<>+++] and define the nested `impl` typedef. Even features that have no dependencies should inherit from xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-depends-on}[+++depends_on<>+++]. The nested `impl` type must be an link:https://www.boost.org/doc/libs/latest/libs/mpl/doc/refmanual/lambda-expression.html[MPL Lambda Expression]. The result of `mpl::apply< impl, sample-type, weight-type >::type` must be be the type of the accumulator that implements this feature. The use of link:https://www.boost.org/doc/libs/latest/libs/mpl/index.html[MPL] placeholders like `mpl::_1` make it especially easy to make a template such as `mean_accumulator<>` an link:https://www.boost.org/doc/libs/latest/libs/mpl/doc/refmanual/lambda-expression.html[MPL Lambda Expression]. Here, `mpl::_1` will be replaced with the sample type. Had we used `mpl::_2`, it would have been replaced with the weight type. + +What about accumulator types that are not templates? If you have a `foo_accumulator` which is a plain struct and not a template, you could turn it into an link:https://www.boost.org/doc/libs/latest/libs/mpl/doc/refmanual/lambda-expression.html[MPL Lambda Expression] using `mpl::always<>`, like this: + +[source,text] +---- +// An MPL lambda expression that always evaluates to +// foo_accumulator: +typedef mpl::always< foo_accumulator > impl; +---- + + +If you are ever unsure, or if you are not comfortable with MPL lambda expressions, you could always define `impl` explicitly: + +[source,c++] +---- +// Same as 'typedef mpl::always< foo_accumulator > impl;' +struct impl +{ + template< typename Sample, typename Weight > + struct apply + { + typedef foo_accumulator type; + }; +}; +---- + + +Here, `impl` is a binary link:https://www.boost.org/doc/libs/latest/libs/mpl/doc/refmanual/metafunction-class.html[MPL Metafunction Class], which is a kind of link:https://www.boost.org/doc/libs/latest/libs/mpl/doc/refmanual/lambda-expression.html[MPL Lambda Expression]. The nested `apply<>` template is part of the metafunction class protocol and tells MPL how to build the accumulator type given the sample and weight types. + +All features must also provide a nested `is_weight_accumulator` typedef. It must be either `mpl::true_` or `mpl::false_`. xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-depends-on}[+++depends_on<>+++] provides a default of `mpl::false_` for all features that inherit from it, but that can be overridden (or hidden, technically speaking) in the derived type. When the feature represents an accumulation of information about the weights instead of the samples, we can mark this feature as such with `typedef mpl::true_ is_weight_accumulator;`. The weight accumulators are made external if the weight type is specified using the xref:ROOT:attachment$doxygen/accumulators_framework_reference/structboost_1_1accumulators_1_1external.html[+++external<>+++] template. + +[[accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_extractor]] + +==== __Defining a New Extractor__ + +Now that we have an accumulator and a feature, the only thing lacking is a way to get results from the accumulator set. The Accumulators Framework provides the +++extractor<>+++ class template to make it simple to define an extractor for your feature. Here's an extractor for the `mean` feature we defined above: + +[source,text] +---- +namespace boost { +namespace accumulators { // By convention, we put extractors +namespace extract { // in the 'extract' namespace + +extractor< tag::mean > const mean = {}; // Simply define our extractor with + // our feature tag, like this. +} +using extract::mean; // Pull the extractor into the + // enclosing namespace. +}} +---- + + +Once defined, the `mean` extractor can be used to extract the result of the `tag::mean` feature from an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++]. + +Parameterized features complicate this simple picture. Consider the `moment` feature, for calculating the `N`-th moment, where `N` is specified as a template parameter: + +[source,text] +---- +// An accumulator set for calculating the N-th moment, for N == 2 ... +accumulator_set< double, features< tag::moment<2> > > acc; + +// ... add some data ... + +// Display the 2nd moment ... +std::cout << "2nd moment is " << accumulators::moment<2>(acc) << std::endl; +---- + + +In the expression `accumulators::moment<2>(acc)`, what is `moment`? It cannot be an object -- the syntax of C++ will not allow it. Clearly, if we want to provide this syntax, we must make `moment` a function template. Here's what the definition of the `moment` extractor looks like: + +[source,c++] +---- +namespace boost { +namespace accumulators { // By convention, we put extractors +namespace extract { // in the 'extract' namespace + +template +typename mpl::apply >::type::result_type +moment(AccumulatorSet const &acc) +{ + return extract_result >(acc); +} + +} +using extract::moment; // Pull the extractor into the + // enclosing namespace. +}} +---- + + +The return type deserves some explanation. Every xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] type is actually a unary link:https://www.boost.org/doc/libs/latest/libs/mpl/doc/refmanual/metafunction-class.html[MPL Metafunction Class]. When you `mpl::apply<>` an xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++accumulator_set<>+++] and a feature, the result is the type of the accumulator within the set that implements that feature. And every accumulator provides a nested `result_type` typedef that tells what its return type is. The extractor simply delegates its work to the xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-accumulator-set}[+++extract_result()+++] function. + +[[accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.controlling_dependencies]] + +==== __Controlling Dependencies__ + +The feature-based dependency resolution of the Accumulators Framework is designed to allow multiple different implementation strategies for each feature. For instance, two different accumulators may calculate the same quantity with different rounding modes, or using different algorithms with different size/speed tradeoffs. Other accumulators that depend on that quantity shouldn't care how it's calculated. The Accumulators Framework handles this by allowing several different accumulators satisfy the same feature. + +*Aliasing feature dependencies with `feature_of<>`* + +Imagine that you would like to implement the hypothetical _fubar_ statistic, and that you know two ways to calculate fubar on a bunch of samples: an accurate but slow calculation and an approximate but fast calculation. You might opt to make the accurate calculation the default, so you implement two accumulators and call them `impl::fubar_impl` and `impl::fast_fubar_impl`. You would also define the `tag::fubar` and `tag::fast_fubar` features as described xref:user_s_guide.adoc#accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.defining_a_new_feature[above]. Now, you would like to inform the Accumulators Framework that these two features are the same from the point of view of dependency resolution. You can do that with xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-feature-of}[+++feature_of<>+++], as follows: + +[source,c++] +---- +namespace boost { namespace accumulators +{ + // For the purposes of feature-based dependency resolution, + // fast_fubar provides the same feature as fubar + template<> + struct feature_of + : feature_of + { + }; +}} +---- + + +The above code instructs the Accumulators Framework that, if another accumulator in the set depends on the `tag::fubar` feature, the `tag::fast_fubar` feature is an acceptable substitute. + +*Registering feature variants with `as_feature<>`* + +You may have noticed that some feature variants in the Accumulators Framework can be specified with a nicer syntax. For instance, instead of `tag::mean` and `tag::immediate_mean` you can specify them with `tag::mean(lazy)` and `tag::mean(immediate)` respectively. These are merely aliases, but the syntax makes the relationship between the two clearer. You can create these feature aliases with the xref:ROOT:attachment$doxygen/accumulators_framework_reference/{doxy-html-as-feature}[+++as_feature<>+++] trait. Given the fubar example above, you might decide to alias `tag::fubar(accurate)` with `tag::fubar` and `tag::fubar(fast)` with `tag::fast_fubar`. You would do that as follows: + +[source,c++] +---- +namespace boost { namespace accumulators +{ + struct fast {}; // OK to leave these tags empty + struct accurate {}; + + template<> + struct as_feature + { + typedef tag::fubar type; + }; + + template<> + struct as_feature + { + typedef tag::fast_fubar type; + }; +}} +---- + + +Once you have done this, users of your fubar accumulator can request the `tag::fubar(fast)` and `tag::fubar(accurate)` features when defining their `accumulator_set`s and get the correct accumulator. + +[[accumulators.user_s_guide.the_accumulators_framework.extending_the_accumulators_framework.operators_ex]] + +==== __Specializing Numeric Operators__ + +This section describes how to adapt third-party numeric types to work with the Accumulator Framework. + +Rather than relying on the built-in operators, the Accumulators Framework relies on functions and operator overloads defined in the xref:user_s_guide.adoc#accumulators.user_s_guide.the_accumulators_framework.numeric_operators_sub_library[Numeric Operators Sub-Library] for many of its numeric operations. This is so that it is possible to assign non-standard meanings to arithmetic operations. For instance, when calculating an average by dividing two integers, the standard integer division behavior would be mathematically incorrect for most statistical quantities. So rather than use `x / y`, the Accumulators Framework uses `numeric::fdiv(x, y)`, which does floating-point division even if both `x` and `y` are integers. + +Another example where the Numeric Operators Sub-Library is useful is when a type does not define the operator overloads required to use it for some statistical calculations. For instance, `std::vector<>` does not overload any arithmetic operators, yet it may be useful to use `std::vector<>` as a sample or variate type. The Numeric Operators Sub-Library defines the necessary operator overloads in the `boost::numeric::operators` namespace, which is brought into scope by the Accumulators Framework with a using directive. + +*Numeric Function Objects and Tag Dispatching* + +How are the numeric function object defined by the Numeric Operators Sub-Library made to work with types such as `std::vector<>`? The free functions in the `boost::numeric` namespace are implemented in terms of the function objects in the `boost::numeric::functional` namespace, so to make `boost::numeric::fdiv()` do something sensible with a `std::vector<>`, for instance, we'll need to partially specialize the `boost::numeric::functional::fdiv<>` function object. + +The functional objects make use of a technique known as link:http://www.boost.org/community/generic_programming.html#tag_dispatching[_tag dispatching_] to select the proper implementation for the given operands. It works as follows: + +[source,c++] +---- +namespace boost { namespace numeric { namespace functional +{ + // Metafunction for looking up the tag associated with + // a given numeric type T. + template + struct tag + { + // by default, all types have void as a tag type + typedef void type; + }; + + // Forward declaration looks up the tag types of each operand + template< + typename Left + , typename Right + , typename LeftTag = typename tag::type + , typename RightTag = typename tag::type + > + struct fdiv; +}}} +---- + + +If you have some user-defined type `MyDouble` for which you would like to customize the behavior of `numeric::fdiv()`, you would specialize `numeric::functional::fdiv<>` by first defining a tag type, as shown below: + +[source,c++] +---- +namespace boost { namespace numeric { namespace functional +{ + // Tag type for MyDouble + struct MyDoubleTag {}; + + // Specialize tag<> for MyDouble. + // This only needs to be done once. + template<> + struct tag + { + typedef MyDoubleTag type; + }; + + // Specify how to divide a MyDouble by an integral count + template + struct fdiv + { + // Define the type of the result + typedef ... result_type; + + result_type operator()(Left & left, Right & right) const + { + return ...; + } + }; +}}} +---- + + +Once you have done this, `numeric::fdiv()` will use your specialization of `numeric::functional::fdiv<>` when the first argument is a `MyDouble` object. All of the function objects in the Numeric Operators Sub-Library can be customized in a similar fashion. + +[[accumulators.user_s_guide.the_accumulators_framework.concepts]] + +=== Concepts + +[[accumulators.user_s_guide.the_accumulators_framework.concepts.h0]] + +[[accumulators.user_s_guide.the_accumulators_framework.concepts.accumulator_concept]] + +== Accumulator Concept + +In the following table, `Acc` is the type of an accumulator, `acc` and `acc2` are objects of type `Acc`, and `args` is the name of an argument pack from the link:https://www.boost.org/doc/libs/latest/libs/parameter/index.html[Boost.Parameter] library. + +[caption="Table 1.2. "] +.Accumulator Requirements +[cols="1,1,1",options="header"] +|=== +| *Expression* | *Return type* | *Assertion / Note / Pre- / Post-condition* + +| `Acc::result_type` | _implementation defined_ | The type returned by `Acc::result()`. + +| `Acc acc(args)` | none | Construct from an argument pack. + +| `Acc acc(acc2)` | none | Post: `acc.result(args)` is equivalent to `acc2.result(args)` + +| `acc(args)` | _unspecified_ | + +| `acc.on_drop(args)` | _unspecified_ | + +| `acc.result(args)` | `Acc::result_type` | + +|=== + + +[[accumulators.user_s_guide.the_accumulators_framework.concepts.h1]] + +[[accumulators.user_s_guide.the_accumulators_framework.concepts.feature_concept]] + +== Feature Concept + +In the following table, `F` is the type of a feature and `S` is some scalar type. + +[caption="Table 1.3. "] +.Feature Requirements +[cols="1,1,1",options="header"] +|=== +| *Expression* | *Return type* | *Assertion / Note / Pre- / Post-condition* + +| `F::dependencies` | _unspecified_ | An MPL sequence of other features on which `F` depends. + +| `F::is_weight_accumulator` | `mpl::true_` or `mpl::false_` | `mpl::true_` if the accumulator for this feature should be made external when the weight type for the accumulator set is `external`, `mpl::false_` otherwise. + +| `F::impl` | _unspecified_ | An link:https://www.boost.org/doc/libs/latest/libs/mpl/doc/refmanual/lambda-expression.html[MPL Lambda Expression] that returns the type of the accumulator that implements this feature when passed a sample type and a weight type. + +|=== + +[[accumulators.user_s_guide.the_statistical_accumulators_library]] + +== The Statistical Accumulators Library + +[.accumulators-mini-toc] +**** +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.count[count] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.covariance[covariance] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.density[density] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.error_of_mean[error_of] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.extended_p_square[extended_p_square] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.extended_p_square_quantile[extended_p_square_quantile _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.kurtosis[kurtosis] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.max[max] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.mean[mean _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.median[median _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.min[min] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.moment[moment] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.p_square_cumulative_distribution[p_square_cumulative_distribution] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.p_square_quantile[p_square_quantile _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.peaks_over_threshold[peaks_over_threshold _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.pot_quantile[pot_quantile _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.pot_tail_mean[pot_tail_mean] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.rolling_count[rolling_count] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.rolling_sum[rolling_sum] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.rolling_mean[rolling_mean] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.rolling_moment[rolling_moment] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.rolling_variance[rolling_variance] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.skewness[skewness] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.sum[sum _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.tail[tail] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.coherent_tail_mean[coherent_tail_mean] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.non_coherent_tail_mean[non_coherent_tail_mean] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.tail_quantile[tail_quantile] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.tail_variate[tail_variate] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.tail_variate_means[tail_variate_means _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.variance[variance _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_covariance[weighted_covariance] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_density[weighted_density] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_extended_p_square[weighted_extended_p_square] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_kurtosis[weighted_kurtosis] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_mean[weighted_mean _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_median[weighted_median _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_moment[weighted_moment] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_p_square_cumulative_distribution[weighted_p_square_cumulative_distribution] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_p_square_quantile[weighted_p_square_quantile _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_peaks_over_threshold[weighted_peaks_over_threshold _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_skewness[weighted_skewness] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_sum[weighted_sum _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.non_coherent_weighted_tail_mean[non_coherent_weighted_tail_mean] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_tail_quantile[weighted_tail_quantile] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_tail_variate_means[weighted_tail_variate_means _and variants_] +* xref:#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_variance[weighted_variance _and variants_] +**** + +The Statistical Accumulators Library defines accumulators for incremental statistical computations. It is built on top of xref:user_s_guide.adoc#accumulators.user_s_guide.the_accumulators_framework[The Accumulator Framework]. + +[[accumulators.user_s_guide.the_statistical_accumulators_library.count]] + +=== count + +The `count` feature is a simple counter that tracks the number of samples pushed into the accumulator set. + +Result Type:: ++ +[source,text] +---- +std::size_t +---- + +Depends On:: + _none_ + +Variants:: + _none_ + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/count.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > acc; +acc(0); +acc(0); +acc(0); +assert(3 == count(acc)); +---- + + +*See also* + +* xref:reference.adoc#doxygen.statistics_library_reference.count_8hpp[+++count_impl+++] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.covariance]] + +=== covariance + +The `covariance` feature is an iterative Monte Carlo estimator for the covariance. It is specified as `tag::covariance`. + +Result Type:: ++ +++++ +
numeric::functional::outer_product<
+    numeric::functional::fdiv<sample-type, std::size_t>::result_type
+  , numeric::functional::fdiv<variate-type, std::size_t>::result_type
+>::result_type
+
+++++ + +Depends On:: + `count` + + `mean` + + `mean_of_variates` + +Variants:: + `abstract_covariance` + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + +++<variate-tag>+++ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + O(1) + +*Headers* + +++++ +
#include <boost/accumulators/statistics/covariance.hpp>
+#include <boost/accumulators/statistics/variates/covariate.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > > acc; +acc(1., covariate1 = 2.); +acc(1., covariate1 = 4.); +acc(2., covariate1 = 3.); +acc(6., covariate1 = 1.); +assert(covariance(acc) == -1.75); +---- + + +*See also* + +* xref:reference.adoc#doxygen.statistics_library_reference.covariance_8hpp[+++covariance_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.mean[`mean`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.density]] + +=== density + +The `tag::density` feature returns a histogram of the sample distribution. For more implementation details, see xref:reference.adoc#doxygen.statistics_library_reference.density_8hpp[+++density_impl+++]. + +Result Type:: ++ +++++ +
iterator_range<
+    std::vector<
+        std::pair<
+            numeric::functional::fdiv<sample-type, std::size_t>::result_type
+          , numeric::functional::fdiv<sample-type, std::size_t>::result_type
+        >
+    >::iterator
+>
+
+++++ + +Depends On:: + `count` + + `min` + + `max` + +Variants:: + _none_ + +Initialization Parameters:: + `density::cache_size` + + `density::num_bins` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + O(N), when N is `density::num_bins` + +*Header* + +++++ +
#include <boost/accumulators/statistics/density.hpp>
+
+++++ + + +*Note* + +Results from the `density` accumulator can only be extracted after the number of samples meets or exceeds the cache size. + +*See also* + +* xref:reference.adoc#doxygen.statistics_library_reference.density_8hpp[+++density_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.min[`min`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.max[`max`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.error_of_mean]] + +=== error_of + +The `error_of` feature calculates the error of the mean feature. It is equal to `sqrt(variance / (count - 1))`. + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + `count` + + `variance` + +Variants:: + `error_of` + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/error_of.hpp>
+#include <boost/accumulators/statistics/error_of_mean.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > > acc; +acc(1.1); +acc(1.2); +acc(1.3); +assert(0.057735 == error_of(acc)); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.error__of__mean_8hpp+++[+++error_of_mean_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.variance[`variance`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.extended_p_square]] + +=== extended_p_square + +Multiple quantile estimation with the extended `P^2` algorithm. For further details, see xref:reference.adoc#+++doxygen.statistics_library_reference.extended__p__square_8hpp+++[+++extended_p_square_impl+++]. + +Result Type:: ++ +++++ +
boost::iterator_range<
+    implementation-defined
+>
+
+++++ + +Depends On:: + `count` + +Variants:: + _none_ + +Initialization Parameters:: + `tag::extended_p_square::probabilities` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/extended_p_square.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +boost::array probs = {0.001,0.01,0.1,0.25,0.5,0.75,0.9,0.99,0.999}; +accumulator_set > + acc(tag::extended_p_square::probabilities = probs); + +boost::lagged_fibonacci607 rng; // a random number generator +for (int i=0; i<10000; ++i) + acc(rng()); + +BOOST_CHECK_CLOSE(extended_p_square(acc)[0], probs[0], 25); +BOOST_CHECK_CLOSE(extended_p_square(acc)[1], probs[1], 10); +BOOST_CHECK_CLOSE(extended_p_square(acc)[2], probs[2], 5); + +for (std::size_t i=3; i < probs.size(); ++i) +{ + BOOST_CHECK_CLOSE(extended_p_square(acc)[i], probs[i], 2); +} +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.extended__p__square_8hpp+++[+++extended_p_square_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.extended_p_square_quantile]] + +=== extended_p_square_quantile _and variants_ + +Quantile estimation using the extended `P^2` algorithm for weighted and unweighted samples. By default, the calculation is linear and unweighted, but quadratic and weighted variants are also provided. For further implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.extended__p__square__quantile_8hpp+++[+++extended_p_square_quantile_impl+++]. + +All the variants share the `tag::quantile` feature and can be extracted using the `quantile()` extractor. + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + weighted variants depend on `weighted_extended_p_square` + + unweighted variants depend on `extended_p_square` + +Variants:: + `extended_p_square_quantile_quadratic` + + `weighted_extended_p_square_quantile` + + `weighted_extended_p_square_quantile_quadratic` + +Initialization Parameters:: + `tag::extended_p_square::probabilities` + +Accumulator Parameters:: + `weight` for the weighted variants + +Extractor Parameters:: + `quantile_probability` + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + O(N) where N is the count of probabilities. + +*Header* + +++++ +
#include <boost/accumulators/statistics/extended_p_square_quantile.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +typedef accumulator_set > + accumulator_t; +typedef accumulator_set, double > + accumulator_t_weighted; +typedef accumulator_set > + accumulator_t_quadratic; +typedef accumulator_set, double > + accumulator_t_weighted_quadratic; + +// tolerance +double epsilon = 1; + +// a random number generator +boost::lagged_fibonacci607 rng; + +boost::array probs = { 0.990, 0.991, 0.992, 0.993, 0.994, + 0.995, 0.996, 0.997, 0.998, 0.999 }; +accumulator_t acc(extended_p_square_probabilities = probs); +accumulator_t_weighted acc_weighted(extended_p_square_probabilities = probs); +accumulator_t_quadratic acc2(extended_p_square_probabilities = probs); +accumulator_t_weighted_quadratic acc_weighted2(extended_p_square_probabilities = probs); + +for (int i=0; i<10000; ++i) +{ + double sample = rng(); + acc(sample); + acc2(sample); + acc_weighted(sample, weight = 1.); + acc_weighted2(sample, weight = 1.); +} + +for (std::size_t i = 0; i < probs.size() - 1; ++i) +{ + BOOST_CHECK_CLOSE( + quantile(acc, quantile_probability = 0.99025 + i*0.001) + , 0.99025 + i*0.001 + , epsilon + ); + BOOST_CHECK_CLOSE( + quantile(acc2, quantile_probability = 0.99025 + i*0.001) + , 0.99025 + i*0.001 + , epsilon + ); + BOOST_CHECK_CLOSE( + quantile(acc_weighted, quantile_probability = 0.99025 + i*0.001) + , 0.99025 + i*0.001 + , epsilon + ); + BOOST_CHECK_CLOSE( + quantile(acc_weighted2, quantile_probability = 0.99025 + i*0.001) + , 0.99025 + i*0.001 + , epsilon + ); +} +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.extended__p__square__quantile_8hpp+++[+++extended_p_square_quantile_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.extended_p_square[`extended_p_square`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_extended_p_square[`weighted_extended_p_square`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.kurtosis]] + +=== kurtosis + +The kurtosis of a sample distribution is defined as the ratio of the 4th central moment and the square of the 2nd central moment (the variance) of the samples, minus 3. The term `-3` is added in order to ensure that the normal distribution has zero kurtosis. For more implementation details, see xref:reference.adoc#doxygen.statistics_library_reference.kurtosis_8hpp[+++kurtosis_impl+++] + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, sample-type>::result_type
+
+++++ + +Depends On:: + `mean` + + `moment<2>` + + `moment<3>` + + `moment<4>` + +Variants:: + _none_ + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/kurtosis.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > acc; + +acc(2); +acc(7); +acc(4); +acc(9); +acc(3); + +BOOST_CHECK_EQUAL( mean(acc), 5 ); +BOOST_CHECK_EQUAL( accumulators::moment<2>(acc), 159./5. ); +BOOST_CHECK_EQUAL( accumulators::moment<3>(acc), 1171./5. ); +BOOST_CHECK_EQUAL( accumulators::moment<4>(acc), 1863 ); +BOOST_CHECK_CLOSE( kurtosis(acc), -1.39965397924, 1e-6 ); +---- + + +*See also* + +* xref:reference.adoc#doxygen.statistics_library_reference.kurtosis_8hpp[+++kurtosis_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.mean[`mean`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.moment[`moment`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.max]] + +=== max + +Calculates the maximum value of all the samples. + +Result Type:: ++ +++++ +
sample-type
+
+++++ + +Depends On:: + _none_ + +Variants:: + _none_ + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/max.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > acc; + +acc(1); +BOOST_CHECK_EQUAL(1, (max)(acc)); + +acc(0); +BOOST_CHECK_EQUAL(1, (max)(acc)); + +acc(2); +BOOST_CHECK_EQUAL(2, (max)(acc)); +---- + + +*See also* + +* xref:reference.adoc#doxygen.statistics_library_reference.max_8hpp[+++max_impl+++] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.mean]] + +=== mean _and variants_ + +Calculates the mean of samples, weights or variates. The calculation is either lazy (in the result extractor), or immediate (in the accumulator). The lazy implementation is the default. For more implementation details, see xref:reference.adoc#doxygen.statistics_library_reference.mean_8hpp[+++mean_impl+++] or. xref:reference.adoc#doxygen.statistics_library_reference.mean_8hpp[+++immediate_mean_impl+++] + +Result Type:: + For samples, `numeric::functional::fdiv::result_type` + + For weights, `numeric::functional::fdiv::result_type` + + For variates, `numeric::functional::fdiv::result_type` + +Depends On:: + `count` + + The lazy mean of samples depends on `sum` + + The lazy mean of weights depends on `sum_of_weights` + + The lazy mean of variates depends on `sum_of_variates<>` + +Variants:: + `mean_of_weights` + + `mean_of_variates` + + `immediate_mean` + + `immediate_mean_of_weights` + + `immediate_mean_of_variates` + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/mean.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set< + int + , stats< + tag::mean + , tag::mean_of_weights + , tag::mean_of_variates + > + , int +> acc; + +acc(1, weight = 2, covariate1 = 3); +BOOST_CHECK_CLOSE(1., mean(acc), 1e-5); +BOOST_CHECK_EQUAL(1u, count(acc)); +BOOST_CHECK_EQUAL(2, sum(acc)); +BOOST_CHECK_CLOSE(2., mean_of_weights(acc), 1e-5); +BOOST_CHECK_CLOSE(3., (accumulators::mean_of_variates(acc)), 1e-5); + +acc(0, weight = 4, covariate1 = 4); +BOOST_CHECK_CLOSE(0.33333333333333333, mean(acc), 1e-5); +BOOST_CHECK_EQUAL(2u, count(acc)); +BOOST_CHECK_EQUAL(2, sum(acc)); +BOOST_CHECK_CLOSE(3., mean_of_weights(acc), 1e-5); +BOOST_CHECK_CLOSE(3.5, (accumulators::mean_of_variates(acc)), 1e-5); + +acc(2, weight = 9, covariate1 = 8); +BOOST_CHECK_CLOSE(1.33333333333333333, mean(acc), 1e-5); +BOOST_CHECK_EQUAL(3u, count(acc)); +BOOST_CHECK_EQUAL(20, sum(acc)); +BOOST_CHECK_CLOSE(5., mean_of_weights(acc), 1e-5); +BOOST_CHECK_CLOSE(5., (accumulators::mean_of_variates(acc)), 1e-5); + +accumulator_set< + int + , stats< + tag::mean(immediate) + , tag::mean_of_weights(immediate) + , tag::mean_of_variates(immediate) + > + , int +> acc2; + +acc2(1, weight = 2, covariate1 = 3); +BOOST_CHECK_CLOSE(1., mean(acc2), 1e-5); +BOOST_CHECK_EQUAL(1u, count(acc2)); +BOOST_CHECK_CLOSE(2., mean_of_weights(acc2), 1e-5); +BOOST_CHECK_CLOSE(3., (accumulators::mean_of_variates(acc2)), 1e-5); + +acc2(0, weight = 4, covariate1 = 4); +BOOST_CHECK_CLOSE(0.33333333333333333, mean(acc2), 1e-5); +BOOST_CHECK_EQUAL(2u, count(acc2)); +BOOST_CHECK_CLOSE(3., mean_of_weights(acc2), 1e-5); +BOOST_CHECK_CLOSE(3.5, (accumulators::mean_of_variates(acc2)), 1e-5); + +acc2(2, weight = 9, covariate1 = 8); +BOOST_CHECK_CLOSE(1.33333333333333333, mean(acc2), 1e-5); +BOOST_CHECK_EQUAL(3u, count(acc2)); +BOOST_CHECK_CLOSE(5., mean_of_weights(acc2), 1e-5); +BOOST_CHECK_CLOSE(5., (accumulators::mean_of_variates(acc2)), 1e-5); +---- + + +*See also* + +* xref:reference.adoc#doxygen.statistics_library_reference.mean_8hpp[+++mean_impl+++] +* xref:reference.adoc#doxygen.statistics_library_reference.mean_8hpp[+++immediate_mean_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.sum[`sum`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.median]] + +=== median _and variants_ + +Median estimation based on the `P^2` quantile estimator, the density estimator, or the `P^2` cumulative distribution estimator. For more implementation details, see xref:reference.adoc#doxygen.statistics_library_reference.median_8hpp[+++median_impl+++], xref:reference.adoc#doxygen.statistics_library_reference.median_8hpp[+++with_density_median_impl+++], and xref:reference.adoc#doxygen.statistics_library_reference.median_8hpp[+++with_p_square_cumulative_distribution_median_impl+++]. + +The three median accumulators all satisfy the `tag::median` feature, and can all be extracted with the `median()` extractor. + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + `median` depends on `p_square_quantile_for_median` + + `with_density_median` depends on `count` and `density` + + `with_p_square_cumulative_distribution_median` depends on `p_square_cumulative_distribution` + +Variants:: + `with_density_median` + + `with_p_square_cumulative_distribution_median` + +Initialization Parameters:: + `with_density_median` requires `tag::density::cache_size` and `tag::density::num_bins` + + `with_p_square_cumulative_distribution_median` requires `tag::p_square_cumulative_distribution::num_cells` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + TODO + +*Header* + +++++ +
#include <boost/accumulators/statistics/median.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +// two random number generators +double mu = 1.; +boost::lagged_fibonacci607 rng; +boost::normal_distribution<> mean_sigma(mu,1); +boost::variate_generator > + normal(rng, mean_sigma); + +accumulator_set > acc; +accumulator_set > + acc_dens( density_cache_size = 10000, density_num_bins = 1000 ); +accumulator_set > + acc_cdist( p_square_cumulative_distribution_num_cells = 100 ); + +for (std::size_t i=0; i<100000; ++i) +{ + double sample = normal(); + acc(sample); + acc_dens(sample); + acc_cdist(sample); +} + +BOOST_CHECK_CLOSE(1., median(acc), 1.); +BOOST_CHECK_CLOSE(1., median(acc_dens), 1.); +BOOST_CHECK_CLOSE(1., median(acc_cdist), 3.); +---- + + +*See also* + +* xref:reference.adoc#doxygen.statistics_library_reference.median_8hpp[+++median_impl+++] +* xref:reference.adoc#doxygen.statistics_library_reference.median_8hpp[+++with_density_median_impl+++] +* xref:reference.adoc#doxygen.statistics_library_reference.median_8hpp[+++with_p_square_cumulative_distribution_median_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.p_square_quantile[`p_square_quantile`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.p_square_cumulative_distribution[`p_square_cumulative_distribution`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.min]] + +=== min + +Calculates the minimum value of all the samples. + +Result Type:: ++ +++++ +
sample-type
+
+++++ + +Depends On:: + _none_ + +Variants:: + _none_ + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/min.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > acc; + +acc(1); +BOOST_CHECK_EQUAL(1, (min)(acc)); + +acc(0); +BOOST_CHECK_EQUAL(0, (min)(acc)); + +acc(2); +BOOST_CHECK_EQUAL(0, (min)(acc)); +---- + + +*See also* + +* xref:reference.adoc#doxygen.statistics_library_reference.min_8hpp[+++min_impl+++] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.moment]] + +=== moment + +Calculates the N-th moment of the samples, which is defined as the sum of the N-th power of the samples over the count of samples. + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + `count` + +Variants:: + _none_ + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/moment.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > > acc1; + +acc1(2); // 4 +acc1(4); // 16 +acc1(5); // + 25 + // = 45 / 3 = 15 + +BOOST_CHECK_CLOSE(15., accumulators::moment<2>(acc1), 1e-5); + +accumulator_set > > acc2; + +acc2(2); // 32 +acc2(3); // 243 +acc2(4); // 1024 +acc2(5); // + 3125 + // = 4424 / 4 = 1106 + +BOOST_CHECK_CLOSE(1106., accumulators::moment<5>(acc2), 1e-5); +---- + + +*See also* + +* xref:reference.adoc#doxygen.statistics_library_reference.moment_8hpp[+++moment_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.p_square_cumulative_distribution]] + +=== p_square_cumulative_distribution + +Histogram calculation of the cumulative distribution with the `P^2` algorithm. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.p__square__cumul__dist_8hpp+++[+++p_square_cumulative_distribution_impl+++] + +Result Type:: ++ +++++ +
iterator_range<
+    std::vector<
+        std::pair<
+            numeric::functional::fdiv<sample-type, std::size_t>::result_type
+          , numeric::functional::fdiv<sample-type, std::size_t>::result_type
+        >
+    >::iterator
+>
+
+++++ + +Depends On:: + `count` + +Variants:: + _none_ + +Initialization Parameters:: + `tag::p_square_cumulative_distribution::num_cells` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + O(N) where N is `num_cells` + +*Header* + +++++ +
#include <boost/accumulators/statistics/p_square_cumul_dist.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +// tolerance in % +double epsilon = 3; + +typedef accumulator_set > accumulator_t; + +accumulator_t acc(tag::p_square_cumulative_distribution::num_cells = 100); + +// two random number generators +boost::lagged_fibonacci607 rng; +boost::normal_distribution<> mean_sigma(0,1); +boost::variate_generator > normal(rng, mean_sigma); + +for (std::size_t i=0; i<100000; ++i) +{ + acc(normal()); +} + +typedef iterator_range >::iterator > histogram_type; +histogram_type histogram = p_square_cumulative_distribution(acc); + +for (std::size_t i = 0; i < histogram.size(); ++i) +{ + // problem with small results: epsilon is relative (in percent), not absolute! + if ( histogram[i].second > 0.001 ) + BOOST_CHECK_CLOSE( 0.5 * (1.0 + erf( histogram[i].first / sqrt(2.0) )), histogram[i].second, epsilon ); +} +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.p__square__cumul__dist_8hpp+++[+++p_square_cumulative_distribution_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.p_square_quantile]] + +=== p_square_quantile _and variants_ + +Single quantile estimation with the `P^2` algorithm. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.p__square__quantile_8hpp+++[+++p_square_quantile_impl+++] + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + `count` + +Variants:: + `p_square_quantile_for_median` + +Initialization Parameters:: + `quantile_probability`, which defaults to `0.5`. (Note: for `p_square_quantile_for_median`, the `quantile_probability` parameter is ignored and is always `0.5`.) + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/p_square_quantile.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +typedef accumulator_set > accumulator_t; + +// tolerance in % +double epsilon = 1; + +// a random number generator +boost::lagged_fibonacci607 rng; + +accumulator_t acc0(quantile_probability = 0.001); +accumulator_t acc1(quantile_probability = 0.01 ); +accumulator_t acc2(quantile_probability = 0.1 ); +accumulator_t acc3(quantile_probability = 0.25 ); +accumulator_t acc4(quantile_probability = 0.5 ); +accumulator_t acc5(quantile_probability = 0.75 ); +accumulator_t acc6(quantile_probability = 0.9 ); +accumulator_t acc7(quantile_probability = 0.99 ); +accumulator_t acc8(quantile_probability = 0.999); + +for (int i=0; i<100000; ++i) +{ + double sample = rng(); + acc0(sample); + acc1(sample); + acc2(sample); + acc3(sample); + acc4(sample); + acc5(sample); + acc6(sample); + acc7(sample); + acc8(sample); +} + +BOOST_CHECK_CLOSE( p_square_quantile(acc0), 0.001, 15*epsilon ); +BOOST_CHECK_CLOSE( p_square_quantile(acc1), 0.01 , 5*epsilon ); +BOOST_CHECK_CLOSE( p_square_quantile(acc2), 0.1 , epsilon ); +BOOST_CHECK_CLOSE( p_square_quantile(acc3), 0.25 , epsilon ); +BOOST_CHECK_CLOSE( p_square_quantile(acc4), 0.5 , epsilon ); +BOOST_CHECK_CLOSE( p_square_quantile(acc5), 0.75 , epsilon ); +BOOST_CHECK_CLOSE( p_square_quantile(acc6), 0.9 , epsilon ); +BOOST_CHECK_CLOSE( p_square_quantile(acc7), 0.99 , epsilon ); +BOOST_CHECK_CLOSE( p_square_quantile(acc8), 0.999, epsilon ); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.p__square__quantile_8hpp+++[+++p_square_quantile_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.peaks_over_threshold]] + +=== peaks_over_threshold _and variants_ + +Peaks Over Threshold method for quantile and tail mean estimation. For implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.peaks__over__threshold_8hpp+++[+++peaks_over_threshold_impl+++] and xref:reference.adoc#+++doxygen.statistics_library_reference.peaks__over__threshold_8hpp+++[+++peaks_over_threshold_prob_impl+++]. + +Both `tag::peaks_over_threshold` and `tag::peaks_over_threshold_prob<>` satisfy the `tag::abstract_peaks_over_threshold` feature, and can be extracted with the `peaks_over_threshold()` extractor. The result is a 3-tuple representing the fit parameters `u_bar`, `beta_bar` and `xi_hat`. + +Result Type:: ++ +++++ +
boost::tuple<
+    numeric::functional::fdiv<sample-type, std::size_t>::result_type // u_bar
+  , numeric::functional::fdiv<sample-type, std::size_t>::result_type // beta_bar
+  , numeric::functional::fdiv<sample-type, std::size_t>::result_type // xi_hat
+>
+
+++++ + +Depends On:: + `count` + + In addition, `tag::peaks_over_threshold_prob<>` depends on `tail` + +Variants:: + `peaks_over_threshold_prob` + +Initialization Parameters:: + `tag::peaks_over_threshold::threshold_value` + + `tag::peaks_over_threshold_prob::threshold_probability` + + `tag::tail::cache_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + TODO + +*Header* + +++++ +
#include <boost/accumulators/statistics/peaks_over_threshold.hpp>
+
+++++ + + +*Example* + +See example for xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.pot_quantile[`pot_quantile`]. + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.peaks__over__threshold_8hpp+++[+++peaks_over_threshold_impl+++] +* xref:reference.adoc#+++doxygen.statistics_library_reference.peaks__over__threshold_8hpp+++[+++peaks_over_threshold_prob_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.tail[`tail`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.pot_quantile[`pot_quantile`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.pot_tail_mean[`pot_tail_mean`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.pot_quantile]] + +=== pot_quantile _and variants_ + +Quantile estimation based on Peaks over Threshold method (for both left and right tails). For implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.pot__quantile_8hpp+++[+++pot_quantile_impl+++]. + +Both `tag::pot_quantile` and `tag::pot_quantile_prob` satisfy the `tag::quantile` feature and can be extracted using the `quantile()` extractor. + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + `pot_quantile` depends on `peaks_over_threshold` + + `pot_quantile_prob` depends on `peaks_over_threshold_prob` + +Variants:: + `pot_quantile_prob` + +Initialization Parameters:: + `tag::peaks_over_threshold::threshold_value` + + `tag::peaks_over_threshold_prob::threshold_probability` + + `tag::tail::cache_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + `quantile_probability` + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + TODO + +*Header* + +++++ +
#include <boost/accumulators/statistics/pot_quantile.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +// tolerance in % +double epsilon = 1.; + +double alpha = 0.999; +double threshold_probability = 0.99; +double threshold = 3.; + +// two random number generators +boost::lagged_fibonacci607 rng; +boost::normal_distribution<> mean_sigma(0,1); +boost::exponential_distribution<> lambda(1); +boost::variate_generator > normal(rng, mean_sigma); +boost::variate_generator > exponential(rng, lambda); + +accumulator_set(with_threshold_value)> > acc1( + tag::peaks_over_threshold::threshold_value = threshold +); +accumulator_set(with_threshold_probability)> > acc2( + tag::tail::cache_size = 2000 + , tag::peaks_over_threshold_prob::threshold_probability = threshold_probability +); + +threshold_probability = 0.995; +threshold = 5.; + +accumulator_set(with_threshold_value)> > acc3( + tag::peaks_over_threshold::threshold_value = threshold +); +accumulator_set(with_threshold_probability)> > acc4( + tag::tail::cache_size = 2000 + , tag::peaks_over_threshold_prob::threshold_probability = threshold_probability +); + +for (std::size_t i = 0; i < 100000; ++i) +{ + double sample = normal(); + acc1(sample); + acc2(sample); +} + +for (std::size_t i = 0; i < 100000; ++i) +{ + double sample = exponential(); + acc3(sample); + acc4(sample); +} + +BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = alpha), 3.090232, epsilon ); +BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = alpha), 3.090232, epsilon ); + +BOOST_CHECK_CLOSE( quantile(acc3, quantile_probability = alpha), 6.908, epsilon ); +BOOST_CHECK_CLOSE( quantile(acc4, quantile_probability = alpha), 6.908, epsilon ); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.pot__quantile_8hpp+++[+++pot_quantile_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.peaks_over_threshold[`peaks_over_threshold`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.pot_tail_mean]] + +=== pot_tail_mean + +Estimation of the (coherent) tail mean based on the peaks over threshold method (for both left and right tails). For implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.pot__tail__mean_8hpp+++[+++pot_tail_mean_impl+++]. + +Both `tag::pot_tail_mean` and `tag::pot_tail_mean_prob` satisfy the `tag::tail_mean` feature and can be extracted using the `tail_mean()` extractor. + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + `pot_tail_mean` depends on `peaks_over_threshold` and `pot_quantile` + + `pot_tail_mean_prob` depends on `peaks_over_threshold_prob` and `pot_quantile_prob` + +Variants:: + `pot_tail_mean_prob` + +Initialization Parameters:: + `tag::peaks_over_threshold::threshold_value` + + `tag::peaks_over_threshold_prob::threshold_probability` + + `tag::tail::cache_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + `quantile_probability` + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + TODO + +*Header* + +++++ +
#include <boost/accumulators/statistics/pot_tail_mean.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +// TODO +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.pot__tail__mean_8hpp+++[+++pot_tail_mean_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.peaks_over_threshold[`peaks_over_threshold`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.pot_quantile[`pot_quantile`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.rolling_count]] + +=== rolling_count + +The rolling count is the current number of elements in the rolling window. + +Result Type:: ++ +[source,text] +---- +std::size_t +---- + +Depends On:: + `rolling_window_plus1` + +Variants:: + _none_ + +Initialization Parameters:: + `tag::rolling_window::window_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/rolling_count.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > acc(tag::rolling_window::window_size = 3); + +BOOST_CHECK_EQUAL(0u, rolling_count(acc)); + +acc(1); +BOOST_CHECK_EQUAL(1u, rolling_count(acc)); + +acc(1); +BOOST_CHECK_EQUAL(2u, rolling_count(acc)); + +acc(1); +BOOST_CHECK_EQUAL(3u, rolling_count(acc)); + +acc(1); +BOOST_CHECK_EQUAL(3u, rolling_count(acc)); + +acc(1); +BOOST_CHECK_EQUAL(3u, rolling_count(acc)); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.rolling__count_8hpp+++[+++rolling_count_impl+++] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.rolling_sum]] + +=== rolling_sum + +The rolling sum is the sum of the last _N_ samples. + +Result Type:: ++ +++++ +
sample-type
+++++ + +Depends On:: + `rolling_window_plus1` + +Variants:: + _none_ + +Initialization Parameters:: + `tag::rolling_window::window_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/rolling_sum.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > acc(tag::rolling_window::window_size = 3); + +BOOST_CHECK_EQUAL(0, rolling_sum(acc)); + +acc(1); +BOOST_CHECK_EQUAL(1, rolling_sum(acc)); + +acc(2); +BOOST_CHECK_EQUAL(3, rolling_sum(acc)); + +acc(3); +BOOST_CHECK_EQUAL(6, rolling_sum(acc)); + +acc(4); +BOOST_CHECK_EQUAL(9, rolling_sum(acc)); + +acc(5); +BOOST_CHECK_EQUAL(12, rolling_sum(acc)); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.rolling__sum_8hpp+++[+++rolling_sum_impl+++] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.rolling_mean]] + +=== rolling_mean + +The rolling mean is the mean over the last _N_ samples. It is computed by dividing the rolling sum by the rolling count. + +Lazy or iterative calculation of the mean over the last _N_ samples. The lazy calculation is associated with the `tag::lazy_rolling_mean` feature, and the iterative calculation (which is the default) with the `tag::immediate_rolling_mean` feature. Both can be extracted using the `tag::rolling_mean()` extractor. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.rolling__mean_8hpp+++[+++lazy_rolling_mean_impl+++] and xref:reference.adoc#+++doxygen.statistics_library_reference.rolling__mean_8hpp+++[+++immediate_rolling_mean_impl+++] + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + `lazy_rolling_mean` depends on `rolling_sum` and `rolling_count` + + `immediate_rolling_mean` depends on `rolling_count` + +Variants:: + `lazy_rolling_mean` (a.k.a. `rolling_mean(lazy))` + + `immediate_rolling_mean` (a.k.a. `rolling_mean(immediate)`) + +Initialization Parameters:: + `tag::rolling_window::window_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
 #include <boost/accumulators/statistics/rolling_mean.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > acc(tag::rolling_window::window_size = 5); + +acc(1); +acc(2); +acc(3); + +BOOST_CHECK_CLOSE( rolling_mean(acc), 2.0, 1e-6 ); + +acc(4); +acc(5); +acc(6); +acc(7); + +BOOST_CHECK_CLOSE( rolling_mean(acc), 5.0, 1e-6 ); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.rolling__mean_8hpp+++[+++lazy_rolling_mean_impl+++] +* xref:reference.adoc#+++doxygen.statistics_library_reference.rolling__mean_8hpp+++[+++immediate_rolling_mean_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.rolling_count[`rolling_count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.rolling_sum[`rolling_sum`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.rolling_moment]] + +=== rolling_moment + +rolling_moment calculates the _M_-th moment of the samples, which is defined as the sum of the _M_-th power of the samples over the count of samples, over the last _N_ samples. + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + _none_ + +Variants:: + _none_ + +Initialization Parameters:: + `tag::rolling_window::window_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/rolling_moment.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > > acc(tag::rolling_window::window_size = 3); + +acc(2); +acc(4); + +BOOST_CHECK_CLOSE( rolling_moment<2>(acc), (4.0 + 16.0)/2, 1e-5 ); + +acc(5); +acc(6); + +BOOST_CHECK_CLOSE( rolling_moment<2>(acc), (16.0 + 25.0 + 36.0)/3, 1e-5 ); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.rolling__moment_8hpp+++[+++rolling_moment_impl+++] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.rolling_variance]] + +=== rolling_variance + +Lazy or iterative calculation of the variance over the last _N_ samples. The lazy calculation is associated with the `tag::lazy_rolling_variance` feature, and the iterative calculation with the `tag::immediate_rolling_variance` feature. Both can be extracted using the `tag::rolling_variance()` extractor. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.rolling__variance_8hpp+++[+++lazy_rolling_variance_impl+++] and xref:reference.adoc#+++doxygen.statistics_library_reference.rolling__variance_8hpp+++[+++immediate_rolling_variance_impl+++] + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + `lazy_rolling_variance` depends on `rolling_moment<2>`, `rolling_count` and `rolling_mean` + + `immediate_rolling_variance` depends on `rolling_count` and `immediate_rolling_mean` + +Variants:: + `lazy_rolling_variance` (a.k.a. `rolling_variance(lazy))` + + `immediate_rolling_variance` (a.k.a. `rolling_variance(immediate)`) + +Initialization Parameters:: + `tag::rolling_window::window_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/rolling_variance.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > acc(tag::rolling_window::window_size = 4); + +acc(1.2); + +BOOST_CHECK_CLOSE( rolling_variance(acc), 0.0, 1e-10 ); // variance is not defined for a single sample + +acc(2.3); +acc(3.4); + +BOOST_CHECK_CLOSE( rolling_variance(acc), 1.21, 1e-10 ); // variance over samples 1-3 + +acc(4.5); +acc(0.4); +acc(2.2); +acc(7.1); + +BOOST_CHECK_CLOSE( rolling_variance(acc), 8.41666666666667, 1e-10 ); // variance over samples 4-7 +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.rolling__variance_8hpp+++[+++lazy_rolling_variance_impl+++] +* xref:reference.adoc#+++doxygen.statistics_library_reference.rolling__variance_8hpp+++[+++immediate_rolling_variance_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.rolling_count[`rolling_count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.rolling_mean[`rolling_mean`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.immediate_rolling_mean[`immediate_rolling_mean`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.rolling_moment[`rolling_moment`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.skewness]] + +=== skewness + +The skewness of a sample distribution is defined as the ratio of the 3rd central moment and the `3/2`-th power of the 2nd central moment (the variance) of the samples 3. For implementation details, see xref:reference.adoc#doxygen.statistics_library_reference.skewness_8hpp[+++skewness_impl+++]. + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, sample-type>::result_type
+
+++++ + +Depends On:: + `mean` + + `moment<2>` + + `moment<3>` + +Variants:: + _none_ + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/skewness.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > acc2; + +acc2(2); +acc2(7); +acc2(4); +acc2(9); +acc2(3); + +BOOST_CHECK_EQUAL( mean(acc2), 5 ); +BOOST_CHECK_EQUAL( accumulators::moment<2>(acc2), 159./5. ); +BOOST_CHECK_EQUAL( accumulators::moment<3>(acc2), 1171./5. ); +BOOST_CHECK_CLOSE( skewness(acc2), 0.406040288214, 1e-6 ); +---- + + +*See also* + +* xref:reference.adoc#doxygen.statistics_library_reference.skewness_8hpp[+++skewness_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.mean[`mean`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.moment[`moment`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.sum]] + +=== sum _and variants_ + +For summing the samples, weights or variates. The default implementation uses the standard sum operation, but variants using the Kahan summation algorithm are also provided. + +Result Type:: + `sample-type` for summing samples + + `weight-type` for summing weights + + `variate-type` for summing variates + +Depends On:: + _none_ + +Variants:: + `tag::sum` + + `tag::sum_of_weights` + + `tag::sum_of_variates` + + `tag::sum_kahan` (a.k.a. `tag::sum(kahan)`) + + `tag::sum_of_weights_kahan` (a.k.a. `tag::sum_of_weights(kahan)`) + + `tag::sum_of_variates_kahan` + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + `weight` for summing weights + + `variate-tag` for summing variates + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1). Note that the Kahan sum performs four floating-point sum operations per accumulated value, whereas the naive sum performs only one. + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/sum.hpp>
+#include <boost/accumulators/statistics/sum_kahan.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set< + int + , stats< + tag::sum + , tag::sum_of_weights + , tag::sum_of_variates + > + , int +> acc; + +acc(1, weight = 2, covariate1 = 3); +BOOST_CHECK_EQUAL(2, sum(acc)); // weighted sample = 1 * 2 +BOOST_CHECK_EQUAL(2, sum_of_weights(acc)); +BOOST_CHECK_EQUAL(3, sum_of_variates(acc)); + +acc(2, weight = 4, covariate1 = 6); +BOOST_CHECK_EQUAL(10, sum(acc)); // weighted sample = 2 * 4 +BOOST_CHECK_EQUAL(6, sum_of_weights(acc)); +BOOST_CHECK_EQUAL(9, sum_of_variates(acc)); + +acc(3, weight = 6, covariate1 = 9); +BOOST_CHECK_EQUAL(28, sum(acc)); // weighted sample = 3 * 6 +BOOST_CHECK_EQUAL(12, sum_of_weights(acc)); +BOOST_CHECK_EQUAL(18, sum_of_variates(acc)); + +// demonstrate Kahan summation +accumulator_set > acc; +BOOST_CHECK_EQUAL(0.0f, sum_kahan(acc)); +for (size_t i = 0; i < 1e6; ++i) { + acc(1e-6f); +} +BOOST_CHECK_EQUAL(1.0f, sum_kahan(acc)); +---- + + +*See also* + +* xref:reference.adoc#doxygen.statistics_library_reference.sum_8hpp[+++sum_impl+++] +* xref:reference.adoc#+++doxygen.statistics_library_reference.sum__kahan_8hpp+++[+++sum_kahan_impl+++] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.tail]] + +=== tail + +Tracks the largest or smallest `N` values. `tag::tail` tracks the largest `N`, and `tag::tail` tracks the smallest. The parameter `N` is specified with the `tag::tail::cache_size` initialization parameter. For implementation details, see xref:reference.adoc#doxygen.statistics_library_reference.tail_8hpp[+++tail_impl+++]. + +Both `tag::tail` and `tag::tail` satisfy the `tag::abstract_tail` feature and can be extracted with the `tail()` extractor. + +Result Type:: ++ +++++ +
boost::iterator_range<
+    boost::reverse_iterator<
+        boost::permutation_iterator<
+            std::vector<sample-type>::const_iterator  // samples
+          , std::vector<std::size_t>::iterator          // indices
+        >
+    >
+>
+
+++++ + +Depends On:: + _none_ + +Variants:: + `abstract_tail` + +Initialization Parameters:: + `tag::tail::cache_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(log N), where N is the cache size + +Extractor Complexity:: + O(N log N), where N is the cache size + +*Header* + +++++ +
#include <boost/accumulators/statistics/tail.hpp>
+
+++++ + + +*Example* + +See the Example for xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.tail_variate[`tail_variate`]. + +*See also* + +* xref:reference.adoc#doxygen.statistics_library_reference.tail_8hpp[+++tail_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.tail_variate[`tail_variate`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.coherent_tail_mean]] + +=== coherent_tail_mean + +Estimation of the coherent tail mean based on order statistics (for both left and right tails). The left coherent tail mean feature is `tag::coherent_tail_mean`, and the right coherent tail mean feature is `tag::coherent_tail_mean`. They both share the `tag::tail_mean` feature and can be extracted with the `tail_mean()` extractor. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.tail__mean_8hpp+++[+++coherent_tail_mean_impl+++] + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + `count` + + `quantile` + + `non_coherent_tail_mean` + +Variants:: + _none_ + +Initialization Parameters:: + `tag::tail::cache_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + `quantile_probability` + +Accumulator Complexity:: + O(log N), where N is the cache size + +Extractor Complexity:: + O(N log N), where N is the cache size + +*Header* + +++++ +
#include <boost/accumulators/statistics/tail_mean.hpp>
+
+++++ + + +*Example* + +See the example for xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.non_coherent_tail_mean[`non_coherent_tail_mean`]. + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.tail__mean_8hpp+++[+++coherent_tail_mean_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.extended_p_square_quantile[`extended_p_square_quantile`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.pot_quantile[`pot_quantile`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.tail_quantile[`tail_quantile`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.non_coherent_tail_mean[`non_coherent_tail_mean`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.non_coherent_tail_mean]] + +=== non_coherent_tail_mean + +Estimation of the (non-coherent) tail mean based on order statistics (for both left and right tails). The left non-coherent tail mean feature is `tag::non_coherent_tail_mean`, and the right non-choherent tail mean feature is `tag::non_coherent_tail_mean`. They both share the `tag::abstract_non_coherent_tail_mean` feature and can be extracted with the `non_coherent_tail_mean()` extractor. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.tail__mean_8hpp+++[+++non_coherent_tail_mean_impl+++] + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + `count` + + `tail` + +Variants:: + `abstract_non_coherent_tail_mean` + +Initialization Parameters:: + `tag::tail::cache_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + `quantile_probability` + +Accumulator Complexity:: + O(log N), where N is the cache size + +Extractor Complexity:: + O(N log N), where N is the cache size + +*Header* + +++++ +
#include <boost/accumulators/statistics/tail_mean.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +// tolerance in % +double epsilon = 1; + +std::size_t n = 100000; // number of MC steps +std::size_t c = 10000; // cache size + +typedef accumulator_set, tag::tail_quantile > > accumulator_t_right1; +typedef accumulator_set, tag::tail_quantile > > accumulator_t_left1; +typedef accumulator_set, tag::tail_quantile > > accumulator_t_right2; +typedef accumulator_set, tag::tail_quantile > > accumulator_t_left2; + +accumulator_t_right1 acc0( right_tail_cache_size = c ); +accumulator_t_left1 acc1( left_tail_cache_size = c ); +accumulator_t_right2 acc2( right_tail_cache_size = c ); +accumulator_t_left2 acc3( left_tail_cache_size = c ); + +// a random number generator +boost::lagged_fibonacci607 rng; + +for (std::size_t i = 0; i < n; ++i) +{ + double sample = rng(); + acc0(sample); + acc1(sample); + acc2(sample); + acc3(sample); +} + +// check uniform distribution +BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc0, quantile_probability = 0.95), 0.975, epsilon ); +BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc0, quantile_probability = 0.975), 0.9875, epsilon ); +BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc0, quantile_probability = 0.99), 0.995, epsilon ); +BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc0, quantile_probability = 0.999), 0.9995, epsilon ); +BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc1, quantile_probability = 0.05), 0.025, epsilon ); +BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc1, quantile_probability = 0.025), 0.0125, epsilon ); +BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc1, quantile_probability = 0.01), 0.005, 5 ); +BOOST_CHECK_CLOSE( non_coherent_tail_mean(acc1, quantile_probability = 0.001), 0.0005, 10 ); +BOOST_CHECK_CLOSE( tail_mean(acc2, quantile_probability = 0.95), 0.975, epsilon ); +BOOST_CHECK_CLOSE( tail_mean(acc2, quantile_probability = 0.975), 0.9875, epsilon ); +BOOST_CHECK_CLOSE( tail_mean(acc2, quantile_probability = 0.99), 0.995, epsilon ); +BOOST_CHECK_CLOSE( tail_mean(acc2, quantile_probability = 0.999), 0.9995, epsilon ); +BOOST_CHECK_CLOSE( tail_mean(acc3, quantile_probability = 0.05), 0.025, epsilon ); +BOOST_CHECK_CLOSE( tail_mean(acc3, quantile_probability = 0.025), 0.0125, epsilon ); +BOOST_CHECK_CLOSE( tail_mean(acc3, quantile_probability = 0.01), 0.005, 5 ); +BOOST_CHECK_CLOSE( tail_mean(acc3, quantile_probability = 0.001), 0.0005, 10 ); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.tail__mean_8hpp+++[+++non_coherent_tail_mean_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.tail[`tail`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.tail_quantile]] + +=== tail_quantile + +Tail quantile estimation based on order statistics (for both left and right tails). The left tail quantile feature is `tag::tail_quantile`, and the right tail quantile feature is `tag::tail_quantile`. They both share the `tag::quantile` feature and can be extracted with the `quantile()` extractor. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.tail__quantile_8hpp+++[+++tail_quantile_impl+++] + +Result Type:: ++ +++++ +
sample-type
+
+++++ + +Depends On:: + `count` + + `tail` + +Variants:: + _none_ + +Initialization Parameters:: + `tag::tail::cache_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + `quantile_probability` + +Accumulator Complexity:: + O(log N), where N is the cache size + +Extractor Complexity:: + O(N log N), where N is the cache size + +*Header* + +++++ +
#include <boost/accumulators/statistics/tail_quantile.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +// tolerance in % +double epsilon = 1; + +std::size_t n = 100000; // number of MC steps +std::size_t c = 10000; // cache size + +typedef accumulator_set > > accumulator_t_right; +typedef accumulator_set > > accumulator_t_left; + +accumulator_t_right acc0( tag::tail::cache_size = c ); +accumulator_t_right acc1( tag::tail::cache_size = c ); +accumulator_t_left acc2( tag::tail::cache_size = c ); +accumulator_t_left acc3( tag::tail::cache_size = c ); + +// two random number generators +boost::lagged_fibonacci607 rng; +boost::normal_distribution<> mean_sigma(0,1); +boost::variate_generator > normal(rng, mean_sigma); + +for (std::size_t i = 0; i < n; ++i) +{ + double sample1 = rng(); + double sample2 = normal(); + acc0(sample1); + acc1(sample2); + acc2(sample1); + acc3(sample2); +} + +// check uniform distribution +BOOST_CHECK_CLOSE( quantile(acc0, quantile_probability = 0.95 ), 0.95, epsilon ); +BOOST_CHECK_CLOSE( quantile(acc0, quantile_probability = 0.975), 0.975, epsilon ); +BOOST_CHECK_CLOSE( quantile(acc0, quantile_probability = 0.99 ), 0.99, epsilon ); +BOOST_CHECK_CLOSE( quantile(acc0, quantile_probability = 0.999), 0.999, epsilon ); +BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.05 ), 0.05, 2 ); +BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.025), 0.025, 2 ); +BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.01 ), 0.01, 3 ); +BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.001), 0.001, 20 ); + +// check standard normal distribution +BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = 0.975), 1.959963, epsilon ); +BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = 0.999), 3.090232, epsilon ); +BOOST_CHECK_CLOSE( quantile(acc3, quantile_probability = 0.025), -1.959963, epsilon ); +BOOST_CHECK_CLOSE( quantile(acc3, quantile_probability = 0.001), -3.090232, epsilon ); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.tail__quantile_8hpp+++[+++tail_quantile_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.tail[`tail`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.tail_variate]] + +=== tail_variate + +Tracks the covariates of largest or smallest `N` samples. `tag::tail_variate` tracks the covariate associated with +++<variate-tag>+++ for the largest `N`, and `tag::tail_variate` for the smallest. The parameter `N` is specified with the `tag::tail::cache_size` initialization parameter. For implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.tail__variate_8hpp+++[+++tail_variate_impl+++]. + +Both `tag::tail_variate` and `tag::tail_variate` satisfy the `tag::abstract_tail_variate` feature and can be extracted with the `tail_variate()` extractor. + +Result Type:: ++ +++++ +
boost::iterator_range<
+    boost::reverse_iterator<
+        boost::permutation_iterator<
+            std::vector<variate-type>::const_iterator // variates
+          , std::vector<std::size_t>::iterator          // indices
+        >
+    >
+>
+
+++++ + +Depends On:: + `tail` + +Variants:: + `abstract_tail_variate` + +Initialization Parameters:: + `tag::tail::cache_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(log N), where N is the cache size + +Extractor Complexity:: + O(N log N), where N is the cache size + +*Header* + +++++ +
#include <boost/accumulators/statistics/tail_variate.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set > > acc( + tag::tail::cache_size = 4 +); + +acc(8, covariate1 = 3); +CHECK_RANGE_EQUAL(tail(acc), {8}); +CHECK_RANGE_EQUAL(tail_variate(acc), {3}); + +acc(16, covariate1 = 1); +CHECK_RANGE_EQUAL(tail(acc), {16, 8}); +CHECK_RANGE_EQUAL(tail_variate(acc), {1, 3}); + +acc(12, covariate1 = 4); +CHECK_RANGE_EQUAL(tail(acc), {16, 12, 8}); +CHECK_RANGE_EQUAL(tail_variate(acc), {1, 4, 3}); + +acc(24, covariate1 = 5); +CHECK_RANGE_EQUAL(tail(acc), {24, 16, 12, 8}); +CHECK_RANGE_EQUAL(tail_variate(acc), {5, 1, 4, 3}); + +acc(1, covariate1 = 9); +CHECK_RANGE_EQUAL(tail(acc), {24, 16, 12, 8}); +CHECK_RANGE_EQUAL(tail_variate(acc), {5, 1, 4, 3}); + +acc(9, covariate1 = 7); +CHECK_RANGE_EQUAL(tail(acc), {24, 16, 12, 9}); +CHECK_RANGE_EQUAL(tail_variate(acc), {5, 1, 4, 7}); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.tail__variate_8hpp+++[+++tail_variate_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.tail[`tail`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.tail_variate_means]] + +=== tail_variate_means _and variants_ + +Estimation of the absolute and relative tail variate means (for both left and right tails). The absolute tail variate means has the feature `tag::absolute_tail_variate_means` and the relative tail variate mean has the feature `tag::relative_tail_variate_means`. All absolute tail variate mean features share the `tag::abstract_absolute_tail_variate_means` feature and can be extracted with the `tail_variate_means()` extractor. All the relative tail variate mean features share the `tag::abstract_relative_tail_variate_means` feature and can be extracted with the `relative_tail_variate_means()` extractor. + +For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.tail__variate__means_8hpp+++[+++tail_variate_means_impl+++] + +Result Type:: ++ +++++ +
boost::iterator_range<
+    std::vector<
+        numeric::functional::fdiv<sample-type, std::size_t>::result_type
+    >::iterator
+>
+
+++++ + +Depends On:: + `non_coherent_tail_mean` + + `tail_variate` + +Variants:: + `tag::absolute_tail_variate_means` + + `tag::relative_tail_variate_means` + +Initialization Parameters:: + `tag::tail::cache_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + `quantile_probability` + +Accumulator Complexity:: + O(log N), where N is the cache size + +Extractor Complexity:: + O(N log N), where N is the cache size + +*Header* + +++++ +
#include <boost/accumulators/statistics/tail_variate_means.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +std::size_t c = 5; // cache size + +typedef double variate_type; +typedef std::vector variate_set_type; + +typedef accumulator_set(relative)>, tag::tail > +accumulator_t1; + +typedef accumulator_set(absolute)>, tag::tail > +accumulator_t2; + +typedef accumulator_set(relative)>, tag::tail > +accumulator_t3; + +typedef accumulator_set(absolute)>, tag::tail > +accumulator_t4; + +accumulator_t1 acc1( right_tail_cache_size = c ); +accumulator_t2 acc2( right_tail_cache_size = c ); +accumulator_t3 acc3( left_tail_cache_size = c ); +accumulator_t4 acc4( left_tail_cache_size = c ); + +variate_set_type cov1, cov2, cov3, cov4, cov5; +double c1[] = { 10., 20., 30., 40. }; // 100 +double c2[] = { 26., 4., 17., 3. }; // 50 +double c3[] = { 46., 64., 40., 50. }; // 200 +double c4[] = { 1., 3., 70., 6. }; // 80 +double c5[] = { 2., 2., 2., 14. }; // 20 +cov1.assign(c1, c1 + sizeof(c1)/sizeof(variate_type)); +cov2.assign(c2, c2 + sizeof(c2)/sizeof(variate_type)); +cov3.assign(c3, c3 + sizeof(c3)/sizeof(variate_type)); +cov4.assign(c4, c4 + sizeof(c4)/sizeof(variate_type)); +cov5.assign(c5, c5 + sizeof(c5)/sizeof(variate_type)); + +acc1(100., covariate1 = cov1); +acc1( 50., covariate1 = cov2); +acc1(200., covariate1 = cov3); +acc1( 80., covariate1 = cov4); +acc1( 20., covariate1 = cov5); + +acc2(100., covariate1 = cov1); +acc2( 50., covariate1 = cov2); +acc2(200., covariate1 = cov3); +acc2( 80., covariate1 = cov4); +acc2( 20., covariate1 = cov5); + +acc3(100., covariate1 = cov1); +acc3( 50., covariate1 = cov2); +acc3(200., covariate1 = cov3); +acc3( 80., covariate1 = cov4); +acc3( 20., covariate1 = cov5); + +acc4(100., covariate1 = cov1); +acc4( 50., covariate1 = cov2); +acc4(200., covariate1 = cov3); +acc4( 80., covariate1 = cov4); +acc4( 20., covariate1 = cov5); + +// check relative risk contributions +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.7).begin() ), 14./75. ); // (10 + 46) / 300 = 14/75 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 1), 7./25. ); // (20 + 64) / 300 = 7/25 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 2), 7./30. ); // (30 + 40) / 300 = 7/30 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 3), 3./10. ); // (40 + 50) / 300 = 3/10 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.3).begin() ), 14./35. ); // (26 + 2) / 70 = 14/35 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 1), 3./35. ); // ( 4 + 2) / 70 = 3/35 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 2), 19./70. ); // (17 + 2) / 70 = 19/70 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 3), 17./70. ); // ( 3 + 14) / 70 = 17/70 + +// check absolute risk contributions +BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.7).begin() ), 28 ); // (10 + 46) / 2 = 28 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.7).begin() + 1), 42 ); // (20 + 64) / 2 = 42 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.7).begin() + 2), 35 ); // (30 + 40) / 2 = 35 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.7).begin() + 3), 45 ); // (40 + 50) / 2 = 45 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.3).begin() ), 14 ); // (26 + 2) / 2 = 14 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.3).begin() + 1), 3 ); // ( 4 + 2) / 2 = 3 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.3).begin() + 2),9.5 ); // (17 + 2) / 2 = 9.5 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.3).begin() + 3),8.5 ); // ( 3 + 14) / 2 = 8.5 + +// check relative risk contributions +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.9).begin() ), 23./100. ); // 46/200 = 23/100 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 1), 8./25. ); // 64/200 = 8/25 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 2), 1./5. ); // 40/200 = 1/5 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 3), 1./4. ); // 50/200 = 1/4 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.1).begin() ), 1./10. ); // 2/ 20 = 1/10 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 1), 1./10. ); // 2/ 20 = 1/10 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 2), 1./10. ); // 2/ 20 = 1/10 +BOOST_CHECK_EQUAL( *(relative_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 3), 7./10. ); // 14/ 20 = 7/10 + +// check absolute risk contributions +BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.9).begin() ), 46 ); // 46 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.9).begin() + 1), 64 ); // 64 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.9).begin() + 2), 40 ); // 40 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc2, quantile_probability = 0.9).begin() + 3), 50 ); // 50 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.1).begin() ), 2 ); // 2 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.1).begin() + 1), 2 ); // 2 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.1).begin() + 2), 2 ); // 2 +BOOST_CHECK_EQUAL( *(tail_variate_means(acc4, quantile_probability = 0.1).begin() + 3), 14 ); // 14 +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.tail__variate__means_8hpp+++[+++tail_variate_means_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.non_coherent_tail_mean[`non_coherent_tail_mean`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.tail_variate[`tail_variate`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.variance]] + +=== variance _and variants_ + +Lazy or iterative calculation of the variance. The lazy calculation is associated with the `tag::lazy_variance` feature, and the iterative calculation with the `tag::variance` feature. Both can be extracted using the `tag::variance()` extractor. For more implementation details, see xref:reference.adoc#doxygen.statistics_library_reference.variance_8hpp[+++lazy_variance_impl+++] and xref:reference.adoc#doxygen.statistics_library_reference.variance_8hpp[+++variance_impl+++] + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + `tag::lazy_variance` depends on `tag::moment<2>` and `tag::mean` + + `tag::variance` depends on `tag::count` and `tag::immediate_mean` + +Variants:: + `tag::lazy_variance` (a.k.a. `tag::variance(lazy))` + + `tag::variance` (a.k.a. `tag::variance(immediate)`) + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/variance.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +// lazy variance +accumulator_set > acc1; + +acc1(1); +acc1(2); +acc1(3); +acc1(4); +acc1(5); + +BOOST_CHECK_EQUAL(5u, count(acc1)); +BOOST_CHECK_CLOSE(3., mean(acc1), 1e-5); +BOOST_CHECK_CLOSE(11., accumulators::moment<2>(acc1), 1e-5); +BOOST_CHECK_CLOSE(2., variance(acc1), 1e-5); + +// immediate variance +accumulator_set > acc2; + +acc2(1); +acc2(2); +acc2(3); +acc2(4); +acc2(5); + +BOOST_CHECK_EQUAL(5u, count(acc2)); +BOOST_CHECK_CLOSE(3., mean(acc2), 1e-5); +BOOST_CHECK_CLOSE(2., variance(acc2), 1e-5); +---- + + +*See also* + +* xref:reference.adoc#doxygen.statistics_library_reference.variance_8hpp[+++lazy_variance_impl+++] +* xref:reference.adoc#doxygen.statistics_library_reference.variance_8hpp[+++variance_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.mean[`mean`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.moment[`moment`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_covariance]] + +=== weighted_covariance + +An iterative Monte Carlo estimator for the weighted covariance. The feature is specified as `tag::weighted_covariance` and is extracted with the `weighted_variate()` extractor. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__covariance_8hpp+++[+++weighted_covariance_impl+++] + +Result Type:: ++ +++++ +
numeric::functional::outer_product<
+    numeric::functional::multiplies<
+        weight-type
+      , numeric::functional::fdiv<sample-type, std::size_t>::result_type
+    >::result_type
+  , numeric::functional::multiplies<
+        weight-type
+      , numeric::functional::fdiv<variate-type, std::size_t>::result_type
+    >::result_type
+>
+
+++++ + +Depends On:: + `count` + + `sum_of_weights` + + `weighted_mean` + + `weighted_mean_of_variates` + +Variants:: + `abstract_weighted_covariance` + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + `weight` + + `variate-tag` + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_covariance.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set >, double > acc; + +acc(1., weight = 1.1, covariate1 = 2.); +acc(1., weight = 2.2, covariate1 = 4.); +acc(2., weight = 3.3, covariate1 = 3.); +acc(6., weight = 4.4, covariate1 = 1.); + +double epsilon = 1e-6; +BOOST_CHECK_CLOSE(weighted_covariance(acc), -2.39, epsilon); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__covariance_8hpp+++[+++weighted_covariance_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.sum[`sum`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_mean[`weighted_mean`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_density]] + +=== weighted_density + +The `tag::weighted_density` feature returns a histogram of the weighted sample distribution. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__density_8hpp+++[+++weighted_density_impl+++]. + +Result Type:: ++ +++++ +
iterator_range<
+    std::vector<
+        std::pair<
+            numeric::functional::fdiv<weight-type, std::size_t>::result_type
+          , numeric::functional::fdiv<weight-type, std::size_t>::result_type
+        >
+    >::iterator
+>
+
+++++ + +Depends On:: + `count` + + `sum_of_weights` + + `min` + + `max` + +Variants:: + _none_ + +Initialization Parameters:: + `tag::weighted_density::cache_size` + + `tag::weighted_density::num_bins` + +Accumulator Parameters:: + `weight` + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + O(N), when N is `weighted_density::num_bins` + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_density.hpp>
+
+++++ + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__density_8hpp+++[+++weighted_density_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.sum[`sum`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.min[`min`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.max[`max`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_extended_p_square]] + +=== weighted_extended_p_square + +Multiple quantile estimation with the extended `P^2` algorithm for weighted samples. For further details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__extended__p__square_8hpp+++[+++weighted_extended_p_square_impl+++]. + +Result Type:: ++ +++++ +
boost::iterator_range<
+    implementation-defined
+>
+
+++++ + +Depends On:: + `count` + + `sum_of_weights` + +Variants:: + _none_ + +Initialization Parameters:: + `tag::weighted_extended_p_square::probabilities` + +Accumulator Parameters:: + `weight` + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_extended_p_square.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +typedef accumulator_set, double> accumulator_t; + +// tolerance in % +double epsilon = 1; + +// some random number generators +double mu1 = -1.0; +double mu2 = 1.0; +boost::lagged_fibonacci607 rng; +boost::normal_distribution<> mean_sigma1(mu1, 1); +boost::normal_distribution<> mean_sigma2(mu2, 1); +boost::variate_generator > normal1(rng, mean_sigma1); +boost::variate_generator > normal2(rng, mean_sigma2); + +std::vector probs_uniform, probs_normal1, probs_normal2, probs_normal_exact1, probs_normal_exact2; + +double p1[] = {/*0.001,*/ 0.01, 0.1, 0.5, 0.9, 0.99, 0.999}; +probs_uniform.assign(p1, p1 + sizeof(p1) / sizeof(double)); + +double p2[] = {0.001, 0.025}; +double p3[] = {0.975, 0.999}; +probs_normal1.assign(p2, p2 + sizeof(p2) / sizeof(double)); +probs_normal2.assign(p3, p3 + sizeof(p3) / sizeof(double)); + +double p4[] = {-3.090232, -1.959963}; +double p5[] = {1.959963, 3.090232}; +probs_normal_exact1.assign(p4, p4 + sizeof(p4) / sizeof(double)); +probs_normal_exact2.assign(p5, p5 + sizeof(p5) / sizeof(double)); + +accumulator_t acc_uniform(tag::weighted_extended_p_square::probabilities = probs_uniform); +accumulator_t acc_normal1(tag::weighted_extended_p_square::probabilities = probs_normal1); +accumulator_t acc_normal2(tag::weighted_extended_p_square::probabilities = probs_normal2); + +for (std::size_t i = 0; i < 100000; ++i) +{ + acc_uniform(rng(), weight = 1.); + + double sample1 = normal1(); + double sample2 = normal2(); + acc_normal1(sample1, weight = std::exp(-mu1 * (sample1 - 0.5 * mu1))); + acc_normal2(sample2, weight = std::exp(-mu2 * (sample2 - 0.5 * mu2))); +} + +// check for uniform distribution +for (std::size_t i = 0; i < probs_uniform.size(); ++i) +{ + BOOST_CHECK_CLOSE(weighted_extended_p_square(acc_uniform)[i], probs_uniform[i], epsilon); +} + +// check for standard normal distribution +for (std::size_t i = 0; i < probs_normal1.size(); ++i) +{ + BOOST_CHECK_CLOSE(weighted_extended_p_square(acc_normal1)[i], probs_normal_exact1[i], epsilon); + BOOST_CHECK_CLOSE(weighted_extended_p_square(acc_normal2)[i], probs_normal_exact2[i], epsilon); +} +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__extended__p__square_8hpp+++[+++weighted_extended_p_square_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.sum[`sum`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_kurtosis]] + +=== weighted_kurtosis + +The kurtosis of a sample distribution is defined as the ratio of the 4th central moment and the square of the 2nd central moment (the variance) of the samples, minus 3. The term `-3` is added in order to ensure that the normal distribution has zero kurtosis. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__kurtosis_8hpp+++[+++weighted_kurtosis_impl+++] + +Result Type:: ++ +++++ +
numeric::functional::fdiv<
+    numeric::functional::multiplies<sample-type, weight-type>::result_type
+  , numeric::functional::multiplies<sample-type, weight-type>::result_type
+>::result_type
+
+++++ + +Depends On:: + `weighted_mean` + + `weighted_moment<2>` + + `weighted_moment<3>` + + `weighted_moment<4>` + +Variants:: + _none_ + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_kurtosis.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set, int > acc2; + +acc2(2, weight = 4); +acc2(7, weight = 1); +acc2(4, weight = 3); +acc2(9, weight = 1); +acc2(3, weight = 2); + +BOOST_CHECK_EQUAL( weighted_mean(acc2), 42./11. ); +BOOST_CHECK_EQUAL( accumulators::weighted_moment<2>(acc2), 212./11. ); +BOOST_CHECK_EQUAL( accumulators::weighted_moment<3>(acc2), 1350./11. ); +BOOST_CHECK_EQUAL( accumulators::weighted_moment<4>(acc2), 9956./11. ); +BOOST_CHECK_CLOSE( weighted_kurtosis(acc2), 0.58137026432, 1e-6 ); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__kurtosis_8hpp+++[+++weighted_kurtosis_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_mean[`weighted_mean`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_moment[`weighted_moment`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_mean]] + +=== weighted_mean _and variants_ + +Calculates the weighted mean of samples or variates. The calculation is either lazy (in the result extractor), or immediate (in the accumulator). The lazy implementation is the default. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__mean_8hpp+++[+++weighted_mean_impl+++] or. xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__mean_8hpp+++[+++immediate_weighted_mean_impl+++] + +Result Type:: + For samples, `numeric::functional::fdiv::result_type, weight-type>::result_type` + + For variates, `numeric::functional::fdiv::result_type, weight-type>::result_type` + +Depends On:: + `sum_of_weights` + + The lazy mean of samples depends on `weighted_sum` + + The lazy mean of variates depends on `weighted_sum_of_variates<>` + +Variants:: + `weighted_mean_of_variates` + + `immediate_weighted_mean` + + `immediate_weighted_mean_of_variates` + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_mean.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set< + int + , stats< + tag::weighted_mean + , tag::weighted_mean_of_variates + > + , int +> acc; + +acc(10, weight = 2, covariate1 = 7); // 20 +BOOST_CHECK_EQUAL(2, sum_of_weights(acc)); // + // +acc(6, weight = 3, covariate1 = 8); // 18 +BOOST_CHECK_EQUAL(5, sum_of_weights(acc)); // + // +acc(4, weight = 4, covariate1 = 9); // 16 +BOOST_CHECK_EQUAL(9, sum_of_weights(acc)); // + // +acc(6, weight = 5, covariate1 = 6); //+ 30 +BOOST_CHECK_EQUAL(14, sum_of_weights(acc)); // + //= 84 / 14 = 6 + +BOOST_CHECK_EQUAL(6., weighted_mean(acc)); +BOOST_CHECK_EQUAL(52./7., (accumulators::weighted_mean_of_variates(acc))); + +accumulator_set< + int + , stats< + tag::weighted_mean(immediate) + , tag::weighted_mean_of_variates(immediate) + > + , int +> acc2; + +acc2(10, weight = 2, covariate1 = 7); // 20 +BOOST_CHECK_EQUAL(2, sum_of_weights(acc2)); // + // +acc2(6, weight = 3, covariate1 = 8); // 18 +BOOST_CHECK_EQUAL(5, sum_of_weights(acc2)); // + // +acc2(4, weight = 4, covariate1 = 9); // 16 +BOOST_CHECK_EQUAL(9, sum_of_weights(acc2)); // + // +acc2(6, weight = 5, covariate1 = 6); //+ 30 +BOOST_CHECK_EQUAL(14, sum_of_weights(acc2)); // + //= 84 / 14 = 6 + +BOOST_CHECK_EQUAL(6., weighted_mean(acc2)); +BOOST_CHECK_EQUAL(52./7., (accumulators::weighted_mean_of_variates(acc2))); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__mean_8hpp+++[+++weighted_mean_impl+++] +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__mean_8hpp+++[+++immediate_weighted_mean_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_sum[`weighted_sum`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.sum[`sum`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_median]] + +=== weighted_median _and variants_ + +Median estimation for weighted samples based on the `P^2` quantile estimator, the density estimator, or the `P^2` cumulative distribution estimator. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__median_8hpp+++[+++weighted_median_impl+++], +++with_weighted_density_median_impl+++, and +++with_weighted_p_square_cumulative_distribution_median_impl+++. + +The three median accumulators all satisfy the `tag::weighted_median` feature, and can all be extracted with the `weighted_median()` extractor. + +Result Type:: ++ +++++ +
numeric::functional::fdiv<sample-type, std::size_t>::result_type
+
+++++ + +Depends On:: + `weighted_median` depends on `weighted_p_square_quantile_for_median` + + `with_weighted_density_median` depends on `count` and `weighted_density` + + `with_weighted_p_square_cumulative_distribution_median` depends on `weighted_p_square_cumulative_distribution` + +Variants:: + `with_weighted_density_median` (a.k.a. `weighted_median(with_weighted_density)`) + + `with_weighted_p_square_cumulative_distribution_median` (a.k.a. `weighted_median(with_weighted_p_square_cumulative_distribution)`) + +Initialization Parameters:: + `with_weighted_density_median` requires `tag::weighted_density::cache_size` and `tag::weighted_density::num_bins` + + `with_weighted_p_square_cumulative_distribution_median` requires `tag::weighted_p_square_cumulative_distribution::num_cells` + +Accumulator Parameters:: + `weight` + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + TODO + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_median.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +// Median estimation of normal distribution N(1,1) using samples from a narrow normal distribution N(1,0.01) +// The weights equal to the likelihood ratio of the corresponding samples + +// two random number generators +double mu = 1.; +double sigma_narrow = 0.01; +double sigma = 1.; +boost::lagged_fibonacci607 rng; +boost::normal_distribution<> mean_sigma_narrow(mu,sigma_narrow); +boost::variate_generator > normal_narrow(rng, mean_sigma_narrow); + +accumulator_set, double > acc; +accumulator_set, double > + acc_dens( tag::weighted_density::cache_size = 10000, tag::weighted_density::num_bins = 1000 ); +accumulator_set, double > + acc_cdist( tag::weighted_p_square_cumulative_distribution::num_cells = 100 ); + +for (std::size_t i=0; i<100000; ++i) +{ + double sample = normal_narrow(); + acc(sample, weight = std::exp(0.5 * (sample - mu) * (sample - mu) * ( 1./sigma_narrow/sigma_narrow - 1./sigma/sigma ))); + acc_dens(sample, weight = std::exp(0.5 * (sample - mu) * (sample - mu) * ( 1./sigma_narrow/sigma_narrow - 1./sigma/sigma ))); + acc_cdist(sample, weight = std::exp(0.5 * (sample - mu) * (sample - mu) * ( 1./sigma_narrow/sigma_narrow - 1./sigma/sigma ))); +} + +BOOST_CHECK_CLOSE(1., weighted_median(acc), 1e-1); +BOOST_CHECK_CLOSE(1., weighted_median(acc_dens), 1e-1); +BOOST_CHECK_CLOSE(1., weighted_median(acc_cdist), 1e-1); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__median_8hpp+++[+++weighted_median_impl+++] +* +++with_weighted_density_median_impl+++ +* +++with_weighted_p_square_cumulative_distribution_median_impl+++ +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_p_square_quantile[`weighted_p_square_quantile`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_p_square_cumulative_distribution[`weighted_p_square_cumulative_distribution`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_moment]] + +=== weighted_moment + +Calculates the N-th moment of the weighted samples, which is defined as the sum of the weighted N-th power of the samples over the sum of the weights. + +Result Type:: ++ +++++ +
numeric::functional::fdiv<
+    numeric::functional::multiplies<sample-type, weight-type>::result_type
+  , weight_type
+>::result_type
+
+++++ + +Depends On:: + `count` + + `sum_of_weights` + +Variants:: + _none_ + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + `weight` + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_moment.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set >, double> acc2; +accumulator_set >, double> acc7; + +acc2(2.1, weight = 0.7); +acc2(2.7, weight = 1.4); +acc2(1.8, weight = 0.9); + +acc7(2.1, weight = 0.7); +acc7(2.7, weight = 1.4); +acc7(1.8, weight = 0.9); + +BOOST_CHECK_CLOSE(5.403, accumulators::weighted_moment<2>(acc2), 1e-5); +BOOST_CHECK_CLOSE(548.54182, accumulators::weighted_moment<7>(acc7), 1e-5); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__moment_8hpp+++[+++weighted_moment_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.sum[`sum`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_p_square_cumulative_distribution]] + +=== weighted_p_square_cumulative_distribution + +Histogram calculation of the cumulative distribution with the `P^2` algorithm for weighted samples. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__p__square__cumul__dist_8hpp+++[+++weighted_p_square_cumulative_distribution_impl+++] + +Result Type:: ++ +[source,text] +---- +iterator_range< + std::vector< + std::pair< + numeric::functional::fdiv::result_type + , numeric::functional::fdiv::result_type + > + >::iterator +> +---- + `weighted_sample` is `numeric::functional::multiplies::result_type` + +Depends On:: + `count` + + `sum_or_weights` + +Variants:: + _none_ + +Initialization Parameters:: + `tag::weighted_p_square_cumulative_distribution::num_cells` + +Accumulator Parameters:: + `weight` + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + O(N) where N is `num_cells` + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_p_square_cumul_dist.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +// tolerance in % +double epsilon = 4; + +typedef accumulator_set, double > accumulator_t; + +accumulator_t acc_upper(tag::weighted_p_square_cumulative_distribution::num_cells = 100); +accumulator_t acc_lower(tag::weighted_p_square_cumulative_distribution::num_cells = 100); + +// two random number generators +double mu_upper = 1.0; +double mu_lower = -1.0; +boost::lagged_fibonacci607 rng; +boost::normal_distribution<> mean_sigma_upper(mu_upper,1); +boost::normal_distribution<> mean_sigma_lower(mu_lower,1); +boost::variate_generator > normal_upper(rng, mean_sigma_upper); +boost::variate_generator > normal_lower(rng, mean_sigma_lower); + +for (std::size_t i=0; i<100000; ++i) +{ + double sample = normal_upper(); + acc_upper(sample, weight = std::exp(-mu_upper * (sample - 0.5 * mu_upper))); +} + +for (std::size_t i=0; i<100000; ++i) +{ + double sample = normal_lower(); + acc_lower(sample, weight = std::exp(-mu_lower * (sample - 0.5 * mu_lower))); +} + +typedef iterator_range >::iterator > histogram_type; +histogram_type histogram_upper = weighted_p_square_cumulative_distribution(acc_upper); +histogram_type histogram_lower = weighted_p_square_cumulative_distribution(acc_lower); + +// Note that applying importance sampling results in a region of the distribution +// to be estimated more accurately and another region to be estimated less accurately +// than without importance sampling, i.e., with unweighted samples + +for (std::size_t i = 0; i < histogram_upper.size(); ++i) +{ + // problem with small results: epsilon is relative (in percent), not absolute! + + // check upper region of distribution + if ( histogram_upper[i].second > 0.1 ) + BOOST_CHECK_CLOSE( 0.5 * (1.0 + erf( histogram_upper[i].first / sqrt(2.0) )), histogram_upper[i].second, epsilon ); + // check lower region of distribution + if ( histogram_lower[i].second < -0.1 ) + BOOST_CHECK_CLOSE( 0.5 * (1.0 + erf( histogram_lower[i].first / sqrt(2.0) )), histogram_lower[i].second, epsilon ); +} +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__p__square__cumul__dist_8hpp+++[+++weighted_p_square_cumulative_distribution_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.sum[`sum`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_p_square_quantile]] + +=== weighted_p_square_quantile _and variants_ + +Single quantile estimation with the `P^2` algorithm. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__p__square__quantile_8hpp+++[+++weighted_p_square_quantile_impl+++] + +Result Type:: ++ +++++ +
numeric::functional::fdiv<
+    numeric::functional::multiplies<sample-type, weight-type>::result_type
+  , std::size_t
+>::result_type
+
+++++ + +Depends On:: + `count` + + `sum_of_weights` + +Variants:: + `weighted_p_square_quantile_for_median` + +Initialization Parameters:: + `quantile_probability`, which defaults to `0.5`. (Note: for `weighted_p_square_quantile_for_median`, the `quantile_probability` parameter is ignored and is always `0.5`.) + +Accumulator Parameters:: + `weight` + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_p_square_quantile.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +typedef accumulator_set, double> accumulator_t; + +// tolerance in % +double epsilon = 1; + +// some random number generators +double mu4 = -1.0; +double mu5 = -1.0; +double mu6 = 1.0; +double mu7 = 1.0; +boost::lagged_fibonacci607 rng; +boost::normal_distribution<> mean_sigma4(mu4, 1); +boost::normal_distribution<> mean_sigma5(mu5, 1); +boost::normal_distribution<> mean_sigma6(mu6, 1); +boost::normal_distribution<> mean_sigma7(mu7, 1); +boost::variate_generator > normal4(rng, mean_sigma4); +boost::variate_generator > normal5(rng, mean_sigma5); +boost::variate_generator > normal6(rng, mean_sigma6); +boost::variate_generator > normal7(rng, mean_sigma7); + +accumulator_t acc0(quantile_probability = 0.001); +accumulator_t acc1(quantile_probability = 0.025); +accumulator_t acc2(quantile_probability = 0.975); +accumulator_t acc3(quantile_probability = 0.999); + +accumulator_t acc4(quantile_probability = 0.001); +accumulator_t acc5(quantile_probability = 0.025); +accumulator_t acc6(quantile_probability = 0.975); +accumulator_t acc7(quantile_probability = 0.999); + + +for (std::size_t i=0; i<100000; ++i) +{ + double sample = rng(); + acc0(sample, weight = 1.); + acc1(sample, weight = 1.); + acc2(sample, weight = 1.); + acc3(sample, weight = 1.); + + double sample4 = normal4(); + double sample5 = normal5(); + double sample6 = normal6(); + double sample7 = normal7(); + acc4(sample4, weight = std::exp(-mu4 * (sample4 - 0.5 * mu4))); + acc5(sample5, weight = std::exp(-mu5 * (sample5 - 0.5 * mu5))); + acc6(sample6, weight = std::exp(-mu6 * (sample6 - 0.5 * mu6))); + acc7(sample7, weight = std::exp(-mu7 * (sample7 - 0.5 * mu7))); +} + +// check for uniform distribution with weight = 1 +BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc0), 0.001, 15 ); +BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc1), 0.025, 5 ); +BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc2), 0.975, epsilon ); +BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc3), 0.999, epsilon ); + +// check for shifted standard normal distribution ("importance sampling") +BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc4), -3.090232, epsilon ); +BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc5), -1.959963, epsilon ); +BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc6), 1.959963, epsilon ); +BOOST_CHECK_CLOSE( weighted_p_square_quantile(acc7), 3.090232, epsilon ); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__p__square__quantile_8hpp+++[+++weighted_p_square_quantile_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.sum[`sum`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_peaks_over_threshold]] + +=== weighted_peaks_over_threshold _and variants_ + +Weighted peaks over threshold method for weighted quantile and weighted tail mean estimation. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__peaks__over__threshold_8hpp+++[+++weighted_peaks_over_threshold_impl+++] and xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__peaks__over__threshold_8hpp+++[+++weighted_peaks_over_threshold_prob_impl+++]. + +Both `tag::weighted_peaks_over_threshold` and `tag::weighted_peaks_over_threshold_prob` satisfy the `tag::weighted_peaks_over_threshold` feature and can be extracted using the `weighted_peaks_over_threshold()` extractor. + +Result Type:: ++ + `tuple` where `float_type` is +++++ +
numeric::functional::fdiv<
+    numeric::functional::multiplies<sample-type, weight-type>::result_type
+  , std::size_t
+>::result_type
+
+++++ + +Depends On:: + `weighted_peaks_over_threshold` depends on `sum_of_weights` + + `weighted_peaks_over_threshold_prob` depends on `sum_of_weights` and `tail_weights` + +Variants:: + `weighted_peaks_over_threshold_prob` + +Initialization Parameters:: + `tag::peaks_over_threshold::threshold_value` + + `tag::peaks_over_threshold_prob::threshold_probability` + + `tag::tail::cache_size` + +Accumulator Parameters:: + `weight` + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + TODO + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_peaks_over_threshold.hpp>
+
+++++ + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__peaks__over__threshold_8hpp+++[+++weighted_peaks_over_threshold_impl+++] +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__peaks__over__threshold_8hpp+++[+++weighted_peaks_over_threshold_prob_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.sum[`sum`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.tail[`tail`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_skewness]] + +=== weighted_skewness + +The skewness of a sample distribution is defined as the ratio of the 3rd central moment and the `3/2`-th power of the 2nd central moment (the variance) of the samples 3. The skewness estimator for weighted samples is formally identical to the estimator for unweighted samples, except that the weighted counterparts of all measures it depends on are to be taken. + +For implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__skewness_8hpp+++[+++weighted_skewness_impl+++]. + +Result Type:: ++ +++++ +
numeric::functional::fdiv<
+    numeric::functional::multiplies<sample-type, weight-type>::result_type
+  , numeric::functional::multiplies<sample-type, weight-type>::result_type
+>::result_type
+
+++++ + +Depends On:: + `weighted_mean` + + `weighted_moment<2>` + + `weighted_moment<3>` + +Variants:: + _none_ + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + `weight` + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_skewness.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set, int > acc2; + +acc2(2, weight = 4); +acc2(7, weight = 1); +acc2(4, weight = 3); +acc2(9, weight = 1); +acc2(3, weight = 2); + +BOOST_CHECK_EQUAL( weighted_mean(acc2), 42./11. ); +BOOST_CHECK_EQUAL( accumulators::weighted_moment<2>(acc2), 212./11. ); +BOOST_CHECK_EQUAL( accumulators::weighted_moment<3>(acc2), 1350./11. ); +BOOST_CHECK_CLOSE( weighted_skewness(acc2), 1.30708406282, 1e-6 ); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__skewness_8hpp+++[+++weighted_skewness_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_mean[`weighted_mean`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_moment[`weighted_moment`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_sum]] + +=== weighted_sum _and variants_ + +For summing the weighted samples or variates. All of the `tag::weighted_sum_of_variates<>` features can be extracted with the `weighted_sum_of_variates()` extractor. Variants that implement the Kahan summation algorithm are also provided. + +Result Type:: + `numeric::functional::multiplies::result_type` for summing weighted samples + + `numeric::functional::multiplies::result_type` for summing weighted variates + +Depends On:: + _none_ + +Variants:: + `tag::weighted_sum` + + `tag::weighted_sum_of_variates` + + `tag::weighted_sum_kahan` (a.k.a. tag::weighted_sum(kahan)) + + `tag::weighted_sum_of_variates_kahan` + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + `weight` + + `variate-tag` for summing variates + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1). Note that the Kahan sum performs four floating-point sum operations per accumulated value, whereas the naive sum performs only one. + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_sum.hpp>
+#include <boost/accumulators/statistics/weighted_sum_kahan.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +accumulator_set >, int> acc; + +acc(1, weight = 2, covariate1 = 3); +BOOST_CHECK_EQUAL(2, weighted_sum(acc)); +BOOST_CHECK_EQUAL(6, weighted_sum_of_variates(acc)); + +acc(2, weight = 3, covariate1 = 6); +BOOST_CHECK_EQUAL(8, weighted_sum(acc)); +BOOST_CHECK_EQUAL(24, weighted_sum_of_variates(acc)); + +acc(4, weight = 6, covariate1 = 9); +BOOST_CHECK_EQUAL(32, weighted_sum(acc)); +BOOST_CHECK_EQUAL(78, weighted_sum_of_variates(acc)); + +// demonstrate weighted Kahan summation +accumulator_set, float > acc; +BOOST_CHECK_EQUAL(0.0f, weighted_sum_kahan(acc)); +for (size_t i = 0; i < 1e6; ++i) { + acc(1.0f, weight = 1e-6f); +} +BOOST_CHECK_EQUAL(1.0f, weighted_sum_kahan(acc)); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__sum_8hpp+++[+++weighted_sum_impl+++] +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__sum_8hpp+++[+++weighted_sum_kahan_impl+++] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.non_coherent_weighted_tail_mean]] + +=== non_coherent_weighted_tail_mean + +Estimation of the (non-coherent) weighted tail mean based on order statistics (for both left and right tails). The left non-coherent weighted tail mean feature is `tag::non_coherent_weighted_tail_mean`, and the right non-choherent weighted tail mean feature is `tag::non_coherent_weighted_tail_mean`. They both share the `tag::abstract_non_coherent_tail_mean` feature with the unweighted non-coherent tail mean accumulators and can be extracted with either the `non_coherent_tail_mean()` or the `non_coherent_weighted_tail_mean()` extractors. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__tail__mean_8hpp+++[+++non_coherent_weighted_tail_mean_impl+++]. + +Result Type:: ++ +++++ +
numeric::functional::fdiv<
+    numeric::functional::multiplies<sample-type, weight-type>::result_type
+  , std::size_t
+>::result_type
+
+++++ + +Depends On:: + `sum_of_weights` + + `tail_weights` + +Variants:: + `abstract_non_coherent_tail_mean` + +Initialization Parameters:: + `tag::tail::cache_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + `quantile_probability` + +Accumulator Complexity:: + O(log N), where N is the cache size + +Extractor Complexity:: + O(N log N), where N is the cache size + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_tail_mean.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +// tolerance in % +double epsilon = 1; + +std::size_t n = 100000; // number of MC steps +std::size_t c = 25000; // cache size + +accumulator_set >, double > + acc0( right_tail_cache_size = c ); +accumulator_set >, double > + acc1( left_tail_cache_size = c ); + +// random number generators +boost::lagged_fibonacci607 rng; + +for (std::size_t i = 0; i < n; ++i) +{ + double smpl = std::sqrt(rng()); + acc0(smpl, weight = 1./smpl); +} + +for (std::size_t i = 0; i < n; ++i) +{ + double smpl = rng(); + acc1(smpl*smpl, weight = smpl); +} + +// check uniform distribution +BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc0, quantile_probability = 0.95), 0.975, epsilon ); +BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc0, quantile_probability = 0.975), 0.9875, epsilon ); +BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc0, quantile_probability = 0.99), 0.995, epsilon ); +BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc0, quantile_probability = 0.999), 0.9995, epsilon ); +BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc1, quantile_probability = 0.05), 0.025, epsilon ); +BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc1, quantile_probability = 0.025), 0.0125, epsilon ); +BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc1, quantile_probability = 0.01), 0.005, epsilon ); +BOOST_CHECK_CLOSE( non_coherent_weighted_tail_mean(acc1, quantile_probability = 0.001), 0.0005, 5*epsilon ); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__tail__mean_8hpp+++[+++non_coherent_weighted_tail_mean_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.sum[`sum`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.tail[`tail`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_tail_quantile]] + +=== weighted_tail_quantile + +Tail quantile estimation based on order statistics of weighted samples (for both left and right tails). The left weighted tail quantile feature is `tag::weighted_tail_quantile`, and the right weighted tail quantile feature is `tag::weighted_tail_quantile`. They both share the `tag::quantile` feature with the unweighted tail quantile accumulators and can be extracted with either the `quantile()` or the `weighted_tail_quantile()` extractors. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__tail__quantile_8hpp+++[+++weighted_tail_quantile_impl+++] + +Result Type:: ++ +++++ +
sample-type
+
+++++ + +Depends On:: + `sum_of_weights` + + `tail_weights` + +Variants:: + _none_ + +Initialization Parameters:: + `tag::tail::cache_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + `quantile_probability` + +Accumulator Complexity:: + O(log N), where N is the cache size + +Extractor Complexity:: + O(N log N), where N is the cache size + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_tail_quantile.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +// tolerance in % +double epsilon = 1; + +std::size_t n = 100000; // number of MC steps +std::size_t c = 20000; // cache size + +double mu1 = 1.0; +double mu2 = -1.0; +boost::lagged_fibonacci607 rng; +boost::normal_distribution<> mean_sigma1(mu1,1); +boost::normal_distribution<> mean_sigma2(mu2,1); +boost::variate_generator > normal1(rng, mean_sigma1); +boost::variate_generator > normal2(rng, mean_sigma2); + +accumulator_set >, double> + acc1(right_tail_cache_size = c); + +accumulator_set >, double> + acc2(left_tail_cache_size = c); + +for (std::size_t i = 0; i < n; ++i) +{ + double sample1 = normal1(); + double sample2 = normal2(); + acc1(sample1, weight = std::exp(-mu1 * (sample1 - 0.5 * mu1))); + acc2(sample2, weight = std::exp(-mu2 * (sample2 - 0.5 * mu2))); +} + +// check standard normal distribution +BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = 0.975), 1.959963, epsilon ); +BOOST_CHECK_CLOSE( quantile(acc1, quantile_probability = 0.999), 3.090232, epsilon ); +BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.025), -1.959963, epsilon ); +BOOST_CHECK_CLOSE( quantile(acc2, quantile_probability = 0.001), -3.090232, epsilon ); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__tail__quantile_8hpp+++[+++weighted_tail_quantile_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.sum[`sum`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.tail[`tail`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_tail_variate_means]] + +=== weighted_tail_variate_means _and variants_ + +Estimation of the absolute and relative weighted tail variate means (for both left and right tails) The absolute weighted tail variate means has the feature `tag::absolute_weighted_tail_variate_means` and the relative weighted tail variate mean has the feature `tag::relative_weighted_tail_variate_means`. All absolute weighted tail variate mean features share the `tag::abstract_absolute_tail_variate_means` feature with their unweighted variants and can be extracted with the `tail_variate_means()` and `weighted_tail_variate_means()` extractors. All the relative weighted tail variate mean features share the `tag::abstract_relative_tail_variate_means` feature with their unweighted variants and can be extracted with either the `relative_tail_variate_means()` or `relative_weighted_tail_variate_means()` extractors. + +For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__tail__variate__means_8hpp+++[+++weighted_tail_variate_means_impl+++] + +Result Type:: ++ +++++ +
boost::iterator_range<
+    numeric::functional::fdiv<
+        numeric::functional::multiplies<variate-type, weight-type>::result_type
+      , weight-type
+    >::result_type::iterator
+>
+
+++++ + +Depends On:: + `non_coherent_weighted_tail_mean` + + `tail_variate` + + `tail_weights` + +Variants:: + `tag::absolute_weighted_tail_variate_means` + + `tag::relative_weighted_tail_variate_means` + +Initialization Parameters:: + `tag::tail::cache_size` + +Accumulator Parameters:: + _none_ + +Extractor Parameters:: + `quantile_probability` + +Accumulator Complexity:: + O(log N), where N is the cache size + +Extractor Complexity:: + O(N log N), where N is the cache size + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_tail_variate_means.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +std::size_t c = 5; // cache size + +typedef double variate_type; +typedef std::vector variate_set_type; + +accumulator_set(relative)>, double > + acc1( right_tail_cache_size = c ); +accumulator_set(absolute)>, double > + acc2( right_tail_cache_size = c ); +accumulator_set(relative)>, double > + acc3( left_tail_cache_size = c ); +accumulator_set(absolute)>, double > + acc4( left_tail_cache_size = c ); + +variate_set_type cov1, cov2, cov3, cov4, cov5; +double c1[] = { 10., 20., 30., 40. }; // 100 +double c2[] = { 26., 4., 17., 3. }; // 50 +double c3[] = { 46., 64., 40., 50. }; // 200 +double c4[] = { 1., 3., 70., 6. }; // 80 +double c5[] = { 2., 2., 2., 14. }; // 20 +cov1.assign(c1, c1 + sizeof(c1)/sizeof(variate_type)); +cov2.assign(c2, c2 + sizeof(c2)/sizeof(variate_type)); +cov3.assign(c3, c3 + sizeof(c3)/sizeof(variate_type)); +cov4.assign(c4, c4 + sizeof(c4)/sizeof(variate_type)); +cov5.assign(c5, c5 + sizeof(c5)/sizeof(variate_type)); + +acc1(100., weight = 0.8, covariate1 = cov1); +acc1( 50., weight = 0.9, covariate1 = cov2); +acc1(200., weight = 1.0, covariate1 = cov3); +acc1( 80., weight = 1.1, covariate1 = cov4); +acc1( 20., weight = 1.2, covariate1 = cov5); + +acc2(100., weight = 0.8, covariate1 = cov1); +acc2( 50., weight = 0.9, covariate1 = cov2); +acc2(200., weight = 1.0, covariate1 = cov3); +acc2( 80., weight = 1.1, covariate1 = cov4); +acc2( 20., weight = 1.2, covariate1 = cov5); + +acc3(100., weight = 0.8, covariate1 = cov1); +acc3( 50., weight = 0.9, covariate1 = cov2); +acc3(200., weight = 1.0, covariate1 = cov3); +acc3( 80., weight = 1.1, covariate1 = cov4); +acc3( 20., weight = 1.2, covariate1 = cov5); + +acc4(100., weight = 0.8, covariate1 = cov1); +acc4( 50., weight = 0.9, covariate1 = cov2); +acc4(200., weight = 1.0, covariate1 = cov3); +acc4( 80., weight = 1.1, covariate1 = cov4); +acc4( 20., weight = 1.2, covariate1 = cov5); + +// check relative risk contributions +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.7).begin() ), (0.8*10 + 1.0*46)/(0.8*100 + 1.0*200) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 1), (0.8*20 + 1.0*64)/(0.8*100 + 1.0*200) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 2), (0.8*30 + 1.0*40)/(0.8*100 + 1.0*200) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.7).begin() + 3), (0.8*40 + 1.0*50)/(0.8*100 + 1.0*200) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.3).begin() ), (0.9*26 + 1.2*2)/(0.9*50 + 1.2*20) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 1), (0.9*4 + 1.2*2)/(0.9*50 + 1.2*20) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 2), (0.9*17 + 1.2*2)/(0.9*50 + 1.2*20) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.3).begin() + 3), (0.9*3 + 1.2*14)/(0.9*50 + 1.2*20) ); + +// check absolute risk contributions +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.7).begin() ), (0.8*10 + 1.0*46)/1.8 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.7).begin() + 1), (0.8*20 + 1.0*64)/1.8 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.7).begin() + 2), (0.8*30 + 1.0*40)/1.8 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.7).begin() + 3), (0.8*40 + 1.0*50)/1.8 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.3).begin() ), (0.9*26 + 1.2*2)/2.1 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.3).begin() + 1), (0.9*4 + 1.2*2)/2.1 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.3).begin() + 2), (0.9*17 + 1.2*2)/2.1 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.3).begin() + 3), (0.9*3 + 1.2*14)/2.1 ); + +// check relative risk contributions +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.9).begin() ), 1.0*46/(1.0*200) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 1), 1.0*64/(1.0*200) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 2), 1.0*40/(1.0*200) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc1, quantile_probability = 0.9).begin() + 3), 1.0*50/(1.0*200) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.1).begin() ), 1.2*2/(1.2*20) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 1), 1.2*2/(1.2*20) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 2), 1.2*2/(1.2*20) ); +BOOST_CHECK_EQUAL( *(relative_weighted_tail_variate_means(acc3, quantile_probability = 0.1).begin() + 3), 1.2*14/(1.2*20) ); + +// check absolute risk contributions +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.9).begin() ), 1.0*46/1.0 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.9).begin() + 1), 1.0*64/1.0 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.9).begin() + 2), 1.0*40/1.0 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc2, quantile_probability = 0.9).begin() + 3), 1.0*50/1.0 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.1).begin() ), 1.2*2/1.2 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.1).begin() + 1), 1.2*2/1.2 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.1).begin() + 2), 1.2*2/1.2 ); +BOOST_CHECK_EQUAL( *(weighted_tail_variate_means(acc4, quantile_probability = 0.1).begin() + 3), 1.2*14/1.2 ); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__tail__variate__means_8hpp+++[+++weighted_tail_variate_means_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.non_coherent_weighted_tail_mean[`non_coherent_weighted_tail_mean`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.tail_variate[`tail_variate`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.tail[`tail`] + +[[accumulators.user_s_guide.the_statistical_accumulators_library.weighted_variance]] + +=== weighted_variance _and variants_ + +Lazy or iterative calculation of the weighted variance. The lazy calculation is associated with the `tag::lazy_weighted_variance` feature, and the iterative calculation with the `tag::weighted_variance` feature. Both can be extracted using the `tag::weighted_variance()` extractor. For more implementation details, see xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__variance_8hpp+++[+++lazy_weighted_variance_impl+++] and xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__variance_8hpp+++[+++weighted_variance_impl+++] + +Result Type:: ++ +++++ +
numeric::functional::fdiv<
+    numeric::functional::multiplies<sample-type, weight-type>::result_type
+  , std::size_t
+>::result_type
+
+++++ + +Depends On:: + `tag::lazy_weighted_variance` depends on `tag::weighted_moment<2>` and `tag::weighted_mean` + + `tag::weighted_variance` depends on `tag::count` and `tag::immediate_weighted_mean` + +Variants:: + `tag::lazy_weighted_variance` (a.k.a. `tag::weighted_variance(lazy))` + + `tag::weighted_variance` (a.k.a. `tag::weighted_variance(immediate)`) + +Initialization Parameters:: + _none_ + +Accumulator Parameters:: + `weight` + +Extractor Parameters:: + _none_ + +Accumulator Complexity:: + O(1) + +Extractor Complexity:: + O(1) + +*Header* + +++++ +
#include <boost/accumulators/statistics/weighted_variance.hpp>
+
+++++ + + +*Example* + +[source,text] +---- +// lazy weighted_variance +accumulator_set, int> acc1; + +acc1(1, weight = 2); // 2 +acc1(2, weight = 3); // 6 +acc1(3, weight = 1); // 3 +acc1(4, weight = 4); // 16 +acc1(5, weight = 1); // 5 + +// weighted_mean = (2+6+3+16+5) / (2+3+1+4+1) = 32 / 11 = 2.9090909090909090909090909090909 + +BOOST_CHECK_EQUAL(5u, count(acc1)); +BOOST_CHECK_CLOSE(2.9090909, weighted_mean(acc1), 1e-5); +BOOST_CHECK_CLOSE(10.1818182, accumulators::weighted_moment<2>(acc1), 1e-5); +BOOST_CHECK_CLOSE(1.7190083, weighted_variance(acc1), 1e-5); + +// immediate weighted_variance +accumulator_set, int> acc2; + +acc2(1, weight = 2); +acc2(2, weight = 3); +acc2(3, weight = 1); +acc2(4, weight = 4); +acc2(5, weight = 1); + +BOOST_CHECK_EQUAL(5u, count(acc2)); +BOOST_CHECK_CLOSE(2.9090909, weighted_mean(acc2), 1e-5); +BOOST_CHECK_CLOSE(1.7190083, weighted_variance(acc2), 1e-5); + +// check lazy and immediate variance with random numbers + +// two random number generators +boost::lagged_fibonacci607 rng; +boost::normal_distribution<> mean_sigma(0,1); +boost::variate_generator > normal(rng, mean_sigma); + +accumulator_set, double > acc_lazy; +accumulator_set, double > acc_immediate; + +for (std::size_t i=0; i<10000; ++i) +{ + double value = normal(); + acc_lazy(value, weight = rng()); + acc_immediate(value, weight = rng()); +} + +BOOST_CHECK_CLOSE(1., weighted_variance(acc_lazy), 1.); +BOOST_CHECK_CLOSE(1., weighted_variance(acc_immediate), 1.); +---- + + +*See also* + +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__variance_8hpp+++[+++lazy_weighted_variance_impl+++] +* xref:reference.adoc#+++doxygen.statistics_library_reference.weighted__variance_8hpp+++[+++weighted_variance_impl+++] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.count[`count`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_mean[`weighted_mean`] +* xref:user_s_guide.adoc#accumulators.user_s_guide.the_statistical_accumulators_library.weighted_moment[`weighted_moment`] diff --git a/doc/mrdocs-db/CMakeLists.txt b/doc/mrdocs-db/CMakeLists.txt new file mode 100644 index 00000000..e310373d --- /dev/null +++ b/doc/mrdocs-db/CMakeLists.txt @@ -0,0 +1,51 @@ +# Minimal CMake project used only by MrDocs (see ../mrdocs.yml compilation-database). +# Produces a compile_commands.json with a single TU (mrdocs.cpp) so MrDocs does not +# traverse the entire Boost superproject (e.g. Boost.Atomic SSE sources that break +# libclang with GCC 13 intrinsics headers). +# +# BOOST_SRC_DIR must point at the Boost repository root (Antora sets BOOST_SRC_DIR). + +cmake_minimum_required(VERSION 3.8...3.20) +project(boost_accumulators_mrdocs_db LANGUAGES CXX) + +if(NOT DEFINED BOOST_SRC_DIR OR "${BOOST_SRC_DIR}" STREQUAL "") + if(DEFINED ENV{BOOST_SRC_DIR} AND NOT "$ENV{BOOST_SRC_DIR}" STREQUAL "") + file(TO_CMAKE_PATH "$ENV{BOOST_SRC_DIR}" BOOST_SRC_DIR) + else() + get_filename_component(BOOST_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../.." ABSOLUTE) + endif() +endif() +if(NOT EXISTS "${BOOST_SRC_DIR}/CMakeLists.txt") + message(FATAL_ERROR "BOOST_SRC_DIR must be the Boost repo root; got: ${BOOST_SRC_DIR}") +endif() + +# Direct deps match libs/accumulators/CMakeLists.txt plus headers pulled in by +# Boost.Parameter (see libs/parameter/CMakeLists.txt: function, mp11, optional, utility). +set(_acc_deps + array assert circular_buffer concept_check config core fusion function iterator mpl + mp11 numeric_conversion numeric_ublas optional parameter preprocessor range + serialization throw_exception tuple type_traits typeof utility +) + +add_library(boost_accumulators_mrdocs_iface INTERFACE) +target_include_directories(boost_accumulators_mrdocs_iface INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/../../include" +) +foreach(_dep ${_acc_deps}) + set(_lib "${_dep}") + if(_dep STREQUAL "numeric_conversion") + set(_lib "numeric/conversion") + elseif(_dep STREQUAL "numeric_ublas") + set(_lib "numeric/ublas") + endif() + set(_inc "${BOOST_SRC_DIR}/libs/${_lib}/include") + if(NOT EXISTS "${_inc}") + message(FATAL_ERROR "Expected include dir missing for ${_dep}: ${_inc}") + endif() + target_include_directories(boost_accumulators_mrdocs_iface INTERFACE "${_inc}") +endforeach() + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/mrdocs.cpp" "#include \n") +add_executable(boost_accumulators_mrdocs "${CMAKE_CURRENT_BINARY_DIR}/mrdocs.cpp") +target_link_libraries(boost_accumulators_mrdocs PRIVATE boost_accumulators_mrdocs_iface) +target_compile_features(boost_accumulators_mrdocs PRIVATE cxx_std_17) diff --git a/doc/package-lock.json b/doc/package-lock.json new file mode 100644 index 00000000..1745c2f2 --- /dev/null +++ b/doc/package-lock.json @@ -0,0 +1,6024 @@ +{ + "name": "doc", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@antora/expand-path-helper": "^3.0.0", + "@antora/lunr-extension": "^1.0.0-alpha.12", + "@asciidoctor/tabs": "^1.0.0-beta.6", + "@cppalliance/antora-cpp-reference-extension": "^0.1.0", + "@cppalliance/antora-cpp-tagfiles-extension": "^0.1.0", + "@cppalliance/antora-downloads-extension": "^0.0.2", + "@cppalliance/asciidoctor-boost-links": "^0.0.2", + "@mermaid-js/mermaid-cli": "^10.5.1", + "gulp-cli": "^2.3.0" + }, + "devDependencies": { + "@antora/cli": "3.1.14", + "@antora/site-generator": "3.1.14", + "antora": "3.1.14" + } + }, + "node_modules/@antora/asciidoc-loader": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.14.tgz", + "integrity": "sha512-4xxisnoBFrlLNY6f3xZtyyfgm+tBLsqesTcEStfc8jtXUMYJ4b2DWIzo1vULmxvZ7yY5+Q7YqEvS5o6kIWAG0A==", + "dev": true, + "dependencies": { + "@antora/logger": "3.1.14", + "@antora/user-require-helper": "~3.0", + "@asciidoctor/core": "~2.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/cli": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.14.tgz", + "integrity": "sha512-I6WcygMU2bFInjdURJjkYjo7K5M8B3lBB53v9OO0IcY0LhEY8Wa7IlZ7wVinf5qEjHvaYzRGTZVl6RsJtVt7Sw==", + "dev": true, + "dependencies": { + "@antora/logger": "3.1.14", + "@antora/playbook-builder": "3.1.14", + "@antora/user-require-helper": "~3.0", + "commander": "~11.1" + }, + "bin": { + "antora": "bin/antora" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/content-aggregator": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.14.tgz", + "integrity": "sha512-FVuBgnrGPiktYqK1WHbGF8O8l4m5KHlkxoJumrbacgFo8SKuiRFEo31zalxrCUsv8QM3UBEgX+LdHrve/9CGLg==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~3.0", + "@antora/logger": "3.1.14", + "@antora/user-require-helper": "~3.0", + "braces": "~3.0", + "cache-directory": "~2.0", + "fast-glob": "~3.3", + "hpagent": "~1.2", + "isomorphic-git": "~1.25", + "js-yaml": "~4.1", + "multi-progress": "~4.0", + "picomatch": "~4.0", + "progress": "~2.0", + "should-proxy": "~1.0", + "simple-get": "~4.0", + "vinyl": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/content-classifier": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.14.tgz", + "integrity": "sha512-y8Fk+KU1lqD3aawOu3ZFK92YfOZ1k3YBJhLI9QIFM6Ck4STPnf7AwYbhfOtjODlwer5/OhFmfhjUB2hn7onGnA==", + "dev": true, + "dependencies": { + "@antora/asciidoc-loader": "3.1.14", + "@antora/logger": "3.1.14", + "mime-types": "~2.1", + "vinyl": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/document-converter": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.14.tgz", + "integrity": "sha512-f6wFnL+489DI0ZDgoxYWzbxxWqPviRiJ56OHS1NixEfvJ7OpRBDPEbX1xnsIeiyFBgqX4+nY92MsCWKTa+Gf3w==", + "dev": true, + "dependencies": { + "@antora/asciidoc-loader": "3.1.14" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/expand-path-helper": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@antora/expand-path-helper/-/expand-path-helper-3.0.0.tgz", + "integrity": "sha512-7PdEIhk97v85/CSm3HynCsX14TR6oIVz1s233nNLsiWubE8tTnpPt4sNRJR+hpmIZ6Bx9c6QDp3XIoiyu/WYYA==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/file-publisher": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.14.tgz", + "integrity": "sha512-fTaAnkyKSOlsxQM1TBFCAmiERA6Q67XleDCD2bMPVgfcENmo0Xfx59KwCHaA92IcRSmMftydlXHPaFxNh0UVsg==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~3.0", + "@antora/user-require-helper": "~3.0", + "vinyl": "~3.0", + "yazl": "~2.5" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/logger": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.14.tgz", + "integrity": "sha512-kVEeGqZbXR903hPIm+BlN97fLdQ3LoUzE/BOPZ6vRp9m9Mmbnm67Kg7fSYkfTMLB0S2UWpAPFg22RdsU5ZoAzA==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~3.0", + "pino": "~9.2", + "pino-pretty": "~11.2", + "sonic-boom": "~4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/lunr-extension": { + "version": "1.0.0-alpha.13", + "resolved": "https://registry.npmjs.org/@antora/lunr-extension/-/lunr-extension-1.0.0-alpha.13.tgz", + "integrity": "sha512-u8n8XLB6elMmXbW0bdeL5jG8UBJi6PSiz1zaMn+wIIIu/bnxotRBW4kEWSge+zTfdF4rEYMcJ9LvkAOamMyuKQ==", + "dependencies": { + "htmlparser2": "~9.1", + "lunr": "~2.3", + "lunr-languages": "~1.10" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/navigation-builder": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.14.tgz", + "integrity": "sha512-/637YLGD7oUHGSfEfszXkk4ASfIhDAg5Xs9035J1dV07XYRlGqmtUb15rtapbcECpcQFjCyM5jFQYSNNvLrGcQ==", + "dev": true, + "dependencies": { + "@antora/asciidoc-loader": "3.1.14" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/page-composer": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.14.tgz", + "integrity": "sha512-RfA+67TxCqUPrQbZdrfjgLpHh8MR2z2du7cyF3HGX4N6DpqEBvz81NHHl3rA3fj6BQZPQbGm2OYAMU6wzJ6Pog==", + "dev": true, + "dependencies": { + "@antora/logger": "3.1.14", + "handlebars": "~4.7", + "require-from-string": "~2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/playbook-builder": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.14.tgz", + "integrity": "sha512-Ss2r7In00u/n9Da+JOxEqIE8NeRosf+f+agzH3Te09JV/mpgZKxEOE5V/VuP+TNNq4ww1eu5aOS8DiU2PYwj4Q==", + "dev": true, + "dependencies": { + "@iarna/toml": "~2.2", + "convict": "~6.2", + "js-yaml": "~4.1", + "json5": "~2.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/redirect-producer": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.14.tgz", + "integrity": "sha512-5koAwRk1cZrvE/qfOWKXqb3jtxrZbWA5EYHYGFEoato5By3cbC42blH4Bre9/48pjyS6znFpbZhYUBpT7PRhZA==", + "dev": true, + "dependencies": { + "vinyl": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/site-generator": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.14.tgz", + "integrity": "sha512-hQIUVtM9+xwleYWc4fIRZmiKl2p+ItOJuUm2+Hkdh07BZsySxkMOxxCyZsvTn9rc+4R94CYqDQCYElwFwdB2WA==", + "dev": true, + "dependencies": { + "@antora/asciidoc-loader": "3.1.14", + "@antora/content-aggregator": "3.1.14", + "@antora/content-classifier": "3.1.14", + "@antora/document-converter": "3.1.14", + "@antora/file-publisher": "3.1.14", + "@antora/logger": "3.1.14", + "@antora/navigation-builder": "3.1.14", + "@antora/page-composer": "3.1.14", + "@antora/playbook-builder": "3.1.14", + "@antora/redirect-producer": "3.1.14", + "@antora/site-mapper": "3.1.14", + "@antora/site-publisher": "3.1.14", + "@antora/ui-loader": "3.1.14", + "@antora/user-require-helper": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/site-mapper": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.14.tgz", + "integrity": "sha512-3qbETtwadl+fWREjzrBUxPUorMcMiZ+hdkB1El9z7it9KzKh0Yp7Je0+2uTxGX+Lov9uik48dZJ9e/mr5PeaRQ==", + "dev": true, + "dependencies": { + "@antora/content-classifier": "3.1.14", + "vinyl": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/site-publisher": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.14.tgz", + "integrity": "sha512-8apyEmgepUc7ms9CTEIPwN3tGtWwLqR6fbLMLs7hibqmOSR880Ut/4GRGb97sqcGQXSHdIyWK2oJKzRl1Akb6Q==", + "dev": true, + "dependencies": { + "@antora/file-publisher": "3.1.14" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/ui-loader": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.14.tgz", + "integrity": "sha512-LVvTdKQOB44CmJ1JQDu8sJf6rrLZMxPAWWackdg2JtGyGHHpd80/MBcv4BSFk7//cJQ13Oqm/7JCbhD51KAFjg==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~3.0", + "braces": "~3.0", + "cache-directory": "~2.0", + "fast-glob": "~3.3", + "hpagent": "~1.2", + "js-yaml": "~4.1", + "picomatch": "~4.0", + "should-proxy": "~1.0", + "simple-get": "~4.0", + "vinyl": "~3.0", + "yauzl": "~3.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@antora/user-require-helper": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@antora/user-require-helper/-/user-require-helper-3.0.0.tgz", + "integrity": "sha512-KIXb8WYhnrnwH7Jj21l1w+et9k5GvcgcqvLOwxqWLEd0uVZOiMFdqFjqbVm3M+zcrs1JXWMeh2LLvxBbQs3q/Q==", + "dev": true, + "dependencies": { + "@antora/expand-path-helper": "~3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@asciidoctor/core": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-2.2.8.tgz", + "integrity": "sha512-oozXk7ZO1RAd/KLFLkKOhqTcG4GO3CV44WwOFg2gMcCsqCUTarvMT7xERIoWW2WurKbB0/ce+98r01p8xPOlBw==", + "dev": true, + "dependencies": { + "asciidoctor-opal-runtime": "0.3.3", + "unxhr": "1.0.1" + }, + "engines": { + "node": ">=8.11", + "npm": ">=5.0.0", + "yarn": ">=1.1.0" + } + }, + "node_modules/@asciidoctor/tabs": { + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@asciidoctor/tabs/-/tabs-1.0.0-beta.6.tgz", + "integrity": "sha512-gGZnW7UfRXnbiyKNd9PpGKtSuD8+DsqaaTSbQ1dHVkZ76NaolLhdQg8RW6/xqN3pX1vWZEcF4e81+Oe9rNRWxg==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cppalliance/antora-cpp-reference-extension": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@cppalliance/antora-cpp-reference-extension/-/antora-cpp-reference-extension-0.1.0.tgz", + "integrity": "sha512-3VD/gAFebR06GiBWAy2PgEHNqyRNrvAE0FfFvotLvA0RQmHn0q+ct+j0z53N64yxuvJVj8Hl0bRRPdhh2BGjXg==", + "dependencies": { + "@antora/expand-path-helper": "^3.0.0", + "axios": "^1.13.2", + "cache-directory": "^2.0.0", + "fast-glob": "^3.3.3", + "isomorphic-git": "^1.35.0", + "js-yaml": "^4.1.0", + "semver": "^7.7.3" + } + }, + "node_modules/@cppalliance/antora-cpp-reference-extension/node_modules/isomorphic-git": { + "version": "1.37.6", + "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.37.6.tgz", + "integrity": "sha512-qr1NFCPsVTZ6YGqTXw0CzamnsHyH9QQ1OTEfeXIweSljRUMzuHFCJdUn0wc6OcjtTDns6knxjPb7N6LmJeftOA==", + "dependencies": { + "async-lock": "^1.4.1", + "clean-git-ref": "^2.0.1", + "crc-32": "^1.2.0", + "diff3": "0.0.3", + "ignore": "^5.1.4", + "minimisted": "^2.0.0", + "pako": "^1.0.10", + "pify": "^4.0.1", + "readable-stream": "^4.0.0", + "sha.js": "^2.4.12", + "simple-get": "^4.0.1" + }, + "bin": { + "isogit": "cli.cjs" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@cppalliance/antora-cpp-reference-extension/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@cppalliance/antora-cpp-tagfiles-extension": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@cppalliance/antora-cpp-tagfiles-extension/-/antora-cpp-tagfiles-extension-0.1.0.tgz", + "integrity": "sha512-YKCRpqv8srMhqwlUcY3704H6U5DHzQ8Q73JVUv1TF+MsGdUP60DDNR6v8+Xj6PLe93K/MAo6ZUgtJ+RN40YoZQ==", + "dependencies": { + "@antora/expand-path-helper": "^3.0.0", + "cache-directory": "^2.0.0", + "fast-xml-parser": "^5.3.1", + "he": "^1.2.0", + "isomorphic-git": "^1.35.0" + } + }, + "node_modules/@cppalliance/antora-cpp-tagfiles-extension/node_modules/isomorphic-git": { + "version": "1.37.6", + "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.37.6.tgz", + "integrity": "sha512-qr1NFCPsVTZ6YGqTXw0CzamnsHyH9QQ1OTEfeXIweSljRUMzuHFCJdUn0wc6OcjtTDns6knxjPb7N6LmJeftOA==", + "dependencies": { + "async-lock": "^1.4.1", + "clean-git-ref": "^2.0.1", + "crc-32": "^1.2.0", + "diff3": "0.0.3", + "ignore": "^5.1.4", + "minimisted": "^2.0.0", + "pako": "^1.0.10", + "pify": "^4.0.1", + "readable-stream": "^4.0.0", + "sha.js": "^2.4.12", + "simple-get": "^4.0.1" + }, + "bin": { + "isogit": "cli.cjs" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@cppalliance/antora-cpp-tagfiles-extension/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@cppalliance/antora-downloads-extension": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@cppalliance/antora-downloads-extension/-/antora-downloads-extension-0.0.2.tgz", + "integrity": "sha512-2wXahlvRz9J75ZSfzDeP4XpIZiqIm+w/YjmCWJxFPp6oWgP7e8f6ps7HqdtHNGxnK5mG38OjiCFdHjmHYfgbDA==" + }, + "node_modules/@cppalliance/asciidoctor-boost-links": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@cppalliance/asciidoctor-boost-links/-/asciidoctor-boost-links-0.0.2.tgz", + "integrity": "sha512-9Lg1s955QeBO/xosbJbd+P4qJo1CkC0MvkiAIDZoqf10g8KQpMNy88NBAWji5YcNwXcrr8KP83GEweKMNDBMsw==" + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, + "node_modules/@mermaid-js/mermaid-cli": { + "version": "10.5.1", + "resolved": "https://registry.npmjs.org/@mermaid-js/mermaid-cli/-/mermaid-cli-10.5.1.tgz", + "integrity": "sha512-2Hoft3YhwIJrqK1YLg26/U676lf/9SqBrVNNbNRw6LnT85on2K1+GI2qsEm10UmBJDPouoBuXCdAfpi9O3BCQg==", + "license": "MIT", + "dependencies": { + "chalk": "^5.0.1", + "commander": "^10.0.0", + "puppeteer": "^19.0.0" + }, + "bin": { + "mmdc": "src/cli.js" + }, + "engines": { + "node": "^14.13 || >=16.0" + } + }, + "node_modules/@mermaid-js/mermaid-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@nodable/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ] + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-0.5.0.tgz", + "integrity": "sha512-Uw6oB7VvmPRLE4iKsjuOh8zgDabhNX67dzo8U/BB0f9527qx+4eeUs+korU98OhG5C4ubg7ufBgVi63XYwS6TQ==", + "license": "Apache-2.0", + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.1" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=14.1.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@puppeteer/browsers/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@puppeteer/browsers/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@puppeteer/browsers/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/@puppeteer/browsers/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/@puppeteer/browsers/node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/@puppeteer/browsers/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@puppeteer/browsers/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/@puppeteer/browsers/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@puppeteer/browsers/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/node": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.7.0.tgz", + "integrity": "sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~7.21.0" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "license": "MIT", + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "license": "MIT", + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/antora": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/antora/-/antora-3.1.14.tgz", + "integrity": "sha512-z8HshJsT6pUfdDOUJ15RGtpOM9LmL6JXU5JBshoR/9/xd+1qLmKPkOnUv+HrijAk93r1imxZOdkmIqhLcv8B8A==", + "dev": true, + "dependencies": { + "@antora/cli": "3.1.14", + "@antora/site-generator": "3.1.14" + }, + "bin": { + "antora": "bin/antora" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "license": "MIT", + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asciidoctor-opal-runtime": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/asciidoctor-opal-runtime/-/asciidoctor-opal-runtime-0.3.3.tgz", + "integrity": "sha512-/CEVNiOia8E5BMO9FLooo+Kv18K4+4JBFRJp8vUy/N5dMRAg+fRNV4HA+o6aoSC79jVU/aT5XvUpxSxSsTS8FQ==", + "dev": true, + "dependencies": { + "glob": "7.1.3", + "unxhr": "1.0.1" + }, + "engines": { + "node": ">=8.11" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.2.tgz", + "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "dev": true, + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "dev": true, + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "license": "MIT", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "license": "MIT", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-directory": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cache-directory/-/cache-directory-2.0.0.tgz", + "integrity": "sha512-7YKEapH+2Uikde8hySyfobXBqPKULDyHNl/lhKm7cKf/GJFdG/tU/WpLrOg2y9aUrQrWUilYqawFIiGJPS6gDA==", + "dependencies": { + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/chromium-bidi": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.7.tgz", + "integrity": "sha512-6+mJuFXwTMU6I3vYLs6IL8A1DyQTPjCfIL971X0aMPVGRbGnNfl6i6Cl0NMbxi2bRYLGESt9T2ZIMRM5PAEcIQ==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "3.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.8.tgz", + "integrity": "sha512-SceYGWXvdqlWa/OnQ5FQuV+NxvNmMRhMw/w9AHkH71hTzveND4BTYgvp16g+oITK47qbOl/3D0bl0iygehWAWQ==", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/clean-git-ref": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", + "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==" + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "license": "MIT", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/convict": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.2.5.tgz", + "integrity": "sha512-JtXpxqDqJ8P0UwEHwhxLzCIXQy97vlYBZR222Sbzb1q1Erex9ASrztJ29SyhWFQjod1AeFBaPzEEC8YvtZMIYg==", + "dev": true, + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "yargs-parser": "^20.2.7" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "license": "MIT", + "dependencies": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cosmiconfig/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "license": "MIT", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "license": "MIT", + "dependencies": { + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1107588", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz", + "integrity": "sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg==", + "license": "BSD-3-Clause" + }, + "node_modules/diff3": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", + "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "node_modules/each-props/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "license": "MIT", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.8.tgz", + "integrity": "sha512-SceYGWXvdqlWa/OnQ5FQuV+NxvNmMRhMw/w9AHkH71hTzveND4BTYgvp16g+oITK47qbOl/3D0bl0iygehWAWQ==", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "license": "MIT", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/extract-zip/node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "license": "MIT", + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fast-copy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/fast-xml-builder": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.5.tgz", + "integrity": "sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "path-expression-matcher": "^1.1.3" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz", + "integrity": "sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.5", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "license": "MIT", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/findup-sync/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fined/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "license": "MIT", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "license": "MIT", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "license": "ISC" + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "license": "MIT", + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "license": "MIT", + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", + "license": "MIT", + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "license": "MIT", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "dev": true + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "license": "ISC" + }, + "node_modules/hpagent": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.2.tgz", + "integrity": "sha512-AIbwAcazqP3R65dGvqk1V+a+vE5Fg1yu/ZKMOiBWSUIXXiwQkYmXQcVa2O0nh0tSDKDFKxG2mY7dB1Sr4hEP1g==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.4.tgz", + "integrity": "sha512-bv5z95W0dDtLfKwDfkTNxaRxmISBD3eQBKJeVxv2AQ7MjuUnDNG7cIQqvFtMOUYhsILWHhMayWdoGqNqYYYjww==", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.2", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "license": "MIT" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic-git": { + "version": "1.25.10", + "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.25.10.tgz", + "integrity": "sha512-IxGiaKBwAdcgBXwIcxJU6rHLk+NrzYaaPKXXQffcA0GW3IUrQXdUPDXDo+hkGVcYruuz/7JlGBiuaeTCgIgivQ==", + "dev": true, + "dependencies": { + "async-lock": "^1.4.1", + "clean-git-ref": "^2.0.1", + "crc-32": "^1.2.0", + "diff3": "0.0.3", + "ignore": "^5.1.4", + "minimisted": "^2.0.0", + "pako": "^1.0.10", + "pify": "^4.0.1", + "readable-stream": "^3.4.0", + "sha.js": "^2.4.9", + "simple-get": "^4.0.1" + }, + "bin": { + "isogit": "cli.cjs" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "license": "MIT", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "license": "MIT", + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/liftoff/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" + }, + "node_modules/lunr-languages": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.10.0.tgz", + "integrity": "sha512-BBjKKcwrieJlzwwc9M5H/MRXGJ2qyOSDx/NXYiwkuKjiLOOoouh0WsDzeqcLoUWcX31y7i8sb8IgsZKObdUCkw==" + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/make-iterator/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "license": "MIT", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==", + "license": "MIT", + "dependencies": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/matchdep/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimisted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", + "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", + "dependencies": { + "minimist": "^1.2.5" + } + }, + "node_modules/mitt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", + "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", + "license": "MIT" + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "license": "MIT", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/multi-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multi-progress/-/multi-progress-4.0.0.tgz", + "integrity": "sha512-9zcjyOou3FFCKPXsmkbC3ethv51SFPoA4dJD6TscIp2pUmy26kBDZW6h9XofPELrzseSkuD7r0V+emGEeo39Pg==", + "dev": true, + "peerDependencies": { + "progress": "^2.0.0" + } + }, + "node_modules/mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "license": "MIT", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.8.tgz", + "integrity": "sha512-SceYGWXvdqlWa/OnQ5FQuV+NxvNmMRhMw/w9AHkH71hTzveND4BTYgvp16g+oITK47qbOl/3D0bl0iygehWAWQ==", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "license": "MIT", + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "license": "MIT", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "license": "MIT", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "license": "MIT", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "license": "MIT", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pino": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.2.0.tgz", + "integrity": "sha512-g3/hpwfujK5a4oVbaefoJxezLzsDgLcNJeITvC6yrfwYeT9la+edCK42j5QpEQSQCZgTKapXvnQIdgZwvRaZug==", + "dev": true, + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "dev": true, + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.2.2.tgz", + "integrity": "sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==", + "dev": true, + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.2", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-pretty/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "dev": true + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/puppeteer": { + "version": "19.11.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.11.1.tgz", + "integrity": "sha512-39olGaX2djYUdhaQQHDZ0T0GwEp+5f9UB9HmEP0qHfdQHIq0xGQZuAZ5TLnJIc/88SrPLpEflPC+xUqOTv3c5g==", + "deprecated": "< 24.15.0 is no longer supported", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "0.5.0", + "cosmiconfig": "8.1.3", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "puppeteer-core": "19.11.1" + } + }, + "node_modules/puppeteer-core": { + "version": "19.11.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.11.1.tgz", + "integrity": "sha512-qcuC2Uf0Fwdj9wNtaTZ2OvYRraXpAK+puwwVW8ofOhOgLPZyz1c68tsorfIZyCUOpyBisjr+xByu7BMbEYMepA==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "0.5.0", + "chromium-bidi": "0.4.7", + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1107588", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "proxy-from-env": "1.1.0", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.13.0" + }, + "engines": { + "node": ">=14.14.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/puppeteer-core/node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/puppeteer/node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "license": "MIT", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "license": "MIT", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==", + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "license": "ISC" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "license": "MIT" + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "dev": true + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==", + "license": "MIT", + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/should-proxy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/should-proxy/-/should-proxy-1.0.4.tgz", + "integrity": "sha512-RPQhIndEIVUCjkfkQ6rs6sOR6pkxJWCNdxtfG5pP0RVgUYbK5911kLTF0TNcCC0G3YCGd492rMollFT2aTd9iQ==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "license": "MIT", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "license": "MIT", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "license": "MIT", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.8.tgz", + "integrity": "sha512-SceYGWXvdqlWa/OnQ5FQuV+NxvNmMRhMw/w9AHkH71hTzveND4BTYgvp16g+oITK47qbOl/3D0bl0iygehWAWQ==", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dev": true, + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "license": "MIT", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "license": "MIT" + }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "license": "CC0-1.0" + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "license": "MIT", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.8.tgz", + "integrity": "sha512-SceYGWXvdqlWa/OnQ5FQuV+NxvNmMRhMw/w9AHkH71hTzveND4BTYgvp16g+oITK47qbOl/3D0bl0iygehWAWQ==", + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "dev": true, + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "license": "MIT", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "license": "MIT", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz", + "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ] + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==", + "license": "MIT", + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "dev": true, + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "license": "MIT", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undici-types": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.21.0.tgz", + "integrity": "sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==", + "license": "MIT", + "optional": true + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "license": "MIT", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "license": "MIT", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/unxhr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unxhr/-/unxhr-1.0.1.tgz", + "integrity": "sha512-MAhukhVHyaLGDjyDYhy8gVjWJyhTECCdNsLwlMoGFoNJ3o79fpQhtQuzmAE4IxCMDwraF4cW8ZjpAV0m9CRQbg==", + "dev": true, + "engines": { + "node": ">=8.11" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "license": "MIT" + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vinyl": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.1.tgz", + "integrity": "sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==", + "dev": true, + "dependencies": { + "clone": "^2.1.2", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "license": "MIT", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "license": "MIT", + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "license": "ISC", + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "node_modules/yauzl": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.1.3.tgz", + "integrity": "sha512-JCCdmlJJWv7L0q/KylOekyRaUrdEoUxWkWVcgorosTROCFWiS9p2NNPE9Yb91ak7b1N5SxAZEliWpspbZccivw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3" + } + } + } +} diff --git a/doc/package.json b/doc/package.json new file mode 100644 index 00000000..94f68e80 --- /dev/null +++ b/doc/package.json @@ -0,0 +1,18 @@ +{ + "devDependencies": { + "@antora/cli": "3.1.14", + "@antora/site-generator": "3.1.14", + "antora": "3.1.14" + }, + "dependencies": { + "@antora/expand-path-helper": "^3.0.0", + "@antora/lunr-extension": "^1.0.0-alpha.12", + "@asciidoctor/tabs": "^1.0.0-beta.6", + "@cppalliance/antora-cpp-reference-extension": "^0.1.0", + "@cppalliance/antora-cpp-tagfiles-extension": "^0.1.0", + "@cppalliance/antora-downloads-extension": "^0.0.2", + "@cppalliance/asciidoctor-boost-links": "^0.0.2", + "@mermaid-js/mermaid-cli": "^10.5.1", + "gulp-cli": "^2.3.0" + } +} diff --git a/doc/scripts/postprocess_doxygen_antora_bridge.py b/doc/scripts/postprocess_doxygen_antora_bridge.py new file mode 100644 index 00000000..53630c98 --- /dev/null +++ b/doc/scripts/postprocess_doxygen_antora_bridge.py @@ -0,0 +1,99 @@ +"""Post-process Doxygen HTML for Antora attachment pages (toolbar, footer, bridge CSS).""" + +from __future__ import annotations + +import re +import sys +from pathlib import Path + + +def _read_branding(doc_dir: Path, name: str) -> str: + p = doc_dir / "doxygen" / "branding" / name + return p.read_text(encoding="utf-8").strip() + + +def ensure_root_class(html: str) -> str: + if "boost-doc-antora" in html: + return html + return re.sub(r" str: + if "antora-doxygen-bridge.css" in html: + return html + return re.sub( + r'()', + r'\1\n', + html, + count=1, + ) + + +def ensure_toolbar(html: str, toolbar: str) -> str: + if "boost-doxy-site-toolbar" in html: + return html + return re.sub(r"(]*>)", r"\1\n" + toolbar + "\n", html, count=1) + + +def ensure_footer(html: str, footer: str) -> str: + if "boost-doxy-page-nav" in html: + return html + return re.sub(r"\s*", footer + "\n\n", html, count=1, flags=re.IGNORECASE | re.DOTALL) + + +def strip_memdoc_definition_lines(html: str) -> str: + """Remove Doxygen 'Definition at line …' footers in member docs (matches legacy HTML).""" + return re.sub( + r'

Definition at line.+?

\s*', + "", + html, + flags=re.DOTALL, + ) + + +def normalize_accumulators_struct_titles(html: str) -> str: + """Match legacy packet HTML: short and <h1> for struct templates under boost::accumulators.""" + html = re.sub( + r"<title>Boost\.Accumulators: boost::accumulators::(?:\w+::)*(\w+)<.*?> Struct Template Reference", + r"Struct template \1", + html, + count=1, + ) + html = re.sub( + r'(
)boost::accumulators::(?:\w+::)*(\w+)<.*?> Struct Template Reference(
)', + r"\1Struct template \2\3", + html, + count=1, + ) + return html + + +def main() -> int: + if len(sys.argv) != 2: + print("usage: postprocess_doxygen_antora_bridge.py OUT_DIR", file=sys.stderr) + return 2 + out = Path(sys.argv[1]) + if not out.is_dir(): + print(f"error: not a directory: {out}", file=sys.stderr) + return 1 + + doc_dir = out.resolve().parents[4] + toolbar = _read_branding(doc_dir, "doxygen_html_header.html") + footer = _read_branding(doc_dir, "doxygen_html_footer.html") + + for path in sorted(out.rglob("*.html")): + text = path.read_text(encoding="utf-8", errors="surrogateescape") + updated = text + updated = ensure_root_class(updated) + updated = ensure_bridge_css(updated) + updated = ensure_toolbar(updated, toolbar) + updated = strip_memdoc_definition_lines(updated) + updated = normalize_accumulators_struct_titles(updated) + updated = ensure_footer(updated, footer) + if updated != text: + path.write_text(updated, encoding="utf-8", errors="surrogateescape") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/doc/scripts/run_doxygen_accumulators_framework.sh b/doc/scripts/run_doxygen_accumulators_framework.sh new file mode 100644 index 00000000..9b08fb18 --- /dev/null +++ b/doc/scripts/run_doxygen_accumulators_framework.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +# +# Generate Doxygen HTML for the Accumulators framework into the Antora attachments tree. +# Requires: doxygen, python3 (or python), BOOST_SRC_DIR, and optional Graphviz `dot` for diagrams. + +set -euo pipefail + +SCRIPT_DIR=$(cd -- "$(dirname "${BASH_SOURCE[0]}")" && pwd) +DOC_DIR=$(cd -- "$SCRIPT_DIR/.." && pwd) +DOXY_DIR="$DOC_DIR/doxygen" +OUT_DIR="$DOC_DIR/modules/ROOT/attachments/doxygen/accumulators_framework_reference" + +if ! command -v doxygen >/dev/null 2>&1; then + echo "ERROR: doxygen not found in PATH. Install Doxygen before building Antora docs." >&2 + exit 1 +fi + +_PY= +if command -v python3 >/dev/null 2>&1; then + _PY=python3 +elif command -v python >/dev/null 2>&1; then + _PY=python +else + echo "ERROR: python3/python not found in PATH (needed for Doxygen HTML postprocess)." >&2 + exit 1 +fi + +if [ -z "${BOOST_SRC_DIR:-}" ]; then + echo "ERROR: BOOST_SRC_DIR is not set. Point it at the Boost super-project root." >&2 + exit 1 +fi + +_INPUT_DIR="$BOOST_SRC_DIR/libs/accumulators/include/boost/accumulators" +if [ ! -d "$_INPUT_DIR" ]; then + echo "ERROR: Accumulators headers not found: $_INPUT_DIR" >&2 + exit 1 +fi + +rm -rf "$OUT_DIR" +mkdir -p "$OUT_DIR" + +RUNTIME="$DOXY_DIR/Doxyfile._runtime" +if command -v dot >/dev/null 2>&1; then + cat >"$RUNTIME" <<'EOF' +HAVE_DOT = YES +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +EOF +else + echo "WARNING: Graphviz 'dot' not found; Doxygen class/collaboration graphs will be skipped." >&2 + cat >"$RUNTIME" <<'EOF' +HAVE_DOT = NO +CLASS_GRAPH = NO +COLLABORATION_GRAPH = NO +INCLUDE_GRAPH = NO +INCLUDED_BY_GRAPH = NO +CALL_GRAPH = NO +CALLER_GRAPH = NO +EOF +fi + +cd "$DOXY_DIR" +echo "Running Doxygen (framework API) into attachments..." +doxygen Doxyfile.accumulators_framework + +echo "Post-processing Doxygen HTML for Antora bridge CSS..." +"$_PY" "$DOC_DIR/scripts/postprocess_doxygen_antora_bridge.py" "$OUT_DIR" + +echo "Doxygen framework API HTML ready at: $OUT_DIR" diff --git a/doc/tagfiles/boost-core-doxygen.tag.xml b/doc/tagfiles/boost-core-doxygen.tag.xml new file mode 100644 index 00000000..ed6744d1 --- /dev/null +++ b/doc/tagfiles/boost-core-doxygen.tag.xml @@ -0,0 +1,12 @@ + + + + boost::core + + boost::core::string_view + + + boost::core::string_view + + + diff --git a/doc/tagfiles/boost-filesystem-doxygen.tag.xml b/doc/tagfiles/boost-filesystem-doxygen.tag.xml new file mode 100644 index 00000000..d8ec5166 --- /dev/null +++ b/doc/tagfiles/boost-filesystem-doxygen.tag.xml @@ -0,0 +1,12 @@ + + + + boost::filesystem + + boost::filesystem::path + + + boost::filesystem::path + reference.html#class-path + + diff --git a/doc/tagfiles/boost-system-doxygen.tag.xml b/doc/tagfiles/boost-system-doxygen.tag.xml new file mode 100644 index 00000000..9078c4e6 --- /dev/null +++ b/doc/tagfiles/boost-system-doxygen.tag.xml @@ -0,0 +1,57 @@ + + + + boost/system/result + system.html#ref_boostsystemresult_hpp + boost::system + + + boost::system + + boost::system::result + boost::system::error_code + + + boost::system::result + system.html#ref_resultt_e + boost::system::result::value_type + + value + system.html#ref_checked_value_access_2 + + + + error + system.html#ref_error_access_2 + + + + has_value + system.html#ref_queries_2 + + + + has_error + system.html#ref_queries_2 + + + + operator bool + system.html#ref_queries_2 + + + + operator* + system.html#ref_unchecked_value_access + + + + + boost::system::result::value_type + system.html#ref_resultt_e + + + boost::system::error_code + system.html#ref_error_code + +