LocationContainer

This commit is contained in:
2022-12-28 23:52:42 -07:00
parent 681b2fdf3c
commit 26edd826d5
14 changed files with 317 additions and 220 deletions

View File

@ -283,7 +283,7 @@ public partial class DlibDotNet
return result;
}
private void FullParallelForWork(A_Property propertyLogic, Dictionary<int, List<(bool, string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> idToMappedFaceFilesWithCollection, string outputResolution, string bResultsFullGroupDirectory, string cResultsFullGroupDirectory, string dResultsDateGroupDirectory, string dResultsFullGroupDirectory, string eDistanceContentDirectory, List<Tuple<string, DateTime>> sourceDirectoryChanges, List<FileHolder?> propertyFileHolderCollection, List<Shared.Models.Property?> propertyCollection, List<List<KeyValuePair<string, string>>> metadataCollections, List<Dictionary<string, int[]>> resizeKeyValuePairs, List<List<Shared.Models.Face>> imageFaceCollections, Container container, int index, Item item, DateTime[] containerDateTimes)
private void FullParallelForWork(A_Property propertyLogic, Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToMappedFaceFilesWithCollection, string outputResolution, string bResultsFullGroupDirectory, string cResultsFullGroupDirectory, string dResultsDateGroupDirectory, string dResultsFullGroupDirectory, string eDistanceContentDirectory, List<Tuple<string, DateTime>> sourceDirectoryChanges, List<FileHolder?> propertyFileHolderCollection, List<Shared.Models.Property?> propertyCollection, List<List<KeyValuePair<string, string>>> metadataCollections, List<Dictionary<string, int[]>> resizeKeyValuePairs, List<List<Shared.Models.Face>> imageFaceCollections, Container container, int index, Item item, DateTime[] containerDateTimes)
{
if (_Log is null)
throw new NullReferenceException(nameof(_Log));
@ -369,10 +369,14 @@ public partial class DlibDotNet
int outputResolutionHeight = outputResolutionCollection[1];
int outputResolutionOrientation = outputResolutionCollection[2];
List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection;
List<(bool, string, int, IReadOnlyList<MetadataExtractor.Directory>?)>? collection;
List<LocationContainer<MetadataExtractor.Directory>>? collection;
if (item.Property?.Id is null)
collection = null;
else
_ = idToMappedFaceFilesWithCollection.TryGetValue(item.Property.Id.Value, out collection);
if (!_FileNameToCollection.TryGetValue(mappingFromItem.RelativePath[1..], out mappingFromPhotoPrismCollection))
mappingFromPhotoPrismCollection = null;
faces = _Faces.GetFaces(dResultsFullGroupDirectory, subFileTuples, parseExceptions, property, mappingFromItem, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, mappingFromPhotoPrismCollection);
faces = _Faces.GetFaces(dResultsFullGroupDirectory, subFileTuples, parseExceptions, property, mappingFromItem, outputResolutionWidth, outputResolutionHeight, outputResolutionOrientation, collection, mappingFromPhotoPrismCollection);
if (_AppSettings.MaxDegreeOfParallelism < 2)
ticks = LogDelta(ticks, nameof(D_Face.GetFaces));
bool anyFacesSaved = _Faces.SaveFaces(dResultsFullGroupDirectory, subFileTuples, parseExceptions, mappingFromItem, facesDirectory, faces);
@ -380,8 +384,7 @@ public partial class DlibDotNet
ticks = LogDelta(ticks, nameof(D_Face.SaveFaces));
if ((_Configuration.DistanceMoveUnableToMatch || _Configuration.DistanceRenameToMatch)
&& _Configuration.LoadOrCreateThenSaveDistanceResultsForOutputResolutions.Contains(outputResolution)
&& !anyFacesSaved && item.Property?.Id is not null
&& idToMappedFaceFilesWithCollection.TryGetValue(item.Property.Id.Value, out collection))
&& !anyFacesSaved && collection is not null)
_Distance.LookForMatchFacesAndPossiblyRename(_Faces.FileNameExtension, eDistanceContentDirectory, mappingFromItem, faces, collection);
if (_Configuration.SaveFaceLandmarkForOutputResolutions.Contains(outputResolution))
{
@ -405,7 +408,7 @@ public partial class DlibDotNet
private int FullParallelWork(int maxDegreeOfParallelism,
A_Property propertyLogic,
Dictionary<int, List<(bool, string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> idToMappedFaceFilesWithCollection,
Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToMappedFaceFilesWithCollection,
string outputResolution,
string bResultsFullGroupDirectory,
string cResultsFullGroupDirectory,
@ -658,7 +661,7 @@ public partial class DlibDotNet
int maxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism;
List<Shared.Models.Property?> nullablePropertyCollection = new();
List<List<KeyValuePair<string, string>>> metadataCollection = new();
Dictionary<int, List<(bool, string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> idToMappedFaceFilesWithCollection = GetDictionary(ticks, a2PeopleContentDirectory, eDistanceContentDirectory);
Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> idToMappedFaceFilesWithCollection = GetDictionary(ticks, a2PeopleContentDirectory, eDistanceContentDirectory);
string dResultsDateGroupDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(D_Face));
foreach (string outputResolution in _Configuration.OutputResolutions)
{
@ -874,7 +877,7 @@ public partial class DlibDotNet
List<Item> filteredItems = GetItems(argZero, containers);
mapLogic.SaveShortcutsForOutputResolutions(filteredItems, mappingCollection, personKeyToCount);
}
if (_Configuration.PersonCharactersToCopyTo.Length == 1)
if (_Configuration.PersonCharactersToCopyTo.Length == 1 && _Configuration.PersonCharacters.ToArray().Contains(_Configuration.PersonCharactersToCopyTo[0]))
mapLogic.CopyAtLeastOneMappedFiles(_Configuration.PersonCharactersToCopyTo[0], dFacesContentDirectory, a2PeopleSingletonDirectory, mappingCollection);
Dictionary<int, Dictionary<int, Mapping>> idToNormalizedRectangleToMapping = MapLogicSupport.GetIdToNormalizedRectangleToFace(mappingCollection);
mapLogic.CopyManualFiles(dFacesContentDirectory, idToNormalizedRectangleToMapping);
@ -1008,11 +1011,11 @@ public partial class DlibDotNet
return results;
}
private void ParallelFor(string eDistanceContentDirectory, List<(bool, string, int, int, IReadOnlyList<MetadataExtractor.Directory>?)> collection, string file)
private void ParallelFor(string eDistanceContentDirectory, List<(bool, string, int, int, IReadOnlyList<MetadataExtractor.Directory>)> collection, string file)
{
const string lnk = ".lnk";
int? id, normalizedRectangle;
IReadOnlyList<MetadataExtractor.Directory>? directories;
IReadOnlyList<MetadataExtractor.Directory> directories;
bool fromDistanceContent = !file.EndsWith(lnk) && file.Contains(eDistanceContentDirectory);
if (!file.EndsWith(lnk))
(id, normalizedRectangle) = Shared.Models.Stateless.Methods.IMapping.GetConverted(_MapConfiguration.FacesFileNameExtension, file);
@ -1021,52 +1024,58 @@ public partial class DlibDotNet
if (id is null || normalizedRectangle is null)
return;
if (file.EndsWith(lnk) || (!_Configuration.DistanceMoveUnableToMatch && !_Configuration.DistanceRenameToMatch))
directories = null;
directories = new List<MetadataExtractor.Directory>();
else
directories = MetadataExtractor.ImageMetadataReader.ReadMetadata(file);
lock (collection)
collection.Add(new(fromDistanceContent, file, id.Value, normalizedRectangle.Value, directories));
}
private List<(bool, string, int, int, IReadOnlyList<MetadataExtractor.Directory>?)> GetCollection(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory)
private List<(bool, string, int, int, IReadOnlyList<MetadataExtractor.Directory>)> GetCollection(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory)
{
string file;
List<string> files = new();
List<(bool, string, int, int, IReadOnlyList<MetadataExtractor.Directory>?)> results = new();
List<(bool, string, int, int, IReadOnlyList<MetadataExtractor.Directory>)> results = new();
files.AddRange(Map.Models.Stateless.Methods.IMapLogic.GetDisplayDirectoryAllFiles(_PersonContainers));
files.AddRange(Map.Models.Stateless.Methods.IMapLogic.DeleteEmptyDirectoriesAndGetMappedFaceFiles(_MapConfiguration, _PersonContainers, ticks, a2PeopleContentDirectory, eDistanceContentDirectory));
// foreach (string file in files)
// {
// if (!file.EndsWith(".dup"))
// continue;
// if (!File.Exists(file))
// continue;
// File.Move(file, file[..^4]);
// }
if (files.Any() && (_Configuration.DistanceMoveUnableToMatch || _Configuration.DistanceRenameToMatch))
for (int i = 0; i < files.Count; i++)
{
file = files[i];
if (!file.EndsWith(".dup") && !file.EndsWith(".unk"))
continue;
if (!File.Exists(file))
continue;
File.Move(file, file[..^4]);
files[i] = file[..^4];
}
string[] distictFiles = files.Distinct().ToArray();
if (distictFiles.Any() && (_Configuration.DistanceMoveUnableToMatch || _Configuration.DistanceRenameToMatch))
{
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
string message = $") Building Mapped Face Files Collection - {totalSeconds} total second(s)";
ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = _AppSettings.MaxDegreeOfParallelism };
ProgressBarOptions options = new() { ProgressCharacter = '─', ProgressBarOnBottom = true, DisableBottomPercentage = true };
using ProgressBar progressBar = new(files.Count, message, options);
_ = Parallel.For(0, files.Count, parallelOptions, (i, state) =>
using ProgressBar progressBar = new(distictFiles.Length, message, options);
_ = Parallel.For(0, distictFiles.Length, parallelOptions, (i, state) =>
{
progressBar.Tick();
ParallelFor(eDistanceContentDirectory, results, files[i]);
ParallelFor(eDistanceContentDirectory, results, distictFiles[i]);
});
}
return results;
}
private Dictionary<int, List<(bool, string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> GetDictionary(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory)
private Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> GetDictionary(long ticks, string? a2PeopleContentDirectory, string eDistanceContentDirectory)
{
Dictionary<int, List<(bool, string, int, IReadOnlyList<MetadataExtractor.Directory>?)>> results = new();
List<(bool, string, int, int, IReadOnlyList<MetadataExtractor.Directory>?)> collection = GetCollection(ticks, a2PeopleContentDirectory, eDistanceContentDirectory);
foreach ((bool fromDistanceContent, string file, int id, int normalizedRectangle, IReadOnlyList<MetadataExtractor.Directory>? directories) in collection)
Dictionary<int, List<LocationContainer<MetadataExtractor.Directory>>> results = new();
LocationContainer<MetadataExtractor.Directory> noob;
List<(bool, string, int, int, IReadOnlyList<MetadataExtractor.Directory>)> collection = GetCollection(ticks, a2PeopleContentDirectory, eDistanceContentDirectory);
foreach ((bool fromDistanceContent, string file, int id, int normalizedRectangle, IReadOnlyList<MetadataExtractor.Directory> directories) in collection)
{
if (!results.ContainsKey(id))
results.Add(id, new());
results[id].Add(new(fromDistanceContent, file, normalizedRectangle, directories));
noob = new LocationContainer<MetadataExtractor.Directory>(fromDistanceContent, file, normalizedRectangle, directories, null, null);
results[id].Add(noob);
}
return results;
}