Opened 12 years ago

Closed 12 years ago

#4730 closed Bugs (worksforme)

Limited number of tagged arguments in the accumulator_set constructor ?

Reported by: AdrienTodeschini <adrien.todeschini@…> Owned by: Eric Niebler
Milestone: To Be Determined Component: accumulator
Version: Boost 1.40.0 Severity: Problem
Keywords: Cc: eric@…

Description

It seems that we can't use more than 4 tagged arguments in the accumulator_set constructor. Here is an example code to demonstrate my remark :

  using namespace std;
  using namespace boost::accumulators;

  typedef accumulator_set<int, features<tag::weighted_mean,
      tag::weighted_density,
      tag::weighted_p_square_cumulative_distribution,
      tag::weighted_extended_p_square>,
      double> AccType1;

  typedef accumulator_set<int, features<tag::weighted_mean,
      tag::weighted_density,
      tag::weighted_p_square_cumulative_distribution>,
      double> AccType2;

  typedef accumulator_set<int, features<tag::weighted_mean,
      tag::weighted_density,
      tag::weighted_extended_p_square>,
      double> AccType3;

  double probs[] = {0.01,0.05, 0.25, 0.33, 0.5, 0.67, 0.75, 0.95, 0.99};
  vector<double> q_probs(probs, probs + sizeof(probs) / sizeof(double));

  AccType1 acc1(tag::weighted_density::cache_size = 10,
      tag::weighted_density::num_bins = 10,
      tag::weighted_extended_p_square::probabilities = q_probs,
      tag::weighted_p_square_cumulative_distribution::num_cells = 10);
  // compiles (4 tagged arguments)

  AccType1 acc2(sample = 42, tag::weighted_density::cache_size = 10,
      tag::weighted_density::num_bins = 10,
      tag::weighted_extended_p_square::probabilities = q_probs,
      tag::weighted_p_square_cumulative_distribution::num_cells = 10);
  // Error : does not compile (5 tagged arguments)

  AccType2 acc3(sample = 42, tag::weighted_density::cache_size = 10,
      tag::weighted_density::num_bins = 10,
      tag::weighted_p_square_cumulative_distribution::num_cells = 10);
  // compiles (4 tagged arguments)

  AccType3 acc4(sample = 42, tag::weighted_density::cache_size = 10,
      tag::weighted_density::num_bins = 10,
      tag::weighted_extended_p_square::probabilities = q_probs);
  // compiles (4 tagged arguments)

Moreover, I tried

#define BOOST_PARAMETER_MAX_ARITY 10

but it does not solve the problem.

The error message from GCC 4.4.3 compiler is :

In file included from /usr/include/boost/accumulators/accumulators.hpp:12,
                from <my_path>/sandbox.hpp:13,
                from ../BiipsTest.cpp:11:
/usr/include/boost/accumulators/framework/accumulator_set.hpp: In
constructor ‘boost::accumulators::accumulator_set<Sample, Features,
Weight>::accumulator_set(const A0&, const A1&, const A2&, const A3&,
const A4&) [with A0 =
boost::parameter::aux::tagged_argument<boost::accumulators::tag::sample,
const int>, A1 =
boost::parameter::aux::tagged_argument<boost::accumulators::tag::density_cache_size_<0>,
const int>, A2 =
boost::parameter::aux::tagged_argument<boost::accumulators::tag::density_num_bins_<0>,
const int>, A3 =
boost::parameter::aux::tagged_argument<boost::accumulators::tag::extended_p_square_probabilities_<0>,
std::vector<double, std::allocator<double> > >, A4 =
boost::parameter::aux::tagged_argument<boost::accumulators::tag::p_square_cumulative_distribution_num_cells_<0>,
const int>, Sample = int, Features =
boost::accumulators::features<boost::accumulators::tag::weighted_mean,
boost::accumulators::tag::weighted_density,
boost::accumulators::tag::weighted_p_square_cumulative_distribution,
boost::accumulators::tag::weighted_extended_p_square, 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 = double]’:
<my_path>/sandbox.hpp:90:   instantiated from here
/usr/include/boost/accumulators/framework/accumulator_set.hpp:200:
error: no match for call to
‘(boost::accumulators::detail::accumulator_params)
(boost::accumulators::accumulator_set<int,
boost::accumulators::features<boost::accumulators::tag::weighted_mean,
boost::accumulators::tag::weighted_density,
boost::accumulators::tag::weighted_p_square_cumulative_distribution,
boost::accumulators::tag::weighted_extended_p_square, 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>, double>&, const
boost::parameter::aux::tagged_argument<boost::accumulators::tag::sample,
const int>&, const
boost::parameter::aux::tagged_argument<boost::accumulators::tag::density_cache_size_<0>,
const int>&, const
boost::parameter::aux::tagged_argument<boost::accumulators::tag::density_num_bins_<0>,
const int>&, const
boost::parameter::aux::tagged_argument<boost::accumulators::tag::extended_p_square_probabilities_<0>,
std::vector<double, std::allocator<double> > >&, const
boost::parameter::aux::tagged_argument<boost::accumulators::tag::p_square_cumulative_distribution_num_cells_<0>,
const int>&)’
/usr/include/boost/parameter/parameters.hpp:841: note: candidates are:
boost::parameter::aux::empty_arg_list
boost::parameter::parameters<PS0, PS1, PS2, PS3, PS4>::operator()()
const [with PS0 =
boost::parameter::required<boost::accumulators::tag::accumulator,
boost::parameter::aux::use_default>, PS1 =
boost::parameter::optional<boost::accumulators::tag::sample,
boost::parameter::aux::use_default>, PS2 = boost::parameter::void_,
PS3 = boost::parameter::void_, PS4 = boost::parameter::void_]

Change History (1)

comment:1 by Steven Watanabe, 12 years ago

Resolution: worksforme
Status: newclosed

Your code compiles for me with MSVC 2010 and the current trunk (revision 71033) after I add

#define BOOST_PARAMETER_MAX_ARITY 10

I don't think anything has changed in Boost that would affect this. Please note that BOOST_PARAMETER_MAX_ARITY needs to be #defined before any Boost.Parameter headers are #included.

Note: See TracTickets for help on using tickets.