WholePercentages

This commit is contained in:
Mike Phares 2023-06-21 07:24:32 -07:00
parent 8863fd763f
commit 1d0506d74c
22 changed files with 254 additions and 255 deletions

View File

@ -50,8 +50,8 @@ public partial class E_Distance
private FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, List<Face> intersectFaces) private FaceDistanceContainer[] GetFaceDistanceContainers(MappingFromItem mappingFromItem, List<Face> intersectFaces)
{ {
FaceDistanceContainer[] results; FaceDistanceContainer[] results;
int wholePercentages;
int confidencePercent; int confidencePercent;
int normalizedRectangle;
FaceDistance faceDistance; FaceDistance faceDistance;
FaceDistanceContainer faceDistanceContainer; FaceDistanceContainer faceDistanceContainer;
List<FaceDistanceContainer> collection = new(); List<FaceDistanceContainer> collection = new();
@ -60,13 +60,13 @@ public partial class E_Distance
if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null) if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
throw new NotSupportedException(); throw new NotSupportedException();
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_FaceConfidencePercent, _RangeFaceConfidence, face.Location.Confidence); confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_FaceConfidencePercent, _RangeFaceConfidence, face.Location.Confidence);
normalizedRectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); wholePercentages = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
if (face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding faceEncoding) if (face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding faceEncoding)
faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, normalizedRectangle); faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
else else
{ {
faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding); faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding);
faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, normalizedRectangle); faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
lock (intersectFaces) lock (intersectFaces)
face.SetFaceDistance(faceDistance); face.SetFaceDistance(faceDistance);
} }
@ -244,7 +244,7 @@ public partial class E_Distance
throw new NotSupportedException(); throw new NotSupportedException();
if (filteredFaces.Any()) if (filteredFaces.Any())
{ {
intersectFaces = Shared.Models.Stateless.Methods.ILocation.FilterByIntersect(filteredFaces, locationContainer.NormalizedRectangle, _RectangleIntersectMinimum); intersectFaces = Shared.Models.Stateless.Methods.ILocation.FilterByIntersect(filteredFaces, _RectangleIntersectMinimum, locationContainer.WholePercentages);
if (intersectFaces.Any()) if (intersectFaces.Any())
checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(mappingFromItem, intersectFaces, modelsFaceEncoding)); checkFaces.AddRange(GetClosestFaceByDistanceIgnoringTolerance(mappingFromItem, intersectFaces, modelsFaceEncoding));
} }
@ -313,18 +313,18 @@ public partial class E_Distance
_DuplicateMappedFaceFiles.Clear(); _DuplicateMappedFaceFiles.Clear();
} }
public List<FaceDistanceContainer> GetMissingFaceDistanceContainer(int maxDegreeOfParallelism, long ticks, string dFacesCollectionDirectory, Dictionary<int, Dictionary<int, PersonContainer[]>> missingIdThenNormalizedRectangleToPersonContainers) public List<FaceDistanceContainer> GetMissingFaceDistanceContainer(int maxDegreeOfParallelism, long ticks, string dFacesCollectionDirectory, Dictionary<int, Dictionary<int, PersonContainer[]>> missingIdThenWholePercentagesToPersonContainers)
{ {
List<FaceDistanceContainer> results = new(); List<FaceDistanceContainer> results = new();
string[] files; string[] files;
List<Face>? faces; List<Face>? faces;
int wholePercentages;
int confidencePercent; int confidencePercent;
int normalizedRectangle;
bool? isWrongYear = null; bool? isWrongYear = null;
FaceDistance faceDistance; FaceDistance faceDistance;
List<(int id, string json)> collection = new(); List<(int id, string json)> collection = new();
FaceDistanceContainer faceDistanceContainer; FaceDistanceContainer faceDistanceContainer;
foreach (KeyValuePair<int, Dictionary<int, PersonContainer[]>> keyValuePair in missingIdThenNormalizedRectangleToPersonContainers) foreach (KeyValuePair<int, Dictionary<int, PersonContainer[]>> keyValuePair in missingIdThenWholePercentagesToPersonContainers)
{ {
files = Directory.GetFiles(dFacesCollectionDirectory, $"{keyValuePair.Key}*.json", SearchOption.TopDirectoryOnly); files = Directory.GetFiles(dFacesCollectionDirectory, $"{keyValuePair.Key}*.json", SearchOption.TopDirectoryOnly);
if (files.Length != 1) if (files.Length != 1)
@ -349,13 +349,13 @@ public partial class E_Distance
if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null) if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
continue; continue;
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_FaceConfidencePercent, _RangeFaceConfidence, face.Location.Confidence); confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_FaceConfidencePercent, _RangeFaceConfidence, face.Location.Confidence);
normalizedRectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); wholePercentages = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
if (face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding faceEncoding) if (face.FaceDistance?.Encoding is not null && face.FaceDistance.Encoding is FaceRecognitionDotNet.FaceEncoding faceEncoding)
faceDistance = new(confidencePercent, face.DateTime, faceEncoding, id, isWrongYear, normalizedRectangle); faceDistance = new(confidencePercent, face.DateTime, faceEncoding, id, isWrongYear, wholePercentages);
else else
{ {
faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding); faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding);
faceDistance = new(confidencePercent, face.DateTime, faceEncoding, id, isWrongYear, normalizedRectangle); faceDistance = new(confidencePercent, face.DateTime, faceEncoding, id, isWrongYear, wholePercentages);
face.SetFaceDistance(faceDistance); face.SetFaceDistance(faceDistance);
} }
faceDistanceContainer = new(face, faceDistance); faceDistanceContainer = new(face, faceDistance);
@ -394,7 +394,7 @@ public partial class E_Distance
return; return;
progressBar.Tick(); progressBar.Tick();
faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding); faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding);
FaceDistance faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.NormalizedRectangle); FaceDistance faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages);
lock (face) lock (face)
face.SetFaceDistance(faceDistance); face.SetFaceDistance(faceDistance);
}); });
@ -408,7 +408,7 @@ public partial class E_Distance
Sorting[] collection = Shared.Models.Stateless.Methods.ISorting.Sort(sortingCollection); Sorting[] collection = Shared.Models.Stateless.Methods.ISorting.Sort(sortingCollection);
foreach (Sorting sorting in collection) foreach (Sorting sorting in collection)
{ {
if (face.Mapping?.MappingFromLocation is null || faceDistanceEncoding.NormalizedRectangle is null) if (face.Mapping?.MappingFromLocation is null || faceDistanceEncoding.WholePercentages is null)
throw new NotSupportedException(); throw new NotSupportedException();
if (!mapConfiguration.SaveSortingWithoutPerson && face.Mapping.MappingFromPerson is null) if (!mapConfiguration.SaveSortingWithoutPerson && face.Mapping.MappingFromPerson is null)
continue; continue;
@ -451,7 +451,7 @@ public partial class E_Distance
throw new NotSupportedException(); throw new NotSupportedException();
if (face.FaceDistance?.Encoding is not FaceRecognitionDotNet.FaceEncoding faceEncoding) if (face.FaceDistance?.Encoding is not FaceRecognitionDotNet.FaceEncoding faceEncoding)
continue; continue;
faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.NormalizedRectangle); faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages);
faceDistanceContainer = new(face, faceDistance); faceDistanceContainer = new(face, faceDistance);
collection.Add(faceDistanceContainer); collection.Add(faceDistanceContainer);
} }

View File

@ -307,13 +307,13 @@ public class D_Face
{ {
if (face.Location is null || face.OutputResolution is null) if (face.Location is null || face.OutputResolution is null)
continue; continue;
skip.Add(Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(face.Location, ILocation.Digits, face.OutputResolution)); skip.Add(Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(face.Location, ILocation.Digits, face.OutputResolution));
} }
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in collection) foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in collection)
{ {
if (locationContainer.Directories is null) if (locationContainer.Directories is null)
continue; continue;
if (skip.Contains(locationContainer.NormalizedRectangle)) if (skip.Contains(locationContainer.WholePercentages))
continue; continue;
foreach (Shared.Models.Face face in faces) foreach (Shared.Models.Face face in faces)
{ {
@ -325,14 +325,14 @@ public class D_Face
outputResolutionCheck = JsonSerializer.Deserialize<OutputResolution>(json); outputResolutionCheck = JsonSerializer.Deserialize<OutputResolution>(json);
if (outputResolutionCheck is null || outputResolutionCheck.Width != outputResolutionWidth || outputResolutionCheck.Height != outputResolutionHeight) if (outputResolutionCheck is null || outputResolutionCheck.Width != outputResolutionWidth || outputResolutionCheck.Height != outputResolutionHeight)
continue; continue;
rectangle = Shared.Models.Stateless.Methods.ILocation.GetRectangle(ILocation.Digits, locationContainer.NormalizedRectangle, outputResolutionCheck); rectangle = Shared.Models.Stateless.Methods.ILocation.GetRectangle(ILocation.Digits, outputResolutionCheck, locationContainer.WholePercentages);
if (rectangle is null) if (rectangle is null)
continue; continue;
location = Shared.Models.Stateless.Methods.ILocation.GetLocation(outputResolutionHeight, rectangle.Value, outputResolutionWidth); location = Shared.Models.Stateless.Methods.ILocation.GetLocation(outputResolutionHeight, rectangle.Value, outputResolutionWidth);
if (location is null) if (location is null)
continue; continue;
if (!results.Any(l => l.NormalizedRectangle == locationContainer.NormalizedRectangle)) if (!results.Any(l => l.WholePercentages == locationContainer.WholePercentages))
results.Add(new(locationContainer.FromDistanceContent, locationContainer.File, locationContainer.PersonKey, locationContainer.Id, locationContainer.NormalizedRectangle, locationContainer.Directories, rectangle.Value, location)); results.Add(new(locationContainer.FromDistanceContent, locationContainer.File, locationContainer.PersonKey, locationContainer.Id, locationContainer.WholePercentages, locationContainer.Directories, rectangle.Value, location));
} }
} }
if (results.Any()) if (results.Any())

View File

