diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index 3f539de..8f8b0a3 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -908,6 +908,22 @@ public partial class DlibDotNet return results; } + internal static Dictionary> GetIdToNormalizedPixelPercentageToFace(Mapping[] mappingCollection) + { + Dictionary> results = new(); + Dictionary keyValuePairs; + foreach (Mapping mapping in mappingCollection) + { + if (!results.ContainsKey(mapping.MappingFromItem.Id)) + results.Add(mapping.MappingFromItem.Id, new()); + keyValuePairs = results[mapping.MappingFromItem.Id]; + if (keyValuePairs.ContainsKey(mapping.MappingFromLocation.NormalizedPixelPercentage)) + throw new NotSupportedException(); + keyValuePairs.Add(mapping.MappingFromLocation.NormalizedPixelPercentage, mapping); + } + return results; + } + private void DistanceThenMapLogic(string argZero, long ticks, PersonContainer[] personContainers, Container[] containers, string a2PeopleSingletonDirectory, string dResultsFullGroupDirectory, string d2FacePartsContentDirectory, string eDistanceContentDirectory, string outputResolution) { int? useFiltersCounter = null; @@ -925,10 +941,11 @@ public partial class DlibDotNet eDistanceContentDirectory, mappingCollection, _Distance); - mapLogic.CopyManualFiles(dFacesContentDirectory, mappingCollection); + Dictionary> idToNormalizedPixelPercentageToMapping = GetIdToNormalizedPixelPercentageToFace(mappingCollection); + mapLogic.CopyManualFiles(dFacesContentDirectory, idToNormalizedPixelPercentageToMapping); int totalNotMapped = mapLogic.AddToMapping(mappingCollection); if (_Configuration.MappingSaveMapped) - mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, totalNotMapped); + mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, totalNotMapped); E_Distance.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces); sortingContainers = _Distance.SetFaceMappingSortingCollectionThenGetSortingContainers(_AppSettings.MaxDegreeOfParallelism, ticks, mapLogic, distinctFilteredFaces, useFiltersCounter); if (!sortingContainers.Any()) @@ -942,7 +959,7 @@ public partial class DlibDotNet } E_Distance.SaveFaceDistances(_Configuration.PropertyConfiguration, sortingContainers); if (totalNotMapped > 0) - mapLogic.ForceSingleImageThenSaveSorting(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, sortingContainers, useFiltersCounter, totalNotMapped); + mapLogic.ForceSingleImageThenSaveSorting(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, sortingContainers, useFiltersCounter, totalNotMapped); if (_Configuration.MappingSaveNotMapped) mapLogic.SaveNotMappedTicks(); if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index 1d394a9..12a0dbd 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -200,9 +200,7 @@ public class MapLogic } foreach (SaveContainer saveContainer in saveContainers) { - if (string.IsNullOrEmpty(saveContainer.Directory) || string.IsNullOrEmpty(saveContainer.CheckFile) || saveContainer.ResizedFileHolder is null) - continue; - if (string.IsNullOrEmpty(saveContainer.ShortcutFile) || !saveContainer.ResizedFileHolder.Exists) + if (string.IsNullOrEmpty(saveContainer.ShortcutFile) || saveContainer.ResizedFileHolder is null || !saveContainer.ResizedFileHolder.Exists) continue; try { @@ -215,14 +213,14 @@ public class MapLogic } } - public void SaveMapped(string dFacesContentDirectory, string d2FacePartsContentDirectory, Mapping[] mappingCollection, int totalNotMapped) + public void SaveMapped(string dFacesContentDirectory, string d2FacePartsContentDirectory, Mapping[] mappingCollection, Dictionary> idToNormalizedPixelPercentageToMapping, int totalNotMapped) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); int? updated = null; int? useFiltersCounter = null; string mappingDirectory = Path.Combine(_EDistanceContentTicksDirectory, nameof(Stateless.IMapLogic.Mapping)); - List saveContainers = Stateless.MapLogic.GetSaveContainers(_Configuration, _EDistanceContentTicksDirectory, dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, useFiltersCounter, saveMapped: true); + List saveContainers = Stateless.MapLogic.GetSaveContainers(_Configuration, _EDistanceContentTicksDirectory, dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, useFiltersCounter, saveMapped: true); SaveContainers(totalNotMapped, updated, saveContainers); if (!string.IsNullOrEmpty(_EDistanceContentTicksDirectory) && Directory.Exists(mappingDirectory)) Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory); @@ -404,7 +402,7 @@ public class MapLogic } } - public void ForceSingleImageThenSaveSorting(string dFacesContentDirectory, string d2FacePartsContentDirectory, Mapping[] mappingCollection, SortingContainer[] sortingContainers, int? useFiltersCounter, int totalNotMapped) + public void ForceSingleImageThenSaveSorting(string dFacesContentDirectory, string d2FacePartsContentDirectory, Mapping[] mappingCollection, Dictionary> idToNormalizedPixelPercentageToMapping, SortingContainer[] sortingContainers, int? useFiltersCounter, int totalNotMapped) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); @@ -414,19 +412,19 @@ public class MapLogic { updated = 0; ForceSingleImage(mappingCollection); - saveContainers = Stateless.MapLogic.GetSaveContainers(_Configuration, _EDistanceContentTicksDirectory, dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, useFiltersCounter, saveMapped: false); + saveContainers = Stateless.MapLogic.GetSaveContainers(_Configuration, _EDistanceContentTicksDirectory, dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, useFiltersCounter, saveMapped: false); } else { updated = UpdateFromSortingContainers(sortingContainers); if (useFiltersCounter is null && totalNotMapped - updated > 0) ForceSingleImage(mappingCollection); - saveContainers = Stateless.MapLogic.GetSaveContainers(_Configuration, _EDistanceContentTicksDirectory, dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, useFiltersCounter, saveMapped: false); + saveContainers = Stateless.MapLogic.GetSaveContainers(_Configuration, _EDistanceContentTicksDirectory, dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedPixelPercentageToMapping, useFiltersCounter, saveMapped: false); } SaveContainers(totalNotMapped, updated, saveContainers); } - public void CopyManualFiles(string dFacesContentDirectory, Mapping[] mappingCollection) + public void CopyManualFiles(string dFacesContentDirectory, Dictionary> idToNormalizedPixelPercentageToMapping) { if (_Configuration is null) throw new NullReferenceException(nameof(_Configuration)); @@ -453,7 +451,6 @@ public class MapLogic string by = nameof(Stateless.IMapLogic.ManualCopy); Dictionary? normalizedPixelPercentageToMapping; string successfull = $"_ {nameof(Stateless.IMapLogic.ManualCopy).Humanize(LetterCasing.Title)} Successfull"; - Dictionary> idToNormalizedPixelPercentageToFace = Stateless.MapLogic.GetKeyValuePairs(mappingCollection); foreach (KeyValuePair keyValuePair in _PersonKeyToPersonContainer) { if (keyValuePair.Value.Key is null || keyValuePair.Value.Birthdays is null || !keyValuePair.Value.Birthdays.Any()) @@ -480,11 +477,11 @@ public class MapLogic mappingSegmentB = Stateless.MapLogic.GetMappingSegmentB(_Ticks, personBirthday, keyValuePair.Value.ApproximateYears, fileInfo.CreationTime, isWrongYear: null); directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, mappingSegmentB); personDirectory = Path.Combine(directory, keyValuePair.Value.DisplayDirectoryName, "lnk"); - if (!idToNormalizedPixelPercentageToFace.TryGetValue(id.Value, out normalizedPixelPercentageToMapping)) + if (!idToNormalizedPixelPercentageToMapping.TryGetValue(id.Value, out normalizedPixelPercentageToMapping)) continue; if (!normalizedPixelPercentageToMapping.ContainsKey(normalizedPixelPercentage.Value)) continue; - mapping = idToNormalizedPixelPercentageToFace[id.Value][normalizedPixelPercentage.Value]; + mapping = normalizedPixelPercentageToMapping[normalizedPixelPercentage.Value]; if (string.IsNullOrEmpty(personDisplayDirectory)) throw new NotSupportedException(); directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath); diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index fe39341..727061a 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -654,28 +654,25 @@ internal abstract class MapLogic return result; } - internal static Dictionary> GetKeyValuePairs(Mapping[] mappingCollection) + private static SaveContainer GetSaveContainer(string directory, SortingContainer sortingContainer, Mapping mapping) { - Dictionary> results = new(); - Dictionary keyValuePairs; - foreach (Mapping mapping in mappingCollection) - { - if (!results.ContainsKey(mapping.MappingFromItem.Id)) - results.Add(mapping.MappingFromItem.Id, new()); - keyValuePairs = results[mapping.MappingFromItem.Id]; - if (keyValuePairs.ContainsKey(mapping.MappingFromLocation.NormalizedPixelPercentage)) - throw new NotSupportedException(); - keyValuePairs.Add(mapping.MappingFromLocation.NormalizedPixelPercentage, mapping); - } - return results; + SaveContainer result; + string checkFile = string.Empty; + FileHolder? faceFileHolder = null; + FileHolder? facePartsFileHolder = null; + FileHolder? hiddenFaceFileHolder = null; + string shortcutFile = Path.Combine(directory, $"{sortingContainer.Mapping.MappingFromLocation.DeterministicHashCodeKey}{sortingContainer.Mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.lnk"); + result = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, mapping.MappingFromItem.ResizedFileHolder, shortcutFile); + return result; } - internal static List GetSaveContainers(Configuration configuration, string eDistanceContentTicksDirectory, string dFacesContentDirectory, string d2FacePartsContentDirectory, Mapping[] mappingCollection, int? useFiltersCounter, bool saveMapped) + internal static List GetSaveContainers(Configuration configuration, string eDistanceContentTicksDirectory, string dFacesContentDirectory, string d2FacePartsContentDirectory, Mapping[] mappingCollection, Dictionary> idToNormalizedPixelPercentageToMapping, int? useFiltersCounter, bool saveMapped) { List results = new(); string by; string checkFile; bool isByMapping; + bool isBySorting; string directory; string shortcutFile; string facesDirectory; @@ -687,6 +684,7 @@ internal abstract class MapLogic SaveContainer saveContainer; FileHolder facePartsFileHolder; FileHolder hiddenFaceFileHolder; + Dictionary? normalizedPixelPercentageToMapping; string forceSingleImageHumanized = nameof(IMapLogic.ForceSingleImage).Humanize(LetterCasing.Title); foreach (Mapping mapping in mappingCollection) { @@ -700,25 +698,27 @@ internal abstract class MapLogic if (mapping.MappingFromPerson.By is null) { isByMapping = false; + isBySorting = false; by = $"{nameof(IMapLogic.Mapping)}Null"; } - else if (useFiltersCounter.HasValue && mapping.MappingFromPerson.By.Value == IMapLogic.Sorting) - { - isByMapping = false; - by = $"{nameof(IMapLogic.Sorting)} Modified Filters - {useFiltersCounter.Value}"; - } else { isByMapping = mapping.MappingFromPerson.By == IMapLogic.Mapping; + isBySorting = mapping.MappingFromPerson.By == IMapLogic.Sorting; if (isByMapping && !saveMapped) continue; - by = mapping.MappingFromPerson.By.Value switch + if (isBySorting && useFiltersCounter.HasValue) + by = $"{nameof(IMapLogic.Sorting)} Modified Filters - {useFiltersCounter.Value}"; + else { - IMapLogic.Mapping => nameof(IMapLogic.Mapping), - IMapLogic.Sorting => nameof(IMapLogic.Sorting), - IMapLogic.ForceSingleImage => forceSingleImageHumanized, - _ => throw new NotImplementedException() - }; + by = mapping.MappingFromPerson.By.Value switch + { + IMapLogic.Mapping => nameof(IMapLogic.Mapping), + IMapLogic.Sorting => nameof(IMapLogic.Sorting), + IMapLogic.ForceSingleImage => forceSingleImageHumanized, + _ => throw new NotImplementedException() + }; + } } personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, mapping.MappingFromPerson.PersonBirthday); directory = Path.Combine(eDistanceContentTicksDirectory, by, personKeyFormatted, mapping.MappingFromPerson.SegmentB); @@ -747,6 +747,14 @@ internal abstract class MapLogic saveContainer = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, facePartsFileHolder, mapping.MappingFromItem.ResizedFileHolder, shortcutFile); } results.Add(saveContainer); + if (!isBySorting || mapping.SortingContainer is null) + continue; + if (!idToNormalizedPixelPercentageToMapping.TryGetValue(mapping.SortingContainer.Sorting.Id, out normalizedPixelPercentageToMapping)) + continue; + if (!normalizedPixelPercentageToMapping.ContainsKey(mapping.SortingContainer.Sorting.NormalizedPixelPercentage)) + continue; + saveContainer = GetSaveContainer(directory, mapping.SortingContainer, normalizedPixelPercentageToMapping[mapping.SortingContainer.Sorting.NormalizedPixelPercentage]); + results.Add(saveContainer); } return results; }