[mob][photos] Faster DB call when sorting suggestions
This commit is contained in:
parent
efb1170b44
commit
7097ce3cf4
|
@ -846,6 +846,21 @@ class FaceMLDataDB {
|
|||
return result;
|
||||
}
|
||||
|
||||
Future<Map<int, (Uint8List, int)>> getClusterToClusterSummary(Iterable<int> clusterIDs) async {
|
||||
final db = await instance.sqliteAsyncDB;
|
||||
final Map<int, (Uint8List, int)> result = {};
|
||||
final rows = await db.getAll(
|
||||
'SELECT * FROM $clusterSummaryTable WHERE $clusterIDColumn IN (${clusterIDs.join(",")})',
|
||||
);
|
||||
for (final r in rows) {
|
||||
final id = r[clusterIDColumn] as int;
|
||||
final avg = r[avgColumn] as Uint8List;
|
||||
final count = r[countColumn] as int;
|
||||
result[id] = (avg, count);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Future<Map<int, String>> getClusterIDToPersonID() async {
|
||||
final db = await instance.database;
|
||||
final List<Map<String, dynamic>> maps = await db.rawQuery(
|
||||
|
|
|
@ -877,21 +877,21 @@ class ClusterFeedbackService {
|
|||
final faceMlDb = FaceMLDataDB.instance;
|
||||
|
||||
// Get the cluster averages for the person's clusters and the suggestions' clusters
|
||||
final Map<int, (Uint8List, int)> clusterToSummary =
|
||||
await faceMlDb.getAllClusterSummary();
|
||||
final personClusters = await faceMlDb.getPersonClusterIDs(person.remoteID);
|
||||
final Map<int, (Uint8List, int)> personClusterToSummary =
|
||||
await faceMlDb.getClusterToClusterSummary(personClusters);
|
||||
final clusterSummaryCallTime = DateTime.now();
|
||||
|
||||
// Calculate the avg embedding of the person
|
||||
final personClusters = await faceMlDb.getPersonClusterIDs(person.remoteID);
|
||||
final personEmbeddingsCount = personClusters
|
||||
.map((e) => clusterToSummary[e]!.$2)
|
||||
.map((e) => personClusterToSummary[e]!.$2)
|
||||
.reduce((a, b) => a + b);
|
||||
final List<double> personAvg = List.filled(192, 0);
|
||||
for (final personClusterID in personClusters) {
|
||||
final personClusterBlob = clusterToSummary[personClusterID]!.$1;
|
||||
final personClusterBlob = personClusterToSummary[personClusterID]!.$1;
|
||||
final personClusterAvg = EVector.fromBuffer(personClusterBlob).values;
|
||||
final clusterWeight =
|
||||
clusterToSummary[personClusterID]!.$2 / personEmbeddingsCount;
|
||||
personClusterToSummary[personClusterID]!.$2 / personEmbeddingsCount;
|
||||
for (int i = 0; i < personClusterAvg.length; i++) {
|
||||
personAvg[i] += personClusterAvg[i] *
|
||||
clusterWeight; // Weighted sum of the cluster averages
|
||||
|
|
Loading…
Reference in a new issue