@ -292,7 +292,7 @@ public partial class DlibDotNet
int faceAreaPermyriad; int faceAreaPermyriad;
int confidencePercent; int confidencePercent;
bool? inSkipCollection; bool? inSkipCollection;
int normalizedRectangle; int wholePercentRectangle;
string deterministicHashCodeKey; string deterministicHashCodeKey;
MappingFromFilter mappingFromFilter; MappingFromFilter mappingFromFilter;
MappingFromLocation? mappingFromLocation; MappingFromLocation? mappingFromLocation;
@ -309,9 +309,9 @@ public partial class DlibDotNet
{ {
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_Configuration.FaceConfidencePercent, _Configuration.RangeFaceConfidence, face.Location.Confidence); confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_Configuration.FaceConfidencePercent, _Configuration.RangeFaceConfidence, face.Location.Confidence);
faceAreaPermyriad = Shared.Models.Stateless.Methods.IMapping.GetAreaPermyriad(_Configuration.FaceAreaPermyriad, face.Location, face.OutputResolution); faceAreaPermyriad = Shared.Models.Stateless.Methods.IMapping.GetAreaPermyriad(_Configuration.FaceAreaPermyriad, face.Location, face.OutputResolution);
normalizedRectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); wholePercentRectangle = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution); deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, normalizedRectangle); mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, wholePercentRectangle);
inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation); inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation);
mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection); mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection);
} }
@ -325,7 +325,7 @@ public partial class DlibDotNet
{ {
Mapping result; Mapping result;
bool? inSkipCollection; bool? inSkipCollection;
int normalizedRectangle; int wholePercentRectangle;
int faceAreaPermyriad = 0; int faceAreaPermyriad = 0;
int confidencePercent = 0; int confidencePercent = 0;
string deterministicHashCodeKey; string deterministicHashCodeKey;
@ -340,9 +340,9 @@ public partial class DlibDotNet
} }
else else
{ {
normalizedRectangle = Shared.Models.Stateless.Methods.ILocation.GetNormalizedRectangle(Shared.Models.Stateless.ILocation.Digits); wholePercentRectangle = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(Shared.Models.Stateless.ILocation.Digits);
deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, Shared.Models.Stateless.ILocation.Digits); deterministicHashCodeKey = Shared.Models.Stateless.Methods.IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, Shared.Models.Stateless.ILocation.Digits);
mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, normalizedRectangle); mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, wholePercentRectangle);
inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation); inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation);
mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection); mappingFromFilter = new(isFocusModel, isFocusRelativePath, isIgnoreRelativePath, inSkipCollection);
} }
@ -717,7 +717,7 @@ public partial class DlibDotNet
} }
} }
private void SaveFaceDistances(long ticks, MapLogic mapLogic, Mapping[] mappingCollection, string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping, List<FaceDistance> faceDistanceEncodings, FaceDistanceContainer[] faceDistanceContainers) private void SaveFaceDistances(long ticks, MapLogic mapLogic, Mapping[] mappingCollection, string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, Dictionary<int, Dictionary<int, Mapping>> idToWholePercentagesToMapping, List<FaceDistance> faceDistanceEncodings, FaceDistanceContainer[] faceDistanceContainers)
{ {
if (_Log is null) if (_Log is null)
throw new NullReferenceException(nameof(_Log)); throw new NullReferenceException(nameof(_Log));
@ -753,21 +753,21 @@ public partial class DlibDotNet
if (filteredFaceDistanceContainers.Length > 0) if (filteredFaceDistanceContainers.Length > 0)
{ {
int updated = mapLogic.UpdateFromSortingContainers(_Configuration.SaveIndividually, distanceLimits, sortingContainers); int updated = mapLogic.UpdateFromSortingContainers(_Configuration.SaveIndividually, distanceLimits, sortingContainers);
List<SaveContainer> saveContainers = mapLogic.GetSaveContainers(_Configuration.SaveIndividually, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToNormalizedRectangleToMapping, useFiltersCounter, sortingContainers.Any()); List<SaveContainer> saveContainers = mapLogic.GetSaveContainers(_Configuration.SaveIndividually, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToWholePercentagesToMapping, useFiltersCounter, sortingContainers.Any());
mapLogic.SaveContainers(_Configuration.SaveIndividually, filteredFaceDistanceContainers.Length, updated, saveContainers); mapLogic.SaveContainers(_Configuration.SaveIndividually, filteredFaceDistanceContainers.Length, updated, saveContainers);
} }
} }
} }
private void SaveFaceDistances(long ticks, MapLogic mapLogic, List<Shared.Models.Face> distinctFilteredFaces, Mapping[] mappingCollection, string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, string dFacesCollectionDirectory, Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping) private void SaveFaceDistances(long ticks, MapLogic mapLogic, List<Shared.Models.Face> distinctFilteredFaces, Mapping[] mappingCollection, string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, string dFacesCollectionDirectory, Dictionary<int, Dictionary<int, Mapping>> idToWholePercentagesToMapping)
{ {
E_Distance.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces); E_Distance.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces);
FaceDistanceContainer[] faceDistanceContainers = E_Distance.GetFaceDistanceContainers(distinctFilteredFaces); FaceDistanceContainer[] faceDistanceContainers = E_Distance.GetFaceDistanceContainers(distinctFilteredFaces);
Dictionary<int, Dictionary<int, PersonContainer[]>> missingIdThenNormalizedRectangleToPersonContainers = mapLogic.GetMissing(idToNormalizedRectangleToMapping); Dictionary<int, Dictionary<int, PersonContainer[]>> missingIdThenWholePercentagesToPersonContainers = mapLogic.GetMissing(idToWholePercentagesToMapping);
List<FaceDistanceContainer> missingFaceDistanceContainers = _Distance.GetMissingFaceDistanceContainer(_AppSettings.MaxDegreeOfParallelism, ticks, dFacesCollectionDirectory, missingIdThenNormalizedRectangleToPersonContainers); List<FaceDistanceContainer> missingFaceDistanceContainers = _Distance.GetMissingFaceDistanceContainer(_AppSettings.MaxDegreeOfParallelism, ticks, dFacesCollectionDirectory, missingIdThenWholePercentagesToPersonContainers);
List<FaceDistance> faceDistanceEncodings = E_Distance.GetFaceDistanceEncodings(faceDistanceContainers, missingFaceDistanceContainers); List<FaceDistance> faceDistanceEncodings = E_Distance.GetFaceDistanceEncodings(faceDistanceContainers, missingFaceDistanceContainers);
if (faceDistanceContainers.Any()) if (faceDistanceContainers.Any())
SaveFaceDistances(ticks, mapLogic, mappingCollection, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, idToNormalizedRectangleToMapping, faceDistanceEncodings, faceDistanceContainers); SaveFaceDistances(ticks, mapLogic, mappingCollection, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, idToWholePercentagesToMapping, faceDistanceEncodings, faceDistanceContainers);
} }
private void MapLogic(long ticks, Container[] containers, string a2PeopleSingletonDirectory, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, string fPhotoPrismContentDirectory, MapLogic mapLogic, string outputResolution, Dictionary<long, List<int>> personKeyToIds, List<Shared.Models.Face> distinctFilteredFaces, Mapping[] distinctFilteredMappingCollection, int totalNotMapped) private void MapLogic(long ticks, Container[] containers, string a2PeopleSingletonDirectory, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, string fPhotoPrismContentDirectory, MapLogic mapLogic, string outputResolution, Dictionary<long, List<int>> personKeyToIds, List<Shared.Models.Face> distinctFilteredFaces, Mapping[] distinctFilteredMappingCollection, int totalNotMapped)
@ -781,7 +781,7 @@ public partial class DlibDotNet
Shared.Models.Stateless.Methods.IPath.ChangeDateForEmptyDirectories(d2FacePartsContentDirectory, ticks); Shared.Models.Stateless.Methods.IPath.ChangeDateForEmptyDirectories(d2FacePartsContentDirectory, ticks);
Shared.Models.Stateless.Methods.IPath.MakeHiddenIfAllItemsAreHidden(d2FacePartsContentCollectionDirectory); Shared.Models.Stateless.Methods.IPath.MakeHiddenIfAllItemsAreHidden(d2FacePartsContentCollectionDirectory);
} }
Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping = Map.Models.Stateless.Methods.IMapLogic.GetIdToNormalizedRectangleToFace(distinctFilteredMappingCollection); Dictionary<int, Dictionary<int, Mapping>> idToWholePercentagesToMapping = Map.Models.Stateless.Methods.IMapLogic.GetIdToWholePercentagesToFace(distinctFilteredMappingCollection);
if (Directory.Exists(fPhotoPrismContentDirectory)) if (Directory.Exists(fPhotoPrismContentDirectory))
F_PhotoPrism.WriteMatches(fPhotoPrismContentDirectory, _Configuration.MappingDefaultName, _Configuration.PersonBirthdayFormat, _Configuration.RectangleIntersectMinimums, ticks, distinctFilteredFaces, mapLogic); F_PhotoPrism.WriteMatches(fPhotoPrismContentDirectory, _Configuration.MappingDefaultName, _Configuration.PersonBirthdayFormat, _Configuration.RectangleIntersectMinimums, ticks, distinctFilteredFaces, mapLogic);
if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution)) if (_Configuration.SaveShortcutsForOutputResolutions.Contains(outputResolution))
@ -792,11 +792,11 @@ public partial class DlibDotNet
mapLogic.CopyAtLeastOneMappedFiles(_Configuration.PersonCharactersCopyCount, dFacesContentDirectory, a2PeopleSingletonDirectory, distinctFilteredMappingCollection); mapLogic.CopyAtLeastOneMappedFiles(_Configuration.PersonCharactersCopyCount, dFacesContentDirectory, a2PeopleSingletonDirectory, distinctFilteredMappingCollection);
mapLogic.SavePersonKeyToCount(dFacesContentDirectory, a2PeopleSingletonDirectory, distinctFilteredMappingCollection); mapLogic.SavePersonKeyToCount(dFacesContentDirectory, a2PeopleSingletonDirectory, distinctFilteredMappingCollection);
} }
mapLogic.CopyManualFiles(dFacesContentDirectory, idToNormalizedRectangleToMapping); mapLogic.CopyManualFiles(dFacesContentDirectory, idToWholePercentagesToMapping);
if (_Configuration.SaveMappedForOutputResolutions.Contains(outputResolution)) if (_Configuration.SaveMappedForOutputResolutions.Contains(outputResolution))
mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, personKeyToIds, distinctFilteredMappingCollection, idToNormalizedRectangleToMapping, totalNotMapped); mapLogic.SaveMapped(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, personKeyToIds, distinctFilteredMappingCollection, idToWholePercentagesToMapping, totalNotMapped);
if (_Configuration.SaveFaceDistancesForOutputResolutions.Contains(outputResolution)) if (_Configuration.SaveFaceDistancesForOutputResolutions.Contains(outputResolution))
SaveFaceDistances(ticks, mapLogic, distinctFilteredFaces, distinctFilteredMappingCollection, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, dFacesCollectionDirectory, idToNormalizedRectangleToMapping); SaveFaceDistances(ticks, mapLogic, distinctFilteredFaces, distinctFilteredMappingCollection, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, dFacesCollectionDirectory, idToWholePercentagesToMapping);
} }
private string SaveUrlAndGetNewRootDirectory(Container container) private string SaveUrlAndGetNewRootDirectory(Container container)

View File

