MCPcopy Create free account
hub / github.com/antmachineintelligence/mtgbmcode / ArrayArgs

Class ArrayArgs

include/LightGBM/utils/array_args.h:20–193  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

18*/
19template<typename VAL_T>
20class ArrayArgs {
21 public:
22 inline static size_t ArgMaxMT(const std::vector<VAL_T>& array) {
23 int num_threads = 1;
24#pragma omp parallel
25#pragma omp master
26 {
27 num_threads = omp_get_num_threads();
28 }
29 int step = std::max(1, (static_cast<int>(array.size()) + num_threads - 1) / num_threads);
30 std::vector<size_t> arg_maxs(num_threads, 0);
31 #pragma omp parallel for schedule(static, 1)
32 for (int i = 0; i < num_threads; ++i) {
33 size_t start = step * i;
34 if (start >= array.size()) { continue; }
35 size_t end = std::min(array.size(), start + step);
36 size_t arg_max = start;
37 for (size_t j = start + 1; j < end; ++j) {
38 if (array[j] > array[arg_max]) {
39 arg_max = j;
40 }
41 }
42 arg_maxs[i] = arg_max;
43 }
44 size_t ret = arg_maxs[0];
45 for (int i = 1; i < num_threads; ++i) {
46 if (array[arg_maxs[i]] > array[ret]) {
47 ret = arg_maxs[i];
48 }
49 }
50 return ret;
51 }
52 inline static size_t ArgMax(const std::vector<VAL_T>& array) {
53 if (array.empty()) {
54 return 0;
55 }
56 if (array.size() > 1024) {
57 return ArgMaxMT(array);
58 } else {
59 size_t arg_max = 0;
60 for (size_t i = 1; i < array.size(); ++i) {
61 if (array[i] > array[arg_max]) {
62 arg_max = i;
63 }
64 }
65 return arg_max;
66 }
67 }
68
69 inline static size_t ArgMin(const std::vector<VAL_T>& array) {
70 if (array.empty()) {
71 return 0;
72 }
73 size_t arg_min = 0;
74 for (size_t i = 1; i < array.size(); ++i) {
75 if (array[i] < array[arg_min]) {
76 arg_min = i;
77 }

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected