Skip to content

Commit a04122b

Browse files
authored
Address 'cppcoreguidelines-*' clang-tidy remarks (#279)
1 parent e581001 commit a04122b

15 files changed

Lines changed: 185 additions & 195 deletions

File tree

.clang-tidy

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
11
Checks: >
22
bugprone-*,
33
google-*,
4+
cppcoreguidelines-*,
45
modernize-*,
56
misc-*,
67
performance-*,
78
portability-*,
89
readability-*,
910
-google-build-using-namespace,
11+
-cppcoreguidelines-avoid-magic-numbers,
12+
-cppcoreguidelines-avoid-non-const-global-variables,
13+
-cppcoreguidelines-narrowing-conversions,
14+
-cppcoreguidelines-non-private-member-variables-in-classes,
15+
-cppcoreguidelines-prefer-member-initializer,
16+
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
17+
-cppcoreguidelines-pro-type-const-cast,
18+
-cppcoreguidelines-pro-type-reinterpret-cast,
19+
-cppcoreguidelines-pro-type-member-init,
20+
-cppcoreguidelines-special-member-functions,
21+
-google-readability-braces-around-statements,
22+
-google-readability-namespace-comments,
23+
-google-runtime-references,
1024
-misc-non-private-member-variables-in-classes,
1125
-misc-const-correctness,
1226
-misc-include-cleaner,

include/layers/Layer.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class LayerImpl {
7979
LayerImpl() = default;
8080
LayerImpl(const Shape& inputShape, const Shape& outputShape)
8181
: inputShape_(inputShape), outputShape_(outputShape) {}
82+
virtual ~LayerImpl() = default;
8283
LayerImpl(const LayerImpl& c) = default;
8384
LayerImpl& operator=(const LayerImpl& c) = default;
8485
[[nodiscard]] virtual std::vector<ValueType> run(

include/layers/PoolingLayer.hpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -179,18 +179,18 @@ PoolingLayerImpl<ValueType>::PoolingLayerImpl(
179179

180180
size_t effective_kernel_size = (kernel_size - 1) * dilation + 1;
181181

182-
size_t output_size;
183-
if (ceil_mode) {
184-
output_size = static_cast<size_t>(
185-
std::ceil((input_size + pad - effective_kernel_size) /
186-
static_cast<float>(stride))) +
187-
1;
188-
} else {
189-
output_size = static_cast<size_t>(
190-
std::floor((input_size + pad - effective_kernel_size) /
191-
static_cast<float>(stride))) +
192-
1;
193-
}
182+
size_t output_size = [=]() {
183+
if (ceil_mode) {
184+
return static_cast<size_t>(
185+
std::ceil((input_size + pad - effective_kernel_size) /
186+
static_cast<float>(stride))) +
187+
1;
188+
}
189+
return static_cast<size_t>(
190+
std::floor((input_size + pad - effective_kernel_size) /
191+
static_cast<float>(stride))) +
192+
1;
193+
}();
194194

195195
this->outputShape_[input_shape.dims() - pooling_shape.dims() + i] =
196196
output_size;
@@ -321,4 +321,4 @@ std::vector<ValueType> PoolingLayerImpl<ValueType>::run(
321321
return res;
322322
}
323323

324-
} // namespace it_lab_ai
324+
} // namespace it_lab_ai

include/perf/benchmarking.hpp

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <cmath>
88
#include <numeric>
99
#include <stdexcept>
10+
#include <utility>
1011
#include <vector>
1112

1213
namespace it_lab_ai {
@@ -16,7 +17,7 @@ template <typename DurationContainerType, typename DurationType, class Function,
1617
DurationContainerType elapsed_time(Function&& func, Args&&... args) {
1718
auto duration = std::chrono::duration<DurationContainerType, DurationType>();
1819
auto start = std::chrono::high_resolution_clock::now();
19-
func(args...);
20+
std::forward<Function>(func)(std::forward<Args>(args)...);
2021
auto end = std::chrono::high_resolution_clock::now();
2122
duration = end - start;
2223
return duration.count();
@@ -26,7 +27,7 @@ DurationContainerType elapsed_time(Function&& func, Args&&... args) {
2627
template <class Function, typename... Args>
2728
double elapsed_time_omp(Function&& func, Args&&... args) {
2829
double start = omp_get_wtime();
29-
func(args...);
30+
std::forward<Function>(func)(std::forward<Args>(args)...);
3031
double end = omp_get_wtime();
3132
return end - start;
3233
}
@@ -38,7 +39,7 @@ DurationContainerType elapsed_time_avg(const size_t iters, Function&& func,
3839
auto duration = std::chrono::duration<DurationContainerType, DurationType>();
3940
auto start = std::chrono::high_resolution_clock::now();
4041
for (size_t i = 0; i < iters; i++) {
41-
func(args...);
42+
std::forward<Function>(func)(std::forward<Args>(args)...);
4243
}
4344
auto end = std::chrono::high_resolution_clock::now();
4445
duration = (end - start) / iters;
@@ -51,7 +52,7 @@ double elapsed_time_omp_avg(const size_t iters, Function&& func,
5152
Args&&... args) {
5253
double start = omp_get_wtime();
5354
for (size_t i = 0; i < iters; i++) {
54-
func(args...);
55+
std::forward<Function>(func)(std::forward<Args>(args)...);
5556
}
5657
double end = omp_get_wtime();
5758
return (end - start) / iters;
@@ -61,26 +62,29 @@ template <typename ThroughputContainerType, typename DurationType,
6162
class Function, typename... Args>
6263
ThroughputContainerType throughput(Function&& func, Args&&... args) {
6364
return ThroughputContainerType(1) /
64-
elapsed_time<ThroughputContainerType, DurationType>(func, args...);
65+
elapsed_time<ThroughputContainerType, DurationType>(
66+
std::forward<Function>(func), std::forward<Args>(args)...);
6567
}
6668

6769
template <class Function, typename... Args>
6870
double throughput_omp(Function&& func, Args&&... args) {
69-
return 1 / elapsed_time_omp(func, args...);
71+
return 1 / elapsed_time_omp(std::forward<Function>(func),
72+
std::forward<Args>(args)...);
7073
}
7174

7275
template <typename ThroughputContainerType, typename DurationType,
7376
class Function, typename... Args>
7477
ThroughputContainerType throughput_avg(const size_t iters, Function&& func,
7578
Args&&... args) {
7679
return ThroughputContainerType(1) /
77-
elapsed_time_avg<ThroughputContainerType, DurationType>(iters, func,
78-
args...);
80+
elapsed_time_avg<ThroughputContainerType, DurationType>(
81+
iters, std::forward<Function>(func), std::forward<Args>(args)...);
7982
}
8083

8184
template <class Function, typename... Args>
8285
double throughput_omp_avg(const size_t iters, Function&& func, Args&&... args) {
83-
return 1 / elapsed_time_omp_avg(iters, func, args...);
86+
return 1 / elapsed_time_omp_avg(iters, std::forward<Function>(func),
87+
std::forward<Args>(args)...);
8488
}
8589

8690
// as "Manhattan" norm of error-vector

src/Weights_Reader/reader_weights.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,13 @@ json read_json(const std::string& filename) {
4444
return result;
4545

4646
#else
47+
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
4748
int fd = open(filename.c_str(), O_RDONLY);
4849
if (fd == -1) {
4950
throw std::runtime_error("Cannot open file: " + filename);
5051
}
5152

52-
struct stat sb;
53+
struct stat sb {};
5354
fstat(fd, &sb);
5455

5556
if (sb.st_size == 0) {

src/graph/graph.cpp

Lines changed: 34 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,18 @@
2626

2727
namespace it_lab_ai {
2828

29+
namespace {
30+
template <typename T>
31+
std::shared_ptr<Layer> clone_layer_checked(
32+
const std::shared_ptr<Layer>& layer) {
33+
const auto* casted = dynamic_cast<const T*>(layer.get());
34+
if (casted == nullptr) {
35+
throw std::invalid_argument("Layer type mismatch while cloning");
36+
}
37+
return std::make_shared<T>(*casted);
38+
}
39+
} // namespace
40+
2941
void Graph::clone(Graph& result, Tensor& out,
3042
const RuntimeOptions& options) const {
3143
result.arrayE_ = this->arrayE_;
@@ -61,110 +73,70 @@ std::shared_ptr<Layer> layer_based_shared_copy(
6173
const std::shared_ptr<Layer>& layer, const RuntimeOptions& options) {
6274
switch (layer->getName()) {
6375
case it_lab_ai::kInput: {
64-
auto* tmp_layer = new InputLayer(*dynamic_cast<InputLayer*>(layer.get()));
65-
return std::shared_ptr<Layer>(tmp_layer);
76+
return clone_layer_checked<InputLayer>(layer);
6677
}
6778
case it_lab_ai::kPooling: {
6879
if (options.backend == Backend::kOneDnn) {
69-
auto* tmp_layer = new PoolingLayerOneDnn(
70-
*dynamic_cast<PoolingLayerOneDnn*>(layer.get()));
71-
return std::shared_ptr<Layer>(tmp_layer);
80+
return clone_layer_checked<PoolingLayerOneDnn>(layer);
7281
}
73-
auto* tmp_layer =
74-
new PoolingLayer(*dynamic_cast<PoolingLayer*>(layer.get()));
75-
return std::shared_ptr<Layer>(tmp_layer);
82+
return clone_layer_checked<PoolingLayer>(layer);
7683
}
7784
case it_lab_ai::kElementWise: {
7885
if (options.backend == Backend::kOneDnn) {
79-
auto* tmp_layer =
80-
new EwLayerOneDnn(*dynamic_cast<EwLayerOneDnn*>(layer.get()));
81-
return std::shared_ptr<Layer>(tmp_layer);
86+
return clone_layer_checked<EwLayerOneDnn>(layer);
8287
}
83-
auto* tmp_layer = new EWLayer(*dynamic_cast<EWLayer*>(layer.get()));
84-
return std::shared_ptr<Layer>(tmp_layer);
88+
return clone_layer_checked<EWLayer>(layer);
8589
}
8690
case it_lab_ai::kConvolution: {
8791
if (options.backend == Backend::kOneDnn) {
88-
auto* tmp_layer =
89-
new ConvLayerOneDnn(*dynamic_cast<ConvLayerOneDnn*>(layer.get()));
90-
return std::shared_ptr<Layer>(tmp_layer);
92+
return clone_layer_checked<ConvLayerOneDnn>(layer);
9193
}
92-
auto* tmp_layer = new ConvolutionalLayer(
93-
*dynamic_cast<ConvolutionalLayer*>(layer.get()));
94-
return std::shared_ptr<Layer>(tmp_layer);
94+
return clone_layer_checked<ConvolutionalLayer>(layer);
9595
}
9696
case it_lab_ai::kFullyConnected: {
97-
auto* tmp_layer = new FCLayer(*dynamic_cast<FCLayer*>(layer.get()));
98-
return std::shared_ptr<Layer>(tmp_layer);
97+
return clone_layer_checked<FCLayer>(layer);
9998
}
10099
case it_lab_ai::kFlatten: {
101-
auto* tmp_layer =
102-
new FlattenLayer(*dynamic_cast<FlattenLayer*>(layer.get()));
103-
return std::shared_ptr<Layer>(tmp_layer);
100+
return clone_layer_checked<FlattenLayer>(layer);
104101
}
105102
case it_lab_ai::kConcat: {
106-
auto* tmp_layer =
107-
new ConcatLayer(*dynamic_cast<ConcatLayer*>(layer.get()));
108-
return std::shared_ptr<Layer>(tmp_layer);
103+
return clone_layer_checked<ConcatLayer>(layer);
109104
}
110105
case it_lab_ai::kDropout: {
111-
auto* tmp_layer =
112-
new DropOutLayer(*dynamic_cast<DropOutLayer*>(layer.get()));
113-
return std::shared_ptr<Layer>(tmp_layer);
106+
return clone_layer_checked<DropOutLayer>(layer);
114107
}
115108
case it_lab_ai::kSplit: {
116-
auto* tmp_layer = new SplitLayer(*dynamic_cast<SplitLayer*>(layer.get()));
117-
return std::shared_ptr<Layer>(tmp_layer);
109+
return clone_layer_checked<SplitLayer>(layer);
118110
}
119111
case it_lab_ai::kBinaryOp: {
120112
if (options.backend == Backend::kOneDnn) {
121-
auto* tmp_layer = new BinaryOpLayerOneDnn(
122-
*dynamic_cast<BinaryOpLayerOneDnn*>(layer.get()));
123-
return std::shared_ptr<Layer>(tmp_layer);
113+
return clone_layer_checked<BinaryOpLayerOneDnn>(layer);
124114
}
125-
auto* tmp_layer =
126-
new BinaryOpLayer(*dynamic_cast<BinaryOpLayer*>(layer.get()));
127-
return std::shared_ptr<Layer>(tmp_layer);
115+
return clone_layer_checked<BinaryOpLayer>(layer);
128116
}
129117
case it_lab_ai::kTranspose: {
130-
auto* tmp_layer =
131-
new TransposeLayer(*dynamic_cast<TransposeLayer*>(layer.get()));
132-
return std::shared_ptr<Layer>(tmp_layer);
118+
return clone_layer_checked<TransposeLayer>(layer);
133119
}
134120
case it_lab_ai::kMatmul: {
135-
auto* tmp_layer =
136-
new MatmulLayer(*dynamic_cast<MatmulLayer*>(layer.get()));
137-
return std::shared_ptr<Layer>(tmp_layer);
121+
return clone_layer_checked<MatmulLayer>(layer);
138122
}
139123
case it_lab_ai::kReshape: {
140-
auto* tmp_layer =
141-
new ReshapeLayer(*dynamic_cast<ReshapeLayer*>(layer.get()));
142-
return std::shared_ptr<Layer>(tmp_layer);
124+
return clone_layer_checked<ReshapeLayer>(layer);
143125
}
144126
case it_lab_ai::kSoftmax: {
145-
auto* tmp_layer =
146-
new SoftmaxLayer(*dynamic_cast<SoftmaxLayer*>(layer.get()));
147-
return std::shared_ptr<Layer>(tmp_layer);
127+
return clone_layer_checked<SoftmaxLayer>(layer);
148128
}
149129
case it_lab_ai::kReduce: {
150130
if (options.backend == Backend::kOneDnn) {
151-
auto* tmp_layer = new ReduceLayerOneDnn(
152-
*dynamic_cast<ReduceLayerOneDnn*>(layer.get()));
153-
return std::shared_ptr<Layer>(tmp_layer);
131+
return clone_layer_checked<ReduceLayerOneDnn>(layer);
154132
}
155-
auto* tmp_layer =
156-
new ReduceLayer(*dynamic_cast<ReduceLayer*>(layer.get()));
157-
return std::shared_ptr<Layer>(tmp_layer);
133+
return clone_layer_checked<ReduceLayer>(layer);
158134
}
159135
case it_lab_ai::kBatchNormalization: {
160-
auto* tmp_layer = new BatchNormalizationLayer(
161-
*dynamic_cast<BatchNormalizationLayer*>(layer.get()));
162-
return std::shared_ptr<Layer>(tmp_layer);
136+
return clone_layer_checked<BatchNormalizationLayer>(layer);
163137
}
164138
case it_lab_ai::kOutput: {
165-
auto* tmp_layer =
166-
new OutputLayer(*dynamic_cast<OutputLayer*>(layer.get()));
167-
return std::shared_ptr<Layer>(tmp_layer);
139+
return clone_layer_checked<OutputLayer>(layer);
168140
}
169141
default: {
170142
throw std::invalid_argument("No such layer type");

src/graph_transformations/graph_transformations.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,6 @@ void changed_subgraphs(const Graph& graph, const Graph& subgraph_from,
137137
std::vector<int> leaves;
138138
std::vector<int> roots_inps_final;
139139
std::vector<int> leaves_outs_final;
140-
size_t amount_connected;
141-
size_t amount_connected_s;
142140
for (int v = 0; v < subgraph_from.getLayersCount(); v++) {
143141
if (is_root(subgraph_from, v)) {
144142
roots.push_back(v);
@@ -183,8 +181,9 @@ void changed_subgraphs(const Graph& graph, const Graph& subgraph_from,
183181
}
184182
}
185183
// recognize transformations we can apply with roots
186-
amount_connected = new_graph.getOutputsSize(subs[i][roots[j]]);
187-
amount_connected_s = subgraph_from.getOutputsSize(roots[j]);
184+
const size_t amount_connected =
185+
new_graph.getOutputsSize(subs[i][roots[j]]);
186+
const size_t amount_connected_s = subgraph_from.getOutputsSize(roots[j]);
188187
if (amount_connected == amount_connected_s) {
189188
continue;
190189
}
@@ -197,7 +196,7 @@ void changed_subgraphs(const Graph& graph, const Graph& subgraph_from,
197196
}
198197
}
199198
for (int leaf : leaves) {
200-
amount_connected = new_graph.getOutputsSize(subs[i][leaf]);
199+
const size_t amount_connected = new_graph.getOutputsSize(subs[i][leaf]);
201200
for (size_t k = 0; k < amount_connected; k++) {
202201
int id = new_graph.getOutLayers(subs[i][leaf])[k];
203202
auto it =
@@ -250,8 +249,6 @@ void changed_subgraphs(const Graph& graph, const Graph& subgraph_from,
250249
std::vector<int> leaves_to;
251250
std::vector<std::vector<int>> roots_inps_final;
252251
std::vector<std::vector<int>> leaves_outs_final;
253-
size_t amount_connected;
254-
size_t amount_connected_s;
255252
for (int v = 0; v < subgraph_from.getLayersCount(); v++) {
256253
if (is_root(subgraph_from, v)) {
257254
roots_from.push_back(v);
@@ -304,8 +301,10 @@ void changed_subgraphs(const Graph& graph, const Graph& subgraph_from,
304301
for (size_t j = 0; j < roots_from.size(); j++) {
305302
roots_inps_final[j] = new_graph.getInLayers(subs[i][roots_from[j]]);
306303
// recognize transformations we can apply with roots
307-
amount_connected = new_graph.getOutputsSize(subs[i][roots_from[j]]);
308-
amount_connected_s = subgraph_from.getOutputsSize(roots_from[j]);
304+
const size_t amount_connected =
305+
new_graph.getOutputsSize(subs[i][roots_from[j]]);
306+
const size_t amount_connected_s =
307+
subgraph_from.getOutputsSize(roots_from[j]);
309308
if (amount_connected == amount_connected_s) {
310309
continue;
311310
}
@@ -318,7 +317,8 @@ void changed_subgraphs(const Graph& graph, const Graph& subgraph_from,
318317
}
319318
}
320319
for (size_t j = 0; j < leaves_from.size(); j++) {
321-
amount_connected = new_graph.getOutputsSize(subs[i][leaves_from[j]]);
320+
const size_t amount_connected =
321+
new_graph.getOutputsSize(subs[i][leaves_from[j]]);
322322
for (size_t k = 0; k < amount_connected; k++) {
323323
int id = new_graph.getOutLayers(subs[i][leaves_from[j]])[k];
324324
leaves_outs_final[j].push_back(id);

0 commit comments

Comments
 (0)