@ -18,7 +18,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
protected readonly ReadOnlyDictionary<int, List<int>> _SkipNotSkipCollection; protected readonly ReadOnlyDictionary<int, List<int>> _SkipNotSkipCollection;
protected readonly ReadOnlyDictionary<long, PersonContainer> _PersonKeyToPersonContainer; protected readonly ReadOnlyDictionary<long, PersonContainer> _PersonKeyToPersonContainer;
protected readonly List<LocationContainer<MetadataExtractor.Directory>> _LocationContainers; protected readonly List<LocationContainer<MetadataExtractor.Directory>> _LocationContainers;
protected readonly ReadOnlyDictionary<int, Dictionary<int, PersonContainer[]>> _IdThenNormalizedRectangleToPersonContainers; protected readonly ReadOnlyDictionary<int, Dictionary<int, PersonContainer[]>> _IdThenWholePercentagesToPersonContainers;
private readonly long _Ticks; private readonly long _Ticks;
private readonly Serilog.ILogger? _Log; private readonly Serilog.ILogger? _Log;
@ -44,7 +44,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
List<LocationContainer<MetadataExtractor.Directory>> locationContainers = new(); List<LocationContainer<MetadataExtractor.Directory>> locationContainers = new();
string? rootDirectoryParent = Path.GetDirectoryName(propertyConfiguration.RootDirectory); string? rootDirectoryParent = Path.GetDirectoryName(propertyConfiguration.RootDirectory);
string eDistanceContentTicksDirectory = Path.Combine(eDistanceContentDirectory, $"({ticks})"); string eDistanceContentTicksDirectory = Path.Combine(eDistanceContentDirectory, $"({ticks})");
Dictionary<int, Dictionary<int, PersonContainer[]>> idThenNormalizedRectangleToPersonContainers = new(); Dictionary<int, Dictionary<int, PersonContainer[]>> idThenWholePercentagesToPersonContainers = new();
Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers = new(); Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToLocationContainers = new();
if (string.IsNullOrEmpty(rootDirectoryParent)) if (string.IsNullOrEmpty(rootDirectoryParent))
throw new NullReferenceException(nameof(rootDirectoryParent)); throw new NullReferenceException(nameof(rootDirectoryParent));
@ -63,7 +63,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
skipCollection, skipCollection,
skipNotSkipCollection, skipNotSkipCollection,
locationContainers, locationContainers,
idThenNormalizedRectangleToPersonContainers); idThenWholePercentagesToPersonContainers);
} }
foreach (string propertyContentCollectionFile in propertyConfiguration.PropertyContentCollectionFiles) foreach (string propertyContentCollectionFile in propertyConfiguration.PropertyContentCollectionFiles)
{ {
@ -83,7 +83,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
_PersonKeyToPersonContainer = new(personKeyToPersonContainer); _PersonKeyToPersonContainer = new(personKeyToPersonContainer);
_EDistanceContentTicksDirectory = eDistanceContentTicksDirectory; _EDistanceContentTicksDirectory = eDistanceContentTicksDirectory;
_NotMappedPersonContainers = notMappedPersonContainers.OrderByDescending(l => l.Key).ToList(); _NotMappedPersonContainers = notMappedPersonContainers.OrderByDescending(l => l.Key).ToList();
_IdThenNormalizedRectangleToPersonContainers = new(idThenNormalizedRectangleToPersonContainers); _IdThenWholePercentagesToPersonContainers = new(idThenWholePercentagesToPersonContainers);
} }
public override string ToString() public override string ToString()
@ -113,11 +113,11 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
List<int>? collection; List<int>? collection;
PersonBirthday personBirthday; PersonBirthday personBirthday;
List<string> shouldMove = new(); List<string> shouldMove = new();
foreach (KeyValuePair<int, Dictionary<int, PersonContainer[]>> idToCollection in _IdThenNormalizedRectangleToPersonContainers) foreach (KeyValuePair<int, Dictionary<int, PersonContainer[]>> idToCollection in _IdThenWholePercentagesToPersonContainers)
{ {
foreach (KeyValuePair<int, PersonContainer[]> normalizedRectangleToPersonContainers in idToCollection.Value) foreach (KeyValuePair<int, PersonContainer[]> wholePercentagesToPersonContainers in idToCollection.Value)
{ {
foreach (PersonContainer personContainer in normalizedRectangleToPersonContainers.Value) foreach (PersonContainer personContainer in wholePercentagesToPersonContainers.Value)
{ {
if (personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any()) if (personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
continue; continue;
@ -142,10 +142,10 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return results; return results;
} }
(bool, Dictionary<int, PersonContainer[]>?) Shared.Models.Methods.IMapLogic.GetNormalizedRectangleToPersonContainers(int id) (bool, Dictionary<int, PersonContainer[]>?) Shared.Models.Methods.IMapLogic.GetWholePercentagesToPersonContainers(int id)
{ {
bool result = _IdThenNormalizedRectangleToPersonContainers.TryGetValue(id, out Dictionary<int, PersonContainer[]>? normalizedRectangleToPersonContainers); bool result = _IdThenWholePercentagesToPersonContainers.TryGetValue(id, out Dictionary<int, PersonContainer[]>? wholePercentagesToPersonContainers);
return new(result, normalizedRectangleToPersonContainers); return new(result, wholePercentagesToPersonContainers);
} }
public int UpdateMappingFromPerson(Mapping mapping) public int UpdateMappingFromPerson(Mapping mapping)
@ -158,19 +158,19 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
string mappingSegmentB; string mappingSegmentB;
PersonBirthday personBirthday; PersonBirthday personBirthday;
PersonContainer[]? personContainers; PersonContainer[]? personContainers;
Dictionary<int, PersonContainer[]>? normalizedRectangleToPersonContainers; Dictionary<int, PersonContainer[]>? wholePercentagesToPersonContainers;
for (int i = 1; i < 2; i++) for (int i = 1; i < 2; i++)
{ {
if (mapping.MappingFromLocation is null) if (mapping.MappingFromLocation is null)
continue; continue;
if (!_IdThenNormalizedRectangleToPersonContainers.TryGetValue(mapping.MappingFromItem.Id, out normalizedRectangleToPersonContainers)) if (!_IdThenWholePercentagesToPersonContainers.TryGetValue(mapping.MappingFromItem.Id, out wholePercentagesToPersonContainers))
{ {
if (mapping.MappingFromFilter.InSkipCollection is not null && mapping.MappingFromFilter.InSkipCollection.Value) if (mapping.MappingFromFilter.InSkipCollection is not null && mapping.MappingFromFilter.InSkipCollection.Value)
continue; continue;
result += 1; result += 1;
continue; continue;
} }
if (!normalizedRectangleToPersonContainers.TryGetValue(mapping.MappingFromLocation.NormalizedRectangle, out personContainers)) if (!wholePercentagesToPersonContainers.TryGetValue(mapping.MappingFromLocation.WholePercentages, out personContainers))
{ {
if (mapping.MappingFromFilter.InSkipCollection is not null && mapping.MappingFromFilter.InSkipCollection.Value) if (mapping.MappingFromFilter.InSkipCollection is not null && mapping.MappingFromFilter.InSkipCollection.Value)
continue; continue;
@ -359,7 +359,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
string personKeyFormatted; string personKeyFormatted;
PersonBirthday personBirthday; PersonBirthday personBirthday;
PersonContainer personContainer; PersonContainer personContainer;
result = Path.Combine(_EDistanceContentTicksDirectory, by, sortingContainer.Sorting.Id.ToString(), sortingContainer.Sorting.NormalizedRectangle.ToString()); result = Path.Combine(_EDistanceContentTicksDirectory, by, sortingContainer.Sorting.Id.ToString(), sortingContainer.Sorting.WholePercentages.ToString());
for (int i = _NotMappedPersonContainers.Count - 1; i > 0; i--) for (int i = _NotMappedPersonContainers.Count - 1; i > 0; i--)
{ {
personContainer = _NotMappedPersonContainers[i]; personContainer = _NotMappedPersonContainers[i];
@ -378,7 +378,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return result; return result;
} }
private List<SaveContainer> GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, Mapping[] mappingCollection, Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping, Dictionary<long, List<int>> personKeyToIds, int? useFiltersCounter, bool saveMapped, bool saveIndividually, bool sortingContainersAny) private List<SaveContainer> GetSaveContainers(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, Mapping[] mappingCollection, Dictionary<int, Dictionary<int, Mapping>> idToWholePercentagesToMapping, Dictionary<long, List<int>> personKeyToIds, int? useFiltersCounter, bool saveMapped, bool saveIndividually, bool sortingContainersAny)
{ {
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
@ -404,7 +404,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
FileHolder facePartsFileHolder; FileHolder facePartsFileHolder;
FileHolder hiddenFaceFileHolder; FileHolder hiddenFaceFileHolder;
string? facePartsContentCollectionFile; string? facePartsContentCollectionFile;
Dictionary<int, Mapping>? normalizedRectangleToMapping; Dictionary<int, Mapping>? wholePercentagesToMapping;
int padLeft = _Configuration.FaceDistancePermyriad.ToString().Length; int padLeft = _Configuration.FaceDistancePermyriad.ToString().Length;
string forceSingleImageHumanized = nameof(Shared.Models.Stateless.IMapLogic.ForceSingleImage).Humanize(LetterCasing.Title); string forceSingleImageHumanized = nameof(Shared.Models.Stateless.IMapLogic.ForceSingleImage).Humanize(LetterCasing.Title);
foreach (Mapping mapping in mappingCollection) foreach (Mapping mapping in mappingCollection)
@ -479,14 +479,14 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
keyMapping = null; keyMapping = null;
else else
{ {
if (!idToNormalizedRectangleToMapping.TryGetValue(mapping.SortingContainer.Sorting.Id, out normalizedRectangleToMapping)) if (!idToWholePercentagesToMapping.TryGetValue(mapping.SortingContainer.Sorting.Id, out wholePercentagesToMapping))
continue; continue;
if (!normalizedRectangleToMapping.ContainsKey(mapping.SortingContainer.Sorting.NormalizedRectangle)) if (!wholePercentagesToMapping.ContainsKey(mapping.SortingContainer.Sorting.WholePercentages))
continue; continue;
keyMapping = normalizedRectangleToMapping[mapping.SortingContainer.Sorting.NormalizedRectangle]; keyMapping = wholePercentagesToMapping[mapping.SortingContainer.Sorting.WholePercentages];
if (keyMapping.MappingFromLocation is null) if (keyMapping.MappingFromLocation is null)
continue; continue;
if (saveIndividually && keyMapping.MappingFromLocation.NormalizedRectangle == mapping.MappingFromLocation.NormalizedRectangle) if (saveIndividually && keyMapping.MappingFromLocation.WholePercentages == mapping.MappingFromLocation.WholePercentages)
results.Add(new(Path.Combine(directory, "Maybe"))); results.Add(new(Path.Combine(directory, "Maybe")));
} }
facesDirectory = Stateless.MapLogic.GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem); facesDirectory = Stateless.MapLogic.GetFacesDirectory(dFacesContentDirectory, mapping.MappingFromItem);
@ -545,18 +545,18 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return results; return results;
} }
public List<SaveContainer> GetSaveContainers(bool saveIndividually, string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, Mapping[] mappingCollection, Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping, int? useFiltersCounter, bool sortingContainersAny) public List<SaveContainer> GetSaveContainers(bool saveIndividually, string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, Mapping[] mappingCollection, Dictionary<int, Dictionary<int, Mapping>> idToWholePercentagesToMapping, int? useFiltersCounter, bool sortingContainersAny)
{ {
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
List<SaveContainer> results; List<SaveContainer> results;
bool saveMapped = false; bool saveMapped = false;
Dictionary<long, List<int>> personKeyToIds = new(); Dictionary<long, List<int>> personKeyToIds = new();
results = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToNormalizedRectangleToMapping, personKeyToIds, useFiltersCounter, saveMapped, saveIndividually, sortingContainersAny); results = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToWholePercentagesToMapping, personKeyToIds, useFiltersCounter, saveMapped, saveIndividually, sortingContainersAny);
return results; return results;
} }
public void SaveMapped(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, Dictionary<long, List<int>> personKeyToIds, Mapping[] mappingCollection, Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping, int totalNotMapped) public void SaveMapped(string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, Dictionary<long, List<int>> personKeyToIds, Mapping[] mappingCollection, Dictionary<int, Dictionary<int, Mapping>> idToWholePercentagesToMapping, int totalNotMapped)
{ {
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
@ -565,7 +565,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
int? useFiltersCounter = null; int? useFiltersCounter = null;
bool saveIndividually = false; bool saveIndividually = false;
string mappingDirectory = Path.Combine(_EDistanceContentTicksDirectory, nameof(Shared.Models.Stateless.IMapLogic.Mapping)); string mappingDirectory = Path.Combine(_EDistanceContentTicksDirectory, nameof(Shared.Models.Stateless.IMapLogic.Mapping));
List<SaveContainer> saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToNormalizedRectangleToMapping, personKeyToIds, useFiltersCounter, saveMapped, sortingContainersAny: true, saveIndividually: false); List<SaveContainer> saveContainers = GetSaveContainers(dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToWholePercentagesToMapping, personKeyToIds, useFiltersCounter, saveMapped, sortingContainersAny: true, saveIndividually: false);
SaveContainers(saveIndividually, totalNotMapped, updated, saveContainers); SaveContainers(saveIndividually, totalNotMapped, updated, saveContainers);
if (!string.IsNullOrEmpty(_EDistanceContentTicksDirectory) && Directory.Exists(mappingDirectory)) if (!string.IsNullOrEmpty(_EDistanceContentTicksDirectory) && Directory.Exists(mappingDirectory))
Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory); Stateless.MapLogic.SaveMappingShortcuts(mappingDirectory);
@ -574,15 +574,15 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
public bool Used(FaceDistance faceDistanceEncoding) public bool Used(FaceDistance faceDistanceEncoding)
{ {
bool result = false; bool result = false;
if (faceDistanceEncoding.NormalizedRectangle is null) if (faceDistanceEncoding.WholePercentages is null)
throw new NotSupportedException(); throw new NotSupportedException();
List<int>? normalizedRectangles; List<int>? wholePercentagesCollection;
Dictionary<int, PersonContainer[]>? normalizedRectangleToPersonContainers; Dictionary<int, PersonContainer[]>? wholePercentagesToPersonContainers;
if (_SkipCollection.TryGetValue(faceDistanceEncoding.Id, out normalizedRectangles) && normalizedRectangles.Contains(faceDistanceEncoding.NormalizedRectangle.Value)) if (_SkipCollection.TryGetValue(faceDistanceEncoding.Id, out wholePercentagesCollection) && wholePercentagesCollection.Contains(faceDistanceEncoding.WholePercentages.Value))
result = true; result = true;
if (!result && _IdThenNormalizedRectangleToPersonContainers.TryGetValue(faceDistanceEncoding.Id, out normalizedRectangleToPersonContainers)) if (!result && _IdThenWholePercentagesToPersonContainers.TryGetValue(faceDistanceEncoding.Id, out wholePercentagesToPersonContainers))
{ {
if (normalizedRectangleToPersonContainers.ContainsKey(faceDistanceEncoding.NormalizedRectangle.Value)) if (wholePercentagesToPersonContainers.ContainsKey(faceDistanceEncoding.WholePercentages.Value))
result = true; result = true;
} }
return result; return result;
@ -595,26 +595,26 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
List<Sorting> results = new(); List<Sorting> results = new();
Sorting sorting; Sorting sorting;
FaceDistance faceDistanceLength; FaceDistance faceDistanceLength;
List<int>? normalizedRectangles; List<int>? wholePercentagesCollection;
bool skipNotSkipCollectionAny = _SkipNotSkipCollection.Any(); bool skipNotSkipCollectionAny = _SkipNotSkipCollection.Any();
Dictionary<int, PersonContainer[]>? normalizedRectangleToPersonContainers; Dictionary<int, PersonContainer[]>? wholePercentagesToPersonContainers;
for (int j = 0; j < faceDistanceLengths.Count; j++) for (int j = 0; j < faceDistanceLengths.Count; j++)
{ {
if (faceDistanceEncoding.NormalizedRectangle is null) if (faceDistanceEncoding.WholePercentages is null)
throw new NotSupportedException(); throw new NotSupportedException();
if (j == i) if (j == i)
continue; continue;
if (_SkipCollection.TryGetValue(faceDistanceEncoding.Id, out normalizedRectangles) && normalizedRectangles.Contains(faceDistanceEncoding.NormalizedRectangle.Value)) if (_SkipCollection.TryGetValue(faceDistanceEncoding.Id, out wholePercentagesCollection) && wholePercentagesCollection.Contains(faceDistanceEncoding.WholePercentages.Value))
continue; continue;
if (skipNotSkipCollectionAny && (!_SkipNotSkipCollection.TryGetValue(faceDistanceEncoding.Id, out normalizedRectangles) || !normalizedRectangles.Contains(faceDistanceEncoding.NormalizedRectangle.Value))) if (skipNotSkipCollectionAny && (!_SkipNotSkipCollection.TryGetValue(faceDistanceEncoding.Id, out wholePercentagesCollection) || !wholePercentagesCollection.Contains(faceDistanceEncoding.WholePercentages.Value)))
continue; continue;
if (_IdThenNormalizedRectangleToPersonContainers.TryGetValue(faceDistanceEncoding.Id, out normalizedRectangleToPersonContainers)) if (_IdThenWholePercentagesToPersonContainers.TryGetValue(faceDistanceEncoding.Id, out wholePercentagesToPersonContainers))
{ {
if (normalizedRectangleToPersonContainers.ContainsKey(faceDistanceEncoding.NormalizedRectangle.Value)) if (wholePercentagesToPersonContainers.ContainsKey(faceDistanceEncoding.WholePercentages.Value))
continue; continue;
} }
faceDistanceLength = faceDistanceLengths[j]; faceDistanceLength = faceDistanceLengths[j];
if (faceDistanceLength.NormalizedRectangle is null || faceDistanceLength.Length is null) if (faceDistanceLength.WholePercentages is null || faceDistanceLength.Length is null)
throw new NotSupportedException(); throw new NotSupportedException();
if (faceDistanceLength.Length == 0) if (faceDistanceLength.Length == 0)
continue; continue;
@ -623,7 +623,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
continue; continue;
if (sorting.Id == faceDistanceEncoding.Id) if (sorting.Id == faceDistanceEncoding.Id)
{ {
if (sorting.NormalizedRectangle == faceDistanceEncoding.NormalizedRectangle.Value) if (sorting.WholePercentages == faceDistanceEncoding.WholePercentages.Value)
continue; continue;
continue; continue;
} }
@ -648,13 +648,13 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
string personKeyFormatted; string personKeyFormatted;
PersonBirthday personBirthday; PersonBirthday personBirthday;
PersonContainer[]? personContainers; PersonContainer[]? personContainers;
List<int> wholePercentagesCollectionForA;
List<int> wholePercentagesCollectionForB;
Dictionary<string, int> keyToCount = new(); Dictionary<string, int> keyToCount = new();
List<int> normalizedRectangleCollectionForA;
List<int> normalizedRectangleCollectionForB;
Dictionary<string, string> keyToSegmentC = new(); Dictionary<string, string> keyToSegmentC = new();
Dictionary<int, List<int>> idToNormalizedRectangleCollectionForA = new(); Dictionary<int, List<int>> idToWholePercentagesCollectionForA = new();
Dictionary<int, List<int>> idToNormalizedRectangleCollectionForB = new(); Dictionary<int, List<int>> idToWholePercentagesCollectionForB = new();
Dictionary<int, PersonContainer[]>? normalizedRectangleToPersonContainers; Dictionary<int, PersonContainer[]>? wholePercentagesToPersonContainers;
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - _Ticks).TotalSeconds); int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - _Ticks).TotalSeconds);
string message = $") {sortingContainers.Length:000} Update From Sorting Container(s) - {totalSeconds} total second(s)"; string message = $") {sortingContainers.Length:000} Update From Sorting Container(s) - {totalSeconds} total second(s)";
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
@ -664,25 +664,25 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
progressBar.Tick(); progressBar.Tick();
if (sortingContainer.Mapping?.MappingFromLocation is null) if (sortingContainer.Mapping?.MappingFromLocation is null)
throw new NotSupportedException(); throw new NotSupportedException();
if (!idToNormalizedRectangleCollectionForA.ContainsKey(sortingContainer.Mapping.MappingFromItem.Id)) if (!idToWholePercentagesCollectionForA.ContainsKey(sortingContainer.Mapping.MappingFromItem.Id))
idToNormalizedRectangleCollectionForA.Add(sortingContainer.Mapping.MappingFromItem.Id, new()); idToWholePercentagesCollectionForA.Add(sortingContainer.Mapping.MappingFromItem.Id, new());
normalizedRectangleCollectionForA = idToNormalizedRectangleCollectionForA[sortingContainer.Mapping.MappingFromItem.Id]; wholePercentagesCollectionForA = idToWholePercentagesCollectionForA[sortingContainer.Mapping.MappingFromItem.Id];
if (!idToNormalizedRectangleCollectionForB.ContainsKey(sortingContainer.Mapping.MappingFromItem.Id)) if (!idToWholePercentagesCollectionForB.ContainsKey(sortingContainer.Mapping.MappingFromItem.Id))
idToNormalizedRectangleCollectionForB.Add(sortingContainer.Mapping.MappingFromItem.Id, new()); idToWholePercentagesCollectionForB.Add(sortingContainer.Mapping.MappingFromItem.Id, new());
normalizedRectangleCollectionForB = idToNormalizedRectangleCollectionForB[sortingContainer.Mapping.MappingFromItem.Id]; wholePercentagesCollectionForB = idToWholePercentagesCollectionForB[sortingContainer.Mapping.MappingFromItem.Id];
if (!_IdThenNormalizedRectangleToPersonContainers.TryGetValue(sortingContainer.Sorting.Id, out normalizedRectangleToPersonContainers) || !normalizedRectangleToPersonContainers.TryGetValue(sortingContainer.Sorting.NormalizedRectangle, out personContainers)) if (!_IdThenWholePercentagesToPersonContainers.TryGetValue(sortingContainer.Sorting.Id, out wholePercentagesToPersonContainers) || !wholePercentagesToPersonContainers.TryGetValue(sortingContainer.Sorting.WholePercentages, out personContainers))
{ {
if (!_Configuration.SaveSortingWithoutPerson) if (!_Configuration.SaveSortingWithoutPerson)
continue; continue;
if (normalizedRectangleCollectionForA.Contains(sortingContainer.Mapping.MappingFromLocation.NormalizedRectangle)) if (wholePercentagesCollectionForA.Contains(sortingContainer.Mapping.MappingFromLocation.WholePercentages))
continue; continue;
sortingContainer.Mapping.UpdateMappingFromUnknownPerson(saveIndividually, sortingContainer); sortingContainer.Mapping.UpdateMappingFromUnknownPerson(saveIndividually, sortingContainer);
normalizedRectangleCollectionForA.Add(sortingContainer.Mapping.MappingFromLocation.NormalizedRectangle); wholePercentagesCollectionForA.Add(sortingContainer.Mapping.MappingFromLocation.WholePercentages);
result += 1; result += 1;
} }
else else
{ {
if (normalizedRectangleCollectionForB.Contains(sortingContainer.Mapping.MappingFromLocation.NormalizedRectangle)) if (wholePercentagesCollectionForB.Contains(sortingContainer.Mapping.MappingFromLocation.WholePercentages))
continue; continue;
foreach (PersonContainer personContainer in personContainers) foreach (PersonContainer personContainer in personContainers)
{ {
@ -705,7 +705,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
keyToSegmentC[key] = sortingContainer.Sorting.DistancePermyriad.ToString(); keyToSegmentC[key] = sortingContainer.Sorting.DistancePermyriad.ToString();
} }
sortingContainer.Mapping.UpdateMappingFromPerson(personContainer.ApproximateYears, personContainer.DisplayDirectoryName, personBirthday, mappingSegmentB, keyToSegmentC[key], sortingContainer); sortingContainer.Mapping.UpdateMappingFromPerson(personContainer.ApproximateYears, personContainer.DisplayDirectoryName, personBirthday, mappingSegmentB, keyToSegmentC[key], sortingContainer);
normalizedRectangleCollectionForB.Add(sortingContainer.Mapping.MappingFromLocation.NormalizedRectangle); wholePercentagesCollectionForB.Add(sortingContainer.Mapping.MappingFromLocation.WholePercentages);
result += 1; result += 1;
break; break;
} }
@ -714,7 +714,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
return result; return result;
} }
public void CopyManualFiles(string dFacesContentDirectory, Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping) public void CopyManualFiles(string dFacesContentDirectory, Dictionary<int, Dictionary<int, Mapping>> idToWholePercentagesToMapping)
{ {
if (_Configuration is null) if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration)); throw new NullReferenceException(nameof(_Configuration));
@ -727,19 +727,19 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
const int zero = 0; const int zero = 0;
string faceFileName; string faceFileName;
string shortcutFile; string shortcutFile;
int? wholePercentages;
string? directoryName; string? directoryName;
string mappingSegmentB; string mappingSegmentB;
string personDirectory; string personDirectory;
string? facesDirectory; string? facesDirectory;
int? normalizedRectangle;
string personKeyFormatted; string personKeyFormatted;
string personDisplayFileName; string personDisplayFileName;
PersonBirthday personBirthday; PersonBirthday personBirthday;
string? personDisplayDirectory; string? personDisplayDirectory;
WindowsShortcut windowsShortcut; WindowsShortcut windowsShortcut;
Dictionary<int, Mapping>? normalizedRectangleToMapping; Dictionary<int, Mapping>? wholePercentagesToMapping;
string by = nameof(Shared.Models.Stateless.IMapLogic.ManualCopy); string by = nameof(Shared.Models.Stateless.IMapLogic.ManualCopy);
Dictionary<int, PersonContainer[]>? normalizedRectangleToPeronContainerCollection; Dictionary<int, PersonContainer[]>? wholePercentagesToPeronContainerCollection;
string successful = $"_ {nameof(Shared.Models.Stateless.IMapLogic.ManualCopy).Humanize(LetterCasing.Title)} Successful"; string successful = $"_ {nameof(Shared.Models.Stateless.IMapLogic.ManualCopy).Humanize(LetterCasing.Title)} Successful";
foreach (KeyValuePair<long, PersonContainer> personKeyToPersonContainer in _PersonKeyToPersonContainer) foreach (KeyValuePair<long, PersonContainer> personKeyToPersonContainer in _PersonKeyToPersonContainer)
{ {
@ -750,8 +750,8 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
{ {
if (!personDisplayDirectoryAllFile.EndsWith(_Configuration.FacesFileNameExtension)) if (!personDisplayDirectoryAllFile.EndsWith(_Configuration.FacesFileNameExtension))
continue; continue;
(id, normalizedRectangle) = IMapping.GetConverted(_Configuration.FacesFileNameExtension, personDisplayDirectoryAllFile); (id, wholePercentages) = IMapping.GetConverted(_Configuration.FacesFileNameExtension, personDisplayDirectoryAllFile);
if (id is null || normalizedRectangle is null) if (id is null || wholePercentages is null)
continue; continue;
fileInfo = new(personDisplayDirectoryAllFile); fileInfo = new(personDisplayDirectoryAllFile);
if (!fileInfo.Exists) if (!fileInfo.Exists)
@ -762,11 +762,11 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
mappingSegmentB = Stateless.MapLogic.GetMappingSegmentB(_Ticks, personBirthday, personKeyToPersonContainer.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); directory = Path.Combine(_EDistanceContentTicksDirectory, by, personKeyFormatted, mappingSegmentB);
personDirectory = Path.Combine(directory, personKeyToPersonContainer.Value.DisplayDirectoryName, "lnk"); personDirectory = Path.Combine(directory, personKeyToPersonContainer.Value.DisplayDirectoryName, "lnk");
if (!idToNormalizedRectangleToMapping.TryGetValue(id.Value, out normalizedRectangleToMapping)) if (!idToWholePercentagesToMapping.TryGetValue(id.Value, out wholePercentagesToMapping))
continue; continue;
if (!normalizedRectangleToMapping.ContainsKey(normalizedRectangle.Value)) if (!wholePercentagesToMapping.ContainsKey(wholePercentages.Value))
continue; continue;
mapping = normalizedRectangleToMapping[normalizedRectangle.Value]; mapping = wholePercentagesToMapping[wholePercentages.Value];
if (mapping.MappingFromLocation is null) if (mapping.MappingFromLocation is null)
continue; continue;
if (string.IsNullOrEmpty(personDisplayDirectory)) if (string.IsNullOrEmpty(personDisplayDirectory))
@ -780,7 +780,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
continue; continue;
faceFileName = $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}"; faceFileName = $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacesFileNameExtension}";
checkFile = Path.Combine(directory, fileInfo.Name); checkFile = Path.Combine(directory, fileInfo.Name);
if (!_IdThenNormalizedRectangleToPersonContainers.TryGetValue(id.Value, out normalizedRectangleToPeronContainerCollection) || !normalizedRectangleToPeronContainerCollection.ContainsKey(normalizedRectangle.Value)) if (!_IdThenWholePercentagesToPersonContainers.TryGetValue(id.Value, out wholePercentagesToPeronContainerCollection) || !wholePercentagesToPeronContainerCollection.ContainsKey(wholePercentages.Value))
{ {
if (!Directory.Exists(personDirectory)) if (!Directory.Exists(personDirectory))
_ = Directory.CreateDirectory(personDirectory); _ = Directory.CreateDirectory(personDirectory);
@ -1366,12 +1366,12 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
} }
} }
public Dictionary<int, Dictionary<int, PersonContainer[]>> GetMissing(Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping) public Dictionary<int, Dictionary<int, PersonContainer[]>> GetMissing(Dictionary<int, Dictionary<int, Mapping>> idToWholePercentagesToMapping)
{ {
Dictionary<int, Dictionary<int, PersonContainer[]>> results = new(); Dictionary<int, Dictionary<int, PersonContainer[]>> results = new();
foreach (KeyValuePair<int, Dictionary<int, PersonContainer[]>> idToCollection in _IdThenNormalizedRectangleToPersonContainers) foreach (KeyValuePair<int, Dictionary<int, PersonContainer[]>> idToCollection in _IdThenWholePercentagesToPersonContainers)
{ {
if (idToNormalizedRectangleToMapping.ContainsKey(idToCollection.Key)) if (idToWholePercentagesToMapping.ContainsKey(idToCollection.Key))
continue; continue;
results.Add(idToCollection.Key, idToCollection.Value); results.Add(idToCollection.Key, idToCollection.Value);
} }
@ -1381,7 +1381,7 @@ public class MapLogic : Shared.Models.Methods.IMapLogic
public bool InSkipCollection(int id, MappingFromLocation mappingFromLocation) public bool InSkipCollection(int id, MappingFromLocation mappingFromLocation)
{ {
bool result; bool result;
result = _SkipCollection.TryGetValue(id, out List<int>? normalizedRectangles) && normalizedRectangles.Contains(mappingFromLocation.NormalizedRectangle); result = _SkipCollection.TryGetValue(id, out List<int>? wholePercentagesCollection) && wholePercentagesCollection.Contains(mappingFromLocation.WholePercentages);
return result; return result;
} }

View File

@ -16,7 +16,7 @@ internal abstract class MapLogic
private static void SetPersonCollections(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, List<string> personKeyFormattedCollection, Dictionary<int, List<int>> skipCollection, Dictionary<int, List<int>> skipNotSkipCollection) private static void SetPersonCollections(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, List<string> personKeyFormattedCollection, Dictionary<int, List<int>> skipCollection, Dictionary<int, List<int>> skipNotSkipCollection)
{ {
int? id; int? id;
int? normalizedRectangle; int? wholePercentages;
string personKeyFormatted; string personKeyFormatted;
string newestPersonKeyFormatted; string newestPersonKeyFormatted;
bool skipNotSkipDirectoriesAny = configuration.SkipNotSkipDirectories.Any(); bool skipNotSkipDirectoriesAny = configuration.SkipNotSkipDirectories.Any();
@ -27,20 +27,20 @@ internal abstract class MapLogic
{ {
if (!personDisplayDirectoryAllFile.EndsWith(configuration.FacesFileNameExtension)) if (!personDisplayDirectoryAllFile.EndsWith(configuration.FacesFileNameExtension))
continue; continue;
(id, normalizedRectangle) = IMapping.GetConverted(configuration.FacesFileNameExtension, personDisplayDirectoryAllFile); (id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, personDisplayDirectoryAllFile);
if (id is null || normalizedRectangle is null) if (id is null || wholePercentages is null)
continue; continue;
if (!skipNotSkipDirectoriesAny || !checkDirectories.Any(l => personDisplayDirectoryAllFile.StartsWith(l))) if (!skipNotSkipDirectoriesAny || !checkDirectories.Any(l => personDisplayDirectoryAllFile.StartsWith(l)))
{ {
if (!skipCollection.ContainsKey(id.Value)) if (!skipCollection.ContainsKey(id.Value))
skipCollection.Add(id.Value, new()); skipCollection.Add(id.Value, new());
skipCollection[id.Value].Add(normalizedRectangle.Value); skipCollection[id.Value].Add(wholePercentages.Value);
} }
else else
{ {
if (!skipNotSkipCollection.ContainsKey(id.Value)) if (!skipNotSkipCollection.ContainsKey(id.Value))
skipNotSkipCollection.Add(id.Value, new()); skipNotSkipCollection.Add(id.Value, new());
skipNotSkipCollection[id.Value].Add(normalizedRectangle.Value); skipNotSkipCollection[id.Value].Add(wholePercentages.Value);
} }
} }
if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any()) if (personContainer.Person is null || personContainer.Key is null || personContainer.Birthdays is null || !personContainer.Birthdays.Any())
@ -157,8 +157,8 @@ internal abstract class MapLogic
string[] files; string[] files;
string fileName; string fileName;
const int zero = 0; const int zero = 0;
int? wholePercentages;
string[] yearDirectories; string[] yearDirectories;
int? normalizedRectangle;
string personKeyFormatted; string personKeyFormatted;
string ticksDirectoryName; string ticksDirectoryName;
string? personFirstInitial; string? personFirstInitial;
@ -235,8 +235,8 @@ internal abstract class MapLogic
{ {
if (file.EndsWith(".lnk")) if (file.EndsWith(".lnk"))
continue; continue;
(id, normalizedRectangle) = IMapping.GetConverted(configuration.FacesFileNameExtension, file); (id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, file);
if (id is null || normalizedRectangle is null) if (id is null || wholePercentages is null)
continue; continue;
fileName = Path.GetFileName(file); fileName = Path.GetFileName(file);
if (distinct.Contains(fileName)) if (distinct.Contains(fileName))
@ -285,21 +285,21 @@ internal abstract class MapLogic
return results.ToArray(); return results.ToArray();
} }
private static void SetKeyValuePairs(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection, Dictionary<long, PersonContainer> personKeyToPersonContainer, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenNormalizedRectangleToPersonContainers, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer) private static void SetKeyValuePairs(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer, List<(string, string[], int, int)> personKeyFormattedIdThenWholePercentagesCollection, Dictionary<long, PersonContainer> personKeyToPersonContainer, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenWholePercentagesToPersonContainers, List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
{ {
PersonBirthday? personBirthday; PersonBirthday? personBirthday;
PersonContainer[] distinctPersonContainers; PersonContainer[] distinctPersonContainers;
(long, PersonContainer)[] collection = GetDistinctCollection(configuration, personContainers, personKeyToPersonContainerCollection, personKeyFormattedToPersonContainer); (long, PersonContainer)[] collection = GetDistinctCollection(configuration, personContainers, personKeyToPersonContainerCollection, personKeyFormattedToPersonContainer);
foreach ((long personKey, PersonContainer personContainer) in collection) foreach ((long personKey, PersonContainer personContainer) in collection)
personKeyToPersonContainer.Add(personKey, personContainer); personKeyToPersonContainer.Add(personKey, personContainer);
Dictionary<int, Dictionary<int, List<PersonContainer>>> idThenNormalizedRectangleToPersonContainerCollection = new(); Dictionary<int, Dictionary<int, List<PersonContainer>>> idThenWholePercentagesToPersonContainerCollection = new();
if (personKeyFormattedIdThenNormalizedRectangleCollection.Any()) if (personKeyFormattedIdThenWholePercentagesCollection.Any())
{ {
string personDisplayDirectory; string personDisplayDirectory;
PersonContainer personContainer; PersonContainer personContainer;
string personDisplayDirectoryName; string personDisplayDirectoryName;
Dictionary<string, (string[], PersonContainer)> personDisplayDirectoryTo = new(); Dictionary<string, (string[], PersonContainer)> personDisplayDirectoryTo = new();
foreach ((string personKeyFormatted, string[] personDisplayDirectoryNames, int id, int normalizedRectangle) in personKeyFormattedIdThenNormalizedRectangleCollection) foreach ((string personKeyFormatted, string[] personDisplayDirectoryNames, int id, int wholePercentages) in personKeyFormattedIdThenWholePercentagesCollection)
{ {
personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormatted); personBirthday = IPersonBirthday.GetPersonBirthday(configuration.PersonBirthdayFormat, personKeyFormatted);
if (personBirthday is null) if (personBirthday is null)
@ -313,22 +313,22 @@ internal abstract class MapLogic
} }
if (personDisplayDirectoryName.Length != 1 && personDisplayDirectoryName != configuration.MappingDefaultName && !personDisplayDirectoryTo.ContainsKey(personDisplayDirectory)) if (personDisplayDirectoryName.Length != 1 && personDisplayDirectoryName != configuration.MappingDefaultName && !personDisplayDirectoryTo.ContainsKey(personDisplayDirectory))
personDisplayDirectoryTo.Add(personDisplayDirectory, new(personDisplayDirectoryNames, personKeyFormattedToPersonContainer[personKeyFormatted])); personDisplayDirectoryTo.Add(personDisplayDirectory, new(personDisplayDirectoryNames, personKeyFormattedToPersonContainer[personKeyFormatted]));
if (!idThenNormalizedRectangleToPersonContainerCollection.ContainsKey(id)) if (!idThenWholePercentagesToPersonContainerCollection.ContainsKey(id))
idThenNormalizedRectangleToPersonContainerCollection.Add(id, new()); idThenWholePercentagesToPersonContainerCollection.Add(id, new());
if (!idThenNormalizedRectangleToPersonContainerCollection[id].ContainsKey(normalizedRectangle)) if (!idThenWholePercentagesToPersonContainerCollection[id].ContainsKey(wholePercentages))
idThenNormalizedRectangleToPersonContainerCollection[id].Add(normalizedRectangle, new()); idThenWholePercentagesToPersonContainerCollection[id].Add(wholePercentages, new());
idThenNormalizedRectangleToPersonContainerCollection[id][normalizedRectangle].Add(personKeyFormattedToPersonContainer[personKeyFormatted]); idThenWholePercentagesToPersonContainerCollection[id][wholePercentages].Add(personKeyFormattedToPersonContainer[personKeyFormatted]);
} }
foreach (KeyValuePair<string, (string[], PersonContainer)> keyValuePair in personDisplayDirectoryTo) foreach (KeyValuePair<string, (string[], PersonContainer)> keyValuePair in personDisplayDirectoryTo)
possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Add(keyValuePair.Value); possiblyNewPersonDisplayDirectoryNamesAndPersonContainer.Add(keyValuePair.Value);
} }
foreach (KeyValuePair<int, Dictionary<int, List<PersonContainer>>> keyValuePair in idThenNormalizedRectangleToPersonContainerCollection) foreach (KeyValuePair<int, Dictionary<int, List<PersonContainer>>> keyValuePair in idThenWholePercentagesToPersonContainerCollection)
{ {
idThenNormalizedRectangleToPersonContainers.Add(keyValuePair.Key, new()); idThenWholePercentagesToPersonContainers.Add(keyValuePair.Key, new());
foreach (KeyValuePair<int, List<PersonContainer>> innerKeyValuePair in keyValuePair.Value) foreach (KeyValuePair<int, List<PersonContainer>> innerKeyValuePair in keyValuePair.Value)
{ {
distinctPersonContainers = GetDistinctPersonContainers(innerKeyValuePair.Value); distinctPersonContainers = GetDistinctPersonContainers(innerKeyValuePair.Value);
idThenNormalizedRectangleToPersonContainers[keyValuePair.Key].Add(innerKeyValuePair.Key, distinctPersonContainers); idThenWholePercentagesToPersonContainers[keyValuePair.Key].Add(innerKeyValuePair.Key, distinctPersonContainers);
} }
}; };
} }
@ -363,15 +363,15 @@ internal abstract class MapLogic
return results; return results;
} }
private static int SetCollectionsAndGetUnableToConvertCount(Configuration configuration, long ticks, Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection, List<(string, string[], string)> collection) private static int SetCollectionsAndGetUnableToConvertCount(Configuration configuration, long ticks, Dictionary<string, string> personKeyFormattedToNewestPersonKeyFormatted, List<(string, string[], int, int)> personKeyFormattedIdThenWholePercentagesCollection, List<(string, string[], string)> collection)
{ {
int result = 0; int result = 0;
int? id; int? id;
int? normalizedRectangle; int? wholePercentages;
List<int> normalizedRectangles;
string? newestPersonKeyFormatted; string? newestPersonKeyFormatted;
string personDisplayDirectoryName; string personDisplayDirectoryName;
Dictionary<int, List<int>> idToNormalizedRectangles = new(); List<int> wholePercentagesCollection;
Dictionary<int, List<int>> idToWholePercentagesCollection = new();
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
string message = $") {collection.Count:000} join from ticks Director(ies) - C - {totalSeconds} total second(s)"; string message = $") {collection.Count:000} join from ticks Director(ies) - C - {totalSeconds} total second(s)";
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
@ -385,21 +385,21 @@ internal abstract class MapLogic
continue; continue;
newestPersonKeyFormatted = personKeyFormatted; newestPersonKeyFormatted = personKeyFormatted;
} }
(id, normalizedRectangle) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFaceFile); (id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, mappedFaceFile);
if (id is null || normalizedRectangle is null) if (id is null || wholePercentages is null)
{ {
result++; result++;
continue; continue;
} }
if (!idToNormalizedRectangles.ContainsKey(id.Value)) if (!idToWholePercentagesCollection.ContainsKey(id.Value))
idToNormalizedRectangles.Add(id.Value, new()); idToWholePercentagesCollection.Add(id.Value, new());
normalizedRectangles = idToNormalizedRectangles[id.Value]; wholePercentagesCollection = idToWholePercentagesCollection[id.Value];
normalizedRectangles.Add(normalizedRectangle.Value); wholePercentagesCollection.Add(wholePercentages.Value);
idToNormalizedRectangles[id.Value].Add(normalizedRectangle.Value); idToWholePercentagesCollection[id.Value].Add(wholePercentages.Value);
personDisplayDirectoryName = personDisplayDirectoryNames[^1]; personDisplayDirectoryName = personDisplayDirectoryNames[^1];
if (string.IsNullOrEmpty(personDisplayDirectoryName)) if (string.IsNullOrEmpty(personDisplayDirectoryName))
continue; continue;
personKeyFormattedIdThenNormalizedRectangleCollection.Add(new(newestPersonKeyFormatted, personDisplayDirectoryNames, id.Value, normalizedRectangle.Value)); personKeyFormattedIdThenWholePercentagesCollection.Add(new(newestPersonKeyFormatted, personDisplayDirectoryNames, id.Value, wholePercentages.Value));
} }
return result; return result;
} }
@ -610,22 +610,22 @@ internal abstract class MapLogic
private static void ParallelFor(Configuration configuration, string eDistanceContentDirectory, List<LocationContainer<MetadataExtractor.Directory>> collection, long personKey, string file) private static void ParallelFor(Configuration configuration, string eDistanceContentDirectory, List<LocationContainer<MetadataExtractor.Directory>> collection, long personKey, string file)
{ {
const string lnk = ".lnk"; const string lnk = ".lnk";
int? id, normalizedRectangle; int? id, wholePercentages;
IReadOnlyList<MetadataExtractor.Directory> directories; IReadOnlyList<MetadataExtractor.Directory> directories;
bool fromDistanceContent = !file.EndsWith(lnk) && file.Contains(eDistanceContentDirectory); bool fromDistanceContent = !file.EndsWith(lnk) && file.Contains(eDistanceContentDirectory);
if (!file.EndsWith(lnk)) if (!file.EndsWith(lnk))
(id, normalizedRectangle) = IMapping.GetConverted(configuration.FacesFileNameExtension, file); (id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, file);
else else
(id, normalizedRectangle) = IMapping.GetConverted(configuration.FacesFileNameExtension, file[..^4]); (id, wholePercentages) = IMapping.GetConverted(configuration.FacesFileNameExtension, file[..^4]);
if (id is null || normalizedRectangle is null) if (id is null || wholePercentages is null)
return; return;
if (file.EndsWith(lnk) || (!configuration.DistanceMoveUnableToMatch && !configuration.DistanceRenameToMatch)) if (file.EndsWith(lnk) || (!configuration.DistanceMoveUnableToMatch && !configuration.DistanceRenameToMatch))
directories = new List<MetadataExtractor.Directory>(); directories = new List<MetadataExtractor.Directory>();
else else
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file); directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
Rectangle? rectangle = ILocation.GetNormalizedRectangle(configuration.LocationDigits, normalizedRectangle.Value); Rectangle? rectangle = ILocation.GetWholePercentages(configuration.LocationDigits, wholePercentages.Value);
lock (collection) lock (collection)
collection.Add(new(fromDistanceContent, file, personKey, id.Value, normalizedRectangle.Value, directories, rectangle, null)); collection.Add(new(fromDistanceContent, file, personKey, id.Value, wholePercentages.Value, directories, rectangle, null));
} }
private static void OpenPossibleDuplicates(Configuration configuration, List<(long, int, string, double?)> duplicates) private static void OpenPossibleDuplicates(Configuration configuration, List<(long, int, string, double?)> duplicates)
@ -661,7 +661,7 @@ internal abstract class MapLogic
Rectangle? rectangle; Rectangle? rectangle;
List<string> delete = new(); List<string> delete = new();
Rectangle intersectRectangle; Rectangle intersectRectangle;
(string File, int NormalizedRectangle) item; (string File, int WholePercentages) item;
Dictionary<string, (string, int)> distinct = new(); Dictionary<string, (string, int)> distinct = new();
List<(long, int, string, double?)> duplicates = new(); List<(long, int, string, double?)> duplicates = new();
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in collection) foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in collection)
@ -669,13 +669,13 @@ internal abstract class MapLogic
key = string.Concat(locationContainer.PersonKey, locationContainer.Id); key = string.Concat(locationContainer.PersonKey, locationContainer.Id);
if (distinct.TryGetValue(key, out item)) if (distinct.TryGetValue(key, out item))
{ {
if (item.NormalizedRectangle == locationContainer.NormalizedRectangle) if (item.WholePercentages == locationContainer.WholePercentages)
continue; continue;
if (locationContainer.Rectangle is null) if (locationContainer.Rectangle is null)
percent = null; percent = null;
else else
{ {
rectangle = ILocation.GetNormalizedRectangle(configuration.LocationDigits, item.NormalizedRectangle); rectangle = ILocation.GetWholePercentages(configuration.LocationDigits, item.WholePercentages);
if (locationContainer.Rectangle is null || rectangle is null) if (locationContainer.Rectangle is null || rectangle is null)
percent = null; percent = null;
else else
@ -689,7 +689,7 @@ internal abstract class MapLogic
duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.File, percent)); duplicates.Add(new(locationContainer.PersonKey, locationContainer.Id, locationContainer.File, percent));
continue; continue;
} }
distinct.Add(key, new(locationContainer.File, locationContainer.NormalizedRectangle)); distinct.Add(key, new(locationContainer.File, locationContainer.WholePercentages));
} }
if (!configuration.DeletePossibleDuplicates && duplicates.Any()) if (!configuration.DeletePossibleDuplicates && duplicates.Any())
OpenPossibleDuplicates(configuration, duplicates); OpenPossibleDuplicates(configuration, duplicates);
@ -726,7 +726,7 @@ internal abstract class MapLogic
return results; return results;
} }
internal static void Set(int maxDegreeOfParallelism, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, string eDistanceContentDirectory, Dictionary<long, PersonContainer> personKeyToPersonContainer, List<PersonContainer> notMappedPersonContainers, Dictionary<int, List<int>> skipCollection, Dictionary<int, List<int>> skipNotSkipCollection, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenNormalizedRectangleToPersonContainers) internal static void Set(int maxDegreeOfParallelism, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, string? a2PeopleSingletonDirectory, string eDistanceContentDirectory, Dictionary<long, PersonContainer> personKeyToPersonContainer, List<PersonContainer> notMappedPersonContainers, Dictionary<int, List<int>> skipCollection, Dictionary<int, List<int>> skipNotSkipCollection, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, Dictionary<int, Dictionary<int, PersonContainer[]>> idThenWholePercentagesToPersonContainers)
{ {
string message; string message;
int totalSeconds; int totalSeconds;
@ -736,7 +736,7 @@ internal abstract class MapLogic
Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer = new(); Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer = new();
Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection = new(); Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection = new();
string[] ticksDirectories = UpdateDateVerifyAndGetTicksDirectories(eDistanceContentDirectory); string[] ticksDirectories = UpdateDateVerifyAndGetTicksDirectories(eDistanceContentDirectory);
List<(string, string[], int, int)> personKeyFormattedIdThenNormalizedRectangleCollection = new(); List<(string, string[], int, int)> personKeyFormattedIdThenWholePercentagesCollection = new();
List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer = new(); List<(string[], PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer = new();
SetPersonCollections(configuration, personContainers, a2PeopleSingletonDirectory, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection, skipCollection, skipNotSkipCollection); SetPersonCollections(configuration, personContainers, a2PeopleSingletonDirectory, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedCollection, skipCollection, skipNotSkipCollection);
// personContainers.AddRange(GetNonSpecificPeopleCollection(configuration, ticks, personKeys)); // personContainers.AddRange(GetNonSpecificPeopleCollection(configuration, ticks, personKeys));
@ -744,14 +744,14 @@ internal abstract class MapLogic
message = $") {ticksDirectories.Length:000} compile from and clean ticks Director(ies) - B - {totalSeconds} total second(s)"; 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); List<(string, string[], string)> collection = DeleteEmptyDirectoriesAndGetCollection(configuration, personKeyFormattedCollection, ticksDirectories, message);
locationContainers.AddRange(GetLocationContainers(maxDegreeOfParallelism, configuration, ticks, personContainers, eDistanceContentDirectory, collection)); locationContainers.AddRange(GetLocationContainers(maxDegreeOfParallelism, configuration, ticks, personContainers, eDistanceContentDirectory, collection));
int unableToMatchCount = SetCollectionsAndGetUnableToConvertCount(configuration, ticks, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedIdThenNormalizedRectangleCollection, collection); int unableToMatchCount = SetCollectionsAndGetUnableToConvertCount(configuration, ticks, personKeyFormattedToNewestPersonKeyFormatted, personKeyFormattedIdThenWholePercentagesCollection, collection);
SetKeyValuePairs(configuration, personContainers, personKeyToPersonContainerCollection, personKeyFormattedToPersonContainer, personKeyFormattedIdThenNormalizedRectangleCollection, personKeyToPersonContainer, idThenNormalizedRectangleToPersonContainers, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer); SetKeyValuePairs(configuration, personContainers, personKeyToPersonContainerCollection, personKeyFormattedToPersonContainer, personKeyFormattedIdThenWholePercentagesCollection, personKeyToPersonContainer, idThenWholePercentagesToPersonContainers, possiblyNewPersonDisplayDirectoryNamesAndPersonContainer);
totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds); totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
message = $") {collection.Count:000} message from ticks Director(ies) - D - {unableToMatchCount} Unable To Match Count / {collection.Count} Collection - {totalSeconds} total second(s)"; message = $") {collection.Count:000} message from ticks Director(ies) - D - {unableToMatchCount} Unable To Match Count / {collection.Count} Collection - {totalSeconds} total second(s)";
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true }; ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
using (ProgressBar progressBar = new(collection.Count, message, options)) using (ProgressBar progressBar = new(collection.Count, message, options))
{ {
foreach (KeyValuePair<int, Dictionary<int, PersonContainer[]>> keyValuePair in idThenNormalizedRectangleToPersonContainers) foreach (KeyValuePair<int, Dictionary<int, PersonContainer[]>> keyValuePair in idThenWholePercentagesToPersonContainers)
{ {
progressBar.Tick(); progressBar.Tick();
foreach (KeyValuePair<int, PersonContainer[]> keyValue in keyValuePair.Value) foreach (KeyValuePair<int, PersonContainer[]> keyValue in keyValuePair.Value)
@ -841,7 +841,7 @@ internal abstract class MapLogic
SaveContainer result; SaveContainer result;
if (sortingContainer.Mapping.MappingFromLocation is null) if (sortingContainer.Mapping.MappingFromLocation is null)
throw new NullReferenceException(nameof(sortingContainer.Mapping.MappingFromLocation)); throw new NullReferenceException(nameof(sortingContainer.Mapping.MappingFromLocation));
FileHolder faceFileHolder = new($"C:/{sortingContainer.Sorting.Id}.{sortingContainer.Sorting.NormalizedRectangle}"); FileHolder faceFileHolder = new($"C:/{sortingContainer.Sorting.Id}.{sortingContainer.Sorting.WholePercentages}");
string shortcutFile; string shortcutFile;
if (mappingFromPerson is null) if (mappingFromPerson is null)
shortcutFile = Path.Combine(directory, $"{sortingContainer.Mapping.MappingFromLocation.DeterministicHashCodeKey}{sortingContainer.Mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.{sortingContainer.Sorting.DistancePermyriad}.lnk"); shortcutFile = Path.Combine(directory, $"{sortingContainer.Mapping.MappingFromLocation.DeterministicHashCodeKey}{sortingContainer.Mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.{sortingContainer.Sorting.DistancePermyriad}.lnk");
@ -1019,7 +1019,7 @@ internal abstract class MapLogic
return results; return results;
} }
internal static Dictionary<int, Dictionary<int, Mapping>> GetIdToNormalizedRectangleToFace(Mapping[] mappingCollection) internal static Dictionary<int, Dictionary<int, Mapping>> GetIdToWholePercentagesToFace(Mapping[] mappingCollection)
{ {
Dictionary<int, Dictionary<int, Mapping>> results = new(); Dictionary<int, Dictionary<int, Mapping>> results = new();
Dictionary<int, Mapping>? keyValuePairs; Dictionary<int, Mapping>? keyValuePairs;
@ -1033,9 +1033,9 @@ internal abstract class MapLogic
if (!results.TryGetValue(mapping.MappingFromItem.Id, out keyValuePairs)) if (!results.TryGetValue(mapping.MappingFromItem.Id, out keyValuePairs))
throw new Exception(); throw new Exception();
} }
if (keyValuePairs.ContainsKey(mapping.MappingFromLocation.NormalizedRectangle)) if (keyValuePairs.ContainsKey(mapping.MappingFromLocation.WholePercentages))
continue; continue;
keyValuePairs.Add(mapping.MappingFromLocation.NormalizedRectangle, mapping); keyValuePairs.Add(mapping.MappingFromLocation.WholePercentages, mapping);
} }
return results; return results;
} }

