From 84e038e321f29668111d5dc3b2ced7192ab6fc3e Mon Sep 17 00:00:00 2001
From: Mingchung Xia <mingchung.xia@gmail.com>
Date: Mon, 25 Mar 2024 23:48:05 -0400
Subject: [PATCH] Added nifty & linux fallback revamp

---
 Package.resolved                                    |  9 +++++++++
 Package.swift                                       |  2 ++
 .../HNSW/Metrics/CartesianDistanceMetric.swift      | 13 ++++++++-----
 .../HNSW/Metrics/CosineSimilarityMetric.swift       |  3 +--
 4 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/Package.resolved b/Package.resolved
index 5f2e68ff..102feccf 100644
--- a/Package.resolved
+++ b/Package.resolved
@@ -27,6 +27,15 @@
         "version" : "2.2.0"
       }
     },
+    {
+      "identity" : "nifty",
+      "kind" : "remoteSourceControl",
+      "location" : "https://github.com/mingchungx/nifty.git",
+      "state" : {
+        "branch" : "master",
+        "revision" : "ac093ab6a67e4c6c5cfccbe67c65dac06111cf6a"
+      }
+    },
     {
       "identity" : "similarity-topology",
       "kind" : "remoteSourceControl",
diff --git a/Package.swift b/Package.swift
index 44c782e0..d83d3e80 100644
--- a/Package.swift
+++ b/Package.swift
@@ -22,6 +22,7 @@ let package = Package(
         .package(url: "https://github.com/L1MeN9Yu/Elva", .upToNextMajor(from: "2.1.3")),
         .package(url: "https://github.com/JadenGeller/similarity-topology", .exact("0.1.14")),
         .package(url: "https://github.com/Jounce/Surge.git", .upToNextMajor(from: "2.0.0")),
+        .package(url: "https://github.com/mingchungx/nifty.git", .branch("master"))
     ],
     targets: [
         .target(
@@ -31,6 +32,7 @@ let package = Package(
                 .product(name: "HNSWEphemeral", package: "similarity-topology"),
                 .product(name: "HNSWDurable", package: "similarity-topology", condition: .when(platforms: [.macOS])),
                 .product(name: "HNSWSample", package: "similarity-topology", condition: .when(platforms: [.macOS])),
+                .product(name: "Nifty", package: "nifty"),
                 .product(name: "ZSTD", package: "Elva"),
                 .byName(name: "Surge", condition: .when(platforms: [.macOS])),
             ],
diff --git a/Sources/SwiftNLP/1. Data Collection/HNSW/Metrics/CartesianDistanceMetric.swift b/Sources/SwiftNLP/1. Data Collection/HNSW/Metrics/CartesianDistanceMetric.swift
index c2fb0d99..8173b321 100644
--- a/Sources/SwiftNLP/1. Data Collection/HNSW/Metrics/CartesianDistanceMetric.swift	
+++ b/Sources/SwiftNLP/1. Data Collection/HNSW/Metrics/CartesianDistanceMetric.swift	
@@ -38,16 +38,19 @@ public struct CartesianDistanceMetric<Vector: Collection & Codable>: SimilarityM
 }
 
 #else
-// TODO: Import using Nifty (currently unable to fetch package dependency)
-// import Nifty
+import Nifty
 
 /// This implementation 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
+        var sum: Vector.Element = 0
+        
+        for (a, b) in zip(someItem, otherItem) {
+            let difference = a - b
+            sum += difference * difference
         }
+        
+        return sum
     }
 }
 
diff --git a/Sources/SwiftNLP/1. Data Collection/HNSW/Metrics/CosineSimilarityMetric.swift b/Sources/SwiftNLP/1. Data Collection/HNSW/Metrics/CosineSimilarityMetric.swift
index 65d0384d..e793d911 100644
--- a/Sources/SwiftNLP/1. Data Collection/HNSW/Metrics/CosineSimilarityMetric.swift	
+++ b/Sources/SwiftNLP/1. Data Collection/HNSW/Metrics/CosineSimilarityMetric.swift	
@@ -53,8 +53,7 @@ public struct CosineSimilarityMetric<Vector: Collection & Codable>: SimilarityMe
 }
 
 #else
-// TODO: Import using Nifty (currently unable to fetch package dependency)
-// import Nifty
+import Nifty
 
 /// This implementation may be less efficient on Linux
 public struct CosineSimilarityMetric<Vector: Collection & Codable>: SimilarityMetric where Vector.Element: BinaryFloatingPoint {
-- 
GitLab