Skip to content

Commit e8cf3e2

Browse files
committed
Fixed couple of copy/move issues
1 parent 1290b9f commit e8cf3e2

10 files changed

Lines changed: 158 additions & 9 deletions

src/neuralnetwork/gradientsandoutputs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class GradientsAndOutputs
4646
_gradients = src._gradients;
4747
_rnn_outputs = src._rnn_outputs;
4848
_rnn_gradients = src._rnn_gradients;
49+
_rnn_gate_gradients = src._rnn_gate_gradients;
4950
}
5051
return *this;
5152
}
@@ -59,6 +60,7 @@ class GradientsAndOutputs
5960
_gradients = std::move(src._gradients);
6061
_rnn_outputs = std::move(src._rnn_outputs);
6162
_rnn_gradients = std::move(src._rnn_gradients);
63+
_rnn_gate_gradients = std::move(src._rnn_gate_gradients);
6264
}
6365
return *this;
6466
}

src/neuralnetwork/hiddenstates.h

Lines changed: 80 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,86 @@ class HiddenStates
2121
_layer_views.resize(num_layers);
2222
}
2323

24-
HiddenStates(const HiddenStates& src) = default;
25-
HiddenStates(HiddenStates&& src) noexcept = default;
26-
HiddenStates& operator=(HiddenStates&& src) noexcept = default;
27-
HiddenStates& operator=(const HiddenStates& src) = default;
24+
HiddenStates(const HiddenStates& src) :
25+
_topology(src._topology),
26+
_pre_activation_sums(src._pre_activation_sums),
27+
_hidden_state_values(src._hidden_state_values),
28+
_cell_state_values(src._cell_state_values)
29+
{
30+
MYODDWEB_PROFILE_FUNCTION("HiddenStates");
31+
rebuild_views();
32+
}
33+
34+
HiddenStates(HiddenStates&& src) noexcept :
35+
_topology(std::move(src._topology)),
36+
_pre_activation_sums(std::move(src._pre_activation_sums)),
37+
_hidden_state_values(std::move(src._hidden_state_values)),
38+
_cell_state_values(std::move(src._cell_state_values))
39+
{
40+
MYODDWEB_PROFILE_FUNCTION("HiddenStates");
41+
rebuild_views();
42+
}
43+
44+
HiddenStates& operator=(const HiddenStates& src)
45+
{
46+
MYODDWEB_PROFILE_FUNCTION("HiddenStates");
47+
if (this != &src)
48+
{
49+
_topology = src._topology;
50+
_pre_activation_sums = src._pre_activation_sums;
51+
_hidden_state_values = src._hidden_state_values;
52+
_cell_state_values = src._cell_state_values;
53+
rebuild_views();
54+
}
55+
return *this;
56+
}
57+
58+
HiddenStates& operator=(HiddenStates&& src) noexcept
59+
{
60+
MYODDWEB_PROFILE_FUNCTION("HiddenStates");
61+
if (this != &src)
62+
{
63+
_topology = std::move(src._topology);
64+
_pre_activation_sums = std::move(src._pre_activation_sums);
65+
_hidden_state_values = std::move(src._hidden_state_values);
66+
_cell_state_values = std::move(src._cell_state_values);
67+
rebuild_views();
68+
}
69+
return *this;
70+
}
71+
72+
void rebuild_views()
73+
{
74+
MYODDWEB_PROFILE_FUNCTION("HiddenStates");
75+
_layer_views.clear();
76+
const size_t num_layers = _topology.size();
77+
_layer_views.resize(num_layers);
78+
79+
for (size_t layer_number = 0; layer_number < num_layers; ++layer_number)
80+
{
81+
const size_t n = _topology[layer_number];
82+
if (n == 0) continue;
83+
84+
const size_t total_hid = _hidden_state_values[layer_number].size();
85+
const size_t num_time_steps = total_hid / n;
86+
if (num_time_steps == 0) continue;
87+
88+
const size_t total_pre = _pre_activation_sums[layer_number].size();
89+
const unsigned multiplier = static_cast<unsigned>(total_pre / (num_time_steps * n));
90+
91+
auto& views = _layer_views[layer_number];
92+
views.reserve(num_time_steps);
93+
94+
double* p_pre = _pre_activation_sums[layer_number].data();
95+
double* p_hid = _hidden_state_values[layer_number].data();
96+
double* p_cel = _cell_state_values[layer_number].data();
97+
98+
for (size_t t = 0; t < num_time_steps; ++t)
99+
{
100+
views.emplace_back(&p_pre[t * n * multiplier], &p_hid[t * n], &p_cel[t * n], static_cast<unsigned>(n), static_cast<unsigned>(n * multiplier));
101+
}
102+
}
103+
}
28104

