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

Added basic linux support for similarity metrics

parent 20d4ebcb
No related branches found
No related tags found
1 merge request!13HNSW Implementation with Testcases
Pipeline #114212 passed with warnings
...@@ -26,6 +26,10 @@ ...@@ -26,6 +26,10 @@
import Foundation import Foundation
import SimilarityMetric import SimilarityMetric
#if canImport(Surge) && canImport(Accelerate) && os(macOS)
import Accelerate
import Surge import Surge
public struct CartesianDistanceMetric<Vector: Collection & Codable>: SimilarityMetric where Vector.Element: BinaryFloatingPoint { public struct CartesianDistanceMetric<Vector: Collection & Codable>: SimilarityMetric where Vector.Element: BinaryFloatingPoint {
...@@ -33,3 +37,18 @@ public struct CartesianDistanceMetric<Vector: Collection & Codable>: SimilarityM ...@@ -33,3 +37,18 @@ public struct CartesianDistanceMetric<Vector: Collection & Codable>: SimilarityM
return Vector.Element(Surge.distSq(someItem as! [Double], otherItem as! [Double])) return Vector.Element(Surge.distSq(someItem as! [Double], otherItem as! [Double]))
} }
} }
#else
// This may be less efficient on Linux
public struct CartesianDistanceMetric<Vector: Collection & Codable>: SimilarityMetric where Vector.Element: BinaryFloatingPoint {
public func similarity(between someItem: Vector, _ otherItem: Vector) -> Vector.Element {
return someItem.enumerated().reduce(0) { result, item in
let diff = item.element - otherItem[item.offset]
return result + diff * diff
}
}
}
#endif
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
// Created by Mingchung Xia on 2024-03-14. // Created by Mingchung Xia on 2024-03-14.
// //
#if canImport(Surge) && canImport(Accelerate) && os(macOS)
import Foundation import Foundation
import Accelerate import Accelerate
import SimilarityMetric import SimilarityMetric
...@@ -33,3 +35,21 @@ public struct CosineSimilarityMetric<Vector: Collection & Codable>: SimilarityMe ...@@ -33,3 +35,21 @@ public struct CosineSimilarityMetric<Vector: Collection & Codable>: SimilarityMe
return Vector.Element(cosineSimilarity) return Vector.Element(cosineSimilarity)
} }
} }
#else
// This may be less efficient on Linux
public struct CosineSimilarityMetric<Vector: Collection & Codable>: SimilarityMetric where Vector.Element: BinaryFloatingPoint {
public func similarity(between someItem: Vector, _ otherItem: Vector) -> Vector.Element {
let dotProduct = zip(someItem, otherItem).reduce(0) { $0 + $1.0 * $1.1 }
let magnitudeSomeItem = sqrt(someItem.reduce(0) { $0 + $1 * $1 })
let magnitudeOtherItem = sqrt(otherItem.reduce(0) { $0 + $1 * $1 })
let cosineSimilarity = dotProduct / (magnitudeSomeItem * magnitudeOtherItem)
return cosineSimilarity
}
}
#endif
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