Removed both

faceDistanceLength.Length.Value / distanceTolerance
and
confidence / rangeFaceConfidence[1]
Removed ReviewLocationContainerDistanceTolerance
Added MoveToDecade
IFaceDistance.MappingFromFilterPost
ISorting.CanReMap
This commit is contained in:
Mike Phares 2023-09-04 23:25:31 -07:00
parent 600f6e7e2b
commit b2e2a66101
23 changed files with 275 additions and 239 deletions

View File

@ -26,7 +26,6 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
private readonly Serilog.ILogger? _Log;
private readonly int _FaceConfidencePercent;
private readonly bool _DistanceRenameToMatch;
private readonly float[] _RangeFaceConfidence;
private readonly bool _DistanceMoveUnableToMatch;
private readonly float _RectangleIntersectMinimum;
private readonly List<string> _AllMappedFaceFiles;
@ -34,7 +33,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
private readonly double _RangeDistanceToleranceAverage;
private readonly List<string> _DuplicateMappedFaceFiles;
public E_Distance(bool distanceMoveUnableToMatch, bool distanceRenameToMatch, int faceConfidencePercent, float[] rangeDistanceTolerance, float[] rangeFaceConfidence, float[] rectangleIntersectMinimums)
public E_Distance(bool distanceMoveUnableToMatch, bool distanceRenameToMatch, int faceConfidencePercent, float[] rangeDistanceTolerance, float[] rectangleIntersectMinimums)
{
_Debug = new();
_Moved = new();
@ -42,7 +41,6 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
_AllMappedFaceFiles = new();
_AllMappedFaceFileNames = new();
_DuplicateMappedFaceFiles = new();
_RangeFaceConfidence = rangeFaceConfidence;
_Log = Serilog.Log.ForContext<E_Distance>();
_DistanceRenameToMatch = distanceRenameToMatch;
_FaceConfidencePercent = faceConfidencePercent;
@ -70,14 +68,16 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
{
if (face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
throw new NotSupportedException();
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_FaceConfidencePercent, _RangeFaceConfidence, face.Location.Confidence);
if (face.Mapping?.MappingFromFilterPost is null)
throw new NotSupportedException();
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_FaceConfidencePercent, face.Location.Confidence);
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)
faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping?.MappingFromFilterPost, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
else
{
faceEncoding = FaceRecognition.LoadFaceEncoding(face.FaceEncoding.RawEncoding);
faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
faceDistance = new(confidencePercent, mappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping?.MappingFromFilterPost, mappingFromItem.Id, mappingFromItem.IsWrongYear, wholePercentages);
lock (intersectFaces)
face.SetFaceDistance(faceDistance);
}
@ -336,7 +336,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
File.WriteAllLines(eDistanceContentFileName, results);
}
public static void SetFaceDistances(int maxDegreeOfParallelism, long ticks, ReadOnlyCollection<Face> distinctFilteredFaces)
public static void PreFilterSetFaceDistances(int maxDegreeOfParallelism, long ticks, ReadOnlyCollection<Face> distinctFilteredFaces)
{
List<Face> faces = new();
foreach (Face face in distinctFilteredFaces)
@ -362,7 +362,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
throw new NotSupportedException();
progressBar.Tick();
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.WholePercentages);
FaceDistance faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping.MappingFromFilterPost, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages);
lock (face)
face.SetFaceDistance(faceDistance);
});
@ -419,7 +419,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
throw new NotSupportedException();
if (face.FaceDistance?.Encoding is not FaceRecognitionDotNet.FaceEncoding faceEncoding)
continue;
faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages);
faceDistance = new(face.Mapping.MappingFromLocation.ConfidencePercent, face.Mapping.MappingFromItem.GetDateTimeOriginalThenMinimumDateTime(), faceEncoding, face.Mapping.MappingFromFilterPost, face.Mapping.MappingFromItem.Id, face.Mapping.MappingFromItem.IsWrongYear, face.Mapping.MappingFromLocation.WholePercentages);
faceDistanceContainer = new(face, faceDistance);
collection.Add(faceDistanceContainer);
}
@ -489,90 +489,6 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
return results;
}
private static void ReviewLocationContainerDistanceTolerance(float locationContainerDistanceTolerance, DateTime dateTime, DateTime yesterday, List<Record> records)
{
FileInfo fileInfo;
List<string> files = new();
FaceDistance? faceDistanceEncoding;
List<FaceDistance> faceDistanceLengths;
List<string> firstPassFailures = new();
List<FaceDistance> faceDistanceEncodings = new();
faceDistanceEncoding = new(records[0].FaceRecognitionDotNetFaceEncoding);
foreach (Record record in records)
{
files.Add(record.File);
faceDistanceEncodings.Add(new(record.FaceRecognitionDotNetFaceEncoding));
}
if (faceDistanceEncoding is null)
throw new NullReferenceException(nameof(faceDistanceEncoding));
faceDistanceLengths = FaceRecognition.FaceDistances(new(faceDistanceEncodings), faceDistanceEncoding);
if (faceDistanceLengths.Count != files.Count)
throw new Exception();
for (int i = 0; i < files.Count; i++)
{
if (faceDistanceLengths[i].Length < locationContainerDistanceTolerance)
continue;
firstPassFailures.Add(files[i]);
}
faceDistanceEncoding = new(records[^1].FaceRecognitionDotNetFaceEncoding);
foreach (Record record in records)
{
files.Add(record.File);
faceDistanceEncodings.Add(new(record.FaceRecognitionDotNetFaceEncoding));
}
if (faceDistanceEncoding is null)
throw new NullReferenceException(nameof(faceDistanceEncoding));
faceDistanceLengths = FaceRecognition.FaceDistances(new(faceDistanceEncodings), faceDistanceEncoding);
if (faceDistanceLengths.Count != files.Count)
throw new Exception();
for (int i = 0; i < files.Count; i++)
{
fileInfo = new(files[i]);
if (!fileInfo.Exists)
continue;
if (fileInfo.CreationTime > yesterday)
File.SetCreationTime(fileInfo.FullName, yesterday);
if (faceDistanceLengths[i].Length < locationContainerDistanceTolerance)
continue;
if (firstPassFailures.Contains(fileInfo.FullName))
continue;
File.SetCreationTime(fileInfo.FullName, dateTime);
}
}
void IDistance<MetadataExtractor.Directory>.ReviewLocationContainerDistanceTolerance(float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers)
{
string? json;
List<Record> records = new();
int? lastDirectoryNumber = null;
DateTime dateTime = DateTime.Now;
DateTime yesterday = DateTime.Now.AddDays(-1);
Shared.Models.FaceEncoding? modelsFaceEncoding;
FaceRecognitionDotNet.FaceEncoding faceRecognitionDotNetFaceEncoding;
foreach (LocationContainer<MetadataExtractor.Directory> locationContainer in locationContainers)
{
if (locationContainer.DirectoryNumber is null)
continue;
if (lastDirectoryNumber is not null && locationContainer.DirectoryNumber.Value != lastDirectoryNumber.Value)
{
if (records.Count > 2)
ReviewLocationContainerDistanceTolerance(locationContainerDistanceTolerance, dateTime, yesterday, records);
records.Clear();
}
json = Metadata.Models.Stateless.Methods.IMetadata.GetFaceEncoding(locationContainer.Directories);
if (json is null)
continue;
modelsFaceEncoding = JsonSerializer.Deserialize<Shared.Models.FaceEncoding>(json);
if (modelsFaceEncoding is null)
throw new NotSupportedException();
faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding);
records.Add(new(locationContainer.File, faceRecognitionDotNetFaceEncoding));
lastDirectoryNumber = locationContainer.DirectoryNumber.Value;
}
if (records.Count > 2)
ReviewLocationContainerDistanceTolerance(locationContainerDistanceTolerance, dateTime, yesterday, records);
}
private static void WriteVsCodeFiles(string eDistanceContentDirectory, string? displayDirectoryName, string directory)
{
string json;
@ -622,14 +538,17 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
}
}
private static void SaveMappedForOutputResolutions(string eDistanceContentDirectory, float distanceTolerance, string personKeyFormatted, string? displayDirectoryName, List<Record> records, string directory)
private static void SaveMappedForOutputResolutions(string eDistanceContentDirectory, float distanceTolerance, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName, List<Record> records, string directory)
{
int years;
string text;
string fileName;
FileInfo fileInfo;
List<string> files = new();
List<string> lines = new();
List<Mapped> results = new();
List<string> linkedOnce = new();
long ticks = DateTime.Now.Ticks;
string fileNameWithoutExtension;
List<string> linkedTwice = new();
List<string> linkedThrice = new();
@ -639,7 +558,6 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
Uri uri = new(eDistanceContentDirectory);
Dictionary<string, int> keyValuePairs = new();
List<FaceDistance> faceDistanceEncodings = new();
List<Mapped> results = new();
foreach (Record record in records)
{
files.Add(record.File);
@ -689,6 +607,10 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
continue;
}
}
if (isCounterPersonYear)
(years, _) = Shared.Models.Stateless.Methods.IAge.GetAge(ticks, fileInfo.CreationTime.Ticks);
else
(years, _) = Shared.Models.Stateless.Methods.IAge.GetAge(fileInfo.CreationTime.Ticks, personKey);
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(fileInfo.Name));
lines.Add("---");
lines.Add("type: \"distance\"");
@ -701,6 +623,10 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
lines.Add(string.Empty);
lines.Add($"![0]({uri.MakeRelativeUri(new(record.File)).OriginalString})");
lines.Add($"__{fileNameWithoutExtension}__");
if (isCounterPersonYear)
lines.Add($"#{years}yrs-ago");
else
lines.Add($"#{years}yrs-old");
lines.Add(string.Empty);
lines.AddRange(results.Select(l => $"{l.Image}{Environment.NewLine}{l.Link}{Environment.NewLine}"));
text = string.Join(Environment.NewLine, lines);
@ -710,7 +636,7 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
MoveFiles(keyValuePairs, linkedOnce, linkedTwice, linkedThrice);
}
void IDistance<MetadataExtractor.Directory>.SaveMappedForOutputResolutions(string a2PeopleContentDirectory, string eDistanceContentDirectory, float[] rangeDistanceTolerance, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers, string personKeyFormatted, string? displayDirectoryName)
void IDistance<MetadataExtractor.Directory>.SaveMappedForOutputResolutions(string a2PeopleContentDirectory, string eDistanceContentDirectory, float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName)
{
string? json;
List<Record> records = new();
@ -727,13 +653,13 @@ public partial class E_Distance : IDistance<MetadataExtractor.Directory>
faceRecognitionDotNetFaceEncoding = FaceRecognition.LoadFaceEncoding(modelsFaceEncoding.RawEncoding);
records.Add(new(locationContainer.File, faceRecognitionDotNetFaceEncoding));
}
string directory = Path.Combine(a2PeopleContentDirectory, rangeDistanceTolerance[1].ToString(), personKeyFormatted);
string directory = Path.Combine(a2PeopleContentDirectory, locationContainerDistanceTolerance.ToString(), personKeyFormatted);
if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory);
if (records.Count > 0)
{
WriteVsCodeFiles(eDistanceContentDirectory, displayDirectoryName, directory);
SaveMappedForOutputResolutions(eDistanceContentDirectory, rangeDistanceTolerance[1], personKeyFormatted, displayDirectoryName, records, directory);
SaveMappedForOutputResolutions(eDistanceContentDirectory, locationContainerDistanceTolerance, personKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName, records, directory);
}
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(directory);
}