29105
void zero()
30106
{

src/neuralnetwork/layer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,16 +468,21 @@ class Layer
468468
_b_timesteps = std::move(src._b_timesteps);
469469
_b_decays = std::move(src._b_decays);
470470

471+
_residual_layer_number = src._residual_layer_number;
471472
delete _residual_projector;
472473
_residual_projector = src._residual_projector;
473474

474475
_task_queue_pool = std::move(src._task_queue_pool);
475476

476477
_layer_activation_helper = std::move(src._layer_activation_helper);
478+
_momentum = src._momentum;
477479

478480
src._layer_index = 0;
481+
src._layer_role = Role::Input;
479482
src._optimiser_type = OptimiserType::None;
483+
src._residual_layer_number = 0;
480484
src._residual_projector = nullptr;
485+
src._momentum = 0;
481486
}
482487
return *this;
483488
}

src/neuralnetwork/layers.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,15 @@ Layers::Layers(const Layers& src) noexcept :
7575
_update_weights_pool(nullptr)
7676
{
7777
MYODDWEB_PROFILE_FUNCTION("Layers");
78+
std::shared_lock<std::shared_mutex> lock(src._mutex);
7879
_update_weights_pool = new TaskQueuePool<void>(src._update_weights_pool->get_number_of_threads());
7980
_layers.reserve(src._layers.size());
8081
for(const auto& layer : src._layers)
8182
{
8283
_layers.emplace_back(std::unique_ptr<Layer>(layer->clone()));
8384
}
85+
_training_gradients_buffer = src._training_gradients_buffer;
86+
_training_hidden_states_buffer = src._training_hidden_states_buffer;
8487
}
8588

8689
Layers::Layers(
@@ -113,6 +116,10 @@ Layers& Layers::operator=(const Layers& src) noexcept
113116
MYODDWEB_PROFILE_FUNCTION("Layers");
114117
if(this != &src)
115118
{
119+
std::unique_lock<std::shared_mutex> lhs_lock(_mutex, std::defer_lock);
120+
std::shared_lock<std::shared_mutex> rhs_lock(src._mutex, std::defer_lock);
121+
std::lock(lhs_lock, rhs_lock);
122+
116123
delete _update_weights_pool;
117124
_update_weights_pool = new TaskQueuePool<void>(src._update_weights_pool->get_number_of_threads());
118125

@@ -122,6 +129,9 @@ Layers& Layers::operator=(const Layers& src) noexcept
122129
{
123130
_layers.emplace_back(std::unique_ptr<Layer>(layer->clone()));
124131
}
132+
133+
_training_gradients_buffer = src._training_gradients_buffer;
134+
_training_hidden_states_buffer = src._training_hidden_states_buffer;
125135
}
126136
return *this;
127137
}
@@ -131,6 +141,10 @@ Layers& Layers::operator=(Layers&& src) noexcept
131141
MYODDWEB_PROFILE_FUNCTION("Layers");
132142
if (this != &src)
133143
{
144+
std::unique_lock<std::shared_mutex> lhs_lock(_mutex, std::defer_lock);
145+
std::unique_lock<std::shared_mutex> rhs_lock(src._mutex, std::defer_lock);
146+
std::lock(lhs_lock, rhs_lock);
147+
134148
_layers = std::move(src._layers);
135149

136150
_training_gradients_buffer = std::move(src._training_gradients_buffer);

src/neuralnetwork/neuralnetwork.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,15 @@ NeuralNetwork::NeuralNetwork(const NeuralNetwork& src) :
6363
*this = src;
6464
}
6565