View File

@ -23,9 +23,9 @@ public interface IMapLogic
static Shared.Models.Mapping[] GetSelectedMappingCollection(List<Shared.Models.Face> faces) => static Shared.Models.Mapping[] GetSelectedMappingCollection(List<Shared.Models.Face> faces) =>
MapLogic.GetSelectedMappingCollection(faces); MapLogic.GetSelectedMappingCollection(faces);
Dictionary<int, Dictionary<int, Shared.Models.Mapping>> TestStatic_GetIdToNormalizedRectangleToFace(Shared.Models.Mapping[] mappingCollection) => Dictionary<int, Dictionary<int, Shared.Models.Mapping>> TestStatic_GetIdToWholePercentagesToFace(Shared.Models.Mapping[] mappingCollection) =>
GetIdToNormalizedRectangleToFace(mappingCollection); GetIdToWholePercentagesToFace(mappingCollection);
static Dictionary<int, Dictionary<int, Shared.Models.Mapping>> GetIdToNormalizedRectangleToFace(Shared.Models.Mapping[] mappingCollection) => static Dictionary<int, Dictionary<int, Shared.Models.Mapping>> GetIdToWholePercentagesToFace(Shared.Models.Mapping[] mappingCollection) =>
MapLogic.GetIdToNormalizedRectangleToFace(mappingCollection); MapLogic.GetIdToWholePercentagesToFace(mappingCollection);
} }

