From 4e5ca3dca6d39e0184c7c39c087c68f2fa212a5c Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Wed, 9 Apr 2025 13:43:39 +0530 Subject: [PATCH] Benchmark face embeddings --- mobile/lib/src/rust/api/simple.dart | 2 + mobile/lib/src/rust/api/usearch_api.dart | 21 +- mobile/lib/src/rust/frb_generated.dart | 703 ++++++++---------- mobile/lib/src/rust/frb_generated.io.dart | 86 +-- mobile/lib/src/rust/frb_generated.web.dart | 112 ++- .../debug/ml_debug_section_widget.dart | 103 +++ mobile/rust/src/api/usearch_api.rs | 13 + mobile/rust/src/frb_generated.rs | 105 ++- 8 files changed, 616 insertions(+), 529 deletions(-) diff --git a/mobile/lib/src/rust/api/simple.dart b/mobile/lib/src/rust/api/simple.dart index 5f6b233313..17c34a531c 100644 --- a/mobile/lib/src/rust/api/simple.dart +++ b/mobile/lib/src/rust/api/simple.dart @@ -1,6 +1,8 @@ // This file is automatically generated, so please do not edit it. // @generated by `flutter_rust_bridge`@ 2.9.0. +// ignore_for_file: require_trailing_commas + // ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; diff --git a/mobile/lib/src/rust/api/usearch_api.dart b/mobile/lib/src/rust/api/usearch_api.dart index 777d513f9f..7e3fa3d780 100644 --- a/mobile/lib/src/rust/api/usearch_api.dart +++ b/mobile/lib/src/rust/api/usearch_api.dart @@ -1,6 +1,8 @@ // This file is automatically generated, so please do not edit it. // @generated by `flutter_rust_bridge`@ 2.9.0. +// ignore_for_file: require_trailing_commas + // ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; @@ -12,10 +14,11 @@ import 'package:photos/src/rust/frb_generated.dart'; abstract class VectorDb implements RustOpaqueInterface { Future addVector({required BigInt key, required List vector}); - Future bulkAddVectors({ - required Uint64List keys, - required List vectors, - }); + Future bulkAddVectors( + {required Uint64List keys, required List vectors}); + + Future> bulkSearchVectors( + {required List queries, required BigInt count}); Future deleteIndex(); @@ -25,16 +28,12 @@ abstract class VectorDb implements RustOpaqueInterface { factory VectorDb({required String filePath, required BigInt dimensions}) => RustLib.instance.api.crateApiUsearchApiVectorDbNew( - filePath: filePath, - dimensions: dimensions, - ); + filePath: filePath, dimensions: dimensions); Future removeVector({required BigInt key}); Future resetIndex(); - Future<(Uint64List, Float32List)> searchVectors({ - required List query, - required BigInt count, - }); + Future<(Uint64List, Float32List)> searchVectors( + {required List query, required BigInt count}); } diff --git a/mobile/lib/src/rust/frb_generated.dart b/mobile/lib/src/rust/frb_generated.dart index 43a9c90c4b..bf3551a6ee 100644 --- a/mobile/lib/src/rust/frb_generated.dart +++ b/mobile/lib/src/rust/frb_generated.dart @@ -1,6 +1,8 @@ // This file is automatically generated, so please do not edit it. // @generated by `flutter_rust_bridge`@ 2.9.0. +// ignore_for_file: require_trailing_commas + // ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field import 'dart:async'; @@ -70,7 +72,7 @@ class RustLib extends BaseEntrypoint { String get codegenVersion => '2.9.0'; @override - int get rustContentHash => 862168794; + int get rustContentHash => -674813457; static const kDefaultExternalLibraryLoaderConfig = ExternalLibraryLoaderConfig( @@ -81,45 +83,41 @@ class RustLib extends BaseEntrypoint { } abstract class RustLibApi extends BaseApi { - Future crateApiUsearchApiVectorDbAddVector({ - required VectorDb that, - required BigInt key, - required List vector, - }); + Future crateApiUsearchApiVectorDbAddVector( + {required VectorDb that, + required BigInt key, + required List vector}); - Future crateApiUsearchApiVectorDbBulkAddVectors({ - required VectorDb that, - required Uint64List keys, - required List vectors, - }); + Future crateApiUsearchApiVectorDbBulkAddVectors( + {required VectorDb that, + required Uint64List keys, + required List vectors}); + + Future> crateApiUsearchApiVectorDbBulkSearchVectors( + {required VectorDb that, + required List queries, + required BigInt count}); Future crateApiUsearchApiVectorDbDeleteIndex({required VectorDb that}); Future<(BigInt, BigInt, BigInt, BigInt, BigInt)> crateApiUsearchApiVectorDbGetIndexStats({required VectorDb that}); - Future crateApiUsearchApiVectorDbGetVector({ - required VectorDb that, - required BigInt key, - }); + Future crateApiUsearchApiVectorDbGetVector( + {required VectorDb that, required BigInt key}); - VectorDb crateApiUsearchApiVectorDbNew({ - required String filePath, - required BigInt dimensions, - }); + VectorDb crateApiUsearchApiVectorDbNew( + {required String filePath, required BigInt dimensions}); - Future crateApiUsearchApiVectorDbRemoveVector({ - required VectorDb that, - required BigInt key, - }); + Future crateApiUsearchApiVectorDbRemoveVector( + {required VectorDb that, required BigInt key}); Future crateApiUsearchApiVectorDbResetIndex({required VectorDb that}); - Future<(Uint64List, Float32List)> crateApiUsearchApiVectorDbSearchVectors({ - required VectorDb that, - required List query, - required BigInt count, - }); + Future<(Uint64List, Float32List)> crateApiUsearchApiVectorDbSearchVectors( + {required VectorDb that, + required List query, + required BigInt count}); String crateApiSimpleGreet({required String name}); @@ -143,37 +141,28 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { }); @override - Future crateApiUsearchApiVectorDbAddVector({ - required VectorDb that, - required BigInt key, - required List vector, - }) { - return handler.executeNormal( - NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - that, - serializer, - ); - sse_encode_u_64(key, serializer); - sse_encode_list_prim_f_32_loose(vector, serializer); - pdeCallFfi( - generalizedFrbRustBinding, - serializer, - funcId: 1, - port: port_, - ); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiUsearchApiVectorDbAddVectorConstMeta, - argValues: [that, key, vector], - apiImpl: this, + Future crateApiUsearchApiVectorDbAddVector( + {required VectorDb that, + required BigInt key, + required List vector}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, serializer); + sse_encode_u_64(key, serializer); + sse_encode_list_prim_f_32_loose(vector, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 1, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, ), - ); + constMeta: kCrateApiUsearchApiVectorDbAddVectorConstMeta, + argValues: [that, key, vector], + apiImpl: this, + )); } TaskConstMeta get kCrateApiUsearchApiVectorDbAddVectorConstMeta => @@ -183,37 +172,28 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - Future crateApiUsearchApiVectorDbBulkAddVectors({ - required VectorDb that, - required Uint64List keys, - required List vectors, - }) { - return handler.executeNormal( - NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - that, - serializer, - ); - sse_encode_list_prim_u_64_strict(keys, serializer); - sse_encode_list_list_prim_f_32_strict(vectors, serializer); - pdeCallFfi( - generalizedFrbRustBinding, - serializer, - funcId: 2, - port: port_, - ); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiUsearchApiVectorDbBulkAddVectorsConstMeta, - argValues: [that, keys, vectors], - apiImpl: this, + Future crateApiUsearchApiVectorDbBulkAddVectors( + {required VectorDb that, + required Uint64List keys, + required List vectors}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, serializer); + sse_encode_list_prim_u_64_strict(keys, serializer); + sse_encode_list_list_prim_f_32_strict(vectors, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 2, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, ), - ); + constMeta: kCrateApiUsearchApiVectorDbBulkAddVectorsConstMeta, + argValues: [that, keys, vectors], + apiImpl: this, + )); } TaskConstMeta get kCrateApiUsearchApiVectorDbBulkAddVectorsConstMeta => @@ -223,31 +203,54 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - Future crateApiUsearchApiVectorDbDeleteIndex({required VectorDb that}) { - return handler.executeNormal( - NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - that, - serializer, - ); - pdeCallFfi( - generalizedFrbRustBinding, - serializer, - funcId: 3, - port: port_, - ); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiUsearchApiVectorDbDeleteIndexConstMeta, - argValues: [that], - apiImpl: this, + Future> crateApiUsearchApiVectorDbBulkSearchVectors( + {required VectorDb that, + required List queries, + required BigInt count}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, serializer); + sse_encode_list_list_prim_f_32_strict(queries, serializer); + sse_encode_usize(count, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 3, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_list_prim_u_64_strict, + decodeErrorData: null, ), - ); + constMeta: kCrateApiUsearchApiVectorDbBulkSearchVectorsConstMeta, + argValues: [that, queries, count], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiUsearchApiVectorDbBulkSearchVectorsConstMeta => + const TaskConstMeta( + debugName: "VectorDb_bulk_search_vectors", + argNames: ["that", "queries", "count"], + ); + + @override + Future crateApiUsearchApiVectorDbDeleteIndex({required VectorDb that}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 4, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiUsearchApiVectorDbDeleteIndexConstMeta, + argValues: [that], + apiImpl: this, + )); } TaskConstMeta get kCrateApiUsearchApiVectorDbDeleteIndexConstMeta => @@ -259,30 +262,22 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @override Future<(BigInt, BigInt, BigInt, BigInt, BigInt)> crateApiUsearchApiVectorDbGetIndexStats({required VectorDb that}) { - return handler.executeNormal( - NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - that, - serializer, - ); - pdeCallFfi( - generalizedFrbRustBinding, - serializer, - funcId: 4, - port: port_, - ); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_record_usize_usize_usize_usize_usize, - decodeErrorData: null, - ), - constMeta: kCrateApiUsearchApiVectorDbGetIndexStatsConstMeta, - argValues: [that], - apiImpl: this, + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 5, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_record_usize_usize_usize_usize_usize, + decodeErrorData: null, ), - ); + constMeta: kCrateApiUsearchApiVectorDbGetIndexStatsConstMeta, + argValues: [that], + apiImpl: this, + )); } TaskConstMeta get kCrateApiUsearchApiVectorDbGetIndexStatsConstMeta => @@ -292,35 +287,25 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - Future crateApiUsearchApiVectorDbGetVector({ - required VectorDb that, - required BigInt key, - }) { - return handler.executeNormal( - NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - that, - serializer, - ); - sse_encode_u_64(key, serializer); - pdeCallFfi( - generalizedFrbRustBinding, - serializer, - funcId: 5, - port: port_, - ); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_list_prim_f_32_strict, - decodeErrorData: null, - ), - constMeta: kCrateApiUsearchApiVectorDbGetVectorConstMeta, - argValues: [that, key], - apiImpl: this, + Future crateApiUsearchApiVectorDbGetVector( + {required VectorDb that, required BigInt key}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, serializer); + sse_encode_u_64(key, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 6, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_list_prim_f_32_strict, + decodeErrorData: null, ), - ); + constMeta: kCrateApiUsearchApiVectorDbGetVectorConstMeta, + argValues: [that, key], + apiImpl: this, + )); } TaskConstMeta get kCrateApiUsearchApiVectorDbGetVectorConstMeta => @@ -330,28 +315,24 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - VectorDb crateApiUsearchApiVectorDbNew({ - required String filePath, - required BigInt dimensions, - }) { - return handler.executeSync( - SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(filePath, serializer); - sse_encode_usize(dimensions, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 6)!; - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB, - decodeErrorData: null, - ), - constMeta: kCrateApiUsearchApiVectorDbNewConstMeta, - argValues: [filePath, dimensions], - apiImpl: this, + VectorDb crateApiUsearchApiVectorDbNew( + {required String filePath, required BigInt dimensions}) { + return handler.executeSync(SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(filePath, serializer); + sse_encode_usize(dimensions, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 7)!; + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB, + decodeErrorData: null, ), - ); + constMeta: kCrateApiUsearchApiVectorDbNewConstMeta, + argValues: [filePath, dimensions], + apiImpl: this, + )); } TaskConstMeta get kCrateApiUsearchApiVectorDbNewConstMeta => @@ -361,35 +342,25 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - Future crateApiUsearchApiVectorDbRemoveVector({ - required VectorDb that, - required BigInt key, - }) { - return handler.executeNormal( - NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - that, - serializer, - ); - sse_encode_u_64(key, serializer); - pdeCallFfi( - generalizedFrbRustBinding, - serializer, - funcId: 7, - port: port_, - ); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_usize, - decodeErrorData: null, - ), - constMeta: kCrateApiUsearchApiVectorDbRemoveVectorConstMeta, - argValues: [that, key], - apiImpl: this, + Future crateApiUsearchApiVectorDbRemoveVector( + {required VectorDb that, required BigInt key}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, serializer); + sse_encode_u_64(key, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 8, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_usize, + decodeErrorData: null, ), - ); + constMeta: kCrateApiUsearchApiVectorDbRemoveVectorConstMeta, + argValues: [that, key], + apiImpl: this, + )); } TaskConstMeta get kCrateApiUsearchApiVectorDbRemoveVectorConstMeta => @@ -400,30 +371,22 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @override Future crateApiUsearchApiVectorDbResetIndex({required VectorDb that}) { - return handler.executeNormal( - NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - that, - serializer, - ); - pdeCallFfi( - generalizedFrbRustBinding, - serializer, - funcId: 8, - port: port_, - ); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiUsearchApiVectorDbResetIndexConstMeta, - argValues: [that], - apiImpl: this, + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 9, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, ), - ); + constMeta: kCrateApiUsearchApiVectorDbResetIndexConstMeta, + argValues: [that], + apiImpl: this, + )); } TaskConstMeta get kCrateApiUsearchApiVectorDbResetIndexConstMeta => @@ -433,38 +396,29 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - Future<(Uint64List, Float32List)> crateApiUsearchApiVectorDbSearchVectors({ - required VectorDb that, - required List query, - required BigInt count, - }) { - return handler.executeNormal( - NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - that, - serializer, - ); - sse_encode_list_prim_f_32_loose(query, serializer); - sse_encode_usize(count, serializer); - pdeCallFfi( - generalizedFrbRustBinding, - serializer, - funcId: 9, - port: port_, - ); - }, - codec: SseCodec( - decodeSuccessData: - sse_decode_record_list_prim_u_64_strict_list_prim_f_32_strict, - decodeErrorData: null, - ), - constMeta: kCrateApiUsearchApiVectorDbSearchVectorsConstMeta, - argValues: [that, query, count], - apiImpl: this, + Future<(Uint64List, Float32List)> crateApiUsearchApiVectorDbSearchVectors( + {required VectorDb that, + required List query, + required BigInt count}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + that, serializer); + sse_encode_list_prim_f_32_loose(query, serializer); + sse_encode_usize(count, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 10, port: port_); + }, + codec: SseCodec( + decodeSuccessData: + sse_decode_record_list_prim_u_64_strict_list_prim_f_32_strict, + decodeErrorData: null, ), - ); + constMeta: kCrateApiUsearchApiVectorDbSearchVectorsConstMeta, + argValues: [that, query, count], + apiImpl: this, + )); } TaskConstMeta get kCrateApiUsearchApiVectorDbSearchVectorsConstMeta => @@ -475,22 +429,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @override String crateApiSimpleGreet({required String name}) { - return handler.executeSync( - SyncTask( - callFfi: () { - final serializer = SseSerializer(generalizedFrbRustBinding); - sse_encode_String(name, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 10)!; - }, - codec: SseCodec( - decodeSuccessData: sse_decode_String, - decodeErrorData: null, - ), - constMeta: kCrateApiSimpleGreetConstMeta, - argValues: [name], - apiImpl: this, + return handler.executeSync(SyncTask( + callFfi: () { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_String(name, serializer); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 11)!; + }, + codec: SseCodec( + decodeSuccessData: sse_decode_String, + decodeErrorData: null, ), - ); + constMeta: kCrateApiSimpleGreetConstMeta, + argValues: [name], + apiImpl: this, + )); } TaskConstMeta get kCrateApiSimpleGreetConstMeta => const TaskConstMeta( @@ -500,26 +452,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @override Future crateApiSimpleInitApp() { - return handler.executeNormal( - NormalTask( - callFfi: (port_) { - final serializer = SseSerializer(generalizedFrbRustBinding); - pdeCallFfi( - generalizedFrbRustBinding, - serializer, - funcId: 11, - port: port_, - ); - }, - codec: SseCodec( - decodeSuccessData: sse_decode_unit, - decodeErrorData: null, - ), - constMeta: kCrateApiSimpleInitAppConstMeta, - argValues: [], - apiImpl: this, + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 12, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, ), - ); + constMeta: kCrateApiSimpleInitAppConstMeta, + argValues: [], + apiImpl: this, + )); } TaskConstMeta get kCrateApiSimpleInitAppConstMeta => const TaskConstMeta( @@ -538,8 +484,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected VectorDb dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - dynamic raw, - ) { + dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return VectorDbImpl.frbInternalDcoDecode(raw as List); } @@ -547,8 +492,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected VectorDb dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - dynamic raw, - ) { + dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return VectorDbImpl.frbInternalDcoDecode(raw as List); } @@ -556,8 +500,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected VectorDb dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - dynamic raw, - ) { + dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return VectorDbImpl.frbInternalDcoDecode(raw as List); } @@ -582,6 +525,14 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { .toList(); } + @protected + List dco_decode_list_list_prim_u_64_strict(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return (raw as List) + .map(dco_decode_list_prim_u_64_strict) + .toList(); + } + @protected List dco_decode_list_prim_f_32_loose(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -666,37 +617,28 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected VectorDb sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - SseDeserializer deserializer, - ) { + SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs return VectorDbImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), - sse_decode_i_32(deserializer), - ); + sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); } @protected VectorDb sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - SseDeserializer deserializer, - ) { + SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs return VectorDbImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), - sse_decode_i_32(deserializer), - ); + sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); } @protected VectorDb sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - SseDeserializer deserializer, - ) { + SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs return VectorDbImpl.frbInternalSseDecode( - sse_decode_usize(deserializer), - sse_decode_i_32(deserializer), - ); + sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); } @protected @@ -714,8 +656,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected List sse_decode_list_list_prim_f_32_strict( - SseDeserializer deserializer, - ) { + SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs final len_ = sse_decode_i_32(deserializer); @@ -726,6 +667,19 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return ans_; } + @protected + List sse_decode_list_list_prim_u_64_strict( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + final len_ = sse_decode_i_32(deserializer); + final ans_ = []; + for (var idx_ = 0; idx_ < len_; ++idx_) { + ans_.add(sse_decode_list_prim_u_64_strict(deserializer)); + } + return ans_; + } + @protected List sse_decode_list_prim_f_32_loose(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -757,8 +711,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected (Uint64List, Float32List) sse_decode_record_list_prim_u_64_strict_list_prim_f_32_strict( - SseDeserializer deserializer, - ) { + SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs final var_field0 = sse_decode_list_prim_u_64_strict(deserializer); final var_field1 = sse_decode_list_prim_f_32_strict(deserializer); @@ -768,8 +721,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected (BigInt, BigInt, BigInt, BigInt, BigInt) sse_decode_record_usize_usize_usize_usize_usize( - SseDeserializer deserializer, - ) { + SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs final var_field0 = sse_decode_usize(deserializer); final var_field1 = sse_decode_usize(deserializer); @@ -817,40 +769,28 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - VectorDb self, - SseSerializer serializer, - ) { + VectorDb self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as VectorDbImpl).frbInternalSseEncode(move: true), - serializer, - ); + (self as VectorDbImpl).frbInternalSseEncode(move: true), serializer); } @protected void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - VectorDb self, - SseSerializer serializer, - ) { + VectorDb self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as VectorDbImpl).frbInternalSseEncode(move: false), - serializer, - ); + (self as VectorDbImpl).frbInternalSseEncode(move: false), serializer); } @protected void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - VectorDb self, - SseSerializer serializer, - ) { + VectorDb self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize( - (self as VectorDbImpl).frbInternalSseEncode(move: null), - serializer, - ); + (self as VectorDbImpl).frbInternalSseEncode(move: null), serializer); } @protected @@ -867,9 +807,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_list_prim_f_32_strict( - List self, - SseSerializer serializer, - ) { + List self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); for (final item in self) { @@ -877,23 +815,28 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } } + @protected + void sse_encode_list_list_prim_u_64_strict( + List self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_i_32(self.length, serializer); + for (final item in self) { + sse_encode_list_prim_u_64_strict(item, serializer); + } + } + @protected void sse_encode_list_prim_f_32_loose( - List self, - SseSerializer serializer, - ) { + List self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); serializer.buffer.putFloat32List( - self is Float32List ? self : Float32List.fromList(self), - ); + self is Float32List ? self : Float32List.fromList(self)); } @protected void sse_encode_list_prim_f_32_strict( - Float32List self, - SseSerializer serializer, - ) { + Float32List self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); serializer.buffer.putFloat32List(self); @@ -901,9 +844,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_prim_u_64_strict( - Uint64List self, - SseSerializer serializer, - ) { + Uint64List self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); serializer.buffer.putUint64List(self); @@ -911,9 +852,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_list_prim_u_8_strict( - Uint8List self, - SseSerializer serializer, - ) { + Uint8List self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_i_32(self.length, serializer); serializer.buffer.putUint8List(self); @@ -921,9 +860,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_list_prim_u_64_strict_list_prim_f_32_strict( - (Uint64List, Float32List) self, - SseSerializer serializer, - ) { + (Uint64List, Float32List) self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_list_prim_u_64_strict(self.$1, serializer); sse_encode_list_prim_f_32_strict(self.$2, serializer); @@ -931,9 +868,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { @protected void sse_encode_record_usize_usize_usize_usize_usize( - (BigInt, BigInt, BigInt, BigInt, BigInt) self, - SseSerializer serializer, - ) { + (BigInt, BigInt, BigInt, BigInt, BigInt) self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_usize(self.$1, serializer); sse_encode_usize(self.$2, serializer); @@ -999,20 +934,17 @@ class VectorDbImpl extends RustOpaque implements VectorDb { Future addVector({required BigInt key, required List vector}) => RustLib.instance.api.crateApiUsearchApiVectorDbAddVector( - that: this, - key: key, - vector: vector, - ); + that: this, key: key, vector: vector); - Future bulkAddVectors({ - required Uint64List keys, - required List vectors, - }) => + Future bulkAddVectors( + {required Uint64List keys, required List vectors}) => RustLib.instance.api.crateApiUsearchApiVectorDbBulkAddVectors( - that: this, - keys: keys, - vectors: vectors, - ); + that: this, keys: keys, vectors: vectors); + + Future> bulkSearchVectors( + {required List queries, required BigInt count}) => + RustLib.instance.api.crateApiUsearchApiVectorDbBulkSearchVectors( + that: this, queries: queries, count: count); Future deleteIndex() => RustLib.instance.api.crateApiUsearchApiVectorDbDeleteIndex( @@ -1035,13 +967,8 @@ class VectorDbImpl extends RustOpaque implements VectorDb { that: this, ); - Future<(Uint64List, Float32List)> searchVectors({ - required List query, - required BigInt count, - }) => + Future<(Uint64List, Float32List)> searchVectors( + {required List query, required BigInt count}) => RustLib.instance.api.crateApiUsearchApiVectorDbSearchVectors( - that: this, - query: query, - count: count, - ); + that: this, query: query, count: count); } diff --git a/mobile/lib/src/rust/frb_generated.io.dart b/mobile/lib/src/rust/frb_generated.io.dart index 418d7cdae7..440796cf32 100644 --- a/mobile/lib/src/rust/frb_generated.io.dart +++ b/mobile/lib/src/rust/frb_generated.io.dart @@ -1,6 +1,8 @@ // This file is automatically generated, so please do not edit it. // @generated by `flutter_rust_bridge`@ 2.9.0. +// ignore_for_file: require_trailing_commas + // ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field import 'dart:async'; @@ -26,20 +28,17 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected VectorDb dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - dynamic raw, - ); + dynamic raw); @protected VectorDb dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - dynamic raw, - ); + dynamic raw); @protected VectorDb dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - dynamic raw, - ); + dynamic raw); @protected String dco_decode_String(dynamic raw); @@ -50,6 +49,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected List dco_decode_list_list_prim_f_32_strict(dynamic raw); + @protected + List dco_decode_list_list_prim_u_64_strict(dynamic raw); + @protected List dco_decode_list_prim_f_32_loose(dynamic raw); @@ -87,20 +89,17 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected VectorDb sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - SseDeserializer deserializer, - ); + SseDeserializer deserializer); @protected VectorDb sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - SseDeserializer deserializer, - ); + SseDeserializer deserializer); @protected VectorDb sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - SseDeserializer deserializer, - ); + SseDeserializer deserializer); @protected String sse_decode_String(SseDeserializer deserializer); @@ -110,8 +109,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected List sse_decode_list_list_prim_f_32_strict( - SseDeserializer deserializer, - ); + SseDeserializer deserializer); + + @protected + List sse_decode_list_list_prim_u_64_strict( + SseDeserializer deserializer); @protected List sse_decode_list_prim_f_32_loose(SseDeserializer deserializer); @@ -128,14 +130,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected (Uint64List, Float32List) sse_decode_record_list_prim_u_64_strict_list_prim_f_32_strict( - SseDeserializer deserializer, - ); + SseDeserializer deserializer); @protected (BigInt, BigInt, BigInt, BigInt, BigInt) sse_decode_record_usize_usize_usize_usize_usize( - SseDeserializer deserializer, - ); + SseDeserializer deserializer); @protected BigInt sse_decode_u_64(SseDeserializer deserializer); @@ -158,23 +158,17 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - VectorDb self, - SseSerializer serializer, - ); + VectorDb self, SseSerializer serializer); @protected void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - VectorDb self, - SseSerializer serializer, - ); + VectorDb self, SseSerializer serializer); @protected void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - VectorDb self, - SseSerializer serializer, - ); + VectorDb self, SseSerializer serializer); @protected void sse_encode_String(String self, SseSerializer serializer); @@ -184,45 +178,35 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_list_list_prim_f_32_strict( - List self, - SseSerializer serializer, - ); + List self, SseSerializer serializer); + + @protected + void sse_encode_list_list_prim_u_64_strict( + List self, SseSerializer serializer); @protected void sse_encode_list_prim_f_32_loose( - List self, - SseSerializer serializer, - ); + List self, SseSerializer serializer); @protected void sse_encode_list_prim_f_32_strict( - Float32List self, - SseSerializer serializer, - ); + Float32List self, SseSerializer serializer); @protected void sse_encode_list_prim_u_64_strict( - Uint64List self, - SseSerializer serializer, - ); + Uint64List self, SseSerializer serializer); @protected void sse_encode_list_prim_u_8_strict( - Uint8List self, - SseSerializer serializer, - ); + Uint8List self, SseSerializer serializer); @protected void sse_encode_record_list_prim_u_64_strict_list_prim_f_32_strict( - (Uint64List, Float32List) self, - SseSerializer serializer, - ); + (Uint64List, Float32List) self, SseSerializer serializer); @protected void sse_encode_record_usize_usize_usize_usize_usize( - (BigInt, BigInt, BigInt, BigInt, BigInt) self, - SseSerializer serializer, - ); + (BigInt, BigInt, BigInt, BigInt, BigInt) self, SseSerializer serializer); @protected void sse_encode_u_64(BigInt self, SseSerializer serializer); @@ -268,8 +252,7 @@ class RustLibWire implements BaseWire { late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDBPtr = _lookup)>>( - 'frbgen_photos_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB', - ); + 'frbgen_photos_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB'); late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB = _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDBPtr .asFunction)>(); @@ -285,8 +268,7 @@ class RustLibWire implements BaseWire { late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDBPtr = _lookup)>>( - 'frbgen_photos_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB', - ); + 'frbgen_photos_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB'); late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB = _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDBPtr .asFunction)>(); diff --git a/mobile/lib/src/rust/frb_generated.web.dart b/mobile/lib/src/rust/frb_generated.web.dart index aee8265004..e3f81919d0 100644 --- a/mobile/lib/src/rust/frb_generated.web.dart +++ b/mobile/lib/src/rust/frb_generated.web.dart @@ -1,6 +1,8 @@ // This file is automatically generated, so please do not edit it. // @generated by `flutter_rust_bridge`@ 2.9.0. +// ignore_for_file: require_trailing_commas + // ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field // Static analysis wrongly picks the IO variant, thus ignore this @@ -28,20 +30,17 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected VectorDb dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - dynamic raw, - ); + dynamic raw); @protected VectorDb dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - dynamic raw, - ); + dynamic raw); @protected VectorDb dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - dynamic raw, - ); + dynamic raw); @protected String dco_decode_String(dynamic raw); @@ -52,6 +51,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected List dco_decode_list_list_prim_f_32_strict(dynamic raw); + @protected + List dco_decode_list_list_prim_u_64_strict(dynamic raw); + @protected List dco_decode_list_prim_f_32_loose(dynamic raw); @@ -89,20 +91,17 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected VectorDb sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - SseDeserializer deserializer, - ); + SseDeserializer deserializer); @protected VectorDb sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - SseDeserializer deserializer, - ); + SseDeserializer deserializer); @protected VectorDb sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - SseDeserializer deserializer, - ); + SseDeserializer deserializer); @protected String sse_decode_String(SseDeserializer deserializer); @@ -112,8 +111,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected List sse_decode_list_list_prim_f_32_strict( - SseDeserializer deserializer, - ); + SseDeserializer deserializer); + + @protected + List sse_decode_list_list_prim_u_64_strict( + SseDeserializer deserializer); @protected List sse_decode_list_prim_f_32_loose(SseDeserializer deserializer); @@ -130,14 +132,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected (Uint64List, Float32List) sse_decode_record_list_prim_u_64_strict_list_prim_f_32_strict( - SseDeserializer deserializer, - ); + SseDeserializer deserializer); @protected (BigInt, BigInt, BigInt, BigInt, BigInt) sse_decode_record_usize_usize_usize_usize_usize( - SseDeserializer deserializer, - ); + SseDeserializer deserializer); @protected BigInt sse_decode_u_64(SseDeserializer deserializer); @@ -160,23 +160,17 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - VectorDb self, - SseSerializer serializer, - ); + VectorDb self, SseSerializer serializer); @protected void sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - VectorDb self, - SseSerializer serializer, - ); + VectorDb self, SseSerializer serializer); @protected void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - VectorDb self, - SseSerializer serializer, - ); + VectorDb self, SseSerializer serializer); @protected void sse_encode_String(String self, SseSerializer serializer); @@ -186,45 +180,35 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_list_list_prim_f_32_strict( - List self, - SseSerializer serializer, - ); + List self, SseSerializer serializer); + + @protected + void sse_encode_list_list_prim_u_64_strict( + List self, SseSerializer serializer); @protected void sse_encode_list_prim_f_32_loose( - List self, - SseSerializer serializer, - ); + List self, SseSerializer serializer); @protected void sse_encode_list_prim_f_32_strict( - Float32List self, - SseSerializer serializer, - ); + Float32List self, SseSerializer serializer); @protected void sse_encode_list_prim_u_64_strict( - Uint64List self, - SseSerializer serializer, - ); + Uint64List self, SseSerializer serializer); @protected void sse_encode_list_prim_u_8_strict( - Uint8List self, - SseSerializer serializer, - ); + Uint8List self, SseSerializer serializer); @protected void sse_encode_record_list_prim_u_64_strict_list_prim_f_32_strict( - (Uint64List, Float32List) self, - SseSerializer serializer, - ); + (Uint64List, Float32List) self, SseSerializer serializer); @protected void sse_encode_record_usize_usize_usize_usize_usize( - (BigInt, BigInt, BigInt, BigInt, BigInt) self, - SseSerializer serializer, - ); + (BigInt, BigInt, BigInt, BigInt, BigInt) self, SseSerializer serializer); @protected void sse_encode_u_64(BigInt self, SseSerializer serializer); @@ -250,23 +234,17 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { class RustLibWire implements BaseWire { RustLibWire.fromExternalLibrary(ExternalLibrary lib); - void - rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - int ptr, - ) => - wasmModule - .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - ptr, - ); + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + int ptr) => + wasmModule + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + ptr); - void - rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - int ptr, - ) => - wasmModule - .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - ptr, - ); + void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + int ptr) => + wasmModule + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( + ptr); } @JS('wasm_bindgen') @@ -277,11 +255,9 @@ external RustLibWasmModule get wasmModule; extension type RustLibWasmModule._(JSObject _) implements JSObject { external void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - int ptr, - ); + int ptr); external void rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerVectorDB( - int ptr, - ); + int ptr); } diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index b461eeb86c..f6e82be513 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -1,13 +1,17 @@ import "dart:async"; import "dart:typed_data" show Float32List; +import "package:flutter/foundation.dart" show kDebugMode; import 'package:flutter/material.dart'; import "package:flutter_rust_bridge/flutter_rust_bridge.dart"; import "package:logging/logging.dart"; +import "package:ml_linalg/linalg.dart"; import "package:path_provider/path_provider.dart"; import "package:photos/core/event_bus.dart"; import "package:photos/db/ml/db.dart"; import "package:photos/events/people_changed_event.dart"; +import "package:photos/extensions/stop_watch.dart"; +import "package:photos/generated/protos/ente/common/vector.pb.dart"; import "package:photos/models/ml/face/person.dart"; import "package:photos/service_locator.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; @@ -119,6 +123,105 @@ class _MLDebugSectionWidgetState extends State { }, ), sectionOptionSpacing, + MenuItemWidget( + captionedTextWidget: const CaptionedTextWidget( + title: "Benchmark Vector DB Face", + ), + pressedColor: getEnteColorScheme(context).fillFaint, + trailingIcon: Icons.chevron_right_outlined, + trailingIconIsMuted: true, + onTap: () async { + try { + final w = (kDebugMode ? EnteWatch('MLDebugSectionWidget') : null) + ?..start(); + final persons = await PersonService.instance.getPersons(); + w?.log('get all persons for ${persons.length} persons'); + String laurensID = ''; + for (final person in persons) { + if (person.data.name.toLowerCase().contains('laurens')) { + laurensID = person.remoteID; + } + } + if (laurensID.isEmpty) { + throw Exception('Laurens not found'); + } + final laurensFaceIDs = + await MLDataDB.instance.getFaceIDsForPerson(laurensID); + w?.log( + 'getting all face ids for laurens (${laurensFaceIDs.length} faces)', + ); + final laurensFaceIdToEmbeddingData = await MLDataDB.instance + .getFaceEmbeddingMapForFaces(laurensFaceIDs); + + // Fill the vector DB with all embeddings + final laurensFaceIdToFloat32 = laurensFaceIdToEmbeddingData.map( + (key, value) => MapEntry( + key, + Float32List.fromList(EVector.fromBuffer(value).values), + ), + ); + final keys = Uint64List.fromList( + List.generate( + laurensFaceIdToFloat32.length, + (index) => BigInt.from(index + 1), + ), + ); + final vectorDB = VectorDb( + filePath: (await getApplicationSupportDirectory()).path + + "/ml/test/vector_db_face_index.usearch", + dimensions: BigInt.from( + laurensFaceIdToFloat32.values.first.length, + ), + ); + await vectorDB.resetIndex(); + await vectorDB.bulkAddVectors( + keys: keys, + vectors: laurensFaceIdToFloat32.values.toList(), + ); + + // Benchmarking the vector DB + final queries = laurensFaceIdToFloat32.values.toList(); + final count = BigInt.from(10); + w?.reset(); + final results = await vectorDB.bulkSearchVectors( + queries: queries, + count: count, + ); + + w?.log( + 'Done with ${queries.length * queries.length} (${queries.length} x ${queries.length}}) embeddings comparisons in vector DB', + ); + logger.info( + 'vector db results: ${results.length} results, first: ${results.first}, hundredth: ${results[99]}', + ); + + // Benchmarking our own vector comparisons + final laurensFaceIdToEmbeddingVectors = + laurensFaceIdToEmbeddingData.map( + (key, value) => MapEntry( + key, + Vector.fromList(EVector.fromBuffer(value).values), + ), + ); + final faceVectors = laurensFaceIdToEmbeddingVectors.values; + w?.reset(); + for (final faceVector in faceVectors) { + for (final otherFaceVector in faceVectors) { + final _ = 1 - faceVector.dot(otherFaceVector); + } + } + + w?.log( + 'Done with ${faceVectors.length * faceVectors.length} (${faceVectors.length} x ${faceVectors.length}}) embeddings comparisons in own method', + ); + } catch (e, s) { + logger.warning('vector DB search failed ', e, s); + + await showGenericErrorDialog(context: context, error: e); + } + }, + ), + sectionOptionSpacing, MenuItemWidget( captionedTextWidget: const CaptionedTextWidget( title: "Test rust bridge", diff --git a/mobile/rust/src/api/usearch_api.rs b/mobile/rust/src/api/usearch_api.rs index 891e034526..7deb4b421c 100644 --- a/mobile/rust/src/api/usearch_api.rs +++ b/mobile/rust/src/api/usearch_api.rs @@ -84,6 +84,19 @@ impl VectorDB { (matches.keys, matches.distances) } + pub fn bulk_search_vectors(&self, queries: &Vec>, count: usize) -> Vec> { + let mut keys = Vec::new(); + + for query in queries { + let matches = self + .index + .search(query, count) + .expect("Failed to search vectors"); + keys.push(matches.keys); + } + keys + } + pub fn get_vector(&self, key: u64) -> Vec { let mut vector: Vec = vec![0.0; self.index.dimensions()]; self.index diff --git a/mobile/rust/src/frb_generated.rs b/mobile/rust/src/frb_generated.rs index 6a8d79612b..d27f77f862 100644 --- a/mobile/rust/src/frb_generated.rs +++ b/mobile/rust/src/frb_generated.rs @@ -38,7 +38,7 @@ flutter_rust_bridge::frb_generated_boilerplate!( default_rust_auto_opaque = RustAutoOpaqueMoi, ); pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.9.0"; -pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 862168794; +pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = -674813457; // Section: executor @@ -160,6 +160,63 @@ fn wire__crate__api__usearch_api__VectorDb_bulk_add_vectors_impl( }, ) } +fn wire__crate__api__usearch_api__VectorDb_bulk_search_vectors_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "VectorDb_bulk_search_vectors", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + let api_queries = >>::sse_decode(&mut deserializer); + let api_count = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| { + transform_result_sse::<_, ()>((move || { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![ + flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + ), + ]); + for i in decode_indices_ { + match i { + 0 => api_that_guard = Some(api_that.lockable_decode_sync_ref()), + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok( + crate::api::usearch_api::VectorDB::bulk_search_vectors( + &*api_that_guard, + &api_queries, + api_count, + ), + )?; + Ok(output_ok) + })()) + } + }, + ) +} fn wire__crate__api__usearch_api__VectorDb_delete_index_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, @@ -611,6 +668,18 @@ impl SseDecode for Vec> { } } +impl SseDecode for Vec> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut len_ = ::sse_decode(deserializer); + let mut ans_ = vec![]; + for idx_ in 0..len_ { + ans_.push(>::sse_decode(deserializer)); + } + return ans_; + } +} + impl SseDecode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -729,43 +798,49 @@ fn pde_ffi_dispatcher_primary_impl( rust_vec_len, data_len, ), - 3 => wire__crate__api__usearch_api__VectorDb_delete_index_impl( + 3 => wire__crate__api__usearch_api__VectorDb_bulk_search_vectors_impl( port, ptr, rust_vec_len, data_len, ), - 4 => wire__crate__api__usearch_api__VectorDb_get_index_stats_impl( + 4 => wire__crate__api__usearch_api__VectorDb_delete_index_impl( port, ptr, rust_vec_len, data_len, ), - 5 => wire__crate__api__usearch_api__VectorDb_get_vector_impl( + 5 => wire__crate__api__usearch_api__VectorDb_get_index_stats_impl( port, ptr, rust_vec_len, data_len, ), - 7 => wire__crate__api__usearch_api__VectorDb_remove_vector_impl( + 6 => wire__crate__api__usearch_api__VectorDb_get_vector_impl( port, ptr, rust_vec_len, data_len, ), - 8 => wire__crate__api__usearch_api__VectorDb_reset_index_impl( + 8 => wire__crate__api__usearch_api__VectorDb_remove_vector_impl( port, ptr, rust_vec_len, data_len, ), - 9 => wire__crate__api__usearch_api__VectorDb_search_vectors_impl( + 9 => wire__crate__api__usearch_api__VectorDb_reset_index_impl( port, ptr, rust_vec_len, data_len, ), - 11 => wire__crate__api__simple__init_app_impl(port, ptr, rust_vec_len, data_len), + 10 => wire__crate__api__usearch_api__VectorDb_search_vectors_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 12 => wire__crate__api__simple__init_app_impl(port, ptr, rust_vec_len, data_len), _ => unreachable!(), } } @@ -778,8 +853,8 @@ fn pde_ffi_dispatcher_sync_impl( ) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { // Codec=Pde (Serialization + dispatch), see doc to use other codecs match func_id { - 6 => wire__crate__api__usearch_api__VectorDb_new_impl(ptr, rust_vec_len, data_len), - 10 => wire__crate__api__simple__greet_impl(ptr, rust_vec_len, data_len), + 7 => wire__crate__api__usearch_api__VectorDb_new_impl(ptr, rust_vec_len, data_len), + 11 => wire__crate__api__simple__greet_impl(ptr, rust_vec_len, data_len), _ => unreachable!(), } } @@ -843,6 +918,16 @@ impl SseEncode for Vec> { } } +impl SseEncode for Vec> { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.len() as _, serializer); + for item in self { + >::sse_encode(item, serializer); + } + } +} + impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {