private static int[] ChooseFemaleFathers(SimParams par, Population pop, int[] vacant, List <int> notVacant, int[] maleFathers) { /*Picks fathers to sire chicks into vacancies, * Uses only living males. * It is likely for high quality males to sire multiple * offspring in one sim step for both local and global scopes*/ //Remove songless birds from notVacant, and mark all not in that list as unavailable HashSet <int> PotentialFathersTemp = new HashSet <int>(notVacant.Where(x => pop.SyllableRepertoire[x] > 0)); HashSet <int> Unavailable = new HashSet <int>(Enumerable.Range(0, par.NumBirds)); Unavailable.ExceptWith(PotentialFathersTemp); //Get the probabilities List <int> PotentialFathers = PotentialFathersTemp.ToList(); float[] Probability = Enumerable.Repeat(0f, par.NumBirds).ToArray(); float[] Probs = ReproductiveProbability(par, pop, PotentialFathers); for (int i = 0; i < PotentialFathers.Count; i++) { Probability[PotentialFathers[i]] = Probs[i]; } //pick fathers int[] Fathers = new int[vacant.Length]; HashSet <int> UnavailableNoMateFather; if (par.LocalBreeding) { for (int i = 0; i < Fathers.Length; i++) { UnavailableNoMateFather = Unavailable; UnavailableNoMateFather.Remove(maleFathers[i]); Fathers[i] = Locations.GetLocalBirds(par, pop, vacant[i], UnavailableNoMateFather, probs: Probability)[0]; } } else { float[] PotenProbs = new float[PotentialFathers.Count]; for (int i = 0; i < PotenProbs.Length; i++) { PotenProbs[i] = Probability[PotentialFathers[i]]; } float[] PotenProbsTemp; //List<int> PotentialFathersNoMateFather; for (int i = 0; i < vacant.Length; i++) { //PotentialFathersNoMateFather = PotentialFathers.ToList(); //PotentialFathersNoMateFather.Remove(MaleFathers[i]); PotenProbsTemp = PotenProbs.ToArray(); PotenProbsTemp[maleFathers[i]] = 0; /*for(int j=0;j<PotenProbs.Length;j++){ * PotenProbs[j] = Probability[PotentialFathers[j]]; * }*/ Fathers[i] = PotentialFathers[par.RandomSampleUnequal(PotenProbsTemp, 1, true)[0]]; } } return(Fathers); }