Deming's funnel: Difference between revisions

Updated D entry
(GP work-in-progress)
(Updated D entry)
Line 24:
<lang d>import std.stdio, std.math, std.algorithm, std.range, std.typecons;
 
auto mean(T)(in T[] xs) /*pure*/ {
alias sum = reduce!q{a + b};
 
auto mean(T)(in T[] xs) pure {
return xs.sum / xs.length;
}
 
auto stdDev(T)(in T[] xs) /*pure*/ {
immutable m = xs.mean;
return sqrt(xs.map!(x => (x - m) ^^ 2).sum / xs.length);
Line 37 ⟶ 35:
alias TF = double function(in double, in double) pure nothrow;
 
auto funnel(T)(in T[] dxs, in T[] dys, in TF rule) {
T x = 0, y = 0;
immutable(T)[] rxs, rys;
 
foreach (const dx, const dy; zip(dxs, dys)) {
immutable rx = x + dx;
immutable ry = y + dy;
x = rule(x, dx);
y = rule(y, dy);
rxs ~= rx;
rys ~= ry;
}
 
return tuple(rxs, rys);
}
 
void experiment(T)(in string label,
in T[] dxs, in T[] dys, in TF rule) {
//immutable (rxs, rys) = funnel(dxs, dys, rule);
immutable rysrs = funnel(dxs, dys, rule);
label.writeln;
writefln("Mean x, y: %.4f, %.4f", rxsrs[0].mean, rysrs[1].mean);
writefln("Std dev x, y: %.4f, %.4f", rxsrs[0].stdDev, rysrs[1].stdDev);
writeln;
}