forked from google/or-tools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cached_log.cc
52 lines (43 loc) · 1.31 KB
/
cached_log.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// Copyright 2010-2024 Google LLC
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "ortools/util/cached_log.h"
#include "ortools/base/logging.h"
namespace operations_research {
CachedLog::CachedLog() {}
CachedLog::~CachedLog() {}
namespace {
double FastLog2(int64_t input) {
#if defined(_MSC_VER) || defined(__ANDROID__)
return log(static_cast<double>(input)) / log(2.0L);
#else
return log2(input);
#endif
}
} // namespace
void CachedLog::Init(int size) {
CHECK(cache_.empty());
CHECK_GT(size, 0);
cache_.resize(size, 0.0);
for (int i = 0; i < size; ++i) {
cache_[i] = FastLog2(i + 1);
}
}
double CachedLog::Log2(int64_t input) const {
CHECK_GE(input, 1);
if (input <= cache_.size()) {
return cache_[input - 1];
} else {
return FastLog2(input);
}
}
} // namespace operations_research