View File

@ -174,7 +174,7 @@ public class F_PhotoPrism
string file; string file;
string text; string text;
double percent; double percent;
int? normalizedRectangle; int? wholePercentages;
List<string> subjects = new(); List<string> subjects = new();
PersonContainer[]? personContainers; PersonContainer[]? personContainers;
StringBuilder stringBuilder = new(); StringBuilder stringBuilder = new();
@ -182,21 +182,21 @@ public class F_PhotoPrism
System.Drawing.Rectangle? prismRectangle; System.Drawing.Rectangle? prismRectangle;
System.Drawing.Rectangle intersectRectangle; System.Drawing.Rectangle intersectRectangle;
float rectangleIntersectMinimum = rectangleIntersectMinimums.Min(); float rectangleIntersectMinimum = rectangleIntersectMinimums.Min();
Dictionary<int, PersonContainer[]>? normalizedRectangleToPersonContainers; Dictionary<int, PersonContainer[]>? wholePercentagesToPersonContainers;
(MappingFromPhotoPrism MappingFromPhotoPrism, Shared.Models.Marker Marker, double Percent)[] sortedCollection; (MappingFromPhotoPrism MappingFromPhotoPrism, Shared.Models.Marker Marker, double Percent)[] sortedCollection;
List<(MappingFromPhotoPrism MappingFromPhotoPrism, Shared.Models.Marker Marker, double Percent)> collection = new(); List<(MappingFromPhotoPrism MappingFromPhotoPrism, Shared.Models.Marker Marker, double Percent)> collection = new();
foreach (Face face in distinctFilteredFaces) foreach (Face face in distinctFilteredFaces)
{ {
collection.Clear(); collection.Clear();
normalizedRectangle = face.Mapping?.MappingFromLocation?.NormalizedRectangle; wholePercentages = face.Mapping?.MappingFromLocation?.WholePercentages;
if (normalizedRectangle is null) if (wholePercentages is null)
continue; continue;
if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null || face.Mapping is null) if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null || face.Mapping is null)
continue; continue;
if (face.Mapping.MappingFromPhotoPrismCollection is null) if (face.Mapping.MappingFromPhotoPrismCollection is null)
continue; continue;
(_, normalizedRectangleToPersonContainers) = mapLogic.GetNormalizedRectangleToPersonContainers(face.Mapping.MappingFromItem.Id); (_, wholePercentagesToPersonContainers) = mapLogic.GetWholePercentagesToPersonContainers(face.Mapping.MappingFromItem.Id);
if (normalizedRectangleToPersonContainers is null || !normalizedRectangleToPersonContainers.TryGetValue(normalizedRectangle.Value, out personContainers)) if (wholePercentagesToPersonContainers is null || !wholePercentagesToPersonContainers.TryGetValue(wholePercentages.Value, out personContainers))
continue; continue;
dlibRectangle = new(face.Location.Left, face.Location.Top, face.Location.Right - face.Location.Left, face.Location.Bottom - face.Location.Top); dlibRectangle = new(face.Location.Left, face.Location.Top, face.Location.Right - face.Location.Left, face.Location.Bottom - face.Location.Top);
foreach (MappingFromPhotoPrism mappingFromPhotoPrism in face.Mapping.MappingFromPhotoPrismCollection) foreach (MappingFromPhotoPrism mappingFromPhotoPrism in face.Mapping.MappingFromPhotoPrismCollection)