View File

@ -344,7 +344,7 @@ public class D2_FaceParts
if (File.Exists(checkFile))
File.Delete(checkFile);
}
else if (face.Mapping?.MappingFromFilter.InSkipCollection is not null && face.Mapping.MappingFromFilter.InSkipCollection.Value)
else if (face.Mapping?.MappingFromFilterPre.InSkipCollection is not null && face.Mapping.MappingFromFilterPre.InSkipCollection.Value)
{
if (File.Exists(checkFile))
File.Delete(checkFile);

View File

@ -39,7 +39,7 @@ public partial class DlibDotNet
private readonly Models.Configuration _Configuration;
private readonly bool _ArgZeroIsConfigurationRootDirectory;
private readonly Map.Models.Configuration _MapConfiguration;
private readonly List<(string, long)> _JLinkResolvedDirectories;
private readonly List<(string Directory, long PersonKey)> _JLinkResolvedDirectories;
public DlibDotNet(
List<string> args,
@ -107,7 +107,7 @@ public partial class DlibDotNet
_FaceParts = new D2_FaceParts(_Configuration.PropertyConfiguration, imageCodecInfo, encoderParameters, filenameExtension, configuration.CheckDFaceAndUpWriteDates, configuration.OverrideForFaceLandmarkImages);
}
_MapConfiguration = Get(configuration, _Faces.FileNameExtension, _Faces.HiddenFileNameExtension, _FaceParts.FileNameExtension);
_Distance = new(configuration.DistanceMoveUnableToMatch, configuration.DistanceRenameToMatch, configuration.FaceConfidencePercent, configuration.RangeDistanceTolerance, configuration.RangeFaceConfidence, configuration.RectangleIntersectMinimums);
_Distance = new(configuration.DistanceMoveUnableToMatch, configuration.DistanceRenameToMatch, configuration.FaceConfidencePercent, configuration.RangeDistanceTolerance, configuration.RectangleIntersectMinimums);
if (_PropertyRootExistedBefore || !_ArgZeroIsConfigurationRootDirectory)
personContainers = new(new List<PersonContainer>());
else
@ -256,7 +256,7 @@ public partial class DlibDotNet
a2PeopleContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People), "([])");
eDistanceContentDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(E_Distance), _Configuration.PropertyConfiguration.ResultContent);
string a2PeopleSingletonDirectory = Property.Models.Stateless.IResult.GetResultsDateGroupDirectory(_Configuration.PropertyConfiguration, nameof(A2_People), _Configuration.PropertyConfiguration.ResultSingleton);
_ = Directory.CreateDirectory(Path.Combine(eDistanceContentDirectory, $"({ticks})"));
_ = Directory.CreateDirectory(Path.Combine(eDistanceContentDirectory, $"{ticks}"));
if (runToDoCollectionFirst)
mapLogic = null;
else
@ -338,7 +338,7 @@ public partial class DlibDotNet
}
_Distance.Clear();
ReadOnlyCollection<Shared.Models.Face> distinctFilteredFaces = Map.Models.Stateless.Methods.IMapLogic.GetFaces(distinctFilteredItems);
ReadOnlyCollection<Mapping> distinctFilteredMappingCollection = GetMappings(_Configuration.PropertyConfiguration, containers, mapLogic, distinctItems: true);
ReadOnlyCollection<Mapping> distinctFilteredMappingCollection = SetCreationTimeAndGetMappings(_Configuration.PropertyConfiguration, eDistanceContentDirectory, containers, mapLogic, distinctItems: true);
if (runToDoCollectionFirst)
{
string json = JsonSerializer.Serialize(distinctFilteredMappingCollection);
@ -556,7 +556,7 @@ public partial class DlibDotNet
}
}
private ReadOnlyCollection<Mapping> GetMappings(Property.Models.Configuration propertyConfiguration, Container[] containers, MapLogic mapLogic, bool distinctItems)
private ReadOnlyCollection<Mapping> SetCreationTimeAndGetMappings(Property.Models.Configuration propertyConfiguration, string eDistanceContentDirectory, Container[] containers, MapLogic mapLogic, bool distinctItems)
{
ReadOnlyCollection<Mapping> results;
int count = 0;
@ -602,7 +602,8 @@ public partial class DlibDotNet
mappingCollection.Add(face.Mapping);
if (face.Mapping.MappingFromPerson is null || face.Mapping.MappingFromPerson.LocationContainersFiles.Count == 0)
continue;
if (_Configuration.LocationContainerDistanceTolerance is null)
Map.Models.Stateless.Methods.IMapLogic.SetCreationTime(face.Mapping.MappingFromItem, face.Mapping.MappingFromPerson);
if (_Configuration.MoveToDecade && _Configuration.LocationContainerDistanceTolerance is null)
Map.Models.Stateless.Methods.IMapLogic.MoveToDecade(propertyConfiguration, face.Mapping.MappingFromItem, face.Mapping.MappingFromPerson);
}
if (!anyValidFaces)
@ -612,6 +613,8 @@ public partial class DlibDotNet
}
}
}
if (_Configuration.MoveToDecade && _Configuration.LocationContainerDistanceTolerance is null)
_ = Shared.Models.Stateless.Methods.IPath.DeleteEmptyDirectories(eDistanceContentDirectory);
results = new((from l in mappingCollection orderby l.MappingFromItem.Id select l).ToArray());
return results;
}
@ -779,6 +782,7 @@ public partial class DlibDotNet
double? α;
int? eyeα;
bool? isUsed;
bool? canReMap;
bool? eyeReview;
Mapping mapping;
int notMapped = 0;
@ -790,8 +794,11 @@ public partial class DlibDotNet
string deterministicHashCodeKey;
MappingFromFilter mappingFromFilter;
MappingFromLocation? mappingFromLocation;
MappingFromFilterPre mappingFromFilterPre;
MappingFromFilterPost mappingFromFilterPost;
bool? isFocusModel = GetIsFocusModel(item.Property);
bool ignoreXMatches = _JLinkResolvedDirectories.Count > 0;
long[] jLinkResolvedPersonKeys = _JLinkResolvedDirectories.Select(l => l.PersonKey).ToArray();
ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers;
ReadOnlyCollection<string> locationContainersFiles = new((from l in locationContainers select l.File).ToArray());
foreach (Shared.Models.Face face in faces)
@ -799,10 +806,13 @@ public partial class DlibDotNet
wholePercentagesToPersonContainers = mapLogic.GetWholePercentagesToPersonContainers(item.Property?.Id);
if (item.Property?.Id is null || face.FaceEncoding is null || face.Location is null || face.OutputResolution is null)
{
canReMap = null;
isUsed = null;
isFocusPerson = null;
inSkipCollection = null;
mappingFromLocation = null;
mappingFromFilterPost = new(canReMap, inSkipCollection, isFocusPerson);
mappingFromFilterPre = new(inSkipCollection, isFocusModel, isFocusRelativePath);
mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, inSkipCollection, isUsed);
}
else
@ -814,17 +824,21 @@ public partial class DlibDotNet
(eyeReview, α) = Shared.Models.Stateless.Methods.IFace.GetEyeα(face.FaceParts);
eyeα = α is null ? null : (int)Math.Round(Math.Abs(α.Value));
}
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_Configuration.FaceConfidencePercent, _Configuration.RangeFaceConfidence, face.Location.Confidence);
confidencePercent = Shared.Models.Stateless.Methods.ILocation.GetConfidencePercent(_Configuration.FaceConfidencePercent, face.Location.Confidence);
faceAreaPermyriad = IMapping.GetAreaPermyriad(_Configuration.FaceAreaPermyriad, face.Location, face.OutputResolution);
wholePercentRectangle = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
deterministicHashCodeKey = IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, face.Location, Shared.Models.Stateless.ILocation.Digits, face.OutputResolution);
mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, eyeα, eyeReview, wholePercentRectangle);
isUsed = mapLogic.IsUsed(ignoreXMatches, item.Property.Id.Value, wholePercentagesToPersonContainers, mappingFromLocation);
inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation);
isFocusPerson = mapLogic.IsFocusPerson(_Configuration.SkipPersonWithMoreThen, _JLinkResolvedDirectories, wholePercentagesToPersonContainers, mappingFromLocation);
mappingFromFilterPre = new(inSkipCollection, isFocusModel, isFocusRelativePath);
canReMap = Map.Models.Stateless.Methods.IMapLogic.CanReMap(jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation);
isUsed = mapLogic.IsUsed(ignoreXMatches, item.Property.Id.Value, wholePercentagesToPersonContainers, mappingFromLocation);
isFocusPerson = mapLogic.IsFocusPersonOld(_Configuration.SkipPersonWithMoreThen, _JLinkResolvedDirectories, wholePercentagesToPersonContainers, mappingFromLocation);
mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, inSkipCollection, isUsed);
isFocusPerson = mapLogic.IsFocusPerson(_Configuration.SkipPersonWithMoreThen, jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation);
mappingFromFilterPost = new(canReMap, inSkipCollection, isFocusPerson);
}
mapping = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection);
mapping = new(mappingFromFilter, mappingFromFilterPost, mappingFromFilterPre, mappingFromItem, mappingFromLocation, mappingFromPhotoPrismCollection);
notMapped += mapLogic.UpdateMappingFromPerson(locationContainersFiles, wholePercentagesToPersonContainers, mapping);
face.SetMapping(mapping);
}
@ -848,7 +862,6 @@ public partial class DlibDotNet
configuration.PersonCharacters.ToArray(),
configuration.RangeDaysDeltaTolerance,
configuration.RangeDistanceTolerance,
configuration.SaveMappedRelations,
configuration.SaveSortingWithoutPerson,
configuration.SkipNotSkipDirectories,
configuration.SortingMaximumPerKey,
@ -863,6 +876,7 @@ public partial class DlibDotNet
{
Mapping result;
bool? isUsed;
bool? canReMap;
int? eyeα = null;
bool? isFocusPerson;
bool? eyeReview = null;
@ -873,15 +887,21 @@ public partial class DlibDotNet
string deterministicHashCodeKey;
MappingFromFilter mappingFromFilter;
MappingFromLocation? mappingFromLocation;
MappingFromFilterPre mappingFromFilterPre;
MappingFromFilterPost mappingFromFilterPost;
bool? isFocusModel = GetIsFocusModel(item.Property);
bool ignoreXMatches = _JLinkResolvedDirectories.Count > 0;
long[] jLinkResolvedPersonKeys = _JLinkResolvedDirectories.Select(l => l.PersonKey).ToArray();
ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers = mapLogic.GetWholePercentagesToPersonContainers(item.Property?.Id);
if (item.Property?.Id is null)
{
isUsed = null;
canReMap = null;
isFocusPerson = null;
inSkipCollection = null;
mappingFromLocation = null;
mappingFromFilterPost = new(canReMap, inSkipCollection, isFocusPerson);
mappingFromFilterPre = new(inSkipCollection, isFocusModel, isFocusRelativePath);
mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, inSkipCollection, isUsed);
}
else
@ -889,12 +909,16 @@ public partial class DlibDotNet
wholePercentRectangle = Shared.Models.Stateless.Methods.ILocation.GetWholePercentages(Shared.Models.Stateless.ILocation.Digits);
deterministicHashCodeKey = IMapping.GetDeterministicHashCodeKey(item.Property.Id.Value, Shared.Models.Stateless.ILocation.Digits);
mappingFromLocation = new(faceAreaPermyriad, confidencePercent, deterministicHashCodeKey, eyeα, eyeReview, wholePercentRectangle);
isUsed = mapLogic.IsUsed(ignoreXMatches, item.Property.Id.Value, wholePercentagesToPersonContainers, mappingFromLocation);
inSkipCollection = mapLogic.InSkipCollection(item.Property.Id.Value, mappingFromLocation);
isFocusPerson = mapLogic.IsFocusPerson(_Configuration.SkipPersonWithMoreThen, _JLinkResolvedDirectories, wholePercentagesToPersonContainers, mappingFromLocation);
mappingFromFilterPre = new(inSkipCollection, isFocusModel, isFocusRelativePath);
canReMap = Map.Models.Stateless.Methods.IMapLogic.CanReMap(jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation);
isUsed = mapLogic.IsUsed(ignoreXMatches, item.Property.Id.Value, wholePercentagesToPersonContainers, mappingFromLocation);
isFocusPerson = mapLogic.IsFocusPersonOld(_Configuration.SkipPersonWithMoreThen, _JLinkResolvedDirectories, wholePercentagesToPersonContainers, mappingFromLocation);
mappingFromFilter = new(isFocusModel, isFocusPerson, isFocusRelativePath, inSkipCollection, isUsed);
isFocusPerson = mapLogic.IsFocusPerson(_Configuration.SkipPersonWithMoreThen, jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation);
mappingFromFilterPost = new(canReMap, inSkipCollection, isFocusPerson);
}
result = new(mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection: null);
result = new(mappingFromFilter, mappingFromFilterPost, mappingFromFilterPre, mappingFromItem, mappingFromLocation, mappingFromPhotoPrismCollection: null);
int notMapped = mapLogic.UpdateMappingFromPerson(locationContainersFiles, wholePercentagesToPersonContainers, result);
return (result, notMapped);
}
@ -1144,8 +1168,8 @@ public partial class DlibDotNet
{
if (_Log is null)
throw new NullReferenceException(nameof(_Log));
DistanceLimits distanceLimits;
int? useFiltersCounter = null;
DistanceLimits distanceLimits;
SortingContainer[] sortingContainers;
FaceDistanceContainer[] filteredFaceDistanceContainers;
long? skipOlderThan = _Configuration.SkipOlderThanDays is null ? null : new DateTime(ticks).AddDays(-_Configuration.SkipOlderThanDays.Value).Ticks;
@ -1175,7 +1199,7 @@ public partial class DlibDotNet
E_Distance.SaveFaceDistances(_Configuration.PropertyConfiguration, sortingContainers);
if (filteredFaceDistanceContainers.Length > 0)
{
int updated = mapLogic.UpdateFromSortingContainers(_Configuration.SaveIndividually, idToWholePercentagesToMapping, distanceLimits, sortingContainers);
int updated = sortingContainers.Length == 0 ? 0 : mapLogic.UpdateFromSortingContainers(_Configuration.SaveIndividually, idToWholePercentagesToMapping, distanceLimits, sortingContainers);
List<SaveContainer> saveContainers = mapLogic.GetSaveContainers(_Configuration.SaveIndividually, dFacesContentDirectory, d2FacePartsContentDirectory, d2FacePartsContentCollectionDirectory, mappingCollection, idToWholePercentagesToMapping, useFiltersCounter, sortingContainers.Length > 0);
mapLogic.SaveContainers(_Configuration.SaveIndividually, updated, saveContainers);
}
@ -1184,7 +1208,7 @@ public partial class DlibDotNet
private void SaveFaceDistances(long ticks, MapLogic mapLogic, ReadOnlyCollection<Shared.Models.Face> distinctFilteredFaces, ReadOnlyCollection<Mapping> mappingCollection, string dFacesContentDirectory, string d2FacePartsContentDirectory, string d2FacePartsContentCollectionDirectory, ReadOnlyDictionary<int, ReadOnlyDictionary<int, Mapping>> idToWholePercentagesToMapping)
{
E_Distance.SetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces);
E_Distance.PreFilterSetFaceDistances(_AppSettings.MaxDegreeOfParallelism, ticks, distinctFilteredFaces);
ReadOnlyCollection<FaceDistanceContainer> faceDistanceContainers = E_Distance.GetFaceDistanceContainers(distinctFilteredFaces);
if (faceDistanceContainers.Count > 0)
{

View File

@ -42,8 +42,7 @@ public class Configuration
public string[]? MixedYearRelativePaths { get; set; }
public string? ModelDirectory { get; set; }
public string? ModelName { get; set; }
public int? NumberOfJitters { get; set; }
public int? NumberOfTimesToUpsample { get; set; }
public bool? MoveToDecade { get; set; }
public string? OutputExtension { get; set; }
public int? OutputQuality { get; set; }
public string[]? OutputResolutions { get; set; }
@ -75,8 +74,6 @@ public class Configuration
public bool? SaveFullYearOfRandomFiles { get; set; }
public bool? SaveIndividually { get; set; }
public string[]? SaveMappedForOutputResolutions { get; set; }
public bool? SaveMappedRelations { get; set; }
public string[]? SaveMappedRelationsForOutputResolutions { get; set; }
public string[]? SavePropertyShortcutsForOutputResolutions { get; set; }
public string[]? SaveRandomForOutputResolutions { get; set; }
public bool? SaveResizedSubfiles { get; set; }
@ -142,6 +139,7 @@ public class Configuration
// if (configuration?.MixedYearRelativePaths is null) throw new NullReferenceException(nameof(configuration.MixedYearRelativePaths));
if (configuration?.ModelDirectory is null) throw new NullReferenceException(nameof(configuration.ModelDirectory));
if (configuration?.ModelName is null) throw new NullReferenceException(nameof(configuration.ModelName));
if (configuration?.MoveToDecade is null) throw new NullReferenceException(nameof(configuration.MoveToDecade));
if (configuration?.OutputExtension is null) throw new NullReferenceException(nameof(configuration.OutputExtension));
if (configuration?.OutputQuality is null) throw new NullReferenceException(nameof(configuration.OutputQuality));
// if (configuration?.OutputResolutions is null) throw new NullReferenceException(nameof(configuration.OutputResolutions));
@ -173,7 +171,6 @@ public class Configuration
if (configuration?.SaveFullYearOfRandomFiles is null) throw new NullReferenceException(nameof(configuration.SaveFullYearOfRandomFiles));
if (configuration?.SaveIndividually is null) throw new NullReferenceException(nameof(configuration.SaveIndividually));
// if (configuration?.SaveMappedForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveMappedForOutputResolutions));
if (configuration?.SaveMappedRelations is null) throw new NullReferenceException(nameof(configuration.SaveMappedRelations));
// if (configuration?.SavePropertyShortcutsForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SavePropertyShortcutsForOutputResolutions));
// if (configuration?.SaveRandomForOutputResolutions is null) throw new NullReferenceException(nameof(configuration.SaveRandomForOutputResolutions));
if (configuration?.SaveResizedSubfiles is null) throw new NullReferenceException(nameof(configuration.SaveResizedSubfiles));
@ -226,6 +223,7 @@ public class Configuration
configuration.MixedYearRelativePaths ?? Array.Empty<string>(),
configuration.ModelDirectory,
configuration.ModelName,
configuration.MoveToDecade.Value,
configuration.OutputExtension,
configuration.OutputQuality.Value,
configuration.OutputResolutions ?? Array.Empty<string>(),
@ -257,7 +255,6 @@ public class Configuration
configuration.SaveFullYearOfRandomFiles.Value,
configuration.SaveIndividually.Value,
configuration.SaveMappedForOutputResolutions ?? Array.Empty<string>(),
configuration.SaveMappedRelations.Value,
configuration.SavePropertyShortcutsForOutputResolutions ?? Array.Empty<string>(),
configuration.SaveRandomForOutputResolutions ?? Array.Empty<string>(),
configuration.SaveResizedSubfiles.Value,

View File

@ -36,6 +36,7 @@ public record Configuration(Property.Models.Configuration PropertyConfiguration,
string[] MixedYearRelativePaths,
string ModelDirectory,
string ModelName,
bool MoveToDecade,
string OutputExtension,
int OutputQuality,
string[] OutputResolutions,
@ -67,7 +68,6 @@ public record Configuration(Property.Models.Configuration PropertyConfiguration,
bool SaveFullYearOfRandomFiles,
bool SaveIndividually,
string[] SaveMappedForOutputResolutions,
bool SaveMappedRelations,
string[] SavePropertyShortcutsForOutputResolutions,
string[] SaveRandomForOutputResolutions,
bool SaveResizedSubfiles,

View File

@ -13,7 +13,6 @@ public record Configuration(bool DeletePossibleDuplicates,
char[] PersonCharacters,
int[] RangeDaysDeltaTolerance,
float[] RangeDistanceTolerance,
bool SaveMappedRelations,
bool SaveSortingWithoutPerson,
string[] SkipNotSkipDirectories,
int SortingMaximumPerKey,

View File

@ -110,6 +110,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
File.SetAttributes(checkFile, FileAttributes.Hidden);
}
if (updated is null)
{
foreach (SaveContainer saveContainer in saveContainers)
{
if (string.IsNullOrEmpty(saveContainer.Directory) || string.IsNullOrEmpty(saveContainer.CheckFile) || saveContainer.ResizedFileHolder is null || !saveContainer.ResizedFileHolder.Exists)
@ -122,6 +123,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
if (saveContainer.MakeAllHidden)
File.SetAttributes(checkFile, FileAttributes.Hidden);
}
}
foreach (SaveContainer saveContainer in saveContainers)
{
if (string.IsNullOrEmpty(saveContainer.Directory) || string.IsNullOrEmpty(saveContainer.ShortcutFile) || saveContainer.ResizedFileHolder is null || !saveContainer.ResizedFileHolder.Exists)
@ -308,8 +310,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
ticks,
personContainers,
readOnlyPersonKeyToCount));
locationContainers.AddRange(Stateless.MapLogic.GetLocationContainers(distance,
maxDegreeOfParallelism,
locationContainers.AddRange(Stateless.MapLogic.GetLocationContainers(maxDegreeOfParallelism,
configuration,
ticks,
personContainers,
@ -320,7 +321,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
if (lossCount != 0 || unableToMatchCount != 0)
if (lossCount != 0 || unableToMatchCount != 0)
{ }
if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && configuration.SaveMappedRelations)
if (!string.IsNullOrEmpty(a2PeopleContentDirectory) && configuration.LocationContainerDistanceTolerance is not null)
Stateless.MapLogic.SaveMappedRelations(configuration, distance, a2PeopleContentDirectory, eDistanceContentDirectory, ticks, locationContainers, readOnlyPersonKeyFormattedToPersonContainer, readOnlyPersonKeyToPersonContainerCollection);
}
_PersonKeyToCount = readOnlyPersonKeyToCount;
@ -616,8 +617,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
checkFile = Path.Combine(personDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}");
saveContainer = new(checkFile, directory, faceFileHolder);
}
else
if (saveIndividually)
else if (saveIndividually)
{
facePartsDirectory = Stateless.MapLogic.GetFacePartsDirectory(_PropertyConfiguration, d2FacePartsContentDirectory, mapping.MappingFromItem);
facePartsFileHolder = new(Path.Combine(facePartsDirectory, $"{mapping.MappingFromLocation.DeterministicHashCodeKey}{mapping.MappingFromItem.ImageFileHolder.ExtensionLowered}{_Configuration.FacePartsFileNameExtension}"));
@ -694,7 +694,6 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
FaceDistance faceDistanceLength;
List<int>? wholePercentagesCollection;
bool skipNotSkipCollectionAny = _SkipNotSkipCollection.Count > 0;
float distanceTolerance = _Configuration.RangeDistanceTolerance[1];
for (int j = 0; j < faceDistanceLengths.Count; j++)
{
if (faceDistanceEncoding.WholePercentages is null)
@ -703,9 +702,9 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
throw new NotSupportedException();
if (j == i)
continue;
if (_SkipCollection.TryGetValue(faceDistanceEncoding.Id, out wholePercentagesCollection) && wholePercentagesCollection.Contains(faceDistanceEncoding.WholePercentages.Value))
if (faceDistanceEncoding.Id is not null && _SkipCollection.TryGetValue(faceDistanceEncoding.Id.Value, out wholePercentagesCollection) && wholePercentagesCollection.Contains(faceDistanceEncoding.WholePercentages.Value))
continue;
if (skipNotSkipCollectionAny && (!_SkipNotSkipCollection.TryGetValue(faceDistanceEncoding.Id, out wholePercentagesCollection) || !wholePercentagesCollection.Contains(faceDistanceEncoding.WholePercentages.Value)))
if (faceDistanceEncoding.Id is not null && skipNotSkipCollectionAny && (!_SkipNotSkipCollection.TryGetValue(faceDistanceEncoding.Id.Value, out wholePercentagesCollection) || !wholePercentagesCollection.Contains(faceDistanceEncoding.WholePercentages.Value)))
continue;
if (face.Mapping.MappingFromFilter.IsUsed is not null && face.Mapping.MappingFromFilter.IsUsed.Value)
continue;
@ -714,7 +713,7 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
throw new NotSupportedException();
if (faceDistanceLength.Length == 0)
continue;
sorting = ISorting.Get(_Configuration.FaceDistancePermyriad, distanceTolerance, faceDistanceEncoding, faceDistanceLength);
sorting = ISorting.Get(_Configuration.FaceDistancePermyriad, faceDistanceEncoding, faceDistanceLength);
if (sorting.DistancePermyriad == 0)
continue;
if (sorting.Id == faceDistanceEncoding.Id)
@ -1184,7 +1183,39 @@ public partial class MapLogic : Shared.Models.Methods.IMapLogic
public bool InSkipCollection(int id, MappingFromLocation mappingFromLocation) =>
_SkipCollection.TryGetValue(id, out List<int>? wholePercentagesCollection) && wholePercentagesCollection.Contains(mappingFromLocation.WholePercentages);
public bool? IsFocusPerson(int? skipPersonWithMoreThen, List<(string Directory, long PersonKey)> jLinkResolvedDirectories, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, MappingFromLocation mappingFromLocation)
public bool? IsFocusPerson(int? skipPersonWithMoreThen, long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, MappingFromLocation mappingFromLocation)
{
bool? result;
ReadOnlyCollection<PersonContainer>? personContainers;
if (skipPersonWithMoreThen is null && jLinkResolvedPersonKeys.Length == 0)
result = null;
else if (wholePercentagesToPersonContainers is null)
result = null;
else if (!wholePercentagesToPersonContainers.TryGetValue(mappingFromLocation.WholePercentages, out personContainers))
result = null;
else
{
result = false;
foreach (PersonContainer personContainer in personContainers)
{
if (personContainer.Key is null)
continue;
if (skipPersonWithMoreThen is not null && _PersonKeyToCount.TryGetValue(personContainer.Key.Value, out int count) && count > 2 && count < skipPersonWithMoreThen.Value)
{
result = true;
break;
}
if (jLinkResolvedPersonKeys.Contains(personContainer.Key.Value))
{
result = true;
break;
}
}
}
return result;
}
public bool? IsFocusPersonOld(int? skipPersonWithMoreThen, List<(string Directory, long PersonKey)> jLinkResolvedDirectories, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, MappingFromLocation mappingFromLocation)
{
bool? result;
ReadOnlyCollection<PersonContainer>? personContainers;

View File

@ -231,6 +231,7 @@ internal abstract class MapLogic
}
}
}
_ = IPath.DeleteEmptyDirectories(personKeyDirectory);
}
private static List<MappedFile> GetDisplayDirectoryAllFiles(string fileNameExtension, string personBirthdayFormat, ReadOnlyCollection<PersonContainer> personContainers)
@ -724,7 +725,7 @@ internal abstract class MapLogic
yield return new(l, Path.GetFileName(l));
}
private static List<(string, long)> GetGenealogicalDataCommunicationDirectories(string genealogicalDataCommunicationFile, string[] jLinks, string personBirthdayFormat)
private static List<(string, long)> GetDirectoryAndTicksCollection(string[] jLinks, string personBirthdayFormat, string? rootDirectory)
{
List<(string, long)> results = new();
string directory;
@ -732,12 +733,11 @@ internal abstract class MapLogic
string[] personKeyDirectories;
string[] personDisplayDirectoryNames;
string personKeyFormattedDirectoryName;
string? genealogicalDataCommunicationDirectory = Path.GetDirectoryName(genealogicalDataCommunicationFile);
foreach (string jLink in jLinks)
{
if (genealogicalDataCommunicationDirectory is null)
if (rootDirectory is null)
continue;
directory = Path.Combine(genealogicalDataCommunicationDirectory, jLink);
directory = Path.Combine(rootDirectory, jLink);
if (!Directory.Exists(directory))
continue;
personDisplayDirectoryNames = Directory.GetDirectories(directory, "*", SearchOption.TopDirectoryOnly);
@ -756,6 +756,14 @@ internal abstract class MapLogic
return results;
}
private static List<(string, long)> GetGenealogicalDataCommunicationDirectories(string genealogicalDataCommunicationFile, string[] jLinks, string personBirthdayFormat)
{
List<(string, long)> results;
string? genealogicalDataCommunicationDirectory = Path.GetDirectoryName(genealogicalDataCommunicationFile);
results = GetDirectoryAndTicksCollection(jLinks, personBirthdayFormat, genealogicalDataCommunicationDirectory);
return results;
}
private static string? TryToFind(char[] personCharacters, string a2PeopleSingletonDirectory, List<(string Directory, string DirectoryName, string DirectoryNameSplitFirst)> a2PeopleSingletonDirectories, string file, string path)
{
string? result;
@ -871,7 +879,6 @@ internal abstract class MapLogic
int? wholePercentages;
string? checkDirectory;
ProgressBar progressBar;
string? yearDirectoryName;
string[] yearDirectories;
string personKeyFormatted;
string? personFirstInitial;
@ -927,22 +934,6 @@ internal abstract class MapLogic
personNameDirectories = Directory.GetDirectories(yearDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string file in files)
File.Delete(file);
yearDirectoryName = Path.GetFileName(yearDirectory);
if (!string.IsNullOrEmpty(yearDirectoryName) && yearDirectoryName.Length != 8)
{
checkDirectory = Path.Combine(personKeyFormattedDirectory, "abcdefgh");
if (Directory.Exists(checkDirectory))
{
MoveDirectory(personNameDirectories, checkDirectory);
if (!check)
check = true;
continue;
}
Directory.Move(yearDirectory, checkDirectory);
if (!check)
check = true;
continue;
}
foreach (string personNameDirectory in personNameDirectories)
{
directoryNumber++;
@ -1070,33 +1061,6 @@ internal abstract class MapLogic
return results;
}
private static void MoveDirectory(string[] personNameDirectories, string destination)
{
string[] files;
string checkFile;
string checkDirectory;
string? personNameDirectoryName;
foreach (string personNameDirectory in personNameDirectories)
{
personNameDirectoryName = Path.GetFileName(personNameDirectory);
checkDirectory = Path.Combine(destination, personNameDirectoryName);
if (personNameDirectory == checkDirectory)
continue;
if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory);
files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly);
foreach (string file in files)
{
checkFile = Path.Combine(checkDirectory, Path.GetFileName(file));
if (checkFile == file)
continue;
if (File.Exists(checkFile))
continue;
File.Move(file, checkFile);
}
}
}
internal static void SetKeyValuePairsAndAddToCollections(Configuration configuration, ReadOnlyCollection<PersonContainer> personContainers, Dictionary<long, PersonContainer> personKeyToPersonContainer, ReadOnlyCollection<PersonKeyFormattedIdThenWholePercentages> personKeyFormattedIdThenWholePercentagesCollection, Dictionary<long, int> personKeyToCount, Dictionary<string, PersonContainer> personKeyFormattedToPersonContainer, Dictionary<long, List<PersonContainer>> personKeyToPersonContainerCollection, List<(PersonKeyFormattedIdThenWholePercentages, PersonContainer)> possiblyNewPersonDisplayDirectoryNamesAndPersonContainer)
{
PersonBirthday? personBirthday;
@ -1291,7 +1255,7 @@ internal abstract class MapLogic
}
}
internal static List<LocationContainer<MetadataExtractor.Directory>> GetLocationContainers(Shared.Models.Methods.IDistance<MetadataExtractor.Directory> distance, int maxDegreeOfParallelism, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, Dictionary<int, List<(string, int)>> skipCollection, List<Record> records)
internal static List<LocationContainer<MetadataExtractor.Directory>> GetLocationContainers(int maxDegreeOfParallelism, Configuration configuration, long ticks, ReadOnlyCollection<PersonContainer> personContainers, Dictionary<int, List<(string, int)>> skipCollection, List<Record> records)
{
List<LocationContainer<MetadataExtractor.Directory>> results = new();
List<MappedFile> mappedFiles = GetMappedFiles(configuration, personContainers, records);
@ -1310,8 +1274,6 @@ internal abstract class MapLogic
}
ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> locationContainers = new(results.OrderBy(l => l.DirectoryNumber).ToArray());
LookForPossibleDuplicates(configuration, locationContainers);
if (configuration.LocationContainerDistanceTolerance is not null)
distance.ReviewLocationContainerDistanceTolerance(configuration.LocationContainerDistanceTolerance.Value, locationContainers);
return results;
}
@ -1558,6 +1520,9 @@ internal abstract class MapLogic
string checkDirectory;
WindowsShortcut windowsShortcut;
List<string> resolvedDirectories = new();
if (string.IsNullOrEmpty(genealogicalDataCommunicationFile))
results = GetDirectoryAndTicksCollection(jLinks, personBirthdayFormat, a2PeopleContentDirectory);
else
results = GetGenealogicalDataCommunicationDirectories(genealogicalDataCommunicationFile, jLinks, personBirthdayFormat);
if (results.Count == 0 || results.Count < jLinks.Length)
{
@ -1710,10 +1675,24 @@ internal abstract class MapLogic
return new(results);
}
internal static void SetCreationTime(MappingFromItem mappingFromItem, MappingFromPerson mappingFromPerson)
{
DateTime dateTime;
FileInfo fileInfo;
foreach (string locationContainersFile in mappingFromPerson.LocationContainersFiles)
{
fileInfo = new(locationContainersFile);
if (!fileInfo.Exists)
continue;
dateTime = mappingFromItem.DateTimeOriginal is null ? mappingFromItem.MinimumDateTime : mappingFromItem.DateTimeOriginal.Value;
if (fileInfo.CreationTime != dateTime)
File.SetCreationTime(locationContainersFile, dateTime);
}
}
internal static void MoveToDecade(Property.Models.Configuration propertyConfiguration, MappingFromItem mappingFromItem, MappingFromPerson mappingFromPerson)
{
string year;
DateTime dateTime;
FileInfo fileInfo;
string halfDecade;
string checkDirectory;
@ -1744,24 +1723,20 @@ internal abstract class MapLogic
break;
if (mappingFromItem.DateTimeOriginal is null)
{
dateTime = mappingFromItem.MinimumDateTime;
year = mappingFromItem.MinimumDateTime.Year.ToString();
halfDecade = year[3] > '4' ? $"#{year[..3]}+" : $"#{year[..3]}-";
}
else
{
dateTime = mappingFromItem.DateTimeOriginal.Value;
year = mappingFromItem.DateTimeOriginal.Value.Year.ToString();
halfDecade = year[3] > '4' ? $"^{year[..3]}+" : $"^{year[..3]}-";
}
if (fileInfo.CreationTime != dateTime)
File.SetCreationTime(locationContainersFile, dateTime);
if (halfDecade == yearDirectoryName)
continue;
checkDirectory = Path.Combine(personKeyFormattedDirectory, halfDecade, personNameDirectoryName);
if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory);
File.Move(locationContainersFile, Path.Combine(checkDirectory, Path.Combine(checkDirectory, Path.GetFileName(locationContainersFile))));
File.Move(locationContainersFile, Path.Combine(checkDirectory, Path.GetFileName(locationContainersFile)));
}
}
@ -1807,6 +1782,7 @@ internal abstract class MapLogic
internal static void SaveMappedRelations(Configuration configuration, Shared.Models.Methods.IDistance<MetadataExtractor.Directory> distance, string a2PeopleContentDirectory, string eDistanceContentDirectory, long ticks, List<LocationContainer<MetadataExtractor.Directory>> locationContainers, ReadOnlyDictionary<string, PersonContainer> readOnlyPersonKeyFormattedToPersonContainer, ReadOnlyDictionary<long, List<PersonContainer>> readOnlyPersonKeyToPersonContainerCollection)
{
bool isCounterPersonYear;
string personKeyFormatted;
string? displayDirectoryName;
int totalSeconds = (int)Math.Floor(new TimeSpan(DateTime.Now.Ticks - ticks).TotalSeconds);
@ -1816,13 +1792,32 @@ internal abstract class MapLogic
using ProgressBar progressBar = new(collections.Count, message, options);
foreach (ReadOnlyCollection<LocationContainer<MetadataExtractor.Directory>> collection in collections)
{
if (configuration.LocationContainerDistanceTolerance is null)
break;
progressBar.Tick();
if (collection.Count == 0)
continue;
personKeyFormatted = IPersonBirthday.GetFormatted(configuration.PersonBirthdayFormat, collection[0].PersonKey);
isCounterPersonYear = IPersonBirthday.IsCounterPersonYear(new DateTime(collection[0].PersonKey).Year);
displayDirectoryName = GetDisplayDirectoryName(readOnlyPersonKeyToPersonContainerCollection, readOnlyPersonKeyFormattedToPersonContainer, collection[0].PersonKey, personKeyFormatted);
distance.SaveMappedForOutputResolutions(a2PeopleContentDirectory, eDistanceContentDirectory, configuration.RangeDistanceTolerance, collection, personKeyFormatted, displayDirectoryName);
distance.SaveMappedForOutputResolutions(a2PeopleContentDirectory, eDistanceContentDirectory, configuration.LocationContainerDistanceTolerance.Value, collection, collection[0].PersonKey, isCounterPersonYear, personKeyFormatted, displayDirectoryName);
}
}
internal static bool? CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<PersonContainer>>? wholePercentagesToPersonContainers, MappingFromLocation mappingFromLocation)
{
bool? result;
ReadOnlyCollection<PersonContainer>? personContainers;
if (wholePercentagesToPersonContainers is null)
result = null;
else
{
if (!wholePercentagesToPersonContainers.TryGetValue(mappingFromLocation.WholePercentages, out personContainers))
result = null;
else
result = personContainers.Any(l => IPerson.IsDefaultName(l) && l.Key is not null && IPersonBirthday.IsCounterPersonYear(new DateTime(l.Key.Value).Year) && !jLinkResolvedPersonKeys.Contains(l.Key.Value));
}
return result;
}
}

