public override Multiset <long> SampleElectorate(int voteCount) { var prefInfo = PreferenceInformation.InferPreferences(districts[districtIndex]); districtIndex++; double swap2 = Rand.NextDouble() * MaxChanceSwap2; double swap3 = Math.Min(Rand.NextDouble() * MaxChanceSwap3, swap2); var evolved = prefInfo.Evolve(swap2, swap3); var result = evolved.ToMultiset(voteCount); return(result); }
public static PreferenceFile FromStream(Stream strm) { var result = new PreferenceFile(); var csv = CSVReader.ReadFromStream(strm).ToList(); var headerRow = csv[0]; var current = headerRow.IndexOf("CURRENT"); var prev = headerRow.IndexOf("PREVIOUS"); var weight = headerRow.IndexOf("WEIGHT"); var parties = headerRow.ToList(); parties.Remove("CURRENT"); parties.Remove("PREVIOUS"); parties.Remove("WEIGHT"); result.partyNames = parties; var partiesIndex = (from x in parties select headerRow.IndexOf(x)).ToList(); for (int i = 1; i < csv.Count; i++) { var row = csv[i]; List <double> rawScores = new List <double>(); for (int j = 0; j < parties.Count; j++) { rawScores.Add(double.Parse(row[partiesIndex[j]])); } var actualVote = parties.IndexOf(row[current]); var prevVote = parties.IndexOf(row[prev]); if (row[weight].Trim() == string.Empty) { continue; } var currentWeight = double.Parse(row[weight]); var indicies = DiscreteMath.GetIntList(parties.Count); var preferenceOrder = (from x in indicies orderby(actualVote == x ? 1 : 0) descending, rawScores[x] descending, Rand.NextDouble() descending select x).ToList(); var secondPreference = preferenceOrder[1]; var thirdPreference = preferenceOrder[2]; var info = new PreferenceInformation(); info.FirstIndex = actualVote; info.SecondIndex = secondPreference; info.ThirdIndex = thirdPreference; info.Weight = currentWeight; result.preferenceInformation.Add(info); } return(result); }