ports/japanese/zinnia/files/patch-svm.cpp
Dimitry Andric abdd4cf0e5 japanese/zinnia: fix build with clang 16
Since clang 16 (and gcc 11) the default C++ standard is now gnu++17.
Because japanese/zinnia's build infrastructure does not explicitly set
its C++ standard, this leads to an error:

  svm.cpp:50:10: error: no member named 'random_shuffle' in namespace 'std'
      std::random_shuffle(index.begin(), index.begin() + active_size);
      ~~~~~^

This is because std::random_shuffle has been removed from C++17. An
suitable replacement is std::shuffle, using a std::random_device in
combination with std::mt19937 as the random number engine.

PR:		271953
Approved by:	fernape
MFH:		2023Q2
2023-06-12 20:36:01 +02:00

24 lines
697 B
C++

--- svm.cpp.orig 2009-04-05 11:40:29 UTC
+++ svm.cpp
@@ -10,6 +10,7 @@
#include <vector>
#include <cmath>
#include <algorithm>
+#include <random>
#include "feature.h"
namespace zinnia {
@@ -44,10 +45,12 @@ bool svm_train(size_t l,
}
static const size_t kMaxIteration = 2000;
+ std::random_device device;
+ std::mt19937 engine(device());
for (size_t iter = 0; iter < kMaxIteration; ++iter) {
double PGmax_new = -kINF;
double PGmin_new = kINF;
- std::random_shuffle(index.begin(), index.begin() + active_size);
+ std::shuffle(index.begin(), index.begin() + active_size, engine);
for (size_t s = 0; s < active_size; ++s) {
const size_t i = index[s];