View File

@ -35,9 +35,19 @@ public interface IMapLogic
static List<(string, long)> GetJLinkDirectories(string genealogicalDataCommunicationFile, string[] jLinks, string personBirthdayFormat, char[] personCharacters, string a2PeopleSingletonDirectory, string a2PeopleContentDirectory) =>
MapLogic.GetJLinkDirectories(genealogicalDataCommunicationFile, jLinks, personBirthdayFormat, personCharacters, a2PeopleSingletonDirectory, a2PeopleContentDirectory);
void TestStatic_SetCreationTime(Shared.Models.MappingFromItem mappingFromItem, Shared.Models.MappingFromPerson mappingFromPerson) =>
SetCreationTime(mappingFromItem, mappingFromPerson);
static void SetCreationTime(Shared.Models.MappingFromItem mappingFromItem, Shared.Models.MappingFromPerson mappingFromPerson) =>
MapLogic.SetCreationTime(mappingFromItem, mappingFromPerson);
void TestStatic_MoveToDecade(Property.Models.Configuration propertyConfiguration, Shared.Models.MappingFromItem mappingFromItem, Shared.Models.MappingFromPerson mappingFromPerson) =>
MoveToDecade(propertyConfiguration, mappingFromItem, mappingFromPerson);
static void MoveToDecade(Property.Models.Configuration propertyConfiguration, Shared.Models.MappingFromItem mappingFromItem, Shared.Models.MappingFromPerson mappingFromPerson) =>
MapLogic.MoveToDecade(propertyConfiguration, mappingFromItem, mappingFromPerson);
bool? TestStatic_CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<Shared.Models.PersonContainer>>? wholePercentagesToPersonContainers, Shared.Models.MappingFromLocation mappingFromLocation) =>
CanReMap(jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation);
static bool? CanReMap(long[] jLinkResolvedPersonKeys, ReadOnlyDictionary<int, ReadOnlyCollection<Shared.Models.PersonContainer>>? wholePercentagesToPersonContainers, Shared.Models.MappingFromLocation mappingFromLocation) =>
MapLogic.CanReMap(jLinkResolvedPersonKeys, wholePercentagesToPersonContainers, mappingFromLocation);
}

