diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index d08aa5c..8bef9c4 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -689,27 +689,26 @@ public class DlibDotNet private void MapLogic(string argZero, Container[] containers, long ticks, string dResultsFullGroupDirectory, string zResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, MapLogic mapLogic, string outputResolution) { + string dFacesContentDirectory = Path.Combine(dResultsFullGroupDirectory, $"({ticks})"); mapLogic.UseKeyValuePairsSaveFaceEncoding(containers); foreach (Container container in containers) { mapLogic.AddToMapping(container.Items); if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) - mapLogic.SaveShortcuts(_Configuration.JuliePhares, dResultsFullGroupDirectory, ticks, container.Items); + mapLogic.SaveShortcuts(_Configuration.JuliePhares, dFacesContentDirectory, container.Items); } mapLogic.SaveAllCollection(); if (_Configuration.SaveResizedSubfiles) { - string dFacesContentDirectory; string zPropertyHolderContentDirectory; string zPropertyHolderSingletonDirectory; string zPropertyHolderCollectionDirectory; - dFacesContentDirectory = Path.Combine(dResultsFullGroupDirectory, "()"); zPropertyHolderSingletonDirectory = Path.Combine(zResultsFullGroupDirectory, "{}"); zPropertyHolderContentDirectory = Path.Combine(zResultsFullGroupDirectory, $"({ticks})"); zPropertyHolderCollectionDirectory = Path.Combine(zResultsFullGroupDirectory, $"[{ticks}]"); mapLogic.SaveNotMappedPersonKeys(zPropertyHolderContentDirectory); _ = LogDeltaInMinutes(ticks, nameof(mapLogic.SaveNotMappedPersonKeys)); - Dictionary> keyValuePairs = _Distance.ParallelWork(_AppSettings.MaxDegreeOfParallelism, _Configuration.IgnoreRelativePaths, argZero, ticks, containers); + Dictionary> keyValuePairs = _Distance.ParallelWork(_AppSettings.MaxDegreeOfParallelism, _Configuration.IgnoreRelativePaths, argZero, ticks, mapLogic, containers); _ = LogDeltaInSeconds(ticks, nameof(E_Distance.ParallelWork)); Dictionary> strippedKeyValuePairs = Strip(keyValuePairs); List<(string, int, Mapping, DateTime, bool?, List<(FaceRecognitionDotNet.FaceEncoding, MappingContainer)>)> collection = Convert(keyValuePairs); diff --git a/Instance/Models/_E_Distance.cs b/Instance/Models/_E_Distance.cs index c68c307..7ef6f3a 100644 --- a/Instance/Models/_E_Distance.cs +++ b/Instance/Models/_E_Distance.cs @@ -495,8 +495,8 @@ internal class E_Distance average = doubles.Average(); standardDeviation = GetStandardDeviation(doubles, average); ucl = average + (standardDeviation * 3); - if (ucl > IFaceDistance.Tolerance) - ucl = IFaceDistance.Tolerance; + if (ucl > IClosest.Tolerance) + ucl = IClosest.Tolerance; foreach ((FaceRecognitionDotNet.FaceEncoding _, MappingContainer mappingContainer) in collection) { if (mappingContainer.Mapping.Filtered is null || mappingContainer.Mapping.Filtered.Value || mappingContainer.Distance <= ucl) @@ -662,13 +662,13 @@ internal class E_Distance return results; } - internal Dictionary> ParallelWork(int maxDegreeOfParallelism, string[] ignoreRelativePaths, string argZero, long ticks, Container[] containers) + internal Dictionary> ParallelWork(int maxDegreeOfParallelism, string[] ignoreRelativePaths, string argZero, long ticks, Map.Models.MapLogic mapLogic, Container[] containers) { Dictionary> results; Dictionary> keyValuePairs = Map.Models.Stateless.IMapLogic.GetKeyValuePairs(ignoreRelativePaths, argZero, containers); if (!keyValuePairs.Any()) { - Map.Models.Stateless.IMapLogic.SetSingleImage(ignoreRelativePaths, argZero, containers); + mapLogic.SetSingleImage(ignoreRelativePaths, argZero, containers); keyValuePairs = Map.Models.Stateless.IMapLogic.GetKeyValuePairs(ignoreRelativePaths, argZero, containers); } results = GetThreeSigmaFaceEncodings(maxDegreeOfParallelism, ticks, keyValuePairs); diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index ffb5a56..e56e67c 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Text.Json; using View_by_Distance.Property.Models; using View_by_Distance.Shared.Models; +using View_by_Distance.Shared.Models.Stateless; using WindowsShortcutFactory; namespace View_by_Distance.Map.Models; @@ -10,16 +11,16 @@ public class MapLogic { protected readonly List _SkipCollection; - protected readonly List _NotMappedPersonKeys; + protected readonly List _NotMappedPersonKeys; protected readonly List<(int, string[])> _AllCollection; protected readonly Dictionary _KeyValuePairs; protected readonly Dictionary _IndicesFromNew; protected readonly string _DeterministicHashCodeContentDirectory; protected readonly Dictionary _SixCharacterNamedFaceInfo; - protected readonly Dictionary _DeterministicHashCodeKeyValuePairs; - protected readonly Dictionary _DeterministicHashCodeUnknownFaceKeyValuePairs; - protected readonly Dictionary _IncorrectDeterministicHashCodeKeyValuePairs; - protected readonly Dictionary _PeopleKeyValuePairs; + protected readonly Dictionary _DeterministicHashCodeKeyValuePairs; + protected readonly Dictionary _DeterministicHashCodeUnknownFaceKeyValuePairs; + protected readonly Dictionary _IncorrectDeterministicHashCodeKeyValuePairs; + protected readonly Dictionary _PeopleKeyValuePairs; public Dictionary KeyValuePairs => _KeyValuePairs; public Dictionary IndicesFromNew => _IndicesFromNew; @@ -40,7 +41,7 @@ public class MapLogic _ResizeFilenameExtension = resizeFilenameExtension; _FacePartsFilenameExtension = facePartsFilenameExtension; _FacesHiddenFilenameExtension = facesHiddenFilenameExtension; - Dictionary? deterministicHashCodeUnknownFaceKeyValuePairs; + Dictionary? deterministicHashCodeUnknownFaceKeyValuePairs; if (configuration.VerifyToSeason is null || !configuration.VerifyToSeason.Any()) throw new Exception(); string json; @@ -48,15 +49,15 @@ public class MapLogic string fullPath; List skipCollection = new(); Dictionary? keyValuePairs; - List notMappedPersonKeys = new(); + List notMappedPersonKeys = new(); List>? collection; string deterministicHashCodeContentDirectory; Dictionary indicesFromNew = new(); Dictionary? sixCharacterNamedFaceInfo; - Dictionary deterministicHashCodeKeyValuePairs = new(); - Dictionary incorrectDeterministicHashCodeKeyValuePairs = new(); + Dictionary deterministicHashCodeKeyValuePairs = new(); string? rootDirectoryParent = Path.GetDirectoryName(configuration.RootDirectory); - Dictionary peopleKeyValuePairs = new(); + Dictionary peopleKeyValuePairs = new(); + Dictionary incorrectDeterministicHashCodeKeyValuePairs = new(); if (string.IsNullOrEmpty(rootDirectoryParent)) throw new NullReferenceException(nameof(rootDirectoryParent)); string deterministicHashCodeRootDirectory = Path.Combine(rootDirectoryParent, "DeterministicHashCode"); @@ -66,13 +67,12 @@ public class MapLogic else { json = File.ReadAllText(files[0]); - deterministicHashCodeUnknownFaceKeyValuePairs = JsonSerializer.Deserialize>(json); - if (deterministicHashCodeUnknownFaceKeyValuePairs is null) - throw new NullReferenceException(nameof(deterministicHashCodeUnknownFaceKeyValuePairs)); + deterministicHashCodeUnknownFaceKeyValuePairs = Get(json); } if (!Directory.Exists(deterministicHashCodeRootDirectory)) _ = Directory.CreateDirectory(deterministicHashCodeRootDirectory); - deterministicHashCodeContentDirectory = Stateless.ByDeterministicHashCode.SetByRef(_ResizeFilenameExtension, people, skipCollection, peopleKeyValuePairs, notMappedPersonKeys, deterministicHashCodeUnknownFaceKeyValuePairs, deterministicHashCodeKeyValuePairs, incorrectDeterministicHashCodeKeyValuePairs, deterministicHashCodeRootDirectory); + deterministicHashCodeContentDirectory = Path.Combine(deterministicHashCodeRootDirectory, "()"); + Stateless.ByDeterministicHashCode.SetByRef(_ResizeFilenameExtension, people, skipCollection, peopleKeyValuePairs, notMappedPersonKeys, deterministicHashCodeUnknownFaceKeyValuePairs, deterministicHashCodeKeyValuePairs, incorrectDeterministicHashCodeKeyValuePairs, deterministicHashCodeRootDirectory, deterministicHashCodeContentDirectory); if (!deterministicHashCodeUnknownFaceKeyValuePairs.Any()) sixCharacterNamedFaceInfo = new(); else @@ -134,22 +134,47 @@ public class MapLogic public bool Skip(double deterministicHashCodeKey) => _SkipCollection.Contains(deterministicHashCodeKey); - public void SaveShortcuts(string[] juliePhares, string dResultsFullGroupDirectory, long ticks, List items) + private static Dictionary Get(string json) + { + Dictionary results = new(); + PersonBirthday? personBirthday; + List personBirthdays; + Dictionary? keyValuePairs = JsonSerializer.Deserialize>(json); + if (keyValuePairs is null) + throw new NullReferenceException(nameof(keyValuePairs)); + foreach (KeyValuePair keyValuePair in keyValuePairs) + { + personBirthdays = new(); + foreach (string personKey in keyValuePair.Value) + { + personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey); + if (personBirthday is null) + continue; + } + if (!personBirthdays.Any()) + continue; + results.Add(keyValuePair.Key, personBirthdays.ToArray()); + } + return results; + } + + public void SaveShortcuts(string[] juliePhares, string dFacesContentDirectory, List items) { string fileName; string fullName; + string personKey; DateTime? minimumDateTime; + PersonBirthday personBirthday; WindowsShortcut windowsShortcut; - (string DisplayDirectoryName, int? ApproximateYears, string Key, PersonBirthday[] _) person; - string dFacesContentDirectory = Path.Combine(dResultsFullGroupDirectory, $"({ticks})"); - List<(Item, (string, Face?, (string, string, string, string))[])> collections = GetCollection(items, dFacesContentDirectory); - foreach ((Item item, (string personKey, Face? _, (string, string, string, string))[] collection) in collections) + (string DisplayDirectoryName, int? ApproximateYears, PersonBirthday[] _, long Ticks) person; + List<(Item, (long?, Face?, (string, string, string, string))[])> collections = GetCollection(items, dFacesContentDirectory); + foreach ((Item item, (long? ticks, Face? _, (string, string, string, string))[] collection) in collections) { if (collection.Length != 1) continue; - foreach ((string personKey, Face? _, (string directory, string copyDirectory, string copyFileName, string shortcutFileName)) in collection) + foreach ((long? ticks, Face? _, (string directory, string copyDirectory, string copyFileName, string shortcutFileName)) in collection) { - if (string.IsNullOrEmpty(personKey)) + if (ticks is null) continue; if (item.Property?.Id is null || item.ImageFileHolder is null || item.ResizedFileHolder is null) continue; @@ -159,13 +184,17 @@ public class MapLogic if (!Directory.Exists(directory)) { _ = Directory.CreateDirectory(directory); - if (!string.IsNullOrEmpty(personKey) && _PeopleKeyValuePairs.ContainsKey(personKey)) + if (ticks is not null && _PeopleKeyValuePairs.ContainsKey(ticks.Value)) { - person = _PeopleKeyValuePairs[personKey]; + person = _PeopleKeyValuePairs[ticks.Value]; fullName = string.Concat(person.DisplayDirectoryName, ".txt"); File.WriteAllText(Path.Combine(directory, fullName), string.Empty); } } + if (ticks is null) + continue; + personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(ticks.Value); + personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthday); if (juliePhares.Contains(personKey) && !string.IsNullOrEmpty(copyDirectory)) { if (!Directory.Exists(copyDirectory)) @@ -192,8 +221,8 @@ public class MapLogic if (!string.IsNullOrEmpty(_DeterministicHashCodeContentDirectory)) { Dictionary> keyValuePairs = new(); - List<(string PersonKey, double IdAndNormalizedPixelPercentage)> deterministicHashCodeCollection = new(); - List<(string PersonKey, double IdAndNormalizedPixelPercentage)> incorrectDeterministicHashCodeCollection = new(); + List<(PersonBirthday PersonBirthday, double IdAndNormalizedPixelPercentage)> deterministicHashCodeCollection = new(); + List<(PersonBirthday PersonBirthday, double IdAndNormalizedPixelPercentage)> incorrectDeterministicHashCodeCollection = new(); foreach (Container container in containers) { foreach (Item item in container.Items) @@ -283,14 +312,14 @@ public class MapLogic public void AddToMapping(List items) { + long ticks; Mapping mapping; - string personKey; int? approximateYears; string displayDirectoryName; - PersonBirthday? personBirthday; + PersonBirthday personBirthday; double deterministicHashCodeKey; - List personKeys = new(); - (string DisplayDirectoryName, int? ApproximateYears, string Key, PersonBirthday[] PersonBirthdays) person; + List personBirthdays = new(); + (string DisplayDirectoryName, int? ApproximateYears, PersonBirthday[] PersonBirthdays, long Ticks) person; foreach (Item item in items) { if (item.ImageFileHolder is null) @@ -299,45 +328,41 @@ public class MapLogic continue; foreach (Face face in item.Faces) { - personKeys.Clear(); + personBirthdays.Clear(); if (face.FaceEncoding is null || face.Location?.NormalizedPixelPercentage is null) continue; deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(item, face); if (!_DeterministicHashCodeKeyValuePairs.ContainsKey(deterministicHashCodeKey)) continue; - personKeys.AddRange(_DeterministicHashCodeKeyValuePairs[deterministicHashCodeKey]); - for (int i = 0; i < personKeys.Count; i++) + personBirthdays.AddRange(_DeterministicHashCodeKeyValuePairs[deterministicHashCodeKey]); + for (int i = 0; i < personBirthdays.Count; i++) { - if (!_PeopleKeyValuePairs.ContainsKey(personKeys[i])) + ticks = personBirthdays[i].Value.Ticks; + if (!_PeopleKeyValuePairs.ContainsKey(ticks)) continue; - person = _PeopleKeyValuePairs[personKeys[i]]; + person = _PeopleKeyValuePairs[ticks]; personBirthday = person.PersonBirthdays[0]; approximateYears = person.ApproximateYears; displayDirectoryName = person.DisplayDirectoryName; - personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthday); - if (personBirthday is null) - continue; - mapping = new(approximateYears, displayDirectoryName, face.Location.NormalizedPixelPercentage, personBirthday, personKey); + mapping = new(approximateYears, displayDirectoryName, face.Location.NormalizedPixelPercentage, personBirthday); item.Mapping.Add(mapping); } } - if (Shared.Models.Stateless.IMapping.UseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping && !personKeys.Any()) + if (IMapping.UseDeterministicHashCodeUnknownFaceKeyValuePairsForAddToMapping && !personBirthdays.Any()) { if (!_DeterministicHashCodeUnknownFaceKeyValuePairs.ContainsKey(item.Property.Id.Value)) continue; - personKeys.AddRange(_DeterministicHashCodeUnknownFaceKeyValuePairs[item.Property.Id.Value]); - for (int i = 0; i < personKeys.Count; i++) + personBirthdays.AddRange(_DeterministicHashCodeUnknownFaceKeyValuePairs[item.Property.Id.Value]); + for (int i = 0; i < personBirthdays.Count; i++) { - if (!_PeopleKeyValuePairs.ContainsKey(personKeys[i])) + ticks = personBirthdays[i].Value.Ticks; + if (!_PeopleKeyValuePairs.ContainsKey(ticks)) continue; - person = _PeopleKeyValuePairs[personKeys[i]]; + person = _PeopleKeyValuePairs[ticks]; personBirthday = person.PersonBirthdays[0]; approximateYears = person.ApproximateYears; displayDirectoryName = person.DisplayDirectoryName; - personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthday); - if (personBirthday is null) - continue; - mapping = new(approximateYears, displayDirectoryName, personBirthday, personKey); + mapping = new(approximateYears, displayDirectoryName, personBirthday); item.Mapping.Add(mapping); } } @@ -398,11 +423,15 @@ public class MapLogic public void SaveNotMappedPersonKeys(string zPropertyHolderContentDirectory) { string directory; + string personKey; SaveContainer saveContainer; + PersonBirthday personBirthday; List saveContainers = new(); const string facePopulatedKey = nameof(Closest); - foreach (string personKey in _NotMappedPersonKeys) + foreach (long ticks in _NotMappedPersonKeys) { + personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(ticks); + personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthday); directory = Path.Combine(zPropertyHolderContentDirectory, $"{facePopulatedKey}NotMapped", personKey, Property.Models.Stateless.IResult.AllInOne); saveContainer = new(directory); saveContainers.Add(saveContainer); @@ -410,13 +439,13 @@ public class MapLogic SaveContainers(saveContainers); } - public List<(Item, (string, Face?, (string, string, string, string))[])> GetCollection(List items, string dFacesContentDirectory) + public List<(Item, (long?, Face?, (string, string, string, string))[])> GetCollection(List items, string dFacesContentDirectory) { - List<(Item, (string, Face?, (string, string, string, string))[])> results = new(); + List<(Item, (long?, Face?, (string, string, string, string))[])> results = new(); int years; Face face; Item item; - string[] keys; + long? ticks; string directory; string personKey; bool? isWrongYear; @@ -430,10 +459,11 @@ public class MapLogic string subDirectoryName; List indices = new(); DateTime? minimumDateTime; - DateTime dateTime = DateTime.Now; List faceCollection; - PersonBirthday? personBirthday; - List<(string, Face?, (string, string, string, string))> collection; + PersonBirthday personBirthday; + PersonBirthday[] personBirthdays; + DateTime dateTime = DateTime.Now; + List<(long?, Face?, (string, string, string, string))> collection; for (int i = 0; i < items.Count; i++) { indices.Clear(); @@ -451,13 +481,13 @@ public class MapLogic if (!_DeterministicHashCodeUnknownFaceKeyValuePairs.ContainsKey(item.Property.Id.Value)) { faceCollection = new(); - personKey = string.Empty; + ticks = null; directory = Path.Combine(dFacesContentDirectory, $"Unnamed{relativePath[2..]}"); } else { faceCollection = item.Faces; - keys = _DeterministicHashCodeUnknownFaceKeyValuePairs[item.Property.Id.Value]; + personBirthdays = _DeterministicHashCodeUnknownFaceKeyValuePairs[item.Property.Id.Value]; minimumDateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property); if (minimumDateTime is null) continue; @@ -466,26 +496,24 @@ public class MapLogic subDirectoryName = $"{isWrongYearFlag}{minimumDateTime.Value:yyyy}"; if (!faceCollection.Any()) { - personKey = string.Empty; + ticks = null; directory = Path.Combine(dFacesContentDirectory, $"None{relativePath[2..]}", subDirectoryName); } - else if (keys.Length != 1) + else if (personBirthdays.Length != 1) { - personKey = string.Empty; + ticks = null; directory = Path.Combine(dFacesContentDirectory, $"Not Supported{relativePath[2..]}", subDirectoryName); } else if (faceCollection.Count != 1) { - personKey = string.Empty; + ticks = null; directory = Path.Combine(dFacesContentDirectory, $"Many{relativePath[2..]}", subDirectoryName); } else { indices.Add(zero); - personKey = keys[zero]; - personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey); - if (personBirthday is null) - continue; + personBirthday = personBirthdays[zero]; + ticks = personBirthday.Value.Ticks; timeSpan = Shared.Models.Stateless.Methods.IPersonBirthday.GetTimeSpan(minimumDateTime.Value, isWrongYear, personBirthday); if (timeSpan.HasValue) { @@ -498,6 +526,7 @@ public class MapLogic } } face = faceCollection[zero]; + personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthday); directory = Path.Combine(dFacesContentDirectory, "Shortcuts", personKey, subDirectoryName); if (face.FaceEncoding is not null && face.Location?.NormalizedPixelPercentage is not null) copyDirectory = Path.Combine(dFacesContentDirectory, "Images", personKey, subDirectoryName); @@ -507,12 +536,12 @@ public class MapLogic } } shortcutFileName = Path.Combine(directory, $"{item.Property.Id.Value}.lnk"); - if (string.IsNullOrEmpty(personKey) || !indices.Any()) - collection.Add(new(personKey, null, (directory, copyDirectory, copyFileName, shortcutFileName))); + if (ticks is null || !indices.Any()) + collection.Add(new(ticks, null, (directory, copyDirectory, copyFileName, shortcutFileName))); else { foreach (int index in indices) - collection.Add(new(personKey, faceCollection[index], (directory, copyDirectory, copyFileName, shortcutFileName))); + collection.Add(new(ticks, faceCollection[index], (directory, copyDirectory, copyFileName, shortcutFileName))); } results.Add(new(item, collection.ToArray())); } @@ -521,20 +550,27 @@ public class MapLogic public void AddToClosest(int maxDegreeOfParallelism, string argZero, Container[] containers) { + long ticks; string key; string dateKey; Closest closest; + string personKey; + const int zero = 0; DateTime minimumDateTime; Closest[] closestCollection; + PersonBirthday personBirthday; double deterministicHashCodeKey; DateTime dateTime = DateTime.Now; Dictionary keyValuePairs = new(); foreach (Container container in containers) { + if (!_NotMappedPersonKeys.Any()) + break; if (!container.Items.Any()) continue; if (!container.SourceDirectory.StartsWith(argZero)) continue; + ticks = _NotMappedPersonKeys[zero]; foreach (Item item in container.Items) { if (item.ImageFileHolder is null || item.Property is null) @@ -545,20 +581,22 @@ public class MapLogic continue; deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(item, face); if (_DeterministicHashCodeKeyValuePairs.ContainsKey(deterministicHashCodeKey)) - continue; + continue; + personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(ticks); minimumDateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property); - closestCollection = Shared.Models.Stateless.Methods.IClosest.GetCollection(face, minimumDateTime, face.FaceDistances); + closestCollection = Shared.Models.Stateless.Methods.IClosest.GetCollection(personBirthday, face, minimumDateTime, face.FaceDistances); face.FaceDistances.Clear(); for (int j = 0; j < closestCollection.Length; j++) { closest = closestCollection[j]; - if (_IncorrectDeterministicHashCodeKeyValuePairs.ContainsKey(deterministicHashCodeKey) && _IncorrectDeterministicHashCodeKeyValuePairs[deterministicHashCodeKey].Contains(closest.Mapping.PersonKey)) + if (_IncorrectDeterministicHashCodeKeyValuePairs.ContainsKey(deterministicHashCodeKey) && _IncorrectDeterministicHashCodeKeyValuePairs[deterministicHashCodeKey].Contains(personBirthday)) continue; + personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(closest.Mapping.PersonBirthday); dateKey = Stateless.MapLogic.GetDateKey(dateTime, closest.Mapping, closest.MinimumDateTime, closest.IsWrongYear); - key = string.Concat(closest.Mapping.PersonKey, dateKey); + key = string.Concat(personKey, dateKey); if (!keyValuePairs.ContainsKey(key)) keyValuePairs.Add(key, 0); - else if (keyValuePairs[key] > Shared.Models.Stateless.IClosest.MaximumPer) + else if (keyValuePairs[key] > IClosest.MaximumPer) continue; keyValuePairs[key] += 1; item.Closest.Add(closest); @@ -576,6 +614,7 @@ public class MapLogic string json; string dateKey; Mapping? match; + string personKey; string checkFile; string directory; bool? isWrongYear; @@ -631,13 +670,14 @@ public class MapLogic minimumDateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property); (isWrongYear, _) = item.Property.IsWrongYear(item.ImageFileHolder.FullName, minimumDateTime); dateKey = Stateless.MapLogic.GetDateKey(dateTime, match, minimumDateTime, isWrongYear); - key = string.Concat(match.PersonKey, dateKey); + personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(match.PersonBirthday); + key = string.Concat(personKey, dateKey); if (match.Filtered is null) - directory = Path.Combine(zPropertyHolderContentDirectory, $"{facePopulatedKey}Null", match.PersonKey, dateKey); + directory = Path.Combine(zPropertyHolderContentDirectory, $"{facePopulatedKey}Null", personKey, dateKey); else if (!match.Filtered.Value) - directory = Path.Combine(zPropertyHolderContentDirectory, $"{facePopulatedKey}Okay", match.PersonKey, dateKey); + directory = Path.Combine(zPropertyHolderContentDirectory, $"{facePopulatedKey}Okay", personKey, dateKey); else - directory = Path.Combine(zPropertyHolderContentDirectory, $"{facePopulatedKey}OutOfControl", match.PersonKey, dateKey); + directory = Path.Combine(zPropertyHolderContentDirectory, $"{facePopulatedKey}OutOfControl", personKey, dateKey); personDirectory = Path.Combine(directory, match.DisplayDirectoryName[..1], "lnk"); saveContainer = new(personDirectory); results.Add(saveContainer); @@ -654,7 +694,7 @@ public class MapLogic shortcutFile = Path.Combine(personDirectory, $"{deterministicHashCodeKey}{item.ImageFileHolder.ExtensionLowered}.lnk"); saveContainer = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, string.Empty, facePartsFileHolder, item.ResizedFileHolder, shortcutFile); results.Add(saveContainer); - if (!string.IsNullOrEmpty(checkFile) && Shared.Models.Stateless.IMapping.SaveFaceEncoding) + if (!string.IsNullOrEmpty(checkFile) && IMapping.SaveFaceEncoding) { checkFile = Path.Combine(directory, $"{deterministicHashCodeKey}{item.ImageFileHolder.ExtensionLowered}.json"); json = JsonSerializer.Serialize(face.FaceEncoding); @@ -666,7 +706,7 @@ public class MapLogic results.Add(saveContainer); used.Add(face.Location.NormalizedPixelPercentage.Value); } - if (deterministicHashCodeKeyValuePairsAny && Shared.Models.Stateless.IMapping.UseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping) + if (deterministicHashCodeKeyValuePairsAny && IMapping.UseDeterministicHashCodeUnknownFaceKeyValuePairsForSaveMapping) { foreach (Face face in item.Faces) { @@ -692,15 +732,16 @@ public class MapLogic continue; throw new Exception(); } + personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(match.PersonBirthday); minimumDateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property); (isWrongYear, _) = item.Property.IsWrongYear(item.ImageFileHolder.FullName, minimumDateTime); dateKey = Stateless.MapLogic.GetDateKey(dateTime, match, minimumDateTime, isWrongYear); if (match.Filtered is null) - directory = Path.Combine(zPropertyHolderContentDirectory, $"{facePopulatedKey}WithButNull", match.PersonKey, dateKey); + directory = Path.Combine(zPropertyHolderContentDirectory, $"{facePopulatedKey}WithButNull", personKey, dateKey); else if (!match.Filtered.Value) - directory = Path.Combine(zPropertyHolderContentDirectory, $"{facePopulatedKey}WithAndOkay", match.PersonKey, dateKey); + directory = Path.Combine(zPropertyHolderContentDirectory, $"{facePopulatedKey}WithAndOkay", personKey, dateKey); else - directory = Path.Combine(zPropertyHolderContentDirectory, $"{facePopulatedKey}WithButOutOfControl", match.PersonKey, dateKey); + directory = Path.Combine(zPropertyHolderContentDirectory, $"{facePopulatedKey}WithButOutOfControl", personKey, dateKey); personDirectory = Path.Combine(directory, match.DisplayDirectoryName[..1], "lnk"); saveContainer = new(personDirectory); results.Add(saveContainer); @@ -717,7 +758,7 @@ public class MapLogic shortcutFile = Path.Combine(personDirectory, $"{deterministicHashCodeKey}{item.ImageFileHolder.ExtensionLowered}.lnk"); saveContainer = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, string.Empty, facePartsFileHolder, item.ResizedFileHolder, shortcutFile); results.Add(saveContainer); - if (!string.IsNullOrEmpty(checkFile) && Shared.Models.Stateless.IMapping.SaveFaceEncoding) + if (!string.IsNullOrEmpty(checkFile) && IMapping.SaveFaceEncoding) { checkFile = Path.Combine(directory, $"{deterministicHashCodeKey}{item.ImageFileHolder.ExtensionLowered}.json"); json = JsonSerializer.Serialize(face.FaceEncoding); @@ -742,6 +783,7 @@ public class MapLogic string dateKey; string checkFile; string directory; + string personKey; string shortcutFile; string? directoryName; string facesDirectory; @@ -791,8 +833,9 @@ public class MapLogic continue; throw new Exception(); } + personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(match.Mapping.PersonBirthday); dateKey = Stateless.MapLogic.GetDateKey(dateTime, match.Mapping, match.MinimumDateTime, match.IsWrongYear); - directory = Path.Combine(zPropertyHolderContentDirectory, facePopulatedKey, match.Mapping.PersonKey, dateKey); + directory = Path.Combine(zPropertyHolderContentDirectory, facePopulatedKey, personKey, dateKey); personDirectory = Path.Combine(directory, match.Mapping.DisplayDirectoryName[..1], "lnk"); saveContainer = new(personDirectory); results.Add(saveContainer); @@ -818,8 +861,9 @@ public class MapLogic { if (used.Contains(closest.NormalizedPixelPercentage)) continue; + personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(closest.Mapping.PersonBirthday); dateKey = Stateless.MapLogic.GetDateKey(dateTime, closest.Mapping, closest.MinimumDateTime, closest.IsWrongYear); - directory = Path.Combine(zPropertyHolderContentDirectory, facePopulatedKey, closest.Mapping.PersonKey, dateKey); + directory = Path.Combine(zPropertyHolderContentDirectory, facePopulatedKey, personKey, dateKey); personDirectory = Path.Combine(directory, closest.Mapping.DisplayDirectoryName, "lnk"); saveContainer = new(personDirectory); results.Add(saveContainer); @@ -858,4 +902,45 @@ public class MapLogic SaveContainers(saveContainers); } + public void SetSingleImage(string[] ignoreRelativePaths, string argZero, Container[] containers) + { + Mapping mapping; + long? ticks = null; + const int zero = 0; + int? approximateYears = null; + PersonBirthday personBirthday; + const string displayDirectoryName = Property.Models.Stateless.IResult.AllInOne; + foreach (Container container in containers) + { + if (!_NotMappedPersonKeys.Any()) + break; + if (!container.Items.Any()) + continue; + if (!container.SourceDirectory.StartsWith(argZero)) + continue; + if (ignoreRelativePaths.Contains(Path.GetFileName(container.SourceDirectory))) + continue; + foreach (Item item in container.Items) + { + if (item.ImageFileHolder is null || item.Property?.Id is null) + continue; + foreach (Face face in item.Faces) + { + if (face.FaceEncoding is null || face.Location?.NormalizedPixelPercentage is null) + continue; + ticks = _NotMappedPersonKeys[zero]; + personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(ticks.Value); + mapping = new(approximateYears, displayDirectoryName, face.Location.NormalizedPixelPercentage, personBirthday); + item.Mapping.Add(mapping); + if (ticks is not null) + break; + } + if (ticks is not null) + break; + } + if (ticks is not null) + break; + } + } + } \ No newline at end of file diff --git a/Map/Models/Stateless/IMapLogic.cs b/Map/Models/Stateless/IMapLogic.cs index 9cde492..846fbbe 100644 --- a/Map/Models/Stateless/IMapLogic.cs +++ b/Map/Models/Stateless/IMapLogic.cs @@ -7,10 +7,6 @@ public interface IMapLogic static (bool?, string[]) IsWrongYear(Shared.Models.Item item) => MapLogic.IsWrongYear(item); - void TestStatic_SetSingleImage(string[] ignoreRelativePaths, string argZero, Shared.Models.Container[] containers); - static void SetSingleImage(string[] ignoreRelativePaths, string argZero, Shared.Models.Container[] containers) => - MapLogic.SetSingleImage(ignoreRelativePaths, argZero, containers); - string TestStatic_GetDateKey(DateTime dateTime, Shared.Models.Mapping mapping, DateTime minimumDateTime, bool? isWrongYear); static string GetDateKey(DateTime dateTime, Shared.Models.Mapping mapping, DateTime minimumDateTime, bool? isWrongYear) => MapLogic.GetDateKey(dateTime, mapping, minimumDateTime, isWrongYear); diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index 4679fd8..fc637c0 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -1,5 +1,4 @@ using View_by_Distance.Shared.Models; -using View_by_Distance.Shared.Models.Stateless; namespace View_by_Distance.Map.Models.Stateless; @@ -37,6 +36,7 @@ internal abstract class MapLogic string key; string dateKey; bool? isWrongYear; + string personKey; DateTime minimumDateTime; DateTime dateTime = DateTime.Now; MappingContainer mappingContainer; @@ -58,16 +58,15 @@ internal abstract class MapLogic continue; foreach (Mapping mapping in item.Mapping) { - if (mapping.PersonBirthday is null) - continue; if (mapping.NormalizedPixelPercentage.HasValue && mapping.NormalizedPixelPercentage.Value != face.Location.NormalizedPixelPercentage.Value) continue; // if (named.NormalizedPixelPercentage is null && (Shared.Models.Stateless.INamed.OnlyUseNamedWithNormalizedPixelPercentagePopulatedForGetKeyValuePairs || item.Named.Count != 1 || item.Faces.Count != 1)) // continue; minimumDateTime = Shared.Models.Stateless.Methods.IProperty.GetMinimumDateTime(item.Property); (isWrongYear, _) = item.Property.IsWrongYear(item.ImageFileHolder.FullName, minimumDateTime); + personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(mapping.PersonBirthday); dateKey = GetDateKey(dateTime, mapping, minimumDateTime, isWrongYear); - key = string.Concat(mapping.PersonKey, dateKey); + key = string.Concat(personKey, dateKey); if (!results.ContainsKey(key)) results.Add(key, new()); mappingContainer = new(face, item.Property.Id.Value, isWrongYear, key, mapping, minimumDateTime); @@ -91,44 +90,4 @@ internal abstract class MapLogic return result; } - internal static void SetSingleImage(string[] ignoreRelativePaths, string argZero, Container[] containers) - { - Mapping mapping; - string personKey; - int? approximateYears = null; - PersonBirthday? personBirthday = null; - const string displayDirectoryName = Property.Models.Stateless.IResult.AllInOne; - foreach (Container container in containers) - { - if (!container.Items.Any()) - continue; - if (!container.SourceDirectory.StartsWith(argZero)) - continue; - if (ignoreRelativePaths.Contains(Path.GetFileName(container.SourceDirectory))) - continue; - foreach (Item item in container.Items) - { - if (item.ImageFileHolder is null || item.Property?.Id is null) - continue; - foreach (Face face in item.Faces) - { - if (face.FaceEncoding is null || face.Location?.NormalizedPixelPercentage is null) - continue; - personKey = DateTime.MinValue.AddYears(IPersonBirthday.FirstYear).ToString(IPersonBirthday.Format); - personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey); - if (personBirthday is null) - continue; - mapping = new(approximateYears, displayDirectoryName, face.Location.NormalizedPixelPercentage, personBirthday, personKey); - item.Mapping.Add(mapping); - if (personBirthday is not null) - break; - } - if (personBirthday is not null) - break; - } - if (personBirthday is not null) - break; - } - } - } \ No newline at end of file diff --git a/Map/Models/Stateless/SetByDeterministicHashCode.cs b/Map/Models/Stateless/SetByDeterministicHashCode.cs index 766ce34..ec57238 100644 --- a/Map/Models/Stateless/SetByDeterministicHashCode.cs +++ b/Map/Models/Stateless/SetByDeterministicHashCode.cs @@ -7,18 +7,20 @@ namespace View_by_Distance.Map.Models.Stateless; public class ByDeterministicHashCode { - private static void SetOther(string resizeFilenameExtension, Person[] people, string deterministicHashCodePeopleDirectory, List skipCollection, List<(string, int?, string, PersonBirthday[])> peopleCollection) + private static void SetOther(string resizeFilenameExtension, Person[] people, string deterministicHashCodePeopleDirectory, List skipCollection, List<(string, int?, PersonBirthday[], long)> peopleCollection) { + long ticks; string json; string personKey; string[] segments; int? approximateYears; string groupDirectoryName; + PersonBirthday[] collection; string personKeyJsonFileName; + List personKeys = new(); string[] personKeyDirectories; string personKeyJsonDirectory; PersonBirthday? personBirthday; - List personKeys = new(); string[] personDisplayDirectories; string convertedPersonKeyDirectory; string? personDisplayDirectoryName; @@ -78,6 +80,8 @@ public class ByDeterministicHashCode continue; personBirthdays.Add(personBirthday); } + if (!personBirthdays.Any()) + continue; foreach (string personKeyDirectory in personKeyDirectories) { personKey = Path.GetFileName(personKeyDirectory); @@ -93,8 +97,14 @@ public class ByDeterministicHashCode json = JsonSerializer.Serialize(personKeyValuePairs[personKey], new JsonSerializerOptions() { WriteIndented = true }); _ = Shared.Models.Stateless.Methods.IPath.WriteAllText(personKeyJsonFileName, json, updateDateWhenMatches: false, compareBeforeWrite: true, updateToWhenMatches: null); } - personKeys.Add(personKey); - peopleCollection.Add(new(personDisplayDirectoryName, approximateYears, personKey, personBirthdays.OrderByDescending(l => l.Value).ToArray())); + collection = personBirthdays.OrderByDescending(l => l.Value).ToArray(); + ticks = collection[0].Value.Ticks; + peopleCollection.Add(new(personDisplayDirectoryName, approximateYears, collection, ticks)); + for (int i = 0; i < collection.Length; i++) + { + ticks = collection[i].Value.Ticks; + personKeys.Add(ticks); + } } } } @@ -103,17 +113,18 @@ public class ByDeterministicHashCode DateTime incrementDate = new(Shared.Models.Stateless.IPersonBirthday.FirstYear, 1, 1); for (int i = 0; i < 500; i++) { - incrementDate = incrementDate.AddDays(1); + ticks = incrementDate.Ticks; personBirthday = new(incrementDate); + incrementDate = incrementDate.AddDays(1); personKey = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(personBirthday); - if (personKeys.Contains(personKey)) + if (personKeys.Contains(ticks)) continue; - personKeys.Add(personKey); - peopleCollection.Add(new(displayDirectoryName, approximateYears, personKey, new PersonBirthday[] { personBirthday })); + personKeys.Add(ticks); + peopleCollection.Add(new(displayDirectoryName, approximateYears, new PersonBirthday[] { personBirthday }, ticks)); } } - internal static void SetKeyValuePairs(string deterministicHashCodeContentDirectory, List<(string, double)> deterministicHashCodeCollection, List<(string, double)> incorrectDeterministicHashCodeCollection, Dictionary> keyValuePairs) + internal static void SetKeyValuePairs(string deterministicHashCodeContentDirectory, List<(PersonBirthday, double)> deterministicHashCodeCollection, List<(PersonBirthday, double)> incorrectDeterministicHashCodeCollection, Dictionary> keyValuePairs) { string[] files; string personKey; @@ -122,6 +133,7 @@ public class ByDeterministicHashCode string? personFirstInitial; string[] personKeyDirectories; string[] personNameDirectories; + PersonBirthday? personBirthday; string[] personNameLinkDirectories; string? personFirstInitialDirectory; double? reversedDeterministicHashCodeKey; @@ -138,6 +150,9 @@ public class ByDeterministicHashCode personKey = Path.GetFileName(personKeyDirectory); if (personKey == nameof(Closest)) throw new Exception($"Move personKey directories up one from {nameof(Closest)} and delete {nameof(Closest)} directory!"); + personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey); + if (personBirthday is null) + continue; yearDirectories = Directory.GetDirectories(personKeyDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string yearDirectory in yearDirectories) { @@ -159,7 +174,7 @@ public class ByDeterministicHashCode reversedDeterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetReversedDeterministicHashCodeKey(keyValuePairsAny, keyValuePairs, file); if (reversedDeterministicHashCodeKey is null) continue; - deterministicHashCodeCollection.Add(new(personKey, reversedDeterministicHashCodeKey.Value)); + deterministicHashCodeCollection.Add(new(personBirthday, reversedDeterministicHashCodeKey.Value)); } personNameLinkDirectories = Directory.GetDirectories(personNameDirectory, "*", SearchOption.TopDirectoryOnly); foreach (string personNameLinkDirectory in personNameLinkDirectories) @@ -186,63 +201,77 @@ public class ByDeterministicHashCode } } - internal static string SetByRef(string resizeFilenameExtension, Person[] people, List skipCollection, Dictionary peopleKeyValuePairs, List notMappedPersonKeys, Dictionary deterministicHashCodeUnknownFaceKeyValuePairs, Dictionary deterministicHashCodeKeyValuePairs, Dictionary incorrectDeterministicHashCodeKeyValuePairs, string deterministicHashCodeRootDirectory) + private static List GetTicks(Dictionary deterministicHashCodeUnknownFaceKeyValuePairs) + { + List results = new(); + long ticks; + foreach (KeyValuePair keyValuePair in deterministicHashCodeUnknownFaceKeyValuePairs) + { + foreach (PersonBirthday personBirthday in keyValuePair.Value) + { + ticks = personBirthday.Value.Ticks; + results.Add(ticks); + } + } + results = results.Distinct().ToList(); + return results; + } + + private static void Set(List<(PersonBirthday PersonBirthday, double IdAndNormalizedPixelPercentage)> deterministicHashCodeCollection, List deterministicHashCodePersonKeys, Dictionary> deterministicHashCodeScope) + { + long ticks; + deterministicHashCodeCollection = (from l in deterministicHashCodeCollection orderby l.IdAndNormalizedPixelPercentage select l).ToList(); + foreach ((PersonBirthday personBirthday, double idAndNormalizedPixelPercentage) in deterministicHashCodeCollection) + { + if (!deterministicHashCodeScope.ContainsKey(idAndNormalizedPixelPercentage)) + deterministicHashCodeScope.Add(idAndNormalizedPixelPercentage, new()); + deterministicHashCodeScope[idAndNormalizedPixelPercentage].Add(personBirthday); + ticks = personBirthday.Value.Ticks; + deterministicHashCodePersonKeys.Add(ticks); + } + } + + internal static void SetByRef(string resizeFilenameExtension, Person[] people, List skipCollection, Dictionary peopleKeyValuePairs, List notMappedPersonKeys, Dictionary deterministicHashCodeUnknownFaceKeyValuePairs, Dictionary deterministicHashCodeKeyValuePairs, Dictionary incorrectDeterministicHashCodeKeyValuePairs, string deterministicHashCodeRootDirectory, string deterministicHashCodeContentDirectory) { - string result; - string[] distinctPersonKeys; Dictionary> keyValuePairs = new(); - List deterministicHashCodePersonKeys = new(); - List deterministicHashCodeUnknownFacePersonKeys = new(); - Dictionary> deterministicHashCodeScope = new(); - Dictionary> incorrectDeterministicHashCodeScope = new(); - List<(string PersonKey, double IdAndNormalizedPixelPercentage)> deterministicHashCodeCollection = new(); + List deterministicHashCodePersonKeys = new(); + List<(string, int?, PersonBirthday[], long)> peopleCollection = new(); + Dictionary> deterministicHashCodeScope = new(); + Dictionary> incorrectDeterministicHashCodeScope = new(); string deterministicHashCodePeopleDirectory = Path.Combine(deterministicHashCodeRootDirectory, "People"); - List<(string PersonKey, double IdAndNormalizedPixelPercentage)> incorrectDeterministicHashCodeCollection = new(); - foreach (KeyValuePair keyValuePair in deterministicHashCodeUnknownFaceKeyValuePairs) - deterministicHashCodeUnknownFacePersonKeys.AddRange(keyValuePair.Value); - deterministicHashCodeUnknownFacePersonKeys = deterministicHashCodeUnknownFacePersonKeys.Distinct().ToList(); - List<(string, int?, string, PersonBirthday[])> peopleCollection = new(); + List deterministicHashCodeUnknownFacePersonKeys = GetTicks(deterministicHashCodeUnknownFaceKeyValuePairs); + List<(PersonBirthday PersonBirthday, double IdAndNormalizedPixelPercentage)> incorrectDeterministicHashCodeCollection = new(); + List<(PersonBirthday PersonBirthday, double IdAndNormalizedPixelPercentage)> deterministicHashCodeCollection = new(); if (!Directory.Exists(deterministicHashCodePeopleDirectory)) _ = Directory.CreateDirectory(deterministicHashCodePeopleDirectory); else SetOther(resizeFilenameExtension, people, deterministicHashCodePeopleDirectory, skipCollection, peopleCollection); - result = Path.Combine(deterministicHashCodeRootDirectory, "()"); - if (!Directory.Exists(result)) - _ = Directory.CreateDirectory(result); - SetKeyValuePairs(result, deterministicHashCodeCollection, incorrectDeterministicHashCodeCollection, keyValuePairs); - deterministicHashCodeCollection = (from l in deterministicHashCodeCollection orderby l.IdAndNormalizedPixelPercentage select l).ToList(); + if (!Directory.Exists(deterministicHashCodeContentDirectory)) + _ = Directory.CreateDirectory(deterministicHashCodeContentDirectory); + SetKeyValuePairs(deterministicHashCodeContentDirectory, deterministicHashCodeCollection, incorrectDeterministicHashCodeCollection, keyValuePairs); + Set(deterministicHashCodeCollection, deterministicHashCodePersonKeys, deterministicHashCodeScope); incorrectDeterministicHashCodeCollection = (from l in incorrectDeterministicHashCodeCollection orderby l.IdAndNormalizedPixelPercentage select l).ToList(); - foreach ((string personKey, double idAndNormalizedPixelPercentage) in deterministicHashCodeCollection) - { - if (!deterministicHashCodeScope.ContainsKey(idAndNormalizedPixelPercentage)) - deterministicHashCodeScope.Add(idAndNormalizedPixelPercentage, new()); - deterministicHashCodeScope[idAndNormalizedPixelPercentage].Add(personKey); - deterministicHashCodePersonKeys.Add(personKey); - } deterministicHashCodePersonKeys = deterministicHashCodePersonKeys.Distinct().ToList(); - foreach ((string personKey, double idAndNormalizedPixelPercentage) in incorrectDeterministicHashCodeCollection) + foreach ((PersonBirthday personBirthday, double idAndNormalizedPixelPercentage) in incorrectDeterministicHashCodeCollection) { if (!incorrectDeterministicHashCodeScope.ContainsKey(idAndNormalizedPixelPercentage)) incorrectDeterministicHashCodeScope.Add(idAndNormalizedPixelPercentage, new()); - incorrectDeterministicHashCodeScope[idAndNormalizedPixelPercentage].Add(personKey); + incorrectDeterministicHashCodeScope[idAndNormalizedPixelPercentage].Add(personBirthday); } - foreach (KeyValuePair> keyValuePair in deterministicHashCodeScope) - { - distinctPersonKeys = keyValuePair.Value.Distinct().ToArray(); - deterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, distinctPersonKeys); - } - foreach (KeyValuePair> keyValuePair in incorrectDeterministicHashCodeScope) + foreach (KeyValuePair> keyValuePair in deterministicHashCodeScope) + deterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value.Distinct().ToArray()); + foreach (KeyValuePair> keyValuePair in incorrectDeterministicHashCodeScope) incorrectDeterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value.Distinct().ToArray()); if (peopleCollection.Any()) { - foreach ((string displayDirectoryName, int? approximateYears, string personKey, PersonBirthday[] personBirthdays) in peopleCollection) + foreach ((string displayDirectoryName, int? approximateYears, PersonBirthday[] personBirthdays, long ticks) in peopleCollection) { - if (peopleKeyValuePairs.ContainsKey(personKey) && peopleKeyValuePairs[personKey].Item1 != displayDirectoryName) + if (peopleKeyValuePairs.ContainsKey(ticks) && peopleKeyValuePairs[ticks].Item1 != displayDirectoryName) throw new NotImplementedException(); - if (deterministicHashCodeUnknownFacePersonKeys.Contains(personKey) || deterministicHashCodePersonKeys.Contains(personKey)) - peopleKeyValuePairs.Add(personKey, new(displayDirectoryName, approximateYears, personKey, personBirthdays)); + if (deterministicHashCodeUnknownFacePersonKeys.Contains(ticks) || deterministicHashCodePersonKeys.Contains(ticks)) + peopleKeyValuePairs.Add(ticks, new(displayDirectoryName, approximateYears, personBirthdays, ticks)); else - notMappedPersonKeys.Add(personKey); + notMappedPersonKeys.Add(ticks); } } if (deterministicHashCodeUnknownFacePersonKeys.Any() || deterministicHashCodePersonKeys.Any()) @@ -250,28 +279,23 @@ public class ByDeterministicHashCode int? approximateYears = null; PersonBirthday? personBirthday; const string displayDirectoryName = Property.Models.Stateless.IResult.AllInOne; - foreach (string personKey in deterministicHashCodeUnknownFacePersonKeys) + foreach (long ticks in deterministicHashCodeUnknownFacePersonKeys) { - if (!peopleKeyValuePairs.ContainsKey(personKey)) + if (!peopleKeyValuePairs.ContainsKey(ticks)) { - personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey); - if (personBirthday is null) - continue; - peopleKeyValuePairs.Add(personKey, new(displayDirectoryName, approximateYears, personKey, new PersonBirthday[] { personBirthday })); + personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(ticks); + peopleKeyValuePairs.Add(ticks, new(displayDirectoryName, approximateYears, new PersonBirthday[] { personBirthday }, ticks)); } } - foreach (string personKey in deterministicHashCodePersonKeys) + foreach (long ticks in deterministicHashCodePersonKeys) { - if (!peopleKeyValuePairs.ContainsKey(personKey)) + if (!peopleKeyValuePairs.ContainsKey(ticks)) { - personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey); - if (personBirthday is null) - continue; - peopleKeyValuePairs.Add(personKey, new(displayDirectoryName, approximateYears, personKey, new PersonBirthday[] { personBirthday })); + personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(ticks); + peopleKeyValuePairs.Add(ticks, new(displayDirectoryName, approximateYears, new PersonBirthday[] { personBirthday }, ticks)); } } } - return result; } } \ No newline at end of file diff --git a/Shared/Models/Mapping.cs b/Shared/Models/Mapping.cs index 5699397..fd09112 100644 --- a/Shared/Models/Mapping.cs +++ b/Shared/Models/Mapping.cs @@ -10,32 +10,29 @@ public class Mapping : Properties.IMapping protected readonly string _DisplayDirectoryName; protected bool? _Filtered; protected readonly int? _NormalizedPixelPercentage; - protected readonly PersonBirthday _PersonBirthday; - protected readonly string _PersonKey; + protected PersonBirthday _PersonBirthday; public int? ApproximateYears => _ApproximateYears; public string DisplayDirectoryName => _DisplayDirectoryName; public bool? Filtered => _Filtered; public int? NormalizedPixelPercentage => _NormalizedPixelPercentage; public PersonBirthday PersonBirthday => _PersonBirthday; - public string PersonKey => _PersonKey; [JsonConstructor] - public Mapping(int? approximateYears, string displayDirectoryName, bool? filtered, int? normalizedPixelPercentage, PersonBirthday personBirthday, string personKey) + public Mapping(int? approximateYears, string displayDirectoryName, bool? filtered, int? normalizedPixelPercentage, PersonBirthday personBirthday) { _ApproximateYears = approximateYears; _DisplayDirectoryName = displayDirectoryName; _Filtered = filtered; _NormalizedPixelPercentage = normalizedPixelPercentage; _PersonBirthday = personBirthday; - _PersonKey = personKey; } - public Mapping(int? approximateYears, string displayDirectoryName, int? normalizedPixelPercentage, PersonBirthday personBirthday, string personKey) : - this(approximateYears, displayDirectoryName, null, normalizedPixelPercentage, personBirthday, personKey) + public Mapping(int? approximateYears, string displayDirectoryName, int? normalizedPixelPercentage, PersonBirthday personBirthday) : + this(approximateYears, displayDirectoryName, null, normalizedPixelPercentage, personBirthday) { } - public Mapping(int? approximateYears, string displayDirectoryName, PersonBirthday personBirthday, string personKey) : - this(approximateYears, displayDirectoryName, null, null, personBirthday, personKey) + public Mapping(int? approximateYears, string displayDirectoryName, PersonBirthday personBirthday) : + this(approximateYears, displayDirectoryName, null, null, personBirthday) { } public override string ToString() @@ -48,4 +45,6 @@ public class Mapping : Properties.IMapping public void SetFiltered(bool value) => _Filtered = value; + public void SetPersonBirthday(PersonBirthday personBirthday) => _PersonBirthday = personBirthday; + } \ No newline at end of file diff --git a/Shared/Models/Properties/IMapping.cs b/Shared/Models/Properties/IMapping.cs index 58fdbd5..15a6ad4 100644 --- a/Shared/Models/Properties/IMapping.cs +++ b/Shared/Models/Properties/IMapping.cs @@ -8,6 +8,5 @@ public interface IMapping public bool? Filtered { get; } public int? NormalizedPixelPercentage { get; } public PersonBirthday PersonBirthday { get; } - public string PersonKey { get; } } \ No newline at end of file diff --git a/Shared/Models/Stateless/IClosest.cs b/Shared/Models/Stateless/IClosest.cs index 80f0bc2..02c993a 100644 --- a/Shared/Models/Stateless/IClosest.cs +++ b/Shared/Models/Stateless/IClosest.cs @@ -12,5 +12,6 @@ public interface IClosest const int Digits = 3; const int Factor = 1000; const int MaximumPer = 50; + const double Tolerance = 0.6d; } \ No newline at end of file diff --git a/Shared/Models/Stateless/IFaceDistance.cs b/Shared/Models/Stateless/IFaceDistance.cs index 15cac2f..889a894 100644 --- a/Shared/Models/Stateless/IFaceDistance.cs +++ b/Shared/Models/Stateless/IFaceDistance.cs @@ -7,6 +7,5 @@ public interface IFaceDistance const int HiddenImageFactor = 2; const int MaximumPer = 9999; - const double Tolerance = 0.6d; } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/Closest.cs b/Shared/Models/Stateless/Methods/Closest.cs index 3568195..e769336 100644 --- a/Shared/Models/Stateless/Methods/Closest.cs +++ b/Shared/Models/Stateless/Methods/Closest.cs @@ -5,7 +5,7 @@ internal abstract class Closest private static int Get(List faceDistances) => (int)(Math.Round(faceDistances.Average(), Stateless.IClosest.Digits) * Stateless.ILocation.Factor); - private static Models.Closest Get(Models.Face face, DateTime minimumDateTime, FaceDistance faceDistance) + private static Models.Closest Get(Models.PersonBirthday personBirthday, Models.Face face, DateTime minimumDateTime, FaceDistance faceDistance) { Models.Closest result; int average = Get(faceDistance.Distances); @@ -19,16 +19,18 @@ internal abstract class Closest if (faceDistance.MinimumDateTime < faceDistance.Mapping.PersonBirthday.Value) ticksDelta *= 2; } + if (minimum > Stateless.IClosest.Tolerance) + faceDistance.Mapping.SetPersonBirthday(personBirthday); if (face.Location?.NormalizedPixelPercentage is null) throw new NullReferenceException(nameof(face.Location.NormalizedPixelPercentage)); result = new(average, face.Location.NormalizedPixelPercentage.Value, faceDistance.IsWrongYear, faceDistance.Mapping, minimum, faceDistance.MinimumDateTime, ticksDelta); return result; } - internal static Models.Closest[] GetCollection(Models.Face face, DateTime minimumDateTime, List faceDistances) + internal static Models.Closest[] GetCollection(Models.PersonBirthday personBirthday, Models.Face face, DateTime minimumDateTime, List faceDistances) { Models.Closest[] results; - Models.Closest[] closestCollection = (from l in faceDistances select Get(face, minimumDateTime, l)).ToArray(); + Models.Closest[] closestCollection = (from l in faceDistances select Get(personBirthday, face, minimumDateTime, l)).ToArray(); results = (from l in closestCollection orderby l.Average, l.TicksDelta.HasValue, l.TicksDelta select l).ToArray(); return results; } diff --git a/Shared/Models/Stateless/Methods/IClosest.cs b/Shared/Models/Stateless/Methods/IClosest.cs index 027faad..62eb2d1 100644 --- a/Shared/Models/Stateless/Methods/IClosest.cs +++ b/Shared/Models/Stateless/Methods/IClosest.cs @@ -5,6 +5,6 @@ public interface IClosest Models.Closest[] TestStatic_Get(List faceDistances); - static Models.Closest[] GetCollection(Models.Face face, DateTime minimumDateTime, List faceDistances) => Closest.GetCollection(face, minimumDateTime, faceDistances); + static Models.Closest[] GetCollection(Models.PersonBirthday personBirthday, Models.Face face, DateTime minimumDateTime, List faceDistances) => Closest.GetCollection(personBirthday, face, minimumDateTime, faceDistances); } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/IPersonBirthday.cs b/Shared/Models/Stateless/Methods/IPersonBirthday.cs index e221ed5..f161edb 100644 --- a/Shared/Models/Stateless/Methods/IPersonBirthday.cs +++ b/Shared/Models/Stateless/Methods/IPersonBirthday.cs @@ -20,6 +20,11 @@ public interface IPersonBirthday static DateTime? GetDateTime(string personKey) => PersonBirthday.GetDateTime(personKey); + Models.PersonBirthday TestStatic_GetPersonBirthday(long ticks) => + new(new(ticks)); + static Models.PersonBirthday GetPersonBirthday(long ticks) => + new(new(ticks)); + string TestStatic_GetFileName(Models.PersonBirthday personBirthday) => PersonBirthday.GetFileName(personBirthday); static string GetFileName(Models.PersonBirthday personBirthday) =>