diff --git a/Drag-Drop/Form.cs b/Drag-Drop/Form.cs index db0ae00..daf969d 100644 --- a/Drag-Drop/Form.cs +++ b/Drag-Drop/Form.cs @@ -404,15 +404,17 @@ public partial class Form : System.Windows.Forms.Form foreach (string path in paths) { name = Path.GetFileName(path); - if (name.Length < 1 || (!name.StartsWith("zzz =20") && !name.StartsWith("=20"))) + if (name.Length < 1 || (!name.StartsWith("zzz =20") && !name.StartsWith("=20") && !name.StartsWith("#20"))) + // if (name.Length < 1 || !name.Contains(".Z.#20")) continue; directoryName = Path.GetDirectoryName(path); if (directoryName is null) continue; - if (!name.StartsWith("zzz =20")) + if (name.StartsWith("=20") || name.StartsWith("#20")) check = Path.Combine(directoryName, name[1..]); else check = Path.Combine(directoryName, $"zzz {name[5..]}"); + // check = Path.Combine(directoryName, name.Replace("#", string.Empty)); if (Directory.Exists(check) || File.Exists(check)) continue; if (!Directory.Exists(path)) @@ -478,7 +480,8 @@ public partial class Form : System.Windows.Forms.Form _TextBox.Text = string.Empty; else { - if (paths.All(l => l.Contains("=20"))) + if (paths.All(l => l.Contains("=20")) || paths.All(l => l.Contains("#20"))) + // if (paths.All(l => l.Contains('#'))) Rename2000(paths); else { diff --git a/Face/Models/_D_Face.cs b/Face/Models/_D_Face.cs index 3e2b7dd..a1eb1ad 100644 --- a/Face/Models/_D_Face.cs +++ b/Face/Models/_D_Face.cs @@ -337,7 +337,7 @@ public class D_Face if (location is null) continue; if (!results.Any(l => l.NormalizedRectangle == locationContainer.NormalizedRectangle)) - results.Add(new(locationContainer.FromDistanceContent, locationContainer.File, locationContainer.NormalizedRectangle, locationContainer.Directories, rectangle.Value, location)); + results.Add(new(locationContainer.FromDistanceContent, locationContainer.File, locationContainer.PersonKey, locationContainer.Id, locationContainer.NormalizedRectangle, locationContainer.Directories, rectangle.Value, location)); } } if (results.Any()) diff --git a/Instance/DlibDotNet.cs b/Instance/DlibDotNet.cs index 01d5dcd..07ab529 100644 --- a/Instance/DlibDotNet.cs +++ b/Instance/DlibDotNet.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Configuration; using Phares.Shared; using ShellProgressBar; +using System.Diagnostics; using System.Drawing.Imaging; using System.Text.Json; using View_by_Distance.Distance.Models; @@ -686,7 +687,7 @@ public partial class DlibDotNet nullablePropertyCollection.Clear(); propertyFileHolderCollection.Clear(); totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); - message = $"{i + 1:000}.{container.G} [{filteredItems.Length:000} files] / {containersLength:000} - {total} / {t} total files - {totalSeconds} total second(s) - {outputResolution} - {container.SourceDirectory}"; + message = $"{i + 1:000}.{container.G} [{filteredItems.Length:000} collection] / {containersLength:000} - {total} / {t} total collection - {totalSeconds} total second(s) - {outputResolution} - {container.SourceDirectory}"; if (_Configuration.LoadOrCreateThenSaveImageFacesResultsForOutputResolutions.Contains(outputResolution)) _Faces.SetAngleBracketCollection(dResultsFullGroupDirectory, container.SourceDirectory); if (_Configuration.SaveFaceLandmarkForOutputResolutions.Contains(outputResolution)) @@ -876,15 +877,12 @@ public partial class DlibDotNet if (_Configuration.PersonCharactersToCopyTo.Length == 1 && _Configuration.PersonCharacters.ToArray().Contains(_Configuration.PersonCharactersToCopyTo[0])) mapLogic.CopyAtLeastOneMappedFiles(_Configuration.PersonCharactersToCopyTo[0], dFacesContentDirectory, a2PeopleSingletonDirectory, mappingCollection); mapLogic.CopyManualFiles(dFacesContentDirectory, idToNormalizedRectangleToMapping); - if (_Configuration.SaveNotMappedForOutputResolutions.Contains(outputResolution)) - mapLogic.CopyNotMappedFaces(_Configuration.RangeFaceAreaPermilleTolerance, dFacesContentDirectory, idToNormalizedRectangleToMapping); if (_Configuration.SaveMappedForOutputResolutions.Contains(outputResolution)) mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, mappingCollection, idToNormalizedRectangleToMapping, personKeyToCount, totalNotMapped); if (_Configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions.Contains(outputResolution)) mapLogic.SaveFilteredOriginalImagesFromJLinks(_Configuration.JLinks, _PersonContainers, a2PeopleSingletonDirectory, mappingCollection, personKeyToCount, totalNotMapped); if (_Configuration.SaveFaceDistancesForOutputResolutions.Contains(outputResolution)) { - mapLogic.UpdatedPersonKeyToRanges(_MapConfiguration, ticks, mappingCollection); MapLogicSupport.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces); List distinctFurtherFilteredFaces = mapLogic.GetFurtherFilterBySkipCollection(distinctFilteredFaces); Dictionary> missingIdThenNormalizedRectangleToPersonContainers = mapLogic.GetMissing(idToNormalizedRectangleToMapping); @@ -907,8 +905,6 @@ public partial class DlibDotNet mapLogic.SaveContainers(totalNotMapped, updated, saveContainers); } } - if (_Configuration.SaveNotMappedForOutputResolutions.Contains(outputResolution)) - mapLogic.SaveNotMappedTicks(); } private static Container? AreAllSameEndsWith(string argZero, Container[] containers) @@ -979,7 +975,7 @@ public partial class DlibDotNet return result; } - private void ParallelFor(string eDistanceContentDirectory, List<(bool, string, int, int, IReadOnlyList)> collection, string file) + private void ParallelFor(string eDistanceContentDirectory, List> collection, long personKey, string file) { const string lnk = ".lnk"; int? id, normalizedRectangle; @@ -996,54 +992,79 @@ public partial class DlibDotNet else directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file); lock (collection) - collection.Add(new(fromDistanceContent, file, id.Value, normalizedRectangle.Value, directories)); + collection.Add(new(fromDistanceContent, file, personKey, id.Value, normalizedRectangle.Value, directories, null, null)); } - private List<(bool, string, int, int, IReadOnlyList)> GetCollection(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) + private void Verify(List> collection) + { + string key; + int normalizedRectangle; + string personKeyFormatted; + Dictionary distinct = new(); + List<(long, int, string)> duplicates = new(); + foreach (LocationContainer locationContainer in collection) + { + key = string.Concat(locationContainer.PersonKey, locationContainer.Id); + if (distinct.TryGetValue(key, out normalizedRectangle)) + { + if (normalizedRectangle == locationContainer.NormalizedRectangle) + continue; + duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.File)); + continue; + } + distinct.Add(key, locationContainer.NormalizedRectangle); + } + (); //Do they also intersect? + foreach ((long personKey, int id, string file) in duplicates) + { + _ = Process.Start("explorer.exe", string.Concat("\"", Path.GetDirectoryName(file), "\"")); + personKeyFormatted = Shared.Models.Stateless.Methods.IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personKey); + } + } + + private List> GetCollection(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) { string file; - List files = new(); - List<(bool, string, int, int, IReadOnlyList)> results = new(); - files.AddRange(Map.Models.Stateless.Methods.IMapLogic.GetDisplayDirectoryAllFiles(_PersonContainers)); - files.AddRange(Map.Models.Stateless.Methods.IMapLogic.DeleteEmptyDirectoriesAndGetMappedFaceFiles(_MapConfiguration, _PersonContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory)); - for (int i = 0; i < files.Count; i++) + List<(long PersonKey, string File)> collection = new(); + List> results = new(); + collection.AddRange(Map.Models.Stateless.Methods.IMapLogic.GetDisplayDirectoryAllFiles(_PersonContainers)); + collection.AddRange(Map.Models.Stateless.Methods.IMapLogic.DeleteEmptyDirectoriesAndGetMappedFaceFiles(_MapConfiguration, _PersonContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory)); + for (int i = 0; i < collection.Count; i++) { - file = files[i]; + file = collection[i].File; if (!file.EndsWith(".dup") && !file.EndsWith(".unk")) continue; if (!File.Exists(file)) continue; File.Move(file, file[..^4]); - files[i] = file[..^4]; + collection[i] = new(collection[i].PersonKey, file[..^4]); } - string[] distictFiles = files.Distinct().ToArray(); - if (distictFiles.Any() && (_Configuration.DistanceMoveUnableToMatch || _Configuration.DistanceRenameToMatch)) + if (collection.Any() && (_Configuration.DistanceMoveUnableToMatch || _Configuration.DistanceRenameToMatch)) { int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); string message = $") Building Mapped Face Files Collection - {totalSeconds} total second(s)"; ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism }; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; - using ProgressBar progressBar = new(distictFiles.Length, message, options); - _ = Parallel.For(0, distictFiles.Length, parallelOptions, (i, state) => + using ProgressBar progressBar = new(collection.Count, message, options); + _ = Parallel.For(0, collection.Count, parallelOptions, (i, state) => { progressBar.Tick(); - ParallelFor(eDistanceContentDirectory, results, distictFiles[i]); + ParallelFor(eDistanceContentDirectory, results, collection[i].PersonKey, collection[i].File); }); } + Verify(results); return results; } private Dictionary>> GetDictionary(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) { Dictionary>> results = new(); - LocationContainer noob; - List<(bool, string, int, int, IReadOnlyList)> collection = GetCollection(ticks, a2PeopleContentDirectory, eDistanceContentDirectory); - foreach ((bool fromDistanceContent, string file, int id, int normalizedRectangle, IReadOnlyList directories) in collection) + List> collection = GetCollection(ticks, a2PeopleContentDirectory, eDistanceContentDirectory); + foreach (LocationContainer locationContainer in collection) { - if (!results.ContainsKey(id)) - results.Add(id, new()); - noob = new LocationContainer(fromDistanceContent, file, normalizedRectangle, directories, null, null); - results[id].Add(noob); + if (!results.ContainsKey(locationContainer.Id)) + results.Add(locationContainer.Id, new()); + results[locationContainer.Id].Add(locationContainer); } return results; } @@ -1125,6 +1146,8 @@ public partial class DlibDotNet distinctFilteredFaces = GetFilteredDistinctFaces(argZero, containers); mappingCollection = MapLogicSupport.GetSelectedMappingCollection(distinctFilteredFaces); totalNotMapped = mapLogic.UpdateMappingFromPerson(mappingCollection); + if (a2PeopleContentDirectory is not null) + mapLogic.CreateTree(ticks, a2PeopleContentDirectory); if (_ArgZeroIsConfigurationRootDirectory && _Configuration.SaveResizedSubfiles && outputResolution == _Configuration.OutputResolutions[0] diff --git a/Instance/Models/Binder/Configuration.cs b/Instance/Models/Binder/Configuration.cs index 79be0e2..8a45029 100644 --- a/Instance/Models/Binder/Configuration.cs +++ b/Instance/Models/Binder/Configuration.cs @@ -68,7 +68,6 @@ public class Configuration [Display(Name = "Save Face Landmark For Output Resolutions"), Required] public string[] SaveFaceLandmarkForOutputResolutions { get; set; } [Display(Name = "Save Full Year Of Random Files"), Required] public bool? SaveFullYearOfRandomFiles { get; set; } [Display(Name = "Save Mapped"), Required] public string[] SaveMappedForOutputResolutions { get; set; } - [Display(Name = "Save Not Mapped"), Required] public string[] SaveNotMappedForOutputResolutions { get; set; } [Display(Name = "Save Resized Images by Person Key Formatted"), Required] public string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions { get; set; } [Display(Name = "Save Random For Output Resolutions"), Required] public string[] SaveRandomForOutputResolutions { get; set; } [Display(Name = "Save Resized Subfiles"), Required] public bool? SaveResizedSubfiles { get; set; } @@ -191,7 +190,6 @@ public class Configuration if (configuration.SaveFullYearOfRandomFiles is null) throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles)); configuration.SaveMappedForOutputResolutions ??= Array.Empty(); - configuration.SaveNotMappedForOutputResolutions ??= Array.Empty(); configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions ??= Array.Empty(); configuration.SaveRandomForOutputResolutions ??= Array.Empty(); if (configuration.SaveResizedSubfiles is null) @@ -270,7 +268,6 @@ public class Configuration configuration.SaveFilteredOriginalImagesFromJLinksForOutputResolutions, configuration.SaveFullYearOfRandomFiles.Value, configuration.SaveMappedForOutputResolutions, - configuration.SaveNotMappedForOutputResolutions, configuration.SaveRandomForOutputResolutions, configuration.SaveResizedSubfiles.Value, configuration.SaveShortcutsForOutputResolutions, diff --git a/Instance/Models/Configuration.cs b/Instance/Models/Configuration.cs index 68e742c..4b9bab7 100644 --- a/Instance/Models/Configuration.cs +++ b/Instance/Models/Configuration.cs @@ -64,7 +64,6 @@ public class Configuration public string[] SaveFaceLandmarkForOutputResolutions { init; get; } public bool SaveFullYearOfRandomFiles { init; get; } public string[] SaveMappedForOutputResolutions { init; get; } - public string[] SaveNotMappedForOutputResolutions { init; get; } public string[] SaveFilteredOriginalImagesFromJLinksForOutputResolutions { init; get; } public string[] SaveRandomForOutputResolutions { init; get; } public bool SaveResizedSubfiles { init; get; } @@ -135,7 +134,6 @@ public class Configuration string[] saveFilteredOriginalImagesFromJLinksForOutputResolutions, bool saveFullYearOfRandomFiles, string[] saveMappedForOutputResolutions, - string[] saveNotMappedForOutputResolutions, string[] saveRandomForOutputResolutions, bool saveResizedSubfiles, string[] saveShortcutsForOutputResolutions, @@ -203,7 +201,6 @@ public class Configuration SaveFaceLandmarkForOutputResolutions = saveFaceLandmarkForOutputResolutions; SaveFullYearOfRandomFiles = saveFullYearOfRandomFiles; SaveMappedForOutputResolutions = saveMappedForOutputResolutions; - SaveNotMappedForOutputResolutions = saveNotMappedForOutputResolutions; SaveFilteredOriginalImagesFromJLinksForOutputResolutions = saveFilteredOriginalImagesFromJLinksForOutputResolutions; SaveResizedSubfiles = saveResizedSubfiles; SaveRandomForOutputResolutions = saveRandomForOutputResolutions; diff --git a/Instance/appsettings.Development.json b/Instance/appsettings.Development.json index 6625940..90a8150 100644 --- a/Instance/appsettings.Development.json +++ b/Instance/appsettings.Development.json @@ -43,7 +43,7 @@ "PropertyContentCollectionFiles": [], "RangeDaysDeltaTolerance": [ 0, - 2100, + 1, 123456 ], "RangeDistanceTolerance": [ @@ -67,7 +67,6 @@ "SaveFaceLandmarkForOutputResolutions": [], "SaveFilteredOriginalImagesFromJLinksForOutputResolutions": [], "SaveMappedForOutputResolutions": [], - "SaveNotMappedForOutputResolutions": [], "SaveRandomForOutputResolutions": [ "7680 x 4320" ], diff --git a/Instance/appsettings.json b/Instance/appsettings.json index ba477c1..c51a660 100644 --- a/Instance/appsettings.json +++ b/Instance/appsettings.json @@ -154,7 +154,6 @@ "SaveFaceLandmarkForOutputResolutions": [], "SaveFilteredOriginalImagesFromJLinksForOutputResolutions": [], "SaveMappedForOutputResolutions": [], - "SaveNotMappedForOutputResolutions": [], "SaveRandomForOutputResolutions": [], "SaveShortcutsForOutputResolutions": [], "VerifyToSeason": [], diff --git a/Map/Models/MapLogic.cs b/Map/Models/MapLogic.cs index 79c0b47..0e6002a 100644 --- a/Map/Models/MapLogic.cs +++ b/Map/Models/MapLogic.cs @@ -13,7 +13,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic protected readonly Dictionary> _SkipCollection; protected readonly List _NotMappedPersonContainers; protected readonly Dictionary _PersonKeyToPersonContainer; - protected Dictionary? _PersonKeyToRanges; protected readonly Dictionary> _IdThenNormalizedRectangleToPersonContainers; public Dictionary KeyValuePairs => throw new NotImplementedException(); @@ -101,6 +100,37 @@ public class MapLogic : Shared.Models.Methods.IMapLogic return result; } + public void CreateTree(long ticks, string a2PeopleContentDirectory) + { + if (_Configuration is null) + throw new NullReferenceException(nameof(_Configuration)); + string by; + string directory; + string[] segments; + const int zero = 0; + string personKeyFormatted; + PersonBirthday personBirthday; + string rootDirectory = Path.Combine(a2PeopleContentDirectory, $"{ticks}-Tree"); + foreach (KeyValuePair personKeyToPersonContainer in _PersonKeyToPersonContainer) + { + if (personKeyToPersonContainer.Value.Key is null || personKeyToPersonContainer.Value.Birthdays is null || !personKeyToPersonContainer.Value.Birthdays.Any()) + continue; + if (personKeyToPersonContainer.Value.DisplayDirectoryName == _Configuration.MappingDefaultName) + continue; + personBirthday = personKeyToPersonContainer.Value.Birthdays[zero]; + personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personBirthday); + by = IPersonBirthday.IsCounterPersonBirthday(personBirthday) ? _PropertyConfiguration.ResultAllInOne : "People"; + segments = personKeyToPersonContainer.Value.DisplayDirectoryName.Split(_Configuration.PersonCharacters.ToArray()); + if (segments.Length < 2) + directory = Path.Combine(rootDirectory, $"000 {personKeyFormatted} {personKeyToPersonContainer.Value.DisplayDirectoryName}"); + else + directory = Path.Combine(rootDirectory, $"{segments[1].PadLeft(3, '0')} {personKeyFormatted} {personKeyToPersonContainer.Value.DisplayDirectoryName}"); + if (Directory.Exists(directory)) + continue; + _ = Directory.CreateDirectory(directory); + } + } + private static Dictionary> GetIdToPersonKeys(Dictionary> keyValuePairs) { Dictionary> results = new(); @@ -593,23 +623,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory); } - private List<(long, long, long, long)> GetPersonKeysRangesCollection(PersonContainer[] personContainers) - { - if (_PersonKeyToRanges is null) - throw new NullReferenceException(nameof(_PersonKeyToRanges)); - List<(long, long, long, long)> results = new(); - (long, long, long, long) singleton; - foreach (PersonContainer personContainer in personContainers) - { - if (personContainer.Key is null) - continue; - if (!_PersonKeyToRanges.TryGetValue(personContainer.Key.Value, out singleton)) - continue; - results.Add(singleton); - } - return results; - } - public bool Used(FaceDistance faceDistanceEncoding) { bool result = false; @@ -636,7 +649,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic FaceDistance faceDistanceLength; List? normalizedRectangles; Dictionary? normalizedRectangleToPersonContainers; - List<(long lcl, long minimum, long maximum, long ucl)> personKeysRangesCollection; for (int j = 0; j < faceDistanceLengths.Count; j++) { if (faceDistanceEncoding.NormalizedRectangle is null) @@ -655,16 +667,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic throw new NotSupportedException(); if (faceDistanceLength.Length == 0) continue; - if (!_IdThenNormalizedRectangleToPersonContainers.TryGetValue(faceDistanceLength.Id, out normalizedRectangleToPersonContainers)) - personKeysRangesCollection = new(); - else - { - if (!normalizedRectangleToPersonContainers.ContainsKey(faceDistanceLength.NormalizedRectangle.Value)) - personKeysRangesCollection = new(); - else - personKeysRangesCollection = GetPersonKeysRangesCollection(normalizedRectangleToPersonContainers[faceDistanceLength.NormalizedRectangle.Value]); - } - sorting = ISorting.Get(_Configuration.FaceDistancePermyriad, _Configuration.RangeDistanceTolerance, faceDistanceEncoding, faceDistanceLength, personKeysRangesCollection); + sorting = ISorting.Get(_Configuration.FaceDistancePermyriad, _Configuration.RangeDistanceTolerance, faceDistanceEncoding, faceDistanceLength); if (sorting.DistancePermyriad == 0) continue; if (sorting.Id == faceDistanceEncoding.Id) @@ -787,15 +790,13 @@ public class MapLogic : Shared.Models.Methods.IMapLogic string by = nameof(Shared.Models.Stateless.IMapLogic.ManualCopy); Dictionary? normalizedRectangleToPeronContainerCollection; string successfull = $"_ {nameof(Shared.Models.Stateless.IMapLogic.ManualCopy).Humanize(LetterCasing.Title)} Successfull"; - foreach (KeyValuePair keyValuePair in _PersonKeyToPersonContainer) + foreach (KeyValuePair personKeyToPersonContainer in _PersonKeyToPersonContainer) { - if (keyValuePair.Value.Key is null || keyValuePair.Value.Birthdays is null || !keyValuePair.Value.Birthdays.Any()) + if (personKeyToPersonContainer.Value.Key is null || personKeyToPersonContainer.Value.Birthdays is null || !personKeyToPersonContainer.Value.Birthdays.Any()) continue; - personBirthday = keyValuePair.Value.Birthdays[zero]; - foreach (string personDisplayDirectoryAllFile in keyValuePair.Value.DisplayDirectoryAllFiles) + personBirthday = personKeyToPersonContainer.Value.Birthdays[zero]; + foreach (string personDisplayDirectoryAllFile in personKeyToPersonContainer.Value.DisplayDirectoryAllFiles) { - if (personDisplayDirectoryAllFile.Contains("-2318605")) - continue; if (!personDisplayDirectoryAllFile.EndsWith(_Configuration.FacesFileNameExtension)) continue; (id, normalizedRectangle) = IMapping.GetConverted(_Configuration.FacesFileNameExtension, personDisplayDirectoryAllFile); @@ -807,9 +808,9 @@ public class MapLogic : Shared.Models.Methods.IMapLogic personDisplayFileName = Path.GetFileName(personDisplayDirectoryAllFile); personDisplayDirectory = Path.GetDirectoryName(personDisplayDirectoryAllFile); personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personBirthday); - mappingSegmentB = Stateless.MapLogic.GetMappingSegmentB(_Ticks, personBirthday, keyValuePair.Value.ApproximateYears, fileInfo.CreationTime, isWrongYear: null); + mappingSegmentB = Stateless.MapLogic.GetMappingSegmentB(_Ticks, personBirthday, personKeyToPersonContainer.Value.ApproximateYears, fileInfo.CreationTime, isWrongYear: null); directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, mappingSegmentB); - personDirectory = Path.Combine(directory, keyValuePair.Value.DisplayDirectoryName, "lnk"); + personDirectory = Path.Combine(directory, personKeyToPersonContainer.Value.DisplayDirectoryName, "lnk"); if (!idToNormalizedRectangleToMapping.TryGetValue(id.Value, out normalizedRectangleToMapping)) continue; if (!normalizedRectangleToMapping.ContainsKey(normalizedRectangle.Value)) @@ -913,32 +914,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic } } - public void SaveNotMappedTicks() - { - if (_Configuration is null) - throw new NullReferenceException(nameof(_Configuration)); - int updated = 0; - string directory; - const int zero = 0; - int totalNotMapped = 0; - string personKeyFormatted; - SaveContainer saveContainer; - PersonBirthday personBirthday; - List saveContainers = new(); - const string facePopulatedKey = nameof(Shared.Models.Stateless.IMapLogic.Sorting); - foreach (PersonContainer personContainer in _NotMappedPersonContainers) - { - if (personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any()) - continue; - personBirthday = personContainer.Birthdays[zero]; - personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personBirthday); - directory = Path.Combine(_EDistanceContentTicksDirectory, $"{facePopulatedKey}NotMapped", personKeyFormatted, _Configuration.MappingDefaultName); - saveContainer = new(directory); - saveContainers.Add(saveContainer); - } - SaveContainers(totalNotMapped, updated, saveContainers); - } - private (string, PersonBirthday?) GetPersonBirthday(string[] directoryNames) { if (_Configuration is null) @@ -1226,67 +1201,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic } } - private List<(string, FileHolder, string)> GetCollection(string dFacesContentDirectory, Dictionary> idToNormalizedRectangleToMapping) - { - if (_Configuration is null) - throw new NullReferenceException(nameof(_Configuration)); - List<(string, FileHolder, string)> results = new(); - Mapping mapping; - string checkFile; - string directory; - string? directoryName; - string? facesDirectory; - FileHolder faceFileHolder; - List? normalizedRectangles; - string by = nameof(Shared.Models.Stateless.IMapLogic.CopyNotMappedFaces); - Dictionary? normalizedRectangleToPersonContainers; - foreach (KeyValuePair> keyValuePair in idToNormalizedRectangleToMapping) - { - _ = _IdThenNormalizedRectangleToPersonContainers.TryGetValue(keyValuePair.Key, out normalizedRectangleToPersonContainers); - foreach (KeyValuePair normalizedRectangleAndMapping in keyValuePair.Value) - { - mapping = normalizedRectangleAndMapping.Value; - if (normalizedRectangleToPersonContainers is not null && normalizedRectangleToPersonContainers.ContainsKey(mapping.MappingFromLocation.NormalizedRectangle)) - continue; - _ = _SkipCollection.TryGetValue(keyValuePair.Key, out normalizedRectangles); - if (normalizedRectangles is not null && normalizedRectangles.Contains(mapping.MappingFromLocation.NormalizedRectangle)) - continue; - directoryName = Path.GetDirectoryName(mapping.MappingFromItem.RelativePath); - facesDirectory = GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem); - if (facesDirectory is null) - continue; - faceFileHolder = new(Path.Combine(facesDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}")); - if (directoryName is null || !faceFileHolder.Exists) - continue; - directory = Path.Combine(_EDistanceContentTicksDirectory, by, $"{mapping.MappingFromLocation.AreaPermille:0000}A{mapping.MappingFromItem.MinimumDateTime.ToString("yyyy")[..3]}#"); - checkFile = Path.Combine(directory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}"); - results.Add(new(directory, faceFileHolder, checkFile)); - } - } - return results; - } - - public void CopyNotMappedFaces(int[] rangeFaceAreaPermilleTolerance, string dFacesContentDirectory, Dictionary> idToNormalizedRectangleToMapping) - { - if (_Configuration is null) - throw new NullReferenceException(nameof(_Configuration)); - List<(string Directory, FileHolder FaceFileHolder, string CheckFile)> collection = GetCollection(dFacesContentDirectory, idToNormalizedRectangleToMapping); - string[] directories = (from l in collection select l.Directory).Distinct().ToArray(); - foreach (string directory in directories) - { - if (string.IsNullOrEmpty(directory)) - continue; - if (!Directory.Exists(directory)) - _ = Directory.CreateDirectory(directory); - } - foreach ((string directory, FileHolder faceFileHolder, string checkFile) in collection) - { - if (File.Exists(checkFile)) - continue; - File.Copy(faceFileHolder.FullName, checkFile); - } - } - public Dictionary> GetMissing(Dictionary> idToNormalizedRectangleToMapping) { Dictionary> results = new(); @@ -1299,13 +1213,6 @@ public class MapLogic : Shared.Models.Methods.IMapLogic return results; } - public void UpdatedPersonKeyToRanges(Configuration configuration, long ticks, Mapping[] mappingCollection) - { - Dictionary personKeyToRanges = new(); - Stateless.MapLogic.SetPersonTicks(configuration, ticks, mappingCollection, personKeyToRanges, _IdThenNormalizedRectangleToPersonContainers); - _PersonKeyToRanges = personKeyToRanges; - } - public List GetFurtherFilterBySkipCollection(List distinctFilteredFaces) { List results = new(); diff --git a/Map/Models/Stateless/MapLogic.cs b/Map/Models/Stateless/MapLogic.cs index 70cff0b..e21b40d 100644 --- a/Map/Models/Stateless/MapLogic.cs +++ b/Map/Models/Stateless/MapLogic.cs @@ -209,9 +209,9 @@ internal abstract class MapLogic return results; } - internal static List DeleteEmptyDirectoriesAndGetMappedFaceFiles(Configuration configuration, PersonContainer[] personContainers, long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) + internal static List<(long, string)> DeleteEmptyDirectoriesAndGetMappedFaceFiles(Configuration configuration, PersonContainer[] personContainers, long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) { - List results = new(); + List<(long, string)> results = new(); List<(long? PersonKey, string Line)> lines = new(); _ = GetDistinctCollection(configuration, personContainers, new(), new()); int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); @@ -230,13 +230,25 @@ internal abstract class MapLogic } ticksDirectories = Directory.GetDirectories(eDistanceContentDirectory, "*", SearchOption.TopDirectoryOnly); } + long personKey; + List distinct = new(); + PersonBirthday? personBirthday; string message = $") {ticksDirectories.Length:000} collect from and clean ticks Director(ies) - A - {totalSeconds} total second(s)"; List personKeyFormattedCollection = GetPersonKeyFormattedCollection(configuration, personContainers, lines); if (!string.IsNullOrEmpty(a2PeopleContentDirectory)) File.WriteAllLines(Path.Combine(a2PeopleContentDirectory, "People - C.tsv"), from l in lines select l.Line); List<(string, string[], string)> collection = DeleteEmptyDirectoriesAndGetCollection(configuration, personKeyFormattedCollection, ticksDirectories, message); - foreach ((_, _, string mappedFaceFile) in collection) - results.Add(mappedFaceFile); + foreach ((string personKeyFormatted, _, string mappedFaceFile) in collection) + { + personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormatted); + if (personBirthday is null) + continue; + if (distinct.Contains(mappedFaceFile)) + continue; + distinct.Add(mappedFaceFile); + personKey = personBirthday.Value.Ticks; + results.Add(new(personKey, mappedFaceFile)); + } return results; } @@ -253,7 +265,7 @@ internal abstract class MapLogic return results.ToArray(); } - private static void SetKeyValuePairs(Configuration configuration, List personContainers, Dictionary> personKeyToPersonContainerCollection, Dictionary personKeyFormattedToPersonContainer, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection, List<(string, int, int)> incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection, Dictionary personKeyToPersonContainer, Dictionary> idThenNormalizedRectangleToPersonContainers, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer, Dictionary> incorrectIdThenNormalizedRectangleToPersonContainers) + private static void SetKeyValuePairs(Configuration configuration, List personContainers, Dictionary> personKeyToPersonContainerCollection, Dictionary personKeyFormattedToPersonContainer, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection, Dictionary personKeyToPersonContainer, Dictionary> idThenNormalizedRectangleToPersonContainers, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer, Dictionary> incorrectIdThenNormalizedRectangleToPersonContainers) { PersonBirthday? personBirthday; PersonContainer[] distinctPersonContainers; @@ -300,26 +312,6 @@ internal abstract class MapLogic idThenNormalizedRectangleToPersonContainers[keyValuePair.Key].Add(innerKeyValuePair.Key, distinctPersonContainers); } }; - if (incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection.Any()) - { - PersonContainer personContainer; - foreach ((string personKeyFormatted, int id, int normalizedRectangle) in incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection) - { - personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormatted); - if (personBirthday is null) - continue; - if (!incorrectIdThenNormalizedRectangleToPersonContainerCollection.ContainsKey(id)) - incorrectIdThenNormalizedRectangleToPersonContainerCollection.Add(id, new()); - if (!personKeyFormattedToPersonContainer.ContainsKey(personKeyFormatted)) - { - personContainer = new(configuration.PersonCharacters.ToArray(), personBirthday, configuration.MappingDefaultName); - personKeyFormattedToPersonContainer.Add(personKeyFormatted, personContainer); - } - if (!incorrectIdThenNormalizedRectangleToPersonContainerCollection[id].ContainsKey(normalizedRectangle)) - incorrectIdThenNormalizedRectangleToPersonContainerCollection[id].Add(normalizedRectangle, new()); - incorrectIdThenNormalizedRectangleToPersonContainerCollection[id][normalizedRectangle].Add(personKeyFormattedToPersonContainer[personKeyFormatted]); - } - } foreach (KeyValuePair>> keyValuePair in incorrectIdThenNormalizedRectangleToPersonContainerCollection) { incorrectIdThenNormalizedRectangleToPersonContainers.Add(keyValuePair.Key, new()); @@ -356,7 +348,7 @@ internal abstract class MapLogic return results; } - private static (int, int) SetCollectionsAndGetUnableToConvertCount(Configuration configuration, long ticks, Dictionary personKeyFormattedToNewestPersonKeyFormatted, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection, List<(string, int, int)> incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection, List<(string, string[], string)> collection) + private static (int, int) SetCollectionsAndGetUnableToConvertCount(Configuration configuration, long ticks, Dictionary personKeyFormattedToNewestPersonKeyFormatted, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection, List<(string, string[], string)> collection) { int result = 0; int? id; @@ -389,10 +381,9 @@ internal abstract class MapLogic else newestPersonKeyFormatted = personKeyFormattedToNewestPersonKeyFormatted[personKeyFormatted]; personDisplayDirectoryName = personDisplayDirectoryNames[^1]; - if (string.IsNullOrEmpty(personDisplayDirectoryName) || personDisplayDirectoryName[0] == '!') - incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection.Add(new(newestPersonKeyFormatted, id.Value, normalizedRectangle.Value)); - else - personKeyFormattedIdThenNormalizedRectangleCollection.Add(new(newestPersonKeyFormatted, personDisplayDirectoryNames, id.Value, normalizedRectangle.Value)); + if (string.IsNullOrEmpty(personDisplayDirectoryName)) + continue; + personKeyFormattedIdThenNormalizedRectangleCollection.Add(new(newestPersonKeyFormatted, personDisplayDirectoryNames, id.Value, normalizedRectangle.Value)); } if (duplicateMappedFaceFiles.Any()) { @@ -429,73 +420,6 @@ internal abstract class MapLogic return results; } - private static void SetPersonKeysRanges(Configuration configuration, long ticks, Dictionary> personKeyToMinimumDateTimeTicks, Dictionary personKeyToRanges) - { - long lcl; - long ucl; - long maximum; - long minimum; - double average; - long[] collection; - double standardDeviation; - List sumCollection; - foreach (KeyValuePair> keyValuePair in personKeyToMinimumDateTimeTicks) - { - minimum = keyValuePair.Value.Min(); - if (keyValuePair.Value.Count < configuration.SortingMinimumToUseSigma) - { - maximum = keyValuePair.Value.Max(); - personKeyToRanges.Add(keyValuePair.Key, new(new DateTime(minimum).AddDays(-configuration.RangeDaysDeltaTolerance).Ticks, minimum, maximum, new DateTime(maximum).AddDays(configuration.RangeDaysDeltaTolerance).Ticks)); - } - else - { - collection = (from l in keyValuePair.Value select l - minimum).ToArray(); - maximum = collection.Max() + minimum; - sumCollection = GetSumCollection(collection); - if (sumCollection.Count < 2) - average = (sumCollection.Sum() / collection.Length) + minimum; - else - average = (sumCollection.Sum() / collection.Length) + minimum; - standardDeviation = GetStandardDeviation(collection, average); - ucl = (long)(average + (standardDeviation * Shared.Models.Stateless.IMapLogic.Sigma)); - lcl = (long)(average - (standardDeviation * Shared.Models.Stateless.IMapLogic.Sigma)); - if (lcl < 0) - lcl = 0; - if (ucl > 0) - ucl = ticks; - personKeyToRanges.Add(keyValuePair.Key, new(lcl, minimum, maximum, ucl)); - } - } - } - - internal static void SetPersonTicks(Configuration configuration, long ticks, Mapping[] mappingCollection, Dictionary personKeyToRanges, Dictionary> idThenNormalizedRectangleToPersonContainers) - { - PersonContainer[]? personContainers; - Dictionary? keyValuePairs; - Dictionary> personKeyToMinimumDateTimeTicks = new(); - int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); - string message = $") {mappingCollection.Length:000} Set Person Ticks - {totalSeconds} total second(s)"; - ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; - using ProgressBar progressBar = new(mappingCollection.Length, message, options); - foreach (Mapping mapping in mappingCollection) - { - progressBar.Tick(); - if (!idThenNormalizedRectangleToPersonContainers.TryGetValue(mapping.MappingFromItem.Id, out keyValuePairs)) - continue; - if (!keyValuePairs.TryGetValue(mapping.MappingFromLocation.NormalizedRectangle, out personContainers)) - continue; - foreach (PersonContainer personContainer in personContainers) - { - if (personContainer.Key is null) - continue; - if (!personKeyToMinimumDateTimeTicks.ContainsKey(personContainer.Key.Value)) - personKeyToMinimumDateTimeTicks.Add(personContainer.Key.Value, new()); - personKeyToMinimumDateTimeTicks[personContainer.Key.Value].Add(mapping.MappingFromItem.MinimumDateTime.Ticks); - } - } - SetPersonKeysRanges(configuration, ticks, personKeyToMinimumDateTimeTicks, personKeyToRanges); - } - private static List GetNotMappedPersonContainers(Configuration configuration, List personContainers, List personKeys, long[] personKeyCollection) { List results = new(); @@ -592,7 +516,6 @@ internal abstract class MapLogic Dictionary personKeyFormattedToNewestPersonKeyFormatted = new(); Dictionary personKeyFormattedToPersonContainer = new(); Dictionary> personKeyToPersonContainerCollection = new(); - List<(string, int, int)> incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection = new(); List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection = new(); List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer = new(); Dictionary> incorrectIdThenNormalizedRectangleToPersonContainers = new(); @@ -602,8 +525,8 @@ internal abstract class MapLogic string[] ticksDirectories = Directory.GetDirectories(eDistanceContentDirectory, "*", SearchOption.TopDirectoryOnly); message = $") {ticksDirectories.Length:000} compile from and clean ticks Director(ies) - B - {totalSeconds} total second(s)"; List<(string, string[], string)> collection = DeleteEmptyDirectoriesAndGetCollection(configuration, personKeyFormattedCollection, ticksDirectories, message); - (int unableToMatchCount, int duplicateCount) = SetCollectionsAndGetUnableToConvertCount(configuration, ticks, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedIdThenNormalizedRectangleCollection, incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection, collection); - SetKeyValuePairs(configuration, personContainers, personKeyToPersonContainerCollection, personKeyFormattedToPersonContainer, personKeyFormattedIdThenNormalizedRectangleCollection, incorrectPersonKeyFormattedIdThenNormalizedRectangleCollection, personKeyToPersonContainer, idThenNormalizedRectangleToPersonContainers, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer, incorrectIdThenNormalizedRectangleToPersonContainers); + (int unableToMatchCount, int duplicateCount) = SetCollectionsAndGetUnableToConvertCount(configuration, ticks, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedIdThenNormalizedRectangleCollection, collection); + SetKeyValuePairs(configuration, personContainers, personKeyToPersonContainerCollection, personKeyFormattedToPersonContainer, personKeyFormattedIdThenNormalizedRectangleCollection, personKeyToPersonContainer, idThenNormalizedRectangleToPersonContainers, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer, incorrectIdThenNormalizedRectangleToPersonContainers); totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); message = $") {collection.Count:000} message from ticks Director(ies) - D - {duplicateCount} Duplicate Count {unableToMatchCount} Unable To Match Count / {collection.Count} Collection - {totalSeconds} total second(s)"; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; @@ -736,16 +659,22 @@ internal abstract class MapLogic } } - internal static List GetDisplayDirectoryAllFiles(PersonContainer[] personContainers) + internal static List<(long, string)> GetDisplayDirectoryAllFiles(PersonContainer[] personContainers) { - List results = new(); + List<(long, string)> results = new(); + List distinct = new(); foreach (PersonContainer personContainer in personContainers) { + if (personContainer.Key is null) + continue; foreach (string displayDirectoryAllFile in personContainer.DisplayDirectoryAllFiles) { if (displayDirectoryAllFile.EndsWith(".json")) continue; - results.Add(displayDirectoryAllFile); + if (distinct.Contains(displayDirectoryAllFile)) + continue; + distinct.Add(displayDirectoryAllFile); + results.Add(new(personContainer.Key.Value, displayDirectoryAllFile)); } } return results; diff --git a/Map/Models/Stateless/Methods/IMapLogic.cs b/Map/Models/Stateless/Methods/IMapLogic.cs index 87ce209..5fabff3 100644 --- a/Map/Models/Stateless/Methods/IMapLogic.cs +++ b/Map/Models/Stateless/Methods/IMapLogic.cs @@ -3,14 +3,14 @@ namespace View_by_Distance.Map.Models.Stateless.Methods; public interface IMapLogic { // ... - List TestStatic_GetDisplayDirectoryAllFiles(Shared.Models.PersonContainer[] personContainers) => + List<(long, string)> TestStatic_GetDisplayDirectoryAllFiles(Shared.Models.PersonContainer[] personContainers) => GetDisplayDirectoryAllFiles(personContainers); - static List GetDisplayDirectoryAllFiles(Shared.Models.PersonContainer[] personContainers) => + static List<(long, string)> GetDisplayDirectoryAllFiles(Shared.Models.PersonContainer[] personContainers) => MapLogic.GetDisplayDirectoryAllFiles(personContainers); - List TestStatic_DeleteEmptyDirectoriesAndGetMappedFaceFiles(Configuration configuration, Shared.Models.PersonContainer[] personContainers, long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) => + List<(long, string)> TestStatic_DeleteEmptyDirectoriesAndGetMappedFaceFiles(Configuration configuration, Shared.Models.PersonContainer[] personContainers, long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) => DeleteEmptyDirectoriesAndGetMappedFaceFiles(configuration, personContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory); - static List DeleteEmptyDirectoriesAndGetMappedFaceFiles(Configuration configuration, Shared.Models.PersonContainer[] personContainers, long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) => + static List<(long, string)> DeleteEmptyDirectoriesAndGetMappedFaceFiles(Configuration configuration, Shared.Models.PersonContainer[] personContainers, long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory) => MapLogic.DeleteEmptyDirectoriesAndGetMappedFaceFiles(configuration, personContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory); } \ No newline at end of file diff --git a/Shared/Models/LocationContainer.cs b/Shared/Models/LocationContainer.cs index 4f9fb45..b3d92be 100644 --- a/Shared/Models/LocationContainer.cs +++ b/Shared/Models/LocationContainer.cs @@ -2,5 +2,5 @@ using System.Drawing; namespace View_by_Distance.Shared.Models; -public record LocationContainer(bool FromDistanceContent, string File, int NormalizedRectangle, IReadOnlyList Directories, Rectangle? Rectangle, Location? Location) +public record LocationContainer(bool FromDistanceContent, string File, long PersonKey, int Id, int NormalizedRectangle, IReadOnlyList Directories, Rectangle? Rectangle, Location? Location) { } \ No newline at end of file diff --git a/Shared/Models/Properties/ISorting.cs b/Shared/Models/Properties/ISorting.cs index 082a845..b15d408 100644 --- a/Shared/Models/Properties/ISorting.cs +++ b/Shared/Models/Properties/ISorting.cs @@ -7,6 +7,5 @@ public interface ISorting public int DistancePermyriad { init; get; } public int Id { init; get; } public int NormalizedRectangle { init; get; } - public int WithinRange { init; get; } } \ No newline at end of file diff --git a/Shared/Models/Sorting.cs b/Shared/Models/Sorting.cs index d2aa9aa..e0bfaa7 100644 --- a/Shared/Models/Sorting.cs +++ b/Shared/Models/Sorting.cs @@ -11,21 +11,19 @@ public record class Sorting : Properties.ISorting public int Id { init; get; } public int NormalizedRectangle { init; get; } public bool Older { init; get; } - public int WithinRange { init; get; } [JsonConstructor] - public Sorting(int daysDelta, int distancePermyriad, int id, int normalizedRectangle, bool older, int withinRange) + public Sorting(int daysDelta, int distancePermyriad, int id, int normalizedRectangle, bool older) { DaysDelta = daysDelta; DistancePermyriad = distancePermyriad; Id = id; NormalizedRectangle = normalizedRectangle; Older = older; - WithinRange = withinRange; } public Sorting(Mapping mapping) : - this(0, 0, mapping.MappingFromItem.Id, mapping.MappingFromLocation.NormalizedRectangle, false, 0) + this(0, 0, mapping.MappingFromItem.Id, mapping.MappingFromLocation.NormalizedRectangle, false) { } public override string ToString() diff --git a/Shared/Models/SortingContainer.cs b/Shared/Models/SortingContainer.cs index bb30eab..834354e 100644 --- a/Shared/Models/SortingContainer.cs +++ b/Shared/Models/SortingContainer.cs @@ -17,7 +17,7 @@ public record class SortingContainer : Properties.ISortingContainer public override string ToString() { - string result = string.Concat(Mapping.MappingFromItem.Id, '\t', Mapping.MappingFromLocation.NormalizedRectangle, '\t', Sorting.Id, '\t', Sorting.NormalizedRectangle, '\t', Sorting.Older, '\t', Sorting.WithinRange, '\t', Sorting.DistancePermyriad, '\t', Sorting.DaysDelta); + string result = string.Concat(Mapping.MappingFromItem.Id, '\t', Mapping.MappingFromLocation.NormalizedRectangle, '\t', Sorting.Id, '\t', Sorting.NormalizedRectangle, '\t', Sorting.Older, '\t', '\t', Sorting.DistancePermyriad, '\t', Sorting.DaysDelta); return result; } diff --git a/Shared/Models/Stateless/Methods/ISorting.cs b/Shared/Models/Stateless/Methods/ISorting.cs index d03d101..1852258 100644 --- a/Shared/Models/Stateless/Methods/ISorting.cs +++ b/Shared/Models/Stateless/Methods/ISorting.cs @@ -6,11 +6,11 @@ public interface ISorting Models.Sorting[] TestStatic_Sort(List collection) => Sort(collection); static Models.Sorting[] Sort(List collection) => - (from l in collection orderby l.WithinRange, l.DistancePermyriad, l.DaysDelta select l).ToArray(); + (from l in collection orderby l.DistancePermyriad, l.DaysDelta select l).ToArray(); - Models.Sorting TestStatic_Get(int faceDistancePermyriad, double rangeDistanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength, List<(long lcl, long minimum, long maximum, long ucl)> personKeysRangesCollection) => - Get(faceDistancePermyriad, rangeDistanceTolerance, faceDistanceEncoding, faceDistanceLength, personKeysRangesCollection); - static Models.Sorting Get(int faceDistancePermyriad, double rangeDistanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength, List<(long lcl, long minimum, long maximum, long ucl)> personKeysRangesCollection) => - Sorting.Get(faceDistancePermyriad, rangeDistanceTolerance, faceDistanceEncoding, faceDistanceLength, personKeysRangesCollection); + Models.Sorting TestStatic_Get(int faceDistancePermyriad, double rangeDistanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength) => + Get(faceDistancePermyriad, rangeDistanceTolerance, faceDistanceEncoding, faceDistanceLength); + static Models.Sorting Get(int faceDistancePermyriad, double rangeDistanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength) => + Sorting.Get(faceDistancePermyriad, rangeDistanceTolerance, faceDistanceEncoding, faceDistanceLength); } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/ISortingContainer.cs b/Shared/Models/Stateless/Methods/ISortingContainer.cs index ed1ea2c..dc6a5ed 100644 --- a/Shared/Models/Stateless/Methods/ISortingContainer.cs +++ b/Shared/Models/Stateless/Methods/ISortingContainer.cs @@ -6,6 +6,6 @@ public interface ISortingContainer Models.SortingContainer[] TestStatic_Sort(List collection) => Sort(collection); static Models.SortingContainer[] Sort(List collection) => - (from l in collection orderby l.Sorting.WithinRange, l.Sorting.DistancePermyriad, l.Sorting.DaysDelta select l).ToArray(); + (from l in collection orderby l.Sorting.DistancePermyriad, l.Sorting.DaysDelta select l).ToArray(); } \ No newline at end of file diff --git a/Shared/Models/Stateless/Methods/Sorting.cs b/Shared/Models/Stateless/Methods/Sorting.cs index edece51..5997967 100644 --- a/Shared/Models/Stateless/Methods/Sorting.cs +++ b/Shared/Models/Stateless/Methods/Sorting.cs @@ -3,7 +3,7 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods; internal abstract class Sorting { - internal static Models.Sorting Get(int faceDistancePermyriad, double rangeDistanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength, List<(long lcl, long minimum, long maximum, long ucl)> personKeysRangesCollection) + internal static Models.Sorting Get(int faceDistancePermyriad, double rangeDistanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength) { Models.Sorting result; if (faceDistanceLength.Length is null) @@ -12,28 +12,12 @@ internal abstract class Sorting throw new NotSupportedException(); if (faceDistanceEncoding.MinimumDateTime is null || faceDistanceLength.MinimumDateTime is null) throw new NotSupportedException(); - List withinRanges = new(); long ticks = faceDistanceEncoding.MinimumDateTime.Value.Ticks; TimeSpan timeSpan = new(faceDistanceLength.MinimumDateTime.Value.Ticks - ticks); bool older = timeSpan.TotalMilliseconds < 0; int daysDelta = (int)Math.Round(Math.Abs(timeSpan.TotalDays), 0); int distancePermyriad = (int)(faceDistanceLength.Length.Value / rangeDistanceTolerance * faceDistancePermyriad); - if (!personKeysRangesCollection.Any()) - withinRanges.Add(0); - else - { - foreach ((long lcl, long minimum, long maximum, long ucl) in personKeysRangesCollection) - { - if (ticks > minimum && ticks < maximum) - withinRanges.Add(0); - else if (ticks > lcl && ticks < ucl) - withinRanges.Add(1); - else - withinRanges.Add(2); - } - } - int withinRange = withinRanges.Max(); - result = new(daysDelta, distancePermyriad, faceDistanceLength.Id, faceDistanceLength.NormalizedRectangle.Value, older, withinRange); + result = new(daysDelta, distancePermyriad, faceDistanceLength.Id, faceDistanceLength.NormalizedRectangle.Value, older); return result; }