View File

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

View File

@ -12,29 +12,33 @@ public class Mapping : Properties.IMapping
public string? _SegmentC;
protected SortingContainer? _SortingContainer;
public int? By => _By;
public MappingFromFilterPost MappingFromFilterPost { init; get; }
public MappingFromFilterPre MappingFromFilterPre { init; get; }
public MappingFromItem MappingFromItem { init; get; }
public MappingFromFilter MappingFromFilter { init; get; }
public MappingFromLocation? MappingFromLocation { init; get; }
public List<MappingFromPhotoPrism>? MappingFromPhotoPrismCollection { init; get; }
public MappingFromPerson? MappingFromPerson => _MappingFromPerson;
public List<MappingFromPhotoPrism>? MappingFromPhotoPrismCollection { init; get; }
public string? SegmentC => _SegmentC;
public SortingContainer? SortingContainer => _SortingContainer;
[JsonConstructor]
public Mapping(int? by, MappingFromItem mappingFromItem, MappingFromFilter mappingFromFilter, MappingFromLocation? mappingFromLocation, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, MappingFromPerson? mappingFromPerson, string? segmentC, SortingContainer? sortingContainer)
public Mapping(int? by, MappingFromFilter mappingFromFilter, MappingFromFilterPost mappingFromFilterPost, MappingFromFilterPre mappingFromFilterPre, MappingFromItem mappingFromItem, MappingFromLocation? mappingFromLocation, MappingFromPerson? mappingFromPerson, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection, string? segmentC, SortingContainer? sortingContainer)
{
_By = by;
_SegmentC = segmentC;
MappingFromItem = mappingFromItem;
MappingFromFilter = mappingFromFilter;
MappingFromFilterPost = mappingFromFilterPost;
MappingFromFilterPre = mappingFromFilterPre;
MappingFromItem = mappingFromItem;
MappingFromLocation = mappingFromLocation;
MappingFromPhotoPrismCollection = mappingFromPhotoPrismCollection;
_MappingFromPerson = mappingFromPerson;
MappingFromPhotoPrismCollection = mappingFromPhotoPrismCollection;
_SortingContainer = sortingContainer;
}
public Mapping(MappingFromItem mappingFromItem, MappingFromFilter mappingFromFilter, MappingFromLocation? mappingFromLocation, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection) :
this(null, mappingFromItem, mappingFromFilter, mappingFromLocation, mappingFromPhotoPrismCollection, null, null, null)
public Mapping(MappingFromFilter mappingFromFilter, MappingFromFilterPost mappingFromFilterPost, MappingFromFilterPre mappingFromFilterPre, MappingFromItem mappingFromItem, MappingFromLocation? mappingFromLocation, List<MappingFromPhotoPrism>? mappingFromPhotoPrismCollection) :
this(null, mappingFromFilter, mappingFromFilterPost, mappingFromFilterPre, mappingFromItem, mappingFromLocation, null, mappingFromPhotoPrismCollection, null, null)
{ }
public override string ToString()

