AppSettings and Configuration changes,
major changes to E_Distance and minor for D_Face
This commit is contained in:
@ -11,36 +11,36 @@ public class Closest
|
||||
public const float MinimumMinimum = 0.05f;
|
||||
|
||||
protected readonly double? _Average;
|
||||
protected readonly int? _FaceLocationIndex;
|
||||
protected readonly int? _NormalizedPixelPercentage;
|
||||
protected readonly bool? _IsWrongYear;
|
||||
protected readonly double? _Minimum;
|
||||
protected readonly DateTime _MinimumDateTime;
|
||||
protected readonly PersonBirthday? _PersonBirthday;
|
||||
public double? Average => _Average;
|
||||
public int? FaceLocationIndex => _FaceLocationIndex;
|
||||
public int? NormalizedPixelPercentage => _NormalizedPixelPercentage;
|
||||
public bool? IsWrongYear => _IsWrongYear;
|
||||
public double? Minimum => _Minimum;
|
||||
public DateTime MinimumDateTime => _MinimumDateTime;
|
||||
public PersonBirthday? PersonBirthday => _PersonBirthday;
|
||||
|
||||
[JsonConstructor]
|
||||
public Closest(double? average, int? faceLocationIndex, bool? isWrongYear, double? minimum, DateTime minimumDateTime, PersonBirthday? personBirthday)
|
||||
public Closest(double? average, int? normalizedPixelPercentage, bool? isWrongYear, double? minimum, DateTime minimumDateTime, PersonBirthday? personBirthday)
|
||||
{
|
||||
_Average = average;
|
||||
_FaceLocationIndex = faceLocationIndex;
|
||||
_NormalizedPixelPercentage = normalizedPixelPercentage;
|
||||
_IsWrongYear = isWrongYear;
|
||||
_Minimum = minimum;
|
||||
_MinimumDateTime = minimumDateTime;
|
||||
_PersonBirthday = personBirthday;
|
||||
}
|
||||
|
||||
public Closest(int? faceLocationIndex, DateTime minimumDateTime, bool? isWrongYear) :
|
||||
this(null, faceLocationIndex, isWrongYear, null, minimumDateTime, null)
|
||||
public Closest(int? normalizedPixelPercentage, DateTime minimumDateTime, bool? isWrongYear) :
|
||||
this(null, normalizedPixelPercentage, isWrongYear, null, minimumDateTime, null)
|
||||
{
|
||||
}
|
||||
|
||||
public Closest(int? faceLocationIndex, DateTime minimumDateTime, bool? isWrongYear, PersonBirthday? personBirthday, List<double> faceDistances) :
|
||||
this(faceDistances.Average(), faceLocationIndex, isWrongYear, faceDistances.Min(), minimumDateTime, personBirthday)
|
||||
public Closest(int? normalizedPixelPercentage, DateTime minimumDateTime, bool? isWrongYear, PersonBirthday? personBirthday, List<double> faceDistances) :
|
||||
this(faceDistances.Average(), normalizedPixelPercentage, isWrongYear, faceDistances.Min(), minimumDateTime, personBirthday)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -58,6 +58,7 @@ public class Item
|
||||
_Named = new();
|
||||
_Closest = new();
|
||||
_Changed = changed;
|
||||
_Property = property;
|
||||
_Abandoned = abandoned;
|
||||
_NoJson = abandoned is null;
|
||||
_RelativePath = relativePath;
|
||||
@ -90,43 +91,57 @@ public class Item
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void AddToNamed(PropertyLogic propertyLogic, Item[] filteredItems)
|
||||
public static void AddToNamed(PropertyLogic propertyLogic, List<Item> items)
|
||||
{
|
||||
Item item;
|
||||
bool? isWrongYear;
|
||||
string[] segments;
|
||||
string[] personKeys;
|
||||
double? pixelPercentage;
|
||||
DateTime minimumDateTime;
|
||||
PersonBirthday? personBirthday;
|
||||
for (int i = 0; i < filteredItems.Length; i++)
|
||||
float deterministicHashCodeKey;
|
||||
List<string> personKeys = new();
|
||||
foreach (Item item in items)
|
||||
{
|
||||
item = filteredItems[i];
|
||||
if (item.ImageFileHolder is null)
|
||||
continue;
|
||||
if (item.Property?.Id is null || item.ResizedFileHolder is null)
|
||||
continue;
|
||||
if (!propertyLogic.NamedFaceInfoDeterministicHashCodeIds.ContainsKey(item.Property.Id.Value))
|
||||
continue;
|
||||
minimumDateTime = Stateless.A_Property.GetMinimumDateTime(item.Property);
|
||||
personKeys = propertyLogic.NamedFaceInfoDeterministicHashCodeIds[item.Property.Id.Value];
|
||||
(isWrongYear, _) = item.Property.IsWrongYear(item.ImageFileHolder.FullName, minimumDateTime);
|
||||
for (int j = 0; j < personKeys.Length; j++)
|
||||
foreach (IFace face in item.Faces)
|
||||
{
|
||||
segments = Shared.Models.Stateless.Methods.IPersonBirthday.GetSegments(personKeys[j]);
|
||||
personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKeys[j]);
|
||||
if (personBirthday is null)
|
||||
personKeys.Clear();
|
||||
if (face.LocationIndex is null)
|
||||
continue;
|
||||
if (segments.Length <= 1 || !double.TryParse(segments[1], out double value))
|
||||
pixelPercentage = null;
|
||||
else
|
||||
pixelPercentage = value;
|
||||
item.Named.Add(new(isWrongYear, minimumDateTime, personBirthday, pixelPercentage));
|
||||
deterministicHashCodeKey = Models.Named.GetDeterministicHashCodeKey(item, face);
|
||||
if (!propertyLogic.NamedDeterministicHashCodeKeyValuePairs.ContainsKey(deterministicHashCodeKey))
|
||||
continue;
|
||||
minimumDateTime = Stateless.A_Property.GetMinimumDateTime(item.Property);
|
||||
personKeys.AddRange(propertyLogic.NamedDeterministicHashCodeKeyValuePairs[deterministicHashCodeKey]);
|
||||
(isWrongYear, _) = item.Property.IsWrongYear(item.ImageFileHolder.FullName, minimumDateTime);
|
||||
for (int i = 0; i < personKeys.Count; i++)
|
||||
{
|
||||
personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKeys[i]);
|
||||
if (personBirthday is null)
|
||||
continue;
|
||||
item.Named.Add(new(isWrongYear, minimumDateTime, face.Location.NormalizedPixelPercentage, personBirthday));
|
||||
}
|
||||
}
|
||||
if (!personKeys.Any())
|
||||
{
|
||||
if (!propertyLogic.NamedFaceInfoDeterministicHashCodeKeyValuePairs.ContainsKey(item.Property.Id.Value))
|
||||
continue;
|
||||
minimumDateTime = Stateless.A_Property.GetMinimumDateTime(item.Property);
|
||||
personKeys.AddRange(propertyLogic.NamedFaceInfoDeterministicHashCodeKeyValuePairs[item.Property.Id.Value]);
|
||||
(isWrongYear, _) = item.Property.IsWrongYear(item.ImageFileHolder.FullName, minimumDateTime);
|
||||
for (int i = 0; i < personKeys.Count; i++)
|
||||
{
|
||||
personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKeys[i]);
|
||||
if (personBirthday is null)
|
||||
continue;
|
||||
item.Named.Add(new(isWrongYear, minimumDateTime, personBirthday));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static List<(Item, (string, IFace?, (string, string, string, string))[])> GetCollection(PropertyLogic propertyLogic, Item[] filteredItems, string dFacesContentDirectory)
|
||||
public static List<(Item, (string, IFace?, (string, string, string, string))[])> GetCollection(PropertyLogic propertyLogic, List<Item> items, string dFacesContentDirectory)
|
||||
{
|
||||
List<(Item, (string, IFace?, (string, string, string, string))[])> results = new();
|
||||
Item item;
|
||||
@ -134,7 +149,6 @@ public class Item
|
||||
string directory;
|
||||
string personKey;
|
||||
bool? isWrongYear;
|
||||
string[] segments;
|
||||
const int zero = 0;
|
||||
TimeSpan? timeSpan;
|
||||
string copyFileName;
|
||||
@ -148,13 +162,12 @@ public class Item
|
||||
List<IFace> faceCollection;
|
||||
PersonBirthday? personBirthday;
|
||||
List<(string, IFace?, (string, string, string, string))> collection;
|
||||
for (int i = 0; i < filteredItems.Length; i++)
|
||||
for (int i = 0; i < items.Count; i++)
|
||||
{
|
||||
indices.Clear();
|
||||
personKey = string.Empty;
|
||||
copyFileName = string.Empty;
|
||||
copyDirectory = string.Empty;
|
||||
item = filteredItems[i];
|
||||
item = items[i];
|
||||
if (item.ImageFileHolder is null)
|
||||
continue;
|
||||
relativePath = Path.GetDirectoryName($"C:{item.RelativePath}");
|
||||
@ -163,15 +176,16 @@ public class Item
|
||||
if (item.Property?.Id is null || item.ResizedFileHolder is null)
|
||||
continue;
|
||||
collection = new();
|
||||
if (!propertyLogic.NamedFaceInfoDeterministicHashCodeIds.ContainsKey(item.Property.Id.Value))
|
||||
if (!propertyLogic.NamedFaceInfoDeterministicHashCodeKeyValuePairs.ContainsKey(item.Property.Id.Value))
|
||||
{
|
||||
faceCollection = new();
|
||||
personKey = string.Empty;
|
||||
directory = Path.Combine(dFacesContentDirectory, $"Unnamed{relativePath[2..]}");
|
||||
}
|
||||
else
|
||||
{
|
||||
faceCollection = item.Faces;
|
||||
keys = propertyLogic.NamedFaceInfoDeterministicHashCodeIds[item.Property.Id.Value];
|
||||
keys = propertyLogic.NamedFaceInfoDeterministicHashCodeKeyValuePairs[item.Property.Id.Value];
|
||||
minimumDateTime = Stateless.A_Property.GetMinimumDateTime(item.Property);
|
||||
if (minimumDateTime is null)
|
||||
continue;
|
||||
@ -179,16 +193,25 @@ public class Item
|
||||
isWrongYearFlag = GetWrongYearFlag(isWrongYear);
|
||||
subDirectoryName = $"{isWrongYearFlag}{minimumDateTime.Value:yyyy}";
|
||||
if (!faceCollection.Any())
|
||||
{
|
||||
personKey = string.Empty;
|
||||
directory = Path.Combine(dFacesContentDirectory, $"None{relativePath[2..]}", subDirectoryName);
|
||||
}
|
||||
else if (keys.Length != 1)
|
||||
{
|
||||
personKey = string.Empty;
|
||||
directory = Path.Combine(dFacesContentDirectory, $"Not Supported{relativePath[2..]}", subDirectoryName);
|
||||
}
|
||||
else if (faceCollection.Count != 1)
|
||||
{
|
||||
personKey = string.Empty;
|
||||
directory = Path.Combine(dFacesContentDirectory, $"Many{relativePath[2..]}", subDirectoryName);
|
||||
}
|
||||
else
|
||||
{
|
||||
indices.Add(zero);
|
||||
segments = Shared.Models.Stateless.Methods.IPersonBirthday.GetSegments(keys[zero]);
|
||||
personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(keys[zero]);
|
||||
personKey = keys[zero];
|
||||
personBirthday = Shared.Models.Stateless.Methods.IPersonBirthday.GetPersonBirthday(personKey);
|
||||
if (personBirthday is null)
|
||||
continue;
|
||||
timeSpan = Shared.Models.Stateless.Methods.IPersonBirthday.GetTimeSpan(minimumDateTime.Value, isWrongYear, personBirthday);
|
||||
@ -199,7 +222,6 @@ public class Item
|
||||
else
|
||||
subDirectoryName = $"^{Math.Floor(timeSpan.Value.TotalDays / 365):000}";
|
||||
}
|
||||
personKey = segments[zero];
|
||||
directory = Path.Combine(dFacesContentDirectory, "Shortcuts", personKey, subDirectoryName);
|
||||
if (faceCollection[zero].Populated)
|
||||
copyDirectory = Path.Combine(dFacesContentDirectory, "Images", personKey, subDirectoryName);
|
||||
@ -270,7 +292,7 @@ public class Item
|
||||
continue;
|
||||
foreach (Named named in item.Named)
|
||||
{
|
||||
if (named.PixelPercentage is null && (item.Named.Count != 1 || item.Faces.Count != 1))
|
||||
if (named.NormalizedPixelPercentage is null && (item.Named.Count != 1 || item.Faces.Count != 1))
|
||||
continue;
|
||||
foreach (IFace face in item.Faces)
|
||||
{
|
||||
@ -278,13 +300,13 @@ public class Item
|
||||
continue;
|
||||
if (named.PersonBirthday is null)
|
||||
continue;
|
||||
if (named.PixelPercentage.HasValue && named.PixelPercentage.Value != face.Location.PixelPercentage)
|
||||
if (named.NormalizedPixelPercentage.HasValue && named.NormalizedPixelPercentage.Value != face.Location.NormalizedPixelPercentage)
|
||||
continue;
|
||||
key = GetKey(named.MinimumDateTime, named.IsWrongYear, named.PersonBirthday);
|
||||
if (!results.ContainsKey(key))
|
||||
results.Add(key, new());
|
||||
results[key].Add(new(named.MinimumDateTime, named.IsWrongYear, named.PersonBirthday, face));
|
||||
if (named.PixelPercentage is null)
|
||||
if (named.NormalizedPixelPercentage is null)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
using System.Text.Json.Serialization;
|
||||
using View_by_Distance.Shared.Models;
|
||||
using View_by_Distance.Shared.Models.Properties;
|
||||
|
||||
namespace View_by_Distance.Property.Models;
|
||||
|
||||
@ -8,20 +9,77 @@ public class Named
|
||||
|
||||
protected readonly bool? _IsWrongYear;
|
||||
protected readonly DateTime _MinimumDateTime;
|
||||
protected readonly int? _NormalizedPixelPercentage;
|
||||
protected readonly PersonBirthday? _PersonBirthday;
|
||||
protected readonly double? _PixelPercentage;
|
||||
public bool? IsWrongYear => _IsWrongYear;
|
||||
public DateTime MinimumDateTime => _MinimumDateTime;
|
||||
public int? NormalizedPixelPercentage => _NormalizedPixelPercentage;
|
||||
public PersonBirthday? PersonBirthday => _PersonBirthday;
|
||||
public double? PixelPercentage => _PixelPercentage;
|
||||
|
||||
[JsonConstructor]
|
||||
public Named(bool? isWrongYear, DateTime minimumDateTime, PersonBirthday? personBirthday, double? pixelPercentage)
|
||||
public Named(bool? isWrongYear, DateTime minimumDateTime, int? normalizedPixelPercentage, PersonBirthday? personBirthday)
|
||||
{
|
||||
_IsWrongYear = isWrongYear;
|
||||
_MinimumDateTime = minimumDateTime;
|
||||
_NormalizedPixelPercentage = normalizedPixelPercentage;
|
||||
_PersonBirthday = personBirthday;
|
||||
_PixelPercentage = pixelPercentage;
|
||||
}
|
||||
|
||||
public Named(bool? isWrongYear, DateTime minimumDateTime, PersonBirthday? personBirthday) :
|
||||
this(isWrongYear, minimumDateTime, null, personBirthday)
|
||||
{ }
|
||||
|
||||
private static float GetDeterministicHashCodeFileName(int id, int normalizedPixelPercentage)
|
||||
=> float.Parse($"{id}.{normalizedPixelPercentage}");
|
||||
|
||||
public static float GetDeterministicHashCodeKey(Item item, Closest closest)
|
||||
{
|
||||
float result;
|
||||
if (item.Property?.Id is null || item.ImageFileHolder is null || closest.NormalizedPixelPercentage is null)
|
||||
throw new NullReferenceException();
|
||||
result = GetDeterministicHashCodeFileName(item.Property.Id.Value, closest.NormalizedPixelPercentage.Value);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static float GetDeterministicHashCodeKey(Item item, IFace face)
|
||||
{
|
||||
float result;
|
||||
if (item.Property?.Id is null || item.ImageFileHolder is null || face.Location?.NormalizedPixelPercentage is null)
|
||||
throw new NullReferenceException();
|
||||
result = GetDeterministicHashCodeFileName(item.Property.Id.Value, face.Location.NormalizedPixelPercentage.Value);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static float? GetReversedDeterministicHashCode(Dictionary<int, List<IFace>> keyValuePairs, string fileName)
|
||||
{
|
||||
float? result;
|
||||
string[] segments = fileName.Split('.');
|
||||
if (segments.Length < 2)
|
||||
throw new Exception();
|
||||
string id = segments[0];
|
||||
string normalizedPixelPercentage;
|
||||
if (!id.Contains('-'))
|
||||
normalizedPixelPercentage = segments[1];
|
||||
else
|
||||
{
|
||||
segments = fileName.Split(' ');
|
||||
if (segments.Length < 3)
|
||||
throw new Exception();
|
||||
id = segments[2];
|
||||
string locationIdex = segments[0];
|
||||
if (int.TryParse(id, out int idValue) && int.TryParse(locationIdex, out int locationIndexValue) && keyValuePairs.ContainsKey(idValue) && keyValuePairs[idValue].Count > locationIndexValue)
|
||||
normalizedPixelPercentage = string.Concat(keyValuePairs[idValue][locationIndexValue].Location.NormalizedPixelPercentage);
|
||||
else
|
||||
{
|
||||
id = string.Empty;
|
||||
normalizedPixelPercentage = string.Empty;
|
||||
}
|
||||
}
|
||||
if (!float.TryParse(string.Concat(id, '.', normalizedPixelPercentage), out float resultValue))
|
||||
result = null;
|
||||
else
|
||||
result = resultValue;
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
@ -7,6 +7,7 @@ using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
using View_by_Distance.Property.Models.Stateless;
|
||||
using View_by_Distance.Shared.Models.Properties;
|
||||
using View_by_Distance.Shared.Models.Stateless;
|
||||
|
||||
namespace View_by_Distance.Property.Models;
|
||||
@ -18,17 +19,21 @@ public class PropertyLogic
|
||||
protected readonly List<string> _ExceptionsDirectories;
|
||||
protected readonly Dictionary<int, int[]> _KeyValuePairs;
|
||||
protected readonly Dictionary<int, int[]> _IndicesFromNew;
|
||||
protected readonly string _DeterministicHashCodeRootDirectory;
|
||||
protected readonly Dictionary<int, string[]> _SixCharacterNamedFaceInfo;
|
||||
protected readonly List<string> _NamedDeterministicHashCodeIdAndFaceLocationIndex;
|
||||
protected readonly Dictionary<int, string[]> _NamedFaceInfoDeterministicHashCodeIds;
|
||||
protected readonly Dictionary<int, string[]> _NamedFaceInfoDeterministicHashCodeKeyValuePairs;
|
||||
protected readonly Dictionary<float, string[]> _NamedDeterministicHashCodeKeyValuePairs;
|
||||
protected readonly Dictionary<float, string[]> _IncorrectDeterministicHashCodeKeyValuePairs;
|
||||
|
||||
public bool Reverse { get; }
|
||||
public List<string> AngleBracketCollection { get; }
|
||||
public Dictionary<int, int[]> KeyValuePairs => _KeyValuePairs;
|
||||
public Dictionary<int, int[]> IndicesFromNew => _IndicesFromNew;
|
||||
public List<string> ExceptionsDirectories => _ExceptionsDirectories;
|
||||
public Dictionary<int, string[]> NamedFaceInfoDeterministicHashCodeIds => _NamedFaceInfoDeterministicHashCodeIds;
|
||||
public List<string> NamedDeterministicHashCodeIdAndFaceLocationIndex => _NamedDeterministicHashCodeIdAndFaceLocationIndex;
|
||||
public string DeterministicHashCodeRootDirectory => _DeterministicHashCodeRootDirectory;
|
||||
public Dictionary<float, string[]> NamedDeterministicHashCodeKeyValuePairs => _NamedDeterministicHashCodeKeyValuePairs;
|
||||
public Dictionary<float, string[]> IncorrectDeterministicHashCodeKeyValuePairs => _IncorrectDeterministicHashCodeKeyValuePairs;
|
||||
public Dictionary<int, string[]> NamedFaceInfoDeterministicHashCodeKeyValuePairs => _NamedFaceInfoDeterministicHashCodeKeyValuePairs;
|
||||
|
||||
private readonly Model? _Model;
|
||||
private readonly Serilog.ILogger? _Log;
|
||||
@ -51,7 +56,7 @@ public class PropertyLogic
|
||||
AngleBracketCollection = new List<string>();
|
||||
_Log = Serilog.Log.ForContext<A_Property>();
|
||||
_MaxDegreeOfParallelism = maxDegreeOfParallelism;
|
||||
Dictionary<int, string[]>? namedFaceInfoDeterministicHashCodeIndices;
|
||||
Dictionary<int, string[]>? namedFaceInfoDeterministicHashCode;
|
||||
_WriteIndentedJsonSerializerOptions = new JsonSerializerOptions { WriteIndented = true };
|
||||
if (configuration.VerifyToSeason is null || !configuration.VerifyToSeason.Any())
|
||||
throw new Exception();
|
||||
@ -59,41 +64,29 @@ public class PropertyLogic
|
||||
string json;
|
||||
string[] files;
|
||||
string fullPath;
|
||||
List<string> namedDeterministicHashCodeIdAndFaceLocationIndex = new();
|
||||
Dictionary<int, int[]>? keyValuePairs;
|
||||
string deterministicHashCodeRootDirectory;
|
||||
List<KeyValuePair<int, int[]>>? collection;
|
||||
Dictionary<int, int[]> indicesFromNew = new();
|
||||
Dictionary<int, string[]>? sixCharacterNamedFaceInfo;
|
||||
Dictionary<float, string[]> namedDeterministicHashCode = new();
|
||||
Dictionary<float, string[]> incorrectDeterministicHashCode = new();
|
||||
string? rootDirectoryParent = Path.GetDirectoryName(configuration.RootDirectory);
|
||||
if (string.IsNullOrEmpty(rootDirectoryParent))
|
||||
throw new NullReferenceException(nameof(rootDirectoryParent));
|
||||
files = Directory.GetFiles(rootDirectoryParent, "*DeterministicHashCode*.json", SearchOption.TopDirectoryOnly);
|
||||
if (files.Length != 1)
|
||||
namedFaceInfoDeterministicHashCodeIndices = new();
|
||||
namedFaceInfoDeterministicHashCode = new();
|
||||
else
|
||||
{
|
||||
json = File.ReadAllText(files[0]);
|
||||
namedFaceInfoDeterministicHashCodeIndices = JsonSerializer.Deserialize<Dictionary<int, string[]>>(json);
|
||||
if (namedFaceInfoDeterministicHashCodeIndices is null)
|
||||
throw new NullReferenceException(nameof(namedFaceInfoDeterministicHashCodeIndices));
|
||||
namedFaceInfoDeterministicHashCode = JsonSerializer.Deserialize<Dictionary<int, string[]>>(json);
|
||||
if (namedFaceInfoDeterministicHashCode is null)
|
||||
throw new NullReferenceException(nameof(namedFaceInfoDeterministicHashCode));
|
||||
}
|
||||
if (namedFaceInfoDeterministicHashCodeIndices.Any())
|
||||
{
|
||||
sixCharacterNamedFaceInfo = new();
|
||||
string[] directories = Directory.GetDirectories(rootDirectoryParent, "*DeterministicHashCode*", SearchOption.TopDirectoryOnly);
|
||||
if (directories.Any())
|
||||
{
|
||||
Dictionary<int, string[]> ticksKeyValuePairs = GetKeyValuePairs(namedDeterministicHashCodeIdAndFaceLocationIndex, directories[0]);
|
||||
foreach (KeyValuePair<int, string[]> keyValuePair in ticksKeyValuePairs)
|
||||
{
|
||||
if (namedFaceInfoDeterministicHashCodeIndices.ContainsKey(keyValuePair.Key))
|
||||
continue;
|
||||
namedFaceInfoDeterministicHashCodeIndices.Add(keyValuePair.Key, keyValuePair.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
if (namedFaceInfoDeterministicHashCode.Any())
|
||||
{
|
||||
deterministicHashCodeRootDirectory = string.Empty;
|
||||
files = Directory.GetFiles(rootDirectoryParent, "*SixCharacter*.json", SearchOption.TopDirectoryOnly);
|
||||
if (files.Length != 1)
|
||||
sixCharacterNamedFaceInfo = new();
|
||||
@ -105,6 +98,19 @@ public class PropertyLogic
|
||||
throw new NullReferenceException(nameof(sixCharacterNamedFaceInfo));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sixCharacterNamedFaceInfo = new();
|
||||
string[] directories = Directory.GetDirectories(rootDirectoryParent, "*DeterministicHashCode*", SearchOption.TopDirectoryOnly);
|
||||
if (!directories.Any())
|
||||
deterministicHashCodeRootDirectory = string.Empty;
|
||||
else
|
||||
{
|
||||
Dictionary<int, List<IFace>> faces = new();
|
||||
deterministicHashCodeRootDirectory = directories[0];
|
||||
SetKeyValuePairs(deterministicHashCodeRootDirectory, namedDeterministicHashCode, incorrectDeterministicHashCode, faces);
|
||||
}
|
||||
}
|
||||
files = Directory.GetFiles(rootDirectoryParent, "*keyValuePairs*.json", SearchOption.TopDirectoryOnly);
|
||||
if (files.Length != 1)
|
||||
keyValuePairs = new();
|
||||
@ -133,26 +139,25 @@ public class PropertyLogic
|
||||
indicesFromNew.Add(keyValuePair.Key, keyValuePair.Value);
|
||||
}
|
||||
}
|
||||
_NamedDeterministicHashCodeIdAndFaceLocationIndex = namedDeterministicHashCodeIdAndFaceLocationIndex;
|
||||
_KeyValuePairs = keyValuePairs;
|
||||
_IndicesFromNew = indicesFromNew;
|
||||
_SixCharacterNamedFaceInfo = sixCharacterNamedFaceInfo;
|
||||
_NamedFaceInfoDeterministicHashCodeIds = namedFaceInfoDeterministicHashCodeIndices;
|
||||
_NamedDeterministicHashCodeKeyValuePairs = namedDeterministicHashCode;
|
||||
_DeterministicHashCodeRootDirectory = deterministicHashCodeRootDirectory;
|
||||
_IncorrectDeterministicHashCodeKeyValuePairs = incorrectDeterministicHashCode;
|
||||
_NamedFaceInfoDeterministicHashCodeKeyValuePairs = namedFaceInfoDeterministicHashCode;
|
||||
}
|
||||
|
||||
private static Dictionary<int, string[]> GetKeyValuePairs(List<string> namedDeterministicHashCodeIdAndFaceLocationIndex, string rootDirectory)
|
||||
private static void SetKeyValuePairs(string deterministicHashCodeRootDirectory, List<(string, float)> named, List<(string, float)> incorrect, Dictionary<int, List<IFace>> keyValuePairs)
|
||||
{
|
||||
Dictionary<int, string[]> results = new();
|
||||
string id;
|
||||
string[] files;
|
||||
string fileName;
|
||||
string personKey;
|
||||
string[] segments;
|
||||
string faceLocationIndex;
|
||||
string[] yearDirectories;
|
||||
string[] personKeyDirectories;
|
||||
string[] personNameDirectories;
|
||||
string fileNameWithoutExtension;
|
||||
string[] ticksDirectories = Directory.GetDirectories(rootDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
float? idAndNormalizedPixelPercentage;
|
||||
string[] ticksDirectories = Directory.GetDirectories(deterministicHashCodeRootDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string ticksDirectory in ticksDirectories)
|
||||
{
|
||||
if (!ticksDirectory.EndsWith(')'))
|
||||
@ -164,7 +169,18 @@ public class PropertyLogic
|
||||
yearDirectories = Directory.GetDirectories(personKeyDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string yearDirectory in yearDirectories)
|
||||
{
|
||||
files = Directory.GetFiles(yearDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
personNameDirectories = Directory.GetDirectories(yearDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
foreach (string file in files)
|
||||
{
|
||||
if (file.EndsWith(".lnk"))
|
||||
continue;
|
||||
fileName = Path.GetFileName(file);
|
||||
idAndNormalizedPixelPercentage = Named.GetReversedDeterministicHashCode(keyValuePairs, fileName);
|
||||
if (idAndNormalizedPixelPercentage is null)
|
||||
break;
|
||||
incorrect.Add(new(personKey, idAndNormalizedPixelPercentage.Value));
|
||||
}
|
||||
foreach (string personNameDirectory in personNameDirectories)
|
||||
{
|
||||
files = Directory.GetFiles(personNameDirectory, "*", SearchOption.TopDirectoryOnly);
|
||||
@ -172,24 +188,64 @@ public class PropertyLogic
|
||||
{
|
||||
if (file.EndsWith(".lnk"))
|
||||
continue;
|
||||
fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file);
|
||||
segments = fileNameWithoutExtension.Split(' ');
|
||||
if (segments.Length < 2)
|
||||
continue;
|
||||
id = segments[2];
|
||||
faceLocationIndex = segments[0];
|
||||
if (!int.TryParse(id, out int idValue))
|
||||
continue;
|
||||
namedDeterministicHashCodeIdAndFaceLocationIndex.Add(fileNameWithoutExtension);
|
||||
if (results.ContainsKey(idValue))
|
||||
continue;
|
||||
results.Add(idValue, new string[] { personKey });
|
||||
fileName = Path.GetFileNameWithoutExtension(file);
|
||||
idAndNormalizedPixelPercentage = Named.GetReversedDeterministicHashCode(keyValuePairs, fileName);
|
||||
if (idAndNormalizedPixelPercentage is null)
|
||||
break;
|
||||
named.Add(new(personKey, idAndNormalizedPixelPercentage.Value));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
private static void SetKeyValuePairs(string deterministicHashCodeRootDirectory, Dictionary<float, string[]> namedDeterministicHashCode, Dictionary<float, string[]> incorrectDeterministicHashCode, Dictionary<int, List<IFace>> keyValuePairs)
|
||||
{
|
||||
Dictionary<float, List<string>> namedKeyValuePairs = new();
|
||||
Dictionary<float, List<string>> incorrectKeyValuePairs = new();
|
||||
List<(string PersonKey, float IdAndNormalizedPixelPercentage)> named = new();
|
||||
List<(string PersonKey, float IdAndNormalizedPixelPercentage)> incorrect = new();
|
||||
SetKeyValuePairs(deterministicHashCodeRootDirectory, named, incorrect, keyValuePairs);
|
||||
named = (from l in named orderby l.IdAndNormalizedPixelPercentage select l).ToList();
|
||||
incorrect = (from l in incorrect orderby l.IdAndNormalizedPixelPercentage select l).ToList();
|
||||
foreach ((string personKey, float idAndNormalizedPixelPercentage) in named)
|
||||
{
|
||||
if (!namedKeyValuePairs.ContainsKey(idAndNormalizedPixelPercentage))
|
||||
namedKeyValuePairs.Add(idAndNormalizedPixelPercentage, new());
|
||||
namedKeyValuePairs[idAndNormalizedPixelPercentage].Add(personKey);
|
||||
}
|
||||
foreach ((string personKey, float idAndNormalizedPixelPercentage) in incorrect)
|
||||
{
|
||||
if (!incorrectKeyValuePairs.ContainsKey(idAndNormalizedPixelPercentage))
|
||||
incorrectKeyValuePairs.Add(idAndNormalizedPixelPercentage, new());
|
||||
incorrectKeyValuePairs[idAndNormalizedPixelPercentage].Add(personKey);
|
||||
}
|
||||
foreach (KeyValuePair<float, List<string>> keyValuePair in namedKeyValuePairs)
|
||||
namedDeterministicHashCode.Add(keyValuePair.Key, keyValuePair.Value.Distinct().ToArray());
|
||||
foreach (KeyValuePair<float, List<string>> keyValuePair in incorrectKeyValuePairs)
|
||||
incorrectDeterministicHashCode.Add(keyValuePair.Key, keyValuePair.Value.Distinct().ToArray());
|
||||
}
|
||||
|
||||
public void UpdateKeyValuePairs(List<Container> containers)
|
||||
{
|
||||
Dictionary<int, List<IFace>> keyValuePairs = new();
|
||||
Dictionary<float, string[]> namedDeterministicHashCode = new();
|
||||
Dictionary<float, string[]> incorrectDeterministicHashCode = new();
|
||||
foreach (Container container in containers)
|
||||
{
|
||||
foreach (Item item in container.Items)
|
||||
{
|
||||
if (item.ImageFileHolder is null || item.Property?.Id is null || !item.Faces.Any())
|
||||
continue;
|
||||
keyValuePairs.Add(item.Property.Id.Value, item.Faces);
|
||||
}
|
||||
}
|
||||
SetKeyValuePairs(_DeterministicHashCodeRootDirectory, namedDeterministicHashCode, incorrectDeterministicHashCode, keyValuePairs);
|
||||
foreach (KeyValuePair<float, string[]> keyValuePair in namedDeterministicHashCode)
|
||||
_NamedDeterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value);
|
||||
foreach (KeyValuePair<float, string[]> keyValuePair in incorrectDeterministicHashCode)
|
||||
_IncorrectDeterministicHashCodeKeyValuePairs.Add(keyValuePair.Key, keyValuePair.Value);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
|
@ -13,7 +13,7 @@ public class Container
|
||||
string[] sourceDirectoryFiles;
|
||||
List<string[]> fileCollections = new();
|
||||
if (!topDirectories.Any())
|
||||
topDirectories.AddRange(from l in Directory.GetDirectories(rootDirectory, "*", SearchOption.TopDirectoryOnly) select Path.GetFullPath(l));
|
||||
topDirectories.AddRange(from l in Directory.GetDirectories(rootDirectory, "*", SearchOption.TopDirectoryOnly) orderby Path.GetFileName(l)[..1], l select Path.GetFullPath(l));
|
||||
for (int g = 1; g < 5; g++)
|
||||
{
|
||||
if (g == 4)
|
||||
|
Reference in New Issue
Block a user