Skip to content

Commit

Permalink
Added SparseVector class
Browse files Browse the repository at this point in the history
  • Loading branch information
ankane committed Sep 10, 2024
1 parent 977971b commit 1339791
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 4 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## 0.1.1 (unreleased)

- Added `Vector` and `HalfVector` classes
- Added `Vector`, `HalfVector`, and `SparseVector` classes

## 0.1.0 (2023-10-17)

Expand Down
2 changes: 2 additions & 0 deletions lib/pgvector.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ import 'dart:convert';
import 'dart:typed_data';

import 'halfvec.dart';
import 'sparsevec.dart';
import 'vector.dart';

export 'halfvec.dart' show HalfVector;
export 'sparsevec.dart' show SparseVector;
export 'vector.dart' show Vector;

class Pgvector {
Expand Down
28 changes: 28 additions & 0 deletions lib/sparsevec.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
class SparseVector {
final int dimensions;
final List<int> indices;
final List<double> values;

SparseVector._(this.dimensions, this.indices, this.values);

factory SparseVector(List<double> value) {
var dimensions = value.length;
var indices = <int>[];
var values = <double>[];
for (var i = 0; i < value.length; i++) {
if (value[i] != 0) {
indices.add(i);
values.add(value[i]);
}
}
return SparseVector._(dimensions, indices, values);
}

@override
String toString() {
var elements = [
for (var i = 0; i < indices.length; i++) "${indices[i] + 1}:${values[i]}"
].join(",");
return "{${elements}}/${this.dimensions}";
}
}
9 changes: 6 additions & 3 deletions test/postgres_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,21 @@ void main() {
await connection.execute("DROP TABLE IF EXISTS items");

await connection.execute(
"CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3), half_embedding halfvec(3))");
"CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3), half_embedding halfvec(3), sparse_embedding sparsevec(3))");

await connection.execute(
Sql.named(
"INSERT INTO items (embedding, half_embedding) VALUES (@a, @d), (@b, @e), (@c, @f)"),
"INSERT INTO items (embedding, half_embedding, sparse_embedding) VALUES (@a, @d, @g), (@b, @e, @h), (@c, @f, @i)"),
parameters: {
"a": Vector([1, 1, 1]).toString(),
"b": Vector([2, 2, 2]).toString(),
"c": Vector([1, 1, 2]).toString(),
"d": HalfVector([1, 1, 1]).toString(),
"e": HalfVector([2, 2, 2]).toString(),
"f": HalfVector([1, 1, 2]).toString()
"f": HalfVector([1, 1, 2]).toString(),
"g": SparseVector([1, 1, 1]).toString(),
"h": SparseVector([2, 2, 2]).toString(),
"i": SparseVector([1, 1, 2]).toString()
});

List<List<dynamic>> results = await connection.execute(
Expand Down

0 comments on commit 1339791

Please sign in to comment.