View File

@ -0,0 +1,23 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace View_by_Distance.Shared.Models;
public record MappingFromFilterPost(bool? CanReMap,
bool? InSkipCollection,
bool? IsFocusPerson)
{
public override string ToString()
{
string result = JsonSerializer.Serialize(this, MappingFromFilterPostGenerationContext.Default.MappingFromFilterPost);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(MappingFromFilterPost))]
public partial class MappingFromFilterPostGenerationContext : JsonSerializerContext
{
}

View File

@ -0,0 +1,23 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace View_by_Distance.Shared.Models;
public record MappingFromFilterPre(bool? InSkipCollection,
bool? IsFocusModel,
bool? IsFocusRelativePath)
{
public override string ToString()
{
string result = JsonSerializer.Serialize(this, MappingFromFilterPreGenerationContext.Default.MappingFromFilterPre);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(MappingFromFilterPre))]
public partial class MappingFromFilterPreGenerationContext : JsonSerializerContext
{
}

View File

@ -5,7 +5,6 @@ namespace View_by_Distance.Shared.Models.Methods;
public interface IDistance<T>
{
void ReviewLocationContainerDistanceTolerance(float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer<T>> locationContainers);
void SaveMappedForOutputResolutions(string a2PeopleContentDirectory, string eDistanceContentDirectory, float[] rangeDistanceTolerance, ReadOnlyCollection<LocationContainer<T>> locationContainers, string personKeyFormatted, string? displayDirectoryName);
void SaveMappedForOutputResolutions(string a2PeopleContentDirectory, string eDistanceContentDirectory, float locationContainerDistanceTolerance, ReadOnlyCollection<LocationContainer<T>> locationContainers, long personKey, bool isCounterPersonYear, string personKeyFormatted, string? displayDirectoryName);
}

