Newer
Older
//
// Created by martin on 7/15/18.
//
#ifndef INC_4NEURO_ERRORFUNCTION_H
#define INC_4NEURO_ERRORFUNCTION_H
kra568
committed
#include "../settings.h"
#include "../Network/NeuralNetwork.h"
#include "../DataSet/DataSet.h"
Martin Beseda
committed
Martin Beseda
committed
//TODO HEAVY refactoring needed!
Martin Beseda
committed
namespace lib4neuro {
enum ErrorFunctionType {
ErrorFuncMSE
};
class ErrorFunction {
public:
/**
*
* @param weights
* @return
*/
Martin Beseda
committed
virtual double eval(std::vector<double>* weights = nullptr) = 0;
Martin Beseda
committed
/**
*
* @return
*/
LIB4NEURO_API virtual size_t get_dimension();
/**
*
* @param params
* @param grad
Martin Beseda
committed
* @param alpha
* @param batch
Martin Beseda
committed
calculate_error_gradient(std::vector<double>& params,
std::vector<double>& grad,
Martin Beseda
committed
double alpha = 1.0,
size_t batch = 0) = 0;

Michal Kravcenko
committed
/**
*
* @param params
* @param grad
* @param alpha
* @param batch
*/
virtual void
analyze_error_gradient(std::vector<double>& params,
std::vector<double>& grad,
double alpha = 1.0,
size_t batch = 0) = 0;
Martin Beseda
committed
virtual std::vector<double>* get_parameters();
Martin Beseda
committed
virtual DataSet* get_dataset();
/**
*
* @return
*/
virtual DataSet* get_test_dataset();
/**
*
* @return
*/
NeuralNetwork* get_network_instance();
/**
*
* @param percent_train
* @return
*/
void divide_data_train_test(double percent_test);
/**
*
*/
void return_full_data_set_for_training();
/**
*
*/
virtual double eval_on_test_data(std::vector<double>* weights = nullptr) = 0;
Martin Beseda
committed
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/**
*
* @param results_file_path
* @param weights
* @return
*/
virtual double eval_on_test_data(std::string results_file_path, std::vector<double>* weights = nullptr) = 0;
/**
*
* @param results_file_path
* @param weights
* @return
*/
virtual double eval_on_test_data(std::ofstream* results_file_path, std::vector<double>* weights = nullptr) = 0;
/**
*
* @param data_set
* @param weights
* @return
*/
virtual double eval_on_data_set(DataSet* data_set, std::vector<double>* weights = nullptr) = 0;
/**
*
* @param data_set
* @param weights
* @param results_file_path
* @return
*/
virtual double
eval_on_data_set(DataSet* data_set, std::string results_file_path, std::vector<double>* weights = nullptr) = 0;
/**
*
* @param data_set
* @param results_file_path
* @param weights
* @return
*/
virtual double eval_on_data_set(DataSet* data_set, std::ofstream* results_file_path,
std::vector<double>* weights = nullptr) = 0;

Michal Kravcenko
committed
/**
*
* @param i
* @param parameter_vector
* @param error_vector
* @return
*/
virtual double eval_single_item_by_idx(size_t i, std::vector<double> *parameter_vector, std::vector<double> &error_vector) = 0;
/**
*
* @param error_vector
* @param gradient_vector
*/
virtual void calculate_error_gradient_single(std::vector<double> &error_vector, std::vector<double> &gradient_vector) = 0;
Martin Beseda
committed
Martin Beseda
committed
protected:
/**
*
*/
size_t dimension = 0;
NeuralNetwork* net = nullptr;
/**
*
*/
DataSet* ds = nullptr;
/**
*
*/
DataSet* ds_full = nullptr;
/**
*
*/
DataSet* ds_test = nullptr;
Martin Beseda
committed
};
Martin Beseda
committed
Martin Beseda
committed
class MSE : public ErrorFunction {
public:
/**
* Constructor for single neural network
* @param net
* @param ds
*/
Martin Beseda
committed
LIB4NEURO_API MSE(NeuralNetwork* net, DataSet* ds);
Martin Beseda
committed
/**
*
* @param weights
* @return
*/
Martin Beseda
committed
LIB4NEURO_API double eval(std::vector<double>* weights = nullptr) override;
/**
*
* @param params
* @param grad
Martin Beseda
committed
* @param alpha
* @param batch
Martin Beseda
committed
calculate_error_gradient(std::vector<double>& params,
std::vector<double>& grad,
Martin Beseda
committed
double alpha = 1.0,
size_t batch = 0) override;

Michal Kravcenko
committed
/**
*
* @param params
* @param grad
* @param alpha
* @param batch
*/
LIB4NEURO_API void
analyze_error_gradient(std::vector<double>& params,
std::vector<double>& grad,
double alpha = 1.0,
size_t batch = 0) override;
Martin Beseda
committed
* @param weights
Martin Beseda
committed
LIB4NEURO_API double eval_on_test_data(std::vector<double>* weights = nullptr) override;
Martin Beseda
committed
/**
*
* @param results_file_path
* @param weights
* @return
*/
LIB4NEURO_API double eval_on_test_data(std::string results_file_path, std::vector<double>* weights = nullptr);
Martin Beseda
committed
Martin Beseda
committed
/**
*
* @param results_file_path
* @param weights
* @return
*/
LIB4NEURO_API double eval_on_test_data(std::ofstream* results_file_path, std::vector<double>* weights = nullptr) override;
Martin Beseda
committed
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
/**
*
* @param data_set
* @param results_file_path
* @param weights
* @return
*/
LIB4NEURO_API double eval_on_data_set(DataSet* data_set,
std::ofstream* results_file_path,
std::vector<double>* weights = nullptr) override;
/**
*
* @param data_set
* @param weights
* @return
*/
LIB4NEURO_API double eval_on_data_set(DataSet* data_set, std::vector<double>* weights = nullptr) override;
/**
*
* @param data_set
* @param results_file_path
* @param weights
* @return
*/
LIB4NEURO_API double eval_on_data_set(DataSet* data_set, std::string results_file_path,
std::vector<double>* weights = nullptr) override;
Martin Beseda
committed

Michal Kravcenko
committed
/**
*
* @param i
* @param parameter_vector
* @param error_vector
* @return
*/
LIB4NEURO_API virtual double eval_single_item_by_idx(size_t i, std::vector<double> *parameter_vector, std::vector<double> &error_vector) override;
/**
*
* @param error_vector
* @param gradient_vector
*/
LIB4NEURO_API virtual void calculate_error_gradient_single(std::vector<double> &error_vector, std::vector<double> &gradient_vector) override;
Martin Beseda
committed
};
class ErrorSum : public ErrorFunction {
public:
/**
*
*/
LIB4NEURO_API ErrorSum();
/**
*
*/
LIB4NEURO_API ~ErrorSum();
/**
*
* @param weights
* @return
*/
Martin Beseda
committed
LIB4NEURO_API double eval(std::vector<double>* weights = nullptr) override;
/**
*
* @param weights
* @return
*/
LIB4NEURO_API double eval_on_test_data(std::vector<double>* weights = nullptr) override;
/**
*
* @param results_file_path
* @param weights
* @return
*/
LIB4NEURO_API double eval_on_test_data(std::string results_file_path, std::vector<double>* weights = nullptr) override;
Martin Beseda
committed
Martin Beseda
committed
* @param results_file_path
* @param weights
* @return
*/
Martin Beseda
committed
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
LIB4NEURO_API double eval_on_test_data(std::ofstream* results_file_path, std::vector<double>* weights = nullptr) override;
/**
*
* @param data_set
* @param weights
* @return
*/
LIB4NEURO_API double eval_on_data_set(DataSet* data_set, std::vector<double>* weights = nullptr) override;
/**
*
* @param data_set
* @param results_file_path
* @param weights
* @return
*/
LIB4NEURO_API double eval_on_data_set(DataSet* data_set, std::string results_file_path,
std::vector<double>* weights = nullptr) override;
/**
*
* @param data_set
* @param results_file_path
* @param weights
* @return
*/
LIB4NEURO_API double eval_on_data_set(DataSet* data_set,
std::ofstream* results_file_path,
std::vector<double>* weights = nullptr) override;

Michal Kravcenko
committed
/**
*
* @param i
* @param parameter_vector
* @param error_vector
* @return
*/
LIB4NEURO_API virtual double eval_single_item_by_idx(size_t i, std::vector<double> *parameter_vector, std::vector<double> &error_vector) override;
/**
*
* @param error_vector
* @param gradient_vector
*/
LIB4NEURO_API virtual void calculate_error_gradient_single(std::vector<double> &error_vector, std::vector<double> &gradient_vector) override;
Martin Beseda
committed
/**
*
* @param F
*/
Martin Beseda
committed
LIB4NEURO_API void add_error_function(ErrorFunction* F, double alpha = 1.0);
Martin Beseda
committed
/**
*
* @return
*/
LIB4NEURO_API size_t get_dimension() override;
/**
*
* @param params
* @param grad
Martin Beseda
committed
* @param alpha
* @param batch
Martin Beseda
committed
calculate_error_gradient(std::vector<double>& params,
std::vector<double>& grad,
Martin Beseda
committed
double alpha = 1.0,
size_t batch = 0) override;

Michal Kravcenko
committed
/**
*
* @param params
* @param grad
* @param alpha
* @param batch
*/
LIB4NEURO_API void
analyze_error_gradient(std::vector<double>& params,
std::vector<double>& grad,
double alpha = 1.0,
size_t batch = 0) override;
Martin Beseda
committed
LIB4NEURO_API std::vector<double>* get_parameters() override;
Martin Beseda
committed
/**
*
* @return
*/
LIB4NEURO_API DataSet* get_dataset() override;
Martin Beseda
committed
private:
Martin Beseda
committed
std::vector<ErrorFunction*>* summand;
std::vector<double>* summand_coefficient;
Martin Beseda
committed
};
}
#endif //INC_4NEURO_ERRORFUNCTION_H