From b48a67144f6c24e9657ed3f46ff59c2cb07e58f7 Mon Sep 17 00:00:00 2001
From: I <1091761+wx257osn2@users.noreply.github.com>
Date: Wed, 31 May 2023 19:56:09 +0900
Subject: [PATCH 1/2] fix windows CI

MSVC doesn't accept unsigned index with pragma omp parallel for
---
 faiss/utils/utils.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/faiss/utils/utils.cpp b/faiss/utils/utils.cpp
index 9cc8d3fe45..65f6c7ed0c 100644
--- a/faiss/utils/utils.cpp
+++ b/faiss/utils/utils.cpp
@@ -28,6 +28,7 @@
 #include <omp.h>
 
 #include <algorithm>
+#include <type_traits>
 #include <vector>
 
 #include <faiss/impl/AuxIndexStructures.h>
@@ -447,7 +448,10 @@ uint64_t bvec_checksum(size_t n, const uint8_t* a) {
 
 void bvecs_checksum(size_t n, size_t d, const uint8_t* a, uint64_t* cs) {
 #pragma omp parallel for if (n > 1000)
-    for (size_t i = 0; i < n; i++) {
+    for (std::make_signed<std::size_t>::type i_ = 0;
+         static_cast<std::size_t>(i_) < n;
+         i_++) {
+        const auto i = static_cast<std::size_t>(i_);
         cs[i] = bvec_checksum(d, a + i * d);
     }
 }

From a84c8807f698e9657da407e67a8a061c9c6fdaff Mon Sep 17 00:00:00 2001
From: I <1091761+wx257osn2@users.noreply.github.com>
Date: Wed, 31 May 2023 21:22:33 +0900
Subject: [PATCH 2/2] fix mac CI

OpenMP (at least the specification) doesn't accept the expression includes a cast as loop condition with pragma omp parallel for
---
 faiss/utils/utils.cpp | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/faiss/utils/utils.cpp b/faiss/utils/utils.cpp
index 65f6c7ed0c..5f3e5eb964 100644
--- a/faiss/utils/utils.cpp
+++ b/faiss/utils/utils.cpp
@@ -447,10 +447,12 @@ uint64_t bvec_checksum(size_t n, const uint8_t* a) {
 }
 
 void bvecs_checksum(size_t n, size_t d, const uint8_t* a, uint64_t* cs) {
-#pragma omp parallel for if (n > 1000)
-    for (std::make_signed<std::size_t>::type i_ = 0;
-         static_cast<std::size_t>(i_) < n;
-         i_++) {
+    // MSVC can't accept unsigned index for #pragma omp parallel for
+    // so below codes only accept n <= std::numeric_limits<ssize_t>::max()
+    using ssize_t = std::make_signed<std::size_t>::type;
+    const ssize_t size = n;
+#pragma omp parallel for if (size > 1000)
+    for (ssize_t i_ = 0; i_ < size; i_++) {
         const auto i = static_cast<std::size_t>(i_);
         cs[i] = bvec_checksum(d, a + i * d);
     }