Save Possibly New Person Containers

This commit is contained in:
2022-09-19 13:52:01 -07:00
parent 8b2cbf7e16
commit 5fb99aac45
27 changed files with 423 additions and 218 deletions

View File

@ -9,8 +9,8 @@ namespace View_by_Distance.Map.Models;
public class MapLogic
{
protected readonly List<long> _NotMappedPersonKeys;
protected readonly Dictionary<int, List<int>> _SkipCollection;
protected readonly List<PersonContainer> _NotMappedPersonContainers;
protected readonly Dictionary<long, PersonContainer> _PersonKeyToPersonContainer;
protected readonly Dictionary<long, (long LCL, long Minimum, long Maximum, long UCL)> _PersonKeyToRanges;
protected readonly Dictionary<int, Dictionary<int, PersonContainer[]>> _IdThenNormalizedPixelPercentageToPersonContainers;
@ -30,7 +30,7 @@ public class MapLogic
private readonly string _FacesHiddenFilenameExtension;
private readonly string _EDistanceContentTicksDirectory;
public MapLogic(int maxDegreeOfParallelism, Property.Models.Configuration propertyConfiguration, Configuration? configuration, string resizeFilenameExtension, string facesFilenameExtension, string facesHiddenFilenameExtension, string facePartsFilenameExtension, long ticks, List<PersonContainer> personContainers, string eResultsFullGroupDirectory, List<Face> distinctFilteredFaces, Shared.Models.Methods.IFaceDistance? distance)
public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, string resizeFilenameExtension, string facesFilenameExtension, string facesHiddenFilenameExtension, string facePartsFilenameExtension, long ticks, List<PersonContainer> personContainers, string eResultsFullGroupDirectory, List<Face> distinctFilteredFaces, Shared.Models.Methods.IFaceDistance? faceDistance)
{
_Ticks = ticks;
_Configuration = configuration;
@ -47,9 +47,9 @@ public class MapLogic
{ }
string json;
string fullPath;
List<long> notMappedPersonKeys = new();
List<KeyValuePair<int, int[]>>? collection;
Dictionary<int, List<int>> skipCollection = new();
List<PersonContainer> notMappedPersonContainers = new();
Dictionary<long, PersonContainer> personKeyToPersonContainer = new();
string eDistanceContentDirectory = Path.Combine(eResultsFullGroupDirectory, "()");
string? rootDirectoryParent = Path.GetDirectoryName(propertyConfiguration.RootDirectory);
@ -65,8 +65,8 @@ public class MapLogic
_ = Directory.CreateDirectory(eDistanceContentDirectory);
if (!Directory.Exists(eDistanceContentTicksDirectory))
_ = Directory.CreateDirectory(eDistanceContentTicksDirectory);
if (configuration is not null)
Stateless.MapLogic.Set(propertyConfiguration, configuration, resizeFilenameExtension, ticks, personContainers, eDistanceContentDirectory, distinctFilteredFaces, distance, personKeyToPersonContainer, personKeyToRanges, notMappedPersonKeys, skipCollection, idThenNormalizedPixelPercentageToPersonContainers);
if (configuration is not null && faceDistance is not null)
Stateless.MapLogic.Set(propertyConfiguration, configuration, resizeFilenameExtension, ticks, personContainers, eDistanceContentDirectory, distinctFilteredFaces, faceDistance, personKeyToPersonContainer, personKeyToRanges, notMappedPersonContainers, skipCollection, idThenNormalizedPixelPercentageToPersonContainers);
foreach (string propertyContentCollectionFile in propertyConfiguration.PropertyContentCollectionFiles)
{
fullPath = Path.GetFullPath(string.Concat(rootDirectoryParent, propertyContentCollectionFile));
@ -81,13 +81,13 @@ public class MapLogic
}
_SkipCollection = skipCollection;
_PersonKeyToRanges = personKeyToRanges;
_NotMappedPersonKeys = notMappedPersonKeys;
_NotMappedPersonContainers = notMappedPersonContainers;
_PersonKeyToPersonContainer = personKeyToPersonContainer;
_EDistanceContentTicksDirectory = eDistanceContentTicksDirectory;
_IdThenNormalizedPixelPercentageToPersonContainers = idThenNormalizedPixelPercentageToPersonContainers;
}
public MapLogic(int maxDegreeOfParallelism, Property.Models.Configuration propertyConfiguration, Configuration? configuration, string outputExtension, long ticks, List<PersonContainer> personContainers, string eResultsFullGroupDirectory) :
public MapLogic(int maxDegreeOfParallelism, Shared.Models.Properties.IPropertyConfiguration propertyConfiguration, Configuration? configuration, string outputExtension, long ticks, List<PersonContainer> personContainers, string eResultsFullGroupDirectory) :
this(maxDegreeOfParallelism, propertyConfiguration, configuration, outputExtension, outputExtension, outputExtension, outputExtension, ticks, personContainers, eResultsFullGroupDirectory, new(), null)
{ }
@ -255,7 +255,6 @@ public class MapLogic
int by = _Mapping;
const int zero = 0;
string mappingSegmentB;
string personKeyFormatted;
PersonBirthday personBirthday;
List<PersonContainer> personContainers = new();
Dictionary<int, PersonContainer[]> keyValuePairs;
@ -279,7 +278,6 @@ public class MapLogic
if (personContainer.PersonKey is null || personContainer.PersonBirthdays is null || !personContainer.PersonBirthdays.Any())
continue;
personBirthday = personContainer.PersonBirthdays[zero];
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personBirthday);
mappingSegmentB = GetMappingSegmentB(_Ticks, personBirthday, personContainer.ApproximateYears, face.Mapping.MappingFromItem);
face.Mapping.UpdateMappingFromPerson(personContainer.ApproximateYears, by, personContainer.PersonDisplayDirectoryName, personBirthday, mappingSegmentB);
}
@ -343,21 +341,24 @@ public class MapLogic
}
}
public void SaveNotMappedTicks(Property.Models.Configuration propertyConfiguration)
public void SaveNotMappedTicks(Configuration configuration)
{
if (_Configuration is null)
throw new NullReferenceException(nameof(_Configuration));
string directory;
const int zero = 0;
string personKeyFormatted;
SaveContainer saveContainer;
PersonBirthday personBirthday;
List<SaveContainer> saveContainers = new();
const string facePopulatedKey = nameof(_Sorting);
foreach (long personKey in _NotMappedPersonKeys)
foreach (PersonContainer personContainer in _NotMappedPersonContainers)
{
personBirthday = IPersonBirthday.GetPersonBirthday(personKey);
if (personContainer.PersonKey is null || personContainer.PersonBirthdays is null || !personContainer.PersonBirthdays.Any())
continue;
personBirthday = personContainer.PersonBirthdays[zero];
personKeyFormatted = IPersonBirthday.GetFormatted(_Configuration.PersonBirthdayFormat, personBirthday);
directory = Path.Combine(_EDistanceContentTicksDirectory, $"{facePopulatedKey}NotMapped", personKeyFormatted, propertyConfiguration.ResultAllInOne);
directory = Path.Combine(_EDistanceContentTicksDirectory, $"{facePopulatedKey}NotMapped", personKeyFormatted, configuration.MappingDefaultName);
saveContainer = new(directory);
saveContainers.Add(saveContainer);
}
@ -403,7 +404,7 @@ public class MapLogic
{
keyValuePairs = _IdThenNormalizedPixelPercentageToPersonContainers[face.Mapping.MappingFromItem.Id];
if (!keyValuePairs.ContainsKey(face.Mapping.MappingFromLocation.NormalizedPixelPercentage))
throw new NotSupportedException();
continue;
personKey = null;
isWrongYearFlag = IItem.GetWrongYearFlag(face.Mapping.MappingFromItem.IsWrongYear);
subDirectoryName = $"{isWrongYearFlag}{face.Mapping.MappingFromItem.MinimumDateTime:yyyy}";
@ -510,16 +511,14 @@ public class MapLogic
return result;
}
internal void ForceSingleImage(Property.Models.Configuration propertyConfiguration, IEnumerable<Face> distinctFilteredFaces)
internal void ForceSingleImage(Configuration configuration, IEnumerable<Face> distinctFilteredFaces)
{
long? personKey;
const int zero = 0;
string mappingSegmentB;
int by = _ForceSingleImage;
int? approximateYears = null;
PersonBirthday personBirthday;
List<int> normalizedPixelPercentages;
string displayDirectoryName = propertyConfiguration.ResultAllInOne;
string displayDirectoryName = configuration.MappingDefaultName;
Face[] orderedDistinctFilteredFaces = (from l in distinctFilteredFaces orderby l.Mapping is not null, l.Mapping?.MappingFromLocation.Confidence descending select l).ToArray();
foreach (Face face in orderedDistinctFilteredFaces)
{
@ -533,10 +532,15 @@ public class MapLogic
if (normalizedPixelPercentages.Contains(face.Mapping.MappingFromLocation.NormalizedPixelPercentage))
continue;
}
personKey = _NotMappedPersonKeys[zero];
personBirthday = IPersonBirthday.GetPersonBirthday(personKey.Value);
mappingSegmentB = GetMappingSegmentB(_Ticks, personBirthday, approximateYears, face.Mapping.MappingFromItem);
face.Mapping.UpdateMappingFromPerson(approximateYears, by, displayDirectoryName, personBirthday, mappingSegmentB);
foreach (PersonContainer personContainer in _NotMappedPersonContainers)
{
if (personContainer.PersonKey is null || personContainer.PersonBirthdays is null || !personContainer.PersonBirthdays.Any())
continue;
personBirthday = personContainer.PersonBirthdays[zero];
mappingSegmentB = GetMappingSegmentB(_Ticks, personBirthday, personContainer.ApproximateYears, face.Mapping.MappingFromItem);
face.Mapping.UpdateMappingFromPerson(personContainer.ApproximateYears, by, personContainer.PersonDisplayDirectoryName, personBirthday, mappingSegmentB);
break;
}
break;
}
}
@ -611,11 +615,11 @@ public class MapLogic
shortcutFile = Path.Combine(personDirectory, $"{face.Mapping.MappingFromLocation.DeterministicHashCodeKey}{face.Mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.lnk");
saveContainer = new(checkFile, directory, faceFileHolder, hiddenFaceFileHolder, string.Empty, facePartsFileHolder, face.Mapping.MappingFromItem.ResizedFileHolder, shortcutFile);
results.Add(saveContainer);
if (!string.IsNullOrEmpty(checkFile) && _Configuration.MappingSaveFaceEncoding)
if (_Configuration.MappingSaveFaceEncoding)
{
checkFile = Path.Combine(directory, $"{face.Mapping.MappingFromLocation.DeterministicHashCodeKey}{face.Mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.json");
checkFile = Path.Combine(personDirectory, $"{face.Mapping.MappingFromLocation.DeterministicHashCodeKey}{face.Mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}.json");
json = JsonSerializer.Serialize(face.FaceEncoding);
saveContainer = new(checkFile, directory, json);
saveContainer = new(checkFile, personDirectory, json);
results.Add(saveContainer);
}
results.Add(saveContainer);
@ -623,19 +627,19 @@ public class MapLogic
return results;
}
public void ForceSingleImageThenSaveMapping(int maxDegreeOfParallelism, Property.Models.Configuration propertyConfiguration, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, List<Face> distinctFilteredFaces, SortingContainer[] sortingContainers, int totalNotMapped)
public void ForceSingleImageThenSaveMapping(Configuration configuration, string dResultsFullGroupDirectory, string d2ResultsFullGroupDirectory, List<Face> distinctFilteredFaces, SortingContainer[] sortingContainers, int totalNotMapped)
{
List<SaveContainer> saveContainers;
if (!sortingContainers.Any())
{
ForceSingleImage(propertyConfiguration, distinctFilteredFaces);
ForceSingleImage(configuration, distinctFilteredFaces);
saveContainers = GetMappingSaveContainers(dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, distinctFilteredFaces);
}
else
{
int updated = UpdateFromSortingContainers(sortingContainers);
if (totalNotMapped - updated > 0)
ForceSingleImage(propertyConfiguration, distinctFilteredFaces);
ForceSingleImage(configuration, distinctFilteredFaces);
saveContainers = GetMappingSaveContainers(dResultsFullGroupDirectory, d2ResultsFullGroupDirectory, distinctFilteredFaces);
}
SaveContainers(saveContainers);