View File

@ -6,7 +6,8 @@ public interface IFaceDistance
public int? ConfidencePercent { init; get; }
public DateTime DateTimeOriginalThenMinimumDateTime { init; get; }
public object? Encoding { init; get; }
public int Id { init; get; }
public MappingFromFilterPost? MappingFromFilterPost { init; get; }
public int? Id { init; get; }
public bool? IsWrongYear { init; get; }
public double? Length { init; get; }
public int? WholePercentages { init; get; }

View File

@ -4,11 +4,13 @@ public interface IMapping
{
public int? By { get; }
public string? SegmentC { get; }
public MappingFromFilterPost MappingFromFilterPost { init; get; }
public MappingFromFilterPre MappingFromFilterPre { init; get; }
public MappingFromItem MappingFromItem { init; get; }
public MappingFromLocation? MappingFromLocation { init; get; }
public List<MappingFromPhotoPrism>? MappingFromPhotoPrismCollection { init; get; }
public MappingFromPerson? MappingFromPerson { get; }
public List<MappingFromPhotoPrism>? MappingFromPhotoPrismCollection { init; get; }
public string? SegmentC { get; }
public SortingContainer? SortingContainer { get; }
}

View File

@ -3,6 +3,7 @@ namespace View_by_Distance.Shared.Models.Properties;
public interface ISorting
{
public bool CanReMap { init; get; }
public int DaysDelta { init; get; }
public int DistancePermyriad { init; get; }
public int Id { init; get; }

View File

@ -6,6 +6,7 @@ namespace View_by_Distance.Shared.Models;
public record class Sorting : Properties.ISorting
{
public bool CanReMap { init; get; }
public int DaysDelta { init; get; }
public int DistancePermyriad { init; get; }
public int Id { init; get; }
@ -13,17 +14,18 @@ public record class Sorting : Properties.ISorting
public int WholePercentages { init; get; }
[JsonConstructor]
public Sorting(int daysDelta, int distancePermyriad, int id, bool older, int wholePercentages)
public Sorting(bool canReMap, int daysDelta, int distancePermyriad, int id, bool older, int wholePercentages)
{
CanReMap = canReMap;
DaysDelta = daysDelta;
DistancePermyriad = distancePermyriad;
Id = id;
WholePercentages = wholePercentages;
Older = older;
WholePercentages = wholePercentages;
}
public Sorting(Mapping mapping, MappingFromLocation mappingFromLocation) :
this(0, 0, mapping.MappingFromItem.Id, false, mappingFromLocation.WholePercentages)
this(false, 0, 0, mapping.MappingFromItem.Id, false, mappingFromLocation.WholePercentages)
{ }
public override string ToString()

View File

@ -45,10 +45,10 @@ public interface ILocation
static string GetLeftPadded(int locationDigits, string value) =>
Location.GetLeftPadded(locationDigits, value);
int TestStatic_GetConfidencePercent(int faceConfidencePercent, float[] rangeFaceConfidence, double confidence) =>
GetConfidencePercent(faceConfidencePercent, rangeFaceConfidence, confidence);
static int GetConfidencePercent(int faceConfidencePercent, float[] rangeFaceConfidence, double confidence) =>
Location.GetConfidencePercent(faceConfidencePercent, rangeFaceConfidence, confidence);
int TestStatic_GetConfidencePercent(int faceConfidencePercent, double confidence) =>
GetConfidencePercent(faceConfidencePercent, confidence);
static int GetConfidencePercent(int faceConfidencePercent, double confidence) =>
Location.GetConfidencePercent(faceConfidencePercent, confidence);
string TestStatic_GetLeftPadded(int locationDigits, int value) =>
GetLeftPadded(locationDigits, value);

View File

@ -8,9 +8,9 @@ public interface ISorting
static Models.Sorting[] Sort(List<Models.Sorting> collection) =>
(from l in collection orderby l.DistancePermyriad, l.DaysDelta select l).ToArray();
Models.Sorting TestStatic_Get(int faceDistancePermyriad, float distanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength) =>
Get(faceDistancePermyriad, distanceTolerance, faceDistanceEncoding, faceDistanceLength);
static Models.Sorting Get(int faceDistancePermyriad, float distanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength) =>
Sorting.Get(faceDistancePermyriad, distanceTolerance, faceDistanceEncoding, faceDistanceLength);
Models.Sorting TestStatic_Get(int faceDistancePermyriad, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength) =>
Get(faceDistancePermyriad, faceDistanceEncoding, faceDistanceLength);
static Models.Sorting Get(int faceDistancePermyriad, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength) =>
Sorting.Get(faceDistancePermyriad, faceDistanceEncoding, faceDistanceLength);
}

View File

@ -114,9 +114,9 @@ internal abstract class Location
return result;
}
internal static int GetConfidencePercent(int faceConfidencePercent, float[] rangeFaceConfidence, double confidence)
internal static int GetConfidencePercent(int faceConfidencePercent, double confidence)
{
int result = (int)(confidence / rangeFaceConfidence[1] * faceConfidencePercent);
int result = (int)(confidence * faceConfidencePercent);
return result;
}

