Section: 29.6.8.6.2 [rand.dist.samp.pconst] Status: Resolved Submitter: Daniel Krügler Opened: 2008-08-22 Last modified: 2016-02-10
Priority: Not Prioritized
View all other issues in [rand.dist.samp.pconst].
View all issues with Resolved status.
Discussion:
During the Sophia Antipolis meeting it was decided to separate from 794 a subrequest that adds initializer list support to piecewise_constant_distribution, specifically, the issue proposed to add a c'tor taking a initializer_list<double> and a Callable to evaluate weight values. For consistency with the remainder of this class and the remainder of the initializer_list-aware library the author decided to change the list argument type to the template parameter RealType instead. For the reasoning to use Func instead of Func&& as c'tor function argument see issue 793.
Proposed resolution:
Non-concept version of the proposed resolution
In 29.6.8.6.2 [rand.dist.samp.pconst]/1, class piecewise_constant_distribution, just before the member declaration
explicit piecewise_constant_distribution(const param_type& parm);
insert
template<typename Func> piecewise_constant_distribution(initializer_list<RealType> bl, Func fw);
Between p.4 and p.5 of the same section insert a series of new paragraphs nominated below as [p5_1], [p5_2], and [p5_3] as part of the new member description:
template<typename Func> piecewise_constant_distribution(initializer_list<RealType> bl, Func fw);[p5_1] Complexity: Exactly nf = max(bl.size(), 1) - 1 invocations of fw.
[p5_2] Requires:
- fw shall be callable with one argument of type RealType, and shall return values of a type convertible to double;
- The relation 0 < S = w_{0}+. . .+w_{n-1} shall hold. For all sampled values x_{k} defined below, fw(x_{k}) shall return a weight value w_{k} that is non-negative, non-NaN, and non-infinity;
- If nf > 0 let b_{k} = *(bl.begin() + k), k = 0, . . . , bl.size()-1 and the following relations shall hold for k = 0, . . . , nf-1: b_{k} < b_{k+1}.
[p5_3] Effects:
If nf == 0,
- lets the sequence w have length n = 1 and consist of the single value w_{0} = 1, and
- lets the sequence b have length n+1 with b_{0} = 0 and b_{1} = 1.
Otherwise,
- sets n = nf, and [bl.begin(), bl.end()) shall form the sequence b of length n+1, and
lets the sequences w have length n and for each k = 0, . . . ,n-1, calculates:
x_{k} = 0.5*(b_{k+1} + b_{k}) w_{k} = fw(x_{k})
Constructs a piecewise_constant_distribution object with the above computed sequence b as the interval boundaries and with the probability densities:
ρ_{k} = w_{k}/(S * (b_{k+1} - b_{k})) for k = 0, . . . , n-1.
Concept version of the proposed resolution
In 29.6.8.6.2 [rand.dist.samp.pconst]/1, class piecewise_constant_distribution, just before the member declaration
explicit piecewise_constant_distribution(const param_type& parm);
insert
template<Callable<auto, RealType> Func> requires Convertible<Func::result_type, double> piecewise_constant_distribution(initializer_list<RealType> bl, Func fw);
Between p.4 and p.5 of the same section insert a series of new paragraphs nominated below as [p5_1], [p5_2], and [p5_3] as part of the new member description:
template<Callable<auto, RealType> Func> requires Convertible<Func::result_type, double> piecewise_constant_distribution(initializer_list<RealType> bl, Func fw);[p5_1] Complexity: Exactly nf = max(bl.size(), 1) - 1 invocations of fw.
[p5_2] Requires:
- The relation 0 < S = w_{0}+. . .+w_{n-1} shall hold. For all sampled values x_{k} defined below, fw(x_{k}) shall return a weight value w_{k} that is non-negative, non-NaN, and non-infinity;
- If nf > 0 let b_{k} = *(bl.begin() + k), k = 0, . . . , bl.size()-1 and the following relations shall hold for k = 0, . . . , nf-1: b_{k} < b_{k+1}.
[p5_3] Effects:
If nf == 0,
- lets the sequence w have length n = 1 and consist of the single value w_{0} = 1, and
- lets the sequence b have length n+1 with b_{0} = 0 and b_{1} = 1.
Otherwise,
- sets n = nf, and [bl.begin(), bl.end()) shall form the sequence b of length n+1, and
lets the sequences w have length n and for each k = 0, . . . ,n-1, calculates:
x_{k} = 0.5*(b_{k+1} + b_{k}) w_{k} = fw(x_{k})
Constructs a piecewise_constant_distribution object with the above computed sequence b as the interval boundaries and with the probability densities:
ρ_{k} = w_{k}/(S * (b_{k+1} - b_{k})) for k = 0, . . . , n-1.
Rationale:
Addressed by N2836 "Wording Tweaks for Concept-enabled Random Number Generation in C++0X".