View File

@ -12,10 +12,10 @@ public record class FaceDistance : Properties.IFaceDistance
public int Id { init; get; } public int Id { init; get; }
public bool? IsWrongYear { init; get; } public bool? IsWrongYear { init; get; }
public double? Length { init; get; } public double? Length { init; get; }
public int? NormalizedRectangle { init; get; } public int? WholePercentages { init; get; }
[JsonConstructor] [JsonConstructor]
public FaceDistance(int? confidencePercent, DateTime dateTimeOriginalThenMinimumDateTime, object? encoding, int id, bool? isWrongYear, double? length, int? normalizedRectangle) public FaceDistance(int? confidencePercent, DateTime dateTimeOriginalThenMinimumDateTime, object? encoding, int id, bool? isWrongYear, double? length, int? wholePercentages)
{ {
ConfidencePercent = confidencePercent; ConfidencePercent = confidencePercent;
DateTimeOriginalThenMinimumDateTime = dateTimeOriginalThenMinimumDateTime; DateTimeOriginalThenMinimumDateTime = dateTimeOriginalThenMinimumDateTime;
@ -23,15 +23,15 @@ public record class FaceDistance : Properties.IFaceDistance
Id = id; Id = id;
IsWrongYear = isWrongYear; IsWrongYear = isWrongYear;
Length = length; Length = length;
NormalizedRectangle = normalizedRectangle; WholePercentages = wholePercentages;
} }
public FaceDistance(int? confidencePercent, DateTime dateTimeOriginalThenMinimumDateTime, object? encoding, int id, bool? isWrongYear, int? normalizedRectangle) : public FaceDistance(int? confidencePercent, DateTime dateTimeOriginalThenMinimumDateTime, object? encoding, int id, bool? isWrongYear, int? wholePercentages) :
this(confidencePercent, dateTimeOriginalThenMinimumDateTime, encoding, id, isWrongYear, null, normalizedRectangle) this(confidencePercent, dateTimeOriginalThenMinimumDateTime, encoding, id, isWrongYear, null, wholePercentages)
{ } { }
public FaceDistance(FaceDistance faceDistance, double length) : public FaceDistance(FaceDistance faceDistance, double length) :
this(faceDistance.ConfidencePercent, faceDistance.DateTimeOriginalThenMinimumDateTime, null, faceDistance.Id, faceDistance.IsWrongYear, length, faceDistance.NormalizedRectangle) this(faceDistance.ConfidencePercent, faceDistance.DateTimeOriginalThenMinimumDateTime, null, faceDistance.Id, faceDistance.IsWrongYear, length, faceDistance.WholePercentages)
{ } { }
public FaceDistance(object encoding) => Encoding = encoding; public FaceDistance(object encoding) => Encoding = encoding;

