Giter VIP home page Giter VIP logo

accumulators's People

Contributors

brycelelbach avatar cromwellenage avatar danielae avatar danieljames avatar douggregor avatar eldiener avatar ericniebler avatar grafikrobot avatar imikejackson avatar jaapaap avatar jewillco avatar jurko-gospodnetic avatar jzmaddock avatar oliness avatar pdimov avatar praetorian20 avatar rogeeff avatar romain-geissler-1a avatar sergiud avatar straszheim avatar swatanabe avatar tchaikov avatar yuvalif avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

accumulators's Issues

AccumulatorSet concept

Does AccumulatorSet concept has any chances to be introduced? Are there any sense about that?

I mean, I'm building some library for Boost (probably) with heavy Boost.Accumulators usage, so it requires for the AccumulatorSet concept to be defined. Is it my mistake, or the concept really should be there?

Computed Variance Can be Negative

This is an example from Golub's paper:

#include <iostream>
#include <vector>
#include <random>
#include <cmath>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>

template<class Real>
void golub_example()
{
    std::random_device rd{};
    auto seed = rd();
    std::mt19937 gen(seed);
    std::normal_distribution<Real> dis(500.0, 0.01);

    std::vector<Real> v(50000);
    for(size_t i = 0; i < v.size(); ++i)
    {
        v[i] = dis(gen);
    }

    accumulator_set<Real, stats<tag::variance(lazy)>> acc;
    acc = std::for_each(v.begin(), v.end(), acc);
    std::cout << "Variance = " << variance(acc) << "\n";
    std::cout << "Seed = " << seed << "\n";
}

int main()
{
   golub_example<float>();
}

Output:

Variance (accumulator) = -79.9219
Seed = 1925235287

[feature] make some accumulators addable

Some accumulators are addable: count, sum, mean, variance.
The proposal is to support operator+ for these and for accumulator_set if all stored accumulators are addable.

Unused parameter warning in mean.hpp

In file included from ../../boost/accumulators/statistics/mean.hpp:18:
../../boost/accumulators/statistics/count.hpp:48:57: error: unused parameter 'file_version' [-Werror,-Wunused-parameter]
        void serialize(Archive & ar, const unsigned int file_version)

You could run the CI tests with -Werror to catch these, which is what I do in Boost.Histogram.

cannot handle NAN.

when pushed a nan, statistic values go wrong.
just like skew and kurt.

Quadratic quantile interpolator does not guarantee monotonicity

