module dregs.algorithms.avg; public import dregs.core; class AvgWeighted : ReputationAlgorithm { double[] weightSum; void opCall(ref Rating[] ratings, ref double[] reputationUser, ref double[] reputationObject) { weightSum.length = reputationObject.length; weightSum[] = 0; reputationObject[] = 0; foreach(Rating r; ratings) { reputationObject[r.object] += reputationUser[r.user]*r.value; weightSum[r.object] += reputationUser[r.user]; } foreach(uint o, ref double r; reputationObject) r /= weightSum[o]; } this() {} this(ref Rating[] ratings, ref double[] reputationUser, ref double[] reputationObject) { opCall(ratings,reputationUser,reputationObject); } } class AvgArithmetic : AvgWeighted { void opCall(ref Rating[] ratings, ref double[] reputationUser, ref double[] reputationObject) { reputationUser[] = 1; super.opCall(ratings,reputationUser,reputationObject); } this() {} this(ref Rating[] ratings, ref double[] reputationUser, ref double[] reputationObject) { opCall(ratings,reputationUser,reputationObject); } }