import std.array; import std.math; import std.random; import std.stdio; import dregs.algorithms.avg; import dregs.algorithms.yzlm; void main() { Rating[] ratings; double[] reputationObject, reputationUser; double[] objectQuality, userError; Mt19937 rng; auto aa = new AvgArithmetic; auto yzlm = new Yzlm(0.8,1e-12,1e-36); rng.seed(1001); reputationObject.length = 1000; reputationUser.length = 1000; objectQuality.length = reputationObject.length; userError.length = reputationUser.length; ratings.reserve(reputationObject.length * reputationUser.length); foreach(uint i;0..100) { foreach(ref double Q; objectQuality) Q = uniform(0.0L, 10.0L, rng); foreach(ref double sigma2; userError) sigma2 = uniform(0.0L, 1.0L, rng); ratings.length = 0; assumeSafeAppend(ratings); auto ratingsAppend = appender(&ratings); foreach(uint object, double Q; objectQuality) { foreach(uint user, double sigma2; userError) { double v = uniform( (Q-sigma2), (Q+sigma2), rng ); Rating r = { user, object, v }; ratingsAppend.put(r); } } writefln("We now have %u ratings.",ratings.length); aa(ratings,reputationUser,reputationObject); yzlm(ratings,reputationUser,reputationObject); double deltaQ = 0; foreach(uint object, double r; reputationObject) deltaQ += pow( (r-objectQuality[object]), 2); deltaQ = sqrt(deltaQ/reputationObject.length); writefln("[%u] Error in quality estimate: %g",i,deltaQ); } }