private static List <Relative> AddDescendantRelationship(List <Relative> relativesList, int relativeNumber, int coordX, int coordY, bool isFirstIteration, bool isLastIteration, bool descendantOfProband, double probabilityOfNotCreatingNewRelative) { if (isFirstIteration) { if (relativesList[0].ChildsList.Count != 0 && random.NextDouble() <= probabilityOfNotCreatingNewRelative) { relativesList.Add(relativesList[0].ChildsList[GetNextRandomValue(0, relativesList[0].ChildsList.Count)]); } else { relativesList.Add(new Relative( relativeNumber, RelationshipDegreesDictionary[RelationshipDegreesDictionary.First(x => x.Value.X == coordX && x.Value.Y == coordY).Key], new List <Relative>(), new List <Relative>())); relativesList[relativesList.Count - 1].ParentsList.Add(relativesList[0]); relativesList[0].ChildsList.Add(relativesList[relativesList.Count - 1]); } } else { List <Relative> cleanChildsList = relativesList[relativesList.Count - 1].ChildsList.Where(child => child.RelationshipDegree.X != 0).ToList(); if (((descendantOfProband && relativesList[relativesList.Count - 1].ChildsList.Count != 0) || (!descendantOfProband && cleanChildsList.Count != 0)) && random.NextDouble() <= probabilityOfNotCreatingNewRelative && !isLastIteration) { if (descendantOfProband) { relativesList.Add(relativesList[relativesList.Count - 1].ChildsList[GetNextRandomValue(0, relativesList[relativesList.Count - 1].ChildsList.Count)]); } else { relativesList.Add(cleanChildsList[GetNextRandomValue(0, cleanChildsList.Count)]); } } else { relativesList.Add(new Relative( relativeNumber, RelationshipDegreesDictionary[RelationshipDegreesDictionary.First(x => x.Value.X == coordX && x.Value.Y == coordY).Key], new List <Relative>(), new List <Relative>())); relativesList[relativesList.Count - 1].ParentsList.Add(relativesList[relativesList.Count - 2]); relativesList[relativesList.Count - 2].ChildsList.Add(relativesList[relativesList.Count - 1]); } } return(relativesList); }
public static List <Relative> AddParentalRelationship(List <Relative> relativesList, int relativeNumber, int coordX, int coordY, bool isFirstIteration, bool isLastIteration, double probabilityOfNotCreatingNewRelative) { if (isFirstIteration) { if (relativesList[0].ParentsList.Count != 0 && random.NextDouble() <= probabilityOfNotCreatingNewRelative) { relativesList.Add(relativesList[0].ParentsList[GetNextRandomValue(0, relativesList[0].ParentsList.Count)]); } else { relativesList.Add(new Relative( relativeNumber, RelationshipDegreesDictionary[RelationshipDegreesDictionary.First(x => x.Value.X == coordX && x.Value.Y == coordY).Key], new List <Relative>(), new List <Relative>())); relativesList[0].ParentsList.Add(relativesList[relativesList.Count - 1]); relativesList[relativesList.Count - 1].ChildsList.Add(relativesList[0]); } } else { if (relativesList[relativesList.Count - 1].ParentsList.Count != 0 && random.NextDouble() <= probabilityOfNotCreatingNewRelative && !isLastIteration) { relativesList.Add(relativesList[relativesList.Count - 1].ParentsList[GetNextRandomValue(0, relativesList[relativesList.Count - 1].ParentsList.Count)]); } else { relativesList.Add(new Relative( relativeNumber, RelationshipDegreesDictionary[RelationshipDegreesDictionary.First(x => x.Value.X == coordX && x.Value.Y == coordY).Key], new List <Relative>(), new List <Relative>())); relativesList[relativesList.Count - 2].ParentsList.Add(relativesList[relativesList.Count - 1]); relativesList[relativesList.Count - 1].ChildsList.Add(relativesList[relativesList.Count - 2]); } } return(relativesList); }