In [weighted_][extended_]p_square.hpp, the p-square algorithm (an online - in the sense that it doesn't require storing all samples - quantile estimator) is implemented. Additionally:

  • a weighted version (that is, incoming samples are given a weight) is provided
  • an extended version (which allows the estimation of several quantiles) is provided.

The extended version also introduces the ability to use interpolation:

  • Suppose an accumulator set for [weighted_]extended_p_square_quantile is instantiated with requested quantiles {0.001, 0.2, 0.5, 0.8, 0.999}
  • Internally, the accumulator set (implementing the p-square algorithm) actually estimates the following quantiles: {0, 0.0005, 0.001, ~0.1, 0.2, 0.35, 0.5, 0.65, 0.8, ~0.9, 0.999, 1} where quantiles 0 (resp. 1) corresponds to the min (resp. max) value seen, and values not present in requested quantiles are mid-points between requested quantiles.
  • Independently from this implementation detail, the boost::accumulators::quantile method can be used with this accumulator set to extract a desired quantile estimate.
  • If this desired quantile corresponds to a requested quantile, it is obviously directly returned.
  • If not, then depending on the accumulator set's constructor's parameters, a linear or quadratic interpolation is provided.

Unfortunately, the computation of the quadratic interpolator polynomial does not incorporate a mechanism to enforce monotonicity such that it is possible/likely to get a mathematically incoherent quantile function, i.e. a an estimated quantile function such that $\exists \; 0 &lt; i &lt; j &lt; 1 \; | \; \hat{q}(i) &gt; \hat{q}(j)$.

To illustrate this claim, the programs
MWE3(_4).{cpp,py} do the following:

  • Instanciate an accumulator_set of type weighted_extended_p_square_quantile with quadratic interpolation and give it quantiles to track {0.99, 0.999, 0.9999}.
  • Do 10000 times:
    • Draw a sample from standard normal distribution $\mathcal{N}(0, 1)$.
    • Estimate quantiles {0.99, 0.992, 0.993, 0.994, 0.995, 0.996, 0.997, 0.999}.
  • Plot the estimates: estimates should obviously be monotonically increasing.
    MWE3

Schematically, for the final values, in the quantile function space, this gives:

xychart-beta
    title "Estimated quantile function"
    x-axis [0.99, 0.992, 0.993, 0.994, 0.995, 0.996, 0.997, 0.999]
    y-axis "Quantile" 1.9 --> 3
    line [2.32, 2.03, 1.98, 2.00, 2.08, 2.22, 2.43, 3.04]

This phenomenon appears because the last point participating in the quadratic interpolation polynomial, namely 0.9999 is close to 0.999 but the quantiles are far apart, such that the "convexity" required to go through all three points is high.

Since this makes no mathematical sense, I would either issue a strong warning at instantiation or deprecate this interpolator. If an additional interpolator (w.r.t. the linear one) is needed, I would suggest looking into integrating splines which monotonicity can be enforced (see e.g. https://github.com/ttk592/spline/).

Notes:

  • Program MWE3 can be compiled e.g. via: g++ -I$BOOST_INCLUDE_PATH MWE3.cpp -o MWE3
  • Data is generated via MWE3 > data3.csv
  • Plots are generated via python3 MWE3_4.py 3
  • MWE3.py requires matplotlib and pandas

Nans in quantile accumulators

This code is a slightly modified example from the Boost.Accumualators documentation, https://scicomp.ethz.ch/public/manual/Boost/1.55.0/accumulators.pdf , p.50.

It has two constants, n, c : sample size and cache size.
The purpose of this library, if I'm not mistaken, that the stats are computed for c << n.
However, this code yields nans and fails the test.
When the cache size is set equal to a sample size c = n; the test passes.

#include <iostream>

#include <boost/accumulators/accumulators.hpp> 
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/tail_quantile.hpp>
#include <boost/random/lagged_fibonacci.hpp>
#include <cassert>

using namespace boost::accumulators;

int main() {
  double epsilon = 1.e-2;
  std::size_t n = 100000; // number of MC steps
  std::size_t c = 10000; // cache size
  typedef accumulator_set<double, stats<tag::tail_quantile<right> > > accumulator_t_right;
  typedef accumulator_set<double, stats<tag::tail_quantile<left> > > accumulator_t_left;
  accumulator_t_right acc0( tag::tail<right>::cache_size = c );
  accumulator_t_left acc2( tag::tail<left>::cache_size = c );

  boost::lagged_fibonacci607 rng;

  for (std::size_t i = 0; i < n; ++i) {
    double sample1 = rng();
    acc0(sample1);
    acc2(sample1);
  }

  std::cout << quantile(acc0, quantile_probability = 0.95) << std::endl;
  std::cout << quantile(acc0, quantile_probability = 0.75) << std::endl;
  std::cout << quantile(acc2, quantile_probability = 0.25) << std::endl;
  std::cout << quantile(acc2, quantile_probability = 0.05) << std::endl;

  assert(std::fabs(quantile(acc0, quantile_probability = 0.95 )- 0.95) < epsilon);
  assert(std::fabs(quantile(acc0, quantile_probability = 0.975)- 0.975) <epsilon );
  assert(std::fabs(quantile(acc0, quantile_probability = 0.75)- 0.75) <epsilon );
  assert(std::fabs(quantile(acc0, quantile_probability = 0.99 )- 0.99) <epsilon );
  assert(std::fabs(quantile(acc0, quantile_probability = 0.999)- 0.999) <epsilon );
  assert(std::fabs(quantile(acc0, quantile_probability = 0.25)- 0.25) <epsilon );
  assert(std::fabs(quantile(acc2, quantile_probability = 0.05 )- 0.05) <epsilon );
  assert(std::fabs(quantile(acc2, quantile_probability = 0.025)- 0.025) <epsilon );
  assert(std::fabs(quantile(acc2, quantile_probability = 0.01 )- 0.01) <epsilon );
  assert(std::fabs(quantile(acc2, quantile_probability = 0.001)- 0.001)<epsilon );

  return 0;
}

The output:

0.949523
nan
nan
0.0516118
a.out: ./1.cpp:35: int main(): Assertion `std::fabs(quantile(acc0, quantile_probability = 0.75)- 0.75) <epsilon' failed.

tail_quantile off by 1 error?

Consider the following program:

#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>
#include <cstdio>

using namespace boost::accumulators;

int main() {
    accumulator_set<int, stats<tag::tail_quantile<left>>> acc(tag::tail<left>::cache_size = 3);
    acc(3);
    acc(4);
    acc(5);

    printf("%d\n", quantile(acc, quantile_probability = 0));
    printf("%d\n", quantile(acc, quantile_probability = 0.9));
}

On my machine it outputs

0
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::runtime_error> >'
  what():  index n = 3 is not in valid range [0, 3)
Aborted (core dumped)

Notice that the result for quantile_probability = 0 is wrong too. Digging into https://www.boost.org/doc/libs/1_70_0/boost/accumulators/statistics/tail_quantile.hpp, I found that index -1 is accessed when quantile_probability = 0.

The simplest fix seems to be:
Change

if ( n < static_cast<std::size_t>(tail(args).size()))

to

if (1 <= n && n <= static_cast<std::size_t>(tail(args).size()))

with the caveat that exception would be thrown when quantile_probability = 0.

weighted_variance_impl divides by zero if the first weight is zero

Hi,

lazy_weighted_variance_impl works fine if the first weight is zero, but weighted_variance_impl divides by zero:

        if(cnt > 1)
        {
            extractor<MeanFeature> const some_mean = {};

            result_type tmp = args[parameter::keyword<Tag>::get()] - some_mean(args);

            this->weighted_variance =
                numeric::fdiv(this->weighted_variance * (sum_of_weights(args) - args[weight]), sum_of_weights(args))
              + numeric::fdiv(tmp * tmp * args[weight], sum_of_weights(args) - args[weight] );
        }

It looks like "cnt > 1" should instead check "sum_of_weights(args)>0", but I'm not sure as there is some mention of this in cosurgi's answer here:

https://stackoverflow.com/questions/16761965/weighted-variance-and-weighted-standard-deviation-in-c

and this change may end up breaking existing code that takes this into account...

If this is left as is, perhaps the documentation needs updating as currently it just says:

"Note that the sample variance is not defined for n<=1".

https://www.boost.org/doc/libs/1_73_0/doc/html/boost/accumulators/impl/weighted_variance_impl.html

Juk

Modular Boost C++ Libraries Request

We are in the process of making B2 build changes to all of the B2 build files
to support "modular" consumption of the Boost Libraries by users. See this list
post for some details: https://lists.boost.org/Archives/boost/2024/01/255704.php

The process requires making a variety of changes to make each Boost library
independent of the super-project structure. But the changes do not remove the
super-project structure or the comprehensive Boost release. The changes make
solely make it possible, optionally, for users, like package manages, to easily
consume libraries individually.

Generally the changes include:

  • Adding a libroot/build.jam.
  • Porting any functionality from libroot/jamfile to libroot/build.jam.
  • Moving boost-install declaration from libroot/build/jamfile is applicable.
  • Adjusting other B2 build files in the library, like test/jamfile, as needed.
  • Possible changes to C++ source files to remove includes relative to the
    super-project boostroot location.

Some examples of such changes:

We are asking how you would like us to handle the changes. We would prefer if
you allow the owners of the Boost.org GitHub project to make changes to B2
build files, as needed, to accomplish the changes. But understand
that you may want to manage the proposed changes yourself.

We previously sent emails to all known maintainers to fill out a form with their
preference. We are contacting you in this issue as we have not gotten a response
to that email. You can see the ongoing responses for that form and the responses
to these issues here https://github.com/users/grafikrobot/projects/1/views/6

We are now asking if you can reply directly to this issue to indicate your
preference of handling the changes. Please supply a response to this question
and close the issue (so that we can verify you are a maintainer).

How would you like the build changes to be processed?

  1. Pull request, reviewed and merged by a BOOSTORG OWNER.
  2. Pull request, reviewed and merged by YOU.
  3. Other. (please specify details in the reply)

Also please indicate any special instructions you want us to consider. Or other
information you want us to be aware of.

Thanks you, René

Add exact calculation of higher order moments

I noticed here, line 58, that the variance is not calculated exactly, but rather calculated using an approximation.

I ran a git blame on this file as well as the higher order moments and found that at the time it was written (2008), there was no known exact, numerically stable, single pass, online algorithm which can compute higher order moments. This changed in 2009 with the publication of the following paper:

  • Philippe P. Pébay: ["Formulas for Robust, One-Pass Parallel Computation of Covariances and Arbitrary-Order Statistical Moments.] Technical Report SAND2008-6212, Sandia National Laboratories, September 2008.

Updating the variance, covariance, skewness, kurtosis, and all higher order moments to use these formulas is no small task, but since the current approximation seems uncontrolled, at some point it seems like it is reasonable to add them to the accumulators library.

p_square_quantile incorrect for few observations

The P^2 algorithms assumes that 5 observations are available from the beginning.

The p_square_quantile class make the same assumption, and it always returns the middle height (index 2) even when there are less than 6 observations.

A special case is needed for count < 6.

A solution is to always sort the heights when count < 6. Then we can return something like this (where cnt is the current count)

result_type result(dont_care) const
{
    if (cnt >= 6)
    {
        return this->height[2];
    }
    else
    {
        const std::size_t nearest_rank = std::ceil(cnt * p);
        return this->height[nearest_rank - 1];
    }
}

[feature request] add serialize/ deserialize functionality

This was also discussed here: https://stackoverflow.com/questions/32289719/how-to-serialize-boostaccumulatorsaccumulator-set

The ability to store the internal state of an object, as well as to initialize it with state is would be very useful, as this would eliminate the need to store the actual data point.
Currently the different classes cannot be extended by inheritance, since their internal state is private.
Anyway, since serialization and deserialization does not have any size/speed impact on the class, it is probably better to add this to the class and not to inherited version of it.
Probably good to use the boost serialization library, to assure that the output is portable (serialize on one machine and deserialize on another).

VS 2017.4 Preview Test failures

With commit bfcbfe3 (HEAD, origin/master) and VS 2017.4 Preview:

236467-testing.capture-output bin.v2\libs\accumulators\test\p_square_cumul_dist.test\msvc-14.1\debug\address-model-64\iterator_debugging-off\link-static\threading-multi\p_square_cumul_dist.run
236468-====== BEGIN OUTPUT ======
236469-Running 1 test case...
236470-libs/accumulators/test/p_square_cumul_dist.cpp(66): error: in "p_square_cumulative_distribution test/test_stat": difference{0.0331329} between 0.5 * (1.0 + my_erf( histogram[i].first / std::sqrt(2.0) )){0.010331329148570989} and histogram[i].second{0.01} exceeds 3%
236471-libs/accumulators/test/p_square_cumul_dist.cpp(66): error: in "p_square_cumulative_distribution test/test_stat": difference{0.0372556} between 0.5 * (1.0 + my_erf( histogram[i].first / std::sqrt(2.0) )){0.020755484496021825} and histogram[i].second{0.02001} exceeds 3%
236472-libs/accumulators/test/p_square_cumul_dist.cpp(66): error: in "p_square_cumulative_distribution test/test_stat": difference{0.0326898} between 0.5 * (1.0 + my_erf( histogram[i].first / std::sqrt(2.0) )){0.030980693519017} and histogram[i].second{0.029999999999999999} exceeds 3%
236473-libs/accumulators/test/p_square_cumul_dist.cpp(66): error: in "p_square_cumulative_distribution test/test_stat": difference{0.0306804} between 0.5 * (1.0 + my_erf( histogram[i].first / std::sqrt(2.0) )){0.041227215128245343} and histogram[i].second{0.040000000000000001} exceeds 3%
236474-
236475:*** 4 failures are detected in the test module "Master Test Suite"
236476- 
236477-EXIT STATUS: 201 
236478-====== END OUTPUT ======
237337-testing.capture-output bin.v2\libs\accumulators\test\weighted_median.test\msvc-14.1\debug\address-model-64\iterator_debugging-off\link-static\threading-multi\weighted_median.run
237338-====== BEGIN OUTPUT ======
237339-Running 1 test case...
237340-libs/accumulators/test/weighted_median.cpp(50): error: in "weighted_median test/test_stat": difference{0.0327894} between 1.{1} and weighted_median(acc_dens){0.96825159071079681} exceeds 3%
237341-libs/accumulators/test/weighted_median.cpp(51): error: in "weighted_median test/test_stat": difference{0.0316788} between 1.{1} and weighted_median(acc_cdist){0.96929395242297978} exceeds 3%
237342-
237343:*** 2 failures are detected in the test module "Master Test Suite"
237344- 
237345-EXIT STATUS: 201 
237346-====== END OUTPUT ======

Compiling error when using density within a features set.

The following code snipped generates compiler errors:

#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>
#include <boost/accumulators/statistics/density.hpp>

using namespace boost::accumulators;
using namespace boost;

typedef accumulator_set<double,features<tag::density>> histogram_type;

int main(int argc, char*argv[])
{
    histogram_type hist;
    hist(1.0);
    hist(2.0);
    return 0;
}

It compiles without problems when removing the features tag such that the line reads

typedef accumulator_set<double, tag::density> histogram_type;

The examples from the documentation uses the features tag together with density.

Error Output

In file included from /usr/local/include/boost/accumulators/statistics.hpp:14,
                 from hist.cpp:2:
/usr/local/include/boost/accumulators/statistics/density.hpp: In constructor ‘boost::accumulators::impl::density_impl<Sample>::density_impl(const Args&) [with Args = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::accumulators::tag::accumulator, boost::accumulators::accumulator_set<double, boost::accumulators::features<boost::accumulators::tag::density, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, void> >, boost::parameter::aux::empty_arg_list>, Sample = double]’:
/usr/local/include/boost/accumulators/framework/depends_on.hpp:319:   instantiated from ‘boost::accumulators::detail::accumulator_wrapper<Accumulator, Feature>::accumulator_wrapper(const Args&) [with Args = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::accumulators::tag::accumulator, boost::accumulators::accumulator_set<double, boost::accumulators::features<boost::accumulators::tag::density, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, void> >, boost::parameter::aux::empty_arg_list>, Accumulator = boost::accumulators::impl::density_impl<double>, Feature = boost::accumulators::tag::density]’
/usr/local/include/boost/accumulators/framework/depends_on.hpp:252:   instantiated from ‘static boost::fusion::cons<typename boost::fusion::result_of::value_of<Iterator>::type, typename boost::accumulators::detail::build_acc_list<typename boost::fusion::result_of::next<Iterator>::type, Last, boost::fusion::result_of::equal_to::value>::type> boost::accumulators::detail::build_acc_list<First, Last, false>::call(const Args&, const First&, const Last&) [with Args = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::accumulators::tag::accumulator, boost::accumulators::accumulator_set<double, boost::accumulators::features<boost::accumulators::tag::density, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, void> >, boost::parameter::aux::empty_arg_list>, First = boost::fusion::mpl_iterator<boost::mpl::v_iter<boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::density_impl<double>, boost::accumulators::tag::density>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::max_impl<double>, boost::accumulators::tag::max>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::min_impl<double>, boost::accumulators::tag::min>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::count_impl, boost::accumulators::tag::count>, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>, 3l> >, Last = boost::fusion::mpl_iterator<boost::mpl::v_iter<boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::density_impl<double>, boost::accumulators::tag::density>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::max_impl<double>, boost::accumulators::tag::max>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::min_impl<double>, boost::accumulators::tag::min>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::count_impl, boost::accumulators::tag::count>, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>, 4l> >]’
/usr/local/include/boost/accumulators/framework/depends_on.hpp:252:   instantiated from ‘static boost::fusion::cons<typename boost::fusion::result_of::value_of<Iterator>::type, typename boost::accumulators::detail::build_acc_list<typename boost::fusion::result_of::next<Iterator>::type, Last, boost::fusion::result_of::equal_to::value>::type> boost::accumulators::detail::build_acc_list<First, Last, false>::call(const Args&, const First&, const Last&) [with Args = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::accumulators::tag::accumulator, boost::accumulators::accumulator_set<double, boost::accumulators::features<boost::accumulators::tag::density, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, void> >, boost::parameter::aux::empty_arg_list>, First = boost::fusion::mpl_iterator<boost::mpl::v_iter<boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::density_impl<double>, boost::accumulators::tag::density>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::max_impl<double>, boost::accumulators::tag::max>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::min_impl<double>, boost::accumulators::tag::min>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::count_impl, boost::accumulators::tag::count>, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>, 2l> >, Last = boost::fusion::mpl_iterator<boost::mpl::v_iter<boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::density_impl<double>, boost::accumulators::tag::density>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::max_impl<double>, boost::accumulators::tag::max>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::min_impl<double>, boost::accumulators::tag::min>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::count_impl, boost::accumulators::tag::count>, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>, 4l> >]’
/usr/local/include/boost/accumulators/framework/depends_on.hpp:252:   instantiated from ‘static boost::fusion::cons<typename boost::fusion::result_of::value_of<Iterator>::type, typename boost::accumulators::detail::build_acc_list<typename boost::fusion::result_of::next<Iterator>::type, Last, boost::fusion::result_of::equal_to::value>::type> boost::accumulators::detail::build_acc_list<First, Last, false>::call(const Args&, const First&, const Last&) [with Args = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::accumulators::tag::accumulator, boost::accumulators::accumulator_set<double, boost::accumulators::features<boost::accumulators::tag::density, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, void> >, boost::parameter::aux::empty_arg_list>, First = boost::fusion::mpl_iterator<boost::mpl::v_iter<boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::density_impl<double>, boost::accumulators::tag::density>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::max_impl<double>, boost::accumulators::tag::max>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::min_impl<double>, boost::accumulators::tag::min>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::count_impl, boost::accumulators::tag::count>, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>, 1l> >, Last = boost::fusion::mpl_iterator<boost::mpl::v_iter<boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::density_impl<double>, boost::accumulators::tag::density>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::max_impl<double>, boost::accumulators::tag::max>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::min_impl<double>, boost::accumulators::tag::min>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::count_impl, boost::accumulators::tag::count>, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>, 4l> >]’
/usr/local/include/boost/accumulators/framework/depends_on.hpp:252:   instantiated from ‘static boost::fusion::cons<typename boost::fusion::result_of::value_of<Iterator>::type, typename boost::accumulators::detail::build_acc_list<typename boost::fusion::result_of::next<Iterator>::type, Last, boost::fusion::result_of::equal_to::value>::type> boost::accumulators::detail::build_acc_list<First, Last, false>::call(const Args&, const First&, const Last&) [with Args = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::accumulators::tag::accumulator, boost::accumulators::accumulator_set<double, boost::accumulators::features<boost::accumulators::tag::density, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, void> >, boost::parameter::aux::empty_arg_list>, First = boost::fusion::mpl_iterator<boost::mpl::v_iter<boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::density_impl<double>, boost::accumulators::tag::density>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::max_impl<double>, boost::accumulators::tag::max>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::min_impl<double>, boost::accumulators::tag::min>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::count_impl, boost::accumulators::tag::count>, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>, 0l> >, Last = boost::fusion::mpl_iterator<boost::mpl::v_iter<boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::density_impl<double>, boost::accumulators::tag::density>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::max_impl<double>, boost::accumulators::tag::max>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::min_impl<double>, boost::accumulators::tag::min>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::count_impl, boost::accumulators::tag::count>, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>, 4l> >]’
/usr/local/include/boost/accumulators/framework/depends_on.hpp:271:   instantiated from ‘typename boost::accumulators::detail::meta::make_acc_list<Sequence>::type boost::accumulators::detail::make_acc_list(const Sequence&, const Args&) [with Sequence = boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::density_impl<double>, boost::accumulators::tag::density>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::max_impl<double>, boost::accumulators::tag::max>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::min_impl<double>, boost::accumulators::tag::min>, boost::mpl::v_item<boost::accumulators::detail::accumulator_wrapper<boost::accumulators::impl::count_impl, boost::accumulators::tag::count>, boost::mpl::vector0<mpl_::na>, 0>, 0>, 0>, 0>, Args = boost::parameter::aux::arg_list<boost::parameter::aux::tagged_argument<boost::accumulators::tag::accumulator, boost::accumulators::accumulator_set<double, boost::accumulators::features<boost::accumulators::tag::density, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, void> >, boost::parameter::aux::empty_arg_list>]’
/usr/local/include/boost/accumulators/framework/accumulator_set.hpp:145:   instantiated from ‘boost::accumulators::accumulator_set<Sample, Features, Weight>::accumulator_set() [with Sample = double, Features = boost::accumulators::features<boost::accumulators::tag::density, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, Weight = void]’
hist.cpp:12:   instantiated from here
/usr/local/include/boost/accumulators/statistics/density.hpp:84: error: no match for ‘operator[]’ in ‘args[boost::accumulators::<unnamed>::density_cache_size]’
/usr/local/include/boost/parameter/aux_/arg_list.hpp:327: note: candidates are: typename boost::mpl::eval_if<typename boost::parameter::aux::is_maybe<typename TaggedArg::value_type>::type, boost::parameter::aux::get_reference<typename TaggedArg::value_type>, boost::parameter::aux::get_reference<TaggedArg> >::type boost::parameter::aux::arg_list<TaggedArg, Next>::operator[](const boost::parameter::keyword<typename TaggedArg::key_type>&) const [with TaggedArg = boost::parameter::aux::tagged_argument<boost::accumulators::tag::accumulator, boost::accumulators::accumulator_set<double, boost::accumulators::features<boost::accumulators::tag::density, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, void> >, Next = boost::parameter::aux::empty_arg_list]
/usr/local/include/boost/accumulators/statistics/density.hpp:84: error: no match for ‘operator[]’ in ‘args[boost::accumulators::<unnamed>::density_num_bins]’
/usr/local/include/boost/parameter/aux_/arg_list.hpp:327: note: candidates are: typename boost::mpl::eval_if<typename boost::parameter::aux::is_maybe<typename TaggedArg::value_type>::type, boost::parameter::aux::get_reference<typename TaggedArg::value_type>, boost::parameter::aux::get_reference<TaggedArg> >::type boost::parameter::aux::arg_list<TaggedArg, Next>::operator[](const boost::parameter::keyword<typename TaggedArg::key_type>&) const [with TaggedArg = boost::parameter::aux::tagged_argument<boost::accumulators::tag::accumulator, boost::accumulators::accumulator_set<double, boost::accumulators::features<boost::accumulators::tag::density, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, void> >, Next = boost::parameter::aux::empty_arg_list]

Version

Boost v1.61, gnu g++ v4.4.5

[Regression] boost::accumulators::tag::rolling_mean requires comparison operators < and > as of boost 1.71.

Code that uses boost::accumulators::accumulator_set with<X, Stats> where Stats contains boost::accumulators::tag::rolling_mean and X does not implement the operators < and > no longer compiles since Fix #11437: correct immediate_rolling_mean.

We were using this for coordinates in 3d, let's say struct Vec3d { float x; float y; float z}; . This type doesn't have a natural order. (Note that lexicographic ordering does not respect rotation symmetries, etc.) So it doesn't make sense to define comparison operators for them.
Averaging, by contrast, is basically a linear combination, which is a perfectly valid operation for elements of vector spaces.

Code sample on godbolt. This code breaks when upgrading from boost-1.70 to boost -1.71.

Testing on MSVC is broken due to unsupported flag added in #18

https://www.boost.org/development/tests/develop/developer/output/teeks99-09-p-64onAMD64-boost-bin-v2-libs-accumulators-test-count-test-msvc-14-1-dbg-adrs-mdl-64-itrtr-off-lnk-sttc-thrd-mlt.html

    call "D:\teeks99-09\run\results\boost\bin.v2\standalone\msvc\msvc-14.1\adrs-mdl-64\archt-x86\msvc-setup.bat"  >nul
 cl /Zm800 -nologo @"D:\teeks99-09\run\results\boost\bin.v2\libs\accumulators\test\count.test\msvc-14.1\dbg\adrs-mdl-64\itrtr-off\lnk-sttc\thrd-mlt\count.obj.rsp" 

cl : Command line error D8021 : invalid numeric argument '/Wno-deprecated-declarations'

Feature request: use all tracked probabilities to estimate a quantile

In [weighted_][extended_]p_square.hpp, the p-square algorithm (an online - in the sense that it doesn't require storing all samples - quantile estimator) is implemented. Additionally:

  • a weighted version (that is, incoming samples are given a weight) is provided
  • an extended version (which allows the estimation of several quantiles) is provided.

The extended version also introduces the ability to use interpolation:

  • Suppose an accumulator set for [weighted_]extended_p_square_quantile is instantiated with requested quantiles {0.001, 0.2, 0.5, 0.8, 0.999}
  • Internally, the accumulator set (implementing the p-square algorithm) actually estimates the following quantiles: {0, 0.0005, 0.001, ~0.1, 0.2, 0.35, 0.5, 0.65, 0.8, ~0.9, 0.999, 1} where quantiles 0 (resp. 1) corresponds to the min (resp. max) value seen, and values not present in requested quantiles are mid-points between requested quantiles.
  • Independently from this implementation detail, the boost::accumulators::quantile method can be used with this accumulator set to extract a desired quantile estimate.
  • If this desired quantile corresponds to a requested quantile, it is obviously directly returned.
  • If not, then depending on the accumulator set's constructor's parameters, a linear or quadratic interpolation is provided.
  • Irrespective of the interpolator being linear or quadratic, this interpolator:
    • Will return nan if the desired quantile is below (resp. above) the min (resp. max) of the requested quantiles
    • Will interpolate using estimates of the requested quantiles only (i.e. {0.001, 0.2, 0.5, 0.8, 0.999} in this example)

In essence:

  • the interpolation step throws away more than half of the available data (computed at a relatively high cost)
  • the interpolator provides poor estimates in particular for mid-points that are estimated but not used, especially when the quantile function is not linear in-between requested quantiles

To show this, the MWE2.{cpp,py} programs are provided.

  • Instanciate an accumulator_set of type weighted_extended_p_square_quantile and give it quantiles to track {0.001, 0.2, 0.5, 0.8, 0.999}.
  • Do 10000 times:
    • Draw a sample from standard uniform distribution $\mathcal{N}(0, 1)$.
    • Estimate quantiles {0.0005, 0.1, 0.35, 0.65, 0.9, 0.9995}.
  • Plot the estimates against the truth (estimates should converge to true values reasonably fast since they correspond to mid-points that are estimated by the p-square algorithm). Note that $\hat{q}$ corresponds to the current implementation, $\tilde{q}$ corresponds to the proposed use of all estimated quantiles (by applying the commit and using the quantile_override method proposed in MWE2.cpp).

Note that estimates of quantiles 0.35 and 0.65 are reasonable (in some sense, they lie in the "linear regime" of the quantile function), but estimates of quantiles 0.1 and 0.9 are poor. Quantiles 0.0005 and 0.9995 could not be computed by the current implementation due its limitations (see above), returning nan.

MWE2

Notes:

  • Program MWE2 can be compiled e.g. via: g++ -I$BOOST_INCLUDE_PATH -fno-access-control MWE2.cpp -o MWE2
  • Data is generated via MWE2 > data2.csv
  • Plots are generated via python3 MWE2.py
  • MWE2.py requires matplotlib and pandas
  • This commit/PR should not be merged into develop since it exposes the accumulator and the heights attribute as public to be able to implement the quantile_override method.
  • A "proper" fix would require delving into the extract namespace, which I did not, for lack of time and understanding of the possible implications of changes to that namespace.
  • If a maintainer is willing to give pointers to where these changes could be implemented, this PR could properly address this issue.

compile error when combining headers

I am using 1_66. I have two header files in two different libraries which work fine on their own, but when including both headers at once I get a compile error (with clang and msvc). A small example is given by the following code

test.cpp:

// first header file

#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/weighted_kurtosis.hpp>

/* ... */

typedef boost::accumulators::accumulator_set<
    double, boost::accumulators::stats<boost::accumulators::tag::weighted_kurtosis>, double>
    accumulator_set;
accumulator_set acc_;

/* ... */

// second header file

#include <boost/accumulators/statistics.hpp>

/* ... */

Compiling this code with clang++ -c test.cpp yields

In file included from test.cpp:18:
In file included from /usr/local/include/boost/accumulators/statistics.hpp:19:
/usr/local/include/boost/accumulators/statistics/kurtosis.hpp:105:8: error: explicit specialization of 'boost::accumulators::feature_of<boost::accumulators::tag::weighted_kurtosis>' after instantiation
struct feature_of<tag::weighted_kurtosis>
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/boost/accumulators/framework/depends_on.hpp:284:30: note: implicit instantiation first required here
                    typename feature_of<feature_type>::type
                             ^

Condition number of summation

Would you be interested in accepting a PR for the condition number of summation?

It's not a complicated algorithm, of course, but still it's a very useful diagnostic. Here's a sketch:

template<class Real>
class summation_condition_number {
public:
    summation_condition_number(Real x = 0)
    {
        using std::abs;
        m_l1 = abs(x);
        m_sum = x;
    }

    void operator+=(Real x)
    {
        using std::abs;
        m_l1 += abs(x);
        m_sum += x;
    }

    [[nodiscard]] Real operator()() const
    {
        using std::abs;
        if (m_sum == Real(0) && m_l1 != Real(0))
        {
            return std::numeric_limits<Real>::infinity();
        }
        return m_l1/abs(m_sum);
    }

    [[nodiscard]] Real sum() const
    {
        return m_sum;
    }

private:
    Real m_l1;
    Real m_sum;
};

and usage:

    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<Real> dist(-1,1);
    cond = summation_condition_number<Real>();
    int i = 0;
    while(i++ < 1000000)
    {
        cond += dist(gen);
    }
    std::cout << "Condition number = " << cond() << "\n";
    std::cout << "Sum = " << cond.sum() << "\n";

Misleading documentation for boost::accumulators::tag::variance

The first half of the documentation for variance is correct - it shows the formulas used for variance and mean. This formula is correct, and it is what is implemented in the boost code. (It implements a variant of the Welford method of computing variance.)

But the second half of the documentation is, at best, misleading. The second half starts with "A simplification can be obtained by the approximate recursion...", then gives some formulas, and ends with "However, for small n the difference can be non-negligible." This is misleading because this "simplification" is not, in fact, used by the boost code. And that's a good thing, because this "simplification" would produce incorrect results, and would not actually be any simpler. As far as I can tell, the second half of the documentation should be eliminated entirely.

I note that the current situation leads some people to incorrectly believe that it is sometimes preferable to use boost::accumulators::tag::lazy_variance. For example, at link to a stackoverflow question, one person claims:

Note, that tag::variance calculates variance by an approximate formula. tag::variance(lazy) calculates by an exact formula, specifically: second moment - squared mean which will produce incorrect result if variance is very small because of rounding errors. It can actually produce negative variance. – panda-34 Dec 7 '15 at 13:36

This person incorrectly thinks that tag::variance is only approximate.

As far as I can tell, the only reason to use tag::lazy_variance is if speed is your only consideration, since tag::lazy_variance is roughly twice as fast as tag::variance. But both are quite fast, so this is unlikely to be a consideration for most users.

boost submodule init

When using https://github.com/boostorg/boost as submodule:
committed boost as submodule using its tag boost-1.74.0
git submodule update --init --remote --recursive doesn't work as expected entirely:

09:03:02 + git submodule update --init --remote --recursive
...
09:04:55 Submodule 'accumulators' (https://github.com/boostorg/accumulators.git) registered for path 'external/boost/libs/accumulators'
09:04:55 Submodule 'algorithm' (https://github.com/boostorg/algorithm.git) registered for path 'external/boost/libs/algorithm'
09:04:55 Submodule 'align' (https://github.com/boostorg/align.git) registered for path 'external/boost/libs/align'
09:04:55 Submodule 'any' (https://github.com/boostorg/any.git) registered for path 'external/boost/libs/any'
09:04:55 Submodule 'array' (https://github.com/boostorg/array.git) registered for path 'external/boost/libs/array'
09:04:55 Submodule 'asio' (https://github.com/boostorg/asio.git) registered for path 'external/boost/libs/asio'
09:04:55 Submodule 'assert' (https://github.com/boostorg/assert.git) registered for path 'external/boost/libs/assert'
09:04:55 Submodule 'assign' (https://github.com/boostorg/assign.git) registered for path 'external/boost/libs/assign'
09:04:55 Submodule 'atomic' (https://github.com/boostorg/atomic.git) registered for path 'external/boost/libs/atomic'
09:04:55 Submodule 'beast' (https://github.com/boostorg/beast.git) registered for path 'external/boost/libs/beast'
09:04:55 Submodule 'bimap' (https://github.com/boostorg/bimap.git) registered for path 'external/boost/libs/bimap'
09:04:55 Submodule 'bind' (https://github.com/boostorg/bind.git) registered for path 'external/boost/libs/bind'
09:04:55 Submodule 'callable_traits' (https://github.com/boostorg/callable_traits.git) registered for path 'external/boost/libs/callable_traits'
09:04:55 Submodule 'chrono' (https://github.com/boostorg/chrono.git) registered for path 'external/boost/libs/chrono'
09:04:55 Submodule 'circular_buffer' (https://github.com/boostorg/circular_buffer.git) registered for path 'external/boost/libs/circular_buffer'
09:04:55 Submodule 'compatibility' (https://github.com/boostorg/compatibility.git) registered for path 'external/boost/libs/compatibility'
09:04:55 Submodule 'compute' (https://github.com/boostorg/compute.git) registered for path 'external/boost/libs/compute'
09:04:55 Submodule 'concept_check' (https://github.com/boostorg/concept_check.git) registered for path 'external/boost/libs/concept_check'
09:04:55 Submodule 'config' (https://github.com/boostorg/config.git) registered for path 'external/boost/libs/config'
09:04:55 Submodule 'container' (https://github.com/boostorg/container.git) registered for path 'external/boost/libs/container'
09:04:55 Submodule 'container_hash' (https://github.com/boostorg/container_hash.git) registered for path 'external/boost/libs/container_hash'
09:04:55 Submodule 'context' (https://github.com/boostorg/context.git) registered for path 'external/boost/libs/context'
09:04:55 Submodule 'contract' (https://github.com/boostorg/contract.git) registered for path 'external/boost/libs/contract'
09:04:55 Submodule 'conversion' (https://github.com/boostorg/conversion.git) registered for path 'external/boost/libs/conversion'
09:04:55 Submodule 'convert' (https://github.com/boostorg/convert.git) registered for path 'external/boost/libs/convert'
09:04:55 Submodule 'core' (https://github.com/boostorg/core.git) registered for path 'external/boost/libs/core'
09:04:55 Submodule 'coroutine' (https://github.com/boostorg/coroutine.git) registered for path 'external/boost/libs/coroutine'
09:04:55 Submodule 'coroutine2' (https://github.com/boostorg/coroutine2.git) registered for path 'external/boost/libs/coroutine2'
09:04:55 Submodule 'crc' (https://github.com/boostorg/crc.git) registered for path 'external/boost/libs/crc'
09:04:55 Submodule 'date_time' (https://github.com/boostorg/date_time.git) registered for path 'external/boost/libs/date_time'
09:04:55 Submodule 'detail' (https://github.com/boostorg/detail.git) registered for path 'external/boost/libs/detail'
09:04:55 Submodule 'dll' (https://github.com/boostorg/dll.git) registered for path 'external/boost/libs/dll'
09:04:55 Submodule 'dynamic_bitset' (https://github.com/boostorg/dynamic_bitset.git) registered for path 'external/boost/libs/dynamic_bitset'
09:04:55 Submodule 'endian' (https://github.com/boostorg/endian.git) registered for path 'external/boost/libs/endian'
09:04:55 Submodule 'exception' (https://github.com/boostorg/exception.git) registered for path 'external/boost/libs/exception'
09:04:55 Submodule 'fiber' (https://github.com/boostorg/fiber.git) registered for path 'external/boost/libs/fiber'
09:04:55 Submodule 'filesystem' (https://github.com/boostorg/filesystem.git) registered for path 'external/boost/libs/filesystem'
09:04:55 Submodule 'flyweight' (https://github.com/boostorg/flyweight.git) registered for path 'external/boost/libs/flyweight'
09:04:55 Submodule 'foreach' (https://github.com/boostorg/foreach.git) registered for path 'external/boost/libs/foreach'
09:04:55 Submodule 'format' (https://github.com/boostorg/format.git) registered for path 'external/boost/libs/format'
09:04:55 Submodule 'function' (https://github.com/boostorg/function.git) registered for path 'external/boost/libs/function'
09:04:55 Submodule 'function_types' (https://github.com/boostorg/function_types.git) registered for path 'external/boost/libs/function_types'
09:04:55 Submodule 'functional' (https://github.com/boostorg/functional.git) registered for path 'external/boost/libs/functional'
09:04:55 Submodule 'fusion' (https://github.com/boostorg/fusion.git) registered for path 'external/boost/libs/fusion'
09:04:55 Submodule 'geometry' (https://github.com/boostorg/geometry.git) registered for path 'external/boost/libs/geometry'
09:04:55 Submodule 'gil' (https://github.com/boostorg/gil.git) registered for path 'external/boost/libs/gil'
09:04:55 Submodule 'graph' (https://github.com/boostorg/graph.git) registered for path 'external/boost/libs/graph'
09:04:55 Submodule 'graph_parallel' (https://github.com/boostorg/graph_parallel.git) registered for path 'external/boost/libs/graph_parallel'
09:04:55 Submodule 'hana' (https://github.com/boostorg/hana.git) registered for path 'external/boost/libs/hana'
09:04:55 Submodule 'headers' (https://github.com/boostorg/headers.git) registered for path 'external/boost/libs/headers'
09:04:55 Submodule 'heap' (https://github.com/boostorg/heap.git) registered for path 'external/boost/libs/heap'
09:04:55 Submodule 'histogram' (https://github.com/boostorg/histogram.git) registered for path 'external/boost/libs/histogram'
09:04:55 Submodule 'hof' (https://github.com/boostorg/hof.git) registered for path 'external/boost/libs/hof'
09:04:55 Submodule 'icl' (https://github.com/boostorg/icl.git) registered for path 'external/boost/libs/icl'
09:04:55 Submodule 'integer' (https://github.com/boostorg/integer.git) registered for path 'external/boost/libs/integer'
09:04:55 Submodule 'interprocess' (https://github.com/boostorg/interprocess.git) registered for path 'external/boost/libs/interprocess'
09:04:55 Submodule 'intrusive' (https://github.com/boostorg/intrusive.git) registered for path 'external/boost/libs/intrusive'
09:04:55 Submodule 'io' (https://github.com/boostorg/io.git) registered for path 'external/boost/libs/io'
09:04:55 Submodule 'iostreams' (https://github.com/boostorg/iostreams.git) registered for path 'external/boost/libs/iostreams'
09:04:55 Submodule 'iterator' (https://github.com/boostorg/iterator.git) registered for path 'external/boost/libs/iterator'
09:04:55 Submodule 'json' (https://github.com/boostorg/json.git) registered for path 'external/boost/libs/json'
09:04:55 Submodule 'lambda' (https://github.com/boostorg/lambda.git) registered for path 'external/boost/libs/lambda'
09:04:55 Submodule 'leaf' (https://github.com/boostorg/leaf.git) registered for path 'external/boost/libs/leaf'
09:04:55 Submodule 'lexical_cast' (https://github.com/boostorg/lexical_cast.git) registered for path 'external/boost/libs/lexical_cast'
09:04:55 Submodule 'local_function' (https://github.com/boostorg/local_function.git) registered for path 'external/boost/libs/local_function'
09:04:55 Submodule 'locale' (https://github.com/boostorg/locale.git) registered for path 'external/boost/libs/locale'
09:04:55 Submodule 'lockfree' (https://github.com/boostorg/lockfree.git) registered for path 'external/boost/libs/lockfree'
09:04:55 Submodule 'log' (https://github.com/boostorg/log.git) registered for path 'external/boost/libs/log'
09:04:55 Submodule 'logic' (https://github.com/boostorg/logic.git) registered for path 'external/boost/libs/logic'
09:04:55 Submodule 'math' (https://github.com/boostorg/math.git) registered for path 'external/boost/libs/math'
09:04:55 Submodule 'metaparse' (https://github.com/boostorg/metaparse.git) registered for path 'external/boost/libs/metaparse'
09:04:55 Submodule 'move' (https://github.com/boostorg/move.git) registered for path 'external/boost/libs/move'
09:04:55 Submodule 'mp11' (https://github.com/boostorg/mp11.git) registered for path 'external/boost/libs/mp11'
09:04:55 Submodule 'mpi' (https://github.com/boostorg/mpi.git) registered for path 'external/boost/libs/mpi'
09:04:55 Submodule 'mpl' (https://github.com/boostorg/mpl.git) registered for path 'external/boost/libs/mpl'
09:04:55 Submodule 'msm' (https://github.com/boostorg/msm.git) registered for path 'external/boost/libs/msm'
09:04:55 Submodule 'multi_array' (https://github.com/boostorg/multi_array.git) registered for path 'external/boost/libs/multi_array'
09:04:55 Submodule 'multi_index' (https://github.com/boostorg/multi_index.git) registered for path 'external/boost/libs/multi_index'
09:04:55 Submodule 'multiprecision' (https://github.com/boostorg/multiprecision.git) registered for path 'external/boost/libs/multiprecision'
09:04:55 Submodule 'nowide' (https://github.com/boostorg/nowide.git) registered for path 'external/boost/libs/nowide'
09:04:55 Submodule 'numeric_conversion' (https://github.com/boostorg/numeric_conversion.git) registered for path 'external/boost/libs/numeric/conversion'
09:04:55 Submodule 'interval' (https://github.com/boostorg/interval.git) registered for path 'external/boost/libs/numeric/interval'
09:04:55 Submodule 'odeint' (https://github.com/boostorg/odeint.git) registered for path 'external/boost/libs/numeric/odeint'
09:04:55 Submodule 'ublas' (https://github.com/boostorg/ublas.git) registered for path 'external/boost/libs/numeric/ublas'
09:04:55 Submodule 'optional' (https://github.com/boostorg/optional.git) registered for path 'external/boost/libs/optional'
09:04:55 Submodule 'outcome' (https://github.com/boostorg/outcome.git) registered for path 'external/boost/libs/outcome'
09:04:55 Submodule 'parameter' (https://github.com/boostorg/parameter.git) registered for path 'external/boost/libs/parameter'
09:04:55 Submodule 'parameter_python' (https://github.com/boostorg/parameter_python.git) registered for path 'external/boost/libs/parameter_python'
09:04:55 Submodule 'phoenix' (https://github.com/boostorg/phoenix.git) registered for path 'external/boost/libs/phoenix'
09:04:55 Submodule 'poly_collection' (https://github.com/boostorg/poly_collection.git) registered for path 'external/boost/libs/poly_collection'
09:04:55 Submodule 'polygon' (https://github.com/boostorg/polygon.git) registered for path 'external/boost/libs/polygon'
09:04:55 Submodule 'pool' (https://github.com/boostorg/pool.git) registered for path 'external/boost/libs/pool'
09:04:55 Submodule 'predef' (https://github.com/boostorg/predef.git) registered for path 'external/boost/libs/predef'
09:04:55 Submodule 'preprocessor' (https://github.com/boostorg/preprocessor.git) registered for path 'external/boost/libs/preprocessor'
09:04:55 Submodule 'process' (https://github.com/boostorg/process.git) registered for path 'external/boost/libs/process'
09:04:55 Submodule 'program_options' (https://github.com/boostorg/program_options.git) registered for path 'external/boost/libs/program_options'
09:04:55 Submodule 'property_map' (https://github.com/boostorg/property_map.git) registered for path 'external/boost/libs/property_map'
09:04:55 Submodule 'property_tree' (https://github.com/boostorg/property_tree.git) registered for path 'external/boost/libs/property_tree'
09:04:55 Submodule 'proto' (https://github.com/boostorg/proto.git) registered for path 'external/boost/libs/proto'
09:04:55 Submodule 'ptr_container' (https://github.com/boostorg/ptr_container.git) registered for path 'external/boost/libs/ptr_container'
09:04:55 Submodule 'python' (https://github.com/boostorg/python.git) registered for path 'external/boost/libs/python'
09:04:55 Submodule 'qvm' (https://github.com/boostorg/qvm.git) registered for path 'external/boost/libs/qvm'
09:04:55 Submodule 'random' (https://github.com/boostorg/random.git) registered for path 'external/boost/libs/random'
09:04:55 Submodule 'range' (https://github.com/boostorg/range.git) registered for path 'external/boost/libs/range'
09:04:55 Submodule 'ratio' (https://github.com/boostorg/ratio.git) registered for path 'external/boost/libs/ratio'
09:04:55 Submodule 'rational' (https://github.com/boostorg/rational.git) registered for path 'external/boost/libs/rational'
09:04:55 Submodule 'regex' (https://github.com/boostorg/regex.git) registered for path 'external/boost/libs/regex'
09:04:55 Submodule 'safe_numerics' (https://github.com/boostorg/safe_numerics.git) registered for path 'external/boost/libs/safe_numerics'
09:04:55 Submodule 'scope_exit' (https://github.com/boostorg/scope_exit.git) registered for path 'external/boost/libs/scope_exit'
09:04:55 Submodule 'serialization' (https://github.com/boostorg/serialization.git) registered for path 'external/boost/libs/serialization'
09:04:55 Submodule 'signals2' (https://github.com/boostorg/signals2.git) registered for path 'external/boost/libs/signals2'
09:04:55 Submodule 'smart_ptr' (https://github.com/boostorg/smart_ptr.git) registered for path 'external/boost/libs/smart_ptr'
09:04:55 Submodule 'sort' (https://github.com/boostorg/sort.git) registered for path 'external/boost/libs/sort'
09:04:55 Submodule 'spirit' (https://github.com/boostorg/spirit.git) registered for path 'external/boost/libs/spirit'
09:04:55 Submodule 'stacktrace' (https://github.com/boostorg/stacktrace.git) registered for path 'external/boost/libs/stacktrace'
09:04:55 Submodule 'statechart' (https://github.com/boostorg/statechart.git) registered for path 'external/boost/libs/statechart'
09:04:55 Submodule 'static_assert' (https://github.com/boostorg/static_assert.git) registered for path 'external/boost/libs/static_assert'
09:04:55 Submodule 'static_string' (https://github.com/boostorg/static_string.git) registered for path 'external/boost/libs/static_string'
09:04:55 Submodule 'stl_interfaces' (https://github.com/boostorg/stl_interfaces.git) registered for path 'external/boost/libs/stl_interfaces'
09:04:55 Submodule 'system' (https://github.com/boostorg/system.git) registered for path 'external/boost/libs/system'
09:04:55 Submodule 'test' (https://github.com/boostorg/test.git) registered for path 'external/boost/libs/test'
09:04:55 Submodule 'thread' (https://github.com/boostorg/thread.git) registered for path 'external/boost/libs/thread'
09:04:55 Submodule 'throw_exception' (https://github.com/boostorg/throw_exception.git) registered for path 'external/boost/libs/throw_exception'
09:04:55 Submodule 'timer' (https://github.com/boostorg/timer.git) registered for path 'external/boost/libs/timer'
09:04:55 Submodule 'tokenizer' (https://github.com/boostorg/tokenizer.git) registered for path 'external/boost/libs/tokenizer'
09:04:55 Submodule 'tti' (https://github.com/boostorg/tti.git) registered for path 'external/boost/libs/tti'
09:04:55 Submodule 'tuple' (https://github.com/boostorg/tuple.git) registered for path 'external/boost/libs/tuple'
09:04:55 Submodule 'type_erasure' (https://github.com/boostorg/type_erasure.git) registered for path 'external/boost/libs/type_erasure'
09:04:55 Submodule 'type_index' (https://github.com/boostorg/type_index.git) registered for path 'external/boost/libs/type_index'
09:04:55 Submodule 'type_traits' (https://github.com/boostorg/type_traits.git) registered for path 'external/boost/libs/type_traits'
09:04:55 Submodule 'typeof' (https://github.com/boostorg/typeof.git) registered for path 'external/boost/libs/typeof'
09:04:55 Submodule 'units' (https://github.com/boostorg/units.git) registered for path 'external/boost/libs/units'
09:04:55 Submodule 'unordered' (https://github.com/boostorg/unordered.git) registered for path 'external/boost/libs/unordered'
09:04:55 Submodule 'utility' (https://github.com/boostorg/utility.git) registered for path 'external/boost/libs/utility'
09:04:55 Submodule 'uuid' (https://github.com/boostorg/uuid.git) registered for path 'external/boost/libs/uuid'
09:04:55 Submodule 'variant' (https://github.com/boostorg/variant.git) registered for path 'external/boost/libs/variant'
09:04:55 Submodule 'variant2' (https://github.com/boostorg/variant2.git) registered for path 'external/boost/libs/variant2'
09:04:55 Submodule 'vmd' (https://github.com/boostorg/vmd.git) registered for path 'external/boost/libs/vmd'
09:04:55 Submodule 'wave' (https://github.com/boostorg/wave.git) registered for path 'external/boost/libs/wave'
09:04:55 Submodule 'winapi' (https://github.com/boostorg/winapi.git) registered for path 'external/boost/libs/winapi'
09:04:55 Submodule 'xpressive' (https://github.com/boostorg/xpressive.git) registered for path 'external/boost/libs/xpressive'
09:04:55 Submodule 'yap' (https://github.com/boostorg/yap.git) registered for path 'external/boost/libs/yap'
09:04:55 Submodule 'more' (https://github.com/boostorg/more.git) registered for path 'external/boost/more'
09:04:55 Submodule 'auto_index' (https://github.com/boostorg/auto_index.git) registered for path 'external/boost/tools/auto_index'
09:04:56 Submodule 'bcp' (https://github.com/boostorg/bcp.git) registered for path 'external/boost/tools/bcp'
09:04:56 Submodule 'boost_install' (https://github.com/boostorg/boost_install.git) registered for path 'external/boost/tools/boost_install'
09:04:56 Submodule 'boostbook' (https://github.com/boostorg/boostbook.git) registered for path 'external/boost/tools/boostbook'
09:04:56 Submodule 'boostdep' (https://github.com/boostorg/boostdep.git) registered for path 'external/boost/tools/boostdep'
09:04:56 Submodule 'build' (https://github.com/boostorg/build.git) registered for path 'external/boost/tools/build'
09:04:56 Submodule 'check_build' (https://github.com/boostorg/check_build.git) registered for path 'external/boost/tools/check_build'
09:04:56 Submodule 'cmake' (https://github.com/boostorg/cmake.git) registered for path 'external/boost/tools/cmake'
09:04:56 Submodule 'docca' (https://github.com/boostorg/docca.git) registered for path 'external/boost/tools/docca'
09:04:56 Submodule 'inspect' (https://github.com/boostorg/inspect.git) registered for path 'external/boost/tools/inspect'
09:04:56 Submodule 'litre' (https://github.com/boostorg/litre.git) registered for path 'external/boost/tools/litre'
09:04:56 Submodule 'quickbook' (https://github.com/boostorg/quickbook.git) registered for path 'external/boost/tools/quickbook'
09:04:58 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/accumulators'...
09:05:00 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/algorithm'...
09:05:02 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/align'...
09:05:03 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/any'...
09:05:05 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/array'...
09:05:10 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/asio'...
09:05:12 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/assert'...
09:05:14 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/assign'...
09:05:16 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/atomic'...
09:05:21 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/beast'...
09:05:23 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/bimap'...
09:05:25 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/bind'...
09:05:27 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/callable_traits'...
09:05:29 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/chrono'...
09:05:32 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/circular_buffer'...
09:05:34 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/compatibility'...
09:05:38 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/compute'...
09:05:40 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/concept_check'...
09:05:43 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/config'...
09:05:46 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/container'...
09:05:48 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/container_hash'...
09:05:51 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/context'...
09:05:54 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/contract'...
09:05:56 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/conversion'...
09:05:59 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/convert'...
09:06:01 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/core'...
09:06:03 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/coroutine'...
09:06:05 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/coroutine2'...
09:06:06 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/crc'...
09:06:09 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/date_time'...
09:06:11 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/detail'...
09:06:13 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/dll'...
09:06:15 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/dynamic_bitset'...
09:06:17 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/endian'...
09:06:20 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/exception'...
09:06:23 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/fiber'...
09:06:27 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/filesystem'...
09:06:28 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/flyweight'...
09:06:30 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/foreach'...
09:06:32 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/format'...
09:06:34 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/function'...
09:06:36 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/function_types'...
09:06:38 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/functional'...
09:06:44 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/fusion'...
09:06:56 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/geometry'...
09:07:14 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/gil'...
09:07:20 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/graph'...
09:07:22 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/graph_parallel'...
09:07:34 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/hana'...
09:07:35 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/headers'...
09:07:37 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/heap'...
09:07:40 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/histogram'...
09:07:43 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/hof'...
09:07:46 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/icl'...
09:07:48 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/integer'...
09:07:51 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/interprocess'...
09:07:53 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/intrusive'...
09:07:55 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/io'...
09:07:58 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/iostreams'...
09:08:01 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/iterator'...
09:08:04 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/json'...
09:08:06 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/lambda'...
09:08:10 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/leaf'...
09:08:11 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/lexical_cast'...
09:08:13 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/local_function'...
09:08:15 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/locale'...
09:08:17 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/lockfree'...
09:08:20 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/log'...
09:08:22 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/logic'...
09:08:46 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/math'...
09:08:48 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/metaparse'...
09:08:50 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/move'...
09:08:52 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/mp11'...
09:08:55 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/mpi'...
09:08:58 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/mpl'...
09:09:02 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/msm'...
09:09:04 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/multi_array'...
09:09:07 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/multi_index'...
09:09:19 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/multiprecision'...
09:09:20 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/nowide'...
09:09:22 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/numeric/conversion'...
09:09:24 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/numeric/interval'...
09:09:27 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/numeric/odeint'...
09:09:34 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/numeric/ublas'...
09:09:36 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/optional'...
09:09:43 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/outcome'...
09:09:45 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/parameter'...
09:09:46 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/parameter_python'...
09:09:49 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/phoenix'...
09:09:52 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/poly_collection'...
09:09:54 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/polygon'...
09:09:57 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/pool'...
09:09:59 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/predef'...
09:10:02 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/preprocessor'...
09:10:04 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/process'...
09:10:06 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/program_options'...
09:10:09 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/property_map'...
09:10:11 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/property_tree'...
09:10:13 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/proto'...
09:10:15 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/ptr_container'...
09:10:21 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/python'...
09:10:23 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/qvm'...
09:10:26 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/random'...
09:10:28 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/range'...
09:10:30 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/ratio'...
09:10:32 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/rational'...
09:10:37 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/regex'...
09:10:39 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/safe_numerics'...
09:10:41 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/scope_exit'...
09:10:46 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/serialization'...
09:10:48 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/signals2'...
09:10:51 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/smart_ptr'...
09:10:53 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/sort'...
09:11:11 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/spirit'...
09:11:13 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/stacktrace'...
09:11:15 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/statechart'...
09:11:17 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/static_assert'...
09:11:19 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/static_string'...
09:11:21 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/stl_interfaces'...
09:11:24 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/system'...
09:11:28 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/test'...
09:11:32 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/thread'...
09:11:34 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/throw_exception'...
09:11:36 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/timer'...
09:11:37 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/tokenizer'...
09:11:40 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/tti'...
09:11:41 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/tuple'...
09:11:43 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/type_erasure'...
09:11:45 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/type_index'...
09:11:49 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/type_traits'...
09:11:51 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/typeof'...
09:11:53 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/units'...
09:11:56 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/unordered'...
09:11:58 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/utility'...
09:12:01 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/uuid'...
09:12:03 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/variant'...
09:12:05 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/variant2'...
09:12:07 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/vmd'...
09:12:12 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/wave'...
09:12:14 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/winapi'...
09:12:18 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/xpressive'...
09:12:20 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/libs/yap'...
09:12:22 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/more'...
09:12:27 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/tools/auto_index'...
09:12:29 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/tools/bcp'...
09:12:30 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/tools/boost_install'...
09:12:32 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/tools/boostbook'...
09:12:34 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/tools/boostdep'...
09:12:43 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/tools/build'...
09:12:45 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/tools/check_build'...
09:12:47 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/tools/cmake'...
09:12:48 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/tools/docca'...
09:12:50 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/tools/inspect'...
09:12:53 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/tools/litre'...
09:12:57 Cloning into 'C:/jenkins/builds/LIBRARYFILESAPPSWIN/LibFileSupportTool/external/boost/tools/quickbook'...
09:12:58 fatal: Submodule (accumulators) branch configured to inherit branch from superproject, but the superproject is not on any branch
09:13:01 fatal: Needed a single revision
09:13:01 Unable to find current origin/ revision in submodule path 'libs/accumulators'

missing header in extended_p_square_quantile.hpp

This header uses std::ostringstream without first including <sstream>, resulting in compile errors.
Minimal reproducer:

#include <boost/accumulators/statistics/extended_p_square_quantile.hpp>

int main() {}

Cannot include statistics/rolling_sum.hpp

After boostorg/parameter#21 some Accumulators headers no longer compile. Found via Ceph (source). For one, in statistics/rolling_sum.hpp the error originates from

BOOST_PARAMETER_NESTED_KEYWORD(tag, rolling_window_size, window_size)

CC @CromwellEnage

$ cat >a.cc
#include <boost/accumulators/statistics/rolling_sum.hpp>

$ clang++70 -c a.cc
In file included from a.cc:1:
In file included from /usr/include/boost/accumulators/statistics/rolling_sum.hpp:13:
In file included from /usr/include/boost/accumulators/framework/extractor.hpp:25:
In file included from /usr/include/boost/accumulators/framework/parameters/accumulator.hpp:11:
/usr/include/boost/parameter/keyword.hpp:53:39: error: no type named 'qualifier' in
      'boost::accumulators::tag::rolling_window_size_<0>'
                        typename Tag::qualifier
                        ~~~~~~~~~~~~~~^~~~~~~~~
/usr/include/boost/accumulators/statistics/rolling_window.hpp:30:1: note: in instantiation of template class
      'boost::parameter::keyword<boost::accumulators::tag::rolling_window_size_<0> >' requested here
BOOST_PARAMETER_NESTED_KEYWORD(tag, rolling_window_size, window_size)
^
/usr/include/boost/accumulators/accumulators_fwd.hpp:227:29: note: expanded from macro
      'BOOST_PARAMETER_NESTED_KEYWORD'
        ::boost::parameter::keyword<tag_namespace::name>::get();                                    \
                            ^
In file included from a.cc:1:
In file included from /usr/include/boost/accumulators/statistics/rolling_sum.hpp:13:
In file included from /usr/include/boost/accumulators/framework/extractor.hpp:25:
In file included from /usr/include/boost/accumulators/framework/parameters/accumulator.hpp:11:
/usr/include/boost/parameter/keyword.hpp:83:39: error: no type named 'qualifier' in
      'boost::accumulators::tag::rolling_window_size_<0>'
                        typename Tag::qualifier
                        ~~~~~~~~~~~~~~^~~~~~~~~
/usr/include/boost/parameter/keyword.hpp:109:39: error: no type named 'qualifier' in
      'boost::accumulators::tag::rolling_window_size_<0>'
                        typename Tag::qualifier
                        ~~~~~~~~~~~~~~^~~~~~~~~
/usr/include/boost/parameter/keyword.hpp:139:39: error: no type named 'qualifier' in
      'boost::accumulators::tag::rolling_window_size_<0>'
                        typename Tag::qualifier
                        ~~~~~~~~~~~~~~^~~~~~~~~
/usr/include/boost/parameter/keyword.hpp:184:39: error: no type named 'qualifier' in
      'boost::accumulators::tag::rolling_window_size_<0>'
                        typename Tag::qualifier
                        ~~~~~~~~~~~~~~^~~~~~~~~
/usr/include/boost/parameter/keyword.hpp:214:39: error: no type named 'qualifier' in
      'boost::accumulators::tag::rolling_window_size_<0>'
                        typename Tag::qualifier
                        ~~~~~~~~~~~~~~^~~~~~~~~
/usr/include/boost/parameter/keyword.hpp:243:39: error: no type named 'qualifier' in
      'boost::accumulators::tag::rolling_window_size_<0>'
                        typename Tag::qualifier
                        ~~~~~~~~~~~~~~^~~~~~~~~
/usr/include/boost/parameter/keyword.hpp:273:39: error: no type named 'qualifier' in
      'boost::accumulators::tag::rolling_window_size_<0>'
                        typename Tag::qualifier
                        ~~~~~~~~~~~~~~^~~~~~~~~
8 errors generated.

issue with rolling mean

Hi All,
This is reiteration of the old stackoverflow question. Rolling mean seems not working correctly with unsigned integers. My system: Mac OS, High Sierra, the latest brew updates.

// g++ -std=c++11 -o accum_test accum_test.cpp
Sample file is attached.
accum_test.txt

OUTPUT:

***** Signed integers *****
9 actualMean: 9.0000000000000000
8 actualMean: 8.5000000000000000
7 actualMean: 8.0000000000000000
5 actualMean: 7.2500000000000000
6 actualMean: 7.0000000000000000
4 actualMean: 6.0000000000000000
3 actualMean: 5.0000000000000000
2 actualMean: 4.0000000000000000
1 actualMean: 3.2000000000000002
0 actualMean: 2.0000000000000000
0 actualMean: 1.2000000000000000
0 actualMean: 0.6000000000000000
0 actualMean: 0.2000000000000000
0 actualMean: -0.0000000000000001
0 actualMean: -0.0000000000000001
0 actualMean: -0.0000000000000001

***** Unsigned integers *****
9 actualMean: 9.0000000000000000
8 actualMean: 8.5000000000000000
7 actualMean: 8.0000000000000000
5 actualMean: 7.2500000000000000
6 actualMean: 7.0000000000000000
4 actualMean: 858993465.2000000476837158
3 actualMean: 1717986923.4000000953674316
2 actualMean: 2576980381.6000003814697266
1 actualMean: 3435973840.0000004768371582
0 actualMean: 4294967298.0000000000000000
0 actualMean: 5153960756.3999996185302734
0 actualMean: 6012954215.0000000000000000
0 actualMean: 6871947673.8000001907348633
0 actualMean: 7730941132.8000001907348633
0 actualMean: 7730941132.8000001907348633
0 actualMean: 7730941132.8000001907348633

boost/accumulators/statistics/density.hpp does not compile

The file <boost/accumulators/statistics/density.hpp> does not compile, in origin/develop (1b1995f):

[lrineau@bonnard]~/Git/boost/libs/accumulators% g++ -I ../../install/include -fsyntax-only -xc++ include/boost/ac[lrineau@bonnard]~/Git/boost/libs/accumulators% g++ -I ../../install/include -fsyntax-only -xc++ include/boost/accumulators/statistics/density.hpp
In file included from include/boost/accumulators/statistics/density.hpp:16:
../../install/include/boost/parameter/keyword.hpp: In instantiation of ‘struct boost::parameter::keyword<boost::accumulators::tag::density_cache_size_<> >’:
include/boost/accumulators/statistics/density.hpp:35:1:   required from here
../../install/include/boost/parameter/keyword.hpp:99:13: error: no type named ‘qualifier’ in ‘struct boost::accumulators::tag::density_cache_size_<>’
             operator=(T const& x) const
             ^~~~~~~~

Cc @CromwellEnage It is related to the new Boost Parameter library.

Quadratic quantile interpolator does not guarantee continuity

In [weighted_][extended_]p_square.hpp, the p-square algorithm (an online - in the sense that it doesn't require storing all samples - quantile estimator) is implemented. Additionally:

  • a weighted version (that is, incoming samples are given a weight) is provided
  • an extended version (which allows the estimation of several quantiles) is provided.

The extended version also introduces the ability to use interpolation:

  • Suppose an accumulator set for [weighted_]extended_p_square_quantile is instantiated with requested quantiles {0.001, 0.2, 0.5, 0.8, 0.999}
  • Internally, the accumulator set (implementing the p-square algorithm) actually estimates the following quantiles: {0, 0.0005, 0.001, ~0.1, 0.2, 0.35, 0.5, 0.65, 0.8, ~0.9, 0.999, 1} where quantiles 0 (resp. 1) corresponds to the min (resp. max) value seen, and values not present in requested quantiles are mid-points between requested quantiles.
  • Independently from this implementation detail, the boost::accumulators::quantile method can be used with this accumulator set to extract a desired quantile estimate.
  • If this desired quantile corresponds to a requested quantile, it is obviously directly returned.
  • If not, then depending on the accumulator set's constructor's parameters, a linear or quadratic interpolation is provided.

Unfortunately, the choice of the quadratic interpolator polynomial introduces "jumps" in the estimated quantile function.

In extended_p_square_quantile.hpp (currently line 154),
if ( (dist == 1 || *iter_probs - this->probability <= this->probability - *(iter_probs - 1) ) && dist != this->probabilities.size() - 1 ) will switch to a different polynomial around the mid-points of requested quantiles (excluding first and last mid-points).

This creates situations where $\exists \; 0 &lt; i &lt; 1, \exists \; \eta, \; \forall \; \epsilon, \; \hat{q}(i + \epsilon) - \hat{q}(i) &gt; \eta$. In other words, $\hat{q}(i + \epsilon)$ will not converge to $\hat{q}(i)$ when $\epsilon$ goes to 0, and there is a discontinuity or "jump" in the quantile function.

To illustrate this claim, the programs MWE(3_)4.{cpp,py} do the following:

  • Instanciate an accumulator_set of type weighted_extended_p_square_quantile with quadratic interpolation and give it quantiles to track {0.7, 0.8, 0.95, 0.99, 0.999, 0.9999}.
  • Do 10000 times:
    • Draw a sample from standard normal distribution $\mathcal{N}(0, 1)$.
    • Estimate quantiles {0.874999, 0.875}.
  • Plot the estimates: estimates should obviously be very close one another if the estimated quantile function is continuous. However 0.875 lies between 0.8 and 0.95 where the quadratic interpolation polynomial changes from using {0.7, 0.8, 0.95} to using {0.8, 0.95, 0.99} according to the rule linked above.

MWE4

Note also that this discontinuity is "on the wrong side", i.e. similar to issue #62, we get that $\hat{q}(0.874999) &gt; \hat{q}(0.875)$.

Since this makes no mathematical sense, I would either issue a strong warning at instantiation or deprecate this interpolator (see also issue #62). If an additional interpolator (w.r.t. the linear one) is needed, I would suggest looking into integrating splines which are continuous by design (see e.g. https://github.com/ttk592/spline/).

Notes:

  • Program MWE4 can be compiled e.g. via: g++ -I$BOOST_INCLUDE_PATH MWE4.cpp -o MWE4
  • Data is generated via MWE4 > data4.csv
  • Plots are generated via python3 MWE3_4.py 4
  • MWE3_4.py requires matplotlib and pandas

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.