Skip to content
Snippets Groups Projects
Commit 37a7354e authored by Mingchung Xia's avatar Mingchung Xia
Browse files

Metric modifications with Surge

parent 2330a8cd
No related branches found
No related tags found
1 merge request!13HNSW Implementation with Testcases
Pipeline #114120 failed
......@@ -36,6 +36,15 @@
"version" : "0.1.14"
}
},
{
"identity" : "surge",
"kind" : "remoteSourceControl",
"location" : "https://github.com/Jounce/Surge.git",
"state" : {
"revision" : "6e4a47e63da8801afe6188cf039e9f04eb577721",
"version" : "2.3.2"
}
},
{
"identity" : "swift-numerics",
"kind" : "remoteSourceControl",
......
......@@ -16,7 +16,8 @@ let package = Package(
dependencies: [
//.package(url: "https://github.com/jbadger3/SwiftAnnoy", .upToNextMajor(from: "1.0.0")),
.package(url: "https://github.com/L1MeN9Yu/Elva", .upToNextMajor(from: "2.1.3")),
.package(url: "https://github.com/JadenGeller/similarity-topology", .upToNextMajor(from: "0.1.14"))
.package(url: "https://github.com/JadenGeller/similarity-topology", .upToNextMajor(from: "0.1.14")),
.package(url: "https://github.com/Jounce/Surge.git", .upToNextMajor(from: "2.0.0")),
],
targets: [
.target(
......@@ -27,6 +28,7 @@ let package = Package(
.product(name: "HNSWEphemeral", package: "similarity-topology"),
.product(name: "HNSWDurable", package: "similarity-topology"),
.product(name: "ZSTD", package: "Elva"),
.product(name: "Surge", package: "Surge"),
],
resources: [.process("Resources")]
),
......
......@@ -26,6 +26,7 @@
import Foundation
import SimilarityMetric
import Surge
public struct CartesianDistanceMetric<Vector: Collection & Codable>: SimilarityMetric where Vector.Element: BinaryFloatingPoint {
public func similarity(between someItem: Vector, _ otherItem: Vector) -> Vector.Element {
......@@ -34,5 +35,7 @@ public struct CartesianDistanceMetric<Vector: Collection & Codable>: SimilarityM
let squaredSum = squaredDifferences.reduce(0, +)
return sqrt(squaredSum)
// return Vector.Element(Surge.distSq(someItem as! [Double], otherItem as! [Double]))
}
}
......@@ -8,32 +8,50 @@
import Foundation
import Accelerate
import SimilarityMetric
import Surge
// MARK: May be improved on using Surge/Nifty
// See https://developer.apple.com/documentation/accelerate/vdsp-snv
public struct CosineSimilarityMetric<Vector: Collection & Codable>: SimilarityMetric where Vector.Element: BinaryFloatingPoint {
public func similarity(between someItem: Vector, _ otherItem: Vector) -> Vector.Element {
/// Convert vectors to Double for Accelerate functions
// /// Convert vectors to Double for Accelerate functions
// let someItemDoubles = someItem.map { Double($0) }
// let otherItemDoubles = otherItem.map { Double($0) }
//
// /// Calculate dot product
// var dotProduct: Double = 0.0
// vDSP_dotprD(someItemDoubles, 1, otherItemDoubles, 1, &dotProduct, vDSP_Length(someItemDoubles.count))
//
// /// Calculate magnitude of vectors
// var someItemMagnitudeSquared: Double = 0.0
// var otherItemMagnitudeSquared: Double = 0.0
// vDSP_svesqD(someItemDoubles, 1, &someItemMagnitudeSquared, vDSP_Length(someItemDoubles.count))
// vDSP_svesqD(otherItemDoubles, 1, &otherItemMagnitudeSquared, vDSP_Length(otherItemDoubles.count))
// let someItemMagnitude = sqrt(someItemMagnitudeSquared)
// let otherItemMagnitude = sqrt(otherItemMagnitudeSquared)
//
// /// Calculate the cosine similarity
// let cosineSimilarity = dotProduct / (someItemMagnitude * otherItemMagnitude)
//
// /// Convert back to type Vector.Element
// return Vector.Element(cosineSimilarity)
// Convert vectors to arrays of Double
let someItemDoubles = someItem.map { Double($0) }
let otherItemDoubles = otherItem.map { Double($0) }
/// Calculate dot product
var dotProduct: Double = 0.0
vDSP_dotprD(someItemDoubles, 1, otherItemDoubles, 1, &dotProduct, vDSP_Length(someItemDoubles.count))
// Calculate dot product using Surge for cosine similarity numerator
let dotProduct = Surge.dot(someItemDoubles, otherItemDoubles)
/// Calculate magnitude of vectors
var someItemMagnitudeSquared: Double = 0.0
var otherItemMagnitudeSquared: Double = 0.0
vDSP_svesqD(someItemDoubles, 1, &someItemMagnitudeSquared, vDSP_Length(someItemDoubles.count))
vDSP_svesqD(otherItemDoubles, 1, &otherItemMagnitudeSquared, vDSP_Length(otherItemDoubles.count))
let someItemMagnitude = sqrt(someItemMagnitudeSquared)
let otherItemMagnitude = sqrt(otherItemMagnitudeSquared)
// Manually calculate magnitudes (norms) of the vectors for the denominator
let someItemMagnitude = sqrt(Surge.dot(someItemDoubles, someItemDoubles))
let otherItemMagnitude = sqrt(Surge.dot(otherItemDoubles, otherItemDoubles))
/// Calculate the cosine similarity
// Calculate cosine similarity
let cosineSimilarity = dotProduct / (someItemMagnitude * otherItemMagnitude)
/// Convert back to type Vector.Element
// Convert back to type Vector.Element
return Vector.Element(cosineSimilarity)
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment