private void CalculateProcessAuthorshipScore(Process process, Player author) { if (process.Author.Equals(author.Username)) { #region Expected number of activities (Poisson Distribution) float poissonFactor = (float)(process.score * CalculateModPoissonValue(process.CalculateNumberActivities(), int.Parse(PaintServerPanels.ExpectedNumActivities))); author.bonusMalus[0] += poissonFactor; process.bonusMalus[0] = poissonFactor; #endregion #region Quality voting float votingFactor = 0; if (process.QualityVotes.Count == 0) votingFactor = 0; else if (process.posVotes > process.negVotes) votingFactor = process.score*(((float)process.posVotes/process.QualityVotes.Count)/4); else votingFactor = -process.score*(((float)process.negVotes/process.QualityVotes.Count)/4); author.bonusMalus[0] += votingFactor; process.bonusMalus[1] = votingFactor; #endregion #region Process marked as a duplicate float duplicationFactor = 0; if (process.markedDuplication && (process.posDuplicationVotes > process.negDuplicationVotes)) duplicationFactor = - process.score*0.25f; else if (process.markedDuplication && (process.posDuplicationVotes < process.negDuplicationVotes)) duplicationFactor = process.score*0.1f; author.bonusMalus[0] += duplicationFactor; process.bonusMalus[2] = duplicationFactor; #endregion #region Best Percentage of Positive Votes (PPV) in process tree int PVID = 0; float bestPPV = 0f; float bestVoteRateFactor = 0; foreach (ProcessVersion version in process.Versions) if (version.QualityVotes.Count != 0 && (version.posVotes/version.QualityVotes.Count) > bestPPV) { bestPPV = version.posVotes/version.QualityVotes.Count; PVID = version.PVID; } if (PVID == 0) bestVoteRateFactor = process.score*0.1f; else bestVoteRateFactor = - process.score*0.05f; author.bonusMalus[0] += bestVoteRateFactor; process.bonusMalus[3] = bestVoteRateFactor; #endregion } }