View File

@ -2,5 +2,5 @@ using System.Drawing;
namespace View_by_Distance.Shared.Models; namespace View_by_Distance.Shared.Models;
public record LocationContainer<T>(bool FromDistanceContent, string File, long PersonKey, int Id, int NormalizedRectangle, IReadOnlyList<T> Directories, Rectangle? Rectangle, Location? Location) public record LocationContainer<T>(bool FromDistanceContent, string File, long PersonKey, int Id, int WholePercentages, IReadOnlyList<T> Directories, Rectangle? Rectangle, Location? Location)
{ } { }

View File

@ -9,15 +9,15 @@ public class MappingFromLocation : Properties.IMappingFromLocation
public int AreaPermyriad { init; get; } public int AreaPermyriad { init; get; }
public int ConfidencePercent { init; get; } public int ConfidencePercent { init; get; }
public string DeterministicHashCodeKey { init; get; } public string DeterministicHashCodeKey { init; get; }
public int NormalizedRectangle { init; get; } public int WholePercentages { init; get; }
[JsonConstructor] [JsonConstructor]
public MappingFromLocation(int areaPermyriad, int confidencePercent, string deterministicHashCodeKey, int normalizedRectangle) public MappingFromLocation(int areaPermyriad, int confidencePercent, string deterministicHashCodeKey, int wholePercentages)
{ {
AreaPermyriad = areaPermyriad; AreaPermyriad = areaPermyriad;
ConfidencePercent = confidencePercent; ConfidencePercent = confidencePercent;
DeterministicHashCodeKey = deterministicHashCodeKey; DeterministicHashCodeKey = deterministicHashCodeKey;
NormalizedRectangle = normalizedRectangle; WholePercentages = wholePercentages;
} }
public override string ToString() public override string ToString()

View File

@ -3,6 +3,6 @@ namespace View_by_Distance.Shared.Models.Methods;
public interface IMapLogic public interface IMapLogic
{ {
(bool, Dictionary<int, PersonContainer[]>?) GetNormalizedRectangleToPersonContainers(int id); (bool, Dictionary<int, PersonContainer[]>?) GetWholePercentagesToPersonContainers(int id);
} }

View File

@ -9,6 +9,6 @@ public interface IFaceDistance
public int Id { init; get; } public int Id { init; get; }
public bool? IsWrongYear { init; get; } public bool? IsWrongYear { init; get; }
public double? Length { init; get; } public double? Length { init; get; }
public int? NormalizedRectangle { init; get; } public int? WholePercentages { init; get; }
} }

View File

@ -6,6 +6,6 @@ public interface IMappingFromLocation
public int AreaPermyriad { init; get; } public int AreaPermyriad { init; get; }
public int ConfidencePercent { init; get; } public int ConfidencePercent { init; get; }
public string DeterministicHashCodeKey { init; get; } public string DeterministicHashCodeKey { init; get; }
public int NormalizedRectangle { init; get; } public int WholePercentages { init; get; }
} }

View File

@ -6,6 +6,7 @@ public interface ISorting
public int DaysDelta { init; get; } public int DaysDelta { init; get; }
public int DistancePermyriad { init; get; } public int DistancePermyriad { init; get; }
public int Id { init; get; } public int Id { init; get; }
public int NormalizedRectangle { init; get; } public bool Older { init; get; }
public int WholePercentages { init; get; }
} }

View File

@ -9,21 +9,21 @@ public record class Sorting : Properties.ISorting
public int DaysDelta { init; get; } public int DaysDelta { init; get; }
public int DistancePermyriad { init; get; } public int DistancePermyriad { init; get; }
public int Id { init; get; } public int Id { init; get; }
public int NormalizedRectangle { init; get; }
public bool Older { init; get; } public bool Older { init; get; }
public int WholePercentages { init; get; }
[JsonConstructor] [JsonConstructor]
public Sorting(int daysDelta, int distancePermyriad, int id, int normalizedRectangle, bool older) public Sorting(int daysDelta, int distancePermyriad, int id, bool older, int wholePercentages)
{ {
DaysDelta = daysDelta; DaysDelta = daysDelta;
DistancePermyriad = distancePermyriad; DistancePermyriad = distancePermyriad;
Id = id; Id = id;
NormalizedRectangle = normalizedRectangle; WholePercentages = wholePercentages;
Older = older; Older = older;
} }
public Sorting(Mapping mapping, MappingFromLocation mappingFromLocation) : public Sorting(Mapping mapping, MappingFromLocation mappingFromLocation) :
this(0, 0, mapping.MappingFromItem.Id, mappingFromLocation.NormalizedRectangle, false) this(0, 0, mapping.MappingFromItem.Id, false, mappingFromLocation.WholePercentages)
{ } { }
public override string ToString() public override string ToString()

View File

@ -17,7 +17,7 @@ public record class SortingContainer : Properties.ISortingContainer
public override string ToString() 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', '\t', Sorting.DistancePermyriad, '\t', Sorting.DaysDelta); string result = string.Concat(Mapping.MappingFromItem.Id, '\t', Mapping.MappingFromLocation?.WholePercentages, '\t', Sorting.Id, '\t', Sorting.WholePercentages, '\t', Sorting.Older, '\t', '\t', Sorting.DistancePermyriad, '\t', Sorting.DaysDelta);
return result; return result;
} }

View File

@ -10,10 +10,10 @@ public interface ILocation
static Models.Location? GetLocation(int height, Rectangle rectangle, int width) => static Models.Location? GetLocation(int height, Rectangle rectangle, int width) =>
Location.GetLocation(height, rectangle, width); Location.GetLocation(height, rectangle, width);
List<Models.Face> TestStatic_FilterByIntersect(Models.Face[] faces, int normalizedRectangle, float rectangleIntersectMinimum) => List<Models.Face> TestStatic_FilterByIntersect(Models.Face[] faces, float rectangleIntersectMinimum, int wholePercentages) =>
FilterByIntersect(faces, normalizedRectangle, rectangleIntersectMinimum); FilterByIntersect(faces, rectangleIntersectMinimum, wholePercentages);
static List<Models.Face> FilterByIntersect(Models.Face[] faces, int normalizedRectangle, float rectangleIntersectMinimum) => static List<Models.Face> FilterByIntersect(Models.Face[] faces, float rectangleIntersectMinimum, int wholePercentages) =>
Location.FilterByIntersect(faces, normalizedRectangle, rectangleIntersectMinimum); Location.FilterByIntersect(faces, rectangleIntersectMinimum, wholePercentages);
Rectangle? TestStatic_GetRectangle(DatabaseFile databaseFile, Marker marker, Models.OutputResolution outputResolution) => Rectangle? TestStatic_GetRectangle(DatabaseFile databaseFile, Marker marker, Models.OutputResolution outputResolution) =>
GetRectangle(databaseFile, marker, outputResolution); GetRectangle(databaseFile, marker, outputResolution);
@ -30,15 +30,15 @@ public interface ILocation
static List<Models.Location> GetLocations<T>(List<MappingFromPhotoPrism> mappingFromPhotoPrismCollection, List<Models.Face> faces, List<LocationContainer<T>> containers) => static List<Models.Location> GetLocations<T>(List<MappingFromPhotoPrism> mappingFromPhotoPrismCollection, List<Models.Face> faces, List<LocationContainer<T>> containers) =>
Location.GetLocations(mappingFromPhotoPrismCollection, faces, containers); Location.GetLocations(mappingFromPhotoPrismCollection, faces, containers);
Rectangle? TestStatic_GetNormalizedRectangle(int locationDigits, int normalizedRectangle) => Rectangle? TestStatic_GetWholePercentages(int locationDigits, int wholePercentages) =>
GetNormalizedRectangle(locationDigits, normalizedRectangle); GetWholePercentages(locationDigits, wholePercentages);
static Rectangle? GetNormalizedRectangle(int locationDigits, int normalizedRectangle) => static Rectangle? GetWholePercentages(int locationDigits, int wholePercentages) =>
Location.GetNormalizedRectangle(locationDigits, normalizedRectangle.ToString()); Location.GetWholePercentages(locationDigits, wholePercentages.ToString());
Rectangle? TestStatic_GetRectangle(int locationDigits, int normalizedRectangle, Models.OutputResolution outputResolution) => Rectangle? TestStatic_GetRectangle(int locationDigits, Models.OutputResolution outputResolution, int wholePercentages) =>
GetRectangle(locationDigits, normalizedRectangle, outputResolution); GetRectangle(locationDigits, outputResolution, wholePercentages);
static Rectangle? GetRectangle(int locationDigits, int normalizedRectangle, Models.OutputResolution outputResolution) => static Rectangle? GetRectangle(int locationDigits, Models.OutputResolution outputResolution, int wholePercentages) =>
Location.GetRectangle(locationDigits, normalizedRectangle.ToString(), outputResolution); Location.GetRectangle(locationDigits, outputResolution, wholePercentages.ToString());
string TestStatic_GetLeftPadded(int locationDigits, string value) => string TestStatic_GetLeftPadded(int locationDigits, string value) =>
GetLeftPadded(locationDigits, value); GetLeftPadded(locationDigits, value);
@ -80,20 +80,20 @@ public interface ILocation
static (decimal?, decimal?, decimal?, decimal?) GetHeightLeftTopWidth(Models.Location location, Models.OutputResolution outputResolution) => static (decimal?, decimal?, decimal?, decimal?) GetHeightLeftTopWidth(Models.Location location, Models.OutputResolution outputResolution) =>
Location.GetHeightLeftTopWidth(location.Bottom, OutputResolution.Get(outputResolution).Height, location.Left, location.Right, location.Top, OutputResolution.Get(outputResolution).Width, zCount: 1); Location.GetHeightLeftTopWidth(location.Bottom, OutputResolution.Get(outputResolution).Height, location.Left, location.Right, location.Top, OutputResolution.Get(outputResolution).Width, zCount: 1);
int TestStatic_GetNormalizedRectangle(Models.Location location, int locationDigits, Models.OutputResolution outputResolution) => int TestStatic_GetWholePercentages(Models.Location location, int locationDigits, Models.OutputResolution outputResolution) =>
GetNormalizedRectangle(location, locationDigits, outputResolution); GetWholePercentages(location, locationDigits, outputResolution);
static int GetNormalizedRectangle(Models.Location location, int locationDigits, Models.OutputResolution outputResolution) => static int GetWholePercentages(Models.Location location, int locationDigits, Models.OutputResolution outputResolution) =>
Location.GetNormalizedRectangle(location.Bottom, OutputResolution.Get(outputResolution).Height, location.Left, locationDigits, location.Right, location.Top, OutputResolution.Get(outputResolution).Width, zCount: 1); Location.GetWholePercentages(location.Bottom, OutputResolution.Get(outputResolution).Height, location.Left, locationDigits, location.Right, location.Top, OutputResolution.Get(outputResolution).Width, zCount: 1);
int TestStatic_GetNormalizedRectangle(int locationDigits) => int TestStatic_GetWholePercentages(int locationDigits) =>
GetNormalizedRectangle(locationDigits); GetWholePercentages(locationDigits);
static int GetNormalizedRectangle(int locationDigits) => static int GetWholePercentages(int locationDigits) =>
Location.GetNormalizedRectangle(1, 1, 0, locationDigits, 1, 0, 1, zCount: 1); Location.GetWholePercentages(1, 1, 0, locationDigits, 1, 0, 1, zCount: 1);
int TestStatic_GetNormalizedRectangle(int bottom, int height, int left, int locationDigits, int right, int top, int width) => int TestStatic_GetWholePercentages(int bottom, int height, int left, int locationDigits, int right, int top, int width) =>
GetNormalizedRectangle(bottom, height, left, locationDigits, right, top, width); GetWholePercentages(bottom, height, left, locationDigits, right, top, width);
static int GetNormalizedRectangle(int bottom, int height, int left, int locationDigits, int right, int top, int width) => static int GetWholePercentages(int bottom, int height, int left, int locationDigits, int right, int top, int width) =>
Location.GetNormalizedRectangle(bottom, height, left, locationDigits, right, top, width, zCount: 1); Location.GetWholePercentages(bottom, height, left, locationDigits, right, top, width, zCount: 1);
Models.Location TestStatic_GetTrimBound(double detectionConfidence, Rectangle rectangle, int width, int height, int facesCount) => Models.Location TestStatic_GetTrimBound(double detectionConfidence, Rectangle rectangle, int width, int height, int facesCount) =>
TrimBound(detectionConfidence, rectangle, width, height, facesCount); TrimBound(detectionConfidence, rectangle, width, height, facesCount);

View File