66+
NeuralNetwork::NeuralNetwork(NeuralNetwork&& src) noexcept :
67+
_layers(std::move(src._layers)),
68+
_options(std::move(src._options)),
69+
_neural_network_helper(nullptr)
70+
{
71+
MYODDWEB_PROFILE_FUNCTION("NeuralNetwork");
72+
*this = std::move(src);
73+
}
74+
6675
NeuralNetwork& NeuralNetwork::operator=(const NeuralNetwork& src)
6776
{
6877
MYODDWEB_PROFILE_FUNCTION("NeuralNetwork");
@@ -85,7 +94,36 @@ NeuralNetwork& NeuralNetwork::operator=(const NeuralNetwork& src)
8594
if (src._neural_network_helper != nullptr)
8695
{
8796
_neural_network_helper = new NeuralNetworkHelper(*src._neural_network_helper);
97+
_neural_network_helper->_neural_network = this;
98+
}
99+
}
100+
return *this;
101+
}
102+
103+
NeuralNetwork& NeuralNetwork::operator=(NeuralNetwork&& src) noexcept
104+
{
105+
MYODDWEB_PROFILE_FUNCTION("NeuralNetwork");
106+
if (this != &src)
107+
{
108+
std::unique_lock<std::shared_mutex> lhs_lock(_mutex, std::defer_lock);
109+
std::unique_lock<std::shared_mutex> rhs_lock(src._mutex, std::defer_lock);
110+
std::lock(lhs_lock, rhs_lock);
111+
112+
_learning_rate = src._learning_rate;
113+
_layers = std::move(src._layers);
114+
_options = std::move(src._options);
115+
_saved_errors = std::move(src._saved_errors);
116+
_last_metrics = std::move(src._last_metrics);
117+
118+
delete _neural_network_helper;
119+
_neural_network_helper = src._neural_network_helper;
120+
if (_neural_network_helper != nullptr)
121+
{
122+
_neural_network_helper->_neural_network = this;
88123
}
124+
125+
src._neural_network_helper = nullptr;
126+
src._learning_rate = 0.0;
89127
}
90128
return *this;
91129
}
@@ -252,6 +290,7 @@ void NeuralNetwork::create_batch_from_indexes(
252290
std::vector<std::vector<double>> NeuralNetwork::think(const std::vector<std::vector<double>>& inputs) const
253291
{
254292
MYODDWEB_PROFILE_FUNCTION("NeuralNetwork");
293+
std::shared_lock<std::shared_mutex> read(_mutex);
255294
return _layers.think(_options, inputs);
256295
}
257296

@@ -263,6 +302,7 @@ std::vector<double> NeuralNetwork::think(const std::vector<double>& inputs) cons
263302
Logger::error("The input size, '", inputs.size(),"' does not match the topology!");
264303
return {};
265304
}
305+
std::shared_lock<std::shared_mutex> read(_mutex);
266306
return _layers.think(_options, inputs);
267307
}
268308

src/neuralnetwork/neuralnetwork.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ class NeuralNetwork
3434
NeuralNetwork(const Layers& layers, const NeuralNetworkOptions& options, const std::vector<std::map<ErrorCalculation::type, double>>& errors);
3535

3636
NeuralNetwork(const NeuralNetwork& src);
37+
NeuralNetwork(NeuralNetwork&& src) noexcept;
38+
3739
NeuralNetwork& operator=(const NeuralNetwork&);
40+
NeuralNetwork& operator=(NeuralNetwork&&) noexcept;
3841

