Skip to content

Commit b106afc

Browse files
Add: Expose L2 distance in Swift (#255)
Closes #203
1 parent 2498dd2 commit b106afc

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

swift/SimSIMD.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,42 @@ public protocol SimSIMD {
44
static var dataType: simsimd_datatype_t { get }
55
static var cosine: simsimd_metric_dense_punned_t { get }
66
static var dotProduct: simsimd_metric_dense_punned_t { get }
7+
static var euclidean: simsimd_metric_dense_punned_t { get }
78
static var squaredEuclidean: simsimd_metric_dense_punned_t { get }
89
}
910

1011
extension Int8: SimSIMD {
1112
public static let dataType = simsimd_datatype_i8_k
1213
public static let cosine = find(kind: simsimd_metric_cosine_k, dataType: dataType)
1314
public static let dotProduct = find(kind: simsimd_metric_dot_k, dataType: dataType)
15+
public static let euclidean = find(kind: simsimd_metric_euclidean_k, dataType: dataType)
1416
public static let squaredEuclidean = find(kind: simsimd_metric_sqeuclidean_k, dataType: dataType)
1517
}
1618

19+
#if !arch(x86_64)
1720
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
1821
extension Float16: SimSIMD {
1922
public static let dataType = simsimd_datatype_f16_k
2023
public static let cosine = find(kind: simsimd_metric_cosine_k, dataType: dataType)
2124
public static let dotProduct = find(kind: simsimd_metric_dot_k, dataType: dataType)
25+
public static let euclidean = find(kind: simsimd_metric_euclidean_k, dataType: dataType)
2226
public static let squaredEuclidean = find(kind: simsimd_metric_sqeuclidean_k, dataType: dataType)
2327
}
28+
#endif
2429

2530
extension Float32: SimSIMD {
2631
public static let dataType = simsimd_datatype_f32_k
2732
public static let cosine = find(kind: simsimd_metric_cosine_k, dataType: dataType)
2833
public static let dotProduct = find(kind: simsimd_metric_inner_k, dataType: dataType)
34+
public static let euclidean = find(kind: simsimd_metric_euclidean_k, dataType: dataType)
2935
public static let squaredEuclidean = find(kind: simsimd_metric_sqeuclidean_k, dataType: dataType)
3036
}
3137

3238
extension Float64: SimSIMD {
3339
public static let dataType = simsimd_datatype_f64_k
3440
public static let cosine = find(kind: simsimd_metric_cosine_k, dataType: dataType)
3541
public static let dotProduct = find(kind: simsimd_metric_dot_k, dataType: dataType)
42+
public static let euclidean = find(kind: simsimd_metric_euclidean_k, dataType: dataType)
3643
public static let squaredEuclidean = find(kind: simsimd_metric_sqeuclidean_k, dataType: dataType)
3744
}
3845

@@ -47,6 +54,11 @@ extension SimSIMD {
4754
perform(dotProduct, a: a, b: b)
4855
}
4956

57+
@inlinable @inline(__always)
58+
public static func euclidean<A, B>(_ a: A, _ b: B) -> Double? where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self {
59+
perform(euclidean, a: a, b: b)
60+
}
61+
5062
@inlinable @inline(__always)
5163
public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Double? where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self {
5264
perform(squaredEuclidean, a: a, b: b)
@@ -64,6 +76,11 @@ extension RandomAccessCollection where Element: SimSIMD {
6476
Element.dot(self, b)
6577
}
6678

79+
@inlinable @inline(__always)
80+
public func euclidean<B>(_ b: B) -> Double? where B: Sequence, B.Element == Element {
81+
Element.euclidean(self, b)
82+
}
83+
6784
@inlinable @inline(__always)
6885
public func sqeuclidean<B>(_ b: B) -> Double? where B: Sequence, B.Element == Element {
6986
Element.sqeuclidean(self, b)

swift/Test.swift

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ class SimSIMDTests: XCTestCase {
1313
XCTAssertEqual(result, 0.00012027938, accuracy: 0.01)
1414
}
1515

16+
#if !arch(x86_64)
1617
func testCosineFloat16() throws {
1718
let a: [Float16] = [1.0, 2.0, 3.0]
1819
let b: [Float16] = [1.0, 2.0, 3.0]
1920
let result = try XCTUnwrap(a.cosine(b))
2021
XCTAssertEqual(result, 0.004930496, accuracy: 0.01)
2122
}
23+
#endif
2224

2325
func testCosineFloat32() throws {
2426
let a: [Float32] = [1.0, 2.0, 3.0]
@@ -41,12 +43,14 @@ class SimSIMDTests: XCTestCase {
4143
XCTAssertEqual(result, 32.0, accuracy: 0.01)
4244
}
4345

46+
#if !arch(x86_64)
4447
func testDotFloat16() throws {
4548
let a: [Float16] = [1.0, 2.0, 3.0]
4649
let b: [Float16] = [4.0, 5.0, 6.0]
4750
let result = try XCTUnwrap(a.dot(b))
4851
XCTAssertEqual(result, 32.0, accuracy: 0.01)
4952
}
53+
#endif
5054

5155
func testDotFloat32() throws {
5256
let a: [Float32] = [1.0, 2.0, 3.0]
@@ -62,19 +66,51 @@ class SimSIMDTests: XCTestCase {
6266
XCTAssertEqual(result, 32.0, accuracy: 0.01)
6367
}
6468

69+
func testEuclideanInt8() throws {
70+
let a: [Int8] = [1, 2, 3]
71+
let b: [Int8] = [4, 5, 6]
72+
let result = try XCTUnwrap(a.euclidean(b))
73+
XCTAssertEqual(result, 5.196152422706632, accuracy: 0.01)
74+
}
75+
76+
#if !arch(x86_64)
77+
func testEuclideanFloat16() throws {
78+
let a: [Float16] = [1.0, 2.0, 3.0]
79+
let b: [Float16] = [4.0, 5.0, 6.0]
80+
let result = try XCTUnwrap(a.euclidean(b))
81+
XCTAssertEqual(result, 5.196152422706632, accuracy: 0.01)
82+
}
83+
#endif
84+
85+
func testEuclideanFloat32() throws {
86+
let a: [Float32] = [1.0, 2.0, 3.0]
87+
let b: [Float32] = [4.0, 5.0, 6.0]
88+
let result = try XCTUnwrap(a.euclidean(b))
89+
XCTAssertEqual(result, 5.196152422706632, accuracy: 0.01)
90+
}
91+
92+
func testEuclideanFloat64() throws {
93+
let a: [Float64] = [1.0, 2.0, 3.0]
94+
let b: [Float64] = [4.0, 5.0, 6.0]
95+
let result = try XCTUnwrap(a.euclidean(b))
96+
XCTAssertEqual(result, 5.196152422706632, accuracy: 0.01)
97+
}
98+
6599
func testSqeuclideanInt8() throws {
66100
let a: [Int8] = [1, 2, 3]
67101
let b: [Int8] = [4, 5, 6]
68102
let result = try XCTUnwrap(a.sqeuclidean(b))
69103
XCTAssertEqual(result, 27.0, accuracy: 0.01)
70104
}
71105

106+
#if !arch(x86_64)
72107
func testSqeuclideanFloat16() throws {
73108
let a: [Float16] = [1.0, 2.0, 3.0]
74109
let b: [Float16] = [4.0, 5.0, 6.0]
75110
let result = try XCTUnwrap(a.sqeuclidean(b))
76111
XCTAssertEqual(result, 27.0, accuracy: 0.01)
77112
}
113+
#endif
78114

79115
func testSqeuclideanFloat32() throws {
80116
let a: [Float32] = [1.0, 2.0, 3.0]

0 commit comments

Comments
 (0)