diff --git a/ortools/algorithms/adjustable_k_ary_heap.h b/ortools/algorithms/adjustable_k_ary_heap.h index 2b83e7192f..7264fd15e0 100644 --- a/ortools/algorithms/adjustable_k_ary_heap.h +++ b/ortools/algorithms/adjustable_k_ary_heap.h @@ -186,7 +186,11 @@ class AdjustableKAryHeap { if (heap_index >= heap_size()) return false; PerformSwap(heap_index, heap_size() - 1); --heap_size_; - SiftDown(heap_index); + if (HasPriority(heap_index, Parent(heap_index))) { + SiftUp(heap_index); + } else { + SiftDown(heap_index); + } return true; } diff --git a/ortools/algorithms/adjustable_k_ary_heap_test.cc b/ortools/algorithms/adjustable_k_ary_heap_test.cc index b1597014f0..c505f64b9b 100644 --- a/ortools/algorithms/adjustable_k_ary_heap_test.cc +++ b/ortools/algorithms/adjustable_k_ary_heap_test.cc @@ -110,6 +110,27 @@ TEST(AdjustableKAryHeapTest, UpdateStrongCheck) { } } +TEST(AdjustableKAryHeapTest, RemoveStrongCheck) { + const int kSize = 10'000; + const int kNumRemovals = kSize; + const double priority_range = kSize / 10; + std::random_device rd; + std::mt19937 generator(rd()); // Mersenne Twister generator + std::uniform_real_distribution priority_dist(0, priority_range); + std::uniform_int_distribution index_dist(0, kSize); + std::vector subsets_and_values(kSize); + for (int i = 0; i < kSize; ++i) { + subsets_and_values[i] = {priority_dist(generator), i}; + } + AdjustableKAryHeap heap(subsets_and_values, + kSize); + EXPECT_TRUE(heap.CheckHeapProperty()); + for (int iter = 0; iter < kNumRemovals; ++iter) { + heap.Remove(iter); + EXPECT_TRUE(heap.CheckHeapProperty()); + } +} + TEST(AdjustableKAryHeapTest, OneByOneStrongCheck) { const int kSize = 10'000; const int kNumInsertions = kSize; diff --git a/ortools/algorithms/set_cover_model.h b/ortools/algorithms/set_cover_model.h index a67394a949..b018596a9f 100644 --- a/ortools/algorithms/set_cover_model.h +++ b/ortools/algorithms/set_cover_model.h @@ -14,7 +14,12 @@ #ifndef OR_TOOLS_ALGORITHMS_SET_COVER_MODEL_H_ #define OR_TOOLS_ALGORITHMS_SET_COVER_MODEL_H_ +#if defined(_MSC_VER) +#include +typedef SSIZE_T ssize_t; +#else #include +#endif // defined(_MSC_VER) #include #include diff --git a/ortools/linear_solver/xpress_interface_test.cc b/ortools/linear_solver/xpress_interface_test.cc index bc0e93dd29..632e141b8a 100644 --- a/ortools/linear_solver/xpress_interface_test.cc +++ b/ortools/linear_solver/xpress_interface_test.cc @@ -285,9 +285,9 @@ class MyMPCallback : public MPCallback { MyMPCallback(MPSolver* mpSolver, bool should_throw) : MPCallback(false, false), mpSolver_(mpSolver), - should_throw_(should_throw){}; + should_throw_(should_throw) {}; - ~MyMPCallback() override{}; + ~MyMPCallback() override {}; void RunCallback(MPCallbackContext* callback_context) override { if (should_throw_) { @@ -1354,8 +1354,8 @@ TEST_F(XpressFixtureMIP, CallbackThrowsException) { } // namespace operations_research int main(int argc, char** argv) { - testing::InitGoogleTest(&argc, argv); absl::SetFlag(&FLAGS_stderrthreshold, 0); + testing::InitGoogleTest(&argc, argv); auto solver = operations_research::MPSolver::CreateSolver("XPRESS_LP"); if (solver == nullptr) { LOG(ERROR) << "Xpress solver is not available";