@ -26,12 +26,12 @@ public interface IMapping
string TestStatic_GetDeterministicHashCodeKey(int id, Models.Location location, int locationDigits, Models.OutputResolution outputResolution) string TestStatic_GetDeterministicHashCodeKey(int id, Models.Location location, int locationDigits, Models.OutputResolution outputResolution)
=> GetDeterministicHashCodeKey(id, location, locationDigits, outputResolution); => GetDeterministicHashCodeKey(id, location, locationDigits, outputResolution);
static string GetDeterministicHashCodeKey(int id, Models.Location location, int locationDigits, Models.OutputResolution outputResolution) static string GetDeterministicHashCodeKey(int id, Models.Location location, int locationDigits, Models.OutputResolution outputResolution)
=> $"{id}.{ILocation.GetLeftPadded(locationDigits, ILocation.GetNormalizedRectangle(location, locationDigits, outputResolution))}"; => $"{id}.{ILocation.GetLeftPadded(locationDigits, ILocation.GetWholePercentages(location, locationDigits, outputResolution))}";
string TestStatic_GetDeterministicHashCodeKey(int id, int locationDigits) string TestStatic_GetDeterministicHashCodeKey(int id, int locationDigits)
=> GetDeterministicHashCodeKey(id, locationDigits); => GetDeterministicHashCodeKey(id, locationDigits);
static string GetDeterministicHashCodeKey(int id, int locationDigits) static string GetDeterministicHashCodeKey(int id, int locationDigits)
=> $"{id}.{ILocation.GetLeftPadded(locationDigits, ILocation.GetNormalizedRectangle(locationDigits))}"; => $"{id}.{ILocation.GetLeftPadded(locationDigits, ILocation.GetWholePercentages(locationDigits))}";
(int?, int?) TestStatic_GetConverted(string facesFileNameExtension, string file) => (int?, int?) TestStatic_GetConverted(string facesFileNameExtension, string file) =>
GetConverted(facesFileNameExtension, file); GetConverted(facesFileNameExtension, file);

View File

@ -78,7 +78,7 @@ internal abstract class Location
return result; return result;
} }
internal static int GetNormalizedRectangle(int bottom, int height, int left, int locationDigits, int right, int top, int width, int zCount) internal static int GetWholePercentages(int bottom, int height, int left, int locationDigits, int right, int top, int width, int zCount)
{ {
int result; int result;
string check; string check;
@ -114,34 +114,37 @@ internal abstract class Location
return result; return result;
} }
internal static Rectangle? GetNormalizedRectangle(int locationDigits, string normalizedRectangle) internal static Rectangle? GetWholePercentages(int locationDigits, string wholePercentages)
{ {
Rectangle? result; Rectangle? result;
int length = (locationDigits - 1) / 4; int length = (locationDigits - 1) / 4;
string[] segments = new string[] string[] segments = new string[]
{ {
normalizedRectangle[..1], wholePercentages[..1],
normalizedRectangle.Substring(1, length), wholePercentages.Substring(1, length),
normalizedRectangle.Substring(3, length), wholePercentages.Substring(3, length),
normalizedRectangle.Substring(5, length), wholePercentages.Substring(5, length),
normalizedRectangle.Substring(7, length) wholePercentages.Substring(7, length)
}; };
if (string.Join(string.Empty, segments) != normalizedRectangle) if (string.Join(string.Empty, segments) != wholePercentages)
result = null; result = null;
else else
{ {
if (!int.TryParse(segments[1], out int xNormalized) || !int.TryParse(segments[2], out int yNormalized) || !int.TryParse(segments[3], out int wNormalized) || !int.TryParse(segments[4], out int hNormalized)) if (!int.TryParse(segments[1], out int xWholePercent) || !int.TryParse(segments[2], out int yWholePercent) || !int.TryParse(segments[3], out int wWholePercent) || !int.TryParse(segments[4], out int hWholePercent))
result = null; result = null;
else else
result = new(xNormalized, yNormalized, wNormalized, hNormalized); result = new(xWholePercent, yWholePercent, wWholePercent, hWholePercent);
} }
return result; return result;
} }
internal static Rectangle? GetRectangle(int height, int locationDigits, string normalizedRectangle, int width) internal static Rectangle? GetRectangle(int locationDigits, Models.OutputResolution outputResolution, string wholePercentages)
{ {
Rectangle? result; Rectangle? result;
Rectangle? rectangle = GetNormalizedRectangle(locationDigits, normalizedRectangle); if (wholePercentages.Length != locationDigits || wholePercentages[0] is not '4' and not '8')
throw new NotSupportedException("Old way has been removed!");
(int width, int height) = OutputResolution.Get(outputResolution);
Rectangle? rectangle = GetWholePercentages(locationDigits, wholePercentages);
if (rectangle is null) if (rectangle is null)
result = null; result = null;
else else
@ -149,16 +152,6 @@ internal abstract class Location
decimal factor = 100; decimal factor = 100;
result = new((int)(rectangle.Value.X / factor * width), (int)(rectangle.Value.Y / factor * height), (int)(rectangle.Value.Width / factor * width), (int)(rectangle.Value.Height / factor * height)); result = new((int)(rectangle.Value.X / factor * width), (int)(rectangle.Value.Y / factor * height), (int)(rectangle.Value.Width / factor * width), (int)(rectangle.Value.Height / factor * height));
} }
return result;
}
internal static Rectangle? GetRectangle(int locationDigits, string normalizedRectangle, Models.OutputResolution outputResolution)
{
Rectangle? result;
if (normalizedRectangle.Length != locationDigits || normalizedRectangle[0] is not '4' and not '8')
throw new NotSupportedException("Old way has been removed!");
(int width, int height) = OutputResolution.Get(outputResolution);
result = GetRectangle(height, locationDigits, normalizedRectangle, width);
if (result is null) if (result is null)
throw new NullReferenceException(nameof(result)); throw new NullReferenceException(nameof(result));
return result; return result;
@ -290,7 +283,12 @@ internal abstract class Location
return results; return results;
} }
internal static List<Models.Face> FilterByIntersect(Models.Face[] faces, int normalizedRectangle, float rectangleIntersectMinimum) // private static double GP(OutputResolution outputResolution,Location location, ){
// double result;
// return result;
// }
internal static List<Models.Face> FilterByIntersect(Models.Face[] faces, float rectangleIntersectMinimum, int wholePercentages)
{ {
List<Models.Face> results = new(); List<Models.Face> results = new();
double? percent; double? percent;
@ -302,7 +300,7 @@ internal abstract class Location
if (face.Location is null || face.OutputResolution is null) if (face.Location is null || face.OutputResolution is null)
continue; continue;
checkRectangle = new(face.Location.Left, face.Location.Top, face.Location.Right - face.Location.Left, face.Location.Bottom - face.Location.Top); checkRectangle = new(face.Location.Left, face.Location.Top, face.Location.Right - face.Location.Left, face.Location.Bottom - face.Location.Top);
sourceRectangle = GetRectangle(Stateless.ILocation.Digits, normalizedRectangle.ToString(), face.OutputResolution); sourceRectangle = GetRectangle(Stateless.ILocation.Digits, face.OutputResolution, wholePercentages.ToString());
if (sourceRectangle is null) if (sourceRectangle is null)
continue; continue;
intersectRectangle = Rectangle.Intersect(checkRectangle, sourceRectangle.Value); intersectRectangle = Rectangle.Intersect(checkRectangle, sourceRectangle.Value);

View File

@ -8,61 +8,61 @@ internal abstract class Mapping
string[] segments = fileName.Split('.'); string[] segments = fileName.Split('.');
string? id; string? id;
string? extensionLowered; string? extensionLowered;
string? wholePercentages;
bool? needsFacesFileNameExtension; bool? needsFacesFileNameExtension;
string? normalizedRectangle;
if (segments.Length < 4 || $".{segments[3]}" != facesFileNameExtension) if (segments.Length < 4 || $".{segments[3]}" != facesFileNameExtension)
{ {
id = null; id = null;
extensionLowered = null; extensionLowered = null;
normalizedRectangle = null; wholePercentages = null;
needsFacesFileNameExtension = null; needsFacesFileNameExtension = null;
} }
else else
{ {
id = segments[0]; id = segments[0];
extensionLowered = $".{segments[2]}"; extensionLowered = $".{segments[2]}";
normalizedRectangle = segments[1]; wholePercentages = segments[1];
needsFacesFileNameExtension = segments.Length == 3; needsFacesFileNameExtension = segments.Length == 3;
} }
return new(id, normalizedRectangle, extensionLowered, needsFacesFileNameExtension); return new(id, wholePercentages, extensionLowered, needsFacesFileNameExtension);
} }
private static (int?, int?) GetConvertedFromSegments(string facesFileNameExtension, string fileName) private static (int?, int?) GetConvertedFromSegments(string facesFileNameExtension, string fileName)
{ {
int? id; int? id;
int? normalizedRectangle; int? wholePercentages;
(string? Id, string? NormalizedRectangle, string? ExtensionLowered, bool? Check) segments = GetSegments(facesFileNameExtension, fileName); (string? Id, string? WholePercentages, string? ExtensionLowered, bool? Check) segments = GetSegments(facesFileNameExtension, fileName);
if (string.IsNullOrEmpty(segments.Id) || string.IsNullOrEmpty(segments.NormalizedRectangle) || string.IsNullOrEmpty(segments.ExtensionLowered) || segments.Check is null) if (string.IsNullOrEmpty(segments.Id) || string.IsNullOrEmpty(segments.WholePercentages) || string.IsNullOrEmpty(segments.ExtensionLowered) || segments.Check is null)
{ {
id = null; id = null;
normalizedRectangle = null; wholePercentages = null;
} }
else if (!int.TryParse(segments.Id, out int idValue) || !int.TryParse(segments.NormalizedRectangle, out int normalizedRectangleValue)) else if (!int.TryParse(segments.Id, out int idValue) || !int.TryParse(segments.WholePercentages, out int wholePercentagesValue))
{ {
id = null; id = null;
normalizedRectangle = null; wholePercentages = null;
} }
else else
{ {
id = idValue; id = idValue;
normalizedRectangle = normalizedRectangleValue; wholePercentages = wholePercentagesValue;
} }
return new(id, normalizedRectangle); return new(id, wholePercentages);
} }
internal static (int?, int?) GetConverted(string facesFileNameExtension, string file) internal static (int?, int?) GetConverted(string facesFileNameExtension, string file)
{ {
int? id; int? id;
int? normalizedRectangle; int? wholePercentages;
string fileName = Path.GetFileName(file); string fileName = Path.GetFileName(file);
if (fileName.Length >= 2 && !fileName[1..].Contains('-')) if (fileName.Length >= 2 && !fileName[1..].Contains('-'))
(id, normalizedRectangle) = GetConvertedFromSegments(facesFileNameExtension, fileName); (id, wholePercentages) = GetConvertedFromSegments(facesFileNameExtension, fileName);
else else
{ {
id = null; id = null;
normalizedRectangle = null; wholePercentages = null;
} }
return new(id, normalizedRectangle); return new(id, wholePercentages);
} }
internal static int GetAreaPermyriad(int faceAreaPermyriad, int bottom, int height, int left, int right, int top, int width) internal static int GetAreaPermyriad(int faceAreaPermyriad, int bottom, int height, int left, int right, int top, int width)

View File

@ -64,15 +64,15 @@ internal abstract class PersonContainer
string[] results; string[] results;
int? id; int? id;
string checkFile; string checkFile;
int? wholePercentages;
string? checkDirectory; string? checkDirectory;
int? normalizedRectangle;
string[] files = Directory.GetFiles(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly); string[] files = Directory.GetFiles(personDisplayDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string file in files) foreach (string file in files)
{ {
if (file.EndsWith(".lnk")) if (file.EndsWith(".lnk"))
continue; continue;
(id, normalizedRectangle) = IMapping.GetConverted(facesFileNameExtension, file); (id, wholePercentages) = IMapping.GetConverted(facesFileNameExtension, file);
if (id is not null && normalizedRectangle is not null) if (id is not null && wholePercentages is not null)
continue; continue;
checkDirectory = Path.GetDirectoryName(file); checkDirectory = Path.GetDirectoryName(file);
if (string.IsNullOrEmpty(checkDirectory)) if (string.IsNullOrEmpty(checkDirectory))

View File

@ -8,13 +8,13 @@ internal abstract class Sorting
Models.Sorting result; Models.Sorting result;
if (faceDistanceLength.Length is null) if (faceDistanceLength.Length is null)
throw new NotSupportedException(); throw new NotSupportedException();
if (faceDistanceLength.NormalizedRectangle is null) if (faceDistanceLength.WholePercentages is null)
throw new NotSupportedException(); throw new NotSupportedException();
TimeSpan timeSpan = new(faceDistanceLength.DateTimeOriginalThenMinimumDateTime.Ticks - faceDistanceEncoding.DateTimeOriginalThenMinimumDateTime.Ticks); TimeSpan timeSpan = new(faceDistanceLength.DateTimeOriginalThenMinimumDateTime.Ticks - faceDistanceEncoding.DateTimeOriginalThenMinimumDateTime.Ticks);
bool older = timeSpan.TotalMilliseconds < 0; bool older = timeSpan.TotalMilliseconds < 0;
int daysDelta = (int)Math.Round(Math.Abs(timeSpan.TotalDays), 0); int daysDelta = (int)Math.Round(Math.Abs(timeSpan.TotalDays), 0);
int distancePermyriad = (int)(faceDistanceLength.Length.Value / rangeDistanceTolerance * faceDistancePermyriad); int distancePermyriad = (int)(faceDistanceLength.Length.Value / rangeDistanceTolerance * faceDistancePermyriad);
result = new(daysDelta, distancePermyriad, faceDistanceLength.Id, faceDistanceLength.NormalizedRectangle.Value, older); result = new(daysDelta, distancePermyriad, faceDistanceLength.Id, older, faceDistanceLength.WholePercentages.Value);
return result; return result;
} }