float GetSortStat(PartyAdvantageStats a) { switch (sortBy) { case SortBy.AverageAdvantage: return(a.average); case SortBy.MinAdvantage: return(a.min); case SortBy.MaxAdvantage: return(a.max); case SortBy.BeatenByCount: return(a.predatorCount); case SortBy.BeatsCount: return(a.preyCount); case SortBy.FairCount: return(a.fairCount); default: return(0); } }
int Compare(PartyAdvantageStats a, PartyAdvantageStats b) { int result = GetSortStat(a).CompareTo(GetSortStat(b)); return(ascending ? result : -result); }
private IEnumerator Start() { statusText.text = "Initializing..."; yield return(null); var battlers = TestAllPartyBattles(out short[,,] winLossCounts); int banked = 0; while (battlers.Count > 0) { yield return(null); int progress = banked; for (int i = 0; i < battlers.Count; i++) { progress += battlers[i].progress; if (!battlers[i].thread.IsAlive) { banked += battlers[i].progress; battlers[i].thread.Join(); battlers[i] = null; } } battlers.RemoveAll(b => b == null); statusText.text = $"Evaluating match ups... {progress}/{_allParties.Length}"; } battlers = null; statusText.text = "Computing advantages..."; yield return(null); advantages = new float[_allParties.Length, _allParties.Length]; float denominator = 0.5f / MATCHES_PER_PAIR; _stats = new List <PartyAdvantageStats>(); for (int i = 0; i < _allParties.Length; i++) { PartyAdvantageStats stats = default; stats.partyID = (short)i; float advantage = 0f; for (int j = 0; j < _allParties.Length; j++) { if (i != j) { advantage = (winLossCounts[i, j, 0] - winLossCounts[i, j, 1] + winLossCounts[j, i, 1] - winLossCounts[j, i, 0]) * denominator; } advantages[i, j] = advantage; stats.total += advantage; stats.max = Mathf.Max(stats.max, advantage); stats.min = Mathf.Min(stats.min, advantage); if (Mathf.Approximately(advantage, 0)) { stats.fairCount++; } else if (advantage > 0) { stats.preyCount++; } else { stats.predatorCount++; } } stats.average = stats.total / _allParties.Length; _stats.Add(stats); } statusText.text = "Tallying stats..."; yield return(null); OnValidate(); statusText.text = "Top sorted parties:"; }