View File

@ -3,9 +3,11 @@ namespace View_by_Distance.Shared.Models.Stateless.Methods;
internal abstract class Sorting
{
internal static Models.Sorting Get(int faceDistancePermyriad, float distanceTolerance, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength)
internal static Models.Sorting Get(int faceDistancePermyriad, Models.FaceDistance faceDistanceEncoding, Models.FaceDistance faceDistanceLength)
{
Models.Sorting result;
if (faceDistanceLength.Id is null)
throw new NotSupportedException();
if (faceDistanceLength.Length is null)
throw new NotSupportedException();
if (faceDistanceLength.WholePercentages is null)
@ -13,8 +15,9 @@ internal abstract class Sorting
TimeSpan timeSpan = new(faceDistanceLength.DateTimeOriginalThenMinimumDateTime.Ticks - faceDistanceEncoding.DateTimeOriginalThenMinimumDateTime.Ticks);
bool older = timeSpan.TotalMilliseconds < 0;
int daysDelta = (int)Math.Round(Math.Abs(timeSpan.TotalDays), 0);
int distancePermyriad = (int)(faceDistanceLength.Length.Value / distanceTolerance * faceDistancePermyriad);
result = new(daysDelta, distancePermyriad, faceDistanceLength.Id, older, faceDistanceLength.WholePercentages.Value);
int distancePermyriad = (int)(faceDistanceLength.Length.Value * faceDistancePermyriad);
bool canReMap = faceDistanceLength.MappingFromFilterPost?.CanReMap is not null && faceDistanceLength.MappingFromFilterPost.CanReMap.Value;
result = new(canReMap, daysDelta, distancePermyriad, faceDistanceLength.Id.Value, older, faceDistanceLength.WholePercentages.Value);
return result;
}

View File

@ -231,25 +231,19 @@ public partial class UnitTestCalculations
public void TestGetConfidencePercent()
{
int faceConfidencePercent = 100;
float minimum, target, maximum, value, check;
minimum = 0.8f;
target = 0.8f;
maximum = int.MaxValue;
float value, check;
value = 0f;
check = ILocation.GetConfidencePercent(faceConfidencePercent, new float[] { minimum, target, maximum }, value);
check = ILocation.GetConfidencePercent(faceConfidencePercent, value);
Assert.IsTrue(check == 0);
target = 0.8f;
value = 0.4f;
check = ILocation.GetConfidencePercent(faceConfidencePercent, new float[] { minimum, target, maximum }, value);
Assert.IsTrue(check == 50);
target = 0.8f;
check = ILocation.GetConfidencePercent(faceConfidencePercent, value);
Assert.IsTrue(check == 40);
value = 0.8f;
check = ILocation.GetConfidencePercent(faceConfidencePercent, new float[] { minimum, target, maximum }, value);
Assert.IsTrue(check == 100);
target = 0.8f;
check = ILocation.GetConfidencePercent(faceConfidencePercent, value);
Assert.IsTrue(check == 80);
value = 1.6f;
check = ILocation.GetConfidencePercent(faceConfidencePercent, new float[] { minimum, target, maximum }, value);
Assert.IsTrue(check == 200);
check = ILocation.GetConfidencePercent(faceConfidencePercent, value);
Assert.IsTrue(check == 160);
NonThrowTryCatch();
}