private static RelationshipDegree GetTrueRelationshipDegree(Relative zeroRelative, Relative firstRelative, List <RelationshipDegree> possibleRelationshipDegreesList) { RelationshipDegree trueRelationshipDegree = null; foreach (RelationshipDegree possibleRelationshipDegree in possibleRelationshipDegreesList) { if (possibleRelationshipDegree.RelationshipDegreeNumber == 0) { trueRelationshipDegree = possibleRelationshipDegree; } else { if (AncestorList.Contains(possibleRelationshipDegree.RelationshipDegreeNumber)) { int yDistanceToMRCA = possibleRelationshipDegree.Y; List <Relative> parentsList = GetParentsListInSelectedGeneration(zeroRelative, yDistanceToMRCA); if (parentsList.Contains(firstRelative)) { trueRelationshipDegree = possibleRelationshipDegree; break; } } else if (DescendantsList.Contains(possibleRelationshipDegree.RelationshipDegreeNumber)) { int yDistanceToMRCA = possibleRelationshipDegree.Y; List <Relative> childsList = GetChildsListInSelectedGeneration(zeroRelative, yDistanceToMRCA); if (childsList.Contains(firstRelative)) { trueRelationshipDegree = possibleRelationshipDegree; break; } } else { int yDistanceToMRCAFromZeroPerson = possibleRelationshipDegree.X; List <Relative> parentsListOfZeroPerson = GetParentsListInSelectedGeneration(zeroRelative, yDistanceToMRCAFromZeroPerson); int yDistanceToMRCAFromFirstPerson = possibleRelationshipDegree.X - possibleRelationshipDegree.Y; List <Relative> parentsListOfFirstPerson = GetParentsListInSelectedGeneration(firstRelative, yDistanceToMRCAFromFirstPerson); if (parentsListOfZeroPerson.Intersect(parentsListOfFirstPerson).ToList().Count > 0) { trueRelationshipDegree = possibleRelationshipDegree; break; } } } } return(trueRelationshipDegree); }
/* * Проверка того, что число предков исследуемого лица не равно нулю. */ public static bool IsNumberOfAncestorsNotZero(float[][] generatedOutputMatrix, List <int> persons, int person, List <int> relatives, int relative) { bool numberOfAncestorsNotZero = false; numberOfAncestorsNotZero = (from prevPerson in Enumerable.Range(1, person - 1) where AncestorList.Contains((int)generatedOutputMatrix[persons[prevPerson]][relatives[relative]]) && 0 != generatedOutputMatrix[persons[prevPerson]][persons[person]] select prevPerson).Any(); return(numberOfAncestorsNotZero); }
/* * Проверка того, что число данных степеней родства у данного лица уже максимально. */ public static bool IsCountOfRelativesOfThisTypeAlreadyMax(float[][] generatedOutputMatrix, List <int> relatives, int relative, int[][] ancestorsCurrentCountMatrix) { bool countOfRelativesOfThisTypeAlreadyMax = false; if (AncestorList.Contains((int)generatedOutputMatrix[0][relatives[relative]])) { countOfRelativesOfThisTypeAlreadyMax = (from i in Enumerable.Range(0, AncestorList.Count) where AncestorList[i] == (int)generatedOutputMatrix[0][relatives[relative]] where RelationshipDegreesDictionary[AncestorList[i]].RelationshipMaxCount == ancestorsCurrentCountMatrix[0][i] select i).Any(); } return(countOfRelativesOfThisTypeAlreadyMax); }