3942
virtual ~NeuralNetwork();
4043

src/neuralnetwork/neuralnetworkoptions.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,13 @@ class NeuralNetworkOptions
7575
}
7676

7777
public:
78-
NeuralNetworkOptions(const NeuralNetworkOptions& nno) noexcept :
79-
_output_layer_details(nno._output_layer_details)
78+
NeuralNetworkOptions(const NeuralNetworkOptions& nno) noexcept
8079
{
8180
MYODDWEB_PROFILE_FUNCTION("NeuralNetworkOptions");
8281
*this = nno;
8382
}
8483

85-
NeuralNetworkOptions(NeuralNetworkOptions&& nno) noexcept :
86-
_output_layer_details(std::move(nno._output_layer_details))
84+
NeuralNetworkOptions(NeuralNetworkOptions&& nno) noexcept
8785
{
8886
MYODDWEB_PROFILE_FUNCTION("NeuralNetworkOptions");
8987
*this = std::move(nno);
@@ -136,7 +134,7 @@ class NeuralNetworkOptions
136134
_number_of_epoch = nno._number_of_epoch;
137135
_batch_size = nno._batch_size;
138136
_data_is_unique = nno._data_is_unique;
139-
_progress_callback = nno._progress_callback;
137+
_progress_callback = std::move(nno._progress_callback);
140138
_log_level = nno._log_level;
141139
_number_of_threads = nno._number_of_threads;
142140
_learning_rate_decay_rate = nno._learning_rate_decay_rate;
@@ -156,6 +154,7 @@ class NeuralNetworkOptions
156154
_has_bias = nno._has_bias;
157155
_multi_output_layer_details = std::move(nno._multi_output_layer_details);
158156

157+
nno._progress_callback = nullptr;
159158
nno._log_level = Logger::LogLevel::None;
160159
nno._number_of_epoch = 0;
161160
nno._batch_size = 0;
@@ -171,6 +170,11 @@ class NeuralNetworkOptions
171170
nno._bptt_max_ticks = 0;
172171
nno._update_training_monitor_percent = 0.0;
173172
nno._has_bias = true;
173+
nno._learning_rate_decay_rate = 0;
174+
nno._adaptive_learning_rate = false;
175+
nno._learning_rate_restart_rate = 0;
176+
nno._learning_rate_restart_boost = 0;
177+
nno._number_of_threads = 0;
174178
}
175179
return *this;
176180
}

src/neuralnetwork/neuron.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ Neuron::Neuron(Neuron&& src) noexcept :
4646

4747
src._index = 0;
4848
src._type = Neuron::Type::Normal;
49+
src._dropout_rate = 0.0;
4950
}
5051

5152
Neuron& Neuron::operator=(Neuron&& src) noexcept

src/neuralnetwork/outputlayer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class OutputLayer
3030
_number_output_layers(src._number_output_layers)
3131
{
3232
MYODDWEB_PROFILE_FUNCTION("OutputLayer");
33+
src._number_output_layers = 0;
3334
}
3435

3536
OutputLayer& operator=(const OutputLayer& src) noexcept
@@ -52,6 +53,7 @@ class OutputLayer
5253
_output_layer_details = std::move(src._output_layer_details);
5354
_bounds = std::move(src._bounds);
5455
_number_output_layers = src._number_output_layers;
56+
src._number_output_layers = 0;
5557
}
5658
return *this;
5759
}

src/neuralnetwork/outputlayerdetails.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ class OutputLayerDetails
8585
_error_evaluation_config = std::move(src._error_evaluation_config);
8686
_weight_decay = src._weight_decay;
8787
_optimiser_type = src._optimiser_type;
88+
_momentum = src._momentum;
8889
src._weight_decay = 0;
90+
src._momentum = 0;
8991
src._layer_size = 0;
9092
}
9193
return *this;

0 commit comments

Comments
 (0)