5 #ifndef COSAN_RANDOMKFOLD_H
6 #define COSAN_RANDOMKFOLD_H
20 std::vector<gsl::index> idx(nrows);
21 std::iota(idx.begin(), idx.end(), 0);
24 std::vector<gsl::index> testidx,trainidx;
25 std::sample(idx.begin(), idx.end(), std::back_inserter(testidx),
26 foldSize, std::mt19937{std::random_device{}()});
27 std::sort(testidx.begin(),testidx.end());
28 std::set_difference(idx.begin(), idx.end(), testidx.begin(), testidx.end(),
29 std::inserter(trainidx, trainidx.begin()));
30 fmt::print(
"Current Index is {:}, trainidx size:{:}, testidx size:{:}\n",
31 i,trainidx.size(),testidx.size());
36 std::vector< std::tuple<std::vector<gsl::index>,std::vector<gsl::index> > >
GetSplit() {
return split_batch;}
38 std::vector< std::tuple<std::vector<gsl::index>,std::vector<gsl::index> > >
split_batch;
49 if (nrows<=KFoldNumber){
52 std::vector<gsl::index> idx(nrows);
53 std::iota(idx.begin(), idx.end(), 0);
54 gsl::index foldSize = nrows/KFoldNumber;
56 split_batch.resize(KFoldNumber);
57 #pragma omp parallel for
58 for (gsl::index i = 0;i<KFoldNumber;i++){
59 std::vector<gsl::index> testidx,trainidx;
60 std::sample(idx.begin(), idx.end(), std::back_inserter(testidx),
61 foldSize, std::mt19937{std::random_device{}()});
62 std::sort(testidx.begin(),testidx.end());
63 std::set_difference(idx.begin(), idx.end(), testidx.begin(), testidx.end(),
64 std::inserter(trainidx, trainidx.begin()));
65 fmt::print(
"Current Index is {:}, the current thread num is {:}, total number of threads {:}. trainidx size:{:}, testidx size:{:}\n",
66 i, omp_get_thread_num(),omp_get_num_threads(),trainidx.size(),testidx.size());
68 split_batch[i] = {trainidx,testidx};
73 std::vector< std::tuple<std::vector<gsl::index>,std::vector<gsl::index> > >
GetSplit() & {
return split_batch;}
75 std::vector< std::tuple<std::vector<gsl::index>,std::vector<gsl::index> > >
split_batch;
81 #endif //COSAN